📄 model.c
字号:
/* model.c, HAWK game engine
*
* Copyright 1997-1998 by Phil Frisbie, Jr.
* for Hawk Software
*
*/
#include "hawk.h"
#include "internal.h"
#include "hardware.h"
#define MAX_MODELS (MAX_MAP_MODELS *2)
#define MAX_TEX 64
int modelGet(void);
LOADEDFILE *modelfile = NULL;
int nmodelfiles;
/* init all memory */
void initModelfile(void)
{
modelfile = (LOADEDFILE *)TagMalloc(sizeof(LOADEDFILE) * MAX_MODELS, TAG_LEVEL);
memset(modelfile, 0, sizeof(LOADEDFILE) * MAX_MODELS);
nmodelfiles = 0;
Level.nmodels = 0;
Level.models = TagMalloc(MAX_OBJECTS * sizeof(Level.models[0]), TAG_LEVEL);
memset(Level.models, 0, MAX_OBJECTS * sizeof(Level.models[0]));
}
int modelCheckFile(char *modelname)
{
int i;
for(i=1;i<nmodelfiles;i++)
{
if(!_stricmp(modelname, modelfile[i].name))/* found a match */
return modelfile[i].number;
}
return -1;/* not found */
}
void modelSetFile(char *modelname, int modelnumber)
{
strcpy(modelfile[nmodelfiles].name, modelname);
modelfile[nmodelfiles].number = modelnumber;
nmodelfiles++;
}
int modelNew(void)
{
int i;
/* find an unused model */
for(i=1;i<MAX_OBJECTS;i++)
{
if(!Level.models[i].used) /* found an unused model */
{
Level.models[i].used = TRUE;
return i;
}
}
/* we must be out of models */
return -1;
}
void modelFree(int model)
{
memset(&Level.models[model], 0, sizeof(MODEL));
}
int modelLoad(char *modelname)
{
dmdl_t *mdl;
TEXTURE t;
MODEL *model;
int modelnumber;
int i, size;
char *filebuffer;
/* init on first time through */
if(!modelfile)
initModelfile();
/* check to see if model is already loaded */
modelnumber = modelCheckFile(modelname);
if(modelnumber < 0)
{
/* check to see if model is already loaded */
/* load the model */
size = fileSize(modelname);
if(size <= 0)
return (0);
filebuffer = TempMalloc(size);
loadFile(modelname, 0, size, filebuffer);
/* get the model info */
modelnumber = modelNew();
model = &Level.models[modelnumber];
mdl = (dmdl_t *)filebuffer;
if(mdl->ident != IDALIASHEADER) /* wrong header type */
return 0;
if(mdl->version != ALIAS_VERSION) /* wrong version */
return 0;
model->nframes = mdl->num_frames;
model->framesize = mdl->framesize;
model->nglcmds = mdl->num_glcmds;
/* get the skin names and load them */
t.type = 0;
if(mdl->num_skins)
{
for(i=0;i<mdl->num_skins;i++)
{
char *texname = filebuffer + mdl->ofs_skins + (i * 64);
model->texture[i] = loadTexture(texname, &t);
}
}
else
{
model->texture[0] = loadTexture("players/male/scout.pcx", &t);
}
/* get the frames */
model->frames = TagMalloc(mdl->num_frames * mdl->framesize, TAG_LEVEL);
memcpy(model->frames, (filebuffer + mdl->ofs_frames), mdl->num_frames * mdl->framesize);
/* get the glcmds */
model->glcmds = TagMalloc(mdl->num_glcmds * 4, TAG_LEVEL);
memcpy(model->glcmds, (filebuffer + mdl->ofs_glcmds), (mdl->num_glcmds * 4));
/* update the file info */
modelSetFile(modelname, modelnumber);
TempFree(filebuffer);
}
return modelnumber;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -