/* * Does not set any local variables. Is safe to use to create duplicate physics worlds for independant simulation. */ public bool CreatePhysicsWorld(out CollisionWorld world, out CollisionConfiguration collisionConfig, out CollisionDispatcher dispatcher, out BroadphaseInterface broadphase, out ConstraintSolver solver, out SoftBodyWorldInfo softBodyWorldInfo) { bool success = true; if (m_worldType == WorldType.SoftBodyAndRigidBody && m_collisionType == CollisionConfType.DefaultDynamicsWorldCollisionConf) { Debug.LogError("For World Type = SoftBodyAndRigidBody collisionType must be collisionType=SoftBodyRigidBodyCollisionConf. Switching"); m_collisionType = CollisionConfType.SoftBodyRigidBodyCollisionConf; success = false; } collisionConfig = null; if (m_collisionType == CollisionConfType.DefaultDynamicsWorldCollisionConf) { collisionConfig = new DefaultCollisionConfiguration(); } else if (m_collisionType == CollisionConfType.SoftBodyRigidBodyCollisionConf) { collisionConfig = new SoftBodyRigidBodyCollisionConfiguration(); } dispatcher = new CollisionDispatcher(collisionConfig); if (m_broadphaseType == BroadphaseType.DynamicAABBBroadphase) { broadphase = new DbvtBroadphase(); } else if (m_broadphaseType == BroadphaseType.Axis3SweepBroadphase) { broadphase = new AxisSweep3(m_axis3SweepBroadphaseMin.ToBullet(), m_axis3SweepBroadphaseMax.ToBullet(), axis3SweepMaxProxies); } else if (m_broadphaseType == BroadphaseType.Axis3SweepBroadphase_32bit) { broadphase = new AxisSweep3_32Bit(m_axis3SweepBroadphaseMin.ToBullet(), m_axis3SweepBroadphaseMax.ToBullet(), axis3SweepMaxProxies); } else { broadphase = null; } world = null; softBodyWorldInfo = null; solver = null; if (m_worldType == WorldType.CollisionOnly) { world = new CollisionWorld(dispatcher, broadphase, collisionConfig); } else if (m_worldType == WorldType.RigidBodyDynamics) { world = new DiscreteDynamicsWorld(dispatcher, broadphase, null, collisionConfig); } else if (m_worldType == WorldType.MultiBodyWorld) { MultiBodyConstraintSolver mbConstraintSolver = new MultiBodyConstraintSolver(); constraintSolver = mbConstraintSolver; world = new MultiBodyDynamicsWorld(dispatcher, broadphase, mbConstraintSolver, collisionConfig); } else if (m_worldType == WorldType.SoftBodyAndRigidBody) { SequentialImpulseConstraintSolver siConstraintSolver = new SequentialImpulseConstraintSolver(); constraintSolver = siConstraintSolver; siConstraintSolver.RandSeed = sequentialImpulseConstraintSolverRandomSeed; m_world = new SoftRigidDynamicsWorld(Dispatcher, Broadphase, siConstraintSolver, CollisionConf); _ddWorld = (DiscreteDynamicsWorld)m_world; SoftRigidDynamicsWorld _sworld = (SoftRigidDynamicsWorld)m_world; m_world.DispatchInfo.EnableSpu = true; _sworld.WorldInfo.SparseSdf.Initialize(); _sworld.WorldInfo.SparseSdf.Reset(); _sworld.WorldInfo.AirDensity = 1.2f; _sworld.WorldInfo.WaterDensity = 0; _sworld.WorldInfo.WaterOffset = 0; _sworld.WorldInfo.WaterNormal = BulletSharp.Math.Vector3.Zero; _sworld.WorldInfo.Gravity = m_gravity.ToBullet(); } if (world is DiscreteDynamicsWorld) { ((DiscreteDynamicsWorld)world).Gravity = m_gravity.ToBullet(); } if (_doDebugDraw) { DebugDrawUnity db = new DebugDrawUnity(); db.DebugMode = _debugDrawMode; world.DebugDrawer = db; } return(success); }
public SoftBody GetSoftBody(SoftBodyWorldInfo si) { SoftBody body = this.CreateSoftBody(si); return(body); }
protected abstract SoftBody CreateSoftBody(SoftBodyWorldInfo si);
public static SoftBody CreateFromTetGenData(SoftBodyWorldInfo worldInfo, string ele, string face, string node, bool faceLinks, bool tetraLinks, bool facesFromTetras) { CultureInfo culture = CultureInfo.InvariantCulture; char[] separator = new[] { ' ' }; Vector3[] pos; using (var nodeReader = new StringReader(node)) { string[] nodeHeader = nodeReader.ReadLine().Split(separator, StringSplitOptions.RemoveEmptyEntries); int numNodes = int.Parse(nodeHeader[0]); //int numDims = int.Parse(nodeHeader[1]); //int numAttrs = int.Parse(nodeHeader[2]); //bool hasBounds = !nodeHeader[3].Equals("0"); pos = new Vector3[numNodes]; for (int n = 0; n < numNodes; n++) { string[] nodeLine = nodeReader.ReadLine().Split(separator, StringSplitOptions.RemoveEmptyEntries); pos[int.Parse(nodeLine[0])] = new Vector3( double.Parse(nodeLine[1], culture), double.Parse(nodeLine[2], culture), double.Parse(nodeLine[3], culture)); } } var psb = new SoftBody(worldInfo, pos.Length, pos, null); /* * if (!string.IsNullOrEmpty(face)) * { * throw new NotImplementedException(); * } */ if (!string.IsNullOrEmpty(ele)) { using (var eleReader = new StringReader(ele)) { string[] eleHeader = eleReader.ReadLine().Split(separator, StringSplitOptions.RemoveEmptyEntries); int numTetras = int.Parse(eleHeader[0]); //int numCorners = int.Parse(eleHeader[1]); //int numAttrs = int.Parse(eleHeader[2]); for (int n = 0; n < numTetras; n++) { string[] eleLine = eleReader.ReadLine().Split(separator, StringSplitOptions.RemoveEmptyEntries); //int index = int.Parse(eleLine[0], culture); int ni0 = int.Parse(eleLine[1], culture); int ni1 = int.Parse(eleLine[2], culture); int ni2 = int.Parse(eleLine[3], culture); int ni3 = int.Parse(eleLine[4], culture); psb.AppendTetra(ni0, ni1, ni2, ni3); if (tetraLinks) { psb.AppendLink(ni0, ni1, null, true); psb.AppendLink(ni1, ni2, null, true); psb.AppendLink(ni2, ni0, null, true); psb.AppendLink(ni0, ni3, null, true); psb.AppendLink(ni1, ni3, null, true); psb.AppendLink(ni2, ni3, null, true); } } } } //Console.WriteLine("Nodes: {0}", psb.Nodes.Count); //Console.WriteLine("Links: {0}", psb.Links.Count); //Console.WriteLine("Faces: {0}", psb.Faces.Count); //Console.WriteLine("Tetras: {0}", psb.Tetras.Count); return(psb); }
public static SoftBody CreatePatch(SoftBodyWorldInfo worldInfo, Vector3 corner00, Vector3 corner10, Vector3 corner01, Vector3 corner11, int resolutionX, int resolutionY, int fixedCorners, bool generateDiagonals) { // Create nodes if ((resolutionX < 2) || (resolutionY < 2)) { return(null); } int rx = resolutionX; int ry = resolutionY; int total = rx * ry; var positions = new Vector3[total]; var masses = new double[total]; for (int y = 0; y < ry; y++) { double ty = y / (double)(ry - 1); Vector3 py0, py1; Vector3.Lerp(ref corner00, ref corner01, ty, out py0); Vector3.Lerp(ref corner10, ref corner11, ty, out py1); for (int ix = 0; ix < rx; ix++) { double tx = ix / (double)(rx - 1); int index = rx * y + ix; Vector3.Lerp(ref py0, ref py1, tx, out positions[index]); masses[index] = 1; } } var body = new SoftBody(worldInfo, total, positions, masses); if ((fixedCorners & 1) != 0) { body.SetMass(0, 0); } if ((fixedCorners & 2) != 0) { body.SetMass(rx - 1, 0); } if ((fixedCorners & 4) != 0) { body.SetMass(rx * (ry - 1), 0); } if ((fixedCorners & 8) != 0) { body.SetMass(rx * (ry - 1) + rx - 1, 0); } // Create links and faces for (int y = 0; y < ry; ++y) { for (int x = 0; x < rx; ++x) { int ixy = rx * y + x; int ix1y = ixy + 1; int ixy1 = rx * (y + 1) + x; bool mdx = (x + 1) < rx; bool mdy = (y + 1) < ry; if (mdx) { body.AppendLink(ixy, ix1y); } if (mdy) { body.AppendLink(ixy, ixy1); } if (mdx && mdy) { int ix1y1 = ixy1 + 1; if (((x + y) & 1) != 0) { body.AppendFace(ixy, ix1y, ix1y1); body.AppendFace(ixy, ix1y1, ixy1); if (generateDiagonals) { body.AppendLink(ixy, ix1y1); } } else { body.AppendFace(ixy1, ixy, ix1y); body.AppendFace(ixy1, ix1y, ix1y1); if (generateDiagonals) { body.AppendLink(ix1y, ixy1); } } } } } return(body); }
protected void Dispose(bool disposing) { if (debugType >= BDebug.DebugType.Debug) { Debug.Log("BDynamicsWorld Disposing physics."); } /* NU * if (lateUpdateHelper != null) * { * lateUpdateHelper.m_ddWorld = null; * lateUpdateHelper.m_world = null; * } */ if (m_world != null) { //remove/dispose constraints int i; if (_ddWorld != null) { if (debugType >= BDebug.DebugType.Debug) { Debug.LogFormat("Removing Constraints {0}", _ddWorld.NumConstraints); } for (i = _ddWorld.NumConstraints - 1; i >= 0; i--) { TypedConstraint constraint = _ddWorld.GetConstraint(i); _ddWorld.RemoveConstraint(constraint); if (constraint.Userobject is BTypedConstraint) { ((BTypedConstraint)constraint.Userobject).m_isInWorld = false; } if (debugType >= BDebug.DebugType.Debug) { Debug.LogFormat("Removed Constaint {0}", constraint.Userobject); } constraint.Dispose(); } } /* gRally * if (debugType >= BDebug.DebugType.Debug) Debug.LogFormat("Removing Collision Objects {0}", _ddWorld.NumCollisionObjects); * //remove the rigidbodies from the dynamics world and delete them * for (i = m_world.NumCollisionObjects - 1; i >= 0; i--) * { * CollisionObject obj = m_world.CollisionObjectArray[i]; * RigidBody body = obj as RigidBody; * if (body != null && body.MotionState != null) * { * Debug.Assert(body.NumConstraintRefs == 0, "Rigid body still had constraints"); * body.MotionState.Dispose(); * } * m_world.RemoveCollisionObject(obj); * if (obj.UserObject is BCollisionObject) ((BCollisionObject)obj.UserObject).isInWorld = false; * if (debugType >= BDebug.DebugType.Debug) Debug.LogFormat("Removed CollisionObject {0}", obj.UserObject); * obj.Dispose(); * } * */ if (m_world.DebugDrawer != null) { if (m_world.DebugDrawer is IDisposable) { IDisposable dis = (IDisposable)m_world.DebugDrawer; dis.Dispose(); } } m_world.Dispose(); Broadphase.Dispose(); Dispatcher.Dispose(); CollisionConf.Dispose(); _ddWorld = null; m_world = null; } if (Broadphase != null) { Broadphase.Dispose(); Broadphase = null; } if (Dispatcher != null) { Dispatcher.Dispose(); Dispatcher = null; } if (CollisionConf != null) { CollisionConf.Dispose(); CollisionConf = null; } if (Solver != null) { Solver.Dispose(); Solver = null; } if (softBodyWorldInfo != null) { softBodyWorldInfo.Dispose(); softBodyWorldInfo = null; } _isDisposed = true; singleton = null; }
public static SoftBody CreatePatch(SoftBodyWorldInfo worldInfo, Vector3 corner00, Vector3 corner10, Vector3 corner01, Vector3 corner11, int resx, int resy, int fixeds, bool gendiags) { // Create nodes if ((resx < 2) || (resy < 2)) { return(null); } int rx = resx; int ry = resy; int tot = rx * ry; Vector3[] x = new Vector3[tot]; float[] m = new float[tot]; for (int iy = 0; iy < ry; iy++) { float ty = iy / (float)(ry - 1); Vector3 py0, py1; Vector3.Lerp(ref corner00, ref corner01, ty, out py0); Vector3.Lerp(ref corner10, ref corner11, ty, out py1); for (int ix = 0; ix < rx; ix++) { float tx = ix / (float)(rx - 1); int index = rx * iy + ix; Vector3.Lerp(ref py0, ref py1, tx, out x[index]); m[index] = 1; } } SoftBody psb = new SoftBody(worldInfo, tot, x, m); if ((fixeds & 1) != 0) { psb.SetMass(0, 0); } if ((fixeds & 2) != 0) { psb.SetMass(rx - 1, 0); } if ((fixeds & 4) != 0) { psb.SetMass(rx * (ry - 1), 0); } if ((fixeds & 8) != 0) { psb.SetMass(rx * (ry - 1) + rx - 1, 0); } // Create links and faces for (int iy = 0; iy < ry; ++iy) { for (int ix = 0; ix < rx; ++ix) { int ixy = rx * iy + ix; int ix1y = ixy + 1; int ixy1 = rx * (iy + 1) + ix; bool mdx = (ix + 1) < rx; bool mdy = (iy + 1) < ry; if (mdx) { psb.AppendLink(ixy, ix1y); } if (mdy) { psb.AppendLink(ixy, ixy1); } if (mdx && mdy) { int ix1y1 = ixy1 + 1; if (((ix + iy) & 1) != 0) { psb.AppendFace(ixy, ix1y, ix1y1); psb.AppendFace(ixy, ix1y1, ixy1); if (gendiags) { psb.AppendLink(ixy, ix1y1); } } else { psb.AppendFace(ixy1, ixy, ix1y); psb.AppendFace(ixy1, ix1y, ix1y1); if (gendiags) { psb.AppendLink(ix1y, ixy1); } } } } } return(psb); }
protected void Dispose(bool disposing) { if (debugType >= BDebug.DebugType.Debug) { Debug.Log("BDynamicsWorld Disposing physics."); } if (lateUpdateHelper != null) { lateUpdateHelper.m_ddWorld = null; lateUpdateHelper.m_world = null; } if (m_world != null) { int i; if (m_world is MultiBodyDynamicsWorld) { MultiBodyDynamicsWorld multiBodyWorld = (MultiBodyDynamicsWorld)m_world; if (debugType >= BDebug.DebugType.Debug) { Debug.LogFormat("Removing Multibody Constraints {0}", multiBodyWorld.NumMultiBodyConstraints); } for (i = multiBodyWorld.NumMultiBodyConstraints - 1; i >= 0; i--) { MultiBodyConstraint constraint = multiBodyWorld.GetMultiBodyConstraint(i); multiBodyWorld.RemoveMultiBodyConstraint(constraint); if (debugType >= BDebug.DebugType.Debug) { Debug.LogFormat("Removed Multbody Constaint {0}", constraint); } constraint.Dispose(); } if (debugType >= BDebug.DebugType.Debug) { Debug.LogFormat("Removing Multibodies {0}", multiBodyWorld.NumMultibodies); } for (i = multiBodyWorld.NumMultibodies - 1; i >= 0; i--) { MultiBody mb = multiBodyWorld.GetMultiBody(i); multiBodyWorld.RemoveMultiBody(mb); if (debugType >= BDebug.DebugType.Debug) { Debug.LogFormat("Removed Multbody {0}", mb); } //TODO user pointer for the multibody mb.Dispose(); } } //remove/dispose constraints if (_ddWorld != null) { if (debugType >= BDebug.DebugType.Debug) { Debug.LogFormat("Removing Constraints {0}", _ddWorld.NumConstraints); } for (i = _ddWorld.NumConstraints - 1; i >= 0; i--) { TypedConstraint constraint = _ddWorld.GetConstraint(i); _ddWorld.RemoveConstraint(constraint); if (constraint.Userobject is BTypedConstraint) { ((BTypedConstraint)constraint.Userobject).m_isInWorld = false; } if (debugType >= BDebug.DebugType.Debug) { Debug.LogFormat("Removed Constaint {0}", constraint.Userobject); } constraint.Dispose(); } } //todo multibody if (debugType >= BDebug.DebugType.Debug) { Debug.LogFormat("Removing Collision Objects {0}", _ddWorld.NumCollisionObjects); } //remove the rigidbodies from the dynamics world and delete them for (i = m_world.NumCollisionObjects - 1; i >= 0; i--) { CollisionObject obj = m_world.CollisionObjectArray[i]; RigidBody body = obj as RigidBody; if (body != null && body.MotionState != null) { Debug.Assert(body.NumConstraintRefs == 0, "Rigid body still had constraints"); body.MotionState.Dispose(); } m_world.RemoveCollisionObject(obj); if (obj.UserObject is BCollisionObject) { ((BCollisionObject)obj.UserObject).isInWorld = false; } if (debugType >= BDebug.DebugType.Debug) { Debug.LogFormat("Removed CollisionObject {0}", obj.UserObject); } obj.Dispose(); } if (m_world.DebugDrawer != null) { if (m_world.DebugDrawer is IDisposable) { IDisposable dis = (IDisposable)m_world.DebugDrawer; dis.Dispose(); } } m_world.Dispose(); Broadphase.Dispose(); Dispatcher.Dispose(); CollisionConf.Dispose(); _ddWorld = null; m_world = null; } if (Broadphase != null) { Broadphase.Dispose(); Broadphase = null; } if (Dispatcher != null) { Dispatcher.Dispose(); Dispatcher = null; } if (CollisionConf != null) { CollisionConf.Dispose(); CollisionConf = null; } if (constraintSolver != null) { constraintSolver.Dispose(); constraintSolver = null; } if (softBodyWorldInfo != null) { softBodyWorldInfo.Dispose(); softBodyWorldInfo = null; } _isDisposed = true; singleton = null; }
/* * Does not set any local variables. Is safe to use to create duplicate physics worlds for independant simulation. */ public bool CreatePhysicsWorld(out CollisionWorld world, out CollisionConfiguration collisionConfig, out CollisionDispatcher dispatcher, out BroadphaseInterface broadphase, out SequentialImpulseConstraintSolver solver, out SoftBodyWorldInfo softBodyWorldInfo) { bool success = true; /* gRally * if (m_worldType == WorldType.SoftBodyAndRigidBody && m_collisionType == CollisionConfType.DefaultDynamicsWorldCollisionConf) * { * Debug.LogError( "For World Type = SoftBodyAndRigidBody collisionType must be collisionType=SoftBodyRigidBodyCollisionConf. Switching"); * m_collisionType = CollisionConfType.SoftBodyRigidBodyCollisionConf; * success = false; * } */ collisionConfig = null; broadphase = null; // gRally new AxisSweep3(m_axis3SweepBroadphaseMin.ToBullet(), m_axis3SweepBroadphaseMax.ToBullet(), axis3SweepMaxProxies); // gRally /* gRally * if (m_collisionType == CollisionConfType.DefaultDynamicsWorldCollisionConf) * { * collisionConfig = new DefaultCollisionConfiguration(); * } * else if (m_collisionType == CollisionConfType.SoftBodyRigidBodyCollisionConf) * { * collisionConfig = new SoftBodyRigidBodyCollisionConfiguration(); * } * * dispatcher = new CollisionDispatcher(collisionConfig); * * if (m_broadphaseType == BroadphaseType.DynamicAABBBroadphase) * { * broadphase = new DbvtBroadphase(); * } * else if (m_broadphaseType == BroadphaseType.Axis3SweepBroadphase) * { * broadphase = new AxisSweep3(m_axis3SweepBroadphaseMin.ToBullet(), m_axis3SweepBroadphaseMax.ToBullet(), axis3SweepMaxProxies); * } * else if (m_broadphaseType == BroadphaseType.Axis3SweepBroadphase_32bit) * { * broadphase = new AxisSweep3_32Bit(m_axis3SweepBroadphaseMin.ToBullet(), m_axis3SweepBroadphaseMax.ToBullet(), axis3SweepMaxProxies); * } * else * { * broadphase = null; * } */ world = null; softBodyWorldInfo = null; solver = null; /* gRally * if (m_worldType == WorldType.CollisionOnly) * { * world = new CollisionWorld(dispatcher, broadphase, collisionConfig); * } * else if (m_worldType == WorldType.RigidBodyDynamics) * { * world = new DiscreteDynamicsWorld(dispatcher, broadphase, null, collisionConfig); * } * else if (m_worldType == WorldType.MultiBodyWorld) * { * world = new MultiBodyDynamicsWorld(dispatcher, broadphase, null, collisionConfig); * } * else if (m_worldType == WorldType.SoftBodyAndRigidBody) * { * Solver = new SequentialImpulseConstraintSolver(); * Solver.RandSeed = sequentialImpulseConstraintSolverRandomSeed; * m_world = new SoftRigidDynamicsWorld(Dispatcher, Broadphase, Solver, CollisionConf); * _ddWorld = (DiscreteDynamicsWorld)m_world; * SoftRigidDynamicsWorld _sworld = (SoftRigidDynamicsWorld)m_world; * * m_world.DispatchInfo.EnableSpu = true; * _sworld.WorldInfo.SparseSdf.Initialize(); * _sworld.WorldInfo.SparseSdf.Reset(); * _sworld.WorldInfo.AirDensity = 1.2f; * _sworld.WorldInfo.WaterDensity = 0; * _sworld.WorldInfo.WaterOffset = 0; * _sworld.WorldInfo.WaterNormal = BulletSharp.Math.Vector3.Zero; * _sworld.WorldInfo.Gravity = m_gravity.ToBullet(); * } */ // gRally stuff! collisionConfig = new DefaultCollisionConfiguration(); dispatcher = new CollisionDispatcher(collisionConfig); // #gStageEditor broadphase = new AxisSweep3(GRSimData.PairCache); // #gStageEditor world = new DiscreteDynamicsWorld(GRSimData.BulletWorld, dispatcher, broadphase); // UP!_ddWorld = (DiscreteDynamicsWorld)m_world; if (world is DiscreteDynamicsWorld) { // gRally .. ((DiscreteDynamicsWorld)world).Gravity = m_gravity.ToBullet(); } if (_doDebugDraw) { DebugDrawUnity db = new DebugDrawUnity(); db.DebugMode = _debugDrawMode; world.DebugDrawer = db; } return(success); }
protected virtual void _InitializePhysicsWorld() { _isDisposed = false; if (m_worldType == WorldType.SoftBodyAndRigidBody && m_collisionType == CollisionConfType.DefaultDynamicsWorldCollisionConf) { BDebug.LogError(debugType, "For World Type = SoftBodyAndRigidBody collisionType must be collisionType=SoftBodyRigidBodyCollisionConf. Switching"); m_collisionType = CollisionConfType.SoftBodyRigidBodyCollisionConf; } if (m_collisionType == CollisionConfType.DefaultDynamicsWorldCollisionConf) { CollisionConf = new DefaultCollisionConfiguration(); } else if (m_collisionType == CollisionConfType.SoftBodyRigidBodyCollisionConf) { CollisionConf = new SoftBodyRigidBodyCollisionConfiguration(); } Dispatcher = new CollisionDispatcher(CollisionConf); if (m_broadphaseType == BroadphaseType.DynamicAABBBroadphase) { Broadphase = new DbvtBroadphase(); } else if (m_broadphaseType == BroadphaseType.Axis3SweepBroadphase) { Broadphase = new AxisSweep3(m_axis3SweepBroadphaseMin.ToBullet(), m_axis3SweepBroadphaseMax.ToBullet(), axis3SweepMaxProxies); } else if (m_broadphaseType == BroadphaseType.Axis3SweepBroadphase_32bit) { Broadphase = new AxisSweep3_32Bit(m_axis3SweepBroadphaseMin.ToBullet(), m_axis3SweepBroadphaseMax.ToBullet(), axis3SweepMaxProxies); } else { Broadphase = null; } if (m_worldType == WorldType.CollisionOnly) { m_world = new CollisionWorld(Dispatcher, Broadphase, CollisionConf); _ddWorld = null; } else if (m_worldType == WorldType.RigidBodyDynamics) { m_world = new DiscreteDynamicsWorld(Dispatcher, Broadphase, null, CollisionConf); _ddWorld = (DiscreteDynamicsWorld)m_world; } else if (m_worldType == WorldType.MultiBodyWorld) { m_world = new MultiBodyDynamicsWorld(Dispatcher, Broadphase, null, CollisionConf); _ddWorld = (DiscreteDynamicsWorld)m_world; } else if (m_worldType == WorldType.SoftBodyAndRigidBody) { Solver = new SequentialImpulseConstraintSolver(); Solver.RandSeed = sequentialImpulseConstraintSolverRandomSeed; softBodyWorldInfo = new SoftBodyWorldInfo { AirDensity = 1.2f, WaterDensity = 0, WaterOffset = 0, WaterNormal = BulletSharp.Math.Vector3.Zero, Gravity = UnityEngine.Physics.gravity.ToBullet(), Dispatcher = Dispatcher, Broadphase = Broadphase }; softBodyWorldInfo.SparseSdf.Initialize(); m_world = new SoftRigidDynamicsWorld(Dispatcher, Broadphase, Solver, CollisionConf); _ddWorld = (DiscreteDynamicsWorld)m_world; m_world.DispatchInfo.EnableSpu = true; softBodyWorldInfo.SparseSdf.Reset(); softBodyWorldInfo.AirDensity = 1.2f; softBodyWorldInfo.WaterDensity = 0; softBodyWorldInfo.WaterOffset = 0; softBodyWorldInfo.WaterNormal = BulletSharp.Math.Vector3.Zero; softBodyWorldInfo.Gravity = m_gravity.ToBullet(); } if (_ddWorld != null) { _ddWorld.Gravity = m_gravity.ToBullet(); } if (_doDebugDraw) { DebugDrawUnity db = new DebugDrawUnity(); db.DebugMode = _debugDrawMode; m_world.DebugDrawer = db; } }
public void SetUp() { _softBodyWorldInfo = new SoftBodyWorldInfo(); }
protected void Dispose(bool disposing) { BDebug.Log(debugType, "BDynamicsWorld Disposing physics."); if (m_world != null) { //remove/dispose constraints int i; if (_ddWorld != null) { for (i = _ddWorld.NumConstraints - 1; i >= 0; i--) { TypedConstraint constraint = _ddWorld.GetConstraint(i); _ddWorld.RemoveConstraint(constraint); if (constraint.Userobject is BTypedConstraint) { ((BTypedConstraint)constraint.Userobject).isInWorld = false; } if ((debugType & BDebug.DebugType.Debug) == BDebug.DebugType.Debug) { Debug.LogFormat("Removed Constaint {0}", constraint.Userobject); } constraint.Dispose(); } } //remove the rigidbodies from the dynamics world and delete them for (i = m_world.NumCollisionObjects - 1; i >= 0; i--) { CollisionObject obj = m_world.CollisionObjectArray[i]; RigidBody body = obj as RigidBody; if (body != null && body.MotionState != null) { body.MotionState.Dispose(); } m_world.RemoveCollisionObject(obj); if (obj.UserObject is BCollisionObject) { ((BCollisionObject)obj.UserObject).isInWorld = false; } if ((debugType & BDebug.DebugType.Debug) == BDebug.DebugType.Debug) { Debug.LogFormat("Removed CollisionObject {0}", obj.UserObject); } obj.Dispose(); } if (m_world.DebugDrawer != null) { if (m_world.DebugDrawer is IDisposable) { IDisposable dis = (IDisposable)m_world.DebugDrawer; dis.Dispose(); } } m_world.Dispose(); Broadphase.Dispose(); Dispatcher.Dispose(); CollisionConf.Dispose(); _ddWorld = null; m_world = null; } if (Broadphase != null) { Broadphase.Dispose(); Broadphase = null; } if (Dispatcher != null) { Dispatcher.Dispose(); Dispatcher = null; } if (CollisionConf != null) { CollisionConf.Dispose(); CollisionConf = null; } if (Solver != null) { Solver.Dispose(); Solver = null; } if (softBodyWorldInfo != null) { softBodyWorldInfo.Dispose(); softBodyWorldInfo = null; } _isDisposed = true; singleton = null; }
//Does not set any local variables. Is safe to use to create duplicate physics worlds for independant simulation. public void CreatePhysicsWorld ( out CollisionWorld world, out CollisionConfiguration collisionConfig, out CollisionDispatcher dispatcher, out BroadphaseInterface broadphase, out ConstraintSolver solver, out SoftBodyWorldInfo softBodyWorldInfo ) { collisionConfig = null; switch (physicWorldParameters.collisionType) { default: case CollisionConfType.DefaultDynamicsWorldCollisionConf: collisionConfig = new DefaultCollisionConfiguration(); break; case CollisionConfType.SoftBodyRigidBodyCollisionConf: collisionConfig = new SoftBodyRigidBodyCollisionConfiguration(); break; } dispatcher = new CollisionDispatcher(collisionConfig); switch (physicWorldParameters.broadphaseType) { default: case BroadphaseType.DynamicAABBBroadphase: broadphase = new DbvtBroadphase(); break; case BroadphaseType.Axis3SweepBroadphase: broadphase = new AxisSweep3( physicWorldParameters.axis3SweepBroadphaseMin, physicWorldParameters.axis3SweepBroadphaseMax, physicWorldParameters.axis3SweepMaxProxies ); break; case BroadphaseType.Axis3SweepBroadphase_32bit: broadphase = new AxisSweep3_32Bit( physicWorldParameters.axis3SweepBroadphaseMin, physicWorldParameters.axis3SweepBroadphaseMax, physicWorldParameters.axis3SweepMaxProxies ); break; } world = null; softBodyWorldInfo = null; solver = null; switch (physicWorldParameters.worldType) { case WorldType.CollisionOnly: world = new CollisionWorld(dispatcher, broadphase, collisionConfig); break; default: case WorldType.RigidBodyDynamics: world = new DiscreteDynamicsWorld(dispatcher, broadphase, null, collisionConfig); break; case WorldType.MultiBodyWorld: MultiBodyConstraintSolver mbConstraintSolver = new MultiBodyConstraintSolver(); constraintSolver = mbConstraintSolver; world = new MultiBodyDynamicsWorld(dispatcher, broadphase, mbConstraintSolver, collisionConfig); break; case WorldType.SoftBodyAndRigidBody: SequentialImpulseConstraintSolver siConstraintSolver = new SequentialImpulseConstraintSolver(); constraintSolver = siConstraintSolver; siConstraintSolver.RandSeed = physicWorldParameters.sequentialImpulseConstraintSolverRandomSeed; world = new SoftRigidDynamicsWorld(this.dispatcher, this.broadphase, siConstraintSolver, collisionConf); world.DispatchInfo.EnableSpu = true; SoftRigidDynamicsWorld _sworld = (SoftRigidDynamicsWorld)world; _sworld.WorldInfo.SparseSdf.Initialize(); _sworld.WorldInfo.SparseSdf.Reset(); _sworld.WorldInfo.AirDensity = 1.2f; _sworld.WorldInfo.WaterDensity = 0; _sworld.WorldInfo.WaterOffset = 0; _sworld.WorldInfo.WaterNormal = BulletSharp.Math.Vector3.Zero; _sworld.WorldInfo.Gravity = Gravity.ToBullet(); break; } if (world is DiscreteDynamicsWorld) { ((DiscreteDynamicsWorld)world).Gravity = Gravity.ToBullet(); } }
protected void Dispose(bool disposing) { if (lateUpdateHelper != null) { lateUpdateHelper.m_ddWorld = null; lateUpdateHelper.m_world = null; } if (m_world != null) { //remove/dispose constraints int i; if (_ddWorld != null) { for (i = _ddWorld.NumConstraints - 1; i >= 0; i--) { TypedConstraint constraint = _ddWorld.GetConstraint(i); _ddWorld.RemoveConstraint(constraint); if (constraint.Userobject is BTypedConstraint) { ((BTypedConstraint)constraint.Userobject).m_isInWorld = false; } constraint.Dispose(); } } //remove the rigidbodies from the dynamics world and delete them for (i = m_world.NumCollisionObjects - 1; i >= 0; i--) { CollisionObject obj = m_world.CollisionObjectArray[i]; RigidBody body = obj as RigidBody; if (body != null && body.MotionState != null) { Debug.Assert(body.NumConstraintRefs == 0, "Rigid body still had constraints"); body.MotionState.Dispose(); } m_world.RemoveCollisionObject(obj); if (obj.UserObject is BCollisionObject) { ((BCollisionObject)obj.UserObject).isInWorld = false; } obj.Dispose(); } if (m_world.DebugDrawer != null) { if (m_world.DebugDrawer is IDisposable) { IDisposable dis = (IDisposable)m_world.DebugDrawer; dis.Dispose(); } } m_world.Dispose(); Broadphase.Dispose(); Dispatcher.Dispose(); CollisionConf.Dispose(); _ddWorld = null; m_world = null; } if (Broadphase != null) { Broadphase.Dispose(); Broadphase = null; } if (Dispatcher != null) { Dispatcher.Dispose(); Dispatcher = null; } if (CollisionConf != null) { CollisionConf.Dispose(); CollisionConf = null; } if (constraintSolver != null) { constraintSolver.Dispose(); constraintSolver = null; } if (softBodyWorldInfo != null) { softBodyWorldInfo.Dispose(); softBodyWorldInfo = null; } _isDisposed = true; singleton = null; }
public static SoftBody CreateFromVtkFile(SoftBodyWorldInfo worldInfo, string fileName) { List <Vector3> points = new List <Vector3>(0); List <int[]> cells = new List <int[]>(0); using (var reader = new StreamReader(fileName)) { bool readingPoints = false; bool readingCells = false; string line; while ((line = reader.ReadLine()) != null) { if (line.Length == 0) { continue; } string[] lineParts = line.Split(' '); if (lineParts[0] == "POINTS") { readingPoints = true; readingCells = false; points.Capacity = int.Parse(lineParts[1]); } else if (lineParts[0] == "CELLS") { readingPoints = false; readingCells = true; cells.Capacity = int.Parse(lineParts[1]); } else if (lineParts[0] == "CELL_TYPES") { readingPoints = false; readingCells = false; } else if (readingPoints) { Vector3 point = new Vector3( (float)ParseDouble(lineParts[0]), (float)ParseDouble(lineParts[1]), (float)ParseDouble(lineParts[2])); points.Add(point); } else if (readingCells) { int numPoints = int.Parse(lineParts[0]); int[] cell = new int[numPoints]; for (int i = 0; i < numPoints; i++) { cell[i] = int.Parse(lineParts[i + 1]); } cells.Add(cell); } } } SoftBody body = new SoftBody(worldInfo, points.Count, points.ToArray(), null); foreach (int[] cell in cells) { body.AppendTetra(cell[0], cell[1], cell[2], cell[3]); body.AppendLink(cell[0], cell[1], null, true); body.AppendLink(cell[1], cell[2], null, true); body.AppendLink(cell[2], cell[0], null, true); body.AppendLink(cell[0], cell[3], null, true); body.AppendLink(cell[1], cell[3], null, true); body.AppendLink(cell[2], cell[3], null, true); } GenerateBoundaryFaces(body); body.InitializeDmInverse(); body.TetraScratches.Resize(body.Tetras.Count); body.TetraScratchesTn.Resize(body.Tetras.Count); //Console.WriteLine($"Nodes: {body.Nodes.Count}"); //Console.WriteLine($"Links: {body.Links.Count}"); //Console.WriteLine($"Faces: {body.Faces.Count}"); //Console.WriteLine($"Tetras: {body.Tetras.Count}"); return(body); }
SoftBody CreateVolumetricSoftbody(SoftBodyWorldInfo worldInfo, BulletSharp.Math.Vector3[] vertices) { int vertexcount = vertices.Length; psb = new SoftBody(worldInfo, vertexcount, vertices, null); for (int x = 3; vertexcount > x; x += 4) { int n0 = x - 3; int n1 = x - 2; int n2 = x - 1; int n3 = x - 0; psb.AppendTetra(n0, n1, n2, n3); psb.AppendLink(n0, n1); linkdata.Add(true); brokenlinks.Add(false); psb.AppendLink(n1, n2); linkdata.Add(true); brokenlinks.Add(false); psb.AppendLink(n2, n0); linkdata.Add(true); brokenlinks.Add(false); psb.AppendLink(n0, n3); linkdata.Add(true); brokenlinks.Add(false); psb.AppendLink(n1, n3); linkdata.Add(true); brokenlinks.Add(false); psb.AppendLink(n2, n3); linkdata.Add(true); brokenlinks.Add(false); ValidTetras.Add(true); } instances = GetInstances(vertices); //List<bool> ValidCuts = CutTest3(vertices); for (int x = 0; instances.Count > x; x++) { //if (ValidCuts[x] == false) { // continue; } for (int i = 1; instances[x].Count > i; i++) { int i1 = instances[x][i - 1]; int i2 = instances[x][i - 0]; psb.AppendLink(i1, i2); linkdata.Add(false); brokenlinks.Add(false); } } return(psb); }