[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20902] branches/soc-2009-imbusy/source/ blender: buffer initialization

Lukas Steiblys imbusy at imbusy.org
Mon Jun 15 21:29:46 CEST 2009


Revision: 20902
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20902
Author:   imbusy
Date:     2009-06-15 21:29:46 +0200 (Mon, 15 Jun 2009)

Log Message:
-----------
buffer initialization

Modified Paths:
--------------
    branches/soc-2009-imbusy/source/blender/blenkernel/BKE_DerivedMesh.h
    branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.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/BKE_DerivedMesh.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/blenkernel/BKE_DerivedMesh.h	2009-06-15 13:49:02 UTC (rev 20901)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/BKE_DerivedMesh.h	2009-06-15 19:29:46 UTC (rev 20902)
@@ -58,6 +58,7 @@
 struct MCol;
 struct ColorBand;
 struct GPUVertexAttribs;
+struct GPUDrawObject;
 
 /* number of sub-elements each mesh element has (for interpolation) */
 #define SUB_ELEMS_VERT 0
@@ -72,6 +73,7 @@
 	int needsFree; /* checked on ->release, is set to 0 for cached results */
 	int deformedOnly; /* set by modifier stack if only deformed from original */
 	BVHCache bvhCache;
+	struct GPUDrawObject *drawObject;
 
 	/* Misc. Queries */
 

Modified: branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c	2009-06-15 13:49:02 UTC (rev 20901)
+++ branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c	2009-06-15 19:29:46 UTC (rev 20902)
@@ -95,6 +95,7 @@
 #include "GPU_draw.h"
 #include "GPU_material.h"
 #include "GPU_extensions.h"
+#include "GPU_buffers.h"
 
 #include "ED_mesh.h"
 #include "ED_particle.h"

Modified: branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h	2009-06-15 13:49:02 UTC (rev 20901)
+++ branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h	2009-06-15 19:29:46 UTC (rev 20902)
@@ -83,9 +83,22 @@
 GPUDrawObject *GPU_drawobject_new( struct DerivedMesh *dm );
 void GPU_drawobject_free( GPUDrawObject *object );
 
-GPUBuffer *GPU_buffer_vertex( struct DerivedMesh *dm, GPUDrawObject *object );
-GPUBuffer *GPU_buffer_normal( struct DerivedMesh *dm, GPUDrawObject *object );
-GPUBuffer *GPU_buffer_uv( struct DerivedMesh *dm, GPUDrawObject *object );
-GPUBuffer *GPU_buffer_color( struct DerivedMesh *dm, 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 );
+
+/* called after drawing */
+void GPU_buffer_unbind();
+
 #endif

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-15 13:49:02 UTC (rev 20901)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c	2009-06-15 19:29:46 UTC (rev 20902)
@@ -142,6 +142,7 @@
 			glGenBuffersARB( 1, &allocated->id );
 			glBindBufferARB( GL_ARRAY_BUFFER_ARB, allocated->id );
 			glBufferDataARB( GL_ARRAY_BUFFER_ARB, size, 0, GL_STATIC_DRAW_ARB );
+			glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
 		}
 		else {
 			allocated->pointer = MEM_mallocN(size, "GPU_buffer_alloc_vertexarray");
@@ -199,13 +200,11 @@
 
 	for( i=0; i < dm->getNumFaces(dm); i++ ) {
 		if( mface[i].v4 )
-			numverts[mface[i].mat_nr] += 6;	/* split every quad into two triangles */
+			numverts[mface[i].mat_nr+127] += 6;	/* split every quad into two triangles */
 		else
-			numverts[mface[i].mat_nr] += 3;
+			numverts[mface[i].mat_nr+127] += 3;
 	}
 
-	//float *array = MEM_calloc(dm->getNumVerts(dm)*sizeof(float)*3); for(i = 0; i < dm->getNumVerts(dm); i++) { VECCOPY(array[i], mvert[i].co);}
-
 	for( i = 0; i < 256; i++ ) {
 		if( numverts[i] > 0 ) {
 			object->nmaterials++;
@@ -272,6 +271,7 @@
 			(*copy_f)( dm, varray, index, redir );
 			uploaded = glUnmapBufferARB( GL_ARRAY_BUFFER_ARB );	/* returns false if data got corruped during transfer */
 		}
+		glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
 	}
 	else {
 		varray = buffer->pointer;
@@ -295,11 +295,11 @@
 	mface = dm->getFaceArray(dm);
 
 	for( i=0; i < dm->getNumFaces(dm); i++ ) {
-		start = index[redir[mface[i].mat_nr]];
+		start = index[redir[mface[i].mat_nr+127]];
 		if( mface[i].v4 )
-			index[redir[mface[i].mat_nr]] += 18;
+			index[redir[mface[i].mat_nr+127]] += 18;
 		else
-			index[redir[mface[i].mat_nr]] += 9;
+			index[redir[mface[i].mat_nr+127]] += 9;
 
 		/* v1 v2 v3 */
 		VECCOPY(&varray[start],mvert[mface[i].v1].co);
@@ -315,9 +315,9 @@
 	}
 }
 
-GPUBuffer *GPU_buffer_vertex( DerivedMesh *dm, GPUDrawObject *object )
+GPUBuffer *GPU_buffer_vertex( DerivedMesh *dm )
 {
-	return GPU_buffer_setup( dm, object, sizeof(float)*3*object->nelements, GPU_buffer_copy_vertex);
+	return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, GPU_buffer_copy_vertex);
 }
 
 void GPU_buffer_copy_normal( DerivedMesh *dm, float *varray, int *index, int *redir )
@@ -333,11 +333,11 @@
 	mface = dm->getFaceArray(dm);
 
 	for( i=0; i < dm->getNumFaces(dm); i++ ) {
-		start = index[redir[mface[i].mat_nr]];
+		start = index[redir[mface[i].mat_nr+127]];
 		if( mface[i].v4 )
-			index[redir[mface[i].mat_nr]] += 18;
+			index[redir[mface[i].mat_nr+127]] += 18;
 		else
-			index[redir[mface[i].mat_nr]] += 9;
+			index[redir[mface[i].mat_nr+127]] += 9;
 
 		/* v1 v2 v3 */
 		if( mface->flag & ME_SMOOTH ) {
@@ -371,9 +371,9 @@
 	}
 }
 
-GPUBuffer *GPU_buffer_normal( struct DerivedMesh *dm, GPUDrawObject *object )
+GPUBuffer *GPU_buffer_normal( DerivedMesh *dm )
 {
-	return GPU_buffer_setup( dm, object, sizeof(float)*3*object->nelements, GPU_buffer_copy_normal);
+	return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, GPU_buffer_copy_normal);
 }
 
 void GPU_buffer_copy_uv( DerivedMesh *dm, float *varray, int *index, int *redir )
@@ -387,12 +387,17 @@
 	mface = dm->getFaceArray(dm);
 	mtface = DM_get_face_data_layer(dm, CD_MTFACE);
 
+	if( mtface == 0 ) {
+		printf("Texture coordinates do not exist for this mesh");
+		return;
+	}
+		
 	for( i=0; i < dm->getNumFaces(dm); i++ ) {
-		start = index[redir[mface[i].mat_nr]];
+		start = index[redir[mface[i].mat_nr+127]];
 		if( mface[i].v4 )
-			index[redir[mface[i].mat_nr]] += 12;
+			index[redir[mface[i].mat_nr+127]] += 12;
 		else
-			index[redir[mface[i].mat_nr]] += 6;
+			index[redir[mface[i].mat_nr+127]] += 6;
 
 		/* v1 v2 v3 */
 		VECCOPY2D(&varray[start],mtface[i].uv[0]);
@@ -408,9 +413,9 @@
 	}
 }
 
-GPUBuffer *GPU_buffer_uv( struct DerivedMesh *dm, GPUDrawObject *object )
+GPUBuffer *GPU_buffer_uv( DerivedMesh *dm )
 {
-	return GPU_buffer_setup( dm, object, sizeof(float)*2*object->nelements, GPU_buffer_copy_uv);
+	return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*2*dm->drawObject->nelements, GPU_buffer_copy_uv);
 }
 
 void GPU_buffer_copy_color( DerivedMesh *dm, float *varray_, int *index, int *redir )
@@ -430,11 +435,11 @@
 		mcol = DM_get_face_data_layer(dm, CD_MCOL);
 
 	for( i=0; i < dm->getNumFaces(dm); i++ ) {
-		start = index[redir[mface[i].mat_nr]];
+		start = index[redir[mface[i].mat_nr+127]];
 		if( mface[i].v4 )
-			index[redir[mface[i].mat_nr]] += 18;
+			index[redir[mface[i].mat_nr+127]] += 18;
 		else
-			index[redir[mface[i].mat_nr]] += 9;
+			index[redir[mface[i].mat_nr+127]] += 9;
 
 		/* v1 v2 v3 */
 		varray[start] = mcol[i*4].r;
@@ -462,7 +467,51 @@
 	}
 }
 
-GPUBuffer *GPU_buffer_color( struct DerivedMesh *dm, GPUDrawObject *object )
+GPUBuffer *GPU_buffer_color( DerivedMesh *dm )
 {
-	return GPU_buffer_setup( dm, object, sizeof(char)*3*object->nelements, GPU_buffer_copy_color);
+	return GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, GPU_buffer_copy_color );
 }
+
+void GPU_vertex_setup( DerivedMesh *dm )
+{
+	if( dm->drawObject == 0 )
+		dm->drawObject = GPU_drawobject_new( dm );
+	if( dm->drawObject->vertices == 0 )
+		GPU_buffer_vertex( dm );
+	glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->vertices->id );
+	glEnableClientState( GL_VERTEX_ARRAY );
+	glVertexPointer( 3, GL_FLOAT, 0, 0 );
+}
+
+void GPU_normal_setup( DerivedMesh *dm )
+{
+	if( dm->drawObject == 0 )
+		dm->drawObject = GPU_drawobject_new( dm );
+	if( dm->drawObject->normals == 0 )
+		GPU_buffer_normal( dm );
+	glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->normals->id );
+	glEnableClientState( GL_NORMAL_ARRAY );
+	glNormalPointer( GL_FLOAT, 0, 0 );
+}
+
+void GPU_uv_setup( DerivedMesh *dm )
+{
+	if( dm->drawObject == 0 )
+		dm->drawObject = GPU_drawobject_new( dm );
+	if( dm->drawObject->uv == 0 )
+		GPU_buffer_uv( dm );
+	glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->uv->id );
+	glEnableClientState( GL_TEXTURE_COORD_ARRAY );
+	glTexCoordPointer( 2, GL_FLOAT, 0, 0 );
+}
+
+void GPU_color_setup( DerivedMesh *dm )
+{
+	if( dm->drawObject == 0 )
+		dm->drawObject = GPU_drawobject_new( dm );
+	if( dm->drawObject->colors == 0 )
+		GPU_buffer_uv( dm );
+	glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->colors->id );
+	glEnableClientState( GL_COLOR_ARRAY );
+	glColorPointer( 3, GL_UNSIGNED_BYTE, 0, 0 );
+}





More information about the Bf-blender-cvs mailing list