Index: source/blender/gpu/GPU_buffers.h |
=================================================================== |
--- source/blender/gpu/GPU_buffers.h (revision 37642) |
+++ source/blender/gpu/GPU_buffers.h (working copy) |
@@ -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 { |
+ /* range of points used for this material */ |
+ int start; |
+ int totpoint; |
-typedef struct GPUBufferMaterial |
-{ |
- int start; /* at which vertex in the buffer the material starts */ |
- int end; /* at which vertex it ends */ |
- char mat_nr; |
+ /* original material index */ |
+ short mat_nr; |
} GPUBufferMaterial; |
-typedef struct IndexLink { |
- int element; |
- struct IndexLink *next; |
-} IndexLink; |
+/* meshes are split up by material since changing materials requires |
+ GL state changes that can't occur in the middle of drawing an |
+ array. |
-typedef struct GPUDrawObject |
-{ |
- GPUBuffer *vertices; |
+ 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 totmaterial; |
+ |
+ int tot_triangle_point; |
+ int tot_loose_point; |
+ |
+ /* caches of the original DerivedMesh values */ |
+ int totvert; |
+ int totedge; |
- 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 */ |
- |
+ /* 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 @@ |
/* 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 @@ |
/* 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 |