shithub: qk1

Download patch

ref: e40c6b332d87a6e026e9ed297c44d4ee482f6733
parent: 41b4118b3aaed6b19c909377662ac71dc0aa7ce4
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Sat Nov 25 15:31:28 EST 2023

move alias loading logic into a separate file

--- a/Makefile
+++ b/Makefile
@@ -43,6 +43,7 @@
 	mathlib.o\
 	menu.o\
 	model.o\
+	model_alias.o\
 	model_brush.o\
 	model_bsp.o\
 	model_bsp2.o\
--- a/mkfile
+++ b/mkfile
@@ -41,6 +41,7 @@
 	mathlib.$O\
 	menu.$O\
 	model.$O\
+	model_alias.$O\
 	model_brush.$O\
 	model_bsp.$O\
 	model_bsp2.$O\
--- a/model.c
+++ b/model.c
@@ -284,387 +284,6 @@
 }
 
 /*
-==============================================================================
-
-ALIAS MODELS
-
-==============================================================================
-*/
-
-/*
-=================
-Mod_LoadAliasFrame
-=================
-*/
-void * Mod_LoadAliasFrame (void * pin, int *pframeindex, int numv,
-	trivertx_t *pbboxmin, trivertx_t *pbboxmax, aliashdr_t *pheader, char *name)
-{
-	trivertx_t		*pframe, *pinframe;
-	int				i, j;
-	daliasframe_t	*pdaliasframe;
-
-	pdaliasframe = (daliasframe_t *)pin;
-
-	strcpy (name, pdaliasframe->name);
-
-	for (i=0 ; i<3 ; i++)
-	{
-		// these are byte values, so we don't have to worry about
-		// endianness
-		pbboxmin->v[i] = pdaliasframe->bboxmin.v[i];
-		pbboxmax->v[i] = pdaliasframe->bboxmax.v[i];
-	}
-
-	pinframe = (trivertx_t *)(pdaliasframe + 1);
-	*pframeindex = Hunk_From(pheader);
-	pframe = Hunk_Alloc(numv * sizeof *pframe);
-
-	for (j=0 ; j<numv ; j++)
-	{
-		int		k;
-
-		// these are all byte values, so no need to deal with endianness
-		pframe[j].lightnormalindex = pinframe[j].lightnormalindex;
-
-		for (k=0 ; k<3 ; k++)
-		{
-			pframe[j].v[k] = pinframe[j].v[k];
-		}
-	}
-
-	pinframe += numv;
-
-	return (void *)pinframe;
-}
-
-
-/*
-=================
-Mod_LoadAliasGroup
-=================
-*/
-void * Mod_LoadAliasGroup (void * pin, int *pframeindex, int numv,
-	trivertx_t *pbboxmin, trivertx_t *pbboxmax, aliashdr_t *pheader, char *name)
-{
-	daliasgroup_t		*pingroup;
-	maliasgroup_t		*paliasgroup;
-	int					i, numframes;
-	daliasinterval_t	*pin_intervals;
-	float				*poutintervals;
-	void				*ptemp;
-
-	pingroup = (daliasgroup_t *)pin;
-
-	numframes = LittleLong (pingroup->numframes);
-
-	*pframeindex = Hunk_From(pheader);
-	paliasgroup = Hunk_Alloc(sizeof(*paliasgroup) +
-			(numframes - 1) * sizeof paliasgroup->frames[0]);
-
-	paliasgroup->numframes = numframes;
-
-	for (i=0 ; i<3 ; i++)
-	{
-		// these are byte values, so we don't have to worry about endianness
-		pbboxmin->v[i] = pingroup->bboxmin.v[i];
-		pbboxmax->v[i] = pingroup->bboxmax.v[i];
-	}
-
-	pin_intervals = (daliasinterval_t *)(pingroup + 1);
-
-	paliasgroup->intervals = Hunk_From(pheader);
-	poutintervals = Hunk_Alloc(numframes * sizeof *poutintervals);
-
-	for (i=0 ; i<numframes ; i++)
-	{
-		*poutintervals = LittleFloat (pin_intervals->interval);
-		if (*poutintervals <= 0.0)
-			Host_Error("Mod_LoadAliasGroup: interval<=0");
-
-		poutintervals++;
-		pin_intervals++;
-	}
-
-	ptemp = (void *)pin_intervals;
-
-	for (i=0 ; i<numframes ; i++)
-	{
-		ptemp = Mod_LoadAliasFrame (ptemp,
-									&paliasgroup->frames[i].frame,
-									numv,
-									&paliasgroup->frames[i].bboxmin,
-									&paliasgroup->frames[i].bboxmax,
-									pheader, name);
-	}
-
-	return ptemp;
-}
-
-void *
-Mod_LoadAliasSkin(void * pin, int *pskinindex, int skinsize, aliashdr_t *pheader)
-{
-	uchar *pskin, *pinskin;
-
-	*pskinindex = Hunk_From(pheader);
-	pskin = Hunk_Alloc(skinsize);
-	pinskin = (uchar *)pin;
-	memcpy(pskin, pinskin, skinsize);
-	pinskin += skinsize;
-	return (void *)pinskin;
-}
-
-
-/*
-=================
-Mod_LoadAliasSkinGroup
-=================
-*/
-void * Mod_LoadAliasSkinGroup (void * pin, int *pskinindex, int skinsize,
-	aliashdr_t *pheader)
-{
-	daliasskingroup_t		*pinskingroup;
-	maliasskingroup_t		*paliasskingroup;
-	int						i, numskins;
-	daliasskininterval_t	*pinskinintervals;
-	float					*poutskinintervals;
-	void					*ptemp;
-
-	pinskingroup = (daliasskingroup_t *)pin;
-
-	numskins = LittleLong (pinskingroup->numskins);
-
-	*pskinindex = Hunk_From(pheader);
-	paliasskingroup = Hunk_Alloc(sizeof(*paliasskingroup) +
-		(numskins - 1) * sizeof paliasskingroup->skindescs[0]);
-
-	paliasskingroup->numskins = numskins;
-
-	pinskinintervals = (daliasskininterval_t *)(pinskingroup + 1);
-
-	paliasskingroup->intervals = Hunk_From(pheader);
-	poutskinintervals = Hunk_Alloc(numskins * sizeof *poutskinintervals);
-
-	for (i=0 ; i<numskins ; i++)
-	{
-		*poutskinintervals = LittleFloat (pinskinintervals->interval);
-		if (*poutskinintervals <= 0)
-			Host_Error("Mod_LoadAliasSkinGroup: interval<=0");
-
-		poutskinintervals++;
-		pinskinintervals++;
-	}
-
-	ptemp = (void *)pinskinintervals;
-
-	for (i=0 ; i<numskins ; i++)
-	{
-		ptemp = Mod_LoadAliasSkin (ptemp,
-				&paliasskingroup->skindescs[i].skin, skinsize, pheader);
-	}
-
-	return ptemp;
-}
-
-
-/*
-=================
-Mod_LoadAliasModel
-=================
-*/
-void Mod_LoadAliasModel (model_t *mod, void *buffer)
-{
-	int					i;
-	mdl_t				*pmodel, *pinmodel;
-	stvert_t			*pstverts, *pinstverts;
-	aliashdr_t			*pheader;
-	mtriangle_t			*ptri;
-	dtriangle_t			*pintriangles;
-	int					version, numframes, numskins;
-	int					size;
-	daliasframetype_t	*pframetype;
-	daliasskintype_t	*pskintype;
-	maliasskindesc_t	*pskindesc;
-	int					skinsize;
-
-	pinmodel = (mdl_t *)buffer;
-
-	version = LittleLong (pinmodel->version);
-	if (version != ALIAS_VERSION)
-		Host_Error("%s has wrong version number (%d should be %d)",
-				 mod->name, version, ALIAS_VERSION);
-
-	// allocate space for a working header, plus all the data except the frames,
-	// skin and group info
-	size = 	sizeof (aliashdr_t) + (LittleLong (pinmodel->numframes) - 1) *
-			 sizeof (pheader->frames[0]) +
-			sizeof (mdl_t) +
-			LittleLong (pinmodel->numverts) * sizeof (stvert_t) +
-			LittleLong (pinmodel->numtris) * sizeof (mtriangle_t);
-
-	pheader = Hunk_Alloc(size);
-	pmodel = (mdl_t *) ((byte *)&pheader[1] +
-			(LittleLong (pinmodel->numframes) - 1) *
-			 sizeof (pheader->frames[0]));
-	pheader->model = (byte *)pmodel - (byte *)pheader;
-
-	//mod->cache.data = pheader;
-	mod->flags = LittleLong (pinmodel->flags);
-
-	// endian-adjust and copy the data, starting with the alias model header
-	pmodel->boundingradius = LittleFloat (pinmodel->boundingradius);
-	pmodel->numskins = LittleLong (pinmodel->numskins);
-	pmodel->skinwidth = LittleLong (pinmodel->skinwidth);
-	pmodel->skinheight = LittleLong (pinmodel->skinheight);
-
-	if (pmodel->skinheight > MAX_LBM_HEIGHT)
-		Host_Error("model %s has a skin taller than %d", mod->name,
-				   MAX_LBM_HEIGHT);
-
-	pmodel->numverts = LittleLong (pinmodel->numverts);
-
-	if (pmodel->numverts <= 0)
-		Host_Error("model %s has no vertices", mod->name);
-
-	if (pmodel->numverts > MAXALIASVERTS)
-		Host_Error("model %s has too many vertices", mod->name);
-
-	pmodel->numtris = LittleLong (pinmodel->numtris);
-
-	if (pmodel->numtris <= 0)
-		Host_Error("model %s has no triangles", mod->name);
-
-	pmodel->numframes = LittleLong (pinmodel->numframes);
-	pmodel->size = LittleFloat (pinmodel->size) * ALIAS_BASE_SIZE_RATIO;
-	mod->synctype = LittleLong (pinmodel->synctype);
-	mod->numframes = pmodel->numframes;
-
-	for (i=0 ; i<3 ; i++)
-	{
-		pmodel->scale[i] = LittleFloat (pinmodel->scale[i]);
-		pmodel->scale_origin[i] = LittleFloat (pinmodel->scale_origin[i]);
-		pmodel->eyeposition[i] = LittleFloat (pinmodel->eyeposition[i]);
-	}
-
-	numskins = pmodel->numskins;
-	numframes = pmodel->numframes;
-
-	if (pmodel->skinwidth & 0x03)
-		Host_Error("Mod_LoadAliasModel: skinwidth not multiple of 4");
-
-	// load the skins
-	skinsize = pmodel->skinheight * pmodel->skinwidth;
-
-	if (numskins < 1)
-		Host_Error("Mod_LoadAliasModel: Invalid # of skins: %d\n", numskins);
-
-	pskintype = (daliasskintype_t *)&pinmodel[1];
-
-	pheader->skindesc = Hunk_From(pheader);
-	pskindesc = Hunk_Alloc(numskins * sizeof *pskindesc);
-
-	for (i=0 ; i<numskins ; i++)
-	{
-		aliasskintype_t	skintype;
-
-		skintype = LittleLong (pskintype->type);
-		pskindesc[i].type = skintype;
-
-		if (skintype == ALIAS_SKIN_SINGLE)
-		{
-			pskintype = (daliasskintype_t *)
-					Mod_LoadAliasSkin (pskintype + 1,
-									   &pskindesc[i].skin,
-									   skinsize, pheader);
-		}
-		else
-		{
-			pskintype = (daliasskintype_t *)
-					Mod_LoadAliasSkinGroup (pskintype + 1,
-											&pskindesc[i].skin,
-											skinsize, pheader);
-		}
-	}
-
-	// set base s and t vertices
-	pstverts = (stvert_t *)&pmodel[1];
-	pinstverts = (stvert_t *)pskintype;
-
-	pheader->stverts = (byte *)pstverts - (byte *)pheader;
-
-	for (i=0 ; i<pmodel->numverts ; i++)
-	{
-		pstverts[i].onseam = LittleLong (pinstverts[i].onseam);
-	// put s and t in 16.16 format
-		pstverts[i].s = LittleLong (pinstverts[i].s) << 16;
-		pstverts[i].t = LittleLong (pinstverts[i].t) << 16;
-	}
-
-	// set up the triangles
-	ptri = (mtriangle_t *)&pstverts[pmodel->numverts];
-	pintriangles = (dtriangle_t *)&pinstverts[pmodel->numverts];
-
-	pheader->triangles = (byte *)ptri - (byte *)pheader;
-
-	for (i=0 ; i<pmodel->numtris ; i++)
-	{
-		int		j;
-
-		ptri[i].facesfront = LittleLong (pintriangles[i].facesfront);
-
-		for (j=0 ; j<3 ; j++)
-		{
-			ptri[i].vertindex[j] =
-					LittleLong (pintriangles[i].vertindex[j]);
-		}
-	}
-
-	// load the frames
-	if (numframes < 1)
-		Host_Error("Mod_LoadAliasModel: Invalid # of frames: %d\n", numframes);
-
-	pframetype = (daliasframetype_t *)&pintriangles[pmodel->numtris];
-
-	for (i=0 ; i<numframes ; i++)
-	{
-		aliasframetype_t	frametype;
-
-		frametype = LittleLong (pframetype->type);
-		pheader->frames[i].type = frametype;
-
-		if (frametype == ALIAS_SINGLE)
-		{
-			pframetype = (daliasframetype_t *)
-					Mod_LoadAliasFrame (pframetype + 1,
-										&pheader->frames[i].frame,
-										pmodel->numverts,
-										&pheader->frames[i].bboxmin,
-										&pheader->frames[i].bboxmax,
-										pheader, pheader->frames[i].name);
-		}
-		else
-		{
-			pframetype = (daliasframetype_t *)
-					Mod_LoadAliasGroup (pframetype + 1,
-										&pheader->frames[i].frame,
-										pmodel->numverts,
-										&pheader->frames[i].bboxmin,
-										&pheader->frames[i].bboxmax,
-										pheader, pheader->frames[i].name);
-		}
-	}
-
-	mod->type = mod_alias;
-
-	// FIXME: do this right
-	mod->mins[0] = mod->mins[1] = mod->mins[2] = -16;
-	mod->maxs[0] = mod->maxs[1] = mod->maxs[2] = 16;
-
-	// move the complete, relocatable alias model to the cache
-
-	Hunk_CacheFrom(&mod->cache, pheader);
-}
-
-/*
 ================
 Mod_Print
 ================
--- /dev/null
+++ b/model_alias.c
@@ -1,0 +1,358 @@
+#include "quakedef.h"
+
+static void *
+Mod_LoadAliasFrame(
+	void * pin, int *pframeindex, int numv,
+	trivertx_t *pbboxmin, trivertx_t *pbboxmax, aliashdr_t *pheader, char *name)
+{
+	trivertx_t		*pframe, *pinframe;
+	int				i, j;
+	daliasframe_t	*pdaliasframe;
+
+	pdaliasframe = (daliasframe_t *)pin;
+
+	strcpy (name, pdaliasframe->name);
+
+	for (i=0 ; i<3 ; i++)
+	{
+		// these are byte values, so we don't have to worry about
+		// endianness
+		pbboxmin->v[i] = pdaliasframe->bboxmin.v[i];
+		pbboxmax->v[i] = pdaliasframe->bboxmax.v[i];
+	}
+
+	pinframe = (trivertx_t *)(pdaliasframe + 1);
+	*pframeindex = Hunk_From(pheader);
+	pframe = Hunk_Alloc(numv * sizeof *pframe);
+
+	for (j=0 ; j<numv ; j++)
+	{
+		int		k;
+
+		// these are all byte values, so no need to deal with endianness
+		pframe[j].lightnormalindex = pinframe[j].lightnormalindex;
+
+		for (k=0 ; k<3 ; k++)
+		{
+			pframe[j].v[k] = pinframe[j].v[k];
+		}
+	}
+
+	pinframe += numv;
+
+	return (void *)pinframe;
+}
+
+static void *
+Mod_LoadAliasGroup(
+	void * pin, int *pframeindex, int numv,
+	trivertx_t *pbboxmin, trivertx_t *pbboxmax, aliashdr_t *pheader, char *name)
+{
+	daliasgroup_t		*pingroup;
+	maliasgroup_t		*paliasgroup;
+	int					i, numframes;
+	daliasinterval_t	*pin_intervals;
+	float				*poutintervals;
+	void				*ptemp;
+
+	pingroup = (daliasgroup_t *)pin;
+
+	numframes = LittleLong (pingroup->numframes);
+
+	*pframeindex = Hunk_From(pheader);
+	paliasgroup = Hunk_Alloc(sizeof(*paliasgroup) +
+			(numframes - 1) * sizeof paliasgroup->frames[0]);
+
+	paliasgroup->numframes = numframes;
+
+	for (i=0 ; i<3 ; i++)
+	{
+		// these are byte values, so we don't have to worry about endianness
+		pbboxmin->v[i] = pingroup->bboxmin.v[i];
+		pbboxmax->v[i] = pingroup->bboxmax.v[i];
+	}
+
+	pin_intervals = (daliasinterval_t *)(pingroup + 1);
+
+	paliasgroup->intervals = Hunk_From(pheader);
+	poutintervals = Hunk_Alloc(numframes * sizeof *poutintervals);
+
+	for (i=0 ; i<numframes ; i++)
+	{
+		*poutintervals = LittleFloat (pin_intervals->interval);
+		if (*poutintervals <= 0.0)
+			Host_Error("Mod_LoadAliasGroup: interval<=0");
+
+		poutintervals++;
+		pin_intervals++;
+	}
+
+	ptemp = (void *)pin_intervals;
+
+	for (i=0 ; i<numframes ; i++)
+	{
+		ptemp = Mod_LoadAliasFrame (ptemp,
+									&paliasgroup->frames[i].frame,
+									numv,
+									&paliasgroup->frames[i].bboxmin,
+									&paliasgroup->frames[i].bboxmax,
+									pheader, name);
+	}
+
+	return ptemp;
+}
+
+static void *
+Mod_LoadAliasSkin(void * pin, int *pskinindex, int skinsize, aliashdr_t *pheader)
+{
+	uchar *pskin, *pinskin;
+
+	*pskinindex = Hunk_From(pheader);
+	pskin = Hunk_Alloc(skinsize);
+	pinskin = (uchar *)pin;
+	memcpy(pskin, pinskin, skinsize);
+	pinskin += skinsize;
+	return (void *)pinskin;
+}
+
+static void *
+Mod_LoadAliasSkinGroup(
+	void * pin, int *pskinindex, int skinsize,
+	aliashdr_t *pheader)
+{
+	daliasskingroup_t		*pinskingroup;
+	maliasskingroup_t		*paliasskingroup;
+	int						i, numskins;
+	daliasskininterval_t	*pinskinintervals;
+	float					*poutskinintervals;
+	void					*ptemp;
+
+	pinskingroup = (daliasskingroup_t *)pin;
+
+	numskins = LittleLong (pinskingroup->numskins);
+
+	*pskinindex = Hunk_From(pheader);
+	paliasskingroup = Hunk_Alloc(sizeof(*paliasskingroup) +
+		(numskins - 1) * sizeof paliasskingroup->skindescs[0]);
+
+	paliasskingroup->numskins = numskins;
+
+	pinskinintervals = (daliasskininterval_t *)(pinskingroup + 1);
+
+	paliasskingroup->intervals = Hunk_From(pheader);
+	poutskinintervals = Hunk_Alloc(numskins * sizeof *poutskinintervals);
+
+	for (i=0 ; i<numskins ; i++)
+	{
+		*poutskinintervals = LittleFloat (pinskinintervals->interval);
+		if (*poutskinintervals <= 0)
+			Host_Error("Mod_LoadAliasSkinGroup: interval<=0");
+
+		poutskinintervals++;
+		pinskinintervals++;
+	}
+
+	ptemp = (void *)pinskinintervals;
+
+	for (i=0 ; i<numskins ; i++)
+	{
+		ptemp = Mod_LoadAliasSkin (ptemp,
+				&paliasskingroup->skindescs[i].skin, skinsize, pheader);
+	}
+
+	return ptemp;
+}
+
+void
+Mod_LoadAliasModel(model_t *mod, void *buffer)
+{
+	int					i;
+	mdl_t				*pmodel, *pinmodel;
+	stvert_t			*pstverts, *pinstverts;
+	aliashdr_t			*pheader;
+	mtriangle_t			*ptri;
+	dtriangle_t			*pintriangles;
+	int					version, numframes, numskins;
+	int					size;
+	daliasframetype_t	*pframetype;
+	daliasskintype_t	*pskintype;
+	maliasskindesc_t	*pskindesc;
+	int					skinsize;
+
+	pinmodel = (mdl_t *)buffer;
+
+	version = LittleLong (pinmodel->version);
+	if (version != ALIAS_VERSION)
+		Host_Error("%s has wrong version number (%d should be %d)",
+				 mod->name, version, ALIAS_VERSION);
+
+	// allocate space for a working header, plus all the data except the frames,
+	// skin and group info
+	size = 	sizeof (aliashdr_t) + (LittleLong (pinmodel->numframes) - 1) *
+			 sizeof (pheader->frames[0]) +
+			sizeof (mdl_t) +
+			LittleLong (pinmodel->numverts) * sizeof (stvert_t) +
+			LittleLong (pinmodel->numtris) * sizeof (mtriangle_t);
+
+	pheader = Hunk_Alloc(size);
+	pmodel = (mdl_t *) ((byte *)&pheader[1] +
+			(LittleLong (pinmodel->numframes) - 1) *
+			 sizeof (pheader->frames[0]));
+	pheader->model = (byte *)pmodel - (byte *)pheader;
+
+	//mod->cache.data = pheader;
+	mod->flags = LittleLong (pinmodel->flags);
+
+	// endian-adjust and copy the data, starting with the alias model header
+	pmodel->boundingradius = LittleFloat (pinmodel->boundingradius);
+	pmodel->numskins = LittleLong (pinmodel->numskins);
+	pmodel->skinwidth = LittleLong (pinmodel->skinwidth);
+	pmodel->skinheight = LittleLong (pinmodel->skinheight);
+
+	if (pmodel->skinheight > MAX_LBM_HEIGHT)
+		Host_Error("model %s has a skin taller than %d", mod->name,
+				   MAX_LBM_HEIGHT);
+
+	pmodel->numverts = LittleLong (pinmodel->numverts);
+
+	if (pmodel->numverts <= 0)
+		Host_Error("model %s has no vertices", mod->name);
+
+	if (pmodel->numverts > MAXALIASVERTS)
+		Host_Error("model %s has too many vertices", mod->name);
+
+	pmodel->numtris = LittleLong (pinmodel->numtris);
+
+	if (pmodel->numtris <= 0)
+		Host_Error("model %s has no triangles", mod->name);
+
+	pmodel->numframes = LittleLong (pinmodel->numframes);
+	pmodel->size = LittleFloat (pinmodel->size) * ALIAS_BASE_SIZE_RATIO;
+	mod->synctype = LittleLong (pinmodel->synctype);
+	mod->numframes = pmodel->numframes;
+
+	for (i=0 ; i<3 ; i++)
+	{
+		pmodel->scale[i] = LittleFloat (pinmodel->scale[i]);
+		pmodel->scale_origin[i] = LittleFloat (pinmodel->scale_origin[i]);
+		pmodel->eyeposition[i] = LittleFloat (pinmodel->eyeposition[i]);
+	}
+
+	numskins = pmodel->numskins;
+	numframes = pmodel->numframes;
+
+	if (pmodel->skinwidth & 0x03)
+		Host_Error("Mod_LoadAliasModel: skinwidth not multiple of 4");
+
+	// load the skins
+	skinsize = pmodel->skinheight * pmodel->skinwidth;
+
+	if (numskins < 1)
+		Host_Error("Mod_LoadAliasModel: Invalid # of skins: %d\n", numskins);
+
+	pskintype = (daliasskintype_t *)&pinmodel[1];
+
+	pheader->skindesc = Hunk_From(pheader);
+	pskindesc = Hunk_Alloc(numskins * sizeof *pskindesc);
+
+	for (i=0 ; i<numskins ; i++)
+	{
+		aliasskintype_t	skintype;
+
+		skintype = LittleLong (pskintype->type);
+		pskindesc[i].type = skintype;
+
+		if (skintype == ALIAS_SKIN_SINGLE)
+		{
+			pskintype = (daliasskintype_t *)
+					Mod_LoadAliasSkin (pskintype + 1,
+									   &pskindesc[i].skin,
+									   skinsize, pheader);
+		}
+		else
+		{
+			pskintype = (daliasskintype_t *)
+					Mod_LoadAliasSkinGroup (pskintype + 1,
+											&pskindesc[i].skin,
+											skinsize, pheader);
+		}
+	}
+
+	// set base s and t vertices
+	pstverts = (stvert_t *)&pmodel[1];
+	pinstverts = (stvert_t *)pskintype;
+
+	pheader->stverts = (byte *)pstverts - (byte *)pheader;
+
+	for (i=0 ; i<pmodel->numverts ; i++)
+	{
+		pstverts[i].onseam = LittleLong (pinstverts[i].onseam);
+	// put s and t in 16.16 format
+		pstverts[i].s = LittleLong (pinstverts[i].s) << 16;
+		pstverts[i].t = LittleLong (pinstverts[i].t) << 16;
+	}
+
+	// set up the triangles
+	ptri = (mtriangle_t *)&pstverts[pmodel->numverts];
+	pintriangles = (dtriangle_t *)&pinstverts[pmodel->numverts];
+
+	pheader->triangles = (byte *)ptri - (byte *)pheader;
+
+	for (i=0 ; i<pmodel->numtris ; i++)
+	{
+		int		j;
+
+		ptri[i].facesfront = LittleLong (pintriangles[i].facesfront);
+
+		for (j=0 ; j<3 ; j++)
+		{
+			ptri[i].vertindex[j] =
+					LittleLong (pintriangles[i].vertindex[j]);
+		}
+	}
+
+	// load the frames
+	if (numframes < 1)
+		Host_Error("Mod_LoadAliasModel: Invalid # of frames: %d\n", numframes);
+
+	pframetype = (daliasframetype_t *)&pintriangles[pmodel->numtris];
+
+	for (i=0 ; i<numframes ; i++)
+	{
+		aliasframetype_t	frametype;
+
+		frametype = LittleLong (pframetype->type);
+		pheader->frames[i].type = frametype;
+
+		if (frametype == ALIAS_SINGLE)
+		{
+			pframetype = (daliasframetype_t *)
+					Mod_LoadAliasFrame (pframetype + 1,
+										&pheader->frames[i].frame,
+										pmodel->numverts,
+										&pheader->frames[i].bboxmin,
+										&pheader->frames[i].bboxmax,
+										pheader, pheader->frames[i].name);
+		}
+		else
+		{
+			pframetype = (daliasframetype_t *)
+					Mod_LoadAliasGroup (pframetype + 1,
+										&pheader->frames[i].frame,
+										pmodel->numverts,
+										&pheader->frames[i].bboxmin,
+										&pheader->frames[i].bboxmax,
+										pheader, pheader->frames[i].name);
+		}
+	}
+
+	mod->type = mod_alias;
+
+	// FIXME: do this right
+	mod->mins[0] = mod->mins[1] = mod->mins[2] = -16;
+	mod->maxs[0] = mod->maxs[1] = mod->maxs[2] = 16;
+
+	// move the complete, relocatable alias model to the cache
+
+	Hunk_CacheFrom(&mod->cache, pheader);
+}
--- a/modelgen.h
+++ b/modelgen.h
@@ -2,6 +2,10 @@
 
 #define ALIAS_VERSION	6
 
+#ifdef __plan9__
+#pragma pack on
+#endif
+
 typedef enum {
 	ALIAS_SINGLE,
 	ALIAS_GROUP,
@@ -87,3 +91,7 @@
 
 #define IDPOLYHEADER	(('O'<<24)+('P'<<16)+('D'<<8)+'I')
 // little-endian "IDPO"
+
+#ifdef __plan9__
+#pragma pack off
+#endif