private static IEnumerable <NodeInformation> GetAvailableNodesForLink(AssetViewModel viewModel, ModelNodeLinkComponent modelNodeLinkComponent) { return(GetAvailableNodesForLink(viewModel, modelNodeLinkComponent?.Target?.Model ?? modelNodeLinkComponent?.Entity?.Transform.Parent?.Entity?.Get <ModelComponent>()?.Model)); }
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; }