4 #include "cl_dyntexture.h"
6 typedef struct dyntexture_s {
7 // everything after DYNAMIC_TEXTURE_PATH_PREFIX
8 char name[ MAX_QPATH + 32 ];
9 // texture pointer (points to r_texture_white at first)
13 static dyntexture_t dyntextures[ MAX_DYNAMIC_TEXTURE_COUNT ];
14 static unsigned dyntexturecount;
16 #define DEFAULT_DYNTEXTURE r_texture_grey128
18 static dyntexture_t * cl_finddyntexture( const char *name, qboolean warnonfailure ) {
20 dyntexture_t *dyntexture = NULL;
22 // sanity checks - make sure its actually a dynamic texture path
23 if( !name || !*name || strncmp( name, CLDYNTEXTUREPREFIX, sizeof( CLDYNTEXTUREPREFIX ) - 1 ) != 0 ) {
24 // TODO: print a warning or something
26 Con_Printf( "cl_finddyntexture: Bad dynamic texture name '%s'\n", name );
30 for( i = 0 ; i < dyntexturecount ; i++ ) {
31 dyntexture = &dyntextures[ i ];
32 if( dyntexture->name && strcmp( dyntexture->name, name ) == 0 ) {
37 if( dyntexturecount == MAX_DYNAMIC_TEXTURE_COUNT ) {
38 // TODO: warn or expand the array, etc.
41 dyntexture = &dyntextures[ dyntexturecount++ ];
42 strlcpy( dyntexture->name, name, sizeof( dyntexture->name ) );
43 dyntexture->texture = DEFAULT_DYNTEXTURE;
47 rtexture_t * CL_GetDynTexture( const char *name ) {
48 dyntexture_t *dyntexture = cl_finddyntexture( name, false );
50 return dyntexture->texture;
56 void CL_LinkDynTexture( const char *name, rtexture_t *texture ) {
57 dyntexture_t *dyntexture;
59 skinframe_t *skinframe;
61 dyntexture = cl_finddyntexture( name, true );
63 Con_Printf( "CL_LinkDynTexture: internal error in cl_finddyntexture!\n" );
66 // TODO: assert dyntexture != NULL!
67 if( dyntexture->texture != texture ) {
68 dyntexture->texture = texture;
70 cachepic = Draw_CachePic_Flags( name, CACHEPICFLAG_NOTPERSISTENT );
71 // TODO: assert cachepic and skinframe should be valid pointers...
72 // TODO: assert cachepic->tex = dyntexture->texture
73 cachepic->tex = texture;
74 // update cachepic's size, too
75 cachepic->width = R_TextureWidth( texture );
76 cachepic->height = R_TextureHeight( texture );
80 while( (skinframe = R_SkinFrame_FindNextByName( skinframe, name )) != NULL ) {
81 skinframe->base = texture;
82 // simply reset the compare* attributes of skinframe
83 skinframe->comparecrc = 0;
84 skinframe->comparewidth = skinframe->compareheight = 0;
85 // this is kind of hacky
90 void CL_UnlinkDynTexture( const char *name ) {
91 CL_LinkDynTexture( name, DEFAULT_DYNTEXTURE );