Revision: 20409
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20409
Author:   dfelinto
Date:     2009-05-25 23:15:19 +0200 (Mon, 25 May 2009)

Log Message:
-----------
Patch:[#17523] BGE VBO patch by Samuel Anjam (toonist)
- patch updated for recent trunk.

This patch implement a VBO option to handle skinned meshes.
It doesn't give better performance than Display List (at least not in 
un-skinned meshes).

But this is an important addition to in the near future implement full GLSL 
skinned objects.

Modified Paths:
--------------
    branches/bb_dev/source/gameengine/Rasterizer/RAS_IRasterizer.h
    branches/bb_dev/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
    branches/bb_dev/source/gameengine/Rasterizer/RAS_MaterialBucket.h
    
branches/bb_dev/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h

Modified: branches/bb_dev/source/gameengine/Rasterizer/RAS_IRasterizer.h
===================================================================
--- branches/bb_dev/source/gameengine/Rasterizer/RAS_IRasterizer.h      
2009-05-25 20:48:52 UTC (rev 20408)
+++ branches/bb_dev/source/gameengine/Rasterizer/RAS_IRasterizer.h      
2009-05-25 21:15:19 UTC (rev 20409)
@@ -45,6 +45,7 @@
 
 class RAS_ICanvas;
 class RAS_IPolyMaterial;
+class RAS_MeshSlot;
 
 typedef vector<unsigned short> KX_IndexArray;
 typedef vector<RAS_TexVert> KX_VertexArray;
@@ -407,6 +408,10 @@
 
        virtual void    SetBlendingMode(int blendmode)=0;
        virtual void    SetFrontFace(bool ccw)=0;
+
+       // updates mesh data (vbo addition)
+       virtual void UpdateMeshSlotData(class RAS_MeshSlot *ms,
+               const bool &anim, const bool &zsort)=0;
 };
 
 #endif //__RAS_IRASTERIZER

Modified: branches/bb_dev/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
===================================================================
--- branches/bb_dev/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp 
2009-05-25 20:48:52 UTC (rev 20408)
+++ branches/bb_dev/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp 
2009-05-25 21:15:19 UTC (rev 20409)
@@ -40,6 +40,29 @@
 #include "RAS_MeshObject.h"
 #include "RAS_Deformer.h"      // __NLA
 
+/* vertex buffer object slot */
+
+#include "RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h"
+
+RAS_VboSlot::RAS_VboSlot(RAS_VAOpenGLRasterizer *rasty)
+{
+       m_rasty = rasty;
+       m_vertVbo = 0;
+       m_indexVbo = 0;
+       m_normalVbo = 0;
+       m_tangentVbo = 0;
+       m_colorVbo = 0;
+       m_verts = 0;
+       m_texCoordVbo[0] = 0;
+       m_texCoordVbo[1] = 0;
+};
+
+RAS_VboSlot::~RAS_VboSlot()
+{
+       m_rasty->ClearVboSlot(this);
+       if(m_verts) delete []m_verts;
+}
+
 /* mesh slot */
 
 RAS_MeshSlot::RAS_MeshSlot() : SG_QList()
@@ -158,6 +181,7 @@
 
                it.vertex = &it.array->m_vertex[0];
                it.index = &it.array->m_index[startindex];
+               it.vboslot = it.array->m_vboSlot;
                it.startvertex = startvertex;
                it.endvertex = endvertex;
                it.totindex = endindex-startindex;
@@ -189,6 +213,7 @@
 
                it.vertex = &it.array->m_vertex[0];
                it.index = &it.array->m_index[startindex];
+               it.vboslot = it.array->m_vboSlot;
                it.startvertex = startvertex;
                it.endvertex = endvertex;
                it.totindex = endindex-startindex;
@@ -210,6 +235,7 @@
        RAS_DisplayArrayList::iterator it;
        RAS_DisplayArray *darray = NULL;
        
+       // find an array which doesn't contain the max amount of 
indices/vertices
        for(it=m_displayArrays.begin(); it!=m_displayArrays.end(); it++) {
                darray = *it;
 
@@ -602,6 +628,9 @@
        if(IsZSort() && rasty->GetDrawingMode() >= RAS_IRasterizer::KX_SOLID)
                ms.m_mesh->SortPolygons(ms, 
cameratrans*MT_Transform(ms.m_OpenGLMatrix));
 
+       rasty->UpdateMeshSlotData(&ms, (ms.m_pDeformer != 0),
+               (IsZSort() && rasty->GetDrawingMode() >= 
RAS_IRasterizer::KX_SOLID));
+
        rendertools->PushMatrix();
        if (!ms.m_pDeformer || !ms.m_pDeformer->SkipVertexTransform())
        {

Modified: branches/bb_dev/source/gameengine/Rasterizer/RAS_MaterialBucket.h
===================================================================
--- branches/bb_dev/source/gameengine/Rasterizer/RAS_MaterialBucket.h   
2009-05-25 20:48:52 UTC (rev 20408)
+++ branches/bb_dev/source/gameengine/Rasterizer/RAS_MaterialBucket.h   
2009-05-25 21:15:19 UTC (rev 20409)
@@ -72,6 +72,35 @@
 class RAS_MaterialBucket;
 struct DerivedMesh;
 
+/* Vertex Buffer Object data used for OpenGL drawing */
+
+class RAS_VAOpenGLRasterizer;
+
+class RAS_VboSlot
+{
+public:
+       RAS_VAOpenGLRasterizer *m_rasty;
+       /* vertex buffer object handles for drawing */
+       unsigned int m_vertVbo;
+       unsigned int m_indexVbo;
+       unsigned int m_normalVbo;
+       unsigned int m_tangentVbo;
+       unsigned int m_colorVbo;
+       /* allow up to four texture coordinate sets */
+       unsigned int m_texCoordVbo[2];
+       /* m_verts only exists if the mesh is deformable.
+       glBufferSubDataARB is used for updating the vertices
+       and this function doesn't take stride parameter, so all of
+       the vertice data has to be passed to an new array and THEN
+       uploaded to the vbo. glMapBuffer could be an alternative,
+       but it doesn't return untill the GPU has processed the previous
+       data, so this might be the fastes way. */
+       float *m_verts;
+
+       RAS_VboSlot(RAS_VAOpenGLRasterizer *rasty);
+       ~RAS_VboSlot();
+};
+
 /* An array with data used for OpenGL drawing */
 
 class RAS_DisplayArray
@@ -81,10 +110,14 @@
        vector<unsigned short> m_index;
        enum { LINE = 2, TRIANGLE = 3, QUAD = 4 } m_type;
        //RAS_MeshSlot *m_origSlot;
+       RAS_VboSlot *m_vboSlot;
        int m_users;
 
        enum { BUCKET_MAX_INDEX = 65535 };
        enum { BUCKET_MAX_VERTEX = 65535 };
+
+       RAS_DisplayArray() : m_vboSlot(0) {};
+       ~RAS_DisplayArray() {if(m_vboSlot) delete m_vboSlot;}
 };
 
 /* Entry of a RAS_MeshObject into RAS_MaterialBucket */
@@ -139,6 +172,7 @@
        struct iterator {
                RAS_DisplayArray *array;
                RAS_TexVert *vertex;
+               RAS_VboSlot *vboslot;
                unsigned short *index;
                size_t startvertex;
                size_t endvertex;

Modified: 
branches/bb_dev/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
===================================================================
--- 
branches/bb_dev/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
    2009-05-25 20:48:52 UTC (rev 20408)
+++ 
branches/bb_dev/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
    2009-05-25 21:15:19 UTC (rev 20409)
@@ -289,6 +289,10 @@
 
        virtual void    SetBlendingMode(int blendmode);
        virtual void    SetFrontFace(bool ccw);
+
+       // updates mesh data (vbo addition)
+       virtual void    UpdateMeshSlotData(class RAS_MeshSlot *ms,
+               const bool &anim, const bool &zsort) {};
 };
 
 #endif //__RAS_OPENGLRASTERIZER


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

Reply via email to