diff options
Diffstat (limited to 'source/blender/gpu/GPU_buffers.h')
-rw-r--r-- | source/blender/gpu/GPU_buffers.h | 141 |
1 files changed, 67 insertions, 74 deletions
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h index 7ce166d92bd..6cee9e95cf6 100644 --- a/source/blender/gpu/GPU_buffers.h +++ b/source/blender/gpu/GPU_buffers.h @@ -37,8 +37,6 @@ #ifndef __GPU_BUFFERS_H__ #define __GPU_BUFFERS_H__ -#define MAX_FREE_GPU_BUFFERS 8 - #ifdef _DEBUG /*#define DEBUG_VBO(X) printf(X)*/ #define DEBUG_VBO(X) @@ -46,112 +44,92 @@ #define DEBUG_VBO(X) #endif -#ifdef _DEBUG -#define ERROR_VBO(X) printf(X) -#else -#define ERROR_VBO(X) -#endif - struct DerivedMesh; struct DMGridData; struct GHash; struct DMGridData; +struct GPUVertPointLink; -/* V - vertex, N - normal, T - uv, C - color - F - float, UB - unsigned byte */ -#define GPU_BUFFER_INTER_V3F 1 -#define GPU_BUFFER_INTER_N3F 2 -#define GPU_BUFFER_INTER_T2F 3 -#define GPU_BUFFER_INTER_C3UB 4 -#define GPU_BUFFER_INTER_C4UB 5 -#define GPU_BUFFER_INTER_END -1 - -typedef struct GPUBuffer -{ +typedef struct GPUBuffer { int size; /* in bytes */ void *pointer; /* used with vertex arrays */ unsigned int id; /* used with vertex buffer objects */ } GPUBuffer; -/* stores deleted buffers so that new buffers wouldn't have to -be recreated that often. */ -typedef struct GPUBufferPool -{ - int size; /* number of allocated buffers stored */ - int maxsize; /* size of the array */ - GPUBuffer **buffers; -} GPUBufferPool; - -typedef struct GPUBufferMaterial -{ - int start; /* at which vertex in the buffer the material starts */ - int end; /* at which vertex it ends */ - char mat_nr; -} GPUBufferMaterial; +typedef struct GPUBufferMaterial { + /* range of points used for this material */ + int start; + int totpoint; -typedef struct IndexLink { - int element; - struct IndexLink *next; -} IndexLink; + /* original material index */ + short mat_nr; +} GPUBufferMaterial; -typedef struct GPUDrawObject -{ - GPUBuffer *vertices; +/* meshes are split up by material since changing materials requires + GL state changes that can't occur in the middle of drawing an + array. + + some simplifying assumptions are made: + * all quads are treated as two triangles. + * no vertex sharing is used; each triangle gets its own copy of the + vertices it uses (this makes it easy to deal with a vertex used + by faces with different properties, such as smooth/solid shading, + different MCols, etc.) + + to avoid confusion between the original MVert vertices and the + arrays of OpenGL vertices, the latter are referred to here and in + the source as `points'. similarly, the OpenGL triangles generated + for MFaces are referred to as triangles rather than faces. + */ +typedef struct GPUDrawObject { + GPUBuffer *points; GPUBuffer *normals; GPUBuffer *uv; GPUBuffer *colors; GPUBuffer *edges; GPUBuffer *uvedges; - int *faceRemap; /* at what index was the face originally in DerivedMesh */ - IndexLink *indices; /* given an index, find all elements using it */ - IndexLink *indexMem; /* for faster memory allocation/freeing */ - int indexMemUsage; /* how many are already allocated */ + /* for each triangle, the original MFace index */ + int *triangle_to_mface; + + /* for each original vertex, the list of related points */ + struct GPUVertPointLink *vert_points; + /* storage for the vert_points lists */ + struct GPUVertPointLink *vert_points_mem; + int vert_points_usage; + int colType; GPUBufferMaterial *materials; - - int nmaterials; - int nelements; /* (number of faces) * 3 */ - int nlooseverts; - int nedges; - int nindices; - int legacy; /* if there was a failure allocating some buffer, use old rendering code */ - + int totmaterial; + + int tot_triangle_point; + int tot_loose_point; + + /* caches of the original DerivedMesh values */ + int totvert; + int totedge; + + /* if there was a failure allocating some buffer, use old + rendering code */ + int legacy; } GPUDrawObject; /* used for GLSL materials */ -typedef struct GPUAttrib -{ +typedef struct GPUAttrib { int index; int size; int type; } GPUAttrib; -GPUBufferPool *GPU_buffer_pool_new(void); -void GPU_buffer_pool_free( GPUBufferPool *pool ); -void GPU_buffer_pool_free_unused( GPUBufferPool *pool ); +void GPU_global_buffer_pool_free(void); -GPUBuffer *GPU_buffer_alloc( int size, GPUBufferPool *pool ); -void GPU_buffer_free( GPUBuffer *buffer, GPUBufferPool *pool ); +GPUBuffer *GPU_buffer_alloc(int size); +void GPU_buffer_free(GPUBuffer *buffer); GPUDrawObject *GPU_drawobject_new( struct DerivedMesh *dm ); void GPU_drawobject_free( struct DerivedMesh *dm ); -/* Buffers for non-DerivedMesh drawing */ -void *GPU_build_mesh_buffers(struct GHash *map, struct MVert *mvert, - struct MFace *mface, int *face_indices, - int totface, int *vert_indices, int uniq_verts, - int totvert); -void GPU_update_mesh_buffers(void *buffers, struct MVert *mvert, - int *vert_indices, int totvert); -void *GPU_build_grid_buffers(struct DMGridData **grids, - int *grid_indices, int totgrid, int gridsize); -void GPU_update_grid_buffers(void *buffers_v, struct DMGridData **grids, - int *grid_indices, int totgrid, int gridsize, int smooth); -void GPU_draw_buffers(void *buffers); -void GPU_free_buffers(void *buffers); - /* called before drawing */ void GPU_vertex_setup( struct DerivedMesh *dm ); void GPU_normal_setup( struct DerivedMesh *dm ); @@ -175,6 +153,7 @@ void GPU_color4_upload( struct DerivedMesh *dm, unsigned char *data ); /* switch color rendering on=1/off=0 */ void GPU_color_switch( int mode ); +/* used for drawing edges */ void GPU_buffer_draw_elements( GPUBuffer *elements, unsigned int mode, int start, int count ); /* called after drawing */ @@ -183,4 +162,18 @@ void GPU_buffer_unbind(void); /* used to check whether to use the old (without buffers) code */ int GPU_buffer_legacy( struct DerivedMesh *dm ); +/* Buffers for non-DerivedMesh drawing */ +void *GPU_build_mesh_buffers(struct GHash *map, struct MVert *mvert, + struct MFace *mface, int *face_indices, + int totface, int *vert_indices, int uniq_verts, + int totvert); +void GPU_update_mesh_buffers(void *buffers, struct MVert *mvert, + int *vert_indices, int totvert); +void *GPU_build_grid_buffers(struct DMGridData **grids, + int *grid_indices, int totgrid, int gridsize); +void GPU_update_grid_buffers(void *buffers_v, struct DMGridData **grids, + int *grid_indices, int totgrid, int gridsize, int smooth); +void GPU_draw_buffers(void *buffers); +void GPU_free_buffers(void *buffers); + #endif |