diff --git a/GlitchyEngine/src/Math/Math.bf b/GlitchyEngine/src/Math/Math.bf index 62573a5..4ee3676 100644 --- a/GlitchyEngine/src/Math/Math.bf +++ b/GlitchyEngine/src/Math/Math.bf @@ -544,6 +544,8 @@ static public static float3 normalize(float3 value) => value / length(value); public static float4 normalize(float4 value) => value / length(value); + public static Quaternion normalize(Quaternion value) => Quaternion.Normalize(value); + // pow #region Reflect and Refract diff --git a/GlitchyEngine/src/Scripting/ScriptGlue.bf b/GlitchyEngine/src/Scripting/ScriptGlue.bf index 55a2f69..ff20f7d 100644 --- a/GlitchyEngine/src/Scripting/ScriptGlue.bf +++ b/GlitchyEngine/src/Scripting/ScriptGlue.bf @@ -213,7 +213,7 @@ static class ScriptGlue #region TransformComponent [RegisterCall("ScriptGlue::Transform_GetTranslation")] - static void Transform_GetTranslation(UUID entityId, ref float3 translation) + static void Transform_GetTranslation(UUID entityId, out float3 translation) { Scene scene = ScriptEngine.Context; Entity entity = scene.GetEntityByID(entityId); @@ -222,7 +222,7 @@ static class ScriptGlue } [RegisterCall("ScriptGlue::Transform_SetTranslation")] - static void Transform_SetTranslation(UUID entityId, ref float3 translation) + static void Transform_SetTranslation(UUID entityId, in float3 translation) { Scene scene = ScriptEngine.Context; Entity entity = scene.GetEntityByID(entityId); @@ -238,10 +238,10 @@ static class ScriptGlue #endregion TransformComponent -#region RigidBody2D +#region Rigidbody2D - [RegisterCall("ScriptGlue::RigidBody2D_ApplyForce")] - static void RigidBody2D_ApplyForce(UUID entityId, ref float2 force, ref float2 point, bool wakeUp) + [RegisterCall("ScriptGlue::Rigidbody2D_ApplyForce")] + static void Rigidbody2D_ApplyForce(UUID entityId, in float2 force, in float2 point, bool wakeUp) { Scene scene = ScriptEngine.Context; Entity entity = scene.GetEntityByID(entityId); @@ -250,8 +250,8 @@ static class ScriptGlue Box2D.Body.ApplyForce(rigidBody.[Friend]RuntimeBody, force, point, wakeUp); } - [RegisterCall("ScriptGlue::RigidBody2D_ApplyForceToCenter")] - static void RigidBody2D_ApplyForceToCenter(UUID entityId, ref float2 force, bool wakeUp) + [RegisterCall("ScriptGlue::Rigidbody2D_ApplyForceToCenter")] + static void Rigidbody2D_ApplyForceToCenter(UUID entityId, in float2 force, bool wakeUp) { Scene scene = ScriptEngine.Context; Entity entity = scene.GetEntityByID(entityId); @@ -260,8 +260,8 @@ static class ScriptGlue Box2D.Body.ApplyForceToCenter(rigidBody.[Friend]RuntimeBody, force, wakeUp); } - [RegisterCall("ScriptGlue::RigidBody2D_SetPosition")] - static void RigidBody2D_SetPosition(UUID entityId, ref float2 position) + [RegisterCall("ScriptGlue::Rigidbody2D_SetPosition")] + static void Rigidbody2D_SetPosition(UUID entityId, in float2 position) { Scene scene = ScriptEngine.Context; Entity entity = scene.GetEntityByID(entityId); @@ -270,8 +270,8 @@ static class ScriptGlue rigidBody.SetPosition(position); } - [RegisterCall("ScriptGlue::RigidBody2D_GetPosition")] - static void RigidBody2D_GetPosition(UUID entityId, ref float2 position) + [RegisterCall("ScriptGlue::Rigidbody2D_GetPosition")] + static void Rigidbody2D_GetPosition(UUID entityId, out float2 position) { Scene scene = ScriptEngine.Context; Entity entity = scene.GetEntityByID(entityId); @@ -279,15 +279,35 @@ static class ScriptGlue var rigidBody = entity.GetComponent(); position = rigidBody.GetPosition(); } + + [RegisterCall("ScriptGlue::Rigidbody2D_SetRotation")] + static void Rigidbody2D_SetRotation(UUID entityId, in float rotation) + { + Scene scene = ScriptEngine.Context; + Entity entity = scene.GetEntityByID(entityId); -#endregion RigidBody2D + var rigidBody = entity.GetComponent(); + rigidBody.SetAngle(rotation); + } + + [RegisterCall("ScriptGlue::Rigidbody2D_GetRotation")] + static void Rigidbody2D_GetRotation(UUID entityId, out float rotation) + { + Scene scene = ScriptEngine.Context; + Entity entity = scene.GetEntityByID(entityId); + + var rigidBody = entity.GetComponent(); + rotation = rigidBody.GetAngle(); + } + +#endregion Rigidbody2D #region Physics2D // TODO: We need a wrapper class! [RegisterCall("ScriptGlue::Physics2D_GetGravity")] - static void Physics2D_GetGravity(ref float2 gravity) + static void Physics2D_GetGravity(out float2 gravity) { Scene scene = ScriptEngine.Context; @@ -296,7 +316,7 @@ static class ScriptGlue } [RegisterCall("ScriptGlue::Physics2D_SetGravity")] - static void Physics2D_SetGravity(ref float2 gravity) + static void Physics2D_SetGravity(in float2 gravity) { Scene scene = ScriptEngine.Context; diff --git a/ScriptCore/Components/RigidBody2D.cs b/ScriptCore/Components/RigidBody2D.cs index b4d831d..272ef55 100644 --- a/ScriptCore/Components/RigidBody2D.cs +++ b/ScriptCore/Components/RigidBody2D.cs @@ -14,7 +14,7 @@ public class Rigidbody2D : Component /// Wake up the body public void ApplyForce(float2 force, float2 point, bool wakeUp = true) { - ScriptGlue.RigidBody2D_ApplyForce(Entity._uuid, force, point, wakeUp); + ScriptGlue.Rigidbody2D_ApplyForce(Entity._uuid, force, point, wakeUp); } /// @@ -25,22 +25,34 @@ public class Rigidbody2D : Component /// Wake up the body public void ApplyForceToCenter(float2 force, bool wakeUp = true) { - ScriptGlue.RigidBody2D_ApplyForceToCenter(Entity._uuid, force, wakeUp); - } - - /// - /// Sets the position of the rigidbody. - /// - /// The position of the rigidbody. - public void SetPosition(float2 position) - { - ScriptGlue.RigidBody2D_SetPosition(Entity._uuid, position); + ScriptGlue.Rigidbody2D_ApplyForceToCenter(Entity._uuid, force, wakeUp); } - public float2 GetPosition() + /// + /// Gets or sets the global position of the rigidbody. + /// + public float2 Position { - ScriptGlue.RigidBody2D_GetPosition(Entity._uuid, out float2 position); + get + { + ScriptGlue.Rigidbody2D_GetPosition(Entity._uuid, out float2 position); - return position; + return position; + } + set => ScriptGlue.Rigidbody2D_SetPosition(Entity._uuid, value); + } + + /// + /// Gets or sets the global rotation of the rigidbody. + /// + public float Rotation + { + get + { + ScriptGlue.Rigidbody2D_GetRotation(Entity._uuid, out float rotation); + + return rotation; + } + set => ScriptGlue.Rigidbody2D_SetRotation(Entity._uuid, value); } } diff --git a/ScriptCore/ScriptGlue.cs b/ScriptCore/ScriptGlue.cs index 9bf4e21..c98175c 100644 --- a/ScriptCore/ScriptGlue.cs +++ b/ScriptCore/ScriptGlue.cs @@ -42,16 +42,22 @@ internal static class ScriptGlue #region RigidBody2D [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void RigidBody2D_ApplyForce(UUID entityId, in float2 force, float2 point, bool wakeUp); + internal static extern void Rigidbody2D_ApplyForce(UUID entityId, in float2 force, float2 point, bool wakeUp); [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void RigidBody2D_ApplyForceToCenter(UUID entityId, in float2 force, bool wakeUp); + internal static extern void Rigidbody2D_ApplyForceToCenter(UUID entityId, in float2 force, bool wakeUp); [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void RigidBody2D_SetPosition(UUID entityId, in float2 position); + internal static extern void Rigidbody2D_SetPosition(UUID entityId, in float2 position); [MethodImpl(MethodImplOptions.InternalCall)] - internal static extern void RigidBody2D_GetPosition(UUID entityId, out float2 position); + internal static extern void Rigidbody2D_GetPosition(UUID entityId, out float2 position); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern void Rigidbody2D_SetRotation(UUID entityId, in float rotation); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern void Rigidbody2D_GetRotation(UUID entityId, out float rotation); #endregion RigidBody2D