Fix T39597: Missing entries in VSE Preview menu
[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 BMesh;
43 struct CCGElem;
44 struct CCGKey;
45 struct CustomData;
46 struct DMFlagMat;
47 struct DerivedMesh;
48 struct GHash;
49 struct GSet;
50 struct GPUVertPointLink;
51 struct PBVH;
52
53 typedef struct GPUBuffer {
54         int size;       /* in bytes */
55         void *pointer;  /* used with vertex arrays */
56         unsigned int id;        /* used with vertex buffer objects */
57 } GPUBuffer;
58
59 typedef struct GPUBufferMaterial {
60         /* range of points used for this material */
61         int start;
62         int totpoint;
63
64         /* original material index */
65         short mat_nr;
66 } GPUBufferMaterial;
67
68 /* meshes are split up by material since changing materials requires
69  * GL state changes that can't occur in the middle of drawing an
70  * array.
71  *
72  * some simplifying assumptions are made:
73  * - all quads are treated as two triangles.
74  * - no vertex sharing is used; each triangle gets its own copy of the
75  *   vertices it uses (this makes it easy to deal with a vertex used
76  *   by faces with different properties, such as smooth/solid shading,
77  *   different MCols, etc.)
78  *
79  * to avoid confusion between the original MVert vertices and the
80  * arrays of OpenGL vertices, the latter are referred to here and in
81  * the source as `points'. similarly, the OpenGL triangles generated
82  * for MFaces are referred to as triangles rather than faces.
83  */
84 typedef struct GPUDrawObject {
85         GPUBuffer *points;
86         GPUBuffer *normals;
87         GPUBuffer *uv;
88         GPUBuffer *colors;
89         GPUBuffer *edges;
90         GPUBuffer *uvedges;
91
92         /* for each triangle, the original MFace index */
93         int *triangle_to_mface;
94
95         /* for each original vertex, the list of related points */
96         struct GPUVertPointLink *vert_points;
97
98         /* see: USE_GPU_POINT_LINK define */
99 #if 0
100         /* storage for the vert_points lists */
101         struct GPUVertPointLink *vert_points_mem;
102         int vert_points_usage;
103 #endif
104         
105         int colType;
106
107         GPUBufferMaterial *materials;
108         int totmaterial;
109         
110         int tot_triangle_point;
111         int tot_loose_point;
112         
113         /* caches of the original DerivedMesh values */
114         int totvert;
115         int totedge;
116
117         /* if there was a failure allocating some buffer, use old
118          * rendering code */
119         bool legacy;
120 } GPUDrawObject;
121
122 /* used for GLSL materials */
123 typedef struct GPUAttrib {
124         int index;
125         int size;
126         int type;
127 } GPUAttrib;
128
129 void GPU_global_buffer_pool_free(void);
130 void GPU_global_buffer_pool_free_unused(void);
131
132 GPUBuffer *GPU_buffer_alloc(int size);
133 void GPU_buffer_free(GPUBuffer *buffer);
134
135 GPUDrawObject *GPU_drawobject_new(struct DerivedMesh *dm);
136 void GPU_drawobject_free(struct DerivedMesh *dm);
137
138 /* called before drawing */
139 void GPU_vertex_setup(struct DerivedMesh *dm);
140 void GPU_normal_setup(struct DerivedMesh *dm);
141 void GPU_uv_setup(struct DerivedMesh *dm);
142 /* colType is the cddata MCol type to use! */
143 void GPU_color_setup(struct DerivedMesh *dm, int colType);
144 void GPU_edge_setup(struct DerivedMesh *dm); /* does not mix with other data */
145 void GPU_uvedge_setup(struct DerivedMesh *dm);
146 int GPU_attrib_element_size(GPUAttrib data[], int numdata);
147 void GPU_interleaved_attrib_setup(GPUBuffer *buffer, GPUAttrib data[], int numdata);
148
149 /* can't lock more than one buffer at once */
150 void *GPU_buffer_lock(GPUBuffer *buffer);
151 void *GPU_buffer_lock_stream(GPUBuffer *buffer);
152 void GPU_buffer_unlock(GPUBuffer *buffer);
153
154 /* switch color rendering on=1/off=0 */
155 void GPU_color_switch(int mode);
156
157 /* used for drawing edges */
158 void GPU_buffer_draw_elements(GPUBuffer *elements, unsigned int mode, int start, int count);
159
160 /* called after drawing */
161 void GPU_buffer_unbind(void);
162
163 /* used to check whether to use the old (without buffers) code */
164 bool GPU_buffer_legacy(struct DerivedMesh *dm);
165
166 /* Buffers for non-DerivedMesh drawing */
167 typedef struct GPU_PBVH_Buffers GPU_PBVH_Buffers;
168
169 GPU_PBVH_Buffers *GPU_build_pbvh_mesh_buffers(int (*face_vert_indices)[4],
170                                     struct MFace *mface, struct MVert *mvert,
171                                     int *face_indices, int totface);
172
173 void GPU_update_mesh_pbvh_buffers(GPU_PBVH_Buffers *buffers, MVert *mvert,
174                              int *vert_indices, int totvert, const float *vmask,
175                              int (*face_vert_indices)[4], bool show_diffuse_color);
176
177 GPU_PBVH_Buffers *GPU_build_grid_pbvh_buffers(int *grid_indices, int totgrid,
178                                     unsigned int **grid_hidden, int gridsize);
179
180 GPU_PBVH_Buffers *GPU_build_bmesh_pbvh_buffers(int smooth_shading);
181
182 void GPU_update_bmesh_pbvh_buffers(GPU_PBVH_Buffers *buffers,
183                               struct BMesh *bm,
184                               struct GSet *bm_faces,
185                               struct GSet *bm_unique_verts,
186                               struct GSet *bm_other_verts,
187                               bool show_diffuse_color);
188
189 void GPU_update_grid_pbvh_buffers(GPU_PBVH_Buffers *buffers, struct CCGElem **grids,
190                              const struct DMFlagMat *grid_flag_mats,
191                              int *grid_indices, int totgrid, const struct CCGKey *key,
192                              bool show_diffuse_color);
193
194 void GPU_draw_pbvh_buffers(GPU_PBVH_Buffers *buffers, DMSetMaterial setMaterial,
195                            bool wireframe);
196
197 bool GPU_pbvh_buffers_diffuse_changed(GPU_PBVH_Buffers *buffers, struct GSet *bm_faces, bool show_diffuse_color);
198
199 void GPU_free_pbvh_buffers(GPU_PBVH_Buffers *buffers);
200
201 #endif