Add cl_dyntexture.h and .c (don't need to be added to the makefile or vc project...
[divverent/darkplaces.git] / cl_dyntexture.c
1 // Andreas Kirsch 07\r
2 \r
3 #include "quakedef.h"\r
4 #include "cl_dyntexture.h"\r
5 \r
6 typedef struct dyntexture_s {\r
7         // everything after DYNAMIC_TEXTURE_PATH_PREFIX\r
8         char name[ MAX_QPATH + 32 ];\r
9         // texture pointer (points to r_texture_white at first)\r
10         rtexture_t *texture;\r
11 } dyntexture_t;\r
12 \r
13 static dyntexture_t dyntextures[ MAX_DYNAMIC_TEXTURE_COUNT ];\r
14 static unsigned dyntexturecount;\r
15 \r
16 #define DEFAULT_DYNTEXTURE r_texture_grey128\r
17 \r
18 static dyntexture_t * _CL_FindDynTexture( const char *name ) {\r
19         unsigned i;\r
20         dyntexture_t *dyntexture = NULL;\r
21         // some sanity checks - and make sure its actually a dynamic texture path\r
22         if( !name || strncmp( name, DYNAMIC_TEXTURE_PATH_PREFIX, sizeof( DYNAMIC_TEXTURE_PATH_PREFIX ) - 1 ) != 0 ) {\r
23                 return NULL;\r
24         }\r
25 \r
26         for( i = 0 ; i < dyntexturecount ; i++ ) {\r
27                 dyntexture = &dyntextures[ i ];\r
28                 if( dyntexture->name && strcmp( dyntexture->name, name ) == 0 ) {\r
29                         return dyntexture;\r
30                 }\r
31         }\r
32 \r
33         if( dyntexturecount == MAX_DYNAMIC_TEXTURE_COUNT ) {\r
34                 // TODO: warn or expand the array, etc.\r
35                 return NULL;\r
36         }\r
37         dyntexture = &dyntextures[ dyntexturecount++ ];\r
38         strlcpy( dyntexture->name, name, sizeof( dyntexture->name ) );\r
39         dyntexture->texture = DEFAULT_DYNTEXTURE;\r
40         return dyntexture;\r
41 }\r
42 \r
43 rtexture_t * CL_GetDynTexture( const char *name ) {\r
44         dyntexture_t *dyntexture = _CL_FindDynTexture( name );\r
45         if( dyntexture ) {\r
46                 return dyntexture->texture;\r
47         } else {\r
48                 return NULL;\r
49         }\r
50 }\r
51 \r
52 void CL_LinkDynTexture( const char *name, rtexture_t *texture ) {\r
53         dyntexture_t *dyntexture;\r
54         cachepic_t *cachepic;\r
55         skinframe_t *skinframe;\r
56 \r
57         dyntexture = _CL_FindDynTexture( name );\r
58         // TODO: assert dyntexture != NULL!\r
59         if( dyntexture->texture != texture ) {\r
60                 cachepic = Draw_CachePic( name, false );\r
61                 skinframe = R_SkinFrame_Find( name, 0, 0, 0, 0, false );\r
62                 // this is kind of hacky\r
63                 // TODO: assert cachepic and skinframe should be valid pointers...\r
64 \r
65                 // TODO: assert cachepic->tex = dyntexture->texture\r
66                 cachepic->tex = texture;\r
67                 // update cachepic's size, too\r
68                 cachepic->width = R_TextureWidth( texture );\r
69                 cachepic->height = R_TextureHeight( texture );\r
70                 // TODO: assert skinframe->base = dyntexture->texture\r
71                 skinframe->base = texture;\r
72                 // simply reset the compare* attributes of skinframe\r
73                 skinframe->comparecrc = 0;\r
74                 skinframe->comparewidth = skinframe->compareheight = 0;\r
75 \r
76                 dyntexture->texture = texture;\r
77         }\r
78 }\r
79 \r
80 void CL_UnlinkDynTexture( const char *name ) {\r
81         CL_LinkDynTexture( name, DEFAULT_DYNTEXTURE );\r
82 }\r
83 \r