[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16642] trunk/blender/extern/bullet2/src/ BulletCollision/CollisionShapes: attempt to support negative local scaling for convex hull, box, sphere, cylinder, cone and btScaledBvhTriangleMeshShape in Bullet.

Erwin Coumans blender at erwincoumans.com
Sun Sep 21 01:45:45 CEST 2008


Revision: 16642
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16642
Author:   erwin
Date:     2008-09-21 01:45:45 +0200 (Sun, 21 Sep 2008)

Log Message:
-----------
attempt to support negative local scaling for convex hull, box,sphere, cylinder, cone and btScaledBvhTriangleMeshShape in Bullet.

Modified Paths:
--------------
    trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp
    trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.h
    trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexInternalShape.cpp
    trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp

Modified: trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp
===================================================================
--- trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp	2008-09-20 22:34:54 UTC (rev 16641)
+++ trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp	2008-09-20 23:45:45 UTC (rev 16642)
@@ -36,6 +36,13 @@
 }
 
 
+
+void btConvexHullShape::setLocalScaling(const btVector3& scaling)
+{
+	m_localScaling = scaling;
+	recalcLocalAabb();
+}
+
 void btConvexHullShape::addPoint(const btPoint3& point)
 {
 	m_points.push_back(point);

Modified: trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.h
===================================================================
--- trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.h	2008-09-20 22:34:54 UTC (rev 16641)
+++ trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexHullShape.h	2008-09-20 23:45:45 UTC (rev 16642)
@@ -71,8 +71,9 @@
 	virtual void getPlane(btVector3& planeNormal,btPoint3& planeSupport,int i ) const;
 	virtual	bool isInside(const btPoint3& pt,btScalar tolerance) const;
 
+	///in case we receive negative scaling
+	virtual void	setLocalScaling(const btVector3& scaling);
 
-
 };
 
 

Modified: trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexInternalShape.cpp
===================================================================
--- trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexInternalShape.cpp	2008-09-20 22:34:54 UTC (rev 16641)
+++ trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btConvexInternalShape.cpp	2008-09-20 23:45:45 UTC (rev 16642)
@@ -26,7 +26,7 @@
 
 void	btConvexInternalShape::setLocalScaling(const btVector3& scaling)
 {
-	m_localScaling = scaling;
+	m_localScaling = scaling.absolute();
 }
 
 

Modified: trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp
===================================================================
--- trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp	2008-09-20 22:34:54 UTC (rev 16641)
+++ trunk/blender/extern/bullet2/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp	2008-09-20 23:45:45 UTC (rev 16642)
@@ -56,8 +56,18 @@
 	btScaledTriangleCallback scaledCallback(callback,m_localScaling);
 	
 	btVector3 invLocalScaling(1.f/m_localScaling.getX(),1.f/m_localScaling.getY(),1.f/m_localScaling.getZ());
-	btVector3 scaledAabbMin = aabbMin * invLocalScaling;
-	btVector3 scaledAabbMax = aabbMax * invLocalScaling;
+	btVector3 scaledAabbMin,scaledAabbMax;
+
+	///support negative scaling
+	scaledAabbMin[0] = m_localScaling.getX() >= 0. ? aabbMin[0] * invLocalScaling[0] : aabbMax[0] * invLocalScaling[0];
+	scaledAabbMin[1] = m_localScaling.getY() >= 0. ? aabbMin[1] * invLocalScaling[1] : aabbMax[1] * invLocalScaling[1];
+	scaledAabbMin[2] = m_localScaling.getZ() >= 0. ? aabbMin[2] * invLocalScaling[2] : aabbMax[2] * invLocalScaling[2];
+	
+	scaledAabbMax[0] = m_localScaling.getX() <= 0. ? aabbMin[0] * invLocalScaling[0] : aabbMax[0] * invLocalScaling[0];
+	scaledAabbMax[1] = m_localScaling.getY() <= 0. ? aabbMin[1] * invLocalScaling[1] : aabbMax[1] * invLocalScaling[1];
+	scaledAabbMax[2] = m_localScaling.getZ() <= 0. ? aabbMin[2] * invLocalScaling[2] : aabbMax[2] * invLocalScaling[2];
+	
+	
 	m_bvhTriMeshShape->processAllTriangles(&scaledCallback,scaledAabbMin,scaledAabbMax);
 }
 
@@ -66,9 +76,17 @@
 {
 	btVector3 localAabbMin = m_bvhTriMeshShape->getLocalAabbMin();
 	btVector3 localAabbMax = m_bvhTriMeshShape->getLocalAabbMax();
-	localAabbMin *= m_localScaling;
-	localAabbMax *= m_localScaling;
 
+	btVector3 tmpLocalAabbMin = localAabbMin * m_localScaling;
+	btVector3 tmpLocalAabbMax = localAabbMax * m_localScaling;
+
+	localAabbMin[0] = (m_localScaling.getX() >= 0.) ? tmpLocalAabbMin[0] : tmpLocalAabbMax[0];
+	localAabbMin[1] = (m_localScaling.getY() >= 0.) ? tmpLocalAabbMin[1] : tmpLocalAabbMax[1];
+	localAabbMin[2] = (m_localScaling.getZ() >= 0.) ? tmpLocalAabbMin[2] : tmpLocalAabbMax[2];
+	localAabbMax[0] = (m_localScaling.getX() <= 0.) ? tmpLocalAabbMin[0] : tmpLocalAabbMax[0];
+	localAabbMax[1] = (m_localScaling.getY() <= 0.) ? tmpLocalAabbMin[1] : tmpLocalAabbMax[1];
+	localAabbMax[2] = (m_localScaling.getZ() <= 0.) ? tmpLocalAabbMin[2] : tmpLocalAabbMax[2];
+
 	btVector3 localHalfExtents = btScalar(0.5)*(localAabbMax-localAabbMin);
 	btScalar margin = m_bvhTriMeshShape->getMargin();
 	localHalfExtents += btVector3(margin,margin,margin);





More information about the Bf-blender-cvs mailing list