private bool BreakPartsHandler(ref HkBreakOffPoints breakOffPoints, ref HkArrayUInt32 brokenKeysOut) { Debug.Assert(breakOffPoints.Count > 0); for (int i = 0; i < breakOffPoints.Count; i++) { var pt = breakOffPoints[i]; BreakAtPoint(ref pt, ref brokenKeysOut); } return true; }
private bool BreakAtPoint(ref HkBreakOffPointInfo pt, ref HkArrayUInt32 brokenKeysOut) { return true; }
private bool BreakPartsHandler(ref HkBreakOffPoints breakOffPoints, ref HkArrayUInt32 brokenKeysOut) { if (!Sync.IsServer) return true; if (RigidBody == null || Entity.MarkedForClose) return true; ProfilerShort.Begin("BreakPartsHandler"); Debug.Assert(breakOffPoints.Count > 0); bool recollide = false; Vector3D pos = Vector3D.Zero; for (int i = 0; i < breakOffPoints.Count; i++) { var pt = breakOffPoints[i]; if (pt.CollidingBody != null) { var separatingVelocity = Math.Abs(HkUtils.CalculateSeparatingVelocity(RigidBody, pt.CollidingBody, ref pt.ContactPoint)); if (separatingVelocity < 2) continue; if (Vector3D.DistanceSquared(pos, pt.ContactPoint.Position) < 9) continue; pos = pt.ContactPoint.Position; ProfilerShort.CustomValue("BreakAtPoint", 1, 1); recollide |= BreakAtPoint(ref pt, ref brokenKeysOut); } } ProfilerShort.End(); return true; }
private bool BreakAtPoint(ref HkBreakOffPointInfo pt, ref HkArrayUInt32 brokenKeysOut) { //if (pt.BreakingImpulse < Shape.BreakImpulse * 0.75f && MyUtils.GetRandomInt(3) != 0) //return false; if(RigidBody == null || pt.CollidingBody == null) { VRage.Trace.MyTrace.Send(VRage.Trace.TraceWindow.Analytics, string.Format("BreakAtPoint:Breaking body {0} null", RigidBody == null ? "A" : "B")); return false; } var separatingVelocity = Math.Abs(HkUtils.CalculateSeparatingVelocity(RigidBody, pt.CollidingBody, ref pt.ContactPoint)); //if (separatingVelocity < 2) // return false; var otherEntity = pt.CollidingBody.GetEntity(0); if (otherEntity is Sandbox.Game.WorldEnvironment.MyEnvironmentSector) //jn:HACK //ab:HACK return false; if (otherEntity.GetTopMostParent() == Entity) return false; pt.ContactPosition = ClusterToWorld(pt.ContactPoint.Position); var destroyed = PerformDeformationOnGroup((MyEntity)Entity, (MyEntity)otherEntity, ref pt, separatingVelocity); pt.ContactPointDirection *= -1; destroyed |= PerformDeformationOnGroup((MyEntity)otherEntity, (MyEntity)Entity, ref pt, separatingVelocity); return destroyed; }
private bool BreakPartsHandler(ref HkBreakOffPoints breakOffPoints, ref HkArrayUInt32 brokenKeysOut) { if (!Sync.IsServer) return true; ProfilerShort.Begin("BreakPartsHandler"); Debug.Assert(breakOffPoints.Count > 0); bool recollide = false; for (int i = 0; i < breakOffPoints.Count; i++) { var pt = breakOffPoints[i]; recollide |= BreakAtPoint(ref pt, ref brokenKeysOut); } ProfilerShort.End(); return true; }
private bool BreakAtPoint(ref HkBreakOffPointInfo pt, ref HkArrayUInt32 brokenKeysOut) { //if (pt.BreakingImpulse < Shape.BreakImpulse * 0.75f && MyUtils.GetRandomInt(3) != 0) //return false; if(RigidBody == null || pt.CollidingBody == null) { VRage.Trace.MyTrace.Send(VRage.Trace.TraceWindow.Analytics, string.Format("BreakAtPoint:Breaking body {0} null", RigidBody == null ? "A" : "B")); return false; } var separatingVelocity = Math.Abs(HkUtils.CalculateSeparatingVelocity(RigidBody, pt.CollidingBody, ref pt.ContactPoint)); if (Math.Abs(separatingVelocity) < 2) return false; var otherEntity = pt.CollidingBody.GetEntity(0); pt.ContactPosition = ClusterToWorld(pt.ContactPoint.Position); var destroyed = false; var group = MyWeldingGroups.Static.GetGroup((MyEntity)Entity); if (group != null) { foreach (var node in group.Nodes) { m_tmpEntities.Add(node.NodeData); } foreach (var node in m_tmpEntities) { if (node.MarkedForClose) continue; var gp = node.Physics as MyGridPhysics; if (gp == null) continue; destroyed |= gp.PerformDeformation(ref pt, false, separatingVelocity, otherEntity as MyEntity); } m_tmpEntities.Clear(); } group = MyWeldingGroups.Static.GetGroup((MyEntity)otherEntity); if (group != null) { foreach (var node in group.Nodes) { m_tmpEntities.Add(node.NodeData); } pt.ContactPointDirection *= -1; foreach (var node in m_tmpEntities) { if (node.MarkedForClose) continue; var gp = node.Physics as MyGridPhysics; if (gp == null) continue; destroyed |= gp.PerformDeformation(ref pt, false, separatingVelocity, Entity as MyEntity); } } return destroyed; }