mirror of
https://github.com/ZDoom/qzdoom.git
synced 2024-12-01 08:31:45 +00:00
- backend sync with Raze.
This commit is contained in:
parent
b60fd4d8bc
commit
4c11b01588
12 changed files with 142 additions and 73 deletions
|
@ -56,6 +56,7 @@
|
||||||
#include "gl_postprocessstate.h"
|
#include "gl_postprocessstate.h"
|
||||||
#include "v_draw.h"
|
#include "v_draw.h"
|
||||||
#include "printf.h"
|
#include "printf.h"
|
||||||
|
#include "gl_hwtexture.h"
|
||||||
|
|
||||||
#include "flatvertices.h"
|
#include "flatvertices.h"
|
||||||
#include "hw_cvars.h"
|
#include "hw_cvars.h"
|
||||||
|
@ -87,9 +88,9 @@ OpenGLFrameBuffer::OpenGLFrameBuffer(void *hMonitor, bool fullscreen) :
|
||||||
// SetVSync needs to be at the very top to workaround a bug in Nvidia's OpenGL driver.
|
// SetVSync needs to be at the very top to workaround a bug in Nvidia's OpenGL driver.
|
||||||
// If wglSwapIntervalEXT is called after glBindFramebuffer in a frame the setting is not changed!
|
// If wglSwapIntervalEXT is called after glBindFramebuffer in a frame the setting is not changed!
|
||||||
Super::SetVSync(vid_vsync);
|
Super::SetVSync(vid_vsync);
|
||||||
|
FHardwareTexture::InitGlobalState();
|
||||||
|
|
||||||
// Make sure all global variables tracking OpenGL context state are reset..
|
// Make sure all global variables tracking OpenGL context state are reset..
|
||||||
FHardwareTexture::InitGlobalState();
|
|
||||||
gl_RenderState.Reset();
|
gl_RenderState.Reset();
|
||||||
|
|
||||||
GLRenderer = nullptr;
|
GLRenderer = nullptr;
|
||||||
|
@ -215,7 +216,6 @@ void OpenGLFrameBuffer::CopyScreenToBuffer(int width, int height, uint8_t* scr)
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
void OpenGLFrameBuffer::RenderTextureView(FCanvasTexture* tex, std::function<void(IntRect &)> renderFunc)
|
void OpenGLFrameBuffer::RenderTextureView(FCanvasTexture* tex, std::function<void(IntRect &)> renderFunc)
|
||||||
|
|
||||||
{
|
{
|
||||||
GLRenderer->StartOffscreen();
|
GLRenderer->StartOffscreen();
|
||||||
GLRenderer->BindToFrameBuffer(tex);
|
GLRenderer->BindToFrameBuffer(tex);
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
#include "hw_cvars.h"
|
#include "hw_cvars.h"
|
||||||
#include "gl_debug.h"
|
#include "gl_debug.h"
|
||||||
#include "gl_renderer.h"
|
#include "gl_renderer.h"
|
||||||
|
#include "gl_renderstate.h"
|
||||||
#include "gl_samplers.h"
|
#include "gl_samplers.h"
|
||||||
#include "gl_hwtexture.h"
|
#include "gl_hwtexture.h"
|
||||||
|
|
||||||
|
@ -302,12 +303,16 @@ bool FHardwareTexture::BindOrCreate(FTexture *tex, int texunit, int clampmode, i
|
||||||
{
|
{
|
||||||
int usebright = false;
|
int usebright = false;
|
||||||
|
|
||||||
bool needmipmap = (clampmode <= CLAMP_XY);
|
bool needmipmap = (clampmode <= CLAMP_XY) && !forcenofilter;
|
||||||
|
|
||||||
// Bind it to the system.
|
// Bind it to the system.
|
||||||
if (!Bind(texunit, needmipmap))
|
if (!Bind(texunit, needmipmap))
|
||||||
{
|
{
|
||||||
|
if (flags & CTF_Indexed)
|
||||||
|
{
|
||||||
|
glTextureBytes = 1;
|
||||||
|
forcenofilter = true;
|
||||||
|
}
|
||||||
int w = 0, h = 0;
|
int w = 0, h = 0;
|
||||||
|
|
||||||
// Create this texture
|
// Create this texture
|
||||||
|
@ -331,6 +336,7 @@ bool FHardwareTexture::BindOrCreate(FTexture *tex, int texunit, int clampmode, i
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (forcenofilter && clampmode <= CLAMP_XY) clampmode += CLAMP_NOFILTER - CLAMP_NONE;
|
||||||
GLRenderer->mSamplerManager->Bind(texunit, clampmode, 255);
|
GLRenderer->mSamplerManager->Bind(texunit, clampmode, 255);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,7 +93,7 @@ FSamplerManager::~FSamplerManager()
|
||||||
|
|
||||||
void FSamplerManager::UnbindAll()
|
void FSamplerManager::UnbindAll()
|
||||||
{
|
{
|
||||||
for (int i = 0; i < FHardwareTexture::MAX_TEXTURES; i++)
|
for (int i = 0; i < IHardwareTexture::MAX_TEXTURES; i++)
|
||||||
{
|
{
|
||||||
glBindSampler(i, 0);
|
glBindSampler(i, 0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -457,11 +457,6 @@ DEFINE_GLOBAL(CleanYfac_1)
|
||||||
DEFINE_GLOBAL(CleanWidth_1)
|
DEFINE_GLOBAL(CleanWidth_1)
|
||||||
DEFINE_GLOBAL(CleanHeight_1)
|
DEFINE_GLOBAL(CleanHeight_1)
|
||||||
|
|
||||||
IHardwareTexture* CreateHardwareTexture(int numchannels)
|
|
||||||
{
|
|
||||||
return screen->CreateHardwareTexture(numchannels);
|
|
||||||
}
|
|
||||||
|
|
||||||
//==========================================================================
|
//==========================================================================
|
||||||
//
|
//
|
||||||
// CVAR transsouls
|
// CVAR transsouls
|
||||||
|
|
|
@ -390,8 +390,8 @@ VulkanDescriptorSet* VkMaterial::GetDescriptorSet(const FMaterialState& state)
|
||||||
|
|
||||||
WriteDescriptors update;
|
WriteDescriptors update;
|
||||||
MaterialLayerInfo *layer;
|
MaterialLayerInfo *layer;
|
||||||
auto systex = static_cast<VkHardwareTexture*>(GetLayer(0, state.mTranslation, &layer));
|
auto systex = static_cast<VkHardwareTexture*>(GetLayer(0, translation, &layer));
|
||||||
update.addCombinedImageSampler(descriptor.get(), 0, systex->GetImage(layer->layerTexture, state.mTranslation, layer->scaleFlags)->View.get(), sampler, systex->mImage.Layout);
|
update.addCombinedImageSampler(descriptor.get(), 0, systex->GetImage(layer->layerTexture, translation, layer->scaleFlags)->View.get(), sampler, systex->mImage.Layout);
|
||||||
for (int i = 1; i < numLayers; i++)
|
for (int i = 1; i < numLayers; i++)
|
||||||
{
|
{
|
||||||
auto systex = static_cast<VkHardwareTexture*>(GetLayer(i, 0, &layer));
|
auto systex = static_cast<VkHardwareTexture*>(GetLayer(i, 0, &layer));
|
||||||
|
|
|
@ -187,7 +187,7 @@ void FGameTexture::AddAutoMaterials()
|
||||||
void FGameTexture::CreateDefaultBrightmap()
|
void FGameTexture::CreateDefaultBrightmap()
|
||||||
{
|
{
|
||||||
auto tex = GetTexture();
|
auto tex = GetTexture();
|
||||||
if (flags & GTexf_BrightmapChecked)
|
if (!(flags & GTexf_BrightmapChecked))
|
||||||
{
|
{
|
||||||
flags |= GTexf_BrightmapChecked;
|
flags |= GTexf_BrightmapChecked;
|
||||||
// Check for brightmaps
|
// Check for brightmaps
|
||||||
|
|
|
@ -92,6 +92,7 @@ class FGameTexture
|
||||||
FMaterial* Material[4] = { };
|
FMaterial* Material[4] = { };
|
||||||
|
|
||||||
// Material properties
|
// Material properties
|
||||||
|
FVector2 detailScale = { 1.f, 1.f };
|
||||||
float Glossiness = 10.f;
|
float Glossiness = 10.f;
|
||||||
float SpecularLevel = 0.1f;
|
float SpecularLevel = 0.1f;
|
||||||
float shaderspeed = 1.f;
|
float shaderspeed = 1.f;
|
||||||
|
@ -305,6 +306,49 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FVector2 GetDetailScale() const
|
||||||
|
{
|
||||||
|
return detailScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetDetailScale(float x, float y)
|
||||||
|
{
|
||||||
|
detailScale.X = x;
|
||||||
|
detailScale.Y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
FTexture* GetBrightmap()
|
||||||
|
{
|
||||||
|
if (Brightmap.get() || (flags & GTexf_BrightmapChecked)) return Brightmap.get();
|
||||||
|
CreateDefaultBrightmap();
|
||||||
|
return Brightmap.get();
|
||||||
|
}
|
||||||
|
FTexture* GetGlowmap()
|
||||||
|
{
|
||||||
|
return Glowmap.get();
|
||||||
|
}
|
||||||
|
FTexture* GetDetailmap()
|
||||||
|
{
|
||||||
|
return Detailmap.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetGlowmap(FTexture *T)
|
||||||
|
{
|
||||||
|
Glowmap = T;
|
||||||
|
}
|
||||||
|
void SetDetailmap(FTexture* T)
|
||||||
|
{
|
||||||
|
Detailmap = T;
|
||||||
|
}
|
||||||
|
void SetNormalmap(FTexture* T)
|
||||||
|
{
|
||||||
|
Normal = T;
|
||||||
|
}
|
||||||
|
void SetSpecularmap(FTexture* T)
|
||||||
|
{
|
||||||
|
Specular = T;
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
inline FGameTexture* MakeGameTexture(FTexture* tex, const char *name, ETextureType useType)
|
inline FGameTexture* MakeGameTexture(FTexture* tex, const char *name, ETextureType useType)
|
||||||
|
|
|
@ -83,30 +83,30 @@ FMaterial::FMaterial(FGameTexture * tx, int scaleflags)
|
||||||
auto placeholder = TexMan.GameByIndex(1);
|
auto placeholder = TexMan.GameByIndex(1);
|
||||||
if (tx->Brightmap.get())
|
if (tx->Brightmap.get())
|
||||||
{
|
{
|
||||||
mTextureLayers.Push({ tx->Brightmap.get(), scaleflags });
|
mTextureLayers.Push({ tx->Brightmap.get(), scaleflags, -1 });
|
||||||
mLayerFlags |= TEXF_Brightmap;
|
mLayerFlags |= TEXF_Brightmap;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mTextureLayers.Push({ placeholder->GetTexture(), 0 });
|
mTextureLayers.Push({ placeholder->GetTexture(), 0, -1 });
|
||||||
}
|
}
|
||||||
if (tx->Detailmap.get())
|
if (tx->Detailmap.get())
|
||||||
{
|
{
|
||||||
mTextureLayers.Push({ tx->Detailmap.get(), 0 });
|
mTextureLayers.Push({ tx->Detailmap.get(), 0, CLAMP_NONE });
|
||||||
mLayerFlags |= TEXF_Detailmap;
|
mLayerFlags |= TEXF_Detailmap;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mTextureLayers.Push({ placeholder->GetTexture(), 0 });
|
mTextureLayers.Push({ placeholder->GetTexture(), 0, -1 });
|
||||||
}
|
}
|
||||||
if (tx->Glowmap.get())
|
if (tx->Glowmap.get())
|
||||||
{
|
{
|
||||||
mTextureLayers.Push({ tx->Glowmap.get(), scaleflags });
|
mTextureLayers.Push({ tx->Glowmap.get(), scaleflags, -1 });
|
||||||
mLayerFlags |= TEXF_Glowmap;
|
mLayerFlags |= TEXF_Glowmap;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mTextureLayers.Push({ placeholder->GetTexture(), 0 });
|
mTextureLayers.Push({ placeholder->GetTexture(), 0, -1 });
|
||||||
}
|
}
|
||||||
|
|
||||||
auto index = tx->GetShaderIndex();
|
auto index = tx->GetShaderIndex();
|
||||||
|
|
|
@ -12,6 +12,7 @@ struct MaterialLayerInfo
|
||||||
{
|
{
|
||||||
FTexture* layerTexture;
|
FTexture* layerTexture;
|
||||||
int scaleFlags;
|
int scaleFlags;
|
||||||
|
int clampflags;
|
||||||
};
|
};
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
@ -37,6 +38,10 @@ public:
|
||||||
int GetShaderIndex() const { return mShaderIndex; }
|
int GetShaderIndex() const { return mShaderIndex; }
|
||||||
int GetScaleFlags() const { return mScaleFlags; }
|
int GetScaleFlags() const { return mScaleFlags; }
|
||||||
virtual void DeleteDescriptors() { }
|
virtual void DeleteDescriptors() { }
|
||||||
|
FVector2 GetDetailScale() const
|
||||||
|
{
|
||||||
|
return sourcetex->GetDetailScale();
|
||||||
|
}
|
||||||
|
|
||||||
FGameTexture* Source() const
|
FGameTexture* Source() const
|
||||||
{
|
{
|
||||||
|
|
|
@ -14,6 +14,7 @@ enum ECreateTexBufferFlags
|
||||||
CTF_CreateMask = 3, // Flags that are relevant for hardware texture creation.
|
CTF_CreateMask = 3, // Flags that are relevant for hardware texture creation.
|
||||||
CTF_ProcessData = 4, // run postprocessing on the generated buffer. This is only needed when using the data for a hardware texture.
|
CTF_ProcessData = 4, // run postprocessing on the generated buffer. This is only needed when using the data for a hardware texture.
|
||||||
CTF_CheckOnly = 8, // Only runs the code to get a content ID but does not create a texture. Can be used to access a caching system for the hardware textures.
|
CTF_CheckOnly = 8, // Only runs the code to get a content ID but does not create a texture. Can be used to access a caching system for the hardware textures.
|
||||||
|
CTF_Indexed = 16 // Tell the backend to create an indexed texture.
|
||||||
};
|
};
|
||||||
|
|
||||||
class FHardwareTextureContainer
|
class FHardwareTextureContainer
|
||||||
|
|
|
@ -48,6 +48,8 @@
|
||||||
#include "formats/multipatchtexture.h"
|
#include "formats/multipatchtexture.h"
|
||||||
#include "texturemanager.h"
|
#include "texturemanager.h"
|
||||||
#include "c_cvars.h"
|
#include "c_cvars.h"
|
||||||
|
#include "imagehelpers.h"
|
||||||
|
#include "v_video.h"
|
||||||
|
|
||||||
// Wrappers to keep the definitions of these classes out of here.
|
// Wrappers to keep the definitions of these classes out of here.
|
||||||
IHardwareTexture* CreateHardwareTexture(int numchannels);
|
IHardwareTexture* CreateHardwareTexture(int numchannels);
|
||||||
|
@ -323,66 +325,82 @@ bool FTexture::ProcessData(unsigned char* buffer, int w, int h, bool ispatch)
|
||||||
FTextureBuffer FTexture::CreateTexBuffer(int translation, int flags)
|
FTextureBuffer FTexture::CreateTexBuffer(int translation, int flags)
|
||||||
{
|
{
|
||||||
FTextureBuffer result;
|
FTextureBuffer result;
|
||||||
|
if (flags & CTF_Indexed)
|
||||||
unsigned char* buffer = nullptr;
|
|
||||||
int W, H;
|
|
||||||
int isTransparent = -1;
|
|
||||||
bool checkonly = !!(flags & CTF_CheckOnly);
|
|
||||||
|
|
||||||
int exx = !!(flags & CTF_Expand);
|
|
||||||
|
|
||||||
W = GetWidth() + 2 * exx;
|
|
||||||
H = GetHeight() + 2 * exx;
|
|
||||||
|
|
||||||
if (!checkonly)
|
|
||||||
{
|
{
|
||||||
buffer = new unsigned char[W * (H + 1) * 4];
|
// Indexed textures will never be translated and never be scaled.
|
||||||
memset(buffer, 0, W * (H + 1) * 4);
|
int w = GetWidth(), h = GetHeight();
|
||||||
|
|
||||||
auto remap = translation <= 0 ? nullptr : GPalette.TranslationToTable(translation);
|
auto store = Get8BitPixels(false);
|
||||||
if (remap) translation = remap->Index;
|
const uint8_t* p = store.Data();
|
||||||
FBitmap bmp(buffer, W * 4, W, H);
|
|
||||||
|
|
||||||
int trans;
|
result.mBuffer = new uint8_t[w * h];
|
||||||
auto Pixels = GetBgraBitmap(remap ? remap->Palette : nullptr, &trans);
|
result.mWidth = w;
|
||||||
bmp.Blit(exx, exx, Pixels);
|
result.mHeight = h;
|
||||||
|
result.mContentId = 0;
|
||||||
|
ImageHelpers::FlipNonSquareBlock(result.mBuffer, p, h, w, h);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
unsigned char* buffer = nullptr;
|
||||||
|
int W, H;
|
||||||
|
int isTransparent = -1;
|
||||||
|
bool checkonly = !!(flags & CTF_CheckOnly);
|
||||||
|
|
||||||
if (remap == nullptr)
|
int exx = !!(flags & CTF_Expand);
|
||||||
|
|
||||||
|
W = GetWidth() + 2 * exx;
|
||||||
|
H = GetHeight() + 2 * exx;
|
||||||
|
|
||||||
|
if (!checkonly)
|
||||||
{
|
{
|
||||||
CheckTrans(buffer, W * H, trans);
|
buffer = new unsigned char[W * (H + 1) * 4];
|
||||||
isTransparent = bTranslucent;
|
memset(buffer, 0, W * (H + 1) * 4);
|
||||||
|
|
||||||
|
auto remap = translation <= 0 ? nullptr : GPalette.TranslationToTable(translation);
|
||||||
|
if (remap) translation = remap->Index;
|
||||||
|
FBitmap bmp(buffer, W * 4, W, H);
|
||||||
|
|
||||||
|
int trans;
|
||||||
|
auto Pixels = GetBgraBitmap(remap ? remap->Palette : nullptr, &trans);
|
||||||
|
bmp.Blit(exx, exx, Pixels);
|
||||||
|
|
||||||
|
if (remap == nullptr)
|
||||||
|
{
|
||||||
|
CheckTrans(buffer, W * H, trans);
|
||||||
|
isTransparent = bTranslucent;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
isTransparent = 0;
|
||||||
|
// A translated image is not conclusive for setting the texture's transparency info.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (GetImage())
|
||||||
{
|
{
|
||||||
isTransparent = 0;
|
FContentIdBuilder builder;
|
||||||
// A translated image is not conclusive for setting the texture's transparency info.
|
builder.id = 0;
|
||||||
|
builder.imageID = GetImage()->GetId();
|
||||||
|
builder.translation = MAX(0, translation);
|
||||||
|
builder.expand = exx;
|
||||||
|
result.mContentId = builder.id;
|
||||||
|
}
|
||||||
|
else result.mContentId = 0; // for non-image backed textures this has no meaning so leave it at 0.
|
||||||
|
|
||||||
|
result.mBuffer = buffer;
|
||||||
|
result.mWidth = W;
|
||||||
|
result.mHeight = H;
|
||||||
|
|
||||||
|
// Only do postprocessing for image-backed textures. (i.e. not for the burn texture which can also pass through here.)
|
||||||
|
if (GetImage() && flags & CTF_ProcessData)
|
||||||
|
{
|
||||||
|
if (flags & CTF_Upscale) CreateUpsampledTextureBuffer(result, !!isTransparent, checkonly);
|
||||||
|
|
||||||
|
if (!checkonly) ProcessData(result.mBuffer, result.mWidth, result.mHeight, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetImage())
|
|
||||||
{
|
|
||||||
FContentIdBuilder builder;
|
|
||||||
builder.id = 0;
|
|
||||||
builder.imageID = GetImage()->GetId();
|
|
||||||
builder.translation = MAX(0, translation);
|
|
||||||
builder.expand = exx;
|
|
||||||
result.mContentId = builder.id;
|
|
||||||
}
|
|
||||||
else result.mContentId = 0; // for non-image backed textures this has no meaning so leave it at 0.
|
|
||||||
|
|
||||||
result.mBuffer = buffer;
|
|
||||||
result.mWidth = W;
|
|
||||||
result.mHeight = H;
|
|
||||||
|
|
||||||
// Only do postprocessing for image-backed textures. (i.e. not for the burn texture which can also pass through here.)
|
|
||||||
if (GetImage() && flags & CTF_ProcessData)
|
|
||||||
{
|
|
||||||
if (flags & CTF_Upscale) CreateUpsampledTextureBuffer(result, !!isTransparent, checkonly);
|
|
||||||
|
|
||||||
if (!checkonly) ProcessData(result.mBuffer, result.mWidth, result.mHeight, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
@ -514,7 +532,7 @@ IHardwareTexture* FTexture::GetHardwareTexture(int translation, int scaleflags)
|
||||||
IHardwareTexture* hwtex = SystemTextures.GetHardwareTexture(translation, scaleflags);
|
IHardwareTexture* hwtex = SystemTextures.GetHardwareTexture(translation, scaleflags);
|
||||||
if (hwtex == nullptr)
|
if (hwtex == nullptr)
|
||||||
{
|
{
|
||||||
hwtex = CreateHardwareTexture(4);
|
hwtex = screen->CreateHardwareTexture(4);
|
||||||
SystemTextures.AddHardwareTexture(translation, scaleflags, hwtex);
|
SystemTextures.AddHardwareTexture(translation, scaleflags, hwtex);
|
||||||
}
|
}
|
||||||
return hwtex;
|
return hwtex;
|
||||||
|
@ -535,7 +553,7 @@ FWrapperTexture::FWrapperTexture(int w, int h, int bits)
|
||||||
Height = h;
|
Height = h;
|
||||||
Format = bits;
|
Format = bits;
|
||||||
//bNoCompress = true;
|
//bNoCompress = true;
|
||||||
auto hwtex = CreateHardwareTexture(4);
|
auto hwtex = screen->CreateHardwareTexture(4);
|
||||||
// todo: Initialize here.
|
// todo: Initialize here.
|
||||||
SystemTextures.AddHardwareTexture(0, false, hwtex);
|
SystemTextures.AddHardwareTexture(0, false, hwtex);
|
||||||
}
|
}
|
||||||
|
|
|
@ -625,8 +625,8 @@ void FTextureManager::AddHiresTextures (int wadnum)
|
||||||
auto gtex = MakeGameTexture(newtex, nullptr, ETextureType::Override);
|
auto gtex = MakeGameTexture(newtex, nullptr, ETextureType::Override);
|
||||||
gtex->SetWorldPanning(true);
|
gtex->SetWorldPanning(true);
|
||||||
gtex->SetDisplaySize(oldtex->GetDisplayWidth(), oldtex->GetDisplayHeight());
|
gtex->SetDisplaySize(oldtex->GetDisplayWidth(), oldtex->GetDisplayHeight());
|
||||||
gtex->SetOffsets(0, xs_RoundToInt(oldtex->GetDisplayLeftOffset(0) * gtex->GetScaleX()), xs_RoundToInt(oldtex->GetDisplayTopOffset(0) * gtex->GetScaleY()));
|
gtex->SetOffsets(0, oldtex->GetTexelLeftOffset(0), oldtex->GetTexelTopOffset(0));
|
||||||
gtex->SetOffsets(1, xs_RoundToInt(oldtex->GetDisplayLeftOffset(1) * gtex->GetScaleX()), xs_RoundToInt(oldtex->GetDisplayTopOffset(1) * gtex->GetScaleY()));
|
gtex->SetOffsets(1, oldtex->GetTexelLeftOffset(1), oldtex->GetTexelTopOffset(1));
|
||||||
ReplaceTexture(tlist[i], gtex, true);
|
ReplaceTexture(tlist[i], gtex, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue