From 0a822dcd79803cc89c29b6ad979c527af1551644 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Mon, 19 Feb 2024 21:39:07 +0100 Subject: [PATCH] ScriptCore: Added Transform.WorldTransform --- GlitchyEngine/src/Scripting/ScriptGlue.bf | 37 +++++++++++++++++++++++ ScriptCore/Core/Transform.cs | 13 ++++++++ ScriptCore/ScriptGlue.cs | 6 ++++ 3 files changed, 56 insertions(+) diff --git a/GlitchyEngine/src/Scripting/ScriptGlue.bf b/GlitchyEngine/src/Scripting/ScriptGlue.bf index 1dfbbe6..992a05a 100644 --- a/GlitchyEngine/src/Scripting/ScriptGlue.bf +++ b/GlitchyEngine/src/Scripting/ScriptGlue.bf @@ -506,6 +506,43 @@ static class ScriptGlue } // TODO: we need to handle repositioning of colliders that are children of the entity with rigidbody... } + + [RegisterCall("ScriptGlue::Transform_GetWorldTranslation")] + static void Transform_GetWorldTranslation(UUID entityId, out float3 translationWorld) + { + Entity entity = GetEntitySafe(entityId); + + TransformComponent* transform = entity.Transform; + + translationWorld = transform.WorldTransform.Translation; //(float4(entity.Transform.Position, 1.0f) * entity.Transform.WorldTransform).XYZ; + } + + [RegisterCall("ScriptGlue::Transform_SetWorldTranslation")] + static void Transform_SetWorldTranslation(UUID entityId, in float3 translation) + { + Log.ClientLogger.Warning("Transform_SetWorldTranslation is not implemented!"); + + // Entity entity = GetEntitySafe(entityId); + + // entity.Transform.Position = translation; + + // // if necessary reposition Rigidbody2D + // if (entity.TryGetComponent(let rigidbody2D)) + // { + // rigidbody2D.SetPosition(translation.XY); + // } + // TODO: we need to handle repositioning of colliders that are children of the entity with rigidbody... + } + + [RegisterCall("ScriptGlue::Transform_TransformPointToWorld")] + static void Transform_TransformPointToWorld(UUID entityId, float3 point, out float3 pointWorld) + { + Entity entity = GetEntitySafe(entityId); + + float3 localPoint = entity.Transform.Position; + + pointWorld = (float4(localPoint, 1.0f) * entity.Transform.WorldTransform).XYZ; + } [RegisterCall("ScriptGlue::Transform_GetRotation")] static void Transform_GetRotation(UUID entityId, out Quaternion rotation) diff --git a/ScriptCore/Core/Transform.cs b/ScriptCore/Core/Transform.cs index 68c12b5..12ede09 100644 --- a/ScriptCore/Core/Transform.cs +++ b/ScriptCore/Core/Transform.cs @@ -36,6 +36,19 @@ public class Transform : Component } set => ScriptGlue.Transform_SetTranslation(Entity.UUID, in value); } + + /// + /// Gets or sets the translation (position) of the entity in global space. + /// + public float3 WorldTranslation + { + get + { + ScriptGlue.Transform_GetWorldTranslation(Entity.UUID, out float3 translation); + return translation; + } + set => ScriptGlue.Transform_SetWorldTranslation(Entity.UUID, in value); + } /// /// Gets or sets the rotation of the entity. diff --git a/ScriptCore/ScriptGlue.cs b/ScriptCore/ScriptGlue.cs index bb59e1f..c7a67a6 100644 --- a/ScriptCore/ScriptGlue.cs +++ b/ScriptCore/ScriptGlue.cs @@ -81,6 +81,12 @@ internal static class ScriptGlue [MethodImpl(MethodImplOptions.InternalCall)] internal static extern void Transform_SetTranslation(UUID entityId, in float3 translation); + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern void Transform_GetWorldTranslation(UUID entityId, out float3 translation); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern void Transform_SetWorldTranslation(UUID entityId, in float3 translation); + [MethodImpl(MethodImplOptions.InternalCall)] internal static extern void Transform_GetRotation(UUID entityId, out Quaternion rotation);