protected static void SetupDoorSubpart(MyEntitySubpart subpart, int havokCollisionSystemID, bool refreshInPlace) { if (((subpart != null) && ((subpart.Physics != null) && (subpart.ModelCollision.HavokCollisionShapes != null))) && (subpart.ModelCollision.HavokCollisionShapes.Length != 0)) { uint info = HkGroupFilter.CalcFilterInfo(subpart.GetPhysicsBody().RigidBody.Layer, havokCollisionSystemID, 1, 1); subpart.Physics.RigidBody.SetCollisionFilterInfo(info); if ((subpart.GetPhysicsBody().HavokWorld != null) & refreshInPlace) { subpart.GetPhysicsBody().HavokWorld.RefreshCollisionFilterOnEntity(subpart.Physics.RigidBody); } } }
private void InitSubparts() { if (!CubeGrid.CreatePhysics) { return; } Subparts.TryGetValue("DoorLeft", out m_leftSubpart); Subparts.TryGetValue("DoorRight", out m_rightSubpart); UpdateSlidingDoorsPosition(); if (CubeGrid.Projector != null) { //This is a projected grid, don't add collisions for subparts return; } if (m_leftSubpart != null && m_leftSubpart.Physics == null) { if ((m_leftSubpart.ModelCollision.HavokCollisionShapes != null) && (m_leftSubpart.ModelCollision.HavokCollisionShapes.Length > 0)) { var shape = m_leftSubpart.ModelCollision.HavokCollisionShapes[0]; m_leftSubpart.Physics = new Engine.Physics.MyPhysicsBody(m_leftSubpart, RigidBodyFlag.RBF_KINEMATIC); m_leftSubpart.Physics.IsPhantom = false; Vector3 center = new Vector3(0.35f, 0f, 0f) + m_leftSubpart.PositionComp.LocalVolume.Center; m_leftSubpart.GetPhysicsBody().CreateFromCollisionObject(shape, center, WorldMatrix, null, MyPhysics.CollisionLayers.KinematicDoubledCollisionLayer); m_leftSubpart.Physics.Enabled = true; } } if (m_rightSubpart != null && m_rightSubpart.Physics == null) { if ((m_rightSubpart.ModelCollision.HavokCollisionShapes != null) && (m_rightSubpart.ModelCollision.HavokCollisionShapes.Length > 0)) { var shape = m_rightSubpart.ModelCollision.HavokCollisionShapes[0]; m_rightSubpart.Physics = new Engine.Physics.MyPhysicsBody(m_rightSubpart, RigidBodyFlag.RBF_KINEMATIC); m_rightSubpart.Physics.IsPhantom = false; Vector3 center = new Vector3(-0.35f, 0f, 0f) + m_rightSubpart.PositionComp.LocalVolume.Center; m_rightSubpart.GetPhysicsBody().CreateFromCollisionObject(shape, center, WorldMatrix, null, MyPhysics.CollisionLayers.KinematicDoubledCollisionLayer); m_rightSubpart.Physics.Enabled = true; } } }