コード例 #1
0
        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;
        }
コード例 #2
0
 private bool BreakAtPoint(ref HkBreakOffPointInfo pt, ref HkArrayUInt32 brokenKeysOut)
 {
     return true;
 }
コード例 #3
0
        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;
        }
コード例 #4
0
        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;
        }
コード例 #5
0
 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;
 }
コード例 #6
0
        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;
        }