public bool TryGetSubpart(string name, out MyEntitySubpart subpart) { return Subparts.TryGetValue(name, out subpart); }
private void CreateSubpartsConstraint(MyEntitySubpart subpart) { m_subpartsFixedData = new HkFixedConstraintData(); m_subpartsFixedData.SetSolvingMethod(HkSolvingMethod.MethodStabilized); m_subpartsFixedData.SetInertiaStabilizationFactor(1); var matAD = MatrixD.CreateWorld(Position * CubeGrid.GridSize + Vector3D.Transform(Vector3D.Transform(m_subpartsConstraintPos, WorldMatrix), CubeGrid.PositionComp.LocalMatrix), PositionComp.LocalMatrix.Forward, PositionComp.LocalMatrix.Up); matAD.Translation = CubeGrid.Physics.WorldToCluster(matAD.Translation); var matA = (Matrix)matAD; var matB = subpart.PositionComp.LocalMatrix; m_subpartsFixedData.SetInWorldSpace(ref matA, ref matB, ref matB); //Dont dispose the fixed data or we wont have access to them HkConstraintData constraintData = m_subpartsFixedData; m_subpartsConstraint = new HkConstraint(CubeGrid.Physics.RigidBody, subpart.Physics.RigidBody, constraintData); Debug.Assert(m_subpartsConstraint.RigidBodyA != null); m_subpartsConstraint.WantRuntime = true; }
public void RefreshModels(string model, string modelCollision) { if (model != null) { Render.ModelStorage = VRage.Game.Models.MyModels.GetModelOnlyData(model); var renderModel = Render.GetModel(); PositionComp.LocalVolumeOffset = renderModel == null ? Vector3.Zero : renderModel.BoundingSphere.Center; } if (modelCollision != null) m_modelCollision = VRage.Game.Models.MyModels.GetModelOnlyData(modelCollision); if (Render.ModelStorage != null) { this.PositionComp.LocalAABB = Render.GetModel().BoundingBox; bool idAllocationState = MyEntityIdentifier.AllocationSuspended; try { MyEntityIdentifier.AllocationSuspended = false; if (Subparts == null) Subparts = new Dictionary<string, MyEntitySubpart>(); else { foreach (var existingSubpart in Subparts) { Hierarchy.RemoveChild(existingSubpart.Value); existingSubpart.Value.Close(); } Subparts.Clear(); } MyEntitySubpart.Data data = new MyEntitySubpart.Data(); foreach (var dummy in Render.GetModel().Dummies) { // Check of mirrored matrix of dummy object is under fake, because characters have mirrored dummies // VRAGE TODO: Reenable this check after moving/splitting MyFakes? //if (MyFakes.ENABLE_DUMMY_MIRROR_MATRIX_CHECK) //{ // // This should not be here but if you want to check bad matrices of other types // if (!(this is MyCharacter)) // { // Debug.Assert(!dummy.Value.Matrix.IsMirrored()); // } //} if (!MyEntitySubpart.GetSubpartFromDummy(model, dummy.Key, dummy.Value, ref data)) continue; MyEntitySubpart subpart = new MyEntitySubpart(); subpart.Render.EnableColorMaskHsv = Render.EnableColorMaskHsv; subpart.Render.ColorMaskHsv = Render.ColorMaskHsv; subpart.Init(null, data.File, this, null); // Set this to false becase no one else is responsible for rendering subparts subpart.Render.NeedsDrawFromParent = false; subpart.PositionComp.LocalMatrix = data.InitialTransform; Subparts[data.Name] = subpart; if (InScene) subpart.OnAddedToScene(this); } } finally { MyEntityIdentifier.AllocationSuspended = idAllocationState; } if (Render.GetModel().GlassData != null) { Render.NeedsDraw = true; Render.NeedsDrawFromParent = true; } } else { //entities without model has box with side length = 1 by default float defaultBoxHalfSize = 0.5f; this.PositionComp.LocalAABB = new BoundingBox(new Vector3(-defaultBoxHalfSize), new Vector3(defaultBoxHalfSize)); } }
private void CreateSubpartsConstraint(MyEntitySubpart subpart) { m_subpartsFixedData = new HkFixedConstraintData(); m_subpartsFixedData.SetSolvingMethod(HkSolvingMethod.MethodStabilized); m_subpartsFixedData.SetInertiaStabilizationFactor(1); var matAD = MatrixD.CreateWorld(Position * CubeGrid.GridSize + Vector3D.Transform(Vector3D.Transform(m_subpartsConstraintPos, WorldMatrix), CubeGrid.PositionComp.LocalMatrix), PositionComp.LocalMatrix.Forward, PositionComp.LocalMatrix.Up); matAD.Translation = CubeGrid.Physics.WorldToCluster(matAD.Translation); var matA = (Matrix)matAD; var matB = subpart.PositionComp.LocalMatrix; m_subpartsFixedData.SetInWorldSpace(ref matA, ref matB, ref matB); //Dont dispose the fixed data or we wont have access to them HkConstraintData constraintData = m_subpartsFixedData; m_subpartsConstraint = new HkConstraint(CubeGrid.Physics.RigidBody, m_subpartPhysics.RigidBody, constraintData); var info = CubeGrid.Physics.RigidBody.GetCollisionFilterInfo(); info = HkGroupFilter.CalcFilterInfo(CubeGrid.Physics.RigidBody.Layer, HkGroupFilter.GetSystemGroupFromFilterInfo(info), 1, 1); m_subpartPhysics.RigidBody.SetCollisionFilterInfo(info); CubeGrid.Physics.HavokWorld.RefreshCollisionFilterOnEntity(m_subpartPhysics.RigidBody); Debug.Assert(m_subpartsConstraint.RigidBodyA != null); m_subpartsConstraint.WantRuntime = true; }