⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 model.c

📁 著名物理引擎Hawk的源代码
💻 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 + -