- ported all simple model commands.

'model' is the last remaining one.
This commit is contained in:
Christoph Oelckers 2021-04-20 23:13:42 +02:00
parent 93edeac791
commit 542e1b2ba7
2 changed files with 181 additions and 181 deletions

View file

@ -410,150 +410,20 @@ static int32_t defsparser(scriptfile *script)
break;
case T_DEFINEMODEL:
{
FString modelfn;
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;
parseDefineModel(*script, pos);
break;
case T_DEFINEMODELFRAME:
{
FString framename;
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,&ltilenume)) break; //last tile number (inclusive)
if (check_tile_range("definemodelframe", &ftilenume, &ltilenume, 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;
parseDefineModelFrame(*script, pos);
break;
case T_DEFINEMODELANIM:
{
FString startframe, endframe;
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;
parseDefineModelAnim(*script, pos);
break;
case T_DEFINEMODELSKIN:
{
int32_t palnum;
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;
parseDefineModelSkin(*script, pos);
break;
case T_SELECTMODELSKIN:
{
if (scriptfile_getsymbol(script,&modelskin)) break;
}
break;
parseSelectModelSkin(*script, pos);
break;
case T_DEFINEVOXEL:
parseDefineVoxel(*script, pos);
break;
@ -994,50 +864,15 @@ static int32_t defsparser(scriptfile *script)
break;
case T_UNDEFMODEL:
parseUndefModel(*script, pos);
break;
case T_UNDEFMODELRANGE:
{
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.");
parseUndefModelRange(*script, pos);
break;
#if defined USE_OPENGL && 0
mid = md_tilehasmodel(r0,0);
if (mid < 0) break;
md_undefinemodel(mid);
#endif
}
break;
case T_UNDEFMODELOF:
parseUndefModelOf(*script, pos);
break;
case T_UNDEFTEXTURE:
parseUndefTexture(*script, pos);

View file

@ -1580,3 +1580,168 @@ void parseHighpalookup(FScanner& sc, FScriptPosition& pos)
}
// 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.");
}