コード例 #1
0
ファイル: MyWheel.cs プロジェクト: GeekOfWires/SpaceEngineers
        public override void ContactPointCallback(ref MyGridContactInfo value)
        {
            //return;
            var prop = value.Event.ContactProperties;

            prop.Friction           = Friction;
            prop.Restitution        = 0.5f;
            value.EnableParticles   = false;
            value.RubberDeformation = true;

            string particle = null;

            if (value.CollidingEntity is MyVoxelBase && MyFakes.ENABLE_DRIVING_PARTICLES)
            {
                MyVoxelBase  voxel           = value.CollidingEntity as MyVoxelBase;
                Vector3D     contactPosition = value.ContactPosition;
                MyStringHash material        = MyStringHash.GetOrCompute(voxel.GetMaterialAt(ref contactPosition).MaterialTypeName);
                particle = MyMaterialPropertiesHelper.Static.GetCollisionEffect(MyMaterialPropertiesHelper.CollisionType.Start, m_wheelStringHash, material);
            }
            else if (value.CollidingEntity is MyCubeGrid && MyFakes.ENABLE_DRIVING_PARTICLES)
            {
                MyCubeGrid   grid     = value.CollidingEntity as MyCubeGrid;
                MyStringHash material = grid.Physics.GetMaterialAt(value.ContactPosition);
                particle = MyMaterialPropertiesHelper.Static.GetCollisionEffect(MyMaterialPropertiesHelper.CollisionType.Start, m_wheelStringHash, material);
            }
            if (Render != null && particle != null)
            {
                Render.TrySpawnParticle(value.ContactPosition, particle);
            }
        }
コード例 #2
0
 public override void ContactPointCallback(ref MyGridContactInfo info)
 {
     if (info.CollidingEntity != null && m_attachedTo == info.CollidingEntity)
     {
         info.EnableDeformation = false;
         info.EnableParticles   = false;
     }
 }
コード例 #3
0
 public override void ContactPointCallback(ref MyGridContactInfo value)
 {
     base.ContactPointCallback(ref value);
     if ((this.m_pistonBlock != null) && ReferenceEquals(value.CollidingEntity, this.m_pistonBlock.Subpart3))
     {
         value.EnableDeformation = false;
         value.EnableParticles   = false;
     }
 }
コード例 #4
0
        public override void ContactPointCallback(ref MyGridContactInfo value)
        {
            HkContactPointProperties contactProperties = value.Event.ContactProperties;

            contactProperties.Friction    = 0.85f;
            contactProperties.Restitution = 0.2f;
            value.EnableParticles         = false;
            value.RubberDeformation       = true;
        }
コード例 #5
0
        public override void ContactPointCallback(ref MyGridContactInfo value)
        {
            //return;
            var prop = value.Event.ContactProperties;

            prop.Friction           = 0.85f;
            prop.Restitution        = 0.2f;
            value.EnableParticles   = false;
            value.RubberDeformation = true;
        }
コード例 #6
0
 internal override void ContactPointCallback(ref MyGridContactInfo value)
 {
     base.ContactPointCallback(ref value);
     if (m_pistonBlock == null)
         return;
     //if (value.CollidingEntity == m_pistonBlock.CubeGrid || value.CollidingEntity == m_pistonBlock.Subpart3)
     if (value.CollidingEntity == m_pistonBlock.Subpart3)
     {
         value.EnableDeformation = false;
         value.EnableParticles = false;
     }
 }
コード例 #7
0
        public override void ContactPointCallback(ref MyGridContactInfo value)
        {
            var prop = value.Event.ContactProperties;

            value.EnableDeformation = false;
            value.EnableParticles   = false;
            value.RubberDeformation = false;

            if (MyPerGameSettings.BallFriendlyPhysics)
            {
                prop.Friction    = Friction;
                prop.Restitution = Restitution > REAL_MAXIMUM_RESTITUTION ? REAL_MAXIMUM_RESTITUTION : Restitution;
            }
        }
コード例 #8
0
            private void DestroyGrid(ref MyPhysics.MyContactPointEvent value, MyCubeGrid grid)
            {
                MyGridContactInfo info = new MyGridContactInfo(ref value.ContactPointEvent, grid);

                info.EnableDeformation = false;
                info.EnableParticles   = false;
                HkBreakOffPointInfo breakInfo = new HkBreakOffPointInfo()
                {
                    ContactPoint           = value.ContactPointEvent.ContactPoint,
                    ContactPosition        = info.ContactPosition,
                    ContactPointProperties = value.ContactPointEvent.ContactProperties,
                    IsContact             = true,
                    BreakingImpulse       = grid.Physics.Shape.BreakImpulse,
                    CollidingBody         = value.ContactPointEvent.Base.BodyA == grid.Physics.RigidBody ? value.ContactPointEvent.Base.BodyB : value.ContactPointEvent.Base.BodyA,
                    ContactPointDirection = value.ContactPointEvent.Base.BodyB == grid.Physics.RigidBody ? -1 : 1,
                };

                grid.Physics.PerformMeteoritDeformation(ref breakInfo, value.ContactPointEvent.SeparatingVelocity);
                m_closeAfterSimulation = Sync.IsServer;
            }
コード例 #9
0
        public override void ContactPointCallback(ref MyGridContactInfo value)
        {
            //return;
            var prop = value.Event.ContactProperties;

            prop.Friction           = Friction;
            prop.Restitution        = 0.5f;
            value.EnableParticles   = false;
            value.RubberDeformation = true;

            if (value.CollidingEntity is MyVoxelBase)
            {
                MyVoxelBase             voxel           = value.CollidingEntity as MyVoxelBase;
                Vector3D                contactPosition = value.ContactPosition;
                MyParticleEffectsIDEnum particleEffect  = voxel.GetMaterialAt(ref contactPosition).ParticleEffect;

                if (Render != null && particleEffect != MyParticleEffectsIDEnum.None)
                {
                    Render.TrySpawnParticle(value.ContactPosition, particleEffect);
                }
            }
        }
コード例 #10
0
ファイル: MyCubeBlock.cs プロジェクト: caomw/SpaceEngineers
 /// <summary>
 /// Return true when contact is valid
 /// </summary>
 internal virtual void ContactPointCallback(ref MyGridContactInfo value)
 {
 }
コード例 #11
0
        void Physics_ContactPointCallback(ref Engine.Physics.MyPhysics.MyContactPointEvent e)
        {
            //  RestoreDynamicMasses();
            //if (m_frameCounter > DYNAMIC_UPDATE_DELAY)
            //    m_frameCounter = 0;
            //else
            //    return;

            if (m_lastFrameCollision != m_frameCounter)
            {
                DynamicWeights.Clear();
            }

            MyGridContactInfo info = new MyGridContactInfo(ref e.ContactPointEvent, m_grid);

            if (info.CollidingEntity.Physics.IsStatic)
            {
                return;
            }

            float speed = info.CollidingEntity.Physics.LinearVelocity.Length();

            if (speed < 0.1f)
            {
                return;
            }

            Vector3I blockPos = m_grid.WorldToGridInteger(info.ContactPosition + Vector3.Up * 0.25f);

            float dot = Vector3.Dot(Vector3.Normalize(info.CollidingEntity.Physics.LinearVelocity), Vector3.Down);

            float collidingMass = 0;

            m_constrainedGrid.Clear();
            MyCubeGrid collidingGrid = info.CollidingEntity as MyCubeGrid;

            if (collidingGrid != null)
            {
                m_constrainedGrid.Add(collidingGrid);

                AddConstrainedGrids(collidingGrid);

                foreach (var grid in m_constrainedGrid)
                {
                    collidingMass += grid.Physics.Mass;
                }
            }
            else
            {
                collidingMass = info.CollidingEntity.Physics.Mass;
            }

            collidingMass = info.CollidingEntity is Sandbox.Game.Entities.Character.MyCharacter ? MassToSI(collidingMass) : MassToSI(MyDestructionHelper.MassFromHavok(collidingMass));

            float siMass = collidingMass * MyPetaInputComponent.SI_DYNAMICS_MULTIPLIER;

            //if (dot < 0) //impact from downside
            //    return;


            float impact = siMass * speed * dot + siMass;

            if (impact < 0)
            {
                return;
            }

            if (m_grid.GridSizeEnum == MyCubeSize.Large)
            {
            }

            DynamicWeights[blockPos] = impact;

            m_needsRecalc = true;

            m_lastFrameCollision = m_frameCounter;

            if (!m_collidingEntities.ContainsKey(info.CollidingEntity))
            {
                m_collidingEntities.Add(info.CollidingEntity, new CollidingEntityInfo()
                {
                    Position  = blockPos,
                    FrameTime = m_frameCounter
                });
                info.CollidingEntity.PositionComp.OnPositionChanged += PositionComp_OnPositionChanged;
            }
            else
            {
                m_collidingEntities[info.CollidingEntity].FrameTime = m_frameCounter;
            }
        }
コード例 #12
0
        public override void ContactPointCallback(ref MyGridContactInfo value)
        {
            Vector3 normal = value.Event.ContactPoint.Normal;

            this.m_contactNormals.PushNext(ref normal);
            MyVoxelMaterialDefinition voxelSurfaceMaterial = value.VoxelSurfaceMaterial;

            if (voxelSurfaceMaterial != null)
            {
                this.m_frictionCollector = voxelSurfaceMaterial.Friction;
            }
            float friction = this.Friction;

            if ((this.m_isSuspensionMounted && ((value.CollidingEntity is MyCubeGrid) && (value.OtherBlock != null))) && (value.OtherBlock.FatBlock == null))
            {
                friction *= 0.07f;
                this.m_frictionCollector = 0.7f;
            }
            HkContactPointProperties contactProperties = value.Event.ContactProperties;

            contactProperties.Friction    = friction;
            contactProperties.Restitution = 0.5f;
            value.EnableParticles         = false;
            value.RubberDeformation       = true;
            ulong simulationFrameCounter = MySandboxGame.Static.SimulationFrameCounter;

            if (simulationFrameCounter != this.LastContactFrameNumber)
            {
                Vector3 vector2;
                this.LastContactFrameNumber = simulationFrameCounter;
                Vector3D contactPosition = value.ContactPosition;
                if (this.m_contactNormals.GetAvgNormalCached(out vector2))
                {
                    normal = vector2;
                }
                string particleName = null;
                if (!(value.CollidingEntity is MyVoxelBase) || !MyFakes.ENABLE_DRIVING_PARTICLES)
                {
                    if ((value.CollidingEntity is MyCubeGrid) && MyFakes.ENABLE_DRIVING_PARTICLES)
                    {
                        MyStringHash materialAt = (value.CollidingEntity as MyCubeGrid).Physics.GetMaterialAt(contactPosition);
                        particleName = MyMaterialPropertiesHelper.Static.GetCollisionEffect(MyMaterialPropertiesHelper.CollisionType.Start, this.m_wheelStringHash, materialAt);
                    }
                }
                else if (voxelSurfaceMaterial != null)
                {
                    MyStringHash materialTypeNameHash = voxelSurfaceMaterial.MaterialTypeNameHash;
                    particleName = MyMaterialPropertiesHelper.Static.GetCollisionEffect(MyMaterialPropertiesHelper.CollisionType.Start, this.m_wheelStringHash, materialTypeNameHash);
                }
                if (this.Render != null)
                {
                    if (particleName != null)
                    {
                        this.Render.TrySpawnParticle(particleName, ref contactPosition, ref normal);
                    }
                    this.Render.UpdateParticle(ref contactPosition, ref normal);
                }
                if (((particleName != null) && Sync.IsServer) && (MySession.Static.Settings.OnlineMode != MyOnlineModeEnum.OFFLINE))
                {
                    ParticleData data = new ParticleData {
                        EffectName       = particleName,
                        PositionRelative = (Vector3)(contactPosition - base.PositionComp.WorldMatrix.Translation),
                        Normal           = value.Event.ContactPoint.Normal
                    };
                    this.m_particleData.Value = data;
                }
                this.RegisterPerFrameUpdate();
            }
        }