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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to