X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=render.h;h=538ab505f60a49024ade81b31756740bd4fbaf24;hb=17f95319455e01172cfdd806c8b7bc97064203fc;hp=d567b5425312fae24d9ecdba388197c297e7ec83;hpb=39017f0c52fcb627489fefa55112a0497d07b6e6;p=xonotic%2Fdarkplaces.git diff --git a/render.h b/render.h index d567b542..538ab505 100644 --- a/render.h +++ b/render.h @@ -166,16 +166,45 @@ int R_CullBoxCustomPlanes(const vec3_t mins, const vec3_t maxs, int numplanes, c #include "meshqueue.h" +/// free all R_FrameData memory void R_FrameData_Reset(void); +/// prepare for a new frame, recycles old buffers if a resize occurred previously void R_FrameData_NewFrame(void); +/// allocate some temporary memory for your purposes void *R_FrameData_Alloc(size_t size); +/// allocate some temporary memory and copy this data into it void *R_FrameData_Store(size_t size, void *data); +/// set a marker that allows you to discard the following temporary memory allocations void R_FrameData_SetMark(void); +/// discard recent memory allocations (rewind to marker) void R_FrameData_ReturnToMark(void); +/// enum of the various types of hardware buffer object used in rendering +/// note that the r_bufferdatasize[] array must be maintained to match this +typedef enum r_bufferdata_type_e +{ + R_BUFFERDATA_VERTEX, /// vertex buffer + R_BUFFERDATA_INDEX16, /// index buffer - 16bit (because D3D cares) + R_BUFFERDATA_INDEX32, /// index buffer - 32bit (because D3D cares) + R_BUFFERDATA_UNIFORM, /// uniform buffer + R_BUFFERDATA_COUNT /// how many kinds of buffer we have +} +r_bufferdata_type_t; + +/// free all dynamic vertex/index/uniform buffers +void R_BufferData_Reset(void); +/// begin a new frame (recycle old buffers) +void R_BufferData_NewFrame(void); +/// request space in a vertex/index/uniform buffer for the chosen data, returns the buffer pointer and offset, if allowfail is true it may return NULL if the growth limit has been reached, false will cause it to allocate additional memory despite this (warning: may run out of memory) +r_meshbuffer_t *R_BufferData_Store(size_t size, void *data, r_bufferdata_type_t type, int *returnbufferoffset, qboolean allowfail); + +/// free all R_AnimCache memory void R_AnimCache_Free(void); +/// clear the animcache pointers on all known render entities void R_AnimCache_ClearCache(void); +/// get the skeletal data or cached animated mesh data for an entity (optionally with normals and tangents) qboolean R_AnimCache_GetEntity(entity_render_t *ent, qboolean wantnormals, qboolean wanttangents); +/// generate animcache data for all entities marked visible void R_AnimCache_CacheVisibleEntities(void); #include "r_lerpanim.h" @@ -253,42 +282,45 @@ typedef struct rsurfacestate_s // variables int entityskeletalnumtransforms; // how many transforms are used for this mesh float *entityskeletaltransform3x4; // use gpu-skinning shader on this mesh + const r_meshbuffer_t *entityskeletaltransform3x4buffer; // uniform buffer + int entityskeletaltransform3x4offset; + int entityskeletaltransform3x4size; float *modelvertex3f; const r_meshbuffer_t *modelvertex3f_vertexbuffer; - size_t modelvertex3f_bufferoffset; + int modelvertex3f_bufferoffset; float *modelsvector3f; const r_meshbuffer_t *modelsvector3f_vertexbuffer; - size_t modelsvector3f_bufferoffset; + int modelsvector3f_bufferoffset; float *modeltvector3f; const r_meshbuffer_t *modeltvector3f_vertexbuffer; - size_t modeltvector3f_bufferoffset; + int modeltvector3f_bufferoffset; float *modelnormal3f; const r_meshbuffer_t *modelnormal3f_vertexbuffer; - size_t modelnormal3f_bufferoffset; + int modelnormal3f_bufferoffset; float *modellightmapcolor4f; const r_meshbuffer_t *modellightmapcolor4f_vertexbuffer; - size_t modellightmapcolor4f_bufferoffset; + int modellightmapcolor4f_bufferoffset; float *modeltexcoordtexture2f; const r_meshbuffer_t *modeltexcoordtexture2f_vertexbuffer; - size_t modeltexcoordtexture2f_bufferoffset; + int modeltexcoordtexture2f_bufferoffset; float *modeltexcoordlightmap2f; const r_meshbuffer_t *modeltexcoordlightmap2f_vertexbuffer; - size_t modeltexcoordlightmap2f_bufferoffset; + int modeltexcoordlightmap2f_bufferoffset; unsigned char *modelskeletalindex4ub; const r_meshbuffer_t *modelskeletalindex4ub_vertexbuffer; - size_t modelskeletalindex4ub_bufferoffset; + int modelskeletalindex4ub_bufferoffset; unsigned char *modelskeletalweight4ub; const r_meshbuffer_t *modelskeletalweight4ub_vertexbuffer; - size_t modelskeletalweight4ub_bufferoffset; + int modelskeletalweight4ub_bufferoffset; r_vertexmesh_t *modelvertexmesh; - const r_meshbuffer_t *modelvertexmeshbuffer; - const r_meshbuffer_t *modelvertex3fbuffer; + const r_meshbuffer_t *modelvertexmesh_vertexbuffer; + int modelvertexmesh_bufferoffset; int *modelelement3i; const r_meshbuffer_t *modelelement3i_indexbuffer; - size_t modelelement3i_bufferoffset; + int modelelement3i_bufferoffset; unsigned short *modelelement3s; const r_meshbuffer_t *modelelement3s_indexbuffer; - size_t modelelement3s_bufferoffset; + int modelelement3s_bufferoffset; int *modellightmapoffsets; int modelnumvertices; int modelnumtriangles; @@ -308,47 +340,50 @@ typedef struct rsurfacestate_s int batchfirsttriangle; int batchnumtriangles; r_vertexmesh_t *batchvertexmesh; - const r_meshbuffer_t *batchvertexmeshbuffer; - const r_meshbuffer_t *batchvertex3fbuffer; + const r_meshbuffer_t *batchvertexmesh_vertexbuffer; + int batchvertexmesh_bufferoffset; float *batchvertex3f; const r_meshbuffer_t *batchvertex3f_vertexbuffer; - size_t batchvertex3f_bufferoffset; + int batchvertex3f_bufferoffset; float *batchsvector3f; const r_meshbuffer_t *batchsvector3f_vertexbuffer; - size_t batchsvector3f_bufferoffset; + int batchsvector3f_bufferoffset; float *batchtvector3f; const r_meshbuffer_t *batchtvector3f_vertexbuffer; - size_t batchtvector3f_bufferoffset; + int batchtvector3f_bufferoffset; float *batchnormal3f; const r_meshbuffer_t *batchnormal3f_vertexbuffer; - size_t batchnormal3f_bufferoffset; + int batchnormal3f_bufferoffset; float *batchlightmapcolor4f; const r_meshbuffer_t *batchlightmapcolor4f_vertexbuffer; - size_t batchlightmapcolor4f_bufferoffset; + int batchlightmapcolor4f_bufferoffset; float *batchtexcoordtexture2f; const r_meshbuffer_t *batchtexcoordtexture2f_vertexbuffer; - size_t batchtexcoordtexture2f_bufferoffset; + int batchtexcoordtexture2f_bufferoffset; float *batchtexcoordlightmap2f; const r_meshbuffer_t *batchtexcoordlightmap2f_vertexbuffer; - size_t batchtexcoordlightmap2f_bufferoffset; + int batchtexcoordlightmap2f_bufferoffset; unsigned char *batchskeletalindex4ub; const r_meshbuffer_t *batchskeletalindex4ub_vertexbuffer; - size_t batchskeletalindex4ub_bufferoffset; + int batchskeletalindex4ub_bufferoffset; unsigned char *batchskeletalweight4ub; const r_meshbuffer_t *batchskeletalweight4ub_vertexbuffer; - size_t batchskeletalweight4ub_bufferoffset; + int batchskeletalweight4ub_bufferoffset; int *batchelement3i; const r_meshbuffer_t *batchelement3i_indexbuffer; - size_t batchelement3i_bufferoffset; + int batchelement3i_bufferoffset; unsigned short *batchelement3s; const r_meshbuffer_t *batchelement3s_indexbuffer; - size_t batchelement3s_bufferoffset; + int batchelement3s_bufferoffset; int batchskeletalnumtransforms; float *batchskeletaltransform3x4; + const r_meshbuffer_t *batchskeletaltransform3x4buffer; // uniform buffer + int batchskeletaltransform3x4offset; + int batchskeletaltransform3x4size; // rendering pass processing arrays in GL11 and GL13 paths float *passcolor4f; const r_meshbuffer_t *passcolor4f_vertexbuffer; - size_t passcolor4f_bufferoffset; + int passcolor4f_bufferoffset; // some important fields from the entity int ent_skinnum;