mirror of
https://github.com/libsdl-org/SDL.git
synced 2026-05-02 03:54:41 +00:00
Added SDL_SetRenderTextureAddressMode() and SDL_GetRenderTextureAddressMode()
Fixes https://github.com/libsdl-org/SDL/issues/4820 Fixes https://github.com/libsdl-org/SDL/issues/12610
This commit is contained in:
@@ -61,7 +61,8 @@ typedef struct
|
||||
bool beginScene;
|
||||
bool enableSeparateAlphaBlend;
|
||||
SDL_ScaleMode scaleMode[3];
|
||||
SDL_TextureAddressMode addressMode[3];
|
||||
SDL_TextureAddressMode addressModeU[3];
|
||||
SDL_TextureAddressMode addressModeV[3];
|
||||
IDirect3DSurface9 *defaultRenderTarget;
|
||||
IDirect3DSurface9 *currentRenderTarget;
|
||||
void *d3dxDLL;
|
||||
@@ -278,8 +279,11 @@ static void D3D_InitRenderState(D3D_RenderData *data)
|
||||
}
|
||||
|
||||
// Reset our current address mode
|
||||
for (int i = 0; i < SDL_arraysize(data->addressMode); ++i) {
|
||||
data->addressMode[i] = SDL_TEXTURE_ADDRESS_INVALID;
|
||||
for (int i = 0; i < SDL_arraysize(data->addressModeU); ++i) {
|
||||
data->addressModeU[i] = SDL_TEXTURE_ADDRESS_INVALID;
|
||||
}
|
||||
for (int i = 0; i < SDL_arraysize(data->addressModeV); ++i) {
|
||||
data->addressModeV[i] = SDL_TEXTURE_ADDRESS_INVALID;
|
||||
}
|
||||
|
||||
// Start the render with beginScene
|
||||
@@ -937,22 +941,28 @@ static void UpdateTextureScaleMode(D3D_RenderData *data, SDL_ScaleMode scaleMode
|
||||
}
|
||||
}
|
||||
|
||||
static void UpdateTextureAddressMode(D3D_RenderData *data, SDL_TextureAddressMode addressMode, unsigned index)
|
||||
static DWORD TranslateAddressMode(SDL_TextureAddressMode addressMode)
|
||||
{
|
||||
if (addressMode != data->addressMode[index]) {
|
||||
switch (addressMode) {
|
||||
case SDL_TEXTURE_ADDRESS_CLAMP:
|
||||
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
|
||||
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
|
||||
break;
|
||||
case SDL_TEXTURE_ADDRESS_WRAP:
|
||||
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
|
||||
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
data->addressMode[index] = addressMode;
|
||||
switch (addressMode) {
|
||||
case SDL_TEXTURE_ADDRESS_CLAMP:
|
||||
return D3DTADDRESS_CLAMP;
|
||||
case SDL_TEXTURE_ADDRESS_WRAP:
|
||||
return D3DTADDRESS_WRAP;
|
||||
default:
|
||||
SDL_assert(!"Unknown texture address mode");
|
||||
return D3DTADDRESS_CLAMP;
|
||||
}
|
||||
}
|
||||
|
||||
static void UpdateTextureAddressMode(D3D_RenderData *data, SDL_TextureAddressMode addressModeU, SDL_TextureAddressMode addressModeV, unsigned index)
|
||||
{
|
||||
if (addressModeU != data->addressModeU[index]) {
|
||||
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_ADDRESSU, TranslateAddressMode(addressModeU));
|
||||
data->addressModeU[index] = addressModeU;
|
||||
}
|
||||
if (addressModeV != data->addressModeV[index]) {
|
||||
IDirect3DDevice9_SetSamplerState(data->device, index, D3DSAMP_ADDRESSV, TranslateAddressMode(addressModeV));
|
||||
data->addressModeV[index] = addressModeV;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1047,15 +1057,15 @@ static bool SetDrawState(D3D_RenderData *data, const SDL_RenderCommand *cmd)
|
||||
|
||||
if (texture) {
|
||||
UpdateTextureScaleMode(data, cmd->data.draw.texture_scale_mode, 0);
|
||||
UpdateTextureAddressMode(data, cmd->data.draw.texture_address_mode, 0);
|
||||
UpdateTextureAddressMode(data, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v, 0);
|
||||
|
||||
#ifdef SDL_HAVE_YUV
|
||||
D3D_TextureData *texturedata = (D3D_TextureData *)texture->internal;
|
||||
if (texturedata && texturedata->yuv) {
|
||||
UpdateTextureScaleMode(data, cmd->data.draw.texture_scale_mode, 1);
|
||||
UpdateTextureScaleMode(data, cmd->data.draw.texture_scale_mode, 2);
|
||||
UpdateTextureAddressMode(data, cmd->data.draw.texture_address_mode, 1);
|
||||
UpdateTextureAddressMode(data, cmd->data.draw.texture_address_mode, 2);
|
||||
UpdateTextureAddressMode(data, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v, 1);
|
||||
UpdateTextureAddressMode(data, cmd->data.draw.texture_address_mode_u, cmd->data.draw.texture_address_mode_v, 2);
|
||||
}
|
||||
#endif // SDL_HAVE_YUV
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user