Revision: 15229
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15229
Author:   blendix
Date:     2008-06-15 01:51:01 +0200 (Sun, 15 Jun 2008)

Log Message:
-----------
Apricot Branch:

Some optimizations to decrease game engine startup time:
* Exporting skinned meshes was doing O(n^2) lookups for vertices and
  deform weights, now uses same trick as regular meshes.
* Share GLSL shaders with the game engine so they don't have to be
  recompiled. This required changes to the rasterization in the game
  engine to add an option to use attributes instead of texture 
  coordinates.
* Some small optimizations in bullet BVH building, though could be
  improved more, since it takes about 50% of startup time still in
  my test .blend.

Modified Paths:
--------------
    
branches/apricot/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp
    
branches/apricot/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.h
    branches/apricot/source/blender/gpu/intern/gpu_material.c
    branches/apricot/source/blender/gpu/intern/material_shaders.glsl
    branches/apricot/source/blender/gpu/intern/material_shaders.glsl.c
    branches/apricot/source/blender/src/drawobject.c
    branches/apricot/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    branches/apricot/source/gameengine/Converter/BL_MeshDeformer.h
    branches/apricot/source/gameengine/Converter/BL_SkinDeformer.h
    branches/apricot/source/gameengine/Converter/BL_SkinMeshObject.cpp
    branches/apricot/source/gameengine/Converter/BL_SkinMeshObject.h
    branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.cpp
    branches/apricot/source/gameengine/Ketsji/BL_BlenderShader.h
    branches/apricot/source/gameengine/Ketsji/BL_Material.h
    branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
    branches/apricot/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
    branches/apricot/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
    branches/apricot/source/gameengine/Rasterizer/RAS_IRasterizer.h
    branches/apricot/source/gameengine/Rasterizer/RAS_MeshObject.cpp
    branches/apricot/source/gameengine/Rasterizer/RAS_MeshObject.h
    
branches/apricot/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.cpp
    
branches/apricot/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_GLExtensionManager.h
    
branches/apricot/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
    
branches/apricot/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
    
branches/apricot/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp
    
branches/apricot/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h

Modified: 
branches/apricot/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp
===================================================================
--- 
branches/apricot/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp
      2008-06-14 22:37:33 UTC (rev 15228)
+++ 
branches/apricot/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp
      2008-06-14 23:51:01 UTC (rev 15229)
@@ -334,6 +334,10 @@
        m_bvhAabbMax = bvhAabbMax + clampValue;
        btVector3 aabbSize = m_bvhAabbMax - m_bvhAabbMin;
        m_bvhQuantization = 
btVector3(btScalar(65535.0),btScalar(65535.0),btScalar(65535.0)) / aabbSize;
+       m_bvhQuantizationInv = btVector3(
+               btScalar(1.0)/m_bvhQuantization.getX(),
+               btScalar(1.0)/m_bvhQuantization.getY(),
+               btScalar(1.0)/m_bvhQuantization.getZ());
 }
 
 
@@ -384,7 +388,7 @@
 #endif //DEBUG_TREE_BUILDING
 
 
-       int splitAxis, splitIndex, i;
+       int splitIndex, i;
        int numIndices =endIndex-startIndex;
        int curIndex = m_curNodeIndex;
 
@@ -403,10 +407,8 @@
        }
        //calculate Best Splitting Axis and where to split it. Sort the 
incoming 'leafNodes' array within range 'startIndex/endIndex'.
        
-       splitAxis = calcSplittingAxis(startIndex,endIndex);
+       splitIndex = sortAndCalcSplittingIndex(startIndex,endIndex);
 
-       splitIndex = sortAndCalcSplittingIndex(startIndex,endIndex,splitAxis);
-
        int internalNodeIndex = m_curNodeIndex;
        
        
setInternalNodeAabbMax(m_curNodeIndex,btVector3(btScalar(-1e30),btScalar(-1e30),btScalar(-1e30)));
@@ -482,27 +484,33 @@
 }
 
 
-int    btOptimizedBvh::sortAndCalcSplittingIndex(int startIndex,int 
endIndex,int splitAxis)
+int    btOptimizedBvh::sortAndCalcSplittingIndex(int startIndex,int endIndex)
 {
-       int i;
+       int i, splitAxis;
        int splitIndex =startIndex;
        int numIndices = endIndex - startIndex;
        btScalar splitValue;
 
        btVector3 means(btScalar(0.),btScalar(0.),btScalar(0.));
        for (i=startIndex;i<endIndex;i++)
+               means+=getAabbCenter(i);
+       means *= (btScalar(1.)/(btScalar)numIndices);
+
+       btVector3 variance(btScalar(0.),btScalar(0.),btScalar(0.));
+       for (i=startIndex;i<endIndex;i++)
        {
-               btVector3 center = btScalar(0.5)*(getAabbMax(i)+getAabbMin(i));
-               means+=center;
+               btVector3 diff2 = getAabbCenter(i)-means;
+               diff2 = diff2 * diff2;
+               variance += diff2;
        }
-       means *= (btScalar(1.)/(btScalar)numIndices);
-       
+
+       splitAxis = variance.maxAxis();
        splitValue = means[splitAxis];
        
        //sort leafNodes so all values larger then splitValue comes first, and 
smaller values start from 'splitIndex'.
        for (i=startIndex;i<endIndex;i++)
        {
-               btVector3 center = btScalar(0.5)*(getAabbMax(i)+getAabbMin(i));
+               btVector3 center = getAabbCenter(i);
                if (center[splitAxis] > splitValue)
                {
                        //swap
@@ -535,35 +543,6 @@
 }
 
 
-int    btOptimizedBvh::calcSplittingAxis(int startIndex,int endIndex)
-{
-       int i;
-
-       btVector3 means(btScalar(0.),btScalar(0.),btScalar(0.));
-       btVector3 variance(btScalar(0.),btScalar(0.),btScalar(0.));
-       int numIndices = endIndex-startIndex;
-
-       for (i=startIndex;i<endIndex;i++)
-       {
-               btVector3 center = btScalar(0.5)*(getAabbMax(i)+getAabbMin(i));
-               means+=center;
-       }
-       means *= (btScalar(1.)/(btScalar)numIndices);
-               
-       for (i=startIndex;i<endIndex;i++)
-       {
-               btVector3 center = btScalar(0.5)*(getAabbMax(i)+getAabbMin(i));
-               btVector3 diff2 = center-means;
-               diff2 = diff2 * diff2;
-               variance += diff2;
-       }
-       variance *= (btScalar(1.)/      ((btScalar)numIndices-1)        );
-       
-       return variance.maxAxis();
-}
-
-
-
 void   btOptimizedBvh::reportAabbOverlappingNodex(btNodeOverlapCallback* 
nodeCallback,const btVector3& aabbMin,const btVector3& aabbMax) const
 {
        //either choose recursive traversal (walkTree) or stackless 
(walkStacklessTree)
@@ -810,14 +789,32 @@
 {
        btVector3       vecOut;
        vecOut.setValue(
-               (btScalar)(vecIn[0]) / (m_bvhQuantization.getX()),
-               (btScalar)(vecIn[1]) / (m_bvhQuantization.getY()),
-               (btScalar)(vecIn[2]) / (m_bvhQuantization.getZ()));
+               (btScalar)(vecIn[0]) * (m_bvhQuantizationInv.getX()),
+               (btScalar)(vecIn[1]) * (m_bvhQuantizationInv.getY()),
+               (btScalar)(vecIn[2]) * (m_bvhQuantizationInv.getZ()));
        vecOut += m_bvhAabbMin;
        return vecOut;
 }
 
+btVector3      btOptimizedBvh::unQuantizeCenter(const unsigned short* vecMin, 
const unsigned short *vecMax) const
+{
+       btVector3       vecOut;
+       unsigned int center[3];
 
+       center[0]= (unsigned int)vecMin[0] + (unsigned int)vecMax[0];
+       center[1]= (unsigned int)vecMin[1] + (unsigned int)vecMax[1];
+       center[2]= (unsigned int)vecMin[2] + (unsigned int)vecMax[2];
+
+       vecOut.setValue(
+               (btScalar)(center[0]) * (m_bvhQuantizationInv.getX()),
+               (btScalar)(center[1]) * (m_bvhQuantizationInv.getY()),
+               (btScalar)(center[2]) * (m_bvhQuantizationInv.getZ()));
+       vecOut = m_bvhAabbMin + btScalar(0.5)*vecOut;
+       return vecOut;
+}
+
+
+
 void   btOptimizedBvh::swapLeafNodes(int i,int splitIndex)
 {
        if (m_useQuantization)

Modified: 
branches/apricot/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.h
===================================================================
--- 
branches/apricot/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.h
        2008-06-14 22:37:33 UTC (rev 15228)
+++ 
branches/apricot/extern/bullet2/src/BulletCollision/CollisionShapes/btOptimizedBvh.h
        2008-06-14 23:51:01 UTC (rev 15229)
@@ -144,6 +144,7 @@
        btVector3                       m_bvhAabbMin;
        btVector3                       m_bvhAabbMax;
        btVector3                       m_bvhQuantization;
+       btVector3                       m_bvhQuantizationInv;
 
        enum btTraversalMode
        {
@@ -204,7 +205,18 @@
                return m_leafNodes[nodeIndex].m_aabbMaxOrg;
                
        }
+       btVector3 getAabbCenter(int nodeIndex) const
+       {
+               if (m_useQuantization)
+               {
+                       const btQuantizedBvhNode& node = 
m_quantizedLeafNodes[nodeIndex];
+                       return unQuantizeCenter(node.m_quantizedAabbMin, 
node.m_quantizedAabbMax);
+               }
+               //non-quantized
+               return 
btScalar(0.5)*(m_leafNodes[nodeIndex].m_aabbMinOrg+m_leafNodes[nodeIndex].m_aabbMaxOrg);
+       }
 
+
        void    setQuantizationValues(const btVector3& bvhAabbMin,const 
btVector3& bvhAabbMax,btScalar quantizationMargin=btScalar(1.0));
        
        void    setInternalNodeEscapeIndex(int nodeIndex, int escapeIndex)
@@ -255,9 +267,7 @@
 
        void    buildTree       (int startIndex,int endIndex);
 
-       int     calcSplittingAxis(int startIndex,int endIndex);
-
-       int     sortAndCalcSplittingIndex(int startIndex,int endIndex,int 
splitAxis);
+       int     sortAndCalcSplittingIndex(int startIndex,int endIndex);
        
        void    walkStacklessTree(btNodeOverlapCallback* nodeCallback,const 
btVector3& aabbMin,const btVector3& aabbMax) const;
 
@@ -298,6 +308,8 @@
        void quantizeWithClamp(unsigned short* out, const btVector3& point) 
const;
        
        btVector3       unQuantize(const unsigned short* vecIn) const;
+       btVector3       unQuantizeCenter(const unsigned short* vecMin, const 
unsigned short *vecMax) const;
+       btVector3       unQuantize(const unsigned int* vecIn) const;
 
        ///setTraversalMode let's you choose between stackless, recursive or 
stackless cache friendly tree traversal. Note this is only implemented for 
quantized trees.
        void    setTraversalMode(btTraversalMode        traversalMode)

Modified: branches/apricot/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_material.c   2008-06-14 
22:37:33 UTC (rev 15228)
+++ branches/apricot/source/blender/gpu/intern/gpu_material.c   2008-06-14 
23:51:01 UTC (rev 15229)
@@ -640,6 +640,9 @@
        GPUMaterial *mat;
        GPUNodeLink *outlink;
 
+       if(ma->gpumaterial)
+               return ma->gpumaterial;
+
        mat = GPU_material_construct_begin(profile);
 
        if(ma->nodetree && ma->use_nodes) {
@@ -655,6 +658,7 @@
                mat= NULL;
        }
 
-       return mat;
+       ma->gpumaterial= mat;
+       return ma->gpumaterial;
 }
 

Modified: branches/apricot/source/blender/gpu/intern/material_shaders.glsl
===================================================================
--- branches/apricot/source/blender/gpu/intern/material_shaders.glsl    
2008-06-14 22:37:33 UTC (rev 15228)
+++ branches/apricot/source/blender/gpu/intern/material_shaders.glsl    
2008-06-14 23:51:01 UTC (rev 15229)
@@ -690,7 +690,7 @@
        return max(fac, 0.0);
 }
 
-void shade_inp_area(vec3 lampco, vec3 lampvec, vec3 vn, vec3 area[4], float 
areasize, float k, out float inp)
+void shade_inp_area(vec3 lampco, vec3 lampvec, vec3 vn, mat4 area, float 
areasize, float k, out float inp)
 {
        lampvec = -normalize(lampvec);
 
@@ -744,14 +744,14 @@
        is = nl*(A + (B * t * sin(a) * tan(b)));
 }
 
-void shade_diffuse_toon(vec3 n, vec3 l, vec3 v, float size, float smooth, out 
float is)
+void shade_diffuse_toon(vec3 n, vec3 l, vec3 v, float size, float tsmooth, out 
float is)
 {
        float rslt = dot(n, l);
        float ang = acos(rslt);
 
        if(ang < size) is = 1.0;
-       else if(ang > (size + smooth) || smooth == 0.0) is = 0.0;
-       else is = 1.0 - ((ang - size)/smooth);
+       else if(ang > (size + tsmooth) || tsmooth == 0.0) is = 0.0;
+       else is = 1.0 - ((ang - size)/tsmooth);
 }
 
 void shade_diffuse_minnaert(float nl, vec3 n, vec3 v, float darkness, out 
float is)

Modified: branches/apricot/source/blender/gpu/intern/material_shaders.glsl.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/material_shaders.glsl.c  
2008-06-14 22:37:33 UTC (rev 15228)
+++ branches/apricot/source/blender/gpu/intern/material_shaders.glsl.c  
2008-06-14 23:51:01 UTC (rev 15229)
@@ -1,504 +1,504 @@
 /* DataToC output of file <material_shaders_glsl> */
 
-int datatoc_material_shaders_glsl_size= 20680;
+int datatoc_material_shaders_glsl_size= 20694;
 char datatoc_material_shaders_glsl[]= {
- 10,118, 97,114,121,105,110,103,
- 32,118,101, 99, 51, 32,118, 97,114, 99,111, 59, 10,118, 
97,114,121,105,110,103, 32,118,101, 99, 51, 32,118, 97,114, 99, 97,109,
- 99,111, 59, 10,118, 97,114,121,105,110,103, 32,118,101, 99, 51, 32,118, 
97,114,110,111,114,109, 97,108, 59, 10,117,110,105,102,
-111,114,109, 32,109, 97,116, 52, 32,117,110,102,111, 98,109, 97,116, 59, 
10,117,110,105,102,111,114,109, 32,109, 97,116, 52, 32,
-117,110,102,118,105,101,119,109, 97,116, 59, 10, 10, 47, 42, 42, 42, 42, 42, 
42, 42, 42, 42, 42, 42, 32, 83, 72, 65, 68, 69, 82,
- 32, 78, 79, 68, 69, 83, 32, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 
42, 42, 42, 47, 10, 10, 35,100,101,102,105,110,101,
- 32, 77, 95, 80, 73, 32, 51, 46, 49, 52, 49, 53, 57, 50, 54, 53, 51, 53, 56, 
57, 55, 57, 51, 50, 51, 56, 52, 54, 10, 10,118,111,
-105,100, 32,103,101,111,109, 40,118,101, 99, 51, 32, 97,116,116,111,114, 
99,111, 44, 32,118,101, 99, 50, 32, 97,116,116,117,118,

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