[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