Пример #1
0
 void CubeGrid_OnHavokSystemIDChanged(int id)
 {
     if (CubeGrid.Physics != null)
     {
         UpdateHavokCollisionSystemID(CubeGrid.GetPhysicsBody().HavokCollisionSystemID);
     }
 }
Пример #2
0
 public override void OnBuildSuccess(long builtBy)
 {
     ResourceSink.Update();
     if (CubeGrid.Physics != null)
     {
         UpdateHavokCollisionSystemID(CubeGrid.GetPhysicsBody().HavokCollisionSystemID);
     }
     base.OnBuildSuccess(builtBy);
 }
Пример #3
0
 public override void OnCubeGridChanged(MyCubeGrid oldGrid)
 {
     oldGrid.OnHavokSystemIDChanged  -= CubeGrid_HavokSystemIDChanged;
     CubeGrid.OnHavokSystemIDChanged += CubeGrid_HavokSystemIDChanged;
     if (CubeGrid.Physics != null)
     {
         UpdateHavokCollisionSystemID(CubeGrid.GetPhysicsBody().HavokCollisionSystemID);
     }
     base.OnCubeGridChanged(oldGrid);
 }
Пример #4
0
        protected override bool CreateConstraint(MyAttachableTopBlockBase rotor)
        {
            if (!base.CreateConstraint(rotor))
            {
                return(false);
            }
            var rotorBody = TopGrid.Physics.RigidBody;

            rotorBody.MaxAngularVelocity = float.MaxValue;
            rotorBody.Restitution        = 0.5f;
            CubeGrid.GetPhysicsBody().HavokWorld.BreakOffPartsUtil.UnmarkEntityBreakable(rotorBody);
            if (MyFakes.WHEEL_SOFTNESS)
            {
                HkUtils.SetSoftContact(rotorBody, null, MyPhysicsConfig.WheelSoftnessRatio,
                                       MyPhysicsConfig.WheelSoftnessVelocity);
            }
            var info = HkGroupFilter.CalcFilterInfo(rotorBody.Layer,
                                                    CubeGrid.GetPhysicsBody().HavokCollisionSystemID, 1, 1);

            rotorBody.SetCollisionFilterInfo(info);
            CubeGrid.GetPhysicsBody().HavokWorld.RefreshCollisionFilterOnEntity(rotorBody);
            HkWheelConstraintData data = new HkWheelConstraintData();
            var suspensionAx           = PositionComp.LocalMatrix.Forward;
            var posA      = DummyPosition + (suspensionAx * m_height);
            var posB      = (rotor as MyMotorRotor).DummyPosLoc;
            var axisA     = PositionComp.LocalMatrix.Up;
            var axisAPerp = PositionComp.LocalMatrix.Forward;
            var axisB     = rotor.PositionComp.LocalMatrix.Up;

            data.SetInBodySpace(posB, posA, axisB, axisA, suspensionAx, suspensionAx, RotorGrid.Physics,
                                CubeGrid.Physics);
            //empirical values because who knows what havoc sees behind this
            //docs say one value should mean same effect for 2 ton or 200 ton vehicle
            //but we have virtual mass blocks so real mass doesnt corespond to actual "weight" in game and varying gravity
            data.SetSuspensionDamping(m_damping);
            data.SetSuspensionStrength(m_strenth);
            //Min/MaxHeight also define the limits of the suspension and SuspensionTravel lowers this limit
            data.SetSuspensionMinLimit((BlockDefinition.MinHeight - m_height) * SuspensionTravel);
            data.SetSuspensionMaxLimit((BlockDefinition.MaxHeight - m_height) * SuspensionTravel);
            m_constraint = new HkConstraint(rotorBody, CubeGrid.Physics.RigidBody, data);

            m_constraint.WantRuntime = true;
            CubeGrid.Physics.AddConstraint(m_constraint);
            if (!m_constraint.InWorld)
            {
                Debug.Fail("Constraint not added!");
                CubeGrid.Physics.RemoveConstraint(m_constraint);
                m_constraint = null;
                return(false);
            }
            m_constraint.Enabled = true;
            return(true);
        }
Пример #5
0
 public override void OnCubeGridChanged(MyCubeGrid oldGrid)
 {
     oldGrid.OnHavokSystemIDChanged  -= CubeGrid_OnHavokSystemIDChanged;
     CubeGrid.OnHavokSystemIDChanged += CubeGrid_OnHavokSystemIDChanged;
     oldGrid.OnPhysicsChanged        -= CubeGrid_OnPhysicsChanged;
     CubeGrid.OnPhysicsChanged       += CubeGrid_OnPhysicsChanged;
     if (CubeGrid.Physics != null)//when splitting blocks or creating new, then this is null and IDs are set from grit activation
     //when merging blocks, however, no grid is activated, so IDs must be changed from here
     {
         UpdateHavokCollisionSystemID(CubeGrid.GetPhysicsBody().HavokCollisionSystemID);
     }
     base.OnCubeGridChanged(oldGrid);
 }
Пример #6
0
        void CubeGrid_OnPhysicsChanged(MyEntity obj)
        {
            if (CubeGrid.Physics == null || m_topGrid == null || m_topGrid.Physics == null)
            {
                return;
            }
            var rotorBody = m_topGrid.Physics.RigidBody;

            if (rotorBody == null)
            {
                return;
            }
            var info = HkGroupFilter.CalcFilterInfo(rotorBody.Layer, CubeGrid.GetPhysicsBody().HavokCollisionSystemID, 1, 1);

            rotorBody.SetCollisionFilterInfo(info);
        }
Пример #7
0
        }                                      //fills m_subparts based on model naming etc.

        private void InitSubparts()
        {
            if (!CubeGrid.CreatePhysics)
            {
                return;
            }

            FillSubparts();

            UpdateDoorPosition();
            UpdateEmissivity(true);

            if (CubeGrid.Projector != null)
            {
                //This is a projected grid, don't add collisions for subparts
                return;
            }
            foreach (var subpart in m_subparts)
            {
                if (subpart != null && subpart.Physics == null)
                {
                    if ((subpart.ModelCollision.HavokCollisionShapes != null) && (subpart.ModelCollision.HavokCollisionShapes.Length > 0))
                    {
                        var shape = subpart.ModelCollision.HavokCollisionShapes[0];
                        subpart.Physics           = new Engine.Physics.MyPhysicsBody(subpart, RigidBodyFlag.RBF_DOUBLED_KINEMATIC | RigidBodyFlag.RBF_KINEMATIC);
                        subpart.Physics.IsPhantom = false;
                        Vector3 center = subpart.PositionComp.LocalVolume.Center;
                        subpart.GetPhysicsBody().CreateFromCollisionObject(shape, center, WorldMatrix, null, MyPhysics.CollisionLayers.KinematicDoubledCollisionLayer);
                        subpart.Physics.Enabled = true;
                    }
                }
            }

            CubeGrid.OnHavokSystemIDChanged -= CubeGrid_OnHavokSystemIDChanged;
            CubeGrid.OnHavokSystemIDChanged += CubeGrid_OnHavokSystemIDChanged;
            CubeGrid.OnPhysicsChanged       -= CubeGrid_OnPhysicsChanged;
            CubeGrid.OnPhysicsChanged       += CubeGrid_OnPhysicsChanged;
            if (CubeGrid.Physics != null)
            {
                UpdateHavokCollisionSystemID(CubeGrid.GetPhysicsBody().HavokCollisionSystemID);
            }
        }
Пример #8
0
        private void InitSubparts()
        {
            if (!CubeGrid.CreatePhysics)
            {
                return;
            }

            m_subparts.Clear();
            m_subpartIDs.Clear();
            m_currentOpening.Clear();
            m_currentSpeed.Clear();
            m_emitter.Clear();
            m_hingePosition.Clear();
            m_openingSequence.Clear();

            for (int i = 0; i < ((MyAdvancedDoorDefinition)BlockDefinition).Subparts.Length; i++)
            {
                MyEntitySubpart foundPart = LoadSubpartFromName(((MyAdvancedDoorDefinition)BlockDefinition).Subparts[i].Name);

                if (foundPart != null)
                {
                    m_subparts.Add(foundPart);

                    // save the Subparts hinge (pivot)
                    // if not defined...
                    if (((MyAdvancedDoorDefinition)BlockDefinition).Subparts[i].PivotPosition == null)
                    {
                        // ...try to get pivot from Model...
                        VRage.Import.MyModelBone bone = foundPart.Model.Bones.First(b => !b.Name.Contains("Root"));

                        if (bone != null)
                        {
                            m_hingePosition.Add(bone.Transform.Translation);
                        }
                    }
                    else // ...otherwise get from definition
                    {
                        m_hingePosition.Add((Vector3)((MyAdvancedDoorDefinition)BlockDefinition).Subparts[i].PivotPosition);
                    }
                }
            }

            // get the sequence count from definition
            int openSequenzCount = ((MyAdvancedDoorDefinition)BlockDefinition).OpeningSequence.Length;

            for (int i = 0; i < openSequenzCount; i++)
            {
                if (!String.IsNullOrEmpty(((MyAdvancedDoorDefinition)BlockDefinition).OpeningSequence[i].IDs))
                {
                    // if one sequence should be applied for multiple subparts (i.e. <IDs>1-3,4,6,8,9</IDs>
                    // add copies to m_openingSequence List

                    // split by comma
                    string[] tmp1 = ((MyAdvancedDoorDefinition)BlockDefinition).OpeningSequence[i].IDs.Split(',');

                    for (int j = 0; j < tmp1.Length; j++)
                    {
                        // split by minus
                        string[] tmp2 = tmp1[j].Split('-');

                        if (tmp2.Length == 2)
                        {
                            for (int k = Convert.ToInt32(tmp2[0]); k <= Convert.ToInt32(tmp2[1]); k++)
                            {
                                m_openingSequence.Add(((MyAdvancedDoorDefinition)BlockDefinition).OpeningSequence[i]);
                                m_subpartIDs.Add(k);
                            }
                        }
                        else
                        {
                            m_openingSequence.Add(((MyAdvancedDoorDefinition)BlockDefinition).OpeningSequence[i]);
                            m_subpartIDs.Add(Convert.ToInt32(tmp1[j]));
                        }
                    }
                }
                else
                {
                    m_openingSequence.Add(((MyAdvancedDoorDefinition)BlockDefinition).OpeningSequence[i]);
                    m_subpartIDs.Add(((MyAdvancedDoorDefinition)BlockDefinition).OpeningSequence[i].ID);
                }
            }

            for (int i = 0; i < m_openingSequence.Count; i++)
            {
                m_currentOpening.Add(0f);
                m_currentSpeed.Add(0f);
                m_emitter.Add(new MyEntity3DSoundEmitter(this, true));

                // make sure maxOpen is always positive and invert accordingly
                if (m_openingSequence[i].MaxOpen < 0f)
                {
                    m_openingSequence[i].MaxOpen       *= -1;
                    m_openingSequence[i].InvertRotation = !m_openingSequence[i].InvertRotation;
                }
            }

            m_sequenceCount = m_openingSequence.Count;
            m_subpartCount  = m_subparts.Count;

            Array.Resize(ref transMat, m_subpartCount);
            Array.Resize(ref rotMat, m_subpartCount);

            UpdateDoorPosition();

            if (CubeGrid.Projector != null)
            {
                //This is a projected grid, don't add collisions for subparts
                return;
            }

            foreach (MyEntitySubpart subpart in m_subparts)
            {
                subpart.Physics = null;
                if (subpart != null && subpart.Physics == null)
                {
                    if ((subpart.ModelCollision.HavokCollisionShapes != null) && (subpart.ModelCollision.HavokCollisionShapes.Length > 0))
                    {
                        List <HkShape> shapes    = subpart.ModelCollision.HavokCollisionShapes.ToList();
                        var            listShape = new HkListShape(shapes.GetInternalArray(), shapes.Count, HkReferencePolicy.None);
                        subpart.Physics           = new Engine.Physics.MyPhysicsBody(subpart, RigidBodyFlag.RBF_DOUBLED_KINEMATIC | RigidBodyFlag.RBF_KINEMATIC);
                        subpart.Physics.IsPhantom = false;
                        (subpart.Physics as MyPhysicsBody).CreateFromCollisionObject((HkShape)listShape, Vector3.Zero, WorldMatrix, null, MyPhysics.CollisionLayers.KinematicDoubledCollisionLayer);
                        subpart.Physics.Enabled = true;
                        listShape.Base.RemoveReference();
                    }
                }
            }

            CubeGrid.OnHavokSystemIDChanged -= CubeGrid_HavokSystemIDChanged;
            CubeGrid.OnHavokSystemIDChanged += CubeGrid_HavokSystemIDChanged;
            CubeGrid.OnPhysicsChanged       -= CubeGrid_OnPhysicsChanged;
            CubeGrid.OnPhysicsChanged       += CubeGrid_OnPhysicsChanged;
            if (CubeGrid.Physics != null)
            {
                UpdateHavokCollisionSystemID(CubeGrid.GetPhysicsBody().HavokCollisionSystemID);
            }
        }
Пример #9
0
        protected override bool Attach(MyAttachableTopBlockBase rotor, bool updateGroup = true)
        {
            Debug.Assert(rotor != null, "Rotor cannot be null!");
            Debug.Assert(m_constraint == null, "Already attached, call detach first!");


            if (rotor is MyMotorRotor)
            {
                if (CubeGrid.Physics != null && CubeGrid.Physics.Enabled)
                {
                    m_topBlock = rotor;
                    m_topGrid  = m_topBlock.CubeGrid;
                    var rotorBody = m_topGrid.Physics.RigidBody;
                    rotorBody.MaxAngularVelocity = float.MaxValue;
                    rotorBody.Restitution        = 0.5f;
                    CubeGrid.GetPhysicsBody().HavokWorld.BreakOffPartsUtil.UnmarkEntityBreakable(rotorBody);
                    if (MyFakes.WHEEL_SOFTNESS)
                    {
                        HkUtils.SetSoftContact(rotorBody, null, MyPhysicsConfig.WheelSoftnessRatio, MyPhysicsConfig.WheelSoftnessVelocity);
                    }
                    var info = HkGroupFilter.CalcFilterInfo(rotorBody.Layer, CubeGrid.GetPhysicsBody().HavokCollisionSystemID, 1, 1);
                    rotorBody.SetCollisionFilterInfo(info);
                    HkWheelConstraintData data = new HkWheelConstraintData();
                    var suspensionAx           = PositionComp.LocalMatrix.Forward;
                    var posA      = DummyPosition + (suspensionAx * m_height);
                    var posB      = (rotor as MyMotorRotor).DummyPosLoc;
                    var axisA     = PositionComp.LocalMatrix.Up;
                    var axisAPerp = PositionComp.LocalMatrix.Forward;
                    var axisB     = rotor.PositionComp.LocalMatrix.Up;
                    //empirical values because who knows what havoc sees behind this
                    //docs say one value should mean same effect for 2 ton or 200 ton vehicle
                    //but we have virtual mass blocks so real mass doesnt corespond to actual "weight" in game and varying gravity
                    data.SetSuspensionDamping(m_damping);
                    data.SetSuspensionStrength(m_strenth);
                    //Min/MaxHeight also define the limits of the suspension and SuspensionTravel lowers this limit
                    data.SetSuspensionMinLimit((BlockDefinition.MinHeight - m_height) * SuspensionTravel);
                    data.SetSuspensionMaxLimit((BlockDefinition.MaxHeight - m_height) * SuspensionTravel);
                    data.SetInBodySpace(posB, posA, axisB, axisA, suspensionAx, suspensionAx, RotorGrid.Physics, CubeGrid.Physics);
                    m_constraint = new HkConstraint(rotorBody, CubeGrid.Physics.RigidBody, data);

                    m_constraint.WantRuntime = true;
                    CubeGrid.Physics.AddConstraint(m_constraint);
                    if (!m_constraint.InWorld)
                    {
                        Debug.Fail("Constraint not added!");
                        CubeGrid.Physics.RemoveConstraint(m_constraint);
                        m_constraint = null;
                        return(false);
                    }
                    m_constraint.Enabled = true;

                    m_topBlock.Attach(this);
                    m_isAttached = true;
                    PropagateFriction(m_friction);
                    UpdateIsWorking();

                    if (m_updateBrakeNeeded)
                    {
                        UpdateBrake();
                    }
                    if (m_updateFrictionNeeded)
                    {
                        FrictionChanged();
                    }


                    if (updateGroup)
                    {
                        OnConstraintAdded(GridLinkTypeEnum.Physical, m_topGrid);
                        OnConstraintAdded(GridLinkTypeEnum.Logical, m_topGrid);
                    }

                    return(true);
                }
            }
            return(false);
        }