Welcome to mirror list, hosted at ThFree Co, Russian Federation.

GPU_buffers.h « gpu « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 6f552e087d7f007333e4d07adc1179bfbcafa6d6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
/**
 * $Id$
 *
 * ***** BEGIN GPL LICENSE BLOCK *****
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version. The Blender
 * Foundation also sells licenses for use in proprietary software under
 * the Blender License.  See http://www.blender.org/BL/ for information
 * about this.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 * The Original Code is Copyright (C) 2005 Blender Foundation.
 * All rights reserved.
 *
 * The Original Code is: all of this file.
 *
 * Contributor(s): Brecht Van Lommel.
 *
 * ***** END GPL LICENSE BLOCK *****
 */

#ifndef __GPU_BUFFERS_H__
#define __GPU_BUFFERS_H__

#define MAX_FREE_GPU_BUFFERS 8

#ifdef _DEBUG
/*#define DEBUG_VBO(X) printf(X)*/
#define DEBUG_VBO(X)
#else
#define DEBUG_VBO(X)
#endif

#ifdef _DEBUG
#define ERROR_VBO(X) printf(X)
#else
#define ERROR_VBO(X)
#endif

struct DerivedMesh;
struct DMGridData;
struct GHash;
struct DMGridData;

/* V - vertex, N - normal, T - uv, C - color
   F - float, UB - unsigned byte */
#define GPU_BUFFER_INTER_V3F	1
#define GPU_BUFFER_INTER_N3F	2
#define GPU_BUFFER_INTER_T2F	3
#define GPU_BUFFER_INTER_C3UB	4
#define GPU_BUFFER_INTER_C4UB	5
#define GPU_BUFFER_INTER_END	-1

typedef struct GPUBuffer
{
	int size;	/* in bytes */
	void *pointer;	/* used with vertex arrays */
	unsigned int id;	/* used with vertex buffer objects */
} GPUBuffer;

typedef struct GPUBufferPool
{
	int size;		/* number of allocated buffers stored */
	int maxsize;	/* size of the array */
	GPUBuffer **buffers;
} GPUBufferPool;

typedef struct GPUBufferMaterial
{
	int start;	/* at which vertex in the buffer the material starts */
	int end;	/* at which vertex it ends */
	char mat_nr;
} GPUBufferMaterial;

typedef struct IndexLink {
	int element;
	struct IndexLink *next;
} IndexLink;

typedef struct GPUDrawObject
{
	GPUBuffer *vertices;
	GPUBuffer *normals;
	GPUBuffer *uv;
	GPUBuffer *colors;
	GPUBuffer *edges;
	GPUBuffer *uvedges;

	int	*faceRemap;			/* at what index was the face originally in DerivedMesh */
	IndexLink *indices;		/* given an index, find all elements using it */
	IndexLink *indexMem;	/* for faster memory allocation/freeing */
	int indexMemUsage;		/* how many are already allocated */
	int colType;

	GPUBufferMaterial *materials;

	int nmaterials;
	int nelements;	/* (number of faces) * 3 */
	int nlooseverts;
	int nedges;
	int nindices;
	int legacy;	/* if there was a failure allocating some buffer, use old rendering code */

} GPUDrawObject;

typedef struct GPUAttrib
{
	int index;
	int size;
	int type;
} GPUAttrib;

GPUBufferPool *GPU_buffer_pool_new();
void GPU_buffer_pool_free( GPUBufferPool *pool );
void GPU_buffer_pool_free_unused( GPUBufferPool *pool );

GPUBuffer *GPU_buffer_alloc( int size, GPUBufferPool *pool );
void GPU_buffer_free( GPUBuffer *buffer, GPUBufferPool *pool );

GPUDrawObject *GPU_drawobject_new( struct DerivedMesh *dm );
void GPU_drawobject_free( struct DerivedMesh *dm );

/* Buffers for non-DerivedMesh drawing */
void *GPU_build_mesh_buffers(struct GHash *map, struct MVert *mvert,
			struct MFace *mface, int *face_indices,
			int totface, int *vert_indices, int uniq_verts,
			int totvert);
void GPU_update_mesh_buffers(void *buffers, struct MVert *mvert,
			int *vert_indices, int totvert);
void *GPU_build_grid_buffers(struct DMGridData **grids,
	int *grid_indices, int totgrid, int gridsize);
void GPU_update_grid_buffers(void *buffers_v, struct DMGridData **grids,
	int *grid_indices, int totgrid, int gridsize, int smooth);
void GPU_draw_buffers(void *buffers);
void GPU_free_buffers(void *buffers);

/* called before drawing */
void GPU_vertex_setup( struct DerivedMesh *dm );
void GPU_normal_setup( struct DerivedMesh *dm );
void GPU_uv_setup( struct DerivedMesh *dm );
void GPU_color_setup( struct DerivedMesh *dm );
void GPU_edge_setup( struct DerivedMesh *dm );	/* does not mix with other data */
void GPU_uvedge_setup( struct DerivedMesh *dm );
void GPU_interleaved_setup( GPUBuffer *buffer, int data[] );
int GPU_attrib_element_size( GPUAttrib data[], int numdata );
void GPU_interleaved_attrib_setup( GPUBuffer *buffer, GPUAttrib data[], int numdata );

/* can't lock more than one buffer at once */
void *GPU_buffer_lock( GPUBuffer *buffer );	
void *GPU_buffer_lock_stream( GPUBuffer *buffer );
void GPU_buffer_unlock( GPUBuffer *buffer );

/* upload three unsigned chars, representing RGB colors, for each vertex. Resets dm->drawObject->colType to -1 */
void GPU_color3_upload( struct DerivedMesh *dm, unsigned char *data );
/* upload four unsigned chars, representing RGBA colors, for each vertex. Resets dm->drawObject->colType to -1 */
void GPU_color4_upload( struct DerivedMesh *dm, unsigned char *data );
/* switch color rendering on=1/off=0 */
void GPU_color_switch( int mode );

void GPU_buffer_draw_elements( GPUBuffer *elements, unsigned int mode, int start, int count );

/* called after drawing */
void GPU_buffer_unbind();

int GPU_buffer_legacy( struct DerivedMesh *dm );

#endif