mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-11-10 14:52:01 +00:00
- migrated 'texture' .def command.
This commit is contained in:
parent
057b8a7354
commit
6b684e74ba
3 changed files with 150 additions and 200 deletions
|
@ -1638,188 +1638,7 @@ static int32_t defsparser(scriptfile *script)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case T_TEXTURE:
|
case T_TEXTURE:
|
||||||
{
|
parseTexture(*script, pos);
|
||||||
FScanner::SavedPos textureend;
|
|
||||||
int32_t tile=-1, token;
|
|
||||||
|
|
||||||
static const tokenlist texturetokens[] =
|
|
||||||
{
|
|
||||||
{ "pal", T_PAL },
|
|
||||||
{ "detail", T_DETAIL },
|
|
||||||
{ "glow", T_GLOW },
|
|
||||||
{ "specular",T_SPECULAR },
|
|
||||||
{ "normal", T_NORMAL },
|
|
||||||
};
|
|
||||||
|
|
||||||
if (scriptfile_getsymbol(script,&tile)) break;
|
|
||||||
if (scriptfile_getbraces(script,&textureend)) break;
|
|
||||||
while (!scriptfile_endofblock(script, textureend))
|
|
||||||
{
|
|
||||||
token = getatoken(script,texturetokens,countof(texturetokens));
|
|
||||||
switch (token)
|
|
||||||
{
|
|
||||||
case T_PAL:
|
|
||||||
{
|
|
||||||
auto palpos = scriptfile_getposition(script);
|
|
||||||
FScanner::SavedPos palend;
|
|
||||||
int32_t pal=-1, xsiz = 0, ysiz = 0;
|
|
||||||
FString fn;
|
|
||||||
double alphacut = -1.0, xscale = 1.0, yscale = 1.0, specpower = 1.0, specfactor = 1.0;
|
|
||||||
|
|
||||||
static const tokenlist texturetokens_pal[] =
|
|
||||||
{
|
|
||||||
{ "file", T_FILE },{ "name", T_FILE },
|
|
||||||
{ "alphacut", T_ALPHACUT },
|
|
||||||
{ "detailscale", T_XSCALE }, { "scale", T_XSCALE }, { "xscale", T_XSCALE }, { "intensity", T_XSCALE },
|
|
||||||
{ "yscale", T_YSCALE },
|
|
||||||
{ "specpower", T_SPECPOWER }, { "specularpower", T_SPECPOWER }, { "parallaxscale", T_SPECPOWER },
|
|
||||||
{ "specfactor", T_SPECFACTOR }, { "specularfactor", T_SPECFACTOR }, { "parallaxbias", T_SPECFACTOR },
|
|
||||||
{ "nocompress", T_NOCOMPRESS },
|
|
||||||
{ "nodownsize", T_NODOWNSIZE },
|
|
||||||
{ "forcefilter", T_FORCEFILTER },
|
|
||||||
{ "artquality", T_ARTQUALITY },
|
|
||||||
{ "orig_sizex", T_ORIGSIZEX }, { "orig_sizey", T_ORIGSIZEY }
|
|
||||||
};
|
|
||||||
|
|
||||||
if (scriptfile_getsymbol(script,&pal)) break;
|
|
||||||
if (scriptfile_getbraces(script,&palend)) break;
|
|
||||||
while (!scriptfile_endofblock(script, palend))
|
|
||||||
{
|
|
||||||
switch (getatoken(script,texturetokens_pal,countof(texturetokens_pal)))
|
|
||||||
{
|
|
||||||
case T_FILE:
|
|
||||||
scriptfile_getstring(script,&fn); break;
|
|
||||||
case T_ALPHACUT:
|
|
||||||
scriptfile_getdouble(script,&alphacut); break;
|
|
||||||
case T_XSCALE:
|
|
||||||
scriptfile_getdouble(script,&xscale); break;
|
|
||||||
case T_YSCALE:
|
|
||||||
scriptfile_getdouble(script,&yscale); break;
|
|
||||||
case T_SPECPOWER:
|
|
||||||
scriptfile_getdouble(script,&specpower); break;
|
|
||||||
case T_SPECFACTOR:
|
|
||||||
scriptfile_getdouble(script,&specfactor); break;
|
|
||||||
case T_ORIGSIZEX:
|
|
||||||
scriptfile_getnumber(script, &xsiz);
|
|
||||||
break;
|
|
||||||
case T_ORIGSIZEY:
|
|
||||||
scriptfile_getnumber(script, &ysiz);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((unsigned)tile >= MAXUSERTILES) break; // message is printed later
|
|
||||||
if ((unsigned)pal >= MAXPALOOKUPS - RESERVEDPALS)
|
|
||||||
{
|
|
||||||
palpos.Message(MSG_ERROR, "missing or invalid 'palette number' for texture definition");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (fn.IsEmpty())
|
|
||||||
{
|
|
||||||
palpos.Message(MSG_ERROR, "missing 'file name' for texture definition");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!fileSystem.FileExists(fn))
|
|
||||||
{
|
|
||||||
palpos.Message(MSG_ERROR, "%s not found in replacement for tile %d", fn.GetChars(), tile);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (xsiz > 0 && ysiz > 0)
|
|
||||||
{
|
|
||||||
tileSetDummy(tile, xsiz, ysiz);
|
|
||||||
}
|
|
||||||
xscale = 1.0f / xscale;
|
|
||||||
yscale = 1.0f / yscale;
|
|
||||||
|
|
||||||
tileSetHightileReplacement(tile,pal,fn,alphacut,xscale,yscale, specpower, specfactor);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case T_DETAIL: case T_GLOW: case T_SPECULAR: case T_NORMAL:
|
|
||||||
{
|
|
||||||
auto detailpos = scriptfile_getposition(script);
|
|
||||||
FScanner::SavedPos detailend;
|
|
||||||
int32_t pal = 0;
|
|
||||||
FString fn;
|
|
||||||
double xscale = 1.0, yscale = 1.0, specpower = 1.0, specfactor = 1.0;
|
|
||||||
|
|
||||||
static const tokenlist texturetokens_pal[] =
|
|
||||||
{
|
|
||||||
{ "file", T_FILE },{ "name", T_FILE },
|
|
||||||
{ "alphacut", T_ALPHACUT },
|
|
||||||
{ "detailscale", T_XSCALE }, { "scale", T_XSCALE }, { "xscale", T_XSCALE }, { "intensity", T_XSCALE },
|
|
||||||
{ "yscale", T_YSCALE },
|
|
||||||
{ "specpower", T_SPECPOWER }, { "specularpower", T_SPECPOWER }, { "parallaxscale", T_SPECPOWER },
|
|
||||||
{ "specfactor", T_SPECFACTOR }, { "specularfactor", T_SPECFACTOR }, { "parallaxbias", T_SPECFACTOR },
|
|
||||||
{ "nocompress", T_NOCOMPRESS },
|
|
||||||
{ "nodownsize", T_NODOWNSIZE },
|
|
||||||
{ "forcefilter", T_FORCEFILTER },
|
|
||||||
{ "artquality", T_ARTQUALITY },
|
|
||||||
};
|
|
||||||
|
|
||||||
if (scriptfile_getbraces(script,&detailend)) break;
|
|
||||||
while (!scriptfile_endofblock(script, detailend))
|
|
||||||
{
|
|
||||||
switch (getatoken(script,texturetokens_pal,countof(texturetokens_pal)))
|
|
||||||
{
|
|
||||||
case T_FILE:
|
|
||||||
scriptfile_getstring(script,&fn); break;
|
|
||||||
case T_XSCALE:
|
|
||||||
scriptfile_getdouble(script,&xscale); break;
|
|
||||||
case T_YSCALE:
|
|
||||||
scriptfile_getdouble(script,&yscale); break;
|
|
||||||
case T_SPECPOWER:
|
|
||||||
scriptfile_getdouble(script,&specpower); break;
|
|
||||||
case T_SPECFACTOR:
|
|
||||||
scriptfile_getdouble(script,&specfactor); break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((unsigned)tile >= MAXUSERTILES) break; // message is printed later
|
|
||||||
if (fn.IsEmpty())
|
|
||||||
{
|
|
||||||
detailpos.Message(MSG_ERROR, "missing 'file name' for texture definition");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!fileSystem.FileExists(fn))
|
|
||||||
break;
|
|
||||||
|
|
||||||
switch (token)
|
|
||||||
{
|
|
||||||
case T_DETAIL:
|
|
||||||
pal = DETAILPAL;
|
|
||||||
xscale = 1.0f / xscale;
|
|
||||||
yscale = 1.0f / yscale;
|
|
||||||
break;
|
|
||||||
case T_GLOW:
|
|
||||||
pal = GLOWPAL;
|
|
||||||
break;
|
|
||||||
case T_SPECULAR:
|
|
||||||
pal = SPECULARPAL;
|
|
||||||
break;
|
|
||||||
case T_NORMAL:
|
|
||||||
pal = NORMALPAL;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
tileSetHightileReplacement(tile,pal,fn,-1.0f,xscale,yscale, specpower, specfactor);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ((unsigned)tile >= MAXUSERTILES)
|
|
||||||
{
|
|
||||||
pos.Message(MSG_ERROR, "missing or invalid 'tile number' for texture definition");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_UNDEFMODEL:
|
case T_UNDEFMODEL:
|
||||||
|
|
|
@ -130,6 +130,15 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GetFloat(bool evaluate = false);
|
bool GetFloat(bool evaluate = false);
|
||||||
|
|
||||||
|
bool GetFloat(double& var, bool evaluate = false)
|
||||||
|
{
|
||||||
|
if (!GetFloat(evaluate)) return false;
|
||||||
|
var = Float;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void MustGetFloat(bool evaluate = false);
|
void MustGetFloat(bool evaluate = false);
|
||||||
bool CheckFloat(bool evaluate = false);
|
bool CheckFloat(bool evaluate = false);
|
||||||
|
|
||||||
|
|
|
@ -86,6 +86,128 @@ void parseDefineTexture(FScanner& sc, FScriptPosition& pos)
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
|
static void parseTexturePaletteBlock(FScanner& sc, FScriptPosition& pos, int tile)
|
||||||
|
{
|
||||||
|
FScanner::SavedPos blockend;
|
||||||
|
|
||||||
|
int pal = -1, xsiz = 0, ysiz = 0;
|
||||||
|
FString fn;
|
||||||
|
double alphacut = -1.0, xscale = 1.0, yscale = 1.0, specpower = 1.0, specfactor = 1.0;
|
||||||
|
|
||||||
|
if (!sc.GetNumber(pal, true)) return;
|
||||||
|
|
||||||
|
if (sc.StartBraces(&blockend)) return;
|
||||||
|
while (!sc.FoundEndBrace(blockend))
|
||||||
|
{
|
||||||
|
sc.GetString();
|
||||||
|
if (sc.Compare("file")) sc.GetString(fn);
|
||||||
|
else if (sc.Compare("alphacut")) sc.GetFloat(alphacut, true);
|
||||||
|
else if (sc.Compare({ "xscale", "scale", "intensity", "detailscale" })) sc.GetFloat(xscale, true); // what's the point of all of these names?
|
||||||
|
else if (sc.Compare("yscale")) sc.GetFloat(yscale, true);
|
||||||
|
else if (sc.Compare({ "specpower", "specularpower", "parallaxscale" })) sc.GetFloat(specpower, true);
|
||||||
|
else if (sc.Compare({ "specfactor", "specularfactor", "parallaxbias" })) sc.GetFloat(specfactor, true);
|
||||||
|
else if (sc.Compare("orig_sizex")) sc.GetNumber(xsiz, true);
|
||||||
|
else if (sc.Compare("orig_sizey")) sc.GetNumber(ysiz, true);
|
||||||
|
};
|
||||||
|
|
||||||
|
if ((unsigned)tile < MAXUSERTILES)
|
||||||
|
{
|
||||||
|
if ((unsigned)pal >= MAXPALOOKUPS - RESERVEDPALS)
|
||||||
|
{
|
||||||
|
pos.Message(MSG_ERROR, "missing or invalid 'palette number' for texture definition");
|
||||||
|
}
|
||||||
|
else if (fn.IsEmpty())
|
||||||
|
{
|
||||||
|
pos.Message(MSG_ERROR, "missing 'file name' for texture definition");
|
||||||
|
}
|
||||||
|
else if (!fileSystem.FileExists(fn))
|
||||||
|
{
|
||||||
|
pos.Message(MSG_ERROR, "%s not found in replacement for tile %d", fn.GetChars(), tile);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (xsiz > 0 && ysiz > 0)
|
||||||
|
{
|
||||||
|
tileSetDummy(tile, xsiz, ysiz);
|
||||||
|
}
|
||||||
|
xscale = 1.0f / xscale;
|
||||||
|
yscale = 1.0f / yscale;
|
||||||
|
|
||||||
|
tileSetHightileReplacement(tile, pal, fn, alphacut, xscale, yscale, specpower, specfactor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void parseTextureSpecialBlock(FScanner& sc, FScriptPosition& pos, int tile, int specialpal)
|
||||||
|
{
|
||||||
|
FScanner::SavedPos blockend;
|
||||||
|
|
||||||
|
int pal = -1;
|
||||||
|
FString fn;
|
||||||
|
double xscale = 1.0, yscale = 1.0, specpower = 1.0, specfactor = 1.0;
|
||||||
|
|
||||||
|
if (!sc.GetNumber(pal, true)) return;
|
||||||
|
|
||||||
|
if (sc.StartBraces(&blockend)) return;
|
||||||
|
while (!sc.FoundEndBrace(blockend))
|
||||||
|
{
|
||||||
|
sc.GetString();
|
||||||
|
if (sc.Compare("file")) sc.GetString(fn);
|
||||||
|
else if (sc.Compare({ "xscale", "scale", "intensity", "detailscale" })) sc.GetFloat(xscale, true); // what's the point of all of these names?
|
||||||
|
else if (sc.Compare("yscale")) sc.GetFloat(yscale, true);
|
||||||
|
else if (sc.Compare({ "specpower", "specularpower", "parallaxscale" })) sc.GetFloat(specpower, true);
|
||||||
|
else if (sc.Compare({ "specfactor", "specularfactor", "parallaxbias" })) sc.GetFloat(specfactor, true);
|
||||||
|
};
|
||||||
|
|
||||||
|
if ((unsigned)tile < MAXUSERTILES)
|
||||||
|
{
|
||||||
|
if (fn.IsEmpty())
|
||||||
|
{
|
||||||
|
pos.Message(MSG_ERROR, "missing 'file name' for texture definition");
|
||||||
|
}
|
||||||
|
else if (!fileSystem.FileExists(fn))
|
||||||
|
{
|
||||||
|
pos.Message(MSG_ERROR, "%s not found in replacement for tile %d", fn.GetChars(), tile);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (pal == DETAILPAL)
|
||||||
|
{
|
||||||
|
xscale = 1.0f / xscale;
|
||||||
|
yscale = 1.0f / yscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
tileSetHightileReplacement(tile, pal, fn, -1.f, xscale, yscale, specpower, specfactor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void parseTexture(FScanner& sc, FScriptPosition& pos)
|
||||||
|
{
|
||||||
|
FScanner::SavedPos blockend;
|
||||||
|
int tile = -1;
|
||||||
|
|
||||||
|
if (!sc.GetNumber(tile, true)) return;
|
||||||
|
ValidateTilenum("texture", tile, pos); // do not abort, we still need to parse over the data.
|
||||||
|
|
||||||
|
if (sc.StartBraces(&blockend)) return;
|
||||||
|
while (!sc.FoundEndBrace(blockend))
|
||||||
|
{
|
||||||
|
sc.MustGetString();
|
||||||
|
if (sc.Compare("pal")) parseTexturePaletteBlock(sc, pos, tile);
|
||||||
|
else if (sc.Compare("detail")) parseTextureSpecialBlock(sc, pos, tile, DETAILPAL);
|
||||||
|
else if (sc.Compare("glow")) parseTextureSpecialBlock(sc, pos, tile, GLOWPAL);
|
||||||
|
else if (sc.Compare("specular")) parseTextureSpecialBlock(sc, pos, tile, SPECULARPAL);
|
||||||
|
else if (sc.Compare("normal")) parseTextureSpecialBlock(sc, pos, tile, NORMALPAL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
void parseDefineSkybox(FScanner& sc, FScriptPosition& pos)
|
void parseDefineSkybox(FScanner& sc, FScriptPosition& pos)
|
||||||
{
|
{
|
||||||
int tile, palette;
|
int tile, palette;
|
||||||
|
@ -112,12 +234,12 @@ void parseSkybox(FScanner& sc, FScriptPosition& pos)
|
||||||
{
|
{
|
||||||
FString faces[6];
|
FString faces[6];
|
||||||
FScanner::SavedPos blockend;
|
FScanner::SavedPos blockend;
|
||||||
int32_t tile = -1, pal = 0;
|
int tile = -1, pal = 0;
|
||||||
|
|
||||||
if (sc.StartBraces(&blockend)) return;
|
if (sc.StartBraces(&blockend)) return;
|
||||||
while (!sc.FoundEndBrace(blockend))
|
while (!sc.FoundEndBrace(blockend))
|
||||||
{
|
{
|
||||||
sc.GetString();
|
sc.MustGetString();
|
||||||
if (sc.Compare("tile")) sc.GetNumber(tile, true);
|
if (sc.Compare("tile")) sc.GetNumber(tile, true);
|
||||||
else if (sc.Compare("pal")) sc.GetNumber(pal, true);
|
else if (sc.Compare("pal")) sc.GetNumber(pal, true);
|
||||||
else if (sc.Compare({ "ft", "front", "forward" })) sc.GetString(faces[0]);
|
else if (sc.Compare({ "ft", "front", "forward" })) sc.GetString(faces[0]);
|
||||||
|
|
Loading…
Reference in a new issue