Exemplo n.º 1
0
 private static IEnumerable <NodeInformation> GetAvailableNodesForLink(AssetViewModel viewModel, ModelNodeLinkComponent modelNodeLinkComponent)
 {
     return(GetAvailableNodesForLink(viewModel, modelNodeLinkComponent?.Target?.Model ?? modelNodeLinkComponent?.Entity?.Transform.Parent?.Entity?.Get <ModelComponent>()?.Model));
 }
Exemplo n.º 2
0
        private void GrabNewEntity()
        {
            if (grabbedEntity != null)
            {
                return;
            }

            var collisions = Entity.Get <PhysicsComponent>().Collisions;

            if (collisions.Count == 0)
            {
                return;
            }

            var enumerator = collisions.GetEnumerator();

            while (enumerator.MoveNext())
            {
                var collision = enumerator.Current;
                var entityA   = collision?.ColliderA?.Entity;
                var entityB   = collision?.ColliderB?.Entity;

                var otherEntity = (entityA == Entity) ? entityB : entityA;

                var otherRigidBody = otherEntity?.Get <RigidbodyComponent>();
                if (otherRigidBody == null || otherRigidBody.IsKinematic ||
                    otherRigidBody.CollisionGroup == CollisionFilterGroups.CharacterFilter)
                {
                    continue;
                }

                grabbedEntity = otherEntity;
                break;
            }

            if (grabbedEntity == null)
            {
                return;
            }

            var rigidBody = grabbedEntity?.Get <RigidbodyComponent>();

            rigidBody.IsKinematic = true;
            rigidBody.CanSleep    = false;

            Vector3    posObject, posParent;
            Vector3    sclObject, sclParent;
            Quaternion rotObject, rotParent;

            // Make sure old positions are up to date
            grabbedEntity.Transform.UpdateWorldMatrix();
            grabbedEntity.Transform.WorldMatrix.Decompose(out sclObject, out rotObject, out posObject);
            var parentEntity = Entity.GetChild(0);

            parentEntity.Transform.WorldMatrix.Decompose(out sclParent, out rotParent, out posParent);

            // Calculate relative transformations
            posObject -= posParent;
            posObject /= sclParent;
            rotParent.Conjugate();
            rotParent.Rotate(ref posObject);
            rotObject = rotParent * rotObject;

            // Attach the object to the parent
            var transformLink = grabbedEntity.Get <ModelNodeLinkComponent>();

            if (transformLink != null)
            {
                transformLink.Target = parentEntity.Get <ModelComponent>();
            }
            else
            {
                transformLink        = new ModelNodeLinkComponent();
                transformLink.Target = parentEntity.Get <ModelComponent>();
                grabbedEntity.Add(transformLink);
            }

            grabbedEntity.Transform.UseTRS   = true;
            grabbedEntity.Transform.Position = posObject;
            grabbedEntity.Transform.Rotation = rotObject;
        }