public static void TriggerDestruction(float destructionImpact, MyPhysicsBody body, Vector3D position, Vector3 normal, float maxDestructionRadius)
        {
            if (body.BreakableBody != null)
            {
                float collidingMass      = body.Mass;// == 0 ? Mass : body.Mass; //fall on voxel
                float destructionRadius  = Math.Min(destructionImpact / 8000, maxDestructionRadius);
                float destructionImpulse = MyDestructionConstants.STRENGTH + destructionImpact / 10000;
                float expandVelocity     = Math.Min(destructionImpact / 10000, 3);

                MyPhysics.FractureImpactDetails destruction;
                HkdFractureImpactDetails        details;
                details = HkdFractureImpactDetails.Create();
                details.SetBreakingBody(body.RigidBody);
                details.SetContactPoint(body.WorldToCluster(position));
                details.SetDestructionRadius(destructionRadius);
                details.SetBreakingImpulse(destructionImpulse);
                details.SetParticleExpandVelocity(expandVelocity);
                //details.SetParticleVelocity(contactVelocity);
                details.SetParticlePosition(body.WorldToCluster(position - normal * 0.25f));
                details.SetParticleMass(10000000);//collidingMass);
                details.ZeroCollidingParticleVelocity();
                details.Flag = details.Flag | HkdFractureImpactDetails.Flags.FLAG_DONT_RECURSE | HkdFractureImpactDetails.Flags.FLAG_TRIGGERED_DESTRUCTION;

                destruction                = new MyPhysics.FractureImpactDetails();
                destruction.Details        = details;
                destruction.World          = body.HavokWorld;
                destruction.ContactInWorld = position;
                destruction.Entity         = (MyEntity)body.Entity;

                MyPhysics.EnqueueDestruction(destruction);
            }
        }
Example #2
0
 public static unsafe void TriggerDestruction(float destructionImpact, MyPhysicsBody body, Vector3D position, Vector3 normal, float maxDestructionRadius)
 {
     if (body.BreakableBody != null)
     {
         float mass = body.Mass;
         HkdFractureImpactDetails details2 = HkdFractureImpactDetails.Create();
         details2.SetBreakingBody(body.RigidBody);
         details2.SetContactPoint((Vector3)body.WorldToCluster(position));
         details2.SetDestructionRadius(Math.Min(destructionImpact / 8000f, maxDestructionRadius));
         details2.SetBreakingImpulse(MyDestructionConstants.STRENGTH + (destructionImpact / 10000f));
         details2.SetParticleExpandVelocity(Math.Min((float)(destructionImpact / 10000f), (float)3f));
         details2.SetParticlePosition((Vector3)body.WorldToCluster(position - (normal * 0.25f)));
         details2.SetParticleMass(1E+07f);
         details2.ZeroCollidingParticleVelocity();
         HkdFractureImpactDetails *detailsPtr1 = (HkdFractureImpactDetails *)ref details2;
         detailsPtr1.Flag = (details2.Flag | HkdFractureImpactDetails.Flags.FLAG_DONT_RECURSE) | HkdFractureImpactDetails.Flags.FLAG_TRIGGERED_DESTRUCTION;
         MyPhysics.FractureImpactDetails details = new MyPhysics.FractureImpactDetails {
             Details        = details2,
             World          = body.HavokWorld,
             ContactInWorld = position,
             Entity         = (VRage.Game.Entity.MyEntity)body.Entity
         };
         MyPhysics.EnqueueDestruction(details);
     }
 }
Example #3
0
        public static unsafe void TriggerDestruction(HkWorld world, HkRigidBody body, Vector3 havokPosition, float radius = 0.0005f)
        {
            HkdFractureImpactDetails details = HkdFractureImpactDetails.Create();

            details.SetBreakingBody(body);
            details.SetContactPoint(havokPosition);
            details.SetDestructionRadius(radius);
            details.SetBreakingImpulse(MyDestructionConstants.STRENGTH * 10f);
            HkdFractureImpactDetails *detailsPtr1 = (HkdFractureImpactDetails *)ref details;

            detailsPtr1.Flag = details.Flag | HkdFractureImpactDetails.Flags.FLAG_DONT_RECURSE;
            MyPhysics.FractureImpactDetails details2 = new MyPhysics.FractureImpactDetails {
                Details = details,
                World   = world
            };
            MyPhysics.EnqueueDestruction(details2);
        }
        public static void TriggerDestruction(float destructionImpact, MyPhysicsBody body, Vector3D position, Vector3 normal, float maxDestructionRadius)
        {
            if (body.BreakableBody != null)
            {
                float collidingMass = body.Mass;// == 0 ? Mass : body.Mass; //fall on voxel
                float destructionRadius = Math.Min(destructionImpact / 8000, maxDestructionRadius);
                float destructionImpulse = MyDestructionConstants.STRENGTH + destructionImpact / 10000;
                float expandVelocity = Math.Min(destructionImpact / 10000, 3);

                MyPhysics.FractureImpactDetails destruction;
                HkdFractureImpactDetails details;
                details = HkdFractureImpactDetails.Create();
                details.SetBreakingBody(body.RigidBody);
                details.SetContactPoint(body.WorldToCluster(position));
                details.SetDestructionRadius(destructionRadius);
                details.SetBreakingImpulse(destructionImpulse);
                details.SetParticleExpandVelocity(expandVelocity);
                //details.SetParticleVelocity(contactVelocity);
                details.SetParticlePosition(body.WorldToCluster(position - normal * 0.25f));
                details.SetParticleMass(10000000);//collidingMass);
                details.ZeroCollidingParticleVelocity();
                details.Flag = details.Flag | HkdFractureImpactDetails.Flags.FLAG_DONT_RECURSE | HkdFractureImpactDetails.Flags.FLAG_TRIGGERED_DESTRUCTION;

                destruction = new MyPhysics.FractureImpactDetails();
                destruction.Details = details;
                destruction.World = body.HavokWorld;
                destruction.ContactInWorld = position;
                destruction.Entity = (MyEntity)body.Entity;

                MyPhysics.EnqueueDestruction(destruction);
            }
        }
 public void CreateSIDestruction(Vector3D worldCenter)
 {
     HkdFractureImpactDetails details = HkdFractureImpactDetails.Create();
     details.SetBreakingBody(m_cubeGrid.Physics.RigidBody);
     details.SetContactPoint(m_cubeGrid.Physics.WorldToCluster(worldCenter));
     details.SetDestructionRadius(1.5f);
     details.SetBreakingImpulse(Sandbox.MyDestructionConstants.STRENGTH * 10);
     details.SetParticleVelocity(Vector3.Zero);
     details.SetParticlePosition(m_cubeGrid.Physics.WorldToCluster(worldCenter));
     details.SetParticleMass(10000);
     //details.ZeroColidingParticleVelocity();
     details.Flag = details.Flag | HkdFractureImpactDetails.Flags.FLAG_DONT_RECURSE;
     if (m_cubeGrid.Physics.HavokWorld.DestructionWorld != null)
     {
         MyPhysics.FractureImpactDetails destruction = new MyPhysics.FractureImpactDetails();
         destruction.Details = details;
         destruction.World = m_cubeGrid.Physics.HavokWorld;
         destruction.Entity = m_cubeGrid;
         destruction.ContactInWorld = worldCenter;
         MyPhysics.EnqueueDestruction(destruction);
     }
 }
        private void Hammer()
        {
            var IntersectionStart = MySector.MainCamera.Position;
            var IntersectionDirection = MySector.MainCamera.ForwardVector;
            LineD line = new LineD(IntersectionStart, IntersectionStart + IntersectionDirection * 200);

            var m_tmpHitList = new List<MyPhysics.HitInfo>();
            MyPhysics.CastRay(line.From, line.To, m_tmpHitList, MyPhysics.ObjectDetectionCollisionLayer);
            // Remove character hits.
            m_tmpHitList.RemoveAll(delegate(MyPhysics.HitInfo hit)
            {
                return (hit.HkHitInfo.Body.GetEntity() == MySession.ControlledEntity.Entity);
            });

            if (m_tmpHitList.Count == 0)
                return;

            MyEntity closestEntity = null;
            MyPhysics.HitInfo closestHit = default(MyPhysics.HitInfo);

            foreach (var hit in m_tmpHitList)
            {
                if (hit.HkHitInfo.Body != null)
                {
                    closestEntity = hit.HkHitInfo.Body.GetEntity() as MyEntity;
                    closestHit = hit;
                    break;
                }
            }
            if (closestEntity == null)
                return;
            HkdFractureImpactDetails details = HkdFractureImpactDetails.Create();
            details.SetBreakingBody(closestEntity.Physics.RigidBody);
            details.SetContactPoint(closestEntity.Physics.WorldToCluster(closestHit.Position));
            details.SetDestructionRadius(RADIUS);
            details.SetBreakingImpulse(Sandbox.MyDestructionConstants.STRENGTH * 10);
            if(HammerForce)
                details.SetParticleVelocity(-line.Direction * 20);
            details.SetParticlePosition(closestEntity.Physics.WorldToCluster(closestHit.Position));
            details.SetParticleMass(1000000);
            //details.ZeroColidingParticleVelocity();
            details.Flag = details.Flag | HkdFractureImpactDetails.Flags.FLAG_DONT_RECURSE;
            if (closestEntity.Physics.HavokWorld.DestructionWorld != null)
            {
                MyPhysics.FractureImpactDetails destruction = new MyPhysics.FractureImpactDetails();
                destruction.Details = details;
                destruction.World = closestEntity.Physics.HavokWorld;
                destruction.Entity = closestEntity;
                MyPhysics.EnqueueDestruction(destruction);
                //closestGrid.Physics.HavokWorld.DestructionWorld.TriggerDestruction(ref details);
            }
            //details.RemoveReference();
        }