Revision: 21076 http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21076 Author: imbusy Date: 2009-06-22 13:48:31 +0200 (Mon, 22 Jun 2009)
Log Message: ----------- experimented with a few more rendering modes. Can't understand where does cdDM_drawFacesColored get the colors from. Modified Paths: -------------- branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c 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/DerivedMesh.c =================================================================== --- branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c 2009-06-22 09:22:31 UTC (rev 21075) +++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c 2009-06-22 11:48:31 UTC (rev 21076) @@ -218,7 +218,7 @@ { if (dm->needsFree) { bvhcache_free(&dm->bvhCache); - GPU_buffer_release(dm); + GPU_drawobject_free( dm->drawObject ); CustomData_free(&dm->vertData, dm->numVertData); CustomData_free(&dm->edgeData, dm->numEdgeData); CustomData_free(&dm->faceData, dm->numFaceData); Modified: branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c =================================================================== --- branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c 2009-06-22 09:22:31 UTC (rev 21075) +++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c 2009-06-22 11:48:31 UTC (rev 21076) @@ -287,6 +287,22 @@ if(col1 && col2) glEnable(GL_CULL_FACE); + /* TODO: why does the code below give different results? */ + /*GPU_color4_upload(dm,cp1); + GPU_vertex_setup(dm); + GPU_color_setup(dm); + glDrawArrays(GL_TRIANGLES, 0, dm->drawObject->nelements); + + if( useTwoSided ) { + GPU_color4_upload(dm,cp2); + GPU_color_setup(dm); + glCullFace(GL_FRONT); + glDrawArrays(GL_TRIANGLES, 0, dm->drawObject->nelements); + glCullFace(GL_BACK); + } + GPU_buffer_unbind();*/ + + /* old code */ glShadeModel(GL_SMOOTH); glBegin(glmode = GL_QUADS); for(a = 0; a < dm->numFaceData; a++, mface++, cp1 += 16) { @@ -435,7 +451,18 @@ if(!mc) mc = DM_get_face_data_layer(dm, CD_MCOL); - for(i = 0; i < dm->numFaceData; i++, mf++) { + /* TODO: not yet tested */ + GPU_vertex_setup(dm); + GPU_normal_setup(dm); + if( useColors && mc ) + GPU_color_setup(dm); + glShadeModel(GL_SMOOTH); + glDrawArrays(GL_TRIANGLES,0,dm->drawObject->nelements); + glShadeModel(GL_FLOAT); + GPU_buffer_unbind(); + + /* old code */ + /*for(i = 0; i < dm->numFaceData; i++, mf++) { int drawSmooth = (mf->flag & ME_SMOOTH); if(index) { @@ -460,7 +487,6 @@ glNormal3fv(nors); } else { - /* TODO make this better (cache facenormals as layer?) */ float nor[3]; if(mf->v4) { CalcNormFloat4(mv[mf->v1].co, mv[mf->v2].co, @@ -504,7 +530,7 @@ } if (nors) nors += 3; - } + }*/ } static void cdDM_drawMappedFacesTex(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void *userData) Modified: branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h =================================================================== --- branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h 2009-06-22 09:22:31 UTC (rev 21075) +++ branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h 2009-06-22 11:48:31 UTC (rev 21076) @@ -90,12 +90,11 @@ void GPU_color_setup( struct DerivedMesh *dm ); /* upload three unsigned chars, representing RGB colors, for each vertex */ -void GPU_color_upload( struct DerivedMesh *dm, char *data ); +void GPU_color3_upload( struct DerivedMesh *dm, char *data ); +/* upload four unsigned chars, representing RGBA colors, for each vertex */ +void GPU_color4_upload( struct DerivedMesh *dm, char *data ); /* called after drawing */ void GPU_buffer_unbind(); -/* called when destroying DerivedMesh */ -void GPU_buffer_release( struct DerivedMesh *dm ); - #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-22 09:22:31 UTC (rev 21075) +++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c 2009-06-22 11:48:31 UTC (rev 21076) @@ -61,7 +61,7 @@ if( useVBOs < 0 ) { if( GL_ARB_vertex_buffer_object ) - useVBOs = 0; + useVBOs = 1; else useVBOs = 0; } @@ -274,7 +274,7 @@ MEM_freeN(object); } -GPUBuffer *GPU_buffer_setup( DerivedMesh *dm, GPUDrawObject *object, int size, void (*copy_f)(DerivedMesh *, float *, int *, int *) ) +GPUBuffer *GPU_buffer_setup( DerivedMesh *dm, GPUDrawObject *object, int size, void *user, void (*copy_f)(DerivedMesh *, float *, int *, int *, void *) ) { GPUBuffer *buffer; float *varray; @@ -304,14 +304,14 @@ uploaded = GL_FALSE; while( !uploaded ) { - (*copy_f)( dm, varray, index, redir ); + (*copy_f)( dm, varray, index, redir, user ); uploaded = glUnmapBufferARB( GL_ARRAY_BUFFER_ARB ); /* returns false if data got corruped during transfer */ } glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); } else { varray = buffer->pointer; - (*copy_f)( dm, varray, index, redir ); + (*copy_f)( dm, varray, index, redir, user ); } MEM_freeN(index); @@ -319,7 +319,7 @@ return buffer; } -void GPU_buffer_copy_vertex( DerivedMesh *dm, float *varray, int *index, int *redir ) +void GPU_buffer_copy_vertex( DerivedMesh *dm, float *varray, int *index, int *redir, void *user ) { int start; int i; @@ -357,10 +357,10 @@ { DEBUG_VBO("GPU_buffer_vertex\n"); - return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, GPU_buffer_copy_vertex); + return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, 0, GPU_buffer_copy_vertex); } -void GPU_buffer_copy_normal( DerivedMesh *dm, float *varray, int *index, int *redir ) +void GPU_buffer_copy_normal( DerivedMesh *dm, float *varray, int *index, int *redir, void *user ) { int i; int start; @@ -417,10 +417,10 @@ { DEBUG_VBO("GPU_buffer_normal\n"); - return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, GPU_buffer_copy_normal); + return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*3*dm->drawObject->nelements, 0, GPU_buffer_copy_normal); } -void GPU_buffer_copy_uv( DerivedMesh *dm, float *varray, int *index, int *redir ) +void GPU_buffer_copy_uv( DerivedMesh *dm, float *varray, int *index, int *redir, void *user ) { int start; int i; @@ -463,26 +463,24 @@ { DEBUG_VBO("GPU_buffer_uv\n"); - return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*2*dm->drawObject->nelements, GPU_buffer_copy_uv); + return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*2*dm->drawObject->nelements, 0, GPU_buffer_copy_uv); } -void GPU_buffer_copy_color( DerivedMesh *dm, float *varray_, int *index, int *redir ) +void GPU_buffer_copy_color3( DerivedMesh *dm, float *varray_, int *index, int *redir, void *user ) { int start; int i; - char *varray; MFace *mface; - MCol *mcol; + unsigned char *varray; + unsigned char *mcol; - DEBUG_VBO("GPU_buffer_copy_color\n"); + DEBUG_VBO("GPU_buffer_copy_color3\n"); - varray = (char *)varray_; + mcol = user; + varray = (unsigned char *)varray_; mface = dm->getFaceArray(dm); - mcol = DM_get_face_data_layer(dm, CD_WEIGHT_MCOL); - if(!mcol) - mcol = DM_get_face_data_layer(dm, CD_MCOL); for( i=0; i < dm->getNumFaces(dm); i++ ) { start = index[redir[mface[i].mat_nr+127]]; @@ -492,36 +490,75 @@ index[redir[mface[i].mat_nr+127]] += 9; /* v1 v2 v3 */ - varray[start] = mcol[i*4].r; - varray[start+1] = mcol[i*4].g; - varray[start+2] = mcol[i*4].b; - varray[start+3] = mcol[i*4+1].r; - varray[start+4] = mcol[i*4+1].g; - varray[start+5] = mcol[i*4+1].b; - varray[start+6] = mcol[i*4+2].r; - varray[start+7] = mcol[i*4+2].g; - varray[start+8] = mcol[i*4+2].b; + VECCOPY(&varray[start],&mcol[i*4]); + VECCOPY(&varray[start+3],&mcol[i*4+3]); + VECCOPY(&varray[start+6],&mcol[i*4+6]); + if( mface[i].v4 ) { + /* v3 v4 v1 */ + VECCOPY(&varray[start+9],&mcol[i*4+6]); + VECCOPY(&varray[start+12],&mcol[i*4+9]); + VECCOPY(&varray[start+15],&mcol[i*4]); + } + } +} +void GPU_buffer_copy_color4( DerivedMesh *dm, float *varray_, int *index, int *redir, void *user ) +{ + int start; + int i; + + MFace *mface; + unsigned char *varray; + unsigned char *mcol; + + DEBUG_VBO("GPU_buffer_copy_color4\n"); + + mcol = user; + varray = (unsigned char *)varray_; + + mface = dm->getFaceArray(dm); + + for( i=0; i < dm->getNumFaces(dm); i++ ) { + start = index[redir[mface[i].mat_nr+127]]; + if( mface[i].v4 ) + index[redir[mface[i].mat_nr+127]] += 18; + else + index[redir[mface[i].mat_nr+127]] += 9; + + /* v1 v2 v3 */ + VECCOPY(&varray[start],&mcol[i*4]); + VECCOPY(&varray[start+3],&mcol[i*4+4]); + VECCOPY(&varray[start+6],&mcol[i*4+8]); if( mface[i].v4 ) { /* v3 v4 v1 */ - varray[start+9] = mcol[i*4+2].r; - varray[start+10] = mcol[i*4+2].g; - varray[start+11] = mcol[i*4+2].b; - varray[start+12] = mcol[i*4+3].r; - varray[start+13] = mcol[i*4+3].g; - varray[start+14] = mcol[i*4+3].b; - varray[start+15] = mcol[i*4].r; - varray[start+16] = mcol[i*4].g; - varray[start+17] = mcol[i*4].b; + VECCOPY(&varray[start+9],&mcol[i*4+8]); + VECCOPY(&varray[start+12],&mcol[i*4+12]); + VECCOPY(&varray[start+15],&mcol[i*4]); } } } GPUBuffer *GPU_buffer_color( DerivedMesh *dm ) { + unsigned char *colors; + int i; + MCol *mcol; + GPUBuffer *result; DEBUG_VBO("GPU_buffer_color\n"); - return GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, GPU_buffer_copy_color ); + mcol = DM_get_face_data_layer(dm, CD_WEIGHT_MCOL); + if(!mcol) + mcol = DM_get_face_data_layer(dm, CD_MCOL); + + colors = MEM_mallocN(dm->getNumFaces(dm)*3*sizeof(unsigned char), "GPU_buffer_color"); + for( i=0; i < dm->getNumFaces(dm); i++ ) { + colors[i*3] = mcol[i].r; + colors[i*3+1] = mcol[i].g; + colors[i*3+2] = mcol[i].b; + } + result = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, colors, GPU_buffer_copy_color3 ); + MEM_freeN(colors); + return result; } void GPU_vertex_setup( DerivedMesh *dm ) @@ -620,7 +657,17 @@ glBindBufferARB( GL_ARRAY_BUFFER_ARB, 0 ); } -void GPU_buffer_release( DerivedMesh *dm ) +void GPU_color3_upload( struct DerivedMesh *dm, char *data ) { - GPU_drawobject_free( dm->drawObject ); + if( dm->drawObject == 0 ) + dm->drawObject = GPU_drawobject_new(dm); + GPU_buffer_free(dm->drawObject->colors,globalPool); + dm->drawObject->colors = GPU_buffer_setup( dm, dm->drawObject, sizeof(char)*3*dm->drawObject->nelements, data, GPU_buffer_copy_color3 ); +} +void GPU_color4_upload( struct DerivedMesh *dm, char *data ) +{ + if( dm->drawObject == 0 ) + dm->drawObject = GPU_drawobject_new(dm); + GPU_buffer_free(dm->drawObject->colors,globalPool); @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs