[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20993] branches/soc-2009-imbusy/source/ blender: VBOs work for solid faces! (still need to debug vertex arrays)
Lukas Steiblys
imbusy at imbusy.org
Thu Jun 18 22:02:50 CEST 2009
Revision: 20993
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20993
Author: imbusy
Date: 2009-06-18 22:02:50 +0200 (Thu, 18 Jun 2009)
Log Message:
-----------
VBOs work for solid faces! (still need to debug vertex arrays)
Modified Paths:
--------------
branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c
branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c
Modified: branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c 2009-06-18 19:59:20 UTC (rev 20992)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c 2009-06-18 20:02:50 UTC (rev 20993)
@@ -60,6 +60,7 @@
#include "MEM_guardedalloc.h"
+#include "GPU_buffers.h"
#include "GPU_draw.h"
#include "GPU_extensions.h"
#include "GPU_material.h"
@@ -252,72 +253,16 @@
static void cdDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int, void *attribs))
{
- CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
- MVert *mvert = cddm->mvert;
- MFace *mface = cddm->mface;
- float *nors= dm->getFaceDataArray(dm, CD_NORMAL);
- int a, glmode = -1, shademodel = -1, matnr = -1, drawCurrentMat = 1;
-
-#define PASSVERT(index) { \
- if(shademodel == GL_SMOOTH) { \
- short *no = mvert[index].no; \
- glNormal3sv(no); \
- } \
- glVertex3fv(mvert[index].co); \
-}
-
- glBegin(glmode = GL_QUADS);
- for(a = 0; a < dm->numFaceData; a++, mface++) {
- int new_glmode, new_matnr, new_shademodel;
-
- new_glmode = mface->v4?GL_QUADS:GL_TRIANGLES;
- new_matnr = mface->mat_nr + 1;
- new_shademodel = (mface->flag & ME_SMOOTH)?GL_SMOOTH:GL_FLAT;
-
- if(new_glmode != glmode || new_matnr != matnr
- || new_shademodel != shademodel) {
- glEnd();
-
- drawCurrentMat = setMaterial(matnr = new_matnr, NULL);
-
- glShadeModel(shademodel = new_shademodel);
- glBegin(glmode = new_glmode);
- }
-
- if(drawCurrentMat) {
- if(shademodel == GL_FLAT) {
- if (nors) {
- glNormal3fv(nors);
- }
- else {
- /* TODO make this better (cache facenormals as layer?) */
- float nor[3];
- if(mface->v4) {
- CalcNormFloat4(mvert[mface->v1].co, mvert[mface->v2].co,
- mvert[mface->v3].co, mvert[mface->v4].co,
- nor);
- } else {
- CalcNormFloat(mvert[mface->v1].co, mvert[mface->v2].co,
- mvert[mface->v3].co, nor);
- }
- glNormal3fv(nor);
- }
- }
-
- PASSVERT(mface->v1);
- PASSVERT(mface->v2);
- PASSVERT(mface->v3);
- if(mface->v4) {
- PASSVERT(mface->v4);
- }
- }
-
- if(nors) nors += 3;
+ int i;
+ GPU_vertex_setup( dm );
+ GPU_normal_setup( dm );
+ glShadeModel(GL_SMOOTH);
+ for( i = 0; i < dm->drawObject->nmaterials; i++ ) {
+ setMaterial(dm->drawObject->materials[i].mat_nr+1, NULL);
+ glDrawArrays(GL_TRIANGLES, dm->drawObject->materials[i].start, dm->drawObject->materials[i].end);
}
- glEnd();
-
+ GPU_buffer_unbind( );
glShadeModel(GL_FLAT);
-#undef PASSVERT
}
static void cdDM_drawFacesColored(DerivedMesh *dm, int useTwoSided, unsigned char *col1, unsigned char *col2)
Modified: branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h 2009-06-18 19:59:20 UTC (rev 20992)
+++ branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h 2009-06-18 20:02:50 UTC (rev 20993)
@@ -83,20 +83,14 @@
GPUDrawObject *GPU_drawobject_new( struct DerivedMesh *dm );
void GPU_drawobject_free( GPUDrawObject *object );
-/* collect the data into buffers */
-/*GPUBuffer *GPU_buffer_vertex( struct DerivedMesh *dm );
-GPUBuffer *GPU_buffer_normal( struct DerivedMesh *dm );
-GPUBuffer *GPU_buffer_uv( struct DerivedMesh *dm );
-GPUBuffer *GPU_buffer_color( struct DerivedMesh *dm );*/
-
/* 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_buffer_draw( struct DerivedMesh *dm );
-void GPU_buffer_draw_selected( struct DerivedMesh *dm, int selected );
+/* upload three unsigned chars, representing RGB colors, for each vertex */
+void GPU_color_upload( struct DerivedMesh *dm, char *data );
/* called after drawing */
void GPU_buffer_unbind();
Modified: branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c 2009-06-18 19:59:20 UTC (rev 20992)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c 2009-06-18 20:02:50 UTC (rev 20993)
@@ -41,9 +41,15 @@
#include "DNA_meshdata_types.h"
#include "BLI_arithb.h"
+#define GPU_BUFFER_VERTEX_STATE 1
+#define GPU_BUFFER_NORMAL_STATE 2
+#define GPU_BUFFER_TEXCOORD_STATE 4
+#define GPU_BUFFER_COLOR_STATE 8
+
/* -1 - undefined, 0 - vertex arrays, 1 - VBOs */
int useVBOs = -1;
GPUBufferPool *globalPool = 0;
+int GLStates = 0;
GPUBufferPool *GPU_buffer_pool_new()
{
@@ -56,9 +62,7 @@
useVBOs = 0;
}
- pool = MEM_mallocN(sizeof(GPUBufferPool), "GPU_buffer_pool_new");
- pool->size = 0;
- pool->start = 0;
+ pool = MEM_callocN(sizeof(GPUBufferPool), "GPU_buffer_pool_new");
return pool;
}
@@ -216,7 +220,7 @@
curmat = curverts = 0;
for( i = 0; i < 256; i++ ) {
if( numverts[i] > 0 ) {
- object->materials[curmat].mat_nr = i;
+ object->materials[curmat].mat_nr = i-127;
object->materials[curmat].start = curverts;
object->materials[curmat].end = curverts+numverts[i];
curverts += numverts[i];
@@ -254,9 +258,11 @@
index = MEM_mallocN(sizeof(int)*object->nmaterials,"GPU_buffer_setup");
for( i = 0; i < object->nmaterials; i++ ) {
index[i] = object->materials[i].start;
- redir[object->materials[i].mat_nr] = i;
+ redir[object->materials[i].mat_nr+127] = i;
}
+ if( globalPool == 0 )
+ globalPool = GPU_buffer_pool_new();
buffer = GPU_buffer_alloc(size,globalPool);
if( useVBOs ) {
@@ -358,14 +364,14 @@
if( mface[i].v4 ) {
/* v3 v4 v1 */
if( mface->flag & ME_SMOOTH ) {
- VECCOPY(&varray[start],mvert[mface[i].v3].no);
- VECCOPY(&varray[start+3],mvert[mface[i].v4].no);
- VECCOPY(&varray[start+6],mvert[mface[i].v1].no);
+ VECCOPY(&varray[start+9],mvert[mface[i].v3].no);
+ VECCOPY(&varray[start+12],mvert[mface[i].v4].no);
+ VECCOPY(&varray[start+15],mvert[mface[i].v1].no);
}
else {
- VECCOPY(&varray[start],norm);
- VECCOPY(&varray[start+3],norm);
- VECCOPY(&varray[start+6],norm);
+ VECCOPY(&varray[start+9],norm);
+ VECCOPY(&varray[start+12],norm);
+ VECCOPY(&varray[start+15],norm);
}
}
}
@@ -477,10 +483,12 @@
if( dm->drawObject == 0 )
dm->drawObject = GPU_drawobject_new( dm );
if( dm->drawObject->vertices == 0 )
- GPU_buffer_vertex( dm );
+ dm->drawObject->vertices = GPU_buffer_vertex( dm );
glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->vertices->id );
glEnableClientState( GL_VERTEX_ARRAY );
glVertexPointer( 3, GL_FLOAT, 0, 0 );
+
+ GLStates |= GPU_BUFFER_VERTEX_STATE;
}
void GPU_normal_setup( DerivedMesh *dm )
@@ -488,10 +496,12 @@
if( dm->drawObject == 0 )
dm->drawObject = GPU_drawobject_new( dm );
if( dm->drawObject->normals == 0 )
- GPU_buffer_normal( dm );
+ dm->drawObject->normals = GPU_buffer_normal( dm );
glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->normals->id );
glEnableClientState( GL_NORMAL_ARRAY );
glNormalPointer( GL_FLOAT, 0, 0 );
+
+ GLStates |= GPU_BUFFER_NORMAL_STATE;
}
void GPU_uv_setup( DerivedMesh *dm )
@@ -499,10 +509,12 @@
if( dm->drawObject == 0 )
dm->drawObject = GPU_drawobject_new( dm );
if( dm->drawObject->uv == 0 )
- GPU_buffer_uv( dm );
+ dm->drawObject->uv = GPU_buffer_uv( dm );
glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->uv->id );
glEnableClientState( GL_TEXTURE_COORD_ARRAY );
glTexCoordPointer( 2, GL_FLOAT, 0, 0 );
+
+ GLStates |= GPU_BUFFER_TEXCOORD_STATE;
}
void GPU_color_setup( DerivedMesh *dm )
@@ -510,8 +522,24 @@
if( dm->drawObject == 0 )
dm->drawObject = GPU_drawobject_new( dm );
if( dm->drawObject->colors == 0 )
- GPU_buffer_uv( dm );
+ dm->drawObject->colors = GPU_buffer_uv( dm );
glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->colors->id );
glEnableClientState( GL_COLOR_ARRAY );
glColorPointer( 3, GL_UNSIGNED_BYTE, 0, 0 );
+
+ GLStates |= GPU_BUFFER_COLOR_STATE;
}
+
+void GPU_buffer_unbind()
+{
+ if( GLStates & GPU_BUFFER_VERTEX_STATE )
+ glDisableClientState( GL_VERTEX_ARRAY );
+ if( GLStates & GPU_BUFFER_NORMAL_STATE )
+ glDisableClientState( GL_NORMAL_ARRAY );
+ if( GLStates & GPU_BUFFER_TEXCOORD_STATE )
+ glDisableClientState( GL_TEXTURE_COORD_ARRAY );
+ if( GLStates & GPU_BUFFER_COLOR_STATE )
+ glDisableClientState( GL_COLOR_ARRAY );
+ GLStates &= !(GPU_BUFFER_VERTEX_STATE | GPU_BUFFER_NORMAL_STATE | GPU_BUFFER_TEXCOORD_STATE | GPU_BUFFER_COLOR_STATE );
+ glBindBufferARB( GL_ARRAY_BUFFER_ARB, 0 );
+}
\ No newline at end of file
More information about the Bf-blender-cvs
mailing list