From bc535ddc26fec360de82a155cdb72df53995bdf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20L=C3=BCbe=C3=9F?= Date: Fri, 26 Jan 2024 12:51:29 +0100 Subject: [PATCH] Get/Set FixedRotation in play mode --- .../src/EditWindows/ComponentEditWindow.bf | 7 +++++-- GlitchyEngine/src/Scripting/ScriptGlue.bf | 14 ++++++++++++++ GlitchyEngine/src/World/Components/Components.bf | 16 +++++++++++++++- GlitchyEngine/src/World/SceneSerializer.bf | 4 +++- ScriptCore/Physics/Rigidbody2D.cs | 16 +++++++++++++++- ScriptCore/ScriptGlue.cs | 6 ++++++ 6 files changed, 58 insertions(+), 5 deletions(-) diff --git a/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf b/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf index aac9d8c..181dd90 100644 --- a/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf +++ b/GlitchyEditor/src/EditWindows/ComponentEditWindow.bf @@ -431,8 +431,11 @@ namespace GlitchyEditor.EditWindows ImGui.EndCombo(); } - - ImGui.Checkbox("Fixed Rotation", &rigidBodyComponent.FixedRotation); + bool isFixedRotation = rigidBodyComponent.FixedRotation; + if (ImGui.Checkbox("Fixed Rotation", &isFixedRotation)) + { + rigidBodyComponent.FixedRotation = isFixedRotation; + } } private static void ShowBoxCollider2DComponentEditor(Entity entity, BoxCollider2DComponent* boxCollider) diff --git a/GlitchyEngine/src/Scripting/ScriptGlue.bf b/GlitchyEngine/src/Scripting/ScriptGlue.bf index f5445e3..80d59f0 100644 --- a/GlitchyEngine/src/Scripting/ScriptGlue.bf +++ b/GlitchyEngine/src/Scripting/ScriptGlue.bf @@ -574,6 +574,20 @@ static class ScriptGlue rigidBody.SetAngularVelocity(velocity); } + [RegisterCall("ScriptGlue::Rigidbody2D_IsFixedRotation")] + static void Rigidbody2D_IsFixedRotation(UUID entityId, out bool isFixedRotation) + { + Rigidbody2DComponent* rigidBody = GetComponentSafe(entityId); + isFixedRotation = rigidBody.FixedRotation; + } + + [RegisterCall("ScriptGlue::Rigidbody2D_SetFixedRotation")] + static void Rigidbody2D_SetFixedRotation(UUID entityId, in bool isFixedRotation) + { + Rigidbody2DComponent* rigidBody = GetComponentSafe(entityId); + rigidBody.FixedRotation = isFixedRotation; + } + #endregion Rigidbody2D #region Camera diff --git a/GlitchyEngine/src/World/Components/Components.bf b/GlitchyEngine/src/World/Components/Components.bf index 703c5b0..6a1b1c0 100644 --- a/GlitchyEngine/src/World/Components/Components.bf +++ b/GlitchyEngine/src/World/Components/Components.bf @@ -353,7 +353,7 @@ namespace GlitchyEngine.World public BodyType BodyType = .Static; - public bool FixedRotation = false; + public bool _fixedRotation = false; private int _runtimeBody = 0; @@ -367,6 +367,20 @@ namespace GlitchyEngine.World [Inline] set mut => _runtimeBody = (int)(void*)value; } + + public bool FixedRotation + { + get => _fixedRotation; + set mut + { + _fixedRotation = value; + + if (RuntimeBody != null) + { + Box2D.Body.SetFixedRotation(RuntimeBody, _fixedRotation); + } + } + } /*public float LinearDamping { diff --git a/GlitchyEngine/src/World/SceneSerializer.bf b/GlitchyEngine/src/World/SceneSerializer.bf index cf31dee..65dc1e0 100644 --- a/GlitchyEngine/src/World/SceneSerializer.bf +++ b/GlitchyEngine/src/World/SceneSerializer.bf @@ -587,7 +587,9 @@ class SceneSerializer Deserialize.Value(reader, "BodyType", out component.BodyType); reader.EntryEnd(); - Deserialize.Value(reader, "FixedRotation", out component.FixedRotation); + bool fixedRotation = false; + Deserialize.Value(reader, "FixedRotation", out fixedRotation); + component.FixedRotation = fixedRotation; return .Ok; })); diff --git a/ScriptCore/Physics/Rigidbody2D.cs b/ScriptCore/Physics/Rigidbody2D.cs index 54a1358..6eb3203 100644 --- a/ScriptCore/Physics/Rigidbody2D.cs +++ b/ScriptCore/Physics/Rigidbody2D.cs @@ -75,7 +75,7 @@ public class Rigidbody2D : Component } /// - /// Gets or sets the angulara velocity of the rigidbody. + /// Gets or sets the angular velocity of the rigidbody. /// public float AngularVelocity { @@ -87,4 +87,18 @@ public class Rigidbody2D : Component } set => ScriptGlue.Rigidbody2D_SetAngularVelocity(_uuid, value); } + + /// + /// Gets or sets whether the rigidbody can rotate or not. + /// + public bool FixedRotation + { + get + { + ScriptGlue.Rigidbody2D_IsFixedRotation(_uuid, out bool isFixedRotation); + + return isFixedRotation; + } + set => ScriptGlue.Rigidbody2D_SetFixedRotation(_uuid, value); + } } diff --git a/ScriptCore/ScriptGlue.cs b/ScriptCore/ScriptGlue.cs index 5357f3e..cee7512 100644 --- a/ScriptCore/ScriptGlue.cs +++ b/ScriptCore/ScriptGlue.cs @@ -112,7 +112,13 @@ internal static class ScriptGlue [MethodImpl(MethodImplOptions.InternalCall)] internal static extern void Rigidbody2D_GetAngularVelocity(UUID entityId, out float velocity); + + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern void Rigidbody2D_IsFixedRotation(UUID entityId, out bool isFixedRotation); + [MethodImpl(MethodImplOptions.InternalCall)] + internal static extern void Rigidbody2D_SetFixedRotation(UUID entityId, in bool isFixedRotation); + #endregion RigidBody2D #region Camera