mirror of
https://git.code.sf.net/p/quake/newtree
synced 2025-04-28 09:10:47 +00:00
model loading reorg ala nuq. once again, gl hasn't been tested (will test when
I get home tonight). This is in preparation for bmodel fulbrights.
This commit is contained in:
parent
64ec067a25
commit
b55b0264b5
17 changed files with 1566 additions and 2800 deletions
|
@ -318,21 +318,12 @@ typedef struct mtriangle_s {
|
||||||
|
|
||||||
#define MAX_SKINS 32
|
#define MAX_SKINS 32
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int ident;
|
int model;
|
||||||
int version;
|
int stverts;
|
||||||
vec3_t scale;
|
int skindesc;
|
||||||
vec3_t scale_origin;
|
int triangles;
|
||||||
float boundingradius;
|
|
||||||
vec3_t eyeposition;
|
mdl_t mdl;
|
||||||
int numskins;
|
|
||||||
int skinwidth;
|
|
||||||
int skinheight;
|
|
||||||
int numverts;
|
|
||||||
int numtris;
|
|
||||||
int numframes;
|
|
||||||
synctype_t synctype;
|
|
||||||
int flags;
|
|
||||||
float size;
|
|
||||||
|
|
||||||
int numposes;
|
int numposes;
|
||||||
int poseverts;
|
int poseverts;
|
||||||
|
@ -340,10 +331,6 @@ typedef struct {
|
||||||
int commands; // gl command list with embedded s/t
|
int commands; // gl command list with embedded s/t
|
||||||
int gl_texturenum[MAX_SKINS][4];
|
int gl_texturenum[MAX_SKINS][4];
|
||||||
int gl_fb_texturenum[MAX_SKINS][4];
|
int gl_fb_texturenum[MAX_SKINS][4];
|
||||||
int model;
|
|
||||||
int stverts;
|
|
||||||
int skindesc;
|
|
||||||
int triangles;
|
|
||||||
int texels[MAX_SKINS]; // only for player skins
|
int texels[MAX_SKINS]; // only for player skins
|
||||||
maliasframedesc_t frames[1];
|
maliasframedesc_t frames[1];
|
||||||
} aliashdr_t;
|
} aliashdr_t;
|
||||||
|
@ -464,5 +451,8 @@ void Mod_TouchModel (char *name);
|
||||||
|
|
||||||
mleaf_t *Mod_PointInLeaf (float *p, model_t *model);
|
mleaf_t *Mod_PointInLeaf (float *p, model_t *model);
|
||||||
byte *Mod_LeafPVS (mleaf_t *leaf, model_t *model);
|
byte *Mod_LeafPVS (mleaf_t *leaf, model_t *model);
|
||||||
|
model_t *Mod_FindName (char *name);
|
||||||
|
void Mod_LoadMMNearest(miptex_t *mt, texture_t *tx);
|
||||||
|
void Mod_LoadLighting (lump_t *l);
|
||||||
|
|
||||||
#endif // _MODEL_H
|
#endif // _MODEL_H
|
||||||
|
|
|
@ -46,7 +46,7 @@ endif
|
||||||
common_SOURCES= net_chan.c net_com.c net_udp.c pmove.c pmovetst.c zone.c \
|
common_SOURCES= net_chan.c net_com.c net_udp.c pmove.c pmovetst.c zone.c \
|
||||||
mdfour.c mathlib.c cvar.c crc.c cmd.c \
|
mdfour.c mathlib.c cvar.c crc.c cmd.c \
|
||||||
qargs.c qendian.c quakefs.c quakeio.c msg.c sizebuf.c info.c \
|
qargs.c qendian.c quakefs.c quakeio.c msg.c sizebuf.c info.c \
|
||||||
checksum.c link.c buildnum.c va.c com.c $(math_ASM)
|
checksum.c link.c buildnum.c va.c com.c model.c model_brush.c $(math_ASM)
|
||||||
|
|
||||||
#
|
#
|
||||||
# Server builds
|
# Server builds
|
||||||
|
@ -66,7 +66,7 @@ endif
|
||||||
|
|
||||||
server_SOURCES= pr_cmds.c pr_edict.c pr_exec.c pr_offs.c sv_init.c sv_main.c \
|
server_SOURCES= pr_cmds.c pr_edict.c pr_exec.c pr_offs.c sv_init.c sv_main.c \
|
||||||
sv_misc.c sv_model.c sv_nchan.c sv_ents.c sv_send.c sv_move.c \
|
sv_misc.c sv_model.c sv_nchan.c sv_ents.c sv_send.c sv_move.c \
|
||||||
sv_phys.c sv_user.c sv_ccmds.c world.c sv_cvar.c model.c \
|
sv_phys.c sv_user.c sv_ccmds.c world.c sv_cvar.c \
|
||||||
$(world_ASM)
|
$(world_ASM)
|
||||||
|
|
||||||
qf_server_SOURCES= $(common_SOURCES) $(server_SOURCES)
|
qf_server_SOURCES= $(common_SOURCES) $(server_SOURCES)
|
||||||
|
@ -134,7 +134,7 @@ endif
|
||||||
|
|
||||||
client_SOURCES= cl_cmd.c cl_cvar.c cl_demo.c cl_ents.c cl_input.c cl_main.c \
|
client_SOURCES= cl_cmd.c cl_cvar.c cl_demo.c cl_ents.c cl_input.c cl_main.c \
|
||||||
cl_misc.c cl_parse.c cl_pred.c cl_tent.c cl_cam.c teamplay.c \
|
cl_misc.c cl_parse.c cl_pred.c cl_tent.c cl_cam.c teamplay.c \
|
||||||
r_view.c wad.c \
|
r_view.c wad.c model_alias.c model_sprite.c \
|
||||||
console.c keys.c menu.c nonintel.c skin.c sbar.c \
|
console.c keys.c menu.c nonintel.c skin.c sbar.c \
|
||||||
cl_slist.c $(client_ASM)
|
cl_slist.c $(client_ASM)
|
||||||
|
|
||||||
|
@ -149,12 +149,13 @@ soft_ASM= d_draw.S d_draw16.S d_parta.S d_polysa.S d_scana.S d_spr8.S \
|
||||||
surf16.S surf8.S
|
surf16.S surf8.S
|
||||||
endif
|
endif
|
||||||
|
|
||||||
soft_SOURCES= cl_model.c cl_trans.c d_edge.c d_fill.c d_init.c d_modech.c \
|
soft_SOURCES= cl_trans.c d_edge.c d_fill.c d_init.c d_modech.c \
|
||||||
d_part.c d_polyse.c d_scan.c d_sky.c d_sprite.c d_surf.c \
|
d_part.c d_polyse.c d_scan.c d_sky.c d_sprite.c d_surf.c \
|
||||||
d_vars.c d_zpoint.c draw.c r_aclip.c r_alias.c r_bsp.c \
|
d_vars.c d_zpoint.c draw.c r_aclip.c r_alias.c r_bsp.c \
|
||||||
r_draw.c r_edge.c r_efrag.c r_light.c r_main.c r_misc.c \
|
r_draw.c r_edge.c r_efrag.c r_light.c r_main.c r_misc.c \
|
||||||
r_part.c r_sky.c r_sprite.c r_surf.c r_vars.c sw_view.c \
|
r_part.c r_sky.c r_sprite.c r_surf.c r_vars.c sw_view.c \
|
||||||
screen.c model.c $(soft_ASM)
|
screen.c $(soft_ASM) sw_model_alias.c sw_model_brush.c \
|
||||||
|
sw_model_sprite.c
|
||||||
|
|
||||||
#
|
#
|
||||||
# ... GGI
|
# ... GGI
|
||||||
|
@ -207,9 +208,10 @@ qf_client_x11_DEPENDENCIES=libqfsys_cl.a libqfsnd.a libqfcd.a
|
||||||
#
|
#
|
||||||
# ... Common stuff
|
# ... Common stuff
|
||||||
#
|
#
|
||||||
ogl_SOURCES= gl_draw.c gl_mesh.c gl_model.c gl_ngraph.c gl_part.c \
|
ogl_SOURCES= gl_draw.c gl_mesh.c gl_ngraph.c gl_part.c \
|
||||||
gl_refrag.c gl_rlight.c gl_rmain.c gl_rmisc.c gl_rsurf.c \
|
gl_refrag.c gl_rlight.c gl_rmain.c gl_rmisc.c gl_rsurf.c \
|
||||||
gl_screen.c gl_trans.c gl_view.c gl_warp.c
|
gl_screen.c gl_trans.c gl_view.c gl_warp.c gl_model_alias.c \
|
||||||
|
gl_model_brush.c gl_model_fullbright.c gl_model_sprite.c
|
||||||
|
|
||||||
#
|
#
|
||||||
# ... 3Dfx Voodoo 1 and 2 SVGAlib-based console GL
|
# ... 3Dfx Voodoo 1 and 2 SVGAlib-based console GL
|
||||||
|
|
|
@ -1,779 +0,0 @@
|
||||||
/*
|
|
||||||
cl_model.c
|
|
||||||
|
|
||||||
model loading and caching
|
|
||||||
|
|
||||||
Copyright (C) 1996-1997 Id Software, Inc.
|
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU General Public License
|
|
||||||
as published by the Free Software Foundation; either version 2
|
|
||||||
of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
See the GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program; if not, write to:
|
|
||||||
|
|
||||||
Free Software Foundation, Inc.
|
|
||||||
59 Temple Place - Suite 330
|
|
||||||
Boston, MA 02111-1307, USA
|
|
||||||
|
|
||||||
$Id$
|
|
||||||
*/
|
|
||||||
|
|
||||||
// models are the only shared resource between a client and server running
|
|
||||||
// on the same machine.
|
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
|
||||||
# include <config.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_STRING_H
|
|
||||||
#include <string.h>
|
|
||||||
#endif
|
|
||||||
#include "model.h"
|
|
||||||
#include "crc.h"
|
|
||||||
#include "msg.h"
|
|
||||||
#include "console.h"
|
|
||||||
#include "qendian.h"
|
|
||||||
#include "r_local.h"
|
|
||||||
|
|
||||||
void SV_Error (char *error, ...);
|
|
||||||
|
|
||||||
extern char loadname[]; // for hunk tags
|
|
||||||
extern model_t *loadmodel;
|
|
||||||
extern model_t mod_known[];
|
|
||||||
extern int mod_numknown;
|
|
||||||
|
|
||||||
void Mod_LoadSpriteModel (model_t *mod, void *buffer);
|
|
||||||
void Mod_LoadBrushModel (model_t *mod, void *buffer);
|
|
||||||
void Mod_LoadAliasModel (model_t *mod, void *buffer);
|
|
||||||
model_t *Mod_LoadModel (model_t *mod, qboolean crash);
|
|
||||||
model_t *Mod_FindName (char *name);
|
|
||||||
|
|
||||||
/*
|
|
||||||
===============
|
|
||||||
Mod_Init
|
|
||||||
|
|
||||||
Caches the data if needed
|
|
||||||
===============
|
|
||||||
*/
|
|
||||||
void *Mod_Extradata (model_t *mod)
|
|
||||||
{
|
|
||||||
void *r;
|
|
||||||
|
|
||||||
r = Cache_Check (&mod->cache);
|
|
||||||
if (r)
|
|
||||||
return r;
|
|
||||||
|
|
||||||
Mod_LoadModel (mod, true);
|
|
||||||
|
|
||||||
if (!mod->cache.data)
|
|
||||||
SV_Error ("Mod_Extradata: caching failed");
|
|
||||||
return mod->cache.data;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
==================
|
|
||||||
Mod_TouchModel
|
|
||||||
|
|
||||||
==================
|
|
||||||
*/
|
|
||||||
void Mod_TouchModel (char *name)
|
|
||||||
{
|
|
||||||
model_t *mod;
|
|
||||||
|
|
||||||
mod = Mod_FindName (name);
|
|
||||||
|
|
||||||
if (!mod->needload)
|
|
||||||
{
|
|
||||||
if (mod->type == mod_alias)
|
|
||||||
Cache_Check (&mod->cache);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Mod_LoadMMNearest(miptex_t *mx, texture_t *tx)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
GL_SubdivideSurface (msurface_t *fa)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
==============================================================================
|
|
||||||
|
|
||||||
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);
|
|
||||||
pframe = Hunk_AllocName (numv * sizeof(*pframe), loadname);
|
|
||||||
|
|
||||||
*pframeindex = (byte *)pframe - (byte *)pheader;
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
paliasgroup = Hunk_AllocName (sizeof (maliasgroup_t) +
|
|
||||||
(numframes - 1) * sizeof (paliasgroup->frames[0]), loadname);
|
|
||||||
|
|
||||||
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];
|
|
||||||
}
|
|
||||||
|
|
||||||
*pframeindex = (byte *)paliasgroup - (byte *)pheader;
|
|
||||||
|
|
||||||
pin_intervals = (daliasinterval_t *)(pingroup + 1);
|
|
||||||
|
|
||||||
poutintervals = Hunk_AllocName (numframes * sizeof (float), loadname);
|
|
||||||
|
|
||||||
paliasgroup->intervals = (byte *)poutintervals - (byte *)pheader;
|
|
||||||
|
|
||||||
for (i=0 ; i<numframes ; i++)
|
|
||||||
{
|
|
||||||
*poutintervals = LittleFloat (pin_intervals->interval);
|
|
||||||
if (*poutintervals <= 0.0)
|
|
||||||
SV_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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
Mod_LoadAliasSkin
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void * Mod_LoadAliasSkin (void * pin, int *pskinindex, int skinsize,
|
|
||||||
aliashdr_t *pheader)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
byte *pskin, *pinskin;
|
|
||||||
unsigned short *pusskin;
|
|
||||||
|
|
||||||
pskin = Hunk_AllocName (skinsize * r_pixbytes, loadname);
|
|
||||||
pinskin = (byte *)pin;
|
|
||||||
*pskinindex = (byte *)pskin - (byte *)pheader;
|
|
||||||
|
|
||||||
if (r_pixbytes == 1)
|
|
||||||
{
|
|
||||||
memcpy (pskin, pinskin, skinsize);
|
|
||||||
}
|
|
||||||
else if (r_pixbytes == 2)
|
|
||||||
{
|
|
||||||
pusskin = (unsigned short *)pskin;
|
|
||||||
|
|
||||||
for (i=0 ; i<skinsize ; i++)
|
|
||||||
pusskin[i] = d_8to16table[pinskin[i]];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SV_Error ("Mod_LoadAliasSkin: driver set invalid r_pixbytes: %d\n",
|
|
||||||
r_pixbytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
paliasskingroup = Hunk_AllocName (sizeof (maliasskingroup_t) +
|
|
||||||
(numskins - 1) * sizeof (paliasskingroup->skindescs[0]),
|
|
||||||
loadname);
|
|
||||||
|
|
||||||
paliasskingroup->numskins = numskins;
|
|
||||||
|
|
||||||
*pskinindex = (byte *)paliasskingroup - (byte *)pheader;
|
|
||||||
|
|
||||||
pinskinintervals = (daliasskininterval_t *)(pinskingroup + 1);
|
|
||||||
|
|
||||||
poutskinintervals = Hunk_AllocName (numskins * sizeof (float),loadname);
|
|
||||||
|
|
||||||
paliasskingroup->intervals = (byte *)poutskinintervals - (byte *)pheader;
|
|
||||||
|
|
||||||
for (i=0 ; i<numskins ; i++)
|
|
||||||
{
|
|
||||||
*poutskinintervals = LittleFloat (pinskinintervals->interval);
|
|
||||||
if (*poutskinintervals <= 0)
|
|
||||||
SV_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;
|
|
||||||
int start, end, total;
|
|
||||||
|
|
||||||
if (!strcmp(loadmodel->name, "progs/player.mdl") ||
|
|
||||||
!strcmp(loadmodel->name, "progs/eyes.mdl")) {
|
|
||||||
unsigned short crc;
|
|
||||||
byte *p;
|
|
||||||
int len;
|
|
||||||
char st[40];
|
|
||||||
|
|
||||||
CRC_Init(&crc);
|
|
||||||
for (len = com_filesize, p = buffer; len; len--, p++)
|
|
||||||
CRC_ProcessByte(&crc, *p);
|
|
||||||
|
|
||||||
sprintf(st, "%d", (int) crc);
|
|
||||||
Info_SetValueForKey (cls.userinfo,
|
|
||||||
!strcmp(loadmodel->name, "progs/player.mdl") ? pmodel_name : emodel_name,
|
|
||||||
st, MAX_INFO_STRING);
|
|
||||||
|
|
||||||
if (cls.state >= ca_connected) {
|
|
||||||
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
|
|
||||||
sprintf(st, "setinfo %s %d",
|
|
||||||
!strcmp(loadmodel->name, "progs/player.mdl") ? pmodel_name : emodel_name,
|
|
||||||
(int)crc);
|
|
||||||
SZ_Print (&cls.netchan.message, st);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
start = Hunk_LowMark ();
|
|
||||||
|
|
||||||
pinmodel = (mdl_t *)buffer;
|
|
||||||
|
|
||||||
version = LittleLong (pinmodel->version);
|
|
||||||
if (version != ALIAS_VERSION)
|
|
||||||
SV_Error ("%s has wrong version number (%i should be %i)",
|
|
||||||
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_AllocName (size, loadname);
|
|
||||||
pmodel = (mdl_t *) ((byte *)&pheader[1] +
|
|
||||||
(LittleLong (pinmodel->numframes) - 1) *
|
|
||||||
sizeof (pheader->frames[0]));
|
|
||||||
|
|
||||||
// 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)
|
|
||||||
SV_Error ("model %s has a skin taller than %d", mod->name,
|
|
||||||
MAX_LBM_HEIGHT);
|
|
||||||
|
|
||||||
pmodel->numverts = LittleLong (pinmodel->numverts);
|
|
||||||
|
|
||||||
if (pmodel->numverts <= 0)
|
|
||||||
SV_Error ("model %s has no vertices", mod->name);
|
|
||||||
|
|
||||||
if (pmodel->numverts > MAXALIASVERTS)
|
|
||||||
SV_Error ("model %s has too many vertices", mod->name);
|
|
||||||
|
|
||||||
pmodel->numtris = LittleLong (pinmodel->numtris);
|
|
||||||
|
|
||||||
if (pmodel->numtris <= 0)
|
|
||||||
SV_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)
|
|
||||||
SV_Error ("Mod_LoadAliasModel: skinwidth not multiple of 4");
|
|
||||||
|
|
||||||
pheader->model = (byte *)pmodel - (byte *)pheader;
|
|
||||||
|
|
||||||
//
|
|
||||||
// load the skins
|
|
||||||
//
|
|
||||||
skinsize = pmodel->skinheight * pmodel->skinwidth;
|
|
||||||
|
|
||||||
if (numskins < 1)
|
|
||||||
SV_Error ("Mod_LoadAliasModel: Invalid # of skins: %d\n", numskins);
|
|
||||||
|
|
||||||
pskintype = (daliasskintype_t *)&pinmodel[1];
|
|
||||||
|
|
||||||
pskindesc = Hunk_AllocName (numskins * sizeof (maliasskindesc_t),
|
|
||||||
loadname);
|
|
||||||
|
|
||||||
pheader->skindesc = (byte *)pskindesc - (byte *)pheader;
|
|
||||||
|
|
||||||
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)
|
|
||||||
SV_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
|
|
||||||
//
|
|
||||||
end = Hunk_LowMark ();
|
|
||||||
total = end - start;
|
|
||||||
|
|
||||||
Cache_Alloc (&mod->cache, total, loadname);
|
|
||||||
if (!mod->cache.data)
|
|
||||||
return;
|
|
||||||
memcpy (mod->cache.data, pheader, total);
|
|
||||||
|
|
||||||
Hunk_FreeToLowMark (start);
|
|
||||||
}
|
|
||||||
|
|
||||||
//=============================================================================
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
Mod_LoadSpriteFrame
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void * Mod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe)
|
|
||||||
{
|
|
||||||
dspriteframe_t *pinframe;
|
|
||||||
mspriteframe_t *pspriteframe;
|
|
||||||
int i, width, height, size, origin[2];
|
|
||||||
unsigned short *ppixout;
|
|
||||||
byte *ppixin;
|
|
||||||
|
|
||||||
pinframe = (dspriteframe_t *)pin;
|
|
||||||
|
|
||||||
width = LittleLong (pinframe->width);
|
|
||||||
height = LittleLong (pinframe->height);
|
|
||||||
size = width * height;
|
|
||||||
|
|
||||||
pspriteframe = Hunk_AllocName (sizeof (mspriteframe_t) + size*r_pixbytes,
|
|
||||||
loadname);
|
|
||||||
|
|
||||||
memset (pspriteframe, 0, sizeof (mspriteframe_t) + size);
|
|
||||||
*ppframe = pspriteframe;
|
|
||||||
|
|
||||||
pspriteframe->width = width;
|
|
||||||
pspriteframe->height = height;
|
|
||||||
origin[0] = LittleLong (pinframe->origin[0]);
|
|
||||||
origin[1] = LittleLong (pinframe->origin[1]);
|
|
||||||
|
|
||||||
pspriteframe->up = origin[1];
|
|
||||||
pspriteframe->down = origin[1] - height;
|
|
||||||
pspriteframe->left = origin[0];
|
|
||||||
pspriteframe->right = width + origin[0];
|
|
||||||
|
|
||||||
if (r_pixbytes == 1)
|
|
||||||
{
|
|
||||||
memcpy (&pspriteframe->pixels[0], (byte *)(pinframe + 1), size);
|
|
||||||
}
|
|
||||||
else if (r_pixbytes == 2)
|
|
||||||
{
|
|
||||||
ppixin = (byte *)(pinframe + 1);
|
|
||||||
ppixout = (unsigned short *)&pspriteframe->pixels[0];
|
|
||||||
|
|
||||||
for (i=0 ; i<size ; i++)
|
|
||||||
ppixout[i] = d_8to16table[ppixin[i]];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SV_Error ("Mod_LoadSpriteFrame: driver set invalid r_pixbytes: %d\n",
|
|
||||||
r_pixbytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (void *)((byte *)pinframe + sizeof (dspriteframe_t) + size);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
Mod_LoadSpriteGroup
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void * Mod_LoadSpriteGroup (void * pin, mspriteframe_t **ppframe)
|
|
||||||
{
|
|
||||||
dspritegroup_t *pingroup;
|
|
||||||
mspritegroup_t *pspritegroup;
|
|
||||||
int i, numframes;
|
|
||||||
dspriteinterval_t *pin_intervals;
|
|
||||||
float *poutintervals;
|
|
||||||
void *ptemp;
|
|
||||||
|
|
||||||
pingroup = (dspritegroup_t *)pin;
|
|
||||||
|
|
||||||
numframes = LittleLong (pingroup->numframes);
|
|
||||||
|
|
||||||
pspritegroup = Hunk_AllocName (sizeof (mspritegroup_t) +
|
|
||||||
(numframes - 1) * sizeof (pspritegroup->frames[0]), loadname);
|
|
||||||
|
|
||||||
pspritegroup->numframes = numframes;
|
|
||||||
|
|
||||||
*ppframe = (mspriteframe_t *)pspritegroup;
|
|
||||||
|
|
||||||
pin_intervals = (dspriteinterval_t *)(pingroup + 1);
|
|
||||||
|
|
||||||
poutintervals = Hunk_AllocName (numframes * sizeof (float), loadname);
|
|
||||||
|
|
||||||
pspritegroup->intervals = poutintervals;
|
|
||||||
|
|
||||||
for (i=0 ; i<numframes ; i++)
|
|
||||||
{
|
|
||||||
*poutintervals = LittleFloat (pin_intervals->interval);
|
|
||||||
if (*poutintervals <= 0.0)
|
|
||||||
SV_Error ("Mod_LoadSpriteGroup: interval<=0");
|
|
||||||
|
|
||||||
poutintervals++;
|
|
||||||
pin_intervals++;
|
|
||||||
}
|
|
||||||
|
|
||||||
ptemp = (void *)pin_intervals;
|
|
||||||
|
|
||||||
for (i=0 ; i<numframes ; i++)
|
|
||||||
{
|
|
||||||
ptemp = Mod_LoadSpriteFrame (ptemp, &pspritegroup->frames[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ptemp;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
=================
|
|
||||||
Mod_LoadSpriteModel
|
|
||||||
=================
|
|
||||||
*/
|
|
||||||
void Mod_LoadSpriteModel (model_t *mod, void *buffer)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int version;
|
|
||||||
dsprite_t *pin;
|
|
||||||
msprite_t *psprite;
|
|
||||||
int numframes;
|
|
||||||
int size;
|
|
||||||
dspriteframetype_t *pframetype;
|
|
||||||
|
|
||||||
pin = (dsprite_t *)buffer;
|
|
||||||
|
|
||||||
version = LittleLong (pin->version);
|
|
||||||
if (version != SPRITE_VERSION)
|
|
||||||
SV_Error ("%s has wrong version number "
|
|
||||||
"(%i should be %i)", mod->name, version, SPRITE_VERSION);
|
|
||||||
|
|
||||||
numframes = LittleLong (pin->numframes);
|
|
||||||
|
|
||||||
size = sizeof (msprite_t) + (numframes - 1) * sizeof (psprite->frames);
|
|
||||||
|
|
||||||
psprite = Hunk_AllocName (size, loadname);
|
|
||||||
|
|
||||||
mod->cache.data = psprite;
|
|
||||||
|
|
||||||
psprite->type = LittleLong (pin->type);
|
|
||||||
psprite->maxwidth = LittleLong (pin->width);
|
|
||||||
psprite->maxheight = LittleLong (pin->height);
|
|
||||||
psprite->beamlength = LittleFloat (pin->beamlength);
|
|
||||||
mod->synctype = LittleLong (pin->synctype);
|
|
||||||
psprite->numframes = numframes;
|
|
||||||
|
|
||||||
mod->mins[0] = mod->mins[1] = -psprite->maxwidth/2;
|
|
||||||
mod->maxs[0] = mod->maxs[1] = psprite->maxwidth/2;
|
|
||||||
mod->mins[2] = -psprite->maxheight/2;
|
|
||||||
mod->maxs[2] = psprite->maxheight/2;
|
|
||||||
|
|
||||||
//
|
|
||||||
// load the frames
|
|
||||||
//
|
|
||||||
if (numframes < 1)
|
|
||||||
SV_Error ("Mod_LoadSpriteModel: Invalid # of frames: %d\n", numframes);
|
|
||||||
|
|
||||||
mod->numframes = numframes;
|
|
||||||
|
|
||||||
pframetype = (dspriteframetype_t *)(pin + 1);
|
|
||||||
|
|
||||||
for (i=0 ; i<numframes ; i++)
|
|
||||||
{
|
|
||||||
spriteframetype_t frametype;
|
|
||||||
|
|
||||||
frametype = LittleLong (pframetype->type);
|
|
||||||
psprite->frames[i].type = frametype;
|
|
||||||
|
|
||||||
if (frametype == SPR_SINGLE)
|
|
||||||
{
|
|
||||||
pframetype = (dspriteframetype_t *)
|
|
||||||
Mod_LoadSpriteFrame (pframetype + 1,
|
|
||||||
&psprite->frames[i].frameptr);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pframetype = (dspriteframetype_t *)
|
|
||||||
Mod_LoadSpriteGroup (pframetype + 1,
|
|
||||||
&psprite->frames[i].frameptr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mod->type = mod_sprite;
|
|
||||||
}
|
|
||||||
|
|
||||||
//=============================================================================
|
|
||||||
|
|
||||||
/*
|
|
||||||
================
|
|
||||||
Mod_Print
|
|
||||||
================
|
|
||||||
*/
|
|
||||||
void Mod_Print (void)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
model_t *mod;
|
|
||||||
|
|
||||||
Con_Printf ("Cached models:\n");
|
|
||||||
for (i=0, mod=mod_known ; i < mod_numknown ; i++, mod++)
|
|
||||||
{
|
|
||||||
Con_Printf ("%8p : %s\n",mod->cache.data, mod->name);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -110,7 +110,7 @@ int StripLength (int starttri, int startv)
|
||||||
|
|
||||||
// look for a matching triangle
|
// look for a matching triangle
|
||||||
nexttri:
|
nexttri:
|
||||||
for (j=starttri+1, check=&triangles[starttri+1] ; j<pheader->numtris ; j++, check++)
|
for (j=starttri+1, check=&triangles[starttri+1] ; j<pheader->mdl.numtris ; j++, check++)
|
||||||
{
|
{
|
||||||
if (check->facesfront != last->facesfront)
|
if (check->facesfront != last->facesfront)
|
||||||
continue;
|
continue;
|
||||||
|
@ -144,7 +144,7 @@ nexttri:
|
||||||
done:
|
done:
|
||||||
|
|
||||||
// clear the temp used flags
|
// clear the temp used flags
|
||||||
for (j=starttri+1 ; j<pheader->numtris ; j++)
|
for (j=starttri+1 ; j<pheader->mdl.numtris ; j++)
|
||||||
if (used[j] == 2)
|
if (used[j] == 2)
|
||||||
used[j] = 0;
|
used[j] = 0;
|
||||||
|
|
||||||
|
@ -180,7 +180,7 @@ int FanLength (int starttri, int startv)
|
||||||
|
|
||||||
// look for a matching triangle
|
// look for a matching triangle
|
||||||
nexttri:
|
nexttri:
|
||||||
for (j=starttri+1, check=&triangles[starttri+1] ; j<pheader->numtris ; j++, check++)
|
for (j=starttri+1, check=&triangles[starttri+1] ; j<pheader->mdl.numtris ; j++, check++)
|
||||||
{
|
{
|
||||||
if (check->facesfront != last->facesfront)
|
if (check->facesfront != last->facesfront)
|
||||||
continue;
|
continue;
|
||||||
|
@ -211,7 +211,7 @@ nexttri:
|
||||||
done:
|
done:
|
||||||
|
|
||||||
// clear the temp used flags
|
// clear the temp used flags
|
||||||
for (j=starttri+1 ; j<pheader->numtris ; j++)
|
for (j=starttri+1 ; j<pheader->mdl.numtris ; j++)
|
||||||
if (used[j] == 2)
|
if (used[j] == 2)
|
||||||
used[j] = 0;
|
used[j] = 0;
|
||||||
|
|
||||||
|
@ -243,7 +243,7 @@ void BuildTris (void)
|
||||||
numorder = 0;
|
numorder = 0;
|
||||||
numcommands = 0;
|
numcommands = 0;
|
||||||
memset (used, 0, sizeof(used));
|
memset (used, 0, sizeof(used));
|
||||||
for (i=0 ; i<pheader->numtris ; i++)
|
for (i=0 ; i<pheader->mdl.numtris ; i++)
|
||||||
{
|
{
|
||||||
// pick an unused triangle and start the trifan
|
// pick an unused triangle and start the trifan
|
||||||
if (used[i])
|
if (used[i])
|
||||||
|
@ -290,9 +290,9 @@ void BuildTris (void)
|
||||||
s = stverts[k].s;
|
s = stverts[k].s;
|
||||||
t = stverts[k].t;
|
t = stverts[k].t;
|
||||||
if (!triangles[besttris[0]].facesfront && stverts[k].onseam)
|
if (!triangles[besttris[0]].facesfront && stverts[k].onseam)
|
||||||
s += pheader->skinwidth / 2; // on back side
|
s += pheader->mdl.skinwidth / 2; // on back side
|
||||||
s = (s + 0.5) / pheader->skinwidth;
|
s = (s + 0.5) / pheader->mdl.skinwidth;
|
||||||
t = (t + 0.5) / pheader->skinheight;
|
t = (t + 0.5) / pheader->mdl.skinheight;
|
||||||
|
|
||||||
*(float *)&commands[numcommands++] = s;
|
*(float *)&commands[numcommands++] = s;
|
||||||
*(float *)&commands[numcommands++] = t;
|
*(float *)&commands[numcommands++] = t;
|
||||||
|
@ -301,10 +301,10 @@ void BuildTris (void)
|
||||||
|
|
||||||
commands[numcommands++] = 0; // end of list marker
|
commands[numcommands++] = 0; // end of list marker
|
||||||
|
|
||||||
Con_DPrintf ("%3i tri %3i vert %3i cmd\n", pheader->numtris, numorder, numcommands);
|
Con_DPrintf ("%3i tri %3i vert %3i cmd\n", pheader->mdl.numtris, numorder, numcommands);
|
||||||
|
|
||||||
allverts += numorder;
|
allverts += numorder;
|
||||||
alltris += pheader->numtris;
|
alltris += pheader->mdl.numtris;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
319
source/gl_model_alias.c
Normal file
319
source/gl_model_alias.c
Normal file
|
@ -0,0 +1,319 @@
|
||||||
|
/*
|
||||||
|
gl_model.c
|
||||||
|
|
||||||
|
model loading and caching
|
||||||
|
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to:
|
||||||
|
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
59 Temple Place - Suite 330
|
||||||
|
Boston, MA 02111-1307, USA
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
// models are the only shared resource between a client and server running
|
||||||
|
// on the same machine.
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "model.h"
|
||||||
|
#include "qendian.h"
|
||||||
|
#include "server.h"
|
||||||
|
#include "console.h"
|
||||||
|
#include "glquake.h"
|
||||||
|
|
||||||
|
extern model_t *loadmodel;
|
||||||
|
|
||||||
|
/*
|
||||||
|
==============================================================================
|
||||||
|
|
||||||
|
ALIAS MODELS
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
aliashdr_t *pheader;
|
||||||
|
|
||||||
|
stvert_t stverts[MAXALIASVERTS];
|
||||||
|
mtriangle_t triangles[MAXALIASTRIS];
|
||||||
|
|
||||||
|
// a pose is a single set of vertexes. a frame may be
|
||||||
|
// an animating sequence of poses
|
||||||
|
trivertx_t *poseverts[MAXALIASFRAMES];
|
||||||
|
int posenum;
|
||||||
|
|
||||||
|
byte player_8bit_texels[320*200];
|
||||||
|
|
||||||
|
//=========================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
Mod_FloodFillSkin
|
||||||
|
|
||||||
|
Fill background pixels so mipmapping doesn't have haloes - Ed
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
short x, y;
|
||||||
|
} floodfill_t;
|
||||||
|
|
||||||
|
extern unsigned d_8to24table[];
|
||||||
|
|
||||||
|
// must be a power of 2
|
||||||
|
#define FLOODFILL_FIFO_SIZE 0x1000
|
||||||
|
#define FLOODFILL_FIFO_MASK (FLOODFILL_FIFO_SIZE - 1)
|
||||||
|
|
||||||
|
#define FLOODFILL_STEP( off, dx, dy ) \
|
||||||
|
{ \
|
||||||
|
if (pos[off] == fillcolor) \
|
||||||
|
{ \
|
||||||
|
pos[off] = 255; \
|
||||||
|
fifo[inpt].x = x + (dx), fifo[inpt].y = y + (dy); \
|
||||||
|
inpt = (inpt + 1) & FLOODFILL_FIFO_MASK; \
|
||||||
|
} \
|
||||||
|
else if (pos[off] != 255) fdc = pos[off]; \
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mod_FloodFillSkin( byte *skin, int skinwidth, int skinheight )
|
||||||
|
{
|
||||||
|
byte fillcolor = *skin; // assume this is the pixel to fill
|
||||||
|
floodfill_t fifo[FLOODFILL_FIFO_SIZE];
|
||||||
|
int inpt = 0, outpt = 0;
|
||||||
|
int filledcolor = -1;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (filledcolor == -1)
|
||||||
|
{
|
||||||
|
filledcolor = 0;
|
||||||
|
// attempt to find opaque black
|
||||||
|
for (i = 0; i < 256; ++i)
|
||||||
|
if (d_8to24table[i] == (255 << 0)) // alpha 1.0
|
||||||
|
{
|
||||||
|
filledcolor = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// can't fill to filled color or to transparent color (used as visited marker)
|
||||||
|
if ((fillcolor == filledcolor) || (fillcolor == 255))
|
||||||
|
{
|
||||||
|
//printf( "not filling skin from %d to %d\n", fillcolor, filledcolor );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
fifo[inpt].x = 0, fifo[inpt].y = 0;
|
||||||
|
inpt = (inpt + 1) & FLOODFILL_FIFO_MASK;
|
||||||
|
|
||||||
|
while (outpt != inpt)
|
||||||
|
{
|
||||||
|
int x = fifo[outpt].x, y = fifo[outpt].y;
|
||||||
|
int fdc = filledcolor;
|
||||||
|
byte *pos = &skin[x + skinwidth * y];
|
||||||
|
|
||||||
|
outpt = (outpt + 1) & FLOODFILL_FIFO_MASK;
|
||||||
|
|
||||||
|
if (x > 0) FLOODFILL_STEP( -1, -1, 0 );
|
||||||
|
if (x < skinwidth - 1) FLOODFILL_STEP( 1, 1, 0 );
|
||||||
|
if (y > 0) FLOODFILL_STEP( -skinwidth, 0, -1 );
|
||||||
|
if (y < skinheight - 1) FLOODFILL_STEP( skinwidth, 0, 1 );
|
||||||
|
skin[x + skinwidth * y] = fdc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int Mod_Fullbright(byte *skin, int width, int height, char *name);
|
||||||
|
|
||||||
|
void *Mod_LoadSkin (byte *skin, int skinsize, int snum, int gnum, qboolean group)
|
||||||
|
{
|
||||||
|
char name[32];
|
||||||
|
int fbtexnum;
|
||||||
|
|
||||||
|
Mod_FloodFillSkin( skin, pheader->mdl.skinwidth, pheader->mdl.skinheight );
|
||||||
|
// save 8 bit texels for the player model to remap
|
||||||
|
if (!strcmp(loadmodel->name,"progs/player.mdl")) {
|
||||||
|
if (skinsize > sizeof(player_8bit_texels))
|
||||||
|
SV_Error ("Player skin too large");
|
||||||
|
memcpy (player_8bit_texels, skin, skinsize);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (group) {
|
||||||
|
snprintf(name, sizeof(name), "fb_%s_%i_%i", loadmodel->name,snum,gnum);
|
||||||
|
} else {
|
||||||
|
snprintf(name, sizeof(name), "fb_%s_%i", loadmodel->name,snum);
|
||||||
|
}
|
||||||
|
fbtexnum = Mod_Fullbright(skin+1, pheader->mdl.skinwidth, pheader->mdl.skinheight, name);
|
||||||
|
if ((loadmodel->hasfullbrights=(fbtexnum))) {
|
||||||
|
pheader->gl_fb_texturenum[snum][gnum] = fbtexnum;
|
||||||
|
}
|
||||||
|
if (group) {
|
||||||
|
snprintf(name, sizeof(name), "%s_%i_%i", loadmodel->name,snum,gnum);
|
||||||
|
} else {
|
||||||
|
snprintf(name, sizeof(name), "%s_%i", loadmodel->name,snum);
|
||||||
|
}
|
||||||
|
pheader->gl_texturenum[snum][gnum] =
|
||||||
|
GL_LoadTexture (name, pheader->mdl.skinwidth,
|
||||||
|
pheader->mdl.skinheight, skin, true, false, 1);
|
||||||
|
// alpha param was true for non group skins
|
||||||
|
return skin + skinsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
===============
|
||||||
|
Mod_LoadAllSkins
|
||||||
|
===============
|
||||||
|
*/
|
||||||
|
void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype, int *pskinindex)
|
||||||
|
{
|
||||||
|
int i, j, k;
|
||||||
|
int skinsize;
|
||||||
|
byte *skin;
|
||||||
|
daliasskingroup_t *pinskingroup;
|
||||||
|
int groupskins;
|
||||||
|
daliasskininterval_t *pinskinintervals;
|
||||||
|
|
||||||
|
skin = (byte *)pskintype;
|
||||||
|
|
||||||
|
if (numskins < 1 || numskins > MAX_SKINS)
|
||||||
|
SV_Error ("Mod_LoadAliasModel: Invalid # of skins: %d\n", numskins);
|
||||||
|
|
||||||
|
skinsize = pheader->mdl.skinwidth * pheader->mdl.skinheight;
|
||||||
|
|
||||||
|
for (i=0 ; i<numskins ; i++)
|
||||||
|
{
|
||||||
|
if (pskintype->type == ALIAS_SKIN_SINGLE) {
|
||||||
|
skin+=4;
|
||||||
|
skin = Mod_LoadSkin (skin, skinsize, i, 0, false);
|
||||||
|
|
||||||
|
for (j=1; j < 4; j++) {
|
||||||
|
pheader->gl_texturenum[i][j] =
|
||||||
|
pheader->gl_texturenum[i][j - 1];
|
||||||
|
pheader->gl_fb_texturenum[i][j] =
|
||||||
|
pheader->gl_fb_texturenum[i][j - 1];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// animating skin group. yuck.
|
||||||
|
Con_Printf("Animating Skin Group, if you get this message please notify warp@debian.org\n");
|
||||||
|
pskintype++;
|
||||||
|
pinskingroup = (daliasskingroup_t *)pskintype;
|
||||||
|
groupskins = LittleLong (pinskingroup->numskins);
|
||||||
|
pinskinintervals = (daliasskininterval_t *)(pinskingroup + 1);
|
||||||
|
|
||||||
|
pskintype = (void *)(pinskinintervals + groupskins);
|
||||||
|
skin = (byte *)pskintype;
|
||||||
|
|
||||||
|
for (j=0 ; j<groupskins ; j++)
|
||||||
|
{
|
||||||
|
skin+=4;
|
||||||
|
skin = Mod_LoadSkin (skin, skinsize, i, j, true);
|
||||||
|
}
|
||||||
|
k = j;
|
||||||
|
for (/* */; j < 4; j++) {
|
||||||
|
pheader->gl_texturenum[i][j] =
|
||||||
|
pheader->gl_texturenum[i][j - k];
|
||||||
|
pheader->gl_fb_texturenum[i][j] =
|
||||||
|
pheader->gl_fb_texturenum[i][j - k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (void *)skin;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
Mod_LoadAliasFrame
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void * Mod_LoadAliasFrame (void * pin, maliasframedesc_t *frame)
|
||||||
|
{
|
||||||
|
trivertx_t *pinframe;
|
||||||
|
int i;
|
||||||
|
daliasframe_t *pdaliasframe;
|
||||||
|
|
||||||
|
pdaliasframe = (daliasframe_t *)pin;
|
||||||
|
|
||||||
|
strcpy (frame->name, pdaliasframe->name);
|
||||||
|
frame->firstpose = posenum;
|
||||||
|
frame->numposes = 1;
|
||||||
|
|
||||||
|
for (i=0 ; i<3 ; i++)
|
||||||
|
{
|
||||||
|
// these are byte values, so we don't have to worry about
|
||||||
|
// endianness
|
||||||
|
frame->bboxmin.v[i] = pdaliasframe->bboxmin.v[i];
|
||||||
|
frame->bboxmin.v[i] = pdaliasframe->bboxmax.v[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
pinframe = (trivertx_t *)(pdaliasframe + 1);
|
||||||
|
|
||||||
|
poseverts[posenum] = pinframe;
|
||||||
|
posenum++;
|
||||||
|
|
||||||
|
pinframe += pheader->mdl.numverts;
|
||||||
|
|
||||||
|
return (void *)pinframe;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
Mod_LoadAliasGroup
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void *Mod_LoadAliasGroup (void * pin, maliasframedesc_t *frame)
|
||||||
|
{
|
||||||
|
daliasgroup_t *pingroup;
|
||||||
|
int i, numframes;
|
||||||
|
daliasinterval_t *pin_intervals;
|
||||||
|
void *ptemp;
|
||||||
|
|
||||||
|
pingroup = (daliasgroup_t *)pin;
|
||||||
|
|
||||||
|
numframes = LittleLong (pingroup->numframes);
|
||||||
|
|
||||||
|
frame->firstpose = posenum;
|
||||||
|
frame->numposes = numframes;
|
||||||
|
|
||||||
|
for (i=0 ; i<3 ; i++)
|
||||||
|
{
|
||||||
|
// these are byte values, so we don't have to worry about endianness
|
||||||
|
frame->bboxmin.v[i] = pingroup->bboxmin.v[i];
|
||||||
|
frame->bboxmin.v[i] = pingroup->bboxmax.v[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
pin_intervals = (daliasinterval_t *)(pingroup + 1);
|
||||||
|
|
||||||
|
frame->interval = LittleFloat (pin_intervals->interval);
|
||||||
|
|
||||||
|
pin_intervals += numframes;
|
||||||
|
|
||||||
|
ptemp = (void *)pin_intervals;
|
||||||
|
|
||||||
|
for (i=0 ; i<numframes ; i++)
|
||||||
|
{
|
||||||
|
poseverts[posenum] = (trivertx_t *)((daliasframe_t *)ptemp + 1);
|
||||||
|
posenum++;
|
||||||
|
|
||||||
|
ptemp = (trivertx_t *)((daliasframe_t *)ptemp + 1) + pheader->mdl.numverts;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ptemp;
|
||||||
|
}
|
93
source/gl_model_brush.c
Normal file
93
source/gl_model_brush.c
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
/*
|
||||||
|
gl_model_brush.c
|
||||||
|
|
||||||
|
model loading and caching
|
||||||
|
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to:
|
||||||
|
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
59 Temple Place - Suite 330
|
||||||
|
Boston, MA 02111-1307, USA
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
// models are the only shared resource between a client and server running
|
||||||
|
// on the same machine.
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "model.h"
|
||||||
|
#include "quakefs.h"
|
||||||
|
#include "glquake.h"
|
||||||
|
|
||||||
|
extern model_t *loadmodel;
|
||||||
|
extern char loadname[];
|
||||||
|
|
||||||
|
extern byte *mod_base;
|
||||||
|
|
||||||
|
const int mod_lightmap_bytes=3;
|
||||||
|
|
||||||
|
void
|
||||||
|
Mod_LoadMMNearest(miptex_t *mt, texture_t *tx)
|
||||||
|
{
|
||||||
|
texture_mode = GL_LINEAR_MIPMAP_NEAREST; //_LINEAR;
|
||||||
|
tx->gl_texturenum = GL_LoadTexture (mt->name, tx->width, tx->height, (byte *)(tx+1), true, false, 1);
|
||||||
|
texture_mode = GL_LINEAR;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
Mod_LoadLighting
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void Mod_LoadLighting (lump_t *l)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
byte *in, *out;
|
||||||
|
byte d;
|
||||||
|
char litfilename[1024];
|
||||||
|
|
||||||
|
if (!l->filelen)
|
||||||
|
{
|
||||||
|
loadmodel->lightdata = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
strcpy(litfilename, loadmodel->name);
|
||||||
|
COM_StripExtension(litfilename, litfilename);
|
||||||
|
strcat(litfilename, ".lit");
|
||||||
|
|
||||||
|
loadmodel->lightdata = (byte*) COM_LoadHunkFile (litfilename);
|
||||||
|
if (!loadmodel->lightdata) // expand the white lighting data
|
||||||
|
{
|
||||||
|
loadmodel->lightdata = Hunk_AllocName ( l->filelen*3, litfilename);
|
||||||
|
in = loadmodel->lightdata + l->filelen*2; // place the file at the end, so it will not be overwritten until the very last write
|
||||||
|
out = loadmodel->lightdata;
|
||||||
|
memcpy (in, mod_base + l->fileofs, l->filelen);
|
||||||
|
for (i = 0;i < l->filelen;i++)
|
||||||
|
{
|
||||||
|
d = *in++;
|
||||||
|
*out++ = d;
|
||||||
|
*out++ = d;
|
||||||
|
*out++ = d;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
79
source/gl_model_fullbright.c
Normal file
79
source/gl_model_fullbright.c
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
/*
|
||||||
|
gl_model_fullbright.c
|
||||||
|
|
||||||
|
model loading and caching
|
||||||
|
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to:
|
||||||
|
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
59 Temple Place - Suite 330
|
||||||
|
Boston, MA 02111-1307, USA
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
// models are the only shared resource between a client and server running
|
||||||
|
// on the same machine.
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "r_local.h"
|
||||||
|
#include "sys.h"
|
||||||
|
#include "console.h"
|
||||||
|
#include "qendian.h"
|
||||||
|
#include "checksum.h"
|
||||||
|
#include "glquake.h"
|
||||||
|
|
||||||
|
int Mod_Fullbright (byte *skin, int width, int height, char *name)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
int pixels;
|
||||||
|
qboolean hasfullbrights = false;
|
||||||
|
int texnum;
|
||||||
|
|
||||||
|
// Check for fullbright pixels..
|
||||||
|
pixels = width * height;
|
||||||
|
|
||||||
|
for (j=0 ; j<pixels ; j++) {
|
||||||
|
if (skin[j] >= 256-32) {
|
||||||
|
hasfullbrights = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasfullbrights) {
|
||||||
|
byte *ptexels;
|
||||||
|
|
||||||
|
//ptexels = Hunk_Alloc(s);
|
||||||
|
ptexels = malloc(pixels);
|
||||||
|
|
||||||
|
Con_DPrintf("FB Model ID: '%s'\n", name);
|
||||||
|
for (j=0 ; j<pixels ; j++) {
|
||||||
|
if (skin[j] >= 256-32) {
|
||||||
|
ptexels[j] = skin[j];
|
||||||
|
} else {
|
||||||
|
ptexels[j] = 255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
texnum = GL_LoadTexture (name, width, height, ptexels, true, true, 1);
|
||||||
|
free(ptexels);
|
||||||
|
return texnum;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
81
source/gl_model_sprite.c
Normal file
81
source/gl_model_sprite.c
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
gl_model.c
|
||||||
|
|
||||||
|
model loading and caching
|
||||||
|
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to:
|
||||||
|
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
59 Temple Place - Suite 330
|
||||||
|
Boston, MA 02111-1307, USA
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
// models are the only shared resource between a client and server running
|
||||||
|
// on the same machine.
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "model.h"
|
||||||
|
#include "qendian.h"
|
||||||
|
#include "glquake.h"
|
||||||
|
|
||||||
|
extern model_t *loadmodel;
|
||||||
|
extern char loadname[];
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
Mod_LoadSpriteFrame
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void * Mod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int framenum)
|
||||||
|
{
|
||||||
|
dspriteframe_t *pinframe;
|
||||||
|
mspriteframe_t *pspriteframe;
|
||||||
|
int width, height, size, origin[2];
|
||||||
|
char name[64];
|
||||||
|
|
||||||
|
pinframe = (dspriteframe_t *)pin;
|
||||||
|
|
||||||
|
width = LittleLong (pinframe->width);
|
||||||
|
height = LittleLong (pinframe->height);
|
||||||
|
size = width * height;
|
||||||
|
|
||||||
|
pspriteframe = Hunk_AllocName (sizeof (mspriteframe_t),loadname);
|
||||||
|
|
||||||
|
memset (pspriteframe, 0, sizeof (mspriteframe_t));
|
||||||
|
|
||||||
|
*ppframe = pspriteframe;
|
||||||
|
|
||||||
|
pspriteframe->width = width;
|
||||||
|
pspriteframe->height = height;
|
||||||
|
origin[0] = LittleLong (pinframe->origin[0]);
|
||||||
|
origin[1] = LittleLong (pinframe->origin[1]);
|
||||||
|
|
||||||
|
pspriteframe->up = origin[1];
|
||||||
|
pspriteframe->down = origin[1] - height;
|
||||||
|
pspriteframe->left = origin[0];
|
||||||
|
pspriteframe->right = width + origin[0];
|
||||||
|
|
||||||
|
snprintf (name, sizeof(name), "%s_%i", loadmodel->name, framenum);
|
||||||
|
pspriteframe->gl_texturenum = GL_LoadTexture (name, width, height, (byte *)(pinframe + 1), true, true, 1);
|
||||||
|
|
||||||
|
return (void *)((byte *)pinframe + sizeof (dspriteframe_t) + size);
|
||||||
|
}
|
|
@ -472,9 +472,9 @@ static void GL_DrawAliasShadow (aliashdr_t *paliashdr, int posenum)
|
||||||
order += 2;
|
order += 2;
|
||||||
|
|
||||||
// normals and vertexes come from the frame list
|
// normals and vertexes come from the frame list
|
||||||
point[0] = verts->v[0] * paliashdr->scale[0] + paliashdr->scale_origin[0];
|
point[0] = verts->v[0] * paliashdr->mdl.scale[0] + paliashdr->mdl.scale_origin[0];
|
||||||
point[1] = verts->v[1] * paliashdr->scale[1] + paliashdr->scale_origin[1];
|
point[1] = verts->v[1] * paliashdr->mdl.scale[1] + paliashdr->mdl.scale_origin[1];
|
||||||
point[2] = verts->v[2] * paliashdr->scale[2] + paliashdr->scale_origin[2];
|
point[2] = verts->v[2] * paliashdr->mdl.scale[2] + paliashdr->mdl.scale_origin[2];
|
||||||
|
|
||||||
point[0] -= shadevector[0]*(point[2]+lheight);
|
point[0] -= shadevector[0]*(point[2]+lheight);
|
||||||
point[1] -= shadevector[1]*(point[2]+lheight);
|
point[1] -= shadevector[1]*(point[2]+lheight);
|
||||||
|
@ -502,7 +502,7 @@ static void R_SetupAliasFrame (int frame, aliashdr_t *paliashdr, qboolean fb)
|
||||||
int pose, numposes;
|
int pose, numposes;
|
||||||
float interval;
|
float interval;
|
||||||
|
|
||||||
if ((frame >= paliashdr->numframes) || (frame < 0))
|
if ((frame >= paliashdr->mdl.numframes) || (frame < 0))
|
||||||
{
|
{
|
||||||
Con_DPrintf ("R_AliasSetupFrame: no such frame %d\n", frame);
|
Con_DPrintf ("R_AliasSetupFrame: no such frame %d\n", frame);
|
||||||
frame = 0;
|
frame = 0;
|
||||||
|
@ -621,7 +621,7 @@ static void R_DrawAliasModel (entity_t *e)
|
||||||
//
|
//
|
||||||
paliashdr = (aliashdr_t *)Mod_Extradata (currententity->model);
|
paliashdr = (aliashdr_t *)Mod_Extradata (currententity->model);
|
||||||
|
|
||||||
c_alias_polys += paliashdr->numtris;
|
c_alias_polys += paliashdr->mdl.numtris;
|
||||||
|
|
||||||
//
|
//
|
||||||
// draw all the triangles
|
// draw all the triangles
|
||||||
|
@ -632,14 +632,14 @@ static void R_DrawAliasModel (entity_t *e)
|
||||||
|
|
||||||
if (!strcmp (clmodel->name, "progs/eyes.mdl") )
|
if (!strcmp (clmodel->name, "progs/eyes.mdl") )
|
||||||
{
|
{
|
||||||
glTranslatef (paliashdr->scale_origin[0], paliashdr->scale_origin[1], paliashdr->scale_origin[2] - (22 + 8));
|
glTranslatef (paliashdr->mdl.scale_origin[0], paliashdr->mdl.scale_origin[1], paliashdr->mdl.scale_origin[2] - (22 + 8));
|
||||||
// double size of eyes, since they are really hard to see in gl
|
// double size of eyes, since they are really hard to see in gl
|
||||||
glScalef (paliashdr->scale[0]*2, paliashdr->scale[1]*2, paliashdr->scale[2]*2);
|
glScalef (paliashdr->mdl.scale[0]*2, paliashdr->mdl.scale[1]*2, paliashdr->mdl.scale[2]*2);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
glTranslatef (paliashdr->scale_origin[0], paliashdr->scale_origin[1], paliashdr->scale_origin[2]);
|
glTranslatef (paliashdr->mdl.scale_origin[0], paliashdr->mdl.scale_origin[1], paliashdr->mdl.scale_origin[2]);
|
||||||
glScalef (paliashdr->scale[0], paliashdr->scale[1], paliashdr->scale[2]);
|
glScalef (paliashdr->mdl.scale[0], paliashdr->mdl.scale[1], paliashdr->mdl.scale[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
anim = (int)(cl.time*10) & 3;
|
anim = (int)(cl.time*10) & 3;
|
||||||
|
|
1046
source/model.c
1046
source/model.c
File diff suppressed because it is too large
Load diff
265
source/model_alias.c
Normal file
265
source/model_alias.c
Normal file
|
@ -0,0 +1,265 @@
|
||||||
|
/*
|
||||||
|
gl_model.c
|
||||||
|
|
||||||
|
model loading and caching
|
||||||
|
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to:
|
||||||
|
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
59 Temple Place - Suite 330
|
||||||
|
Boston, MA 02111-1307, USA
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
// models are the only shared resource between a client and server running
|
||||||
|
// on the same machine.
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "r_local.h"
|
||||||
|
#include "sys.h"
|
||||||
|
#include "console.h"
|
||||||
|
#include "qendian.h"
|
||||||
|
#include "checksum.h"
|
||||||
|
#include "glquake.h"
|
||||||
|
#include "crc.h"
|
||||||
|
#include "server.h"
|
||||||
|
#include "msg.h"
|
||||||
|
|
||||||
|
extern char loadname[];
|
||||||
|
extern model_t *loadmodel;
|
||||||
|
|
||||||
|
void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype, int *pskinindex);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
==============================================================================
|
||||||
|
|
||||||
|
ALIAS MODELS
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
aliashdr_t *pheader;
|
||||||
|
|
||||||
|
stvert_t stverts[MAXALIASVERTS];
|
||||||
|
mtriangle_t triangles[MAXALIASTRIS];
|
||||||
|
|
||||||
|
// a pose is a single set of vertexes. a frame may be
|
||||||
|
// an animating sequence of poses
|
||||||
|
trivertx_t *poseverts[MAXALIASFRAMES];
|
||||||
|
int posenum;
|
||||||
|
|
||||||
|
void *Mod_LoadAliasFrame (void * pin, maliasframedesc_t *frame);
|
||||||
|
void *Mod_LoadAliasGroup (void * pin, maliasframedesc_t *frame);
|
||||||
|
|
||||||
|
|
||||||
|
//=========================================================================
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
Mod_LoadAliasModel
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void Mod_LoadAliasModel (model_t *mod, void *buffer)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
mdl_t *pinmodel, *pmodel;
|
||||||
|
stvert_t *pinstverts;
|
||||||
|
dtriangle_t *pintriangles;
|
||||||
|
int version, numframes;
|
||||||
|
int size;
|
||||||
|
daliasframetype_t *pframetype;
|
||||||
|
daliasskintype_t *pskintype;
|
||||||
|
int start, end, total;
|
||||||
|
|
||||||
|
if (!strcmp(loadmodel->name, "progs/player.mdl") ||
|
||||||
|
!strcmp(loadmodel->name, "progs/eyes.mdl")) {
|
||||||
|
unsigned short crc;
|
||||||
|
byte *p;
|
||||||
|
int len;
|
||||||
|
char st[40];
|
||||||
|
|
||||||
|
CRC_Init(&crc);
|
||||||
|
for (len = com_filesize, p = buffer; len; len--, p++)
|
||||||
|
CRC_ProcessByte(&crc, *p);
|
||||||
|
|
||||||
|
sprintf(st, "%d", (int) crc);
|
||||||
|
Info_SetValueForKey (cls.userinfo,
|
||||||
|
!strcmp(loadmodel->name, "progs/player.mdl") ? pmodel_name : emodel_name,
|
||||||
|
st, MAX_INFO_STRING);
|
||||||
|
|
||||||
|
if (cls.state >= ca_connected) {
|
||||||
|
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
|
||||||
|
snprintf(st, sizeof(st), "setinfo %s %d",
|
||||||
|
!strcmp(loadmodel->name, "progs/player.mdl") ? pmodel_name : emodel_name,
|
||||||
|
(int)crc);
|
||||||
|
SZ_Print (&cls.netchan.message, st);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
start = Hunk_LowMark ();
|
||||||
|
|
||||||
|
pinmodel = (mdl_t *)buffer;
|
||||||
|
|
||||||
|
version = LittleLong (pinmodel->version);
|
||||||
|
if (version != ALIAS_VERSION)
|
||||||
|
SV_Error ("%s has wrong version number (%i should be %i)",
|
||||||
|
mod->name, version, ALIAS_VERSION);
|
||||||
|
|
||||||
|
//
|
||||||
|
// allocate space for a working header, plus all the data except the frames,
|
||||||
|
// skin and group info
|
||||||
|
//
|
||||||
|
size = (int)&((aliashdr_t*)0)->frames[LittleLong (pinmodel->numframes)];
|
||||||
|
pheader = Hunk_AllocName (size, loadname);
|
||||||
|
memset(pheader, 0, size);
|
||||||
|
pmodel = &pheader->mdl;
|
||||||
|
pheader->model = (byte*)pmodel - (byte*)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)
|
||||||
|
SV_Error ("model %s has a skin taller than %d", mod->name,
|
||||||
|
MAX_LBM_HEIGHT);
|
||||||
|
|
||||||
|
pmodel->numverts = LittleLong (pinmodel->numverts);
|
||||||
|
|
||||||
|
if (pmodel->numverts <= 0)
|
||||||
|
SV_Error ("model %s has no vertices", mod->name);
|
||||||
|
|
||||||
|
if (pmodel->numverts > MAXALIASVERTS)
|
||||||
|
SV_Error ("model %s has too many vertices", mod->name);
|
||||||
|
|
||||||
|
pmodel->numtris = LittleLong (pinmodel->numtris);
|
||||||
|
|
||||||
|
if (pmodel->numtris <= 0)
|
||||||
|
SV_Error ("model %s has no triangles", mod->name);
|
||||||
|
|
||||||
|
pmodel->numframes = LittleLong (pinmodel->numframes);
|
||||||
|
numframes = pmodel->numframes;
|
||||||
|
if (numframes < 1)
|
||||||
|
SV_Error ("Mod_LoadAliasModel: Invalid # of frames: %d\n", 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]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
|
// load the skins
|
||||||
|
//
|
||||||
|
pskintype = (daliasskintype_t *)&pinmodel[1];
|
||||||
|
pskintype = Mod_LoadAllSkins (pheader->mdl.numskins, pskintype, &pheader->skindesc);
|
||||||
|
|
||||||
|
//
|
||||||
|
// load base s and t vertices
|
||||||
|
//
|
||||||
|
pinstverts = (stvert_t *)pskintype;
|
||||||
|
|
||||||
|
for (i=0 ; i<pheader->mdl.numverts ; i++)
|
||||||
|
{
|
||||||
|
stverts[i].onseam = LittleLong (pinstverts[i].onseam);
|
||||||
|
stverts[i].s = LittleLong (pinstverts[i].s);
|
||||||
|
stverts[i].t = LittleLong (pinstverts[i].t);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// load triangle lists
|
||||||
|
//
|
||||||
|
pintriangles = (dtriangle_t *)&pinstverts[pheader->mdl.numverts];
|
||||||
|
|
||||||
|
for (i=0 ; i<pheader->mdl.numtris ; i++)
|
||||||
|
{
|
||||||
|
triangles[i].facesfront = LittleLong (pintriangles[i].facesfront);
|
||||||
|
|
||||||
|
for (j=0 ; j<3 ; j++)
|
||||||
|
{
|
||||||
|
triangles[i].vertindex[j] =
|
||||||
|
LittleLong (pintriangles[i].vertindex[j]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// load the frames
|
||||||
|
//
|
||||||
|
posenum = 0;
|
||||||
|
pframetype = (daliasframetype_t *)&pintriangles[pheader->mdl.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]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pframetype = (daliasframetype_t *)
|
||||||
|
Mod_LoadAliasGroup (pframetype + 1, &pheader->frames[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pheader->numposes = posenum;
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
//
|
||||||
|
// build the draw lists
|
||||||
|
//
|
||||||
|
GL_MakeAliasModelDisplayLists (mod, pheader);
|
||||||
|
|
||||||
|
//
|
||||||
|
// move the complete, relocatable alias model to the cache
|
||||||
|
//
|
||||||
|
end = Hunk_LowMark ();
|
||||||
|
total = end - start;
|
||||||
|
|
||||||
|
Cache_Alloc (&mod->cache, total, loadname);
|
||||||
|
if (!mod->cache.data)
|
||||||
|
return;
|
||||||
|
memcpy (mod->cache.data, pheader, total);
|
||||||
|
|
||||||
|
Hunk_FreeToLowMark (start);
|
||||||
|
}
|
File diff suppressed because it is too large
Load diff
170
source/model_sprite.c
Normal file
170
source/model_sprite.c
Normal file
|
@ -0,0 +1,170 @@
|
||||||
|
/*
|
||||||
|
gl_model.c
|
||||||
|
|
||||||
|
model loading and caching
|
||||||
|
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to:
|
||||||
|
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
59 Temple Place - Suite 330
|
||||||
|
Boston, MA 02111-1307, USA
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
// models are the only shared resource between a client and server running
|
||||||
|
// on the same machine.
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "model.h"
|
||||||
|
#include "server.h"
|
||||||
|
#include "qendian.h"
|
||||||
|
|
||||||
|
extern model_t *loadmodel;
|
||||||
|
extern char loadname[];
|
||||||
|
|
||||||
|
void *Mod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int framenum);
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
Mod_LoadSpriteGroup
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void * Mod_LoadSpriteGroup (void * pin, mspriteframe_t **ppframe, int framenum)
|
||||||
|
{
|
||||||
|
dspritegroup_t *pingroup;
|
||||||
|
mspritegroup_t *pspritegroup;
|
||||||
|
int i, numframes;
|
||||||
|
dspriteinterval_t *pin_intervals;
|
||||||
|
float *poutintervals;
|
||||||
|
void *ptemp;
|
||||||
|
|
||||||
|
pingroup = (dspritegroup_t *)pin;
|
||||||
|
|
||||||
|
numframes = LittleLong (pingroup->numframes);
|
||||||
|
|
||||||
|
pspritegroup = Hunk_AllocName (sizeof (mspritegroup_t) +
|
||||||
|
(numframes - 1) * sizeof (pspritegroup->frames[0]), loadname);
|
||||||
|
|
||||||
|
pspritegroup->numframes = numframes;
|
||||||
|
|
||||||
|
*ppframe = (mspriteframe_t *)pspritegroup;
|
||||||
|
|
||||||
|
pin_intervals = (dspriteinterval_t *)(pingroup + 1);
|
||||||
|
|
||||||
|
poutintervals = Hunk_AllocName (numframes * sizeof (float), loadname);
|
||||||
|
|
||||||
|
pspritegroup->intervals = poutintervals;
|
||||||
|
|
||||||
|
for (i=0 ; i<numframes ; i++)
|
||||||
|
{
|
||||||
|
*poutintervals = LittleFloat (pin_intervals->interval);
|
||||||
|
if (*poutintervals <= 0.0)
|
||||||
|
SV_Error ("Mod_LoadSpriteGroup: interval<=0");
|
||||||
|
|
||||||
|
poutintervals++;
|
||||||
|
pin_intervals++;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptemp = (void *)pin_intervals;
|
||||||
|
|
||||||
|
for (i=0 ; i<numframes ; i++)
|
||||||
|
{
|
||||||
|
ptemp = Mod_LoadSpriteFrame (ptemp, &pspritegroup->frames[i], framenum * 100 + i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ptemp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
Mod_LoadSpriteModel
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void Mod_LoadSpriteModel (model_t *mod, void *buffer)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int version;
|
||||||
|
dsprite_t *pin;
|
||||||
|
msprite_t *psprite;
|
||||||
|
int numframes;
|
||||||
|
int size;
|
||||||
|
dspriteframetype_t *pframetype;
|
||||||
|
|
||||||
|
pin = (dsprite_t *)buffer;
|
||||||
|
|
||||||
|
version = LittleLong (pin->version);
|
||||||
|
if (version != SPRITE_VERSION)
|
||||||
|
SV_Error ("%s has wrong version number "
|
||||||
|
"(%i should be %i)", mod->name, version, SPRITE_VERSION);
|
||||||
|
|
||||||
|
numframes = LittleLong (pin->numframes);
|
||||||
|
|
||||||
|
size = sizeof (msprite_t) + (numframes - 1) * sizeof (psprite->frames);
|
||||||
|
|
||||||
|
psprite = Hunk_AllocName (size, loadname);
|
||||||
|
|
||||||
|
mod->cache.data = psprite;
|
||||||
|
|
||||||
|
psprite->type = LittleLong (pin->type);
|
||||||
|
psprite->maxwidth = LittleLong (pin->width);
|
||||||
|
psprite->maxheight = LittleLong (pin->height);
|
||||||
|
psprite->beamlength = LittleFloat (pin->beamlength);
|
||||||
|
mod->synctype = LittleLong (pin->synctype);
|
||||||
|
psprite->numframes = numframes;
|
||||||
|
|
||||||
|
mod->mins[0] = mod->mins[1] = -psprite->maxwidth/2;
|
||||||
|
mod->maxs[0] = mod->maxs[1] = psprite->maxwidth/2;
|
||||||
|
mod->mins[2] = -psprite->maxheight/2;
|
||||||
|
mod->maxs[2] = psprite->maxheight/2;
|
||||||
|
|
||||||
|
//
|
||||||
|
// load the frames
|
||||||
|
//
|
||||||
|
if (numframes < 1)
|
||||||
|
SV_Error ("Mod_LoadSpriteModel: Invalid # of frames: %d\n", numframes);
|
||||||
|
|
||||||
|
mod->numframes = numframes;
|
||||||
|
|
||||||
|
pframetype = (dspriteframetype_t *)(pin + 1);
|
||||||
|
|
||||||
|
for (i=0 ; i<numframes ; i++)
|
||||||
|
{
|
||||||
|
spriteframetype_t frametype;
|
||||||
|
|
||||||
|
frametype = LittleLong (pframetype->type);
|
||||||
|
psprite->frames[i].type = frametype;
|
||||||
|
|
||||||
|
if (frametype == SPR_SINGLE)
|
||||||
|
{
|
||||||
|
pframetype = (dspriteframetype_t *)
|
||||||
|
Mod_LoadSpriteFrame (pframetype + 1,
|
||||||
|
&psprite->frames[i].frameptr, i);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pframetype = (dspriteframetype_t *)
|
||||||
|
Mod_LoadSpriteGroup (pframetype + 1,
|
||||||
|
&psprite->frames[i].frameptr, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mod->type = mod_sprite;
|
||||||
|
}
|
|
@ -39,8 +39,15 @@
|
||||||
#include "sys.h"
|
#include "sys.h"
|
||||||
#include "pmove.h"
|
#include "pmove.h"
|
||||||
|
|
||||||
|
const int mod_lightmap_bytes=1;
|
||||||
|
|
||||||
void Mod_LoadBrushModel (model_t *mod, void *buffer);
|
void Mod_LoadBrushModel (model_t *mod, void *buffer);
|
||||||
|
|
||||||
|
void
|
||||||
|
Mod_LoadLighting(lump_t *l)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Mod_LoadAliasModel(model_t *mod, void *buf)
|
Mod_LoadAliasModel(model_t *mod, void *buf)
|
||||||
{
|
{
|
||||||
|
|
293
source/sw_model_alias.c
Normal file
293
source/sw_model_alias.c
Normal file
|
@ -0,0 +1,293 @@
|
||||||
|
/*
|
||||||
|
cl_model.c
|
||||||
|
|
||||||
|
model loading and caching
|
||||||
|
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to:
|
||||||
|
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
59 Temple Place - Suite 330
|
||||||
|
Boston, MA 02111-1307, USA
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
// models are the only shared resource between a client and server running
|
||||||
|
// on the same machine.
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "r_local.h"
|
||||||
|
#include "sys.h"
|
||||||
|
#include "console.h"
|
||||||
|
#include "qendian.h"
|
||||||
|
#include "checksum.h"
|
||||||
|
#include "glquake.h"
|
||||||
|
#include "server.h"
|
||||||
|
|
||||||
|
extern char loadname[];
|
||||||
|
extern model_t *loadmodel;
|
||||||
|
|
||||||
|
/*
|
||||||
|
==============================================================================
|
||||||
|
|
||||||
|
ALIAS MODELS
|
||||||
|
|
||||||
|
==============================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
extern aliashdr_t *pheader;
|
||||||
|
|
||||||
|
extern stvert_t stverts[MAXALIASVERTS];
|
||||||
|
extern mtriangle_t triangles[MAXALIASTRIS];
|
||||||
|
|
||||||
|
// a pose is a single set of vertexes. a frame may be
|
||||||
|
// an animating sequence of poses
|
||||||
|
extern trivertx_t *poseverts[MAXALIASFRAMES];
|
||||||
|
extern int posenum;
|
||||||
|
|
||||||
|
void *Mod_LoadSkin (byte *skin, int skinsize, int *pskinindex, int snum, int gnum)
|
||||||
|
{
|
||||||
|
byte *pskin;
|
||||||
|
ushort *pusskin;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
pskin = Hunk_AllocName (skinsize * r_pixbytes, loadname);
|
||||||
|
*pskinindex = (byte *)pskin - (byte *)pheader;
|
||||||
|
|
||||||
|
switch (r_pixbytes) {
|
||||||
|
case 1:
|
||||||
|
memcpy (pskin, skin, skinsize);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
pusskin = (ushort*)skin;
|
||||||
|
for (i=0; i<skinsize; i++)
|
||||||
|
pusskin[i] = d_8to16table[skin[i]];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
SV_Error ("Mod_LoadAliasSkin: driver set invalid r_pixbytes: %d\n",
|
||||||
|
r_pixbytes);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return skin + skinsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
===============
|
||||||
|
Mod_LoadAllSkins
|
||||||
|
===============
|
||||||
|
*/
|
||||||
|
void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype, int *pskinindex)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
int skinsize;
|
||||||
|
byte *skin;
|
||||||
|
int groupskins;
|
||||||
|
daliasskingroup_t *pinskingroup;
|
||||||
|
daliasskininterval_t *pinskinintervals;
|
||||||
|
maliasskindesc_t *pskindesc;
|
||||||
|
maliasskingroup_t *paliasskingroup;
|
||||||
|
float *poutskinintervals;
|
||||||
|
|
||||||
|
skin = (byte *)pskintype;
|
||||||
|
|
||||||
|
if (numskins < 1 || numskins > MAX_SKINS)
|
||||||
|
Sys_Error ("Mod_LoadAliasModel: Invalid # of skins: %d\n", numskins);
|
||||||
|
|
||||||
|
skinsize = pheader->mdl.skinwidth * pheader->mdl.skinheight;
|
||||||
|
pskindesc = Hunk_AllocName (numskins * sizeof (maliasskindesc_t),
|
||||||
|
loadname);
|
||||||
|
pheader->skindesc = (byte *)pskindesc - (byte *)pheader;
|
||||||
|
|
||||||
|
for (i=0 ; i<numskins ; i++)
|
||||||
|
{
|
||||||
|
if (pskintype->type == ALIAS_SKIN_SINGLE) {
|
||||||
|
skin+=4;
|
||||||
|
skin = Mod_LoadSkin (skin, skinsize, &pskindesc[i].skin, i, 0);
|
||||||
|
} else {
|
||||||
|
pskintype++;
|
||||||
|
pinskingroup = (daliasskingroup_t *)pskintype;
|
||||||
|
groupskins = LittleLong (pinskingroup->numskins);
|
||||||
|
|
||||||
|
j = sizeof (maliasskingroup_t) +
|
||||||
|
(groupskins - 1) * sizeof (paliasskingroup->skindescs[0]);
|
||||||
|
j = (int)&((maliasskingroup_t*)0)->skindescs[groupskins];
|
||||||
|
paliasskingroup = Hunk_AllocName (j, loadname);
|
||||||
|
paliasskingroup->numskins = groupskins;
|
||||||
|
|
||||||
|
*pskinindex = (byte *)paliasskingroup - (byte *)pheader;
|
||||||
|
|
||||||
|
pinskinintervals = (daliasskininterval_t *)(pinskingroup + 1);
|
||||||
|
poutskinintervals = Hunk_AllocName (groupskins * sizeof (float),loadname);
|
||||||
|
paliasskingroup->intervals = (byte *)poutskinintervals - (byte *)pheader;
|
||||||
|
for (i=0 ; i<groupskins ; i++) {
|
||||||
|
*poutskinintervals = LittleFloat (pinskinintervals->interval);
|
||||||
|
if (*poutskinintervals <= 0)
|
||||||
|
Sys_Error ("Mod_LoadAliasSkinGroup: interval<=0");
|
||||||
|
|
||||||
|
poutskinintervals++;
|
||||||
|
pinskinintervals++;
|
||||||
|
}
|
||||||
|
|
||||||
|
pskintype = (void *)pinskinintervals;
|
||||||
|
skin = (byte *)pskintype;
|
||||||
|
|
||||||
|
for (j=0 ; j<groupskins ; j++)
|
||||||
|
{
|
||||||
|
skin+=4;
|
||||||
|
skin = Mod_LoadSkin (skin, skinsize, &paliasskingroup->skindescs[i].skin, i, j);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (void *)skin;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GL_MakeAliasModelDisplayLists (model_t *m, aliashdr_t *hdr)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
stvert_t *pstverts;
|
||||||
|
mtriangle_t *ptri;
|
||||||
|
int numv = hdr->mdl.numverts;
|
||||||
|
int numt = hdr->mdl.numtris;
|
||||||
|
|
||||||
|
pstverts = (stvert_t *)Hunk_AllocName(numv * sizeof(stvert_t),loadname);
|
||||||
|
ptri = (mtriangle_t *)Hunk_AllocName(numt * sizeof(mtriangle_t),loadname);
|
||||||
|
|
||||||
|
hdr->stverts = (byte *)pstverts - (byte *)hdr;
|
||||||
|
hdr->triangles = (byte *)ptri - (byte *)hdr;
|
||||||
|
|
||||||
|
for (i=0; i<numv; i++) {
|
||||||
|
pstverts[i].onseam = stverts[i].onseam;
|
||||||
|
pstverts[i].s = stverts[i].s << 16;
|
||||||
|
pstverts[i].t = stverts[i].t << 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i=0; i<numt; i++) {
|
||||||
|
ptri[i].facesfront = triangles[i].facesfront;
|
||||||
|
for (j=0; j<3; j++) {
|
||||||
|
ptri[i].vertindex[j] = triangles[i].vertindex[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
Mod_LoadAliasFrame
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void * Mod_LoadAliasFrame (void * pin, maliasframedesc_t *frame)
|
||||||
|
{
|
||||||
|
trivertx_t *pframe, *pinframe;
|
||||||
|
int i, j;
|
||||||
|
daliasframe_t *pdaliasframe;
|
||||||
|
|
||||||
|
pdaliasframe = (daliasframe_t *)pin;
|
||||||
|
|
||||||
|
strcpy (frame->name, pdaliasframe->name);
|
||||||
|
|
||||||
|
for (i=0 ; i<3 ; i++)
|
||||||
|
{
|
||||||
|
// these are byte values, so we don't have to worry about
|
||||||
|
// endianness
|
||||||
|
frame->bboxmin.v[i] = pdaliasframe->bboxmin.v[i];
|
||||||
|
frame->bboxmax.v[i] = pdaliasframe->bboxmax.v[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
pinframe = (trivertx_t *)(pdaliasframe + 1);
|
||||||
|
pframe = Hunk_AllocName (pheader->mdl.numverts * sizeof(*pframe), loadname);
|
||||||
|
|
||||||
|
frame->frame = (byte *)pframe - (byte *)pheader;
|
||||||
|
|
||||||
|
for (j=0 ; j<pheader->mdl.numverts ; 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 += pheader->mdl.numverts;
|
||||||
|
|
||||||
|
return (void *)pinframe;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
Mod_LoadAliasGroup
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void * Mod_LoadAliasGroup (void * pin, maliasframedesc_t *frame)
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
|
||||||
|
paliasgroup = Hunk_AllocName (sizeof (maliasgroup_t) +
|
||||||
|
(numframes - 1) * sizeof (paliasgroup->frames[0]), loadname);
|
||||||
|
|
||||||
|
paliasgroup->numframes = numframes;
|
||||||
|
|
||||||
|
for (i=0 ; i<3 ; i++)
|
||||||
|
{
|
||||||
|
// these are byte values, so we don't have to worry about endianness
|
||||||
|
frame->bboxmin.v[i] = pingroup->bboxmin.v[i];
|
||||||
|
frame->bboxmax.v[i] = pingroup->bboxmax.v[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
frame->frame = (byte *)paliasgroup - (byte *)pheader;
|
||||||
|
|
||||||
|
pin_intervals = (daliasinterval_t *)(pingroup + 1);
|
||||||
|
|
||||||
|
poutintervals = Hunk_AllocName (numframes * sizeof (float), loadname);
|
||||||
|
|
||||||
|
paliasgroup->intervals = (byte *)poutintervals - (byte *)pheader;
|
||||||
|
|
||||||
|
for (i=0 ; i<numframes ; i++)
|
||||||
|
{
|
||||||
|
*poutintervals = LittleFloat (pin_intervals->interval);
|
||||||
|
if (*poutintervals <= 0.0)
|
||||||
|
SV_Error ("Mod_LoadAliasGroup: interval<=0");
|
||||||
|
|
||||||
|
poutintervals++;
|
||||||
|
pin_intervals++;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptemp = (void *)pin_intervals;
|
||||||
|
|
||||||
|
for (i=0 ; i<numframes ; i++)
|
||||||
|
{
|
||||||
|
ptemp = Mod_LoadAliasFrame (ptemp, (maliasframedesc_t*)&paliasgroup->frames[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ptemp;
|
||||||
|
}
|
68
source/sw_model_brush.c
Normal file
68
source/sw_model_brush.c
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
sw_model_bursh.c
|
||||||
|
|
||||||
|
model loading and caching
|
||||||
|
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to:
|
||||||
|
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
59 Temple Place - Suite 330
|
||||||
|
Boston, MA 02111-1307, USA
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
// models are the only shared resource between a client and server running
|
||||||
|
// on the same machine.
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "model.h"
|
||||||
|
|
||||||
|
extern model_t *loadmodel;
|
||||||
|
extern char loadname[];
|
||||||
|
extern byte *mod_base;
|
||||||
|
|
||||||
|
const int mod_lightmap_bytes=1;
|
||||||
|
|
||||||
|
void
|
||||||
|
GL_SubdivideSurface(msurface_t *fa)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Mod_LoadMMNearest(miptex_t *mt, texture_t *tx)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
Mod_LoadLighting
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void Mod_LoadLighting (lump_t *l)
|
||||||
|
{
|
||||||
|
if (!l->filelen)
|
||||||
|
{
|
||||||
|
loadmodel->lightdata = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
loadmodel->lightdata = Hunk_AllocName ( l->filelen, loadname);
|
||||||
|
memcpy (loadmodel->lightdata, mod_base + l->fileofs, l->filelen);
|
||||||
|
}
|
98
source/sw_model_sprite.c
Normal file
98
source/sw_model_sprite.c
Normal file
|
@ -0,0 +1,98 @@
|
||||||
|
/*
|
||||||
|
cl_model.c
|
||||||
|
|
||||||
|
model loading and caching
|
||||||
|
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to:
|
||||||
|
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
59 Temple Place - Suite 330
|
||||||
|
Boston, MA 02111-1307, USA
|
||||||
|
|
||||||
|
$Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
// models are the only shared resource between a client and server running
|
||||||
|
// on the same machine.
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "model.h"
|
||||||
|
#include "server.h"
|
||||||
|
#include "d_iface.h"
|
||||||
|
#include "qendian.h"
|
||||||
|
|
||||||
|
extern model_t *loadmodel;
|
||||||
|
extern char loadname[];
|
||||||
|
|
||||||
|
/*
|
||||||
|
=================
|
||||||
|
Mod_LoadSpriteFrame
|
||||||
|
=================
|
||||||
|
*/
|
||||||
|
void * Mod_LoadSpriteFrame (void * pin, mspriteframe_t **ppframe, int framenum)
|
||||||
|
{
|
||||||
|
dspriteframe_t *pinframe;
|
||||||
|
mspriteframe_t *pspriteframe;
|
||||||
|
int i, width, height, size, origin[2];
|
||||||
|
unsigned short *ppixout;
|
||||||
|
byte *ppixin;
|
||||||
|
|
||||||
|
pinframe = (dspriteframe_t *)pin;
|
||||||
|
|
||||||
|
width = LittleLong (pinframe->width);
|
||||||
|
height = LittleLong (pinframe->height);
|
||||||
|
size = width * height;
|
||||||
|
|
||||||
|
pspriteframe = Hunk_AllocName (sizeof (mspriteframe_t) + size*r_pixbytes,
|
||||||
|
loadname);
|
||||||
|
|
||||||
|
memset (pspriteframe, 0, sizeof (mspriteframe_t) + size);
|
||||||
|
*ppframe = pspriteframe;
|
||||||
|
|
||||||
|
pspriteframe->width = width;
|
||||||
|
pspriteframe->height = height;
|
||||||
|
origin[0] = LittleLong (pinframe->origin[0]);
|
||||||
|
origin[1] = LittleLong (pinframe->origin[1]);
|
||||||
|
|
||||||
|
pspriteframe->up = origin[1];
|
||||||
|
pspriteframe->down = origin[1] - height;
|
||||||
|
pspriteframe->left = origin[0];
|
||||||
|
pspriteframe->right = width + origin[0];
|
||||||
|
|
||||||
|
if (r_pixbytes == 1)
|
||||||
|
{
|
||||||
|
memcpy (&pspriteframe->pixels[0], (byte *)(pinframe + 1), size);
|
||||||
|
}
|
||||||
|
else if (r_pixbytes == 2)
|
||||||
|
{
|
||||||
|
ppixin = (byte *)(pinframe + 1);
|
||||||
|
ppixout = (unsigned short *)&pspriteframe->pixels[0];
|
||||||
|
|
||||||
|
for (i=0 ; i<size ; i++)
|
||||||
|
ppixout[i] = d_8to16table[ppixin[i]];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SV_Error ("Mod_LoadSpriteFrame: driver set invalid r_pixbytes: %d\n",
|
||||||
|
r_pixbytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (void *)((byte *)pinframe + sizeof (dspriteframe_t) + size);
|
||||||
|
}
|
Loading…
Reference in a new issue