[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21083] branches/soc-2009-imbusy/source/ blender: textured mode seems to work, but could be improved
Lukas Steiblys
imbusy at imbusy.org
Mon Jun 22 21:35:52 CEST 2009
Revision: 21083
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21083
Author: imbusy
Date: 2009-06-22 21:35:52 +0200 (Mon, 22 Jun 2009)
Log Message:
-----------
textured mode seems to work, but could be improved
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-22 18:19:18 UTC (rev 21082)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c 2009-06-22 19:35:52 UTC (rev 21083)
@@ -318,8 +318,70 @@
float *nors= dm->getFaceDataArray(dm, CD_NORMAL);
MTFace *tf = DM_get_face_data_layer(dm, CD_MTFACE);
int i, orig, *index = DM_get_face_data_layer(dm, CD_ORIGINDEX);
+ int startFace = 0, lastFlag = 0xdeadbeef;
+ GPU_vertex_setup( dm );
+ GPU_normal_setup( dm );
+ GPU_uv_setup( dm );
+ if( mcol != 0 ) {
+ if( dm->drawObject->colType != CD_MCOL ) {
+ unsigned char *colors = MEM_mallocN(dm->getNumFaces(dm)*3*sizeof(unsigned char), "cdDM_drawFacesTex_common");
+ 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;
+ }
+ GPU_color3_upload(dm,colors);
+ MEM_freeN(colors);
+ dm->drawObject->colType = CD_MCOL;
+ }
+ GPU_color_setup( dm );
+ }
- for(i = 0; i < dm->numFaceData; i++, mf++) {
+ glShadeModel( GL_SMOOTH );
+ for(i = 0; i < dm->drawObject->nelements/3; i++) {
+ int actualFace = dm->drawObject->faceRemap[i];
+ int flag;
+ unsigned char *cp = NULL;
+
+ if(drawParams) {
+ flag = drawParams(tf? &tf[actualFace]: NULL, mcol? &mcol[actualFace*4]: NULL, mf[actualFace].mat_nr);
+ }
+ else {
+ if(index) {
+ orig = index[actualFace];
+ if(drawParamsMapped)
+ flag = drawParamsMapped(userData, orig);
+ }
+ else
+ if(drawParamsMapped)
+ flag = drawParamsMapped(userData, actualFace);
+ }
+ if( flag != lastFlag ) {
+ if( startFace < i ) {
+ if( lastFlag != 0 ) { /* if the flag is 0 it means the face is hidden or invisible */
+ if (lastFlag==1 && mcol)
+ GPU_color_switch(1);
+ else
+ GPU_color_switch(0);
+ glDrawArrays(GL_TRIANGLES,startFace*3,(i-startFace)*3);
+ }
+ }
+ lastFlag = flag;
+ startFace = i;
+ }
+ }
+ if( startFace < dm->drawObject->nelements/3 ) {
+ if( lastFlag != 0 ) { /* if the flag is 0 it means the face is hidden or invisible */
+ if (lastFlag==1 && mcol)
+ GPU_color_switch(1);
+ else
+ GPU_color_switch(0);
+ glDrawArrays(GL_TRIANGLES,startFace*3,((dm->drawObject->nelements/3)-startFace)*3);
+ }
+ }
+ GPU_buffer_unbind();
+ glShadeModel( GL_FLAT );
+ /*for(i = 0; i < dm->numFaceData; i++, mf++) {
MVert *mvert;
int flag;
unsigned char *cp = NULL;
@@ -339,7 +401,7 @@
else { if(nors) nors += 3; continue; }
}
- if(flag != 0) { /* if the flag is 0 it means the face is hidden or invisible */
+ if(flag != 0) {
if (flag==1 && mcol)
cp= (unsigned char*) &mcol[i*4];
@@ -348,7 +410,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,
@@ -392,7 +453,7 @@
}
if(nors) nors += 3;
- }
+ }*/
}
static void cdDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, MCol *mcol, int matnr))
Modified: branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h 2009-06-22 18:19:18 UTC (rev 21082)
+++ branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h 2009-06-22 19:35:52 UTC (rev 21083)
@@ -67,6 +67,8 @@
GPUBuffer *normals;
GPUBuffer *uv;
GPUBuffer *colors;
+ int *faceRemap; /* at what index was the face originally in DerivedMesh */
+ int colType;
GPUBufferMaterial *materials;
@@ -89,10 +91,12 @@
void GPU_uv_setup( struct DerivedMesh *dm );
void GPU_color_setup( struct DerivedMesh *dm );
-/* upload three unsigned chars, representing RGB colors, for each vertex */
+/* upload three unsigned chars, representing RGB colors, for each vertex. Resets dm->drawObject->colType to -1 */
void GPU_color3_upload( struct DerivedMesh *dm, char *data );
-/* upload four unsigned chars, representing RGBA colors, for each vertex */
+/* upload four unsigned chars, representing RGBA colors, for each vertex. Resets dm->drawObject->colType to -1 */
void GPU_color4_upload( struct DerivedMesh *dm, char *data );
+/* switch color rendering on=1/off=0 */
+void GPU_color_switch( int mode );
/* 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-22 18:19:18 UTC (rev 21082)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c 2009-06-22 19:35:52 UTC (rev 21083)
@@ -195,6 +195,10 @@
if( buffer == 0 )
return;
+ if( pool == 0 )
+ pool = globalPool;
+ if( pool == 0 )
+ globalPool = GPU_buffer_pool_new();
while( pool->start < 0 )
pool->start += MAX_FREE_GPU_BUFFERS;
@@ -216,6 +220,8 @@
MVert *mvert;
MFace *mface;
int numverts[256]; /* material number is an 8-bit char so there's at most 256 materials */
+ int redir[256]; /* material number is an 8-bit char so there's at most 256 materials */
+ int *index;
int i;
int curmat, curverts;
@@ -242,18 +248,36 @@
}
}
object->materials = MEM_mallocN(sizeof(GPUBufferMaterial)*object->nmaterials,"GPU_drawobject_new_materials");
+ index = MEM_mallocN(sizeof(int)*object->nmaterials,"GPU_buffer_setup_index");
curmat = curverts = 0;
for( i = 0; i < 256; i++ ) {
if( numverts[i] > 0 ) {
object->materials[curmat].mat_nr = i-127;
object->materials[curmat].start = curverts;
+ index[curmat] = curverts/3;
object->materials[curmat].end = curverts+numverts[i];
curverts += numverts[i];
curmat++;
}
}
+ object->faceRemap = MEM_mallocN(sizeof(int)*object->nelements/3,"GPU_drawobject_new_faceRemap");
+ for( i = 0; i < object->nmaterials; i++ ) {
+ redir[object->materials[i].mat_nr+127] = i; /* material number -> material index */
+ }
+ for( i=0; i < dm->getNumFaces(dm); i++ ) {
+ object->faceRemap[index[redir[mface[i].mat_nr+127]]] = i;
+ if( mface[i].v4 ) {
+ object->faceRemap[index[redir[mface[i].mat_nr+127]]+1] = i;
+ index[redir[mface[i].mat_nr+127]]+=2;
+ }
+ else
+ {
+ index[redir[mface[i].mat_nr+127]]++;
+ }
+ }
+ MEM_freeN(index);
return object;
}
@@ -265,7 +289,7 @@
DEBUG_VBO("GPU_drawobject_free\n");
MEM_freeN(object->materials);
-
+ MEM_freeN(object->faceRemap);
GPU_buffer_free( object->vertices, globalPool );
GPU_buffer_free( object->normals, globalPool );
GPU_buffer_free( object->uv, globalPool );
@@ -462,8 +486,10 @@
GPUBuffer *GPU_buffer_uv( DerivedMesh *dm )
{
DEBUG_VBO("GPU_buffer_uv\n");
-
- return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*2*dm->drawObject->nelements, 0, GPU_buffer_copy_uv);
+ if( DM_get_face_data_layer(dm, CD_MTFACE) != 0 )
+ return GPU_buffer_setup( dm, dm->drawObject, sizeof(float)*2*dm->drawObject->nelements, 0, GPU_buffer_copy_uv);
+ else
+ return 0;
}
void GPU_buffer_copy_color3( DerivedMesh *dm, float *varray_, int *index, int *redir, void *user )
@@ -477,6 +503,7 @@
DEBUG_VBO("GPU_buffer_copy_color3\n");
+ dm->drawObject->colType = -1;
mcol = user;
varray = (unsigned char *)varray_;
@@ -513,6 +540,7 @@
DEBUG_VBO("GPU_buffer_copy_color4\n");
+ dm->drawObject->colType = -1;
mcol = (unsigned char *)user;
varray = (unsigned char *)varray_;
@@ -547,8 +575,9 @@
DEBUG_VBO("GPU_buffer_color\n");
mcol = DM_get_face_data_layer(dm, CD_WEIGHT_MCOL);
- if(!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++ ) {
@@ -556,7 +585,14 @@
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 );
+
+ mcol = DM_get_face_data_layer(dm, CD_WEIGHT_MCOL);
+ dm->drawObject->colType = CD_WEIGHT_MCOL;
+ if(!mcol) {
+ dm->drawObject->colType = CD_MCOL;
+ }
MEM_freeN(colors);
return result;
}
@@ -608,16 +644,19 @@
dm->drawObject = GPU_drawobject_new( dm );
if( dm->drawObject->uv == 0 )
dm->drawObject->uv = GPU_buffer_uv( dm );
- glEnableClientState( GL_TEXTURE_COORD_ARRAY );
- if( useVBOs ) {
- glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->uv->id );
- glTexCoordPointer( 2, GL_FLOAT, 0, 0 );
+
+ if( dm->drawObject->uv != 0 ) {
+ glEnableClientState( GL_TEXTURE_COORD_ARRAY );
+ if( useVBOs ) {
+ glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->uv->id );
+ glTexCoordPointer( 2, GL_FLOAT, 0, 0 );
+ }
+ else {
+ glTexCoordPointer( 2, GL_FLOAT, 0, dm->drawObject->uv->pointer );
+ }
+
+ GLStates |= GPU_BUFFER_TEXCOORD_STATE;
}
- else {
- glTexCoordPointer( 2, GL_FLOAT, 0, dm->drawObject->uv->pointer );
- }
-
- GLStates |= GPU_BUFFER_TEXCOORD_STATE;
}
void GPU_color_setup( DerivedMesh *dm )
@@ -626,7 +665,7 @@
if( dm->drawObject == 0 )
dm->drawObject = GPU_drawobject_new( dm );
if( dm->drawObject->colors == 0 )
- dm->drawObject->colors = GPU_buffer_uv( dm );
+ dm->drawObject->colors = GPU_buffer_color( dm );
glEnableClientState( GL_COLOR_ARRAY );
if( useVBOs ) {
glBindBufferARB( GL_ARRAY_BUFFER_ARB, dm->drawObject->colors->id );
@@ -670,4 +709,18 @@
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_color4 );
+}
+
+void GPU_color_switch( int mode )
+{
+ if( mode ) {
+ if( !GLStates & GPU_BUFFER_COLOR_STATE )
+ glEnableClientState( GL_COLOR_ARRAY );
+ GLStates |= GPU_BUFFER_COLOR_STATE;
+ }
+ else {
+ if( GLStates & GPU_BUFFER_COLOR_STATE )
+ glDisableClientState( GL_COLOR_ARRAY );
+ GLStates &= (!GPU_BUFFER_COLOR_STATE);
+ }
}
\ No newline at end of file
More information about the Bf-blender-cvs
mailing list