imbusy GSoC'09 branch merge (Vertex Buffer Object support)
[blender.git] / source / blender / gpu / gpu_buffers.h
1 /**
2  * $Id: gpu_buffers.h 20687 2009-06-07 11:26:46Z imbusy $
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., 59 Temple Place - Suite 330, Boston, MA  02111-1307, 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 struct DerivedMesh;
46
47 /* V - vertex, N - normal, T - uv, C - color
48    F - float, UB - unsigned byte */
49 #define GPU_BUFFER_INTER_V3F    1
50 #define GPU_BUFFER_INTER_N3F    2
51 #define GPU_BUFFER_INTER_T2F    3
52 #define GPU_BUFFER_INTER_C3UB   4
53 #define GPU_BUFFER_INTER_C4UB   5
54 #define GPU_BUFFER_INTER_END    -1
55
56 typedef struct GPUBuffer
57 {
58         int size;       /* in bytes */
59         void *pointer;  /* used with vertex arrays */
60         unsigned int id;        /* used with vertex buffer objects */
61 } GPUBuffer;
62
63 typedef struct GPUBufferPool
64 {
65         int size;       /* number of allocated buffers stored */
66         int start;      /* for a queue like structure */
67                                 /* when running out of space for storing buffers,
68                                 the last one used will be thrown away */
69
70         GPUBuffer* buffers[MAX_FREE_GPU_BUFFERS];
71 } GPUBufferPool;
72
73 typedef struct GPUBufferMaterial
74 {
75         int start;      /* at which vertex in the buffer the material starts */
76         int end;        /* at which vertex it ends */
77         char mat_nr;
78 } GPUBufferMaterial;
79
80 typedef struct IndexLink {
81         int element;
82         struct IndexLink *next;
83 } IndexLink;
84
85 typedef struct GPUDrawObject
86 {
87         GPUBuffer *vertices;
88         GPUBuffer *normals;
89         GPUBuffer *uv;
90         GPUBuffer *colors;
91         GPUBuffer *edges;
92         GPUBuffer *uvedges;
93
94         int     *faceRemap;                     /* at what index was the face originally in DerivedMesh */
95         IndexLink *indices;             /* given an index, find all elements using it */
96         IndexLink *indexMem;    /* for faster memory allocation/freeing */
97         int indexMemUsage;              /* how many are already allocated */
98         int colType;
99
100         GPUBufferMaterial *materials;
101
102         int nmaterials;
103         int nelements;  /* (number of faces) * 3 */
104         int nlooseverts;
105         int nedges;
106         int nindices;
107         int legacy;     /* if there was a failure allocating some buffer, use old rendering code */
108
109 } GPUDrawObject;
110
111 typedef struct GPUAttrib
112 {
113         int index;
114         int size;
115         int type;
116 } GPUAttrib;
117
118 GPUBufferPool *GPU_buffer_pool_new();
119 void GPU_buffer_pool_free( GPUBufferPool *pool );       /* TODO: Find a place where to call this function on exit */
120
121 GPUBuffer *GPU_buffer_alloc( int size, GPUBufferPool *pool );
122 void GPU_buffer_free( GPUBuffer *buffer, GPUBufferPool *pool );
123
124 GPUDrawObject *GPU_drawobject_new( struct DerivedMesh *dm );
125 void GPU_drawobject_free( struct DerivedMesh *dm );
126
127 /* called before drawing */
128 void GPU_vertex_setup( struct DerivedMesh *dm );
129 void GPU_normal_setup( struct DerivedMesh *dm );
130 void GPU_uv_setup( struct DerivedMesh *dm );
131 void GPU_color_setup( struct DerivedMesh *dm );
132 void GPU_edge_setup( struct DerivedMesh *dm );  /* does not mix with other data */
133 void GPU_uvedge_setup( struct DerivedMesh *dm );
134 void GPU_interleaved_setup( GPUBuffer *buffer, int data[] );
135 int GPU_attrib_element_size( GPUAttrib data[], int numdata );
136 void GPU_interleaved_attrib_setup( GPUBuffer *buffer, GPUAttrib data[], int numdata );
137
138 /* can't lock more than one buffer at once */
139 void *GPU_buffer_lock( GPUBuffer *buffer );     
140 void *GPU_buffer_lock_stream( GPUBuffer *buffer );
141 void GPU_buffer_unlock( GPUBuffer *buffer );
142
143 /* upload three unsigned chars, representing RGB colors, for each vertex. Resets dm->drawObject->colType to -1 */
144 void GPU_color3_upload( struct DerivedMesh *dm, char *data );
145 /* upload four unsigned chars, representing RGBA colors, for each vertex. Resets dm->drawObject->colType to -1 */
146 void GPU_color4_upload( struct DerivedMesh *dm, char *data );
147 /* switch color rendering on=1/off=0 */
148 void GPU_color_switch( int mode );
149
150 void GPU_buffer_draw_elements( GPUBuffer *elements, unsigned int mode, int start, int count );
151
152 /* called after drawing */
153 void GPU_buffer_unbind();
154
155 int GPU_buffer_legacy( struct DerivedMesh *dm );
156
157 #endif