DarkPlaces
Game engine based on the Quake 1 engine by id Software, developed by LadyHavoc
 
model_sprite.c
Go to the documentation of this file.
1/*
2Copyright (C) 1996-1997 Id Software, Inc.
3
4This program is free software; you can redistribute it and/or
5modify it under the terms of the GNU General Public License
6as published by the Free Software Foundation; either version 2
7of the License, or (at your option) any later version.
8
9This program is distributed in the hope that it will be useful,
10but WITHOUT ANY WARRANTY; without even the implied warranty of
11MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
13See the GNU General Public License for more details.
14
15You should have received a copy of the GNU General Public License
16along with this program; if not, write to the Free Software
17Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
19*/
20// models.c -- model loading and caching
21
22// models are the only shared resource between a client and server running
23// on the same machine.
24
25#include "quakedef.h"
26#include "image.h"
27
28cvar_t r_mipsprites = {CF_CLIENT | CF_ARCHIVE, "r_mipsprites", "1", "mipmaps sprites so they render faster in the distance and do not display noise artifacts"};
29cvar_t r_labelsprites_scale = {CF_CLIENT | CF_ARCHIVE, "r_labelsprites_scale", "1", "global scale to apply to label sprites before conversion to HUD coordinates"};
30cvar_t r_labelsprites_roundtopixels = {CF_CLIENT | CF_ARCHIVE, "r_labelsprites_roundtopixels", "1", "try to make label sprites sharper by rounding their size to 0.5x or 1x and by rounding their position to whole pixels if possible"};
31cvar_t r_overheadsprites_perspective = {CF_CLIENT | CF_ARCHIVE, "r_overheadsprites_perspective", "5", "fake perspective effect for SPR_OVERHEAD sprites"};
32cvar_t r_overheadsprites_pushback = {CF_CLIENT | CF_ARCHIVE, "r_overheadsprites_pushback", "15", "how far to pull the SPR_OVERHEAD sprites toward the eye (used to avoid intersections with 3D models)"};
33cvar_t r_overheadsprites_scalex = {CF_CLIENT | CF_ARCHIVE, "r_overheadsprites_scalex", "1", "additional scale for overhead sprites for x axis"};
34cvar_t r_overheadsprites_scaley = {CF_CLIENT | CF_ARCHIVE, "r_overheadsprites_scaley", "1", "additional scale for overhead sprites for y axis"};
35cvar_t r_track_sprites = {CF_CLIENT | CF_ARCHIVE, "r_track_sprites", "1", "track SPR_LABEL* sprites by putting them as indicator at the screen border to rotate to"};
36cvar_t r_track_sprites_flags = {CF_CLIENT | CF_ARCHIVE, "r_track_sprites_flags", "1", "1: Rotate sprites accordingly, 2: Make it a continuous rotation"};
37cvar_t r_track_sprites_scalew = {CF_CLIENT | CF_ARCHIVE, "r_track_sprites_scalew", "1", "width scaling of tracked sprites"};
38cvar_t r_track_sprites_scaleh = {CF_CLIENT | CF_ARCHIVE, "r_track_sprites_scaleh", "1", "height scaling of tracked sprites"};
39
40/*
41===============
42Mod_SpriteInit
43===============
44*/
59
60static void Mod_SpriteSetupTexture(texture_t *texture, skinframe_t *skinframe, qbool fullbright, qbool additive)
61{
62 if (!skinframe)
63 skinframe = R_SkinFrame_LoadMissing();
64 texture->offsetmapping = OFFSETMAPPING_OFF;
65 texture->offsetscale = 1;
66 texture->offsetbias = 0;
67 texture->specularscalemod = 1;
68 texture->specularpowermod = 1;
69 texture->basematerialflags = MATERIALFLAG_WALL;
70 texture->basealpha = 1.0f;
71 if (fullbright)
72 texture->basematerialflags |= MATERIALFLAG_FULLBRIGHT;
73 if (additive)
75 else if (skinframe->hasalpha)
77 texture->currentmaterialflags = texture->basematerialflags;
78 texture->materialshaderpass = texture->shaderpasses[0] = Mod_CreateShaderPass(loadmodel->mempool, skinframe);
79 texture->currentskinframe = skinframe;
80 texture->surfaceflags = 0;
81 texture->supercontents = SUPERCONTENTS_SOLID;
82 if (!(texture->basematerialflags & MATERIALFLAG_BLENDED))
83 texture->supercontents |= SUPERCONTENTS_OPAQUE;
84 texture->transparentsort = TRANSPARENTSORT_DISTANCE;
85 // WHEN ADDING DEFAULTS HERE, REMEMBER TO PUT DEFAULTS IN ALL LOADERS
86 // JUST GREP FOR "specularscalemod = 1".
87}
88
90
91static void Mod_Sprite_SharedSetup(const unsigned char *datapointer, int version, const unsigned int *palette, qbool additive)
92{
93 int i, j, groupframes, realframes, x, y, origin[2], width, height;
94 qbool fullbright;
95 dspriteframetype_t pinframetype;
96 dspriteframe_t pinframe;
97 dspritegroup_t pingroup;
98 dspriteinterval_t pinintervals;
99 skinframe_t *skinframe;
100 float modelradius, interval;
101 char name[MAX_QPATH], fogname[MAX_QPATH];
102 const void *startframes;
104 modelradius = 0;
105
106 if (loadmodel->numframes < 1)
107 Host_Error ("Mod_Sprite_SharedSetup: Invalid # of frames: %d", loadmodel->numframes);
108
109 // LadyHavoc: hack to allow sprites to be non-fullbright
110 fullbright = true;
111 for (i = 0;i < MAX_QPATH && loadmodel->name[i];i++)
112 if (loadmodel->name[i] == '!')
113 fullbright = false;
114
115//
116// load the frames
117// bones_was_here: memcpy() used here to prevent misaligned access with struct-based parsing
118//
119 startframes = datapointer;
120 realframes = 0;
121 for (i = 0;i < loadmodel->numframes;i++)
122 {
123 memcpy(&pinframetype, datapointer, sizeof(dspriteframetype_t));
124 datapointer += sizeof(dspriteframetype_t);
125
126 if (LittleLong (pinframetype.type) == SPR_SINGLE)
127 groupframes = 1;
128 else
129 {
130 memcpy(&pingroup, datapointer, sizeof(dspritegroup_t));
131 datapointer += sizeof(dspritegroup_t);
132
133 groupframes = LittleLong(pingroup.numframes);
134
135 datapointer += sizeof(dspriteinterval_t) * groupframes;
136 }
137
138 for (j = 0;j < groupframes;j++)
139 {
140 memcpy(&pinframe, datapointer, sizeof(dspriteframe_t));
142 datapointer += sizeof(dspriteframe_t) + LittleLong(pinframe.width) * LittleLong(pinframe.height) * 4;
143 else //if (version == SPRITE_VERSION || version == SPRITEHL_VERSION)
144 datapointer += sizeof(dspriteframe_t) + LittleLong(pinframe.width) * LittleLong(pinframe.height);
145 }
146 realframes += groupframes;
147 }
148
151 loadmodel->num_textures = realframes;
154
155 datapointer = (unsigned char *)startframes;
156 realframes = 0;
157 for (i = 0;i < loadmodel->numframes;i++)
158 {
159 memcpy(&pinframetype, datapointer, sizeof(dspriteframetype_t));
160 datapointer += sizeof(dspriteframetype_t);
161
162 if (LittleLong (pinframetype.type) == SPR_SINGLE)
163 {
164 groupframes = 1;
165 interval = 0.1f;
166 }
167 else
168 {
169 memcpy(&pingroup, datapointer, sizeof(dspritegroup_t));
170 datapointer += sizeof(dspritegroup_t);
171
172 groupframes = LittleLong(pingroup.numframes);
173
174 memcpy(&pinintervals, datapointer, sizeof(dspriteinterval_t));
175 datapointer += sizeof(dspriteinterval_t) * groupframes;
176
177 interval = LittleFloat(pinintervals.interval);
178 if (interval < 0.01f)
179 Host_Error("Mod_Sprite_SharedSetup: invalid interval");
180 }
181
182 dpsnprintf(loadmodel->animscenes[i].name, sizeof(loadmodel->animscenes[i].name), "frame %i", i);
183 loadmodel->animscenes[i].firstframe = realframes;
184 loadmodel->animscenes[i].framecount = groupframes;
185 loadmodel->animscenes[i].framerate = 1.0f / interval;
186 loadmodel->animscenes[i].loop = true;
187
188 for (j = 0;j < groupframes;j++)
189 {
190 memcpy(&pinframe, datapointer, sizeof(dspriteframe_t));
191 datapointer += sizeof(dspriteframe_t);
192
193 origin[0] = LittleLong (pinframe.origin[0]);
194 origin[1] = LittleLong (pinframe.origin[1]);
195 width = LittleLong (pinframe.width);
196 height = LittleLong (pinframe.height);
197
198 loadmodel->sprite.sprdata_frames[realframes].left = origin[0];
199 loadmodel->sprite.sprdata_frames[realframes].right = origin[0] + width;
200 loadmodel->sprite.sprdata_frames[realframes].up = origin[1];
201 loadmodel->sprite.sprdata_frames[realframes].down = origin[1] - height;
202
205 if (modelradius < x + y)
206 modelradius = x + y;
207
208 if (cls.state != ca_dedicated)
209 {
210 skinframe = NULL;
211 // note: Nehahra's null.spr has width == 0 and height == 0
212 if (width > 0 && height > 0)
213 {
214 if (groupframes > 1)
215 {
216 dpsnprintf (name, sizeof(name), "%s_%i_%i", loadmodel->name, i, j);
217 dpsnprintf (fogname, sizeof(fogname), "%s_%i_%ifog", loadmodel->name, i, j);
218 }
219 else
220 {
221 dpsnprintf (name, sizeof(name), "%s_%i", loadmodel->name, i);
222 dpsnprintf (fogname, sizeof(fogname), "%s_%ifog", loadmodel->name, i);
223 }
224 if (!(skinframe = R_SkinFrame_LoadExternal(name, texflags | TEXF_COMPRESS, false, false)))
225 {
226 unsigned char *pixels = (unsigned char *) Mem_Alloc(loadmodel->mempool, width*height*4);
228 {
229 for (x = 0;x < width*height;x++)
230 {
231 pixels[x*4+2] = datapointer[x*4+0];
232 pixels[x*4+1] = datapointer[x*4+1];
233 pixels[x*4+0] = datapointer[x*4+2];
234 pixels[x*4+3] = datapointer[x*4+3];
235 }
236 }
237 else //if (version == SPRITEHL_VERSION || version == SPRITE_VERSION)
238 Image_Copy8bitBGRA(datapointer, pixels, width*height, palette ? palette : palette_bgra_transparent);
239 skinframe = R_SkinFrame_LoadInternalBGRA(name, texflags, pixels, width, height, 0, 0, 0, false);
240 // texflags |= TEXF_COMPRESS;
242 }
243 }
244 if (skinframe == NULL)
245 skinframe = R_SkinFrame_LoadMissing();
246 Mod_SpriteSetupTexture(&loadmodel->data_textures[realframes], skinframe, fullbright, additive);
247 }
248
250 datapointer += width * height * 4;
251 else //if (version == SPRITE_VERSION || version == SPRITEHL_VERSION)
252 datapointer += width * height;
253 realframes++;
254 }
255 }
256
257 modelradius = sqrt(modelradius);
258 for (i = 0;i < 3;i++)
259 {
260 loadmodel->normalmins[i] = loadmodel->yawmins[i] = loadmodel->rotatedmins[i] = -modelradius;
262 }
263 loadmodel->radius = modelradius;
264 loadmodel->radius2 = modelradius * modelradius;
265}
266
267void Mod_IDSP_Load(model_t *mod, void *buffer, void *bufferend)
268{
269 int version;
270 const unsigned char *datapointer;
271
272 datapointer = (unsigned char *)buffer;
273
275
277
281
284 {
285 dsprite_t *pinqsprite;
286
287 pinqsprite = (dsprite_t *)datapointer;
288 datapointer += sizeof(dsprite_t);
289
290 loadmodel->numframes = LittleLong (pinqsprite->numframes);
291 loadmodel->sprite.sprnum_type = LittleLong (pinqsprite->type);
293
294 Mod_Sprite_SharedSetup(datapointer, LittleLong (pinqsprite->version), NULL, false);
295 }
296 else if (version == SPRITEHL_VERSION)
297 {
298 int i, rendermode;
299 unsigned char palette[256][4];
300 const unsigned char *in;
301 dspritehl_t *pinhlsprite;
302
303 pinhlsprite = (dspritehl_t *)datapointer;
304 datapointer += sizeof(dspritehl_t);
305
306 loadmodel->numframes = LittleLong (pinhlsprite->numframes);
307 loadmodel->sprite.sprnum_type = LittleLong (pinhlsprite->type);
309 rendermode = pinhlsprite->rendermode;
310
311 in = datapointer;
312 datapointer += 2;
313 i = in[0] + in[1] * 256;
314 if (i != 256)
315 Host_Error ("Mod_IDSP_Load: unexpected number of palette colors %i (should be 256)", i);
316 in = datapointer;
317 datapointer += 768;
318 switch(rendermode)
319 {
320 case SPRHL_OPAQUE:
321 for (i = 0;i < 256;i++)
322 {
323 palette[i][2] = in[i*3+0];
324 palette[i][1] = in[i*3+1];
325 palette[i][0] = in[i*3+2];
326 palette[i][3] = 255;
327 }
328 break;
329 case SPRHL_ADDITIVE:
330 for (i = 0;i < 256;i++)
331 {
332 palette[i][2] = in[i*3+0];
333 palette[i][1] = in[i*3+1];
334 palette[i][0] = in[i*3+2];
335 palette[i][3] = 255;
336 }
337 // also passes additive == true to Mod_Sprite_SharedSetup
338 break;
339 case SPRHL_INDEXALPHA:
340 for (i = 0;i < 256;i++)
341 {
342 palette[i][2] = in[765];
343 palette[i][1] = in[766];
344 palette[i][0] = in[767];
345 palette[i][3] = i;
346 in += 3;
347 }
348 break;
349 case SPRHL_ALPHATEST:
350 for (i = 0;i < 256;i++)
351 {
352 palette[i][2] = in[i*3+0];
353 palette[i][1] = in[i*3+1];
354 palette[i][0] = in[i*3+2];
355 palette[i][3] = 255;
356 }
357 palette[255][0] = palette[255][1] = palette[255][2] = palette[255][3] = 0;
358 // should this use alpha test or alpha blend? (currently blend)
359 break;
360 default:
361 Host_Error("Mod_IDSP_Load: unknown texFormat (%i, should be 0, 1, 2, or 3)", i);
362 return;
363 }
364
365 Mod_Sprite_SharedSetup(datapointer, LittleLong (pinhlsprite->version), (unsigned int *)(&palette[0][0]), rendermode == SPRHL_ADDITIVE);
366 }
367 else
368 Host_Error("Mod_IDSP_Load: %s has wrong version number (%i). Only %i (quake), %i (HalfLife), and %i (sprite32) supported",
370
371 // TODO: Note that isanimated only means whether vertices change due to
372 // the animation. This may happen due to sprframe parameters changing.
373 // Mere texture chanegs OTOH shouldn't require isanimated to be 1.
375}
376
377
378void Mod_IDS2_Load(model_t *mod, void *buffer, void *bufferend)
379{
380 int i, version;
381 qbool fullbright;
382 const dsprite2_t *pinqsprite;
383 skinframe_t *skinframe;
384 float modelradius;
386
388
390
394
395 pinqsprite = (dsprite2_t *)buffer;
396
397 version = LittleLong(pinqsprite->version);
399 Host_Error("Mod_IDS2_Load: %s has wrong version number (%i should be 2 (quake 2)", loadmodel->name, version);
400
401 loadmodel->numframes = LittleLong (pinqsprite->numframes);
402 if (loadmodel->numframes < 1)
403 Host_Error ("Mod_IDS2_Load: Invalid # of frames: %d", loadmodel->numframes);
406
407 // LadyHavoc: hack to allow sprites to be non-fullbright
408 fullbright = true;
409 for (i = 0;i < MAX_QPATH && loadmodel->name[i];i++)
410 if (loadmodel->name[i] == '!')
411 fullbright = false;
412
418
419 modelradius = 0;
420 for (i = 0;i < loadmodel->numframes;i++)
421 {
422 int origin[2], x, y, width, height;
423 const dsprite2frame_t *pinframe;
424 mspriteframe_t *sprframe;
425
426 dpsnprintf(loadmodel->animscenes[i].name, sizeof(loadmodel->animscenes[i].name), "frame %i", i);
430 loadmodel->animscenes[i].loop = true;
431
432 pinframe = &pinqsprite->frames[i];
433
434 origin[0] = LittleLong (pinframe->origin_x);
435 origin[1] = LittleLong (pinframe->origin_y);
436 width = LittleLong (pinframe->width);
437 height = LittleLong (pinframe->height);
438
439 sprframe = &loadmodel->sprite.sprdata_frames[i];
440
441 // note that sp2 origin[0] is positive, where as it is negative in
442 // spr/spr32/hlspr
443 sprframe->left = -origin[0];
444 sprframe->right = -origin[0] + width;
445 sprframe->up = origin[1];
446 sprframe->down = origin[1] - height;
447
448 x = (int)max(sprframe->left * sprframe->left, sprframe->right * sprframe->right);
449 y = (int)max(sprframe->up * sprframe->up, sprframe->down * sprframe->down);
450 if (modelradius < x + y)
451 modelradius = x + y;
452 }
453
454 if (cls.state != ca_dedicated)
455 {
456 for (i = 0;i < loadmodel->numframes;i++)
457 {
458 const dsprite2frame_t *pinframe;
459 pinframe = &pinqsprite->frames[i];
460 if (!(skinframe = R_SkinFrame_LoadExternal(pinframe->name, texflags, false, false)))
461 {
462 Con_Printf(CON_ERROR "Mod_IDS2_Load: failed to load %s", pinframe->name);
463 skinframe = R_SkinFrame_LoadMissing();
464 }
465 Mod_SpriteSetupTexture(&loadmodel->data_textures[i], skinframe, fullbright, false);
466 }
467 }
468
469 modelradius = sqrt(modelradius);
470 for (i = 0;i < 3;i++)
471 {
472 loadmodel->normalmins[i] = loadmodel->yawmins[i] = loadmodel->rotatedmins[i] = -modelradius;
474 }
475 loadmodel->radius = modelradius;
476 loadmodel->radius2 = modelradius * modelradius;
477
478 // TODO: Note that isanimated only means whether vertices change due to
479 // the animation. This may happen due to sprframe parameters changing.
480 // Mere texture chanegs OTOH shouldn't require isanimated to be 1.
482}
#define SUPERCONTENTS_OPAQUE
Definition bspfile.h:208
#define SUPERCONTENTS_SOLID
Definition bspfile.h:196
client_static_t cls
Definition cl_main.c:116
@ ca_dedicated
Definition client.h:530
#define CF_CLIENT
cvar/command that only the client can change/execute
Definition cmd.h:48
#define CF_ARCHIVE
cvar should have its set value saved to config.cfg and persist across sessions
Definition cmd.h:53
int dpsnprintf(char *buffer, size_t buffersize, const char *format,...)
Returns the number of printed characters, excluding the final '\0' or returns -1 if the buffer isn't ...
Definition common.c:997
#define LittleLong(l)
Definition common.h:92
#define LittleFloat(l)
Definition common.h:94
void Con_Printf(const char *fmt,...)
Prints to all appropriate console targets.
Definition console.c:1514
#define CON_ERROR
Definition console.h:102
float mod(float dividend, float divisor)
vector origin
void Cvar_RegisterVariable(cvar_t *variable)
registers a cvar that already has the name, string, and optionally the archive elements set.
Definition cvar.c:599
static int(ZEXPORT *qz_inflate)(z_stream *strm
static int const char * version
Definition fs.c:479
skinframe_t * R_SkinFrame_LoadExternal(const char *name, int textureflags, qbool complain, qbool fallbacknotexture)
Definition gl_rmain.c:2314
skinframe_t * R_SkinFrame_LoadInternalBGRA(const char *name, int textureflags, const unsigned char *skindata, int width, int height, int comparewidth, int compareheight, int comparecrc, qbool sRGB)
Definition gl_rmain.c:2546
skinframe_t * R_SkinFrame_LoadMissing(void)
Definition gl_rmain.c:2804
cvar_t gl_texturecompression
Definition gl_textures.c:37
GLenum GLenum GLuint texture
Definition glquake.h:613
GLenum GLsizei width
Definition glquake.h:622
GLenum GLsizei GLsizei height
Definition glquake.h:622
GLuint buffer
Definition glquake.h:630
GLint GLenum GLint GLint y
Definition glquake.h:651
GLint GLenum GLint x
Definition glquake.h:651
GLint GLenum GLenum GLvoid * pixels
Definition glquake.h:706
const GLchar * name
Definition glquake.h:601
void Host_Error(const char *error,...)
Definition host.c:85
void Image_Copy8bitBGRA(const unsigned char *in, unsigned char *out, int pixels, const unsigned int *pal)
Definition image.c:129
#define max(A, B)
Definition mathlib.h:38
float sqrt(float f)
#define MATERIALFLAG_ADD
Definition model_brush.h:81
#define MATERIALFLAG_FULLBRIGHT
Definition model_brush.h:87
#define MATERIALFLAG_ALPHA
Definition model_brush.h:79
#define MATERIALFLAG_BLENDED
#define MATERIALFLAG_WALL
Definition model_brush.h:89
#define MATERIALFLAG_NOSHADOW
model_t * loadmodel
texture_shaderpass_t * Mod_CreateShaderPass(mempool_t *mempool, skinframe_t *skinframe)
synctype_t
@ ST_SYNC
@ mod_sprite
cvar_t r_overheadsprites_pushback
cvar_t r_mipsprites
cvar_t gl_texturecompression_sprites
Definition gl_textures.c:48
void Mod_IDSP_Load(model_t *mod, void *buffer, void *bufferend)
void Mod_SpriteInit(void)
cvar_t r_labelsprites_scale
cvar_t r_track_sprites
cvar_t r_track_sprites_flags
static void Mod_Sprite_SharedSetup(const unsigned char *datapointer, int version, const unsigned int *palette, qbool additive)
cvar_t r_track_sprites_scaleh
cvar_t r_track_sprites_scalew
cvar_t r_labelsprites_roundtopixels
static void Mod_SpriteSetupTexture(texture_t *texture, skinframe_t *skinframe, qbool fullbright, qbool additive)
cvar_t r_overheadsprites_scalex
void Mod_IDS2_Load(model_t *mod, void *buffer, void *bufferend)
cvar_t r_overheadsprites_perspective
cvar_t r_overheadsprites_scaley
unsigned int palette_bgra_transparent[256]
Definition palette.c:24
int i
#define MAX_QPATH
max length of a quake game pathname
Definition qdefs.h:169
#define NULL
Definition qtypes.h:12
bool qbool
Definition qtypes.h:9
@ TRANSPARENTSORT_DISTANCE
Definition r_qshader.h:194
@ OFFSETMAPPING_OFF
Definition r_qshader.h:185
void R_Model_Sprite_Draw(entity_render_t *ent)
Definition r_sprites.c:430
#define TEXF_PICMIP
Definition r_textures.h:21
#define TEXF_ALPHA
Definition r_textures.h:9
#define TEXF_MIPMAP
Definition r_textures.h:11
#define TEXF_ISSPRITE
Definition r_textures.h:35
#define TEXF_COMPRESS
Definition r_textures.h:23
#define TEXF_CLAMP
Definition r_textures.h:15
#define SPRITEHL_VERSION
Definition spritegn.h:49
#define SPRITE32_VERSION
Definition spritegn.h:50
#define SPRHL_ADDITIVE
Definition spritegn.h:106
#define SPRHL_OPAQUE
Definition spritegn.h:105
#define SPR_VP_PARALLEL
Definition spritegn.h:98
#define SPRITE_VERSION
Definition spritegn.h:48
#define SPRHL_INDEXALPHA
Definition spritegn.h:107
#define SPRHL_ALPHATEST
Definition spritegn.h:108
@ SPR_SINGLE
Definition spritegn.h:124
#define SPRITE2_VERSION
Definition spritegn.h:52
char name[32]
float framerate
cactive_t state
Definition client.h:568
Definition cvar.h:66
int integer
Definition cvar.h:73
dsprite2frame_t frames[1]
Definition spritegn.h:93
int version
Definition spritegn.h:91
int numframes
Definition spritegn.h:92
char name[64]
Definition spritegn.h:85
int version
Definition spritegn.h:57
int numframes
Definition spritegn.h:62
int synctype
Definition spritegn.h:64
int type
Definition spritegn.h:58
int origin[2]
Definition spritegn.h:111
spriteframetype_t type
Definition spritegn.h:127
int numframes
Definition spritegn.h:76
int version
Definition spritegn.h:70
int synctype
Definition spritegn.h:78
int rendermode
Definition spritegn.h:72
mspriteframe_t * sprdata_frames
float radius2
void(* DrawDepth)(struct entity_render_s *ent)
model_sprite_t sprite
modtype_t type
surfmesh_t surfmesh
vec3_t rotatedmins
vec3_t yawmaxs
vec3_t rotatedmaxs
void(* Draw)(struct entity_render_s *ent)
float radius
synctype_t synctype
vec3_t normalmaxs
animscene_t * animscenes
struct mempool_s * mempool
vec3_t yawmins
int numframes
char name[MAX_QPATH]
vec3_t normalmins
int num_textures
const char * modeldatatypestring
texture_t * data_textures
void(* DrawLight)(struct entity_render_s *ent, int numsurfaces, const int *surfacelist, const unsigned char *trispvs)
int num_texturesperskin
qbool hasalpha
Definition r_textures.h:153
qbool isanimated
#define Mem_Free(mem)
Definition zone.h:96
#define Mem_Alloc(pool, size)
Definition zone.h:92