DarkPlaces
Game engine based on the Quake 1 engine by id Software, developed by LadyHavoc
 
model_sprite.c File Reference
#include "quakedef.h"
#include "image.h"
+ Include dependency graph for model_sprite.c:

Go to the source code of this file.

Functions

void Mod_IDS2_Load (model_t *mod, void *buffer, void *bufferend)
 
void Mod_IDSP_Load (model_t *mod, void *buffer, void *bufferend)
 
static void Mod_Sprite_SharedSetup (const unsigned char *datapointer, int version, const unsigned int *palette, qbool additive)
 
void Mod_SpriteInit (void)
 
static void Mod_SpriteSetupTexture (texture_t *texture, skinframe_t *skinframe, qbool fullbright, qbool additive)
 

Variables

cvar_t gl_texturecompression_sprites
 
cvar_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"}
 
cvar_t r_labelsprites_scale = {CF_CLIENT | CF_ARCHIVE, "r_labelsprites_scale", "1", "global scale to apply to label sprites before conversion to HUD coordinates"}
 
cvar_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"}
 
cvar_t r_overheadsprites_perspective = {CF_CLIENT | CF_ARCHIVE, "r_overheadsprites_perspective", "5", "fake perspective effect for SPR_OVERHEAD sprites"}
 
cvar_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)"}
 
cvar_t r_overheadsprites_scalex = {CF_CLIENT | CF_ARCHIVE, "r_overheadsprites_scalex", "1", "additional scale for overhead sprites for x axis"}
 
cvar_t r_overheadsprites_scaley = {CF_CLIENT | CF_ARCHIVE, "r_overheadsprites_scaley", "1", "additional scale for overhead sprites for y axis"}
 
cvar_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"}
 
cvar_t r_track_sprites_flags = {CF_CLIENT | CF_ARCHIVE, "r_track_sprites_flags", "1", "1: Rotate sprites accordingly, 2: Make it a continuous rotation"}
 
cvar_t r_track_sprites_scaleh = {CF_CLIENT | CF_ARCHIVE, "r_track_sprites_scaleh", "1", "height scaling of tracked sprites"}
 
cvar_t r_track_sprites_scalew = {CF_CLIENT | CF_ARCHIVE, "r_track_sprites_scalew", "1", "width scaling of tracked sprites"}
 

Function Documentation

◆ Mod_IDS2_Load()

void Mod_IDS2_Load ( model_t * mod,
void * buffer,
void * bufferend )

Definition at line 378 of file model_sprite.c.

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}
client_static_t cls
Definition cl_main.c:116
@ ca_dedicated
Definition client.h:530
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
void Con_Printf(const char *fmt,...)
Prints to all appropriate console targets.
Definition console.c:1514
#define CON_ERROR
Definition console.h:102
vector origin
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_LoadMissing(void)
Definition gl_rmain.c:2804
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
void Host_Error(const char *error,...)
Definition host.c:85
#define max(A, B)
Definition mathlib.h:38
float sqrt(float f)
model_t * loadmodel
@ ST_SYNC
@ mod_sprite
cvar_t r_mipsprites
static void Mod_SpriteSetupTexture(texture_t *texture, skinframe_t *skinframe, qbool fullbright, qbool additive)
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
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 SPR_VP_PARALLEL
Definition spritegn.h:98
#define SPRITE2_VERSION
Definition spritegn.h:52
char name[32]
float framerate
cactive_t state
Definition client.h:568
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
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 isanimated
#define Mem_Alloc(pool, size)
Definition zone.h:92

References model_t::animscenes, buffer, ca_dedicated, cls, CON_ERROR, Con_Printf(), model_t::data_textures, mspriteframe_t::down, dpsnprintf(), model_t::Draw, model_t::DrawDepth, model_t::DrawLight, animscene_t::firstframe, animscene_t::framecount, animscene_t::framerate, dsprite2_t::frames, dsprite2frame_t::height, height, Host_Error(), i, int(), cvar_t::integer, surfmesh_t::isanimated, mspriteframe_t::left, LittleLong, loadmodel, animscene_t::loop, max, MAX_QPATH, Mem_Alloc, model_t::mempool, mod_sprite, Mod_SpriteSetupTexture(), model_t::modeldatatypestring, animscene_t::name, dsprite2frame_t::name, model_t::name, model_t::normalmaxs, model_t::normalmins, NULL, model_t::num_textures, model_t::num_texturesperskin, dsprite2_t::numframes, model_t::numframes, origin, dsprite2frame_t::origin_x, dsprite2frame_t::origin_y, r_mipsprites, R_Model_Sprite_Draw(), R_SkinFrame_LoadExternal(), R_SkinFrame_LoadMissing(), model_t::radius, model_t::radius2, mspriteframe_t::right, model_t::rotatedmaxs, model_t::rotatedmins, SPR_VP_PARALLEL, model_sprite_t::sprdata_frames, model_t::sprite, SPRITE2_VERSION, model_sprite_t::sprnum_type, sqrt(), ST_SYNC, client_static_t::state, model_t::surfmesh, model_t::synctype, TEXF_ALPHA, TEXF_CLAMP, TEXF_COMPRESS, TEXF_ISSPRITE, TEXF_MIPMAP, TEXF_PICMIP, model_t::type, mspriteframe_t::up, dsprite2_t::version, version, dsprite2frame_t::width, width, x, y, model_t::yawmaxs, and model_t::yawmins.

◆ Mod_IDSP_Load()

void Mod_IDSP_Load ( model_t * mod,
void * buffer,
void * bufferend )

Definition at line 267 of file model_sprite.c.

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}
synctype_t
static void Mod_Sprite_SharedSetup(const unsigned char *datapointer, int version, const unsigned int *palette, qbool additive)
#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 SPRITE_VERSION
Definition spritegn.h:48
#define SPRHL_INDEXALPHA
Definition spritegn.h:107
#define SPRHL_ALPHATEST
Definition spritegn.h:108
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 numframes
Definition spritegn.h:76
int version
Definition spritegn.h:70
int synctype
Definition spritegn.h:78
int rendermode
Definition spritegn.h:72

References model_t::animscenes, buffer, model_t::Draw, model_t::DrawDepth, model_t::DrawLight, animscene_t::framecount, Host_Error(), i, surfmesh_t::isanimated, LittleLong, loadmodel, mod_sprite, Mod_Sprite_SharedSetup(), model_t::modeldatatypestring, model_t::name, NULL, dsprite_t::numframes, dspritehl_t::numframes, model_t::numframes, R_Model_Sprite_Draw(), dspritehl_t::rendermode, SPRHL_ADDITIVE, SPRHL_ALPHATEST, SPRHL_INDEXALPHA, SPRHL_OPAQUE, model_t::sprite, SPRITE32_VERSION, SPRITE_VERSION, SPRITEHL_VERSION, model_sprite_t::sprnum_type, model_t::surfmesh, dsprite_t::synctype, dspritehl_t::synctype, model_t::synctype, dsprite_t::type, dspritehl_t::type, model_t::type, dsprite_t::version, dspritehl_t::version, and version.

◆ Mod_Sprite_SharedSetup()

static void Mod_Sprite_SharedSetup ( const unsigned char * datapointer,
int version,
const unsigned int * palette,
qbool additive )
static

Definition at line 91 of file model_sprite.c.

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}
#define LittleFloat(l)
Definition common.h:94
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
cvar_t gl_texturecompression
Definition gl_textures.c:37
GLint GLenum GLenum GLvoid * pixels
Definition glquake.h:706
const GLchar * name
Definition glquake.h:601
void Image_Copy8bitBGRA(const unsigned char *in, unsigned char *out, int pixels, const unsigned int *pal)
Definition image.c:129
cvar_t gl_texturecompression_sprites
Definition gl_textures.c:48
unsigned int palette_bgra_transparent[256]
Definition palette.c:24
@ SPR_SINGLE
Definition spritegn.h:124
int origin[2]
Definition spritegn.h:111
spriteframetype_t type
Definition spritegn.h:127
#define Mem_Free(mem)
Definition zone.h:96

References model_t::animscenes, ca_dedicated, cls, model_t::data_textures, mspriteframe_t::down, dpsnprintf(), animscene_t::firstframe, animscene_t::framecount, animscene_t::framerate, gl_texturecompression, gl_texturecompression_sprites, dspriteframe_t::height, height, Host_Error(), i, Image_Copy8bitBGRA(), int(), cvar_t::integer, dspriteinterval_t::interval, mspriteframe_t::left, LittleFloat, LittleLong, loadmodel, animscene_t::loop, max, MAX_QPATH, Mem_Alloc, Mem_Free, model_t::mempool, Mod_SpriteSetupTexture(), animscene_t::name, model_t::name, name, model_t::normalmaxs, model_t::normalmins, NULL, model_t::num_textures, model_t::num_texturesperskin, dspritegroup_t::numframes, model_t::numframes, dspriteframe_t::origin, origin, palette_bgra_transparent, pixels, r_mipsprites, R_SkinFrame_LoadExternal(), R_SkinFrame_LoadInternalBGRA(), R_SkinFrame_LoadMissing(), model_t::radius, model_t::radius2, mspriteframe_t::right, model_t::rotatedmaxs, model_t::rotatedmins, SPR_SINGLE, model_sprite_t::sprdata_frames, model_t::sprite, SPRITE32_VERSION, sqrt(), client_static_t::state, TEXF_ALPHA, TEXF_CLAMP, TEXF_COMPRESS, TEXF_ISSPRITE, TEXF_MIPMAP, TEXF_PICMIP, dspriteframetype_t::type, mspriteframe_t::up, version, dspriteframe_t::width, width, x, y, model_t::yawmaxs, and model_t::yawmins.

Referenced by Mod_IDSP_Load().

◆ Mod_SpriteInit()

void Mod_SpriteInit ( void )

Definition at line 45 of file model_sprite.c.

46{
58}
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
cvar_t r_overheadsprites_pushback
cvar_t r_labelsprites_scale
cvar_t r_track_sprites
cvar_t r_track_sprites_flags
cvar_t r_track_sprites_scaleh
cvar_t r_track_sprites_scalew
cvar_t r_labelsprites_roundtopixels
cvar_t r_overheadsprites_scalex
cvar_t r_overheadsprites_perspective
cvar_t r_overheadsprites_scaley

References Cvar_RegisterVariable(), r_labelsprites_roundtopixels, r_labelsprites_scale, r_mipsprites, r_overheadsprites_perspective, r_overheadsprites_pushback, r_overheadsprites_scalex, r_overheadsprites_scaley, r_track_sprites, r_track_sprites_flags, r_track_sprites_scaleh, and r_track_sprites_scalew.

Referenced by Mod_Init().

◆ Mod_SpriteSetupTexture()

static void Mod_SpriteSetupTexture ( texture_t * texture,
skinframe_t * skinframe,
qbool fullbright,
qbool additive )
static

Definition at line 60 of file model_sprite.c.

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}
#define SUPERCONTENTS_OPAQUE
Definition bspfile.h:208
#define SUPERCONTENTS_SOLID
Definition bspfile.h:196
GLenum GLenum GLuint texture
Definition glquake.h:613
#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
texture_shaderpass_t * Mod_CreateShaderPass(mempool_t *mempool, skinframe_t *skinframe)
@ TRANSPARENTSORT_DISTANCE
Definition r_qshader.h:194
@ OFFSETMAPPING_OFF
Definition r_qshader.h:185
qbool hasalpha
Definition r_textures.h:153

References skinframe_t::hasalpha, loadmodel, MATERIALFLAG_ADD, MATERIALFLAG_ALPHA, MATERIALFLAG_BLENDED, MATERIALFLAG_FULLBRIGHT, MATERIALFLAG_NOSHADOW, MATERIALFLAG_WALL, model_t::mempool, Mod_CreateShaderPass(), OFFSETMAPPING_OFF, R_SkinFrame_LoadMissing(), SUPERCONTENTS_OPAQUE, SUPERCONTENTS_SOLID, texture, and TRANSPARENTSORT_DISTANCE.

Referenced by Mod_IDS2_Load(), and Mod_Sprite_SharedSetup().

Variable Documentation

◆ gl_texturecompression_sprites

cvar_t gl_texturecompression_sprites
extern

Definition at line 48 of file gl_textures.c.

48{CF_CLIENT | CF_ARCHIVE, "gl_texturecompression_sprites", "1", "whether to compress sprites"};
#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

Referenced by Mod_Sprite_SharedSetup(), and R_Textures_Init().

◆ r_labelsprites_roundtopixels

cvar_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"}

Definition at line 30 of file model_sprite.c.

30{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"};

Referenced by Mod_SpriteInit(), and R_Model_Sprite_Draw_TransparentCallback().

◆ r_labelsprites_scale

cvar_t r_labelsprites_scale = {CF_CLIENT | CF_ARCHIVE, "r_labelsprites_scale", "1", "global scale to apply to label sprites before conversion to HUD coordinates"}

Definition at line 29 of file model_sprite.c.

29{CF_CLIENT | CF_ARCHIVE, "r_labelsprites_scale", "1", "global scale to apply to label sprites before conversion to HUD coordinates"};

Referenced by Mod_SpriteInit(), and R_Model_Sprite_Draw_TransparentCallback().

◆ r_mipsprites

cvar_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"}

Definition at line 28 of file model_sprite.c.

28{CF_CLIENT | CF_ARCHIVE, "r_mipsprites", "1", "mipmaps sprites so they render faster in the distance and do not display noise artifacts"};

Referenced by Mod_IDS2_Load(), Mod_Sprite_SharedSetup(), and Mod_SpriteInit().

◆ r_overheadsprites_perspective

cvar_t r_overheadsprites_perspective = {CF_CLIENT | CF_ARCHIVE, "r_overheadsprites_perspective", "5", "fake perspective effect for SPR_OVERHEAD sprites"}

Definition at line 31 of file model_sprite.c.

31{CF_CLIENT | CF_ARCHIVE, "r_overheadsprites_perspective", "5", "fake perspective effect for SPR_OVERHEAD sprites"};

Referenced by Mod_SpriteInit(), and R_Model_Sprite_Draw_TransparentCallback().

◆ r_overheadsprites_pushback

cvar_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)"}

Definition at line 32 of file model_sprite.c.

32{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)"};

Referenced by CL_UpdateEntityShading_Entity(), Mod_SpriteInit(), and R_Model_Sprite_Draw_TransparentCallback().

◆ r_overheadsprites_scalex

cvar_t r_overheadsprites_scalex = {CF_CLIENT | CF_ARCHIVE, "r_overheadsprites_scalex", "1", "additional scale for overhead sprites for x axis"}

Definition at line 33 of file model_sprite.c.

33{CF_CLIENT | CF_ARCHIVE, "r_overheadsprites_scalex", "1", "additional scale for overhead sprites for x axis"};

Referenced by Mod_SpriteInit(), and R_Model_Sprite_Draw_TransparentCallback().

◆ r_overheadsprites_scaley

cvar_t r_overheadsprites_scaley = {CF_CLIENT | CF_ARCHIVE, "r_overheadsprites_scaley", "1", "additional scale for overhead sprites for y axis"}

Definition at line 34 of file model_sprite.c.

34{CF_CLIENT | CF_ARCHIVE, "r_overheadsprites_scaley", "1", "additional scale for overhead sprites for y axis"};

Referenced by Mod_SpriteInit(), and R_Model_Sprite_Draw_TransparentCallback().

◆ r_track_sprites

cvar_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"}

Definition at line 35 of file model_sprite.c.

35{CF_CLIENT | CF_ARCHIVE, "r_track_sprites", "1", "track SPR_LABEL* sprites by putting them as indicator at the screen border to rotate to"};

Referenced by Mod_SpriteInit(), and R_Model_Sprite_Draw_TransparentCallback().

◆ r_track_sprites_flags

cvar_t r_track_sprites_flags = {CF_CLIENT | CF_ARCHIVE, "r_track_sprites_flags", "1", "1: Rotate sprites accordingly, 2: Make it a continuous rotation"}

Definition at line 36 of file model_sprite.c.

36{CF_CLIENT | CF_ARCHIVE, "r_track_sprites_flags", "1", "1: Rotate sprites accordingly, 2: Make it a continuous rotation"};

Referenced by Mod_SpriteInit(), R_RotateSprite(), and R_TrackSprite().

◆ r_track_sprites_scaleh

cvar_t r_track_sprites_scaleh = {CF_CLIENT | CF_ARCHIVE, "r_track_sprites_scaleh", "1", "height scaling of tracked sprites"}

Definition at line 38 of file model_sprite.c.

38{CF_CLIENT | CF_ARCHIVE, "r_track_sprites_scaleh", "1", "height scaling of tracked sprites"};

Referenced by Mod_SpriteInit(), and R_TrackSprite().

◆ r_track_sprites_scalew

cvar_t r_track_sprites_scalew = {CF_CLIENT | CF_ARCHIVE, "r_track_sprites_scalew", "1", "width scaling of tracked sprites"}

Definition at line 37 of file model_sprite.c.

37{CF_CLIENT | CF_ARCHIVE, "r_track_sprites_scalew", "1", "width scaling of tracked sprites"};

Referenced by Mod_SpriteInit(), and R_TrackSprite().