[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15229] branches/apricot: Apricot Branch:
Brecht Van Lommel
brechtvanlommel at pandora.be
Sun Jun 15 01:51:58 CEST 2008
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. @@
More information about the Bf-blender-cvs
mailing list