protected virtual void CreateBody(ref HkShape shape, HkMassProperties? massProperties) { ProfilerShort.Begin("CreateBody"); HkRigidBodyCinfo rbInfo = new HkRigidBodyCinfo(); rbInfo.AngularDamping = m_angularDamping; rbInfo.LinearDamping = m_linearDamping; rbInfo.Shape = shape; rbInfo.SolverDeactivation = InitialSolverDeactivation; rbInfo.ContactPointCallbackDelay = ContactPointDelay; if (massProperties.HasValue) { rbInfo.SetMassProperties(massProperties.Value); } GetInfoFromFlags(rbInfo, Flags); RigidBody = new HkRigidBody(rbInfo); ProfilerShort.End(); }
protected override void CreateBody(ref HkShape shape, HkMassProperties? massProperties) { if (MyPerGameSettings.Destruction)// && shape.ShapeType == HkShapeType.StaticCompound) { ProfilerShort.Begin("CreateGridBody"); HkdBreakableShape breakable; HkMassProperties massProps = massProperties.HasValue ? massProperties.Value : new HkMassProperties(); if (!Shape.BreakableShape.IsValid()) Shape.CreateBreakableShape(); breakable = Shape.BreakableShape; if (!breakable.IsValid()) { breakable = new HkdBreakableShape(shape); if (massProperties.HasValue) { var mp = massProperties.Value; breakable.SetMassProperties(ref mp); } else breakable.SetMassRecursively(50); } else breakable.BuildMassProperties(ref massProps); shape = breakable.GetShape(); //doesnt add reference HkRigidBodyCinfo rbInfo = new HkRigidBodyCinfo(); rbInfo.AngularDamping = m_angularDamping; rbInfo.LinearDamping = m_linearDamping; rbInfo.SolverDeactivation = m_grid.IsStatic ? InitialSolverDeactivation : HkSolverDeactivation.Low; rbInfo.ContactPointCallbackDelay = ContactPointDelay; rbInfo.Shape = shape; rbInfo.SetMassProperties(massProps); //rbInfo.Position = Entity.PositionComp.GetPosition(); //obsolete with large worlds? GetInfoFromFlags(rbInfo, Flags); HkRigidBody rb = new HkRigidBody(rbInfo); rb.EnableDeactivation = true; BreakableBody = new HkdBreakableBody(breakable, rb, MyPhysics.SingleWorld.DestructionWorld, Matrix.Identity); //DestructionBody.ConnectToWorld(HavokWorld, 0.05f); BreakableBody.AfterReplaceBody += FracturedBody_AfterReplaceBody; //RigidBody.SetWorldMatrix(Entity.PositionComp.WorldMatrix); //breakable.Dispose(); ProfilerShort.End(); } else { base.CreateBody(ref shape, massProperties); } }
private HkShape CreateBreakableBody(HkShape shape, HkMassProperties? massProperties) { ProfilerShort.Begin("CreateGridBody"); HkdBreakableShape breakable; HkMassProperties massProps = massProperties.HasValue ? massProperties.Value : new HkMassProperties(); if (!Shape.BreakableShape.IsValid()) Shape.CreateBreakableShape(); breakable = Shape.BreakableShape; if (!breakable.IsValid()) { breakable = new HkdBreakableShape(shape); if (massProperties.HasValue) { var mp = massProperties.Value; breakable.SetMassProperties(ref mp); } else breakable.SetMassRecursively(50); } else breakable.BuildMassProperties(ref massProps); shape = breakable.GetShape(); //doesnt add reference HkRigidBodyCinfo rbInfo = new HkRigidBodyCinfo(); rbInfo.AngularDamping = m_angularDamping; rbInfo.LinearDamping = m_linearDamping; rbInfo.SolverDeactivation = m_grid.IsStatic ? InitialSolverDeactivation : HkSolverDeactivation.Low; rbInfo.ContactPointCallbackDelay = ContactPointDelay; rbInfo.Shape = shape; rbInfo.SetMassProperties(massProps); //rbInfo.Position = Entity.PositionComp.GetPosition(); //obsolete with large worlds? GetInfoFromFlags(rbInfo, Flags); if (m_grid.IsStatic) { rbInfo.MotionType = HkMotionType.Dynamic; rbInfo.QualityType = HkCollidableQualityType.Moving; } HkRigidBody rb = new HkRigidBody(rbInfo); if (m_grid.IsStatic) { rb.UpdateMotionType(HkMotionType.Fixed); } rb.EnableDeactivation = true; BreakableBody = new HkdBreakableBody(breakable, rb, null, Matrix.Identity); //DestructionBody.ConnectToWorld(HavokWorld, 0.05f); BreakableBody.AfterReplaceBody += FracturedBody_AfterReplaceBody; //RigidBody.SetWorldMatrix(Entity.PositionComp.WorldMatrix); //breakable.Dispose(); ProfilerShort.End(); return shape; }
protected override void CreateBody(ref HkShape shape, HkMassProperties? massProperties) { if (MyPerGameSettings.Destruction)// && shape.ShapeType == HkShapeType.StaticCompound) { shape = CreateBreakableBody(shape, massProperties); } else { HkRigidBodyCinfo rbInfo = new HkRigidBodyCinfo(); rbInfo.AngularDamping = m_angularDamping; rbInfo.LinearDamping = m_linearDamping; rbInfo.Shape = shape; rbInfo.SolverDeactivation = InitialSolverDeactivation; rbInfo.ContactPointCallbackDelay = ContactPointDelay; if (massProperties.HasValue) { rbInfo.SetMassProperties(massProperties.Value); } GetInfoFromFlags(rbInfo, Flags); if (m_grid.IsStatic) { rbInfo.MotionType = HkMotionType.Dynamic; rbInfo.QualityType = HkCollidableQualityType.Moving; } RigidBody = new HkRigidBody(rbInfo); if (m_grid.IsStatic) { RigidBody.UpdateMotionType(HkMotionType.Fixed); } //RigidBody.UpdateMotionType(HkMotionType.Dynamic); //base.CreateBody(ref shape, massProperties); } }