- fixed creation of multipatch textures using other multipatch textures as their source.

This commit is contained in:
Christoph Oelckers 2020-04-30 00:12:28 +02:00
parent d71ef66957
commit 3eecb6b3b6
2 changed files with 12 additions and 8 deletions

View file

@ -92,7 +92,7 @@ struct TexInit
{
FString TexName;
ETextureType UseType = ETextureType::Null;
FImageTexture *Texture = nullptr;
FGameTexture *GameTexture = nullptr;
bool Silent = false;
bool HasLine = false;
bool UseOffsets = false;

View file

@ -138,6 +138,8 @@ void FMultipatchTextureBuilder::MakeTexture(BuildInfo &buildinfo, ETextureType u
{
buildinfo.texture = new FGameTexture(nullptr, buildinfo.Name);
buildinfo.texture->SetUseType(usetype);
buildinfo.texture->SetOffsets(0, buildinfo.LeftOffset[0], buildinfo.TopOffset[0]); // These are needed for construction of other multipatch textures.
buildinfo.texture->SetOffsets(1, buildinfo.LeftOffset[1], buildinfo.TopOffset[1]);
TexMan.AddGameTexture(buildinfo.texture);
}
@ -812,10 +814,10 @@ void FMultipatchTextureBuilder::ResolvePatches(BuildInfo &buildinfo)
{
FGameTexture *tex = TexMan.GetGameTexture(texno);
if (tex != nullptr && tex->isValid() && dynamic_cast<FImageTexture*>(tex->GetTexture()))
if (tex != nullptr && tex->isValid() && (tex->GetTexture() == nullptr || dynamic_cast<FImageTexture*>(tex->GetTexture())))
{
//We cannot set the image source yet. First all textures need to be resolved.
buildinfo.Inits[i].Texture = static_cast<FImageTexture*>(tex->GetTexture());
//We cannot set the image texture yet. First all textures need to be resolved.
buildinfo.Inits[i].GameTexture = tex;
bool iscomplex = !!complex.CheckKey(tex);
if (iscomplex) complex.Insert(buildinfo.texture, true);
buildinfo.bComplex |= iscomplex;
@ -830,13 +832,15 @@ void FMultipatchTextureBuilder::ResolvePatches(BuildInfo &buildinfo)
// The patch is bogus. Remove it.
if (buildinfo.Inits[i].HasLine) buildinfo.Inits[i].sc.Message(MSG_WARNING, "Invalid patch '%s' in texture '%s'\n", buildinfo.Inits[i].TexName.GetChars(), buildinfo.Name.GetChars());
else Printf(TEXTCOLOR_YELLOW "Invalid patch '%s' in texture '%s'\n", buildinfo.Inits[i].TexName.GetChars(), buildinfo.Name.GetChars());
buildinfo.Inits.Delete(i);
buildinfo.Parts.Delete(i);
i--;
}
}
}
for (unsigned i = 0; i < buildinfo.Inits.Size(); i++)
{
if (buildinfo.Inits[i].Texture == nullptr)
if (buildinfo.Inits[i].GameTexture == nullptr)
{
buildinfo.Inits.Delete(i);
buildinfo.Parts.Delete(i);
@ -876,10 +880,10 @@ void FMultipatchTextureBuilder::ResolveAllPatches()
{
if (buildinfo.Parts[j].TexImage == nullptr)
{
auto image = buildinfo.Inits[j].Texture;
if (image->GetImage() != nullptr)
auto image = buildinfo.Inits[j].GameTexture->GetTexture();
if (image && image->GetImage() != nullptr)
{
buildinfo.Parts[j].TexImage = image;
buildinfo.Parts[j].TexImage = static_cast<FImageTexture*>(image);
donesomething = true;
}
else hasEmpty = true;