void CubeGrid_OnHavokSystemIDChanged(int id) { if (CubeGrid.Physics != null) { UpdateHavokCollisionSystemID(CubeGrid.GetPhysicsBody().HavokCollisionSystemID); } }
public override void OnBuildSuccess(long builtBy) { ResourceSink.Update(); if (CubeGrid.Physics != null) { UpdateHavokCollisionSystemID(CubeGrid.GetPhysicsBody().HavokCollisionSystemID); } base.OnBuildSuccess(builtBy); }
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); }
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); }
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); }
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); }
} //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); } }
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); } }
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); }