75e596935a31909078b8c6945aa02d410e10ed5b
[blender.git] / source / blender / gpu / gpu_buffers.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
22  *
23  * The Original Code is Copyright (C) 2005 Blender Foundation.
24  * All rights reserved.
25  *
26  * The Original Code is: all of this file.
27  *
28  * Contributor(s): Brecht Van Lommel.
29  *
30  * ***** END GPL LICENSE BLOCK *****
31  */
32
33 #ifndef __GPU_BUFFERS_H__
34 #define __GPU_BUFFERS_H__
35
36 #define MAX_FREE_GPU_BUFFERS 8
37
38 #ifdef _DEBUG
39 /*#define DEBUG_VBO(X) printf(X)*/
40 #define DEBUG_VBO(X)
41 #else
42 #define DEBUG_VBO(X)
43 #endif
44
45 #ifdef _DEBUG
46 #define ERROR_VBO(X) printf(X)
47 #else
48 #define ERROR_VBO(X)
49 #endif
50
51 struct DerivedMesh;
52 struct GHash;
53 struct DMGridData;
54
55 /* V - vertex, N - normal, T - uv, C - color
56    F - float, UB - unsigned byte */
57 #define GPU_BUFFER_INTER_V3F    1
58 #define GPU_BUFFER_INTER_N3F    2
59 #define GPU_BUFFER_INTER_T2F    3
60 #define GPU_BUFFER_INTER_C3UB   4
61 #define GPU_BUFFER_INTER_C4UB   5
62 #define GPU_BUFFER_INTER_END    -1
63
64 typedef struct GPUBuffer
65 {
66         int size;       /* in bytes */
67         void *pointer;  /* used with vertex arrays */
68         unsigned int id;        /* used with vertex buffer objects */
69 } GPUBuffer;
70
71 typedef struct GPUBufferPool
72 {
73         int size;               /* number of allocated buffers stored */
74         int maxsize;    /* size of the array */
75         GPUBuffer **buffers;
76 } GPUBufferPool;
77
78 typedef struct GPUBufferMaterial
79 {
80         int start;      /* at which vertex in the buffer the material starts */
81         int end;        /* at which vertex it ends */
82         char mat_nr;
83 } GPUBufferMaterial;
84
85 typedef struct IndexLink {
86         int element;
87         struct IndexLink *next;
88 } IndexLink;
89
90 typedef struct GPUDrawObject
91 {
92         GPUBuffer *vertices;
93         GPUBuffer *normals;
94         GPUBuffer *uv;
95         GPUBuffer *colors;
96         GPUBuffer *edges;
97         GPUBuffer *uvedges;
98
99         int     *faceRemap;                     /* at what index was the face originally in DerivedMesh */
100         IndexLink *indices;             /* given an index, find all elements using it */
101         IndexLink *indexMem;    /* for faster memory allocation/freeing */
102         int indexMemUsage;              /* how many are already allocated */
103         int colType;
104
105         GPUBufferMaterial *materials;
106
107         int nmaterials;
108         int nelements;  /* (number of faces) * 3 */
109         int nlooseverts;
110         int nedges;
111         int nindices;
112         int legacy;     /* if there was a failure allocating some buffer, use old rendering code */
113
114 } GPUDrawObject;
115
116 typedef struct GPUAttrib
117 {
118         int index;
119         int size;
120         int type;
121 } GPUAttrib;
122
123 GPUBufferPool *GPU_buffer_pool_new();
124 void GPU_buffer_pool_free( GPUBufferPool *pool );
125 void GPU_buffer_pool_free_unused( GPUBufferPool *pool );
126
127 GPUBuffer *GPU_buffer_alloc( int size, GPUBufferPool *pool );
128 void GPU_buffer_free( GPUBuffer *buffer, GPUBufferPool *pool );
129
130 GPUDrawObject *GPU_drawobject_new( struct DerivedMesh *dm );
131 void GPU_drawobject_free( struct DerivedMesh *dm );
132
133 /* Buffers for non-DerivedMesh drawing */
134 void *GPU_build_mesh_buffers(struct GHash *map, struct MVert *mvert,
135                         struct MFace *mface, int *face_indices,
136                         int totface, int *vert_indices, int uniq_verts,
137                         int totvert);
138 void GPU_update_mesh_buffers(void *buffers, struct MVert *mvert,
139                         int *vert_indices, int totvert);
140 void *GPU_build_grid_buffers(struct DMGridData **grids,
141         int *grid_indices, int totgrid, int gridsize);
142 void GPU_update_grid_buffers(void *buffers_v, struct DMGridData **grids,
143         int *grid_indices, int totgrid, int gridsize, int smooth);
144 void GPU_draw_buffers(void *buffers);
145 void GPU_free_buffers(void *buffers);
146
147 /* called before drawing */
148 void GPU_vertex_setup( struct DerivedMesh *dm );
149 void GPU_normal_setup( struct DerivedMesh *dm );
150 void GPU_uv_setup( struct DerivedMesh *dm );
151 void GPU_color_setup( struct DerivedMesh *dm );
152 void GPU_edge_setup( struct DerivedMesh *dm );  /* does not mix with other data */
153 void GPU_uvedge_setup( struct DerivedMesh *dm );
154 void GPU_interleaved_setup( GPUBuffer *buffer, int data[] );
155 int GPU_attrib_element_size( GPUAttrib data[], int numdata );
156 void GPU_interleaved_attrib_setup( GPUBuffer *buffer, GPUAttrib data[], int numdata );
157
158 /* can't lock more than one buffer at once */
159 void *GPU_buffer_lock( GPUBuffer *buffer );     
160 void *GPU_buffer_lock_stream( GPUBuffer *buffer );
161 void GPU_buffer_unlock( GPUBuffer *buffer );
162
163 /* upload three unsigned chars, representing RGB colors, for each vertex. Resets dm->drawObject->colType to -1 */
164 void GPU_color3_upload( struct DerivedMesh *dm, unsigned char *data );
165 /* upload four unsigned chars, representing RGBA colors, for each vertex. Resets dm->drawObject->colType to -1 */
166 void GPU_color4_upload( struct DerivedMesh *dm, unsigned char *data );
167 /* switch color rendering on=1/off=0 */
168 void GPU_color_switch( int mode );
169
170 void GPU_buffer_draw_elements( GPUBuffer *elements, unsigned int mode, int start, int count );
171
172 /* called after drawing */
173 void GPU_buffer_unbind();
174
175 int GPU_buffer_legacy( struct DerivedMesh *dm );
176
177 #endif