Revision: 22120
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22120
Author:   imbusy
Date:     2009-08-01 15:13:44 +0200 (Sat, 01 Aug 2009)

Log Message:
-----------
improved edit mode face rendering

Modified Paths:
--------------
    branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c
    branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c

Modified: 
branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c     
2009-08-01 12:49:39 UTC (rev 22119)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/DerivedMesh.c     
2009-08-01 13:13:44 UTC (rev 22120)
@@ -491,9 +491,12 @@
                }
                glEnd();
        } else {
-               /*GPUBuffer *buffer = GPU_buffer_alloc( 
sizeof(float)*3*2*emdm->em->totedge, 0 );
+               GPUBuffer *buffer = 0;
                float *varray;
-               if( (varray = GPU_buffer_lock( buffer )) ) {
+               if( setDrawOptions == 0 ) {
+                       buffer = GPU_buffer_alloc( 
sizeof(float)*3*2*emdm->em->totedge, 0 );
+               }
+               if( buffer != 0 && (varray = GPU_buffer_lock( buffer )) ) {
                        int prevdraw = 0;
                        int numedges = 0;
                        int draw = 0;
@@ -525,7 +528,7 @@
                                glDrawArrays(GL_LINES,0,numedges*2);
                        }
                        GPU_buffer_unbind();
-               } else {*/
+               } else {
                        glBegin(GL_LINES);
                        for(i=0,eed= emdm->em->edges.first; eed; i++,eed= 
eed->next) {
                                if(!setDrawOptions || setDrawOptions(userData, 
i)) {
@@ -534,8 +537,9 @@
                                }
                        }
                        glEnd();
-               /*}
-               GPU_buffer_free( buffer, 0 );*/
+               }
+               if( buffer != 0 )
+                       GPU_buffer_free( buffer, 0 );
        }
 }
 static void emDM_drawEdges(DerivedMesh *dm, int drawLooseEdges)
@@ -696,10 +700,13 @@
                        }
                }
        } else {
-               /* 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 );
+               GPUBuffer *buffer = 0;
                float *varray;
-               if( (varray = GPU_buffer_lock( buffer )) ) {
+               if( setDrawOptions == 0 ) {
+                       /* 3 floats for position, 3 for normal and times two 
because the faces may actually be quads instead of triangles */
+                       buffer = GPU_buffer_alloc( 
sizeof(float)*6*emdm->em->totface*3*2, 0 );
+               }
+               if( buffer != 0 && (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 };
@@ -714,7 +721,6 @@
                                        if( prevdraw==2 ) {
                                                glEnable(GL_POLYGON_STIPPLE);
                                                
glPolygonStipple(stipple_quarttone);
-                                               glDisable(GL_POLYGON_STIPPLE);
                                        }
                                        GPU_buffer_unlock( buffer );
                                        glDrawArrays(GL_TRIANGLES,0,numfaces*3);
@@ -784,7 +790,7 @@
                                }
                        }
                        GPU_buffer_unbind();
-               } else {*/
+               } 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);
@@ -820,8 +826,9 @@
                                                glDisable(GL_POLYGON_STIPPLE);
                                }
                        }
-               /*}
-               GPU_buffer_free( buffer, 0 );*/
+               }
+               if( buffer != 0 )
+                       GPU_buffer_free( buffer, 0 );
        }
 }
 

Modified: 
branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c   
2009-08-01 12:49:39 UTC (rev 22119)
+++ branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c   
2009-08-01 13:13:44 UTC (rev 22120)
@@ -2349,13 +2349,167 @@
                        }
                }
                else {
+                       EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) 
finalDM;
+                       /* 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;
+                       EditFace *efa;
+                       int i, curmat = 0, draw = 0;
+
                        glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, me->flag & 
ME_TWOSIDED);
 
                        glEnable(GL_LIGHTING);
                        glFrontFace((ob->transflag&OB_NEG_SCALE)?GL_CW:GL_CCW);
 
-                       finalDM->drawMappedFaces(finalDM, 
draw_em_fancy__setFaceOpts, 0, 0);
+                       if( (varray = GPU_buffer_lock( buffer )) ) {
+                               int prevdraw = 0, prevmat = 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);
+                                       if( efa->h == 0 ) {
+                                               curmat = efa->mat_nr+1;
+                                               draw = 1;
+                                       } 
+                                       else {
+                                               draw = 0;
+                                       }
+                                       if( ((prevdraw != draw) || (curmat != 
prevmat)) && prevdraw != 0 && numfaces > 0) {
+                                               if( prevdraw==2 ) {
+                                                       
glEnable(GL_POLYGON_STIPPLE);
+                                                       
glPolygonStipple(stipple_quarttone);
+                                               }
+                                               GPU_buffer_unlock( buffer );
+                                               GPU_enable_material(prevmat, 
NULL);
+                                               
glDrawArrays(GL_TRIANGLES,0,numfaces*3);
+                                               if( prevdraw==2 ) {
+                                                       
glDisable(GL_POLYGON_STIPPLE);
+                                               }
+                                               varray = GPU_buffer_lock( 
buffer );
+                                               numfaces = 0;
+                                       }
+                                       if( draw != 0 ) {
+                                               if(!drawSmooth) {
+                                                       if( emdm->vertexCos )
+                                                       {
+                                                               
VECCOPY(&varray[numfaces*18],emdm->vertexCos[(int) efa->v1->tmp.l]);
+                                                               
VECCOPY(&varray[numfaces*18+3],emdm->faceNos[i]);
 
+                                                               
VECCOPY(&varray[numfaces*18+6],emdm->vertexCos[(int) efa->v2->tmp.l]);
+                                                               
VECCOPY(&varray[numfaces*18+9],emdm->faceNos[i]);
+
+                                                               
VECCOPY(&varray[numfaces*18+12],emdm->vertexCos[(int) efa->v3->tmp.l]);
+                                                               
VECCOPY(&varray[numfaces*18+15],emdm->faceNos[i]);
+                                                               numfaces++;
+                                                               if( efa->v4 ) {
+                                                                       
VECCOPY(&varray[numfaces*18],emdm->vertexCos[(int) efa->v3->tmp.l]);
+                                                                       
VECCOPY(&varray[numfaces*18+3],emdm->faceNos[i]);
+
+                                                                       
VECCOPY(&varray[numfaces*18+6],emdm->vertexCos[(int) efa->v4->tmp.l]);
+                                                                       
VECCOPY(&varray[numfaces*18+9],emdm->faceNos[i]);
+
+                                                                       
VECCOPY(&varray[numfaces*18+12],emdm->vertexCos[(int) efa->v1->tmp.l]);
+                                                                       
VECCOPY(&varray[numfaces*18+15],emdm->faceNos[i]);
+                                                                       
numfaces++;
+                                                               }
+                                                       }
+                                                       else {
+                                                               
VECCOPY(&varray[numfaces*18],efa->v1->co);
+                                                               
VECCOPY(&varray[numfaces*18+3],efa->n);
+
+                                                               
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 {
+                                                       if( emdm->vertexCos )
+                                                       {
+                                                               
VECCOPY(&varray[numfaces*18],emdm->vertexCos[(int) efa->v1->tmp.l]);
+                                                               
VECCOPY(&varray[numfaces*18+3],emdm->vertexNos[(int) efa->v1->tmp.l]);
+
+                                                               
VECCOPY(&varray[numfaces*18+6],emdm->vertexCos[(int) efa->v2->tmp.l]);
+                                                               
VECCOPY(&varray[numfaces*18+9],emdm->vertexNos[(int) efa->v2->tmp.l]);
+
+                                                               
VECCOPY(&varray[numfaces*18+12],emdm->vertexCos[(int) efa->v3->tmp.l]);
+                                                               
VECCOPY(&varray[numfaces*18+15],emdm->vertexNos[(int) efa->v3->tmp.l]);
+                                                               numfaces++;
+                                                               if( efa->v4 ) {
+                                                                       
VECCOPY(&varray[numfaces*18],emdm->vertexCos[(int) efa->v3->tmp.l]);
+                                                                       
VECCOPY(&varray[numfaces*18+3],emdm->vertexNos[(int) efa->v3->tmp.l]);
+
+                                                                       
VECCOPY(&varray[numfaces*18+6],emdm->vertexCos[(int) efa->v4->tmp.l]);
+                                                                       
VECCOPY(&varray[numfaces*18+9],emdm->vertexNos[(int) efa->v4->tmp.l]);
+
+                                                                       
VECCOPY(&varray[numfaces*18+12],emdm->vertexCos[(int) efa->v1->tmp.l]);
+                                                                       
VECCOPY(&varray[numfaces*18+15],emdm->vertexNos[(int) efa->v1->tmp.l]);
+                                                                       
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++;
+                                                               }
+                                                       }
+                                               }
+                                       }
+                                       prevdraw = draw;
+                                       prevmat = curmat;
+                               }
+                               GPU_buffer_unlock( buffer );
+                               if( prevdraw != 0 && numfaces > 0) {
+                                       if( prevdraw==2 ) {
+                                               glEnable(GL_POLYGON_STIPPLE);
+                                               
glPolygonStipple(stipple_quarttone);
+                                       }
+                                       GPU_enable_material(prevmat, NULL);
+                                       glDrawArrays(GL_TRIANGLES,0,numfaces*3);
+                                       if( prevdraw==2 ) {
+                                               glDisable(GL_POLYGON_STIPPLE);
+                                       }
+                               }
+                               GPU_buffer_unbind();
+                       }
+                       else {
+                               finalDM->drawMappedFaces(finalDM, 
draw_em_fancy__setFaceOpts, 0, 0);
+                       }
+                       GPU_buffer_free(buffer,0);
+
                        glFrontFace(GL_CCW);
                        glDisable(GL_LIGHTING);
                }


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

Reply via email to