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