Fix for multires VBO drawing in sculpt mode.
[blender.git] / source / blender / gpu / GPU_buffers.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2005 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): Brecht Van Lommel.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file GPU_buffers.h
29  *  \ingroup gpu
30  */
31
32 #ifndef __GPU_BUFFERS_H__
33 #define __GPU_BUFFERS_H__
34
35 #ifdef _DEBUG
36 /*#define DEBUG_VBO(X) printf(X)*/
37 #define DEBUG_VBO(X)
38 #else
39 #define DEBUG_VBO(X)
40 #endif
41
42 struct DerivedMesh;
43 struct DMFlagMat;
44 struct DMGridData;
45 struct CustomData;
46 struct GHash;
47 struct DMGridData;
48 struct GPUVertPointLink;
49
50 typedef struct GPUBuffer {
51         int size;       /* in bytes */
52         void *pointer;  /* used with vertex arrays */
53         unsigned int id;        /* used with vertex buffer objects */
54 } GPUBuffer;
55
56 typedef struct GPUBufferMaterial {
57         /* range of points used for this material */
58         int start;
59         int totpoint;
60
61         /* original material index */
62         short mat_nr;
63 } GPUBufferMaterial;
64
65 /* meshes are split up by material since changing materials requires
66  * GL state changes that can't occur in the middle of drawing an
67  * array.
68  *
69  * some simplifying assumptions are made:
70  * - all quads are treated as two triangles.
71  * - no vertex sharing is used; each triangle gets its own copy of the
72  *   vertices it uses (this makes it easy to deal with a vertex used
73  *   by faces with different properties, such as smooth/solid shading,
74  *   different MCols, etc.)
75  *
76  * to avoid confusion between the original MVert vertices and the
77  * arrays of OpenGL vertices, the latter are referred to here and in
78  * the source as `points'. similarly, the OpenGL triangles generated
79  * for MFaces are referred to as triangles rather than faces.
80  */
81 typedef struct GPUDrawObject {
82         GPUBuffer *points;
83         GPUBuffer *normals;
84         GPUBuffer *uv;
85         GPUBuffer *colors;
86         GPUBuffer *edges;
87         GPUBuffer *uvedges;
88
89         /* for each triangle, the original MFace index */
90         int *triangle_to_mface;
91
92         /* for each original vertex, the list of related points */
93         struct GPUVertPointLink *vert_points;
94         /* storage for the vert_points lists */
95         struct GPUVertPointLink *vert_points_mem;
96         int vert_points_usage;
97         
98         int colType;
99
100         GPUBufferMaterial *materials;
101         int totmaterial;
102         
103         int tot_triangle_point;
104         int tot_loose_point;
105         
106         /* caches of the original DerivedMesh values */
107         int totvert;
108         int totedge;
109
110         /* if there was a failure allocating some buffer, use old
111          * rendering code */
112         int legacy;
113 } GPUDrawObject;
114
115 /* used for GLSL materials */
116 typedef struct GPUAttrib {
117         int index;
118         int size;
119         int type;
120 } GPUAttrib;
121
122 void GPU_global_buffer_pool_free(void);
123
124 GPUBuffer *GPU_buffer_alloc(int size);
125 void GPU_buffer_free(GPUBuffer *buffer);
126
127 GPUDrawObject *GPU_drawobject_new(struct DerivedMesh *dm );
128 void GPU_drawobject_free(struct DerivedMesh *dm );
129
130 /* called before drawing */
131 void GPU_vertex_setup(struct DerivedMesh *dm );
132 void GPU_normal_setup(struct DerivedMesh *dm );
133 void GPU_uv_setup(struct DerivedMesh *dm );
134 void GPU_color_setup(struct DerivedMesh *dm );
135 void GPU_edge_setup(struct DerivedMesh *dm );   /* does not mix with other data */
136 void GPU_uvedge_setup(struct DerivedMesh *dm );
137 int GPU_attrib_element_size( GPUAttrib data[], int numdata );
138 void GPU_interleaved_attrib_setup( GPUBuffer *buffer, GPUAttrib data[], int numdata );
139
140 /* can't lock more than one buffer at once */
141 void *GPU_buffer_lock( GPUBuffer *buffer );     
142 void *GPU_buffer_lock_stream( GPUBuffer *buffer );
143 void GPU_buffer_unlock( GPUBuffer *buffer );
144
145 /* upload three unsigned chars, representing RGB colors, for each vertex. Resets dm->drawObject->colType to -1 */
146 void GPU_color3_upload(struct DerivedMesh *dm, unsigned char *data );
147 /* switch color rendering on=1/off=0 */
148 void GPU_color_switch( int mode );
149
150 /* used for drawing edges */
151 void GPU_buffer_draw_elements( GPUBuffer *elements, unsigned int mode, int start, int count );
152
153 /* called after drawing */
154 void GPU_buffer_unbind(void);
155
156 /* used to check whether to use the old (without buffers) code */
157 int GPU_buffer_legacy(struct DerivedMesh *dm );
158
159 /* Buffers for non-DerivedMesh drawing */
160 typedef struct GPU_Buffers GPU_Buffers;
161
162 GPU_Buffers *GPU_build_mesh_buffers(int (*face_vert_indices)[4],
163                         struct MFace *mface, struct MVert *mvert,
164             int *face_indices, int totface);
165
166 void GPU_update_mesh_buffers(GPU_Buffers *buffers, struct MVert *mvert,
167                         int *vert_indices, int totvert);
168
169 GPU_Buffers *GPU_build_grid_buffers(int *grid_indices, int totgrid,
170                                                                         unsigned int **grid_hidden, int gridsize);
171
172 void GPU_update_grid_buffers(GPU_Buffers *buffers, struct DMGridData **grids,
173                                                          const struct DMFlagMat *grid_flag_mats,
174                                                          int *grid_indices, int totgrid, int gridsize);
175
176 void GPU_draw_buffers(GPU_Buffers *buffers, DMSetMaterial setMaterial);
177
178 void GPU_free_buffers(GPU_Buffers *buffers);
179
180 #endif