mirror of
https://github.com/DrBeef/Raze.git
synced 2024-11-15 08:52:00 +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;
|
||||
|
||||
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,<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;
|
||||
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);
|
||||
|
|
|
@ -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.");
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue