[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21312] branches/soc-2009-imbusy/source/ blender: fixed a crash + some more legacy code is back
Lukas Steiblys
imbusy at imbusy.org
Thu Jul 2 13:01:03 CEST 2009
Revision: 21312
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21312
Author: imbusy
Date: 2009-07-02 13:01:03 +0200 (Thu, 02 Jul 2009)
Log Message:
-----------
fixed a crash + some more legacy code is back
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-07-02 10:45:22 UTC (rev 21311)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c 2009-07-02 11:01:03 UTC (rev 21312)
@@ -267,7 +267,7 @@
glVertex3fv(mvert[index].co); \
}
- if( dm->drawObject->legacy ) {
+ if( GPU_buffer_legacy(dm) ) {
DEBUG_VBO( "Using legacy code. cdDM_drawFacesSolid" );
glBegin(glmode = GL_QUADS);
for(a = 0; a < dm->numFaceData; a++, mface++) {
@@ -356,7 +356,7 @@
if(col1 && col2)
glEnable(GL_CULL_FACE);
- if( dm->drawObject->legacy ) {
+ if( GPU_buffer_legacy(dm) ) {
DEBUG_VBO( "Using legacy code. cdDM_drawFacesColored" );
glShadeModel(GL_SMOOTH);
glBegin(glmode = GL_QUADS);
@@ -429,141 +429,146 @@
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;
+
+ if( GPU_buffer_legacy(dm) ) {
+ DEBUG_VBO( "Using legacy code. cdDM_drawFacesTex_common" );
+ for(i = 0; i < dm->numFaceData; i++, mf++) {
+ MVert *mvert;
+ int flag;
+ unsigned char *cp = NULL;
+
+ if(drawParams) {
+ flag = drawParams(tf? &tf[i]: NULL, mcol? &mcol[i*4]: NULL, mf->mat_nr);
}
- GPU_color3_upload(dm,colors);
- MEM_freeN(colors);
- dm->drawObject->colType = CD_MCOL;
- }
- GPU_color_setup( dm );
- }
+ else {
+ if(index) {
+ orig = *index++;
+ if(orig == ORIGINDEX_NONE) { if(nors) nors += 3; continue; }
+ if(drawParamsMapped) flag = drawParamsMapped(userData, orig);
+ else { if(nors) nors += 3; continue; }
+ }
+ else
+ if(drawParamsMapped) flag = drawParamsMapped(userData, i);
+ else { if(nors) nors += 3; continue; }
+ }
+
+ if(flag != 0) {
+ if (flag==1 && mcol)
+ cp= (unsigned char*) &mcol[i*4];
- 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(!(mf->flag&ME_SMOOTH)) {
+ if (nors) {
+ glNormal3fv(nors);
+ }
+ else {
+ float nor[3];
+ if(mf->v4) {
+ CalcNormFloat4(mv[mf->v1].co, mv[mf->v2].co,
+ mv[mf->v3].co, mv[mf->v4].co,
+ nor);
+ } else {
+ CalcNormFloat(mv[mf->v1].co, mv[mf->v2].co,
+ mv[mf->v3].co, nor);
+ }
+ glNormal3fv(nor);
+ }
+ }
- 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);
+ glBegin(mf->v4?GL_QUADS:GL_TRIANGLES);
+ if(tf) glTexCoord2fv(tf[i].uv[0]);
+ if(cp) glColor3ub(cp[3], cp[2], cp[1]);
+ mvert = &mv[mf->v1];
+ if(mf->flag&ME_SMOOTH) glNormal3sv(mvert->no);
+ glVertex3fv(mvert->co);
+
+ if(tf) glTexCoord2fv(tf[i].uv[1]);
+ if(cp) glColor3ub(cp[7], cp[6], cp[5]);
+ mvert = &mv[mf->v2];
+ if(mf->flag&ME_SMOOTH) glNormal3sv(mvert->no);
+ glVertex3fv(mvert->co);
+
+ if(tf) glTexCoord2fv(tf[i].uv[2]);
+ if(cp) glColor3ub(cp[11], cp[10], cp[9]);
+ mvert = &mv[mf->v3];
+ if(mf->flag&ME_SMOOTH) glNormal3sv(mvert->no);
+ glVertex3fv(mvert->co);
+
+ if(mf->v4) {
+ if(tf) glTexCoord2fv(tf[i].uv[3]);
+ if(cp) glColor3ub(cp[15], cp[14], cp[13]);
+ mvert = &mv[mf->v4];
+ if(mf->flag&ME_SMOOTH) glNormal3sv(mvert->no);
+ glVertex3fv(mvert->co);
+ }
+ glEnd();
}
- else
- if(drawParamsMapped)
- flag = drawParamsMapped(userData, actualFace);
+
+ if(nors) nors += 3;
}
- 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);
+ } else { /* use OpenGL VBOs or Vertex Arrays instead for better, faster rendering */
+ 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;
}
- lastFlag = flag;
- startFace = i;
+ GPU_color_setup( dm );
}
- }
- 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;
- if(drawParams) {
- flag = drawParams(tf? &tf[i]: NULL, mcol? &mcol[i*4]: NULL, mf->mat_nr);
- }
- else {
- if(index) {
- orig = *index++;
- if(orig == ORIGINDEX_NONE) { if(nors) nors += 3; continue; }
- if(drawParamsMapped) flag = drawParamsMapped(userData, orig);
- else { if(nors) nors += 3; continue; }
+ 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(drawParamsMapped) flag = drawParamsMapped(userData, i);
- else { if(nors) nors += 3; continue; }
- }
-
- if(flag != 0) {
- if (flag==1 && mcol)
- cp= (unsigned char*) &mcol[i*4];
-
- if(!(mf->flag&ME_SMOOTH)) {
- if (nors) {
- glNormal3fv(nors);
+ else {
+ if(index) {
+ orig = index[actualFace];
+ if(drawParamsMapped)
+ flag = drawParamsMapped(userData, orig);
}
- else {
- float nor[3];
- if(mf->v4) {
- CalcNormFloat4(mv[mf->v1].co, mv[mf->v2].co,
- mv[mf->v3].co, mv[mf->v4].co,
- nor);
- } else {
- CalcNormFloat(mv[mf->v1].co, mv[mf->v2].co,
- mv[mf->v3].co, nor);
+ 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);
}
- glNormal3fv(nor);
}
+ lastFlag = flag;
+ startFace = i;
}
-
- glBegin(mf->v4?GL_QUADS:GL_TRIANGLES);
- if(tf) glTexCoord2fv(tf[i].uv[0]);
- if(cp) glColor3ub(cp[3], cp[2], cp[1]);
- mvert = &mv[mf->v1];
- if(mf->flag&ME_SMOOTH) glNormal3sv(mvert->no);
- glVertex3fv(mvert->co);
-
- if(tf) glTexCoord2fv(tf[i].uv[1]);
- if(cp) glColor3ub(cp[7], cp[6], cp[5]);
- mvert = &mv[mf->v2];
- if(mf->flag&ME_SMOOTH) glNormal3sv(mvert->no);
- glVertex3fv(mvert->co);
-
- if(tf) glTexCoord2fv(tf[i].uv[2]);
- if(cp) glColor3ub(cp[11], cp[10], cp[9]);
- mvert = &mv[mf->v3];
- if(mf->flag&ME_SMOOTH) glNormal3sv(mvert->no);
- glVertex3fv(mvert->co);
-
- if(mf->v4) {
- if(tf) glTexCoord2fv(tf[i].uv[3]);
- if(cp) glColor3ub(cp[15], cp[14], cp[13]);
- mvert = &mv[mf->v4];
- if(mf->flag&ME_SMOOTH) glNormal3sv(mvert->no);
- glVertex3fv(mvert->co);
+ }
+ 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);
}
- glEnd();
}
-
- if(nors) nors += 3;
- }*/
+ GPU_buffer_unbind();
+ glShadeModel( GL_FLAT );
+ }
}
static void cdDM_drawFacesTex(DerivedMesh *dm, int (*setDrawOptions)(MTFace *tface, MCol *mcol, int matnr))
@@ -584,86 +589,88 @@
if(!mc)
mc = DM_get_face_data_layer(dm, CD_MCOL);
- /* 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();
+ if( GPU_buffer_legacy(dm) ) {
+ DEBUG_VBO( "Using legacy code. cdDM_drawFacesTex_common" );
+ for(i = 0; i < dm->numFaceData; i++, mf++) {
+ int drawSmooth = (mf->flag & ME_SMOOTH);
- /* old code */
- /*for(i = 0; i < dm->numFaceData; i++, mf++) {
- int drawSmooth = (mf->flag & ME_SMOOTH);
+ if(index) {
+ orig = *index++;
+ if(setDrawOptions && orig == ORIGINDEX_NONE)
+ { if(nors) nors += 3; continue; }
+ }
+ else
+ orig = i;
- if(index) {
- orig = *index++;
- if(setDrawOptions && orig == ORIGINDEX_NONE)
- { if(nors) nors += 3; continue; }
- }
- else
- orig = i;
+ if(!setDrawOptions || setDrawOptions(userData, orig, &drawSmooth)) {
+ unsigned char *cp = NULL;
- if(!setDrawOptions || setDrawOptions(userData, orig, &drawSmooth)) {
- unsigned char *cp = NULL;
+ if(useColors && mc)
+ cp = (unsigned char *)&mc[i * 4];
- if(useColors && mc)
- cp = (unsigned char *)&mc[i * 4];
+ glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
+ glBegin(mf->v4?GL_QUADS:GL_TRIANGLES);
- glShadeModel(drawSmooth?GL_SMOOTH:GL_FLAT);
- glBegin(mf->v4?GL_QUADS:GL_TRIANGLES);
+ if (!drawSmooth) {
+ if (nors) {
+ glNormal3fv(nors);
+ }
+ else {
+ float nor[3];
+ if(mf->v4) {
+ CalcNormFloat4(mv[mf->v1].co, mv[mf->v2].co,
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list