Ejemplo n.º 1
0
 void SyncType_PropertyChanged(SyncBase obj)
 {
     if (obj == m_dummyDisplacement && MyPhysicsBody.IsConstraintValid(m_constraint))
     {
         SetConstraintPosition(TopBlock, (HkLimitedHingeConstraintData)m_constraint.ConstraintData);
     }
 }
Ejemplo n.º 2
0
        /// <summary>
        /// Reveals this group to game and physics logic.
        /// </summary>
        public void Reveal()
        {
            foreach (var entity in Grids)
            {
                if (entity.Parent == null)
                {
                    MyGamePruningStructure.Add(entity);
                }
            }


            foreach (var body in Grids)
            {
                var world = body.Physics?.HavokWorld;
                if (world == null || body.Physics.IsWelded)
                {
                    continue;
                }
                try
                {
                    world.LockCriticalOperations();
                    ActivateRigidBody(body, world, body.Physics.RigidBody);
                    ActivateRigidBody(body, world, body.Physics.RigidBody2);
                    foreach (var constraint in body.Physics.Constraints)
                    {
                        if (MyPhysicsBody.IsConstraintValid(constraint))
                        {
                            world.AddConstraint(constraint);
                        }
                    }
                }
                finally
                {
                    world.UnlockCriticalOperations();
                }
            }

            foreach (var entity in Grids)
            {
                if (entity.Parent == null)
                {
                    RegisterRecursive(entity);
                }
            }

            void RegisterRecursive(IMyEntity e)
            {
                MyEntities.RegisterForUpdate((MyEntity)e);
                if (e.Hierarchy == null)
                {
                    return;
                }

                foreach (var child in e.Hierarchy.Children)
                {
                    RegisterRecursive(child.Container.Entity);
                }
            }

            void ActivateRigidBody(MyCubeGrid grid, HkWorld world, HkRigidBody body)
            {
                if (body == null)
                {
                    return;
                }

                // make it dynamic
                if (body.GetMotionType() != HkMotionType.Dynamic && !grid.IsStatic)
                {
                    body.UpdateMotionType(HkMotionType.Dynamic);
                }

                // wake it up
                body.Activate();
                // restore velocity?
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Conceals this group from game and physics logic.
        /// </summary>
        public void Conceal()
        {
            foreach (var body in Grids)
            {
                if (body.Parent == null)
                {
                    UnregisterRecursive(body);
                }
            }

            foreach (var body in Grids)
            {
                var world = body.Physics?.HavokWorld;
                if (world == null || body.Physics.IsWelded)
                {
                    continue;
                }
                try
                {
                    world.LockCriticalOperations();
                    foreach (var constraint in body.Physics.Constraints)
                    {
                        if (MyPhysicsBody.IsConstraintValid(constraint))
                        {
                            world.RemoveConstraint(constraint);
                        }
                    }
                    DeactivateRigidBody(body, world, body.Physics.RigidBody);
                    DeactivateRigidBody(body, world, body.Physics.RigidBody2);
                }
                finally
                {
                    world.UnlockCriticalOperations();
                }
            }

            foreach (var entity in Grids)
            {
                if (entity.Parent == null)
                {
                    MyGamePruningStructure.Remove(entity);
                }
            }

            void DeactivateRigidBody(MyCubeGrid grid, HkWorld world, HkRigidBody body)
            {
                if (world == null || body == null)
                {
                    return;
                }
                // stop it
                body.LinearVelocity  = Vector3.Zero;
                body.AngularVelocity = Vector3.Zero;
                // put it to sleep
                body.Deactivate();
                // make it static
                if (body.GetMotionType() != HkMotionType.Fixed)
                {
                    body.UpdateMotionType(HkMotionType.Fixed);
                }
                // Remove from collision
                // Cache velocity?
            }

            void UnregisterRecursive(IMyEntity e)
            {
                MyEntities.UnregisterForUpdate((MyEntity)e);
                if (e.Hierarchy == null)
                {
                    return;
                }

                foreach (var child in e.Hierarchy.Children)
                {
                    UnregisterRecursive(child.Container.Entity);
                }
            }
        }