mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-27 20:20:40 +00:00
- ported all simple model commands.
'model' is the last remaining one.
This commit is contained in:
parent
93edeac791
commit
542e1b2ba7
2 changed files with 181 additions and 181 deletions
|
@ -410,150 +410,20 @@ static int32_t defsparser(scriptfile *script)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_DEFINEMODEL:
|
case T_DEFINEMODEL:
|
||||||
{
|
parseDefineModel(*script, pos);
|
||||||
FString modelfn;
|
break;
|
||||||
double scale;
|
|
||||||
int32_t shadeoffs;
|
|
||||||
|
|
||||||
if (scriptfile_getstring(script,&modelfn)) break;
|
|
||||||
if (scriptfile_getdouble(script,&scale)) break;
|
|
||||||
if (scriptfile_getnumber(script,&shadeoffs)) break;
|
|
||||||
|
|
||||||
lastmodelid = md_loadmodel(modelfn);
|
|
||||||
if (lastmodelid < 0)
|
|
||||||
{
|
|
||||||
Printf("Warning: Failed loading MD2/MD3 model \"%s\"\n", modelfn.GetChars());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
md_setmisc(lastmodelid,(float)scale, shadeoffs,0.0,0.0,0);
|
|
||||||
|
|
||||||
modelskin = lastmodelskin = 0;
|
|
||||||
seenframe = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case T_DEFINEMODELFRAME:
|
case T_DEFINEMODELFRAME:
|
||||||
{
|
parseDefineModelFrame(*script, pos);
|
||||||
FString framename;
|
break;
|
||||||
char happy=1;
|
|
||||||
int32_t tilex;
|
|
||||||
int32_t ftilenume, ltilenume;
|
|
||||||
|
|
||||||
if (scriptfile_getstring(script,&framename)) break;
|
|
||||||
if (scriptfile_getsymbol(script,&ftilenume)) break; //first tile number
|
|
||||||
if (scriptfile_getsymbol(script,<ilenume)) break; //last tile number (inclusive)
|
|
||||||
|
|
||||||
if (check_tile_range("definemodelframe", &ftilenume, <ilenume, script, pos))
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (lastmodelid < 0)
|
|
||||||
{
|
|
||||||
pos.Message(MSG_WARNING, "Ignoring frame definition.\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
for (tilex = ftilenume; tilex <= ltilenume && happy; tilex++)
|
|
||||||
{
|
|
||||||
switch (md_defineframe(lastmodelid, framename, tilex, max(0,modelskin), 0.0f,0))
|
|
||||||
{
|
|
||||||
case -1:
|
|
||||||
happy = 0; break; // invalid model id!?
|
|
||||||
case -2:
|
|
||||||
Printf("Invalid tile number");
|
|
||||||
happy = 0;
|
|
||||||
break;
|
|
||||||
case -3:
|
|
||||||
Printf("Invalid frame name");
|
|
||||||
happy = 0;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
seenframe = 1;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case T_DEFINEMODELANIM:
|
case T_DEFINEMODELANIM:
|
||||||
{
|
parseDefineModelAnim(*script, pos);
|
||||||
FString startframe, endframe;
|
break;
|
||||||
int32_t flags;
|
|
||||||
double dfps;
|
|
||||||
|
|
||||||
if (scriptfile_getstring(script,&startframe)) break;
|
|
||||||
if (scriptfile_getstring(script,&endframe)) break;
|
|
||||||
if (scriptfile_getdouble(script,&dfps)) break; //animation frame rate
|
|
||||||
if (scriptfile_getnumber(script,&flags)) break;
|
|
||||||
|
|
||||||
if (lastmodelid < 0)
|
|
||||||
{
|
|
||||||
Printf("Warning: Ignoring animation definition.\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
switch (md_defineanimation(lastmodelid, startframe, endframe, (int32_t)(dfps*(65536.0*.001)), flags))
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
case -1:
|
|
||||||
break; // invalid model id!?
|
|
||||||
case -2:
|
|
||||||
Printf("Invalid starting frame name");
|
|
||||||
break;
|
|
||||||
case -3:
|
|
||||||
Printf("Invalid ending frame name");
|
|
||||||
break;
|
|
||||||
case -4:
|
|
||||||
Printf("Out of memory");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case T_DEFINEMODELSKIN:
|
case T_DEFINEMODELSKIN:
|
||||||
{
|
parseDefineModelSkin(*script, pos);
|
||||||
int32_t palnum;
|
break;
|
||||||
FString skinfn;
|
|
||||||
|
|
||||||
if (scriptfile_getsymbol(script,&palnum)) break;
|
|
||||||
if (scriptfile_getstring(script,&skinfn)) break; //skin filename
|
|
||||||
|
|
||||||
// if we see a sequence of definemodelskin, then a sequence of definemodelframe,
|
|
||||||
// and then a definemodelskin, we need to increment the skin counter.
|
|
||||||
//
|
|
||||||
// definemodel "mymodel.md2" 1 1
|
|
||||||
// definemodelskin 0 "normal.png" // skin 0
|
|
||||||
// definemodelskin 21 "normal21.png"
|
|
||||||
// definemodelframe "foo" 1000 1002 // these use skin 0
|
|
||||||
// definemodelskin 0 "wounded.png" // skin 1
|
|
||||||
// definemodelskin 21 "wounded21.png"
|
|
||||||
// definemodelframe "foo2" 1003 1004 // these use skin 1
|
|
||||||
// selectmodelskin 0 // resets to skin 0
|
|
||||||
// definemodelframe "foo3" 1005 1006 // these use skin 0
|
|
||||||
if (seenframe) { modelskin = ++lastmodelskin; }
|
|
||||||
seenframe = 0;
|
|
||||||
|
|
||||||
if (!fileSystem.FileExists(skinfn))
|
|
||||||
break;
|
|
||||||
|
|
||||||
switch (md_defineskin(lastmodelid, skinfn, palnum, max(0,modelskin), 0, 0.0f, 1.0f, 1.0f, 0))
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
case -1:
|
|
||||||
break; // invalid model id!?
|
|
||||||
case -2:
|
|
||||||
Printf("Invalid skin filename");
|
|
||||||
break;
|
|
||||||
case -3:
|
|
||||||
Printf("Invalid palette number");
|
|
||||||
break;
|
|
||||||
case -4:
|
|
||||||
Printf("Out of memory");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case T_SELECTMODELSKIN:
|
case T_SELECTMODELSKIN:
|
||||||
{
|
parseSelectModelSkin(*script, pos);
|
||||||
if (scriptfile_getsymbol(script,&modelskin)) break;
|
break;
|
||||||
}
|
|
||||||
break;
|
|
||||||
case T_DEFINEVOXEL:
|
case T_DEFINEVOXEL:
|
||||||
parseDefineVoxel(*script, pos);
|
parseDefineVoxel(*script, pos);
|
||||||
break;
|
break;
|
||||||
|
@ -994,50 +864,15 @@ static int32_t defsparser(scriptfile *script)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case T_UNDEFMODEL:
|
case T_UNDEFMODEL:
|
||||||
|
parseUndefModel(*script, pos);
|
||||||
|
break;
|
||||||
case T_UNDEFMODELRANGE:
|
case T_UNDEFMODELRANGE:
|
||||||
{
|
parseUndefModelRange(*script, pos);
|
||||||
int32_t r0,r1;
|
|
||||||
|
|
||||||
if (scriptfile_getsymbol(script,&r0)) break;
|
|
||||||
if (tokn == T_UNDEFMODELRANGE)
|
|
||||||
{
|
|
||||||
if (scriptfile_getsymbol(script,&r1)) break;
|
|
||||||
|
|
||||||
if (check_tile_range("undefmodelrange", &r0, &r1, script, pos))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
r1 = r0;
|
|
||||||
|
|
||||||
if (check_tile("undefmodel", r0, script, pos))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
for (; r0 <= r1; r0++)
|
|
||||||
md_undefinetile(r0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case T_UNDEFMODELOF:
|
|
||||||
{
|
|
||||||
int32_t r0;
|
|
||||||
if (scriptfile_getsymbol(script,&r0)) break;
|
|
||||||
|
|
||||||
if (check_tile("undefmodelof", r0, script, pos))
|
|
||||||
break;
|
|
||||||
|
|
||||||
// XXX: See comment of md_undefinemodel()
|
|
||||||
pos.Message(MSG_WARNING, "undefmodelof: currently non-functional.");
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#if defined USE_OPENGL && 0
|
case T_UNDEFMODELOF:
|
||||||
mid = md_tilehasmodel(r0,0);
|
parseUndefModelOf(*script, pos);
|
||||||
if (mid < 0) break;
|
break;
|
||||||
|
|
||||||
md_undefinemodel(mid);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case T_UNDEFTEXTURE:
|
case T_UNDEFTEXTURE:
|
||||||
parseUndefTexture(*script, pos);
|
parseUndefTexture(*script, pos);
|
||||||
|
|
|
@ -1580,3 +1580,168 @@ void parseHighpalookup(FScanner& sc, FScriptPosition& pos)
|
||||||
}
|
}
|
||||||
// todo
|
// todo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct ModelStatics
|
||||||
|
{
|
||||||
|
int lastmodelid;
|
||||||
|
int modelskin, lastmodelskin;
|
||||||
|
int seenframe;
|
||||||
|
} mdglobal;
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
void parseDefineModel(FScanner& sc, FScriptPosition& pos)
|
||||||
|
{
|
||||||
|
FString modelfn;
|
||||||
|
double scale;
|
||||||
|
int shadeoffs;
|
||||||
|
|
||||||
|
if (!sc.GetString(modelfn)) return;
|
||||||
|
if (!sc.GetFloat(scale, true)) return;
|
||||||
|
if (!sc.GetNumber(shadeoffs, true)) return;
|
||||||
|
|
||||||
|
mdglobal.lastmodelid = md_loadmodel(modelfn);
|
||||||
|
if (mdglobal.lastmodelid < 0)
|
||||||
|
{
|
||||||
|
pos.Message(MSG_WARNING, "definemodel: Failed loading model file '%s'\n", modelfn.GetChars());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
md_setmisc(mdglobal.lastmodelid, (float)scale, shadeoffs, 0.0, 0.0, 0);
|
||||||
|
mdglobal.modelskin = mdglobal.lastmodelskin = 0;
|
||||||
|
mdglobal.seenframe = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
void parseDefineModelFrame(FScanner& sc, FScriptPosition& pos)
|
||||||
|
{
|
||||||
|
FString framename;
|
||||||
|
bool ok = true;
|
||||||
|
int firsttile, lasttile;
|
||||||
|
|
||||||
|
if (!sc.GetString(framename)) return;
|
||||||
|
if (!sc.GetNumber(firsttile, true)) return;
|
||||||
|
if (!sc.GetNumber(lasttile, true)) return;
|
||||||
|
|
||||||
|
if (!ValidateTileRange("definemodelframe", firsttile, lasttile, pos)) return;
|
||||||
|
|
||||||
|
if (mdglobal.lastmodelid < 0)
|
||||||
|
{
|
||||||
|
pos.Message(MSG_WARNING, "definemodelframe: Ignoring frame definition outside model.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (int i = firsttile; i <= lasttile && ok; i++)
|
||||||
|
{
|
||||||
|
int err = (md_defineframe(mdglobal.lastmodelid, framename, i, max(0, mdglobal.modelskin), 0.0f, 0));
|
||||||
|
if (err < 0) ok = false;
|
||||||
|
if (err == -2) pos.Message(MSG_ERROR, "Invalid tile number %d", i);
|
||||||
|
else if (err == -3) pos.Message(MSG_ERROR, "Invalid frame name", framename.GetChars());
|
||||||
|
}
|
||||||
|
mdglobal.seenframe = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
void parseDefineModelAnim(FScanner& sc, FScriptPosition& pos)
|
||||||
|
{
|
||||||
|
FString startframe, endframe;
|
||||||
|
int32_t flags;
|
||||||
|
double dfps;
|
||||||
|
|
||||||
|
if (!sc.GetString(startframe)) return;
|
||||||
|
if (!sc.GetString(endframe)) return;
|
||||||
|
if (!sc.GetFloat(dfps, true)) return;
|
||||||
|
if (!sc.GetNumber(flags, true)) return;
|
||||||
|
|
||||||
|
if (mdglobal.lastmodelid < 0)
|
||||||
|
{
|
||||||
|
pos.Message(MSG_WARNING, "definemodelframe: Ignoring animation definition outside model.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int err = (md_defineanimation(mdglobal.lastmodelid, startframe, endframe, (int32_t)(dfps * (65536.0 * .001)), flags));
|
||||||
|
if (err == -2) pos.Message(MSG_ERROR, "Invalid starting frame name %s", startframe.GetChars());
|
||||||
|
else if (err == -3) pos.Message(MSG_ERROR, "Invalid ending frame name %s", endframe.GetChars());
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
void parseDefineModelSkin(FScanner& sc, FScriptPosition& pos)
|
||||||
|
{
|
||||||
|
int palnum;
|
||||||
|
FString skinfn;
|
||||||
|
|
||||||
|
if (!sc.GetNumber(palnum, true)) return;
|
||||||
|
if (!sc.GetString(skinfn)) return;
|
||||||
|
|
||||||
|
if (mdglobal.seenframe) { mdglobal.modelskin = ++mdglobal.lastmodelskin; }
|
||||||
|
mdglobal.seenframe = 0;
|
||||||
|
|
||||||
|
if (!fileSystem.FileExists(skinfn)) return;
|
||||||
|
|
||||||
|
int err = (md_defineskin(mdglobal.lastmodelid, skinfn, palnum, max(0, mdglobal.modelskin), 0, 0.0f, 1.0f, 1.0f, 0));
|
||||||
|
if (err == -2) pos.Message(MSG_ERROR, "Invalid skin file name %s", skinfn.GetChars());
|
||||||
|
else if (err == -3) pos.Message(MSG_ERROR, "Invalid palette %d", palnum);
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
void parseSelectModelSkin(FScanner& sc, FScriptPosition& pos)
|
||||||
|
{
|
||||||
|
sc.GetNumber(mdglobal.modelskin, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//
|
||||||
|
//===========================================================================
|
||||||
|
|
||||||
|
void parseUndefModel(FScanner& sc, FScriptPosition& pos)
|
||||||
|
{
|
||||||
|
int tile;
|
||||||
|
if (!sc.GetNumber(tile, true)) return;
|
||||||
|
if (!ValidateTilenum("undefmodel", tile, pos)) return;
|
||||||
|
md_undefinetile(tile);
|
||||||
|
}
|
||||||
|
|
||||||
|
void parseUndefModelRange(FScanner& sc, FScriptPosition& pos)
|
||||||
|
{
|
||||||
|
int start, end;
|
||||||
|
|
||||||
|
if (!sc.GetNumber(start, true)) return;
|
||||||
|
if (!sc.GetNumber(end, true)) return;
|
||||||
|
if (!ValidateTileRange("undefmodel", start, end, pos)) return;
|
||||||
|
for (int i = start; i <= end; i++) md_undefinetile(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
void parseUndefModelOf(FScanner& sc, FScriptPosition& pos)
|
||||||
|
{
|
||||||
|
int tile;
|
||||||
|
if (!sc.GetNumber(tile, true)) return;
|
||||||
|
if (!ValidateTilenum("undefmodelof", tile, pos)) return;
|
||||||
|
pos.Message(MSG_WARNING, "undefmodelof: currently non-functional.");
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue