Revision: 21311
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21311
Author:   imbusy
Date:     2009-07-02 12:45:22 +0200 (Thu, 02 Jul 2009)

Log Message:
-----------
some rendering modes now have old and new code + fixed one small bug for linux, 
as the branch was impossible to build

Modified Paths:
--------------
    branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.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:10:54 UTC (rev 21310)
+++ branches/soc-2009-imbusy/source/blender/blenkernel/intern/cdderivedmesh.c   
2009-07-02 10:45:22 UTC (rev 21311)
@@ -253,15 +253,84 @@
 
 static void cdDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int, void 
*attribs))
 {
-       int i;
-       GPU_vertex_setup( dm );
-       GPU_normal_setup( dm );
-       glShadeModel(GL_SMOOTH);
-       for( i = 0; i < dm->drawObject->nmaterials; i++ ) {
-               setMaterial(dm->drawObject->materials[i].mat_nr+1, NULL);
-               glDrawArrays(GL_TRIANGLES, dm->drawObject->materials[i].start, 
dm->drawObject->materials[i].end);
+       CDDerivedMesh *cddm = (CDDerivedMesh*) dm;
+       MVert *mvert = cddm->mvert;
+       MFace *mface = cddm->mface;
+       float *nors= dm->getFaceDataArray(dm, CD_NORMAL);
+       int a, glmode = -1, shademodel = -1, matnr = -1, drawCurrentMat = 1;
+
+#define PASSVERT(index) {                                              \
+       if(shademodel == GL_SMOOTH) {                           \
+               short *no = mvert[index].no;                    \
+               glNormal3sv(no);                                                
\
+       }                                                                       
                \
+       glVertex3fv(mvert[index].co);   \
+}
+
+       if( dm->drawObject->legacy ) {
+               DEBUG_VBO( "Using legacy code. cdDM_drawFacesSolid" );
+               glBegin(glmode = GL_QUADS);
+               for(a = 0; a < dm->numFaceData; a++, mface++) {
+                       int new_glmode, new_matnr, new_shademodel;
+
+                       new_glmode = mface->v4?GL_QUADS:GL_TRIANGLES;
+                       new_matnr = mface->mat_nr + 1;
+                       new_shademodel = (mface->flag & 
ME_SMOOTH)?GL_SMOOTH:GL_FLAT;
+                       
+                       if(new_glmode != glmode || new_matnr != matnr
+                          || new_shademodel != shademodel) {
+                               glEnd();
+
+                               drawCurrentMat = setMaterial(matnr = new_matnr, 
NULL);
+
+                               glShadeModel(shademodel = new_shademodel);
+                               glBegin(glmode = new_glmode);
+                       } 
+                       
+                       if(drawCurrentMat) {
+                               if(shademodel == GL_FLAT) {
+                                       if (nors) {
+                                               glNormal3fv(nors);
+                                       }
+                                       else {
+                                               /* TODO make this better (cache 
facenormals as layer?) */
+                                               float nor[3];
+                                               if(mface->v4) {
+                                                       
CalcNormFloat4(mvert[mface->v1].co, mvert[mface->v2].co,
+                                                                               
   mvert[mface->v3].co, mvert[mface->v4].co,
+                                                                               
   nor);
+                                               } else {
+                                                       
CalcNormFloat(mvert[mface->v1].co, mvert[mface->v2].co,
+                                                                               
  mvert[mface->v3].co, nor);
+                                               }
+                                               glNormal3fv(nor);
+                                       }
+                               }
+
+                               PASSVERT(mface->v1);
+                               PASSVERT(mface->v2);
+                               PASSVERT(mface->v3);
+                               if(mface->v4) {
+                                       PASSVERT(mface->v4);
+                               }
+                       }
+
+                       if(nors) nors += 3;
+               }
+               glEnd();
        }
-       GPU_buffer_unbind( );
+       else {  /* use OpenGL VBOs or Vertex Arrays instead for better, faster 
rendering */
+               GPU_vertex_setup( dm );
+               GPU_normal_setup( dm );
+               glShadeModel(GL_SMOOTH);
+               for( a = 0; a < dm->drawObject->nmaterials; a++ ) {
+                       setMaterial(dm->drawObject->materials[a].mat_nr+1, 
NULL);
+                       glDrawArrays(GL_TRIANGLES, 
dm->drawObject->materials[a].start, dm->drawObject->materials[a].end);
+               }
+               GPU_buffer_unbind( );
+       }
+
+#undef PASSVERT
        glShadeModel(GL_FLAT);
 }
 
@@ -287,20 +356,61 @@
        if(col1 && col2)
                glEnable(GL_CULL_FACE);
 
-       GPU_color4_upload(dm,cp1);
-       GPU_vertex_setup(dm);
-       GPU_color_setup(dm);
-       glShadeModel(GL_SMOOTH);
-       glDrawArrays(GL_TRIANGLES, 0, dm->drawObject->nelements);
+       if( dm->drawObject->legacy ) {
+               DEBUG_VBO( "Using legacy code. cdDM_drawFacesColored" );
+               glShadeModel(GL_SMOOTH);
+               glBegin(glmode = GL_QUADS);
+               for(a = 0; a < dm->numFaceData; a++, mface++, cp1 += 16) {
+                       int new_glmode = mface->v4?GL_QUADS:GL_TRIANGLES;
 
-       if( useTwoSided ) {
-               GPU_color4_upload(dm,cp2);
+                       if(new_glmode != glmode) {
+                               glEnd();
+                               glBegin(glmode = new_glmode);
+                       }
+                               
+                       glColor3ub(cp1[0], cp1[1], cp1[2]);
+                       glVertex3fv(mvert[mface->v1].co);
+                       glColor3ub(cp1[4], cp1[5], cp1[6]);
+                       glVertex3fv(mvert[mface->v2].co);
+                       glColor3ub(cp1[8], cp1[9], cp1[10]);
+                       glVertex3fv(mvert[mface->v3].co);
+                       if(mface->v4) {
+                               glColor3ub(cp1[12], cp1[13], cp1[14]);
+                               glVertex3fv(mvert[mface->v4].co);
+                       }
+                               
+                       if(useTwoSided) {
+                               glColor3ub(cp2[8], cp2[9], cp2[10]);
+                               glVertex3fv(mvert[mface->v3].co );
+                               glColor3ub(cp2[4], cp2[5], cp2[6]);
+                               glVertex3fv(mvert[mface->v2].co );
+                               glColor3ub(cp2[0], cp2[1], cp2[2]);
+                               glVertex3fv(mvert[mface->v1].co );
+                               if(mface->v4) {
+                                       glColor3ub(cp2[12], cp2[13], cp2[14]);
+                                       glVertex3fv(mvert[mface->v4].co );
+                               }
+                       }
+                       if(col2) cp2 += 16;
+               }
+               glEnd();
+       }
+       else { /* use OpenGL VBOs or Vertex Arrays instead for better, faster 
rendering */
+               GPU_color4_upload(dm,cp1);
+               GPU_vertex_setup(dm);
                GPU_color_setup(dm);
-               glCullFace(GL_FRONT);
+               glShadeModel(GL_SMOOTH);
                glDrawArrays(GL_TRIANGLES, 0, dm->drawObject->nelements);
-               glCullFace(GL_BACK);
+
+               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();
        }
-       GPU_buffer_unbind();
 
        glShadeModel(GL_FLAT);
        glDisable(GL_CULL_FACE);

Modified: 
branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c   
2009-07-02 10:10:54 UTC (rev 21310)
+++ branches/soc-2009-imbusy/source/blender/editors/space_view3d/drawobject.c   
2009-07-02 10:45:22 UTC (rev 21311)
@@ -95,7 +95,7 @@
 #include "GPU_draw.h"
 #include "GPU_material.h"
 #include "GPU_extensions.h"
-#include "GPU_buffers.h"
+#include "gpu_buffers.h"
 
 #include "ED_mesh.h"
 #include "ED_particle.h"

Modified: branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h   2009-07-02 
10:10:54 UTC (rev 21310)
+++ branches/soc-2009-imbusy/source/blender/gpu/gpu_buffers.h   2009-07-02 
10:45:22 UTC (rev 21311)
@@ -34,6 +34,7 @@
 #define __GPU_BUFFERS_H__
 
 #define MAX_FREE_GPU_BUFFERS 8
+#define DEBUG_VBO(X) printf(X)
 
 struct DerivedMesh;
 

Modified: branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c
===================================================================
--- branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c    
2009-07-02 10:10:54 UTC (rev 21310)
+++ branches/soc-2009-imbusy/source/blender/gpu/intern/gpu_buffers.c    
2009-07-02 10:45:22 UTC (rev 21311)
@@ -46,8 +46,6 @@
 #define GPU_BUFFER_TEXCOORD_STATE 4
 #define GPU_BUFFER_COLOR_STATE 8
 
-#define DEBUG_VBO(X) printf(X)
-
 /* -1 - undefined, 0 - vertex arrays, 1 - VBOs */
 int useVBOs = -1;
 GPUBufferPool *globalPool = 0;
@@ -339,6 +337,10 @@
                                if( globalPool->size > 0 ) {
                                        GPU_buffer_pool_delete_last( globalPool 
);
                                        buffer = GPU_buffer_alloc( size, 
globalPool );
+                                       if( buffer == 0 ) {
+                                               dm->drawObject->legacy = 1;
+                                               success = 1;
+                                       }
                                }
                                else {
                                        dm->drawObject->legacy = 1;


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

Reply via email to