[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [22016] branches/soc-2009-imbusy/source/ blender: started working on editmode
Lukas Steiblys
imbusy at imbusy.org
Wed Jul 29 16:20:49 CEST 2009
Revision: 22016
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22016
Author: imbusy
Date: 2009-07-29 16:20:49 +0200 (Wed, 29 Jul 2009)
Log Message:
-----------
started working on editmode
Modified Paths:
--------------
branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.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/DerivedMesh.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c 2009-07-29 14:17:15 UTC (rev 22015)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c 2009-07-29 14:20:49 UTC (rev 22016)
@@ -627,8 +627,8 @@
draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth);
if(draw) {
if (draw==2) { /* enabled with stipple */
- glEnable(GL_POLYGON_STIPPLE);
- glPolygonStipple(stipple_quarttone);
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(stipple_quarttone);
}
glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
@@ -659,41 +659,132 @@
}
}
} else {
- for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
- int drawSmooth = (efa->flag & ME_SMOOTH);
- draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth);
- if(draw) {
- if (draw==2) { /* enabled with stipple */
- glEnable(GL_POLYGON_STIPPLE);
- glPolygonStipple(stipple_quarttone);
+ /* 3 floats for position, 3 for normal and times two because the faces may actually be quads instead of triangles */
+ GPUBuffer *buffer = GPU_buffer_alloc( sizeof(float)*6*emdm->em->totface*3*2, 0 );
+ float *varray;
+ if( (varray = GPU_buffer_lock( buffer )) ) {
+ int prevdraw = 0;
+ int numfaces = 0;
+ int datatype[] = { GPU_BUFFER_INTER_V3F, GPU_BUFFER_INTER_N3F, GPU_BUFFER_INTER_END };
+ GPU_buffer_unlock( buffer );
+ GPU_interleaved_setup( buffer, datatype );
+ glShadeModel(GL_SMOOTH);
+ GPU_buffer_lock( buffer );
+ for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
+ int drawSmooth = (efa->flag & ME_SMOOTH);
+ draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth);
+ if( prevdraw != draw && prevdraw != 0 && numfaces > 0) {
+ if( prevdraw==2 ) {
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(stipple_quarttone);
+ glDisable(GL_POLYGON_STIPPLE);
+ }
+ GPU_buffer_unlock( buffer );
+ glDrawArrays(GL_TRIANGLES,0,numfaces*3);
+ if( prevdraw==2 ) {
+ glDisable(GL_POLYGON_STIPPLE);
+ }
+ varray = GPU_buffer_lock( buffer );
+ numfaces = 0;
}
- glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
+ if( draw != 0 ) {
+ if(!drawSmooth) {
+ VECCOPY(&varray[numfaces*18],efa->v1->co);
+ VECCOPY(&varray[numfaces*18+3],efa->n);
- glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
- if (!drawSmooth) {
- glNormal3fv(efa->n);
- glVertex3fv(efa->v1->co);
- glVertex3fv(efa->v2->co);
- glVertex3fv(efa->v3->co);
- if(efa->v4) glVertex3fv(efa->v4->co);
- } else {
- glNormal3fv(efa->v1->no);
- glVertex3fv(efa->v1->co);
- glNormal3fv(efa->v2->no);
- glVertex3fv(efa->v2->co);
- glNormal3fv(efa->v3->no);
- glVertex3fv(efa->v3->co);
- if(efa->v4) {
- glNormal3fv(efa->v4->no);
- glVertex3fv(efa->v4->co);
+ VECCOPY(&varray[numfaces*18+6],efa->v2->co);
+ VECCOPY(&varray[numfaces*18+9],efa->n);
+
+ VECCOPY(&varray[numfaces*18+12],efa->v3->co);
+ VECCOPY(&varray[numfaces*18+15],efa->n);
+ numfaces++;
+ if( efa->v4 ) {
+ VECCOPY(&varray[numfaces*18],efa->v3->co);
+ VECCOPY(&varray[numfaces*18+3],efa->n);
+
+ VECCOPY(&varray[numfaces*18+6],efa->v4->co);
+ VECCOPY(&varray[numfaces*18+9],efa->n);
+
+ VECCOPY(&varray[numfaces*18+12],efa->v1->co);
+ VECCOPY(&varray[numfaces*18+15],efa->n);
+ numfaces++;
+ }
}
+ else {
+ VECCOPY(&varray[numfaces*18],efa->v1->co);
+ VECCOPY(&varray[numfaces*18+3],efa->v1->no);
+
+ VECCOPY(&varray[numfaces*18+6],efa->v2->co);
+ VECCOPY(&varray[numfaces*18+9],efa->v2->no);
+
+ VECCOPY(&varray[numfaces*18+12],efa->v3->co);
+ VECCOPY(&varray[numfaces*18+15],efa->v3->no);
+ numfaces++;
+ if( efa->v4 ) {
+ VECCOPY(&varray[numfaces*18],efa->v3->co);
+ VECCOPY(&varray[numfaces*18+3],efa->v3->no);
+
+ VECCOPY(&varray[numfaces*18+6],efa->v4->co);
+ VECCOPY(&varray[numfaces*18+9],efa->v4->no);
+
+ VECCOPY(&varray[numfaces*18+12],efa->v1->co);
+ VECCOPY(&varray[numfaces*18+15],efa->v1->no);
+ numfaces++;
+ }
+ }
}
- glEnd();
-
- if (draw==2)
+ prevdraw = draw;
+ }
+ if( prevdraw != 0 && numfaces > 0) {
+ if( prevdraw==2 ) {
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(stipple_quarttone);
+ }
+ GPU_buffer_unlock( buffer );
+ glDrawArrays(GL_TRIANGLES,0,numfaces*3);
+ if( prevdraw==2 ) {
glDisable(GL_POLYGON_STIPPLE);
+ }
}
+ GPU_buffer_unbind();
+ } else {
+ for (i=0,efa= emdm->em->faces.first; efa; i++,efa= efa->next) {
+ int drawSmooth = (efa->flag & ME_SMOOTH);
+ draw = setDrawOptions==NULL ? 1 : setDrawOptions(userData, i, &drawSmooth);
+ if(draw) {
+ if (draw==2) { /* enabled with stipple */
+ glEnable(GL_POLYGON_STIPPLE);
+ glPolygonStipple(stipple_quarttone);
+ }
+ glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
+
+ glBegin(efa->v4?GL_QUADS:GL_TRIANGLES);
+ if (!drawSmooth) {
+ glNormal3fv(efa->n);
+ glVertex3fv(efa->v1->co);
+ glVertex3fv(efa->v2->co);
+ glVertex3fv(efa->v3->co);
+ if(efa->v4) glVertex3fv(efa->v4->co);
+ } else {
+ glNormal3fv(efa->v1->no);
+ glVertex3fv(efa->v1->co);
+ glNormal3fv(efa->v2->no);
+ glVertex3fv(efa->v2->co);
+ glNormal3fv(efa->v3->no);
+ glVertex3fv(efa->v3->co);
+ if(efa->v4) {
+ glNormal3fv(efa->v4->no);
+ glVertex3fv(efa->v4->co);
+ }
+ }
+ glEnd();
+
+ if (draw==2)
+ glDisable(GL_POLYGON_STIPPLE);
+ }
+ }
}
+ GPU_buffer_free( buffer, 0 );
}
}
Modified: branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h 2009-07-29 14:17:15 UTC (rev 22015)
+++ branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h 2009-07-29 14:20:49 UTC (rev 22016)
@@ -43,6 +43,14 @@
struct DerivedMesh;
+/* 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_END -1
+
typedef struct GPUBuffer
{
int size; /* in bytes */
@@ -114,6 +122,7 @@
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[] );
void GPU_buffer_draw_elements( GPUBuffer *elements, unsigned int mode, int start, int count );
void *GPU_buffer_lock( GPUBuffer *buffer );
Modified: branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c 2009-07-29 14:17:15 UTC (rev 22015)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c 2009-07-29 14:20:49 UTC (rev 22016)
@@ -149,6 +149,12 @@
DEBUG_VBO("GPU_buffer_alloc\n");
+ if( pool == 0 ) {
+ if( globalPool == 0 )
+ globalPool = GPU_buffer_pool_new();
+ pool = globalPool;
+ }
+
while( pool->start < 0 )
pool->start += MAX_FREE_GPU_BUFFERS;
@@ -176,8 +182,8 @@
allocated->size = size;
if( useVBOs == 1 ) {
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, allocated->id );
+ glBufferDataARB( GL_ARRAY_BUFFER_ARB, size, 0, GL_STATIC_DRAW_ARB );
glBindBufferARB( GL_ARRAY_BUFFER_ARB, 0 );
}
else {
@@ -918,6 +924,92 @@
GLStates |= GPU_BUFFER_VERTEX_STATE;
}
+void GPU_interleaved_setup( GPUBuffer *buffer, int data[] ) {
+ int i;
+ int elementsize = 0;
+ int offset = 0;
+ for( i = 0; data[i] != GPU_BUFFER_INTER_END; i++ ) {
+ switch( data[i] ) {
+ case GPU_BUFFER_INTER_V3F:
+ elementsize += 3*sizeof(float);
+ break;
+ case GPU_BUFFER_INTER_N3F:
+ elementsize += 3*sizeof(float);
+ break;
+ case GPU_BUFFER_INTER_T2F:
+ elementsize += 2*sizeof(float);
+ break;
+ case GPU_BUFFER_INTER_C3UB:
+ elementsize += 3*sizeof(unsigned char);
+ break;
+ default:
+ DEBUG_VBO( "Unknown element in data type array in GPU_interleaved_setup\n" );
+ }
+ }
+
+ if( useVBOs ) {
+ glBindBufferARB( GL_ARRAY_BUFFER_ARB, buffer->id );
+ for( i = 0; data[i] != GPU_BUFFER_INTER_END; i++ ) {
+ switch( data[i] ) {
+ case GPU_BUFFER_INTER_V3F:
+ glEnableClientState( GL_VERTEX_ARRAY );
+ glVertexPointer( 3, GL_FLOAT, elementsize, (void *)offset );
+ GLStates |= GPU_BUFFER_VERTEX_STATE;
+ offset += 3*sizeof(float);
+ break;
+ case GPU_BUFFER_INTER_N3F:
+ glEnableClientState( GL_NORMAL_ARRAY );
+ glNormalPointer( GL_FLOAT, elementsize, (void *)offset );
+ GLStates |= GPU_BUFFER_NORMAL_STATE;
+ offset += 3*sizeof(float);
+ break;
+ case GPU_BUFFER_INTER_T2F:
+ glEnableClientState( GL_TEXTURE_COORD_ARRAY );
+ glTexCoordPointer( 2, GL_FLOAT, elementsize, (void *)offset );
+ GLStates |= GPU_BUFFER_TEXCOORD_STATE;
+ offset += 2*sizeof(float);
+ break;
+ case GPU_BUFFER_INTER_C3UB:
+ glEnableClientState( GL_COLOR_ARRAY );
+ glColorPointer( 3, GL_UNSIGNED_BYTE, elementsize, (void *)offset );
+ GLStates |= GPU_BUFFER_COLOR_STATE;
+ offset += 3*sizeof(unsigned char);
+ break;
+ }
+ }
+ }
+ else {
+ for( i = 0; data[i] != GPU_BUFFER_INTER_END; i++ ) {
+ switch( data[i] ) {
+ case GPU_BUFFER_INTER_V3F:
+ glEnableClientState( GL_VERTEX_ARRAY );
+ glVertexPointer( 3, GL_FLOAT, elementsize, offset+(char *)buffer->pointer );
+ GLStates |= GPU_BUFFER_VERTEX_STATE;
+ offset += 3*sizeof(float);
+ break;
+ case GPU_BUFFER_INTER_N3F:
+ glEnableClientState( GL_NORMAL_ARRAY );
+ glNormalPointer( GL_FLOAT, elementsize, offset+(char *)buffer->pointer );
+ GLStates |= GPU_BUFFER_NORMAL_STATE;
+ offset += 3*sizeof(float);
+ break;
+ case GPU_BUFFER_INTER_T2F:
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list