Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/gpu/GPU_buffers.h')
-rw-r--r--source/blender/gpu/GPU_buffers.h141
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