public void SetOptimizedBvh(OptimizedBvh bvh, ref IndexedVector3 scaling) { Debug.Assert(m_bvh == null); Debug.Assert(m_ownsBvh == false); m_bvh = bvh; m_ownsBvh = false; // update the scaling without rebuilding the bvh if ((GetLocalScaling() - scaling).LengthSquared() > MathUtil.SIMD_EPSILON) { base.SetLocalScaling(ref scaling); } }
private void BuildOptimizedBvh() { if (m_ownsBvh) { m_bvh.Cleanup(); m_bvh = null; } ///m_localAabbMin/m_localAabbMax is already re-calculated in btTriangleMeshShape. We could just scale aabb, but this needs some more work //void* mem = btAlignedAlloc(sizeof(btOptimizedBvh),16); m_bvh = new OptimizedBvh(); //rebuild the bvh... m_bvh.Build(m_meshInterface, m_useQuantizedAabbCompression, ref m_localAabbMin, ref m_localAabbMax); m_ownsBvh = true; }
///optionally pass in a larger bvh aabb, used for quantization. This allows for deformations within this aabb public BvhTriangleMeshShape(StridingMeshInterface meshInterface, bool useQuantizedAabbCompression, ref IndexedVector3 bvhAabbMin, ref IndexedVector3 bvhAabbMax, bool buildBvh) : base(meshInterface) { m_bvh = null; m_ownsBvh = false; m_useQuantizedAabbCompression = useQuantizedAabbCompression; m_shapeType = BroadphaseNativeTypes.TRIANGLE_MESH_SHAPE_PROXYTYPE; #if !DISABLE_BVH if (buildBvh) { m_bvh = new OptimizedBvh(); m_bvh.Build(meshInterface, m_useQuantizedAabbCompression, ref bvhAabbMin, ref bvhAabbMax); m_ownsBvh = true; } #endif //DISABLE_BVH }
//----------------------------------------------------------------------------------------------- public override void InitializeDemo() { //string filename = @"C:\users\man\bullett\xna-concave-output.txt"; //FileStream filestream = File.Open(filename, FileMode.Create, FileAccess.Write, FileShare.Read); //BulletGlobals.g_streamWriter = new StreamWriter(filestream); m_animatedMesh = true; base.InitializeDemo(); int totalTriangles = 2 * (NUM_VERTS_X - 1) * (NUM_VERTS_Y - 1); gVertices = new ObjectArray<IndexedVector3>(totalVerts); int indicesTotal = totalTriangles * 3; gIndices = new ObjectArray<int>(indicesTotal); //BulletGlobals.gContactAddedCallback = new CustomMaterialCombinerCallback(); SetVertexPositions(waveheight,0f); int vertStride = 1; int indexStride = 3; int index=0; for (int i=0;i<NUM_VERTS_X-1;i++) { for (int j=0;j<NUM_VERTS_Y-1;j++) { gIndices[index++] = j * NUM_VERTS_X + i; gIndices[index++] = j * NUM_VERTS_X + i + 1; gIndices[index++] = (j + 1) * NUM_VERTS_X + i + 1; gIndices[index++] = j * NUM_VERTS_X + i; gIndices[index++] = (j + 1) * NUM_VERTS_X + i + 1; gIndices[index++] = (j + 1) * NUM_VERTS_X + i; } } if (BulletGlobals.g_streamWriter != null) { index = 0; BulletGlobals.g_streamWriter.WriteLine("setIndexPositions"); for (int i = 0; i < gIndices.Count; i++) { BulletGlobals.g_streamWriter.WriteLine(String.Format("{0} {1}", i, gIndices[i])); } } TriangleIndexVertexArray indexVertexArrays = new TriangleIndexVertexArray(totalTriangles, gIndices,indexStride,totalVerts,gVertices,vertStride); bool useQuantizedAabbCompression = true; OptimizedBvh bvh = new OptimizedBvh(); IndexedVector3 aabbMin = new IndexedVector3(-1000,-1000,-1000); IndexedVector3 aabbMax = new IndexedVector3(1000,1000,1000); m_trimeshShape = new BvhTriangleMeshShape(indexVertexArrays, useQuantizedAabbCompression, ref aabbMin, ref aabbMax, true); //CollisionShape trimeshShape = new TriangleMeshShape(indexVertexArrays); IndexedVector3 scaling = IndexedVector3.One; //m_trimeshShape.SetOptimizedBvh(bvh, ref scaling); //BulletWorldImporter import = new BulletWorldImporter(0);//don't store info into the world //if (import.loadFile("myShape.bullet")) //{ // int numBvh = import.getNumBvhs(); // if (numBvh != 0) // { // OptimizedBvh bvh = import.getBvhByIndex(0); // IndexedVector3 aabbMin = new IndexedVector3(-1000,-1000,-1000); // IndexedVector3 aabbMax = new IndexedVector3(1000,1000,1000); // trimeshShape = new indexVertexArrays,useQuantizedAabbCompression,ref aabbMin,ref aabbMax,false); // IndexedVector3 scaling = IndexedVector3.One; // trimeshShape.setOptimizedBvh(bvh, ref scaling); // //trimeshShape = new btBvhTriangleMeshShape(m_indexVertexArrays,useQuantizedAabbCompression,aabbMin,aabbMax); // //trimeshShape.setOptimizedBvh(bvh); // } // int numShape = import.getNumCollisionShapes(); // if (numShape != 0) // { // trimeshShape = (BvhTriangleMeshShape)import.getCollisionShapeByIndex(0); // //if you know the name, you can also try to get the shape by name: // String meshName = import.getNameForPointer(trimeshShape); // if (meshName != null) // { // trimeshShape = (BvhTriangleMeshShape)import.getCollisionShapeByName(meshName); // } // } //} //CollisionShape groundShape = trimeshShape;//m_trimeshShape; CollisionShape groundShape = m_trimeshShape;//m_trimeshShape; //groundShape = new TriangleShape(new IndexedVector3(0,` 0, 100), new IndexedVector3(100, 0, 0),new IndexedVector3(-100, 0, -100)); //groundShape = new StaticPlaneShape(IndexedVector3.Up, 0f); //groundShape = new BoxShape(new IndexedVector3(100f, 0.1f, 100f)); IndexedVector3 up = new IndexedVector3(0.4f,1,0); up.Normalize(); //groundShape = new StaticPlaneShape(up, 0f); //groundShape = new TriangleMeshShape(indexVertexArrays); m_collisionConfiguration = new DefaultCollisionConfiguration(); m_dispatcher = new CollisionDispatcher(m_collisionConfiguration); IndexedVector3 worldMin = new IndexedVector3(-1000,-1000,-1000); IndexedVector3 worldMax = new IndexedVector3(1000,1000,1000); //m_broadphase = new AxisSweep3Internal(ref worldMin, ref worldMax, 0xfffe, 0xffff, 16384, null, false); m_broadphase = new DbvtBroadphase(); m_constraintSolver = new SequentialImpulseConstraintSolver(); m_dynamicsWorld = new DiscreteDynamicsWorld(m_dispatcher, m_broadphase, m_constraintSolver, m_collisionConfiguration); float mass = 0f; IndexedMatrix startTransform = IndexedMatrix.CreateTranslation(new IndexedVector3(2,-2,0)); //CompoundShape colShape = new CompoundShape(); //IndexedVector3 halfExtents = new IndexedVector3(4, 1, 1); //CollisionShape cylinderShape = new CylinderShapeX(ref halfExtents); //CollisionShape boxShape = new BoxShape(new IndexedVector3(4, 1, 1)); //IndexedMatrix localTransform = IndexedMatrix.Identity; //colShape.addChildShape(ref localTransform, boxShape); //Quaternion orn = Quaternion.CreateFromYawPitchRoll(MathUtil.SIMD_HALF_PI, 0f, 0f); //localTransform = IndexedMatrix.CreateFromQuaternion(orn); //colShape.addChildShape(ref localTransform, cylinderShape); ////BoxShape colShape = new BoxShape(new IndexedVector3(1, 1, 1)); //int numCollideObjects = 1; //m_collisionShapes.Add(colShape); //{ // for (int i = 0; i < numCollideObjects; i++) // { // startTransform._origin = new IndexedVector3(4,10+i*2,1); // localCreateRigidBody(1, ref startTransform,colShape); // } //} CollisionShape boxShape = new BoxShape(new IndexedVector3(1, 1, 1)); //CollisionShape boxShape = new SphereShape(1); //CollisionShape boxShape = new SphereShape(1); //CollisionShape boxShape = new CapsuleShapeZ(0.5f, 1); m_collisionShapes.Add(boxShape); for (int i = 0; i < 1; i++) { startTransform._origin = new IndexedVector3(2f * i, 5, 1); LocalCreateRigidBody(1, ref startTransform, boxShape); } startTransform = IndexedMatrix.Identity; staticBody = LocalCreateRigidBody(mass, ref startTransform,groundShape); staticBody.SetCollisionFlags(staticBody.GetCollisionFlags() | CollisionFlags.CF_KINEMATIC_OBJECT);//STATIC_OBJECT); //enable custom material callback staticBody.SetCollisionFlags(staticBody.GetCollisionFlags() | CollisionFlags.CF_CUSTOM_MATERIAL_CALLBACK); //clientResetScene(); }