X-Git-Url: http://git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=r_textures.h;h=cf2c0f3f3fb9974f5da2dd28b2ee6ae47c5ee65c;hp=8c59f72ff5c276bd3a202ca776b04919c316735d;hb=e9206d59c8cde436ea29daa46a587db08f73a111;hpb=be26fc71ecb2980b8a33ada15c06545cc5b52784 diff --git a/r_textures.h b/r_textures.h index 8c59f72f..cf2c0f3f 100644 --- a/r_textures.h +++ b/r_textures.h @@ -2,6 +2,9 @@ #ifndef R_TEXTURES_H #define R_TEXTURES_H +#include "qtypes.h" +#include "qdefs.h" + // transparent #define TEXF_ALPHA 0x00000001 // mipmapped @@ -33,10 +36,15 @@ // indicates the texture will be used as a render target (D3D hint) #define TEXF_RENDERTARGET 0x0010000 // used for checking if textures mismatch -#define TEXF_IMPORTANTBITS (TEXF_ALPHA | TEXF_MIPMAP | TEXF_RGBMULTIPLYBYALPHA | TEXF_CLAMP | TEXF_FORCENEAREST | TEXF_FORCELINEAR | TEXF_PICMIP | TEXF_COMPRESS | TEXF_COMPARE | TEXF_LOWPRECISION | TEXF_RENDERTARGET) +#define TEXF_IMPORTANTBITS (TEXF_ALPHA | TEXF_MIPMAP | TEXF_RGBMULTIPLYBYALPHA | TEXF_CLAMP | TEXF_FORCENEAREST | TEXF_FORCELINEAR | TEXF_PICMIP | TEXF_COMPARE | TEXF_LOWPRECISION | TEXF_RENDERTARGET) +// set as a flag to force the texture to be reloaded +#define TEXF_FORCE_RELOAD 0x80000000 typedef enum textype_e { + // placeholder for unused textures in r_rendertarget_t + TEXTYPE_UNUSED, + // 8bit paletted TEXTYPE_PALETTE, // 32bit RGBA @@ -54,6 +62,9 @@ typedef enum textype_e // 4x4 block compressed 15bit color plus 8bit alpha (8 bits per pixel) TEXTYPE_DXT5, + // default compressed type for GLES2 + TEXTYPE_ETC1, + // 8bit paletted in sRGB colorspace TEXTYPE_SRGB_PALETTE, // 32bit RGBA in sRGB colorspace @@ -75,45 +86,32 @@ typedef enum textype_e TEXTYPE_COLORBUFFER16F, // this represents an RGBA float texture (4 32bit floats) TEXTYPE_COLORBUFFER32F, - // 16bit D16 (16bit depth) or 32bit S8D24 (24bit depth, 8bit stencil unused) - TEXTYPE_SHADOWMAP + // depth-stencil buffer (or texture) + TEXTYPE_DEPTHBUFFER16, + // depth-stencil buffer (or texture) + TEXTYPE_DEPTHBUFFER24, + // 32bit D24S8 buffer (24bit depth, 8bit stencil), not supported on OpenGL ES + TEXTYPE_DEPTHBUFFER24STENCIL8, + // shadowmap-friendly format with depth comparison (not supported on some hardware) + TEXTYPE_SHADOWMAP16_COMP, + // shadowmap-friendly format with raw reading (not supported on some hardware) + TEXTYPE_SHADOWMAP16_RAW, + // shadowmap-friendly format with depth comparison (not supported on some hardware) + TEXTYPE_SHADOWMAP24_COMP, + // shadowmap-friendly format with raw reading (not supported on some hardware) + TEXTYPE_SHADOWMAP24_RAW, } textype_t; -/* -#ifdef WIN32 -#define SUPPORTD3D -#define SUPPORTDIRECTX -#ifdef SUPPORTD3D -#include -#endif -#endif -*/ - // contents of this structure are mostly private to gl_textures.c typedef struct rtexture_s { // this is exposed (rather than private) for speed reasons only - int texnum; - qboolean dirty; - int gltexturetypeenum; // exposed for use in R_Mesh_TexBind - // d3d stuff the backend needs - void *d3dtexture; -#ifdef SUPPORTD3D - qboolean d3disdepthsurface; // for depth/stencil surfaces - int d3dformat; - int d3dusage; - int d3dpool; - int d3daddressu; - int d3daddressv; - int d3daddressw; - int d3dmagfilter; - int d3dminfilter; - int d3dmipfilter; - int d3dmaxmiplevelfilter; - int d3dmipmaplodbias; - int d3dmaxmiplevel; -#endif + int texnum; // GL texture slot number + int renderbuffernum; // GL renderbuffer slot number + qbool dirty; // indicates that R_RealGetTexture should be called + qbool glisdepthstencil; // indicates that FBO attachment has to be GL_DEPTH_STENCIL_ATTACHMENT + int gltexturetypeenum; // used by R_Mesh_TexBind } rtexture_t; @@ -124,6 +122,49 @@ typedef struct rtexturepool_s } rtexturepool_t; +typedef struct skinframe_s +{ + struct rtexture_s *stain; // inverse modulate with background (used for decals and such) + struct rtexture_s *merged; // original texture without glow + struct rtexture_s *base; // original texture without pants/shirt/glow + struct rtexture_s *pants; // pants only (in greyscale) + struct rtexture_s *shirt; // shirt only (in greyscale) + struct rtexture_s *nmap; // normalmap (bumpmap for dot3) + struct rtexture_s *gloss; // glossmap (for dot3) + struct rtexture_s *glow; // glow only (fullbrights) + struct rtexture_s *fog; // alpha of the base texture (if not opaque) + struct rtexture_s *reflect; // colored mask for cubemap reflections + // accounting data for hash searches: + // the compare variables are used to identify internal skins from certain + // model formats + // (so that two q1bsp maps with the same texture name for different + // textures do not have any conflicts) + struct skinframe_s *next; // next on hash chain + char basename[MAX_QPATH]; // name of this + int textureflags; // texture flags to use + int comparewidth; + int compareheight; + int comparecrc; + // mark and sweep garbage collection, this value is updated to a new value + // on each level change for the used skinframes, if some are not used they + // are freed + unsigned int loadsequence; + // indicates whether this texture has transparent pixels + qbool hasalpha; + // average texture color, if applicable + float avgcolor[4]; + // for mdl skins, we actually only upload on first use (many are never used, and they are almost never used in both base+pants+shirt and merged modes) + unsigned char *qpixels; + int qwidth; + int qheight; + qbool qhascolormapping; + qbool qgeneratebase; + qbool qgeneratemerged; + qbool qgeneratenmap; + qbool qgenerateglow; +} +skinframe_t; + typedef void (*updatecallback_t)(rtexture_t *rt, void *data); // allocate a texture pool, to be used with R_LoadTexture @@ -132,19 +173,19 @@ rtexturepool_t *R_AllocTexturePool(void); void R_FreeTexturePool(rtexturepool_t **rtexturepool); // the color/normal/etc cvars should be checked by callers of R_LoadTexture* functions to decide whether to add TEXF_COMPRESS to the flags -extern cvar_t gl_texturecompression; -extern cvar_t gl_texturecompression_color; -extern cvar_t gl_texturecompression_normal; -extern cvar_t gl_texturecompression_gloss; -extern cvar_t gl_texturecompression_glow; -extern cvar_t gl_texturecompression_2d; -extern cvar_t gl_texturecompression_q3bsplightmaps; -extern cvar_t gl_texturecompression_q3bspdeluxemaps; -extern cvar_t gl_texturecompression_sky; -extern cvar_t gl_texturecompression_lightcubemaps; -extern cvar_t gl_texturecompression_reflectmask; -extern cvar_t r_texture_dds_load; -extern cvar_t r_texture_dds_save; +extern struct cvar_s gl_texturecompression; +extern struct cvar_s gl_texturecompression_color; +extern struct cvar_s gl_texturecompression_normal; +extern struct cvar_s gl_texturecompression_gloss; +extern struct cvar_s gl_texturecompression_glow; +extern struct cvar_s gl_texturecompression_2d; +extern struct cvar_s gl_texturecompression_q3bsplightmaps; +extern struct cvar_s gl_texturecompression_q3bspdeluxemaps; +extern struct cvar_s gl_texturecompression_sky; +extern struct cvar_s gl_texturecompression_lightcubemaps; +extern struct cvar_s gl_texturecompression_reflectmask; +extern struct cvar_s r_texture_dds_load; +extern struct cvar_s r_texture_dds_save; // add a texture to a pool and optionally precache (upload) it // (note: data == NULL is perfectly acceptable) @@ -152,11 +193,12 @@ extern cvar_t r_texture_dds_save; rtexture_t *R_LoadTexture2D(rtexturepool_t *rtexturepool, const char *identifier, int width, int height, const unsigned char *data, textype_t textype, int flags, int miplevel, const unsigned int *palette); rtexture_t *R_LoadTexture3D(rtexturepool_t *rtexturepool, const char *identifier, int width, int height, int depth, const unsigned char *data, textype_t textype, int flags, int miplevel, const unsigned int *palette); rtexture_t *R_LoadTextureCubeMap(rtexturepool_t *rtexturepool, const char *identifier, int width, const unsigned char *data, textype_t textype, int flags, int miplevel, const unsigned int *palette); -rtexture_t *R_LoadTextureShadowMap2D(rtexturepool_t *rtexturepool, const char *identifier, int width, int height, int precision, qboolean filter); -rtexture_t *R_LoadTextureDDSFile(rtexturepool_t *rtexturepool, const char *filename, int flags, qboolean *hasalphaflag, float *avgcolor, int miplevel); +rtexture_t *R_LoadTextureShadowMap2D(rtexturepool_t *rtexturepool, const char *identifier, int width, int height, textype_t textype, qbool filter); +rtexture_t *R_LoadTextureRenderBuffer(rtexturepool_t *rtexturepool, const char *identifier, int width, int height, textype_t textype); +rtexture_t *R_LoadTextureDDSFile(rtexturepool_t *rtexturepool, const char *filename, qbool srgb, int flags, qbool *hasalphaflag, float *avgcolor, int miplevel, qbool optionaltexture); // saves a texture to a DDS file -int R_SaveTextureDDSFile(rtexture_t *rt, const char *filename, qboolean skipuncompressed, qboolean hasalpha); +int R_SaveTextureDDSFile(rtexture_t *rt, const char *filename, qbool skipuncompressed, qbool hasalpha); // free a texture void R_FreeTexture(rtexture_t *rt); @@ -164,7 +206,8 @@ void R_FreeTexture(rtexture_t *rt); // update a portion of the image data of a texture, used by lightmap updates // and procedural textures such as video playback, actual uploads may be // delayed by gl_nopartialtextureupdates cvar until R_Mesh_TexBind uses it -void R_UpdateTexture(rtexture_t *rt, const unsigned char *data, int x, int y, int z, int width, int height, int depth); +// combine has 3 values: 0 = immediately upload (glTexSubImage2D), 1 = combine with other updates (glTexSubImage2D on next draw), 2 = combine with other updates and never upload partial images (glTexImage2D on next draw) +void R_UpdateTexture(rtexture_t *rt, const unsigned char *data, int x, int y, int z, int width, int height, int depth, int combine); // returns the renderer dependent texture slot number (call this before each // use, as a texture might not have been precached) @@ -177,6 +220,9 @@ int R_TextureWidth(rtexture_t *rt); // returns height of texture, as was specified when it was uploaded int R_TextureHeight(rtexture_t *rt); +// returns flags of texture, as was specified when it was uploaded +int R_TextureFlags(rtexture_t *rt); + // only frees the texture if TEXF_PERSISTENT is not set // also resets the variable void R_PurgeTexture(rtexture_t *prt); @@ -194,5 +240,7 @@ void R_ClearTexture (rtexture_t *rt); // returns the desired picmip level for given TEXF_ flags int R_PicmipForFlags(int flags); +void R_TextureStats_Print(qbool printeach, qbool printpool, qbool printtotal); + #endif