From 559ae007a9d5b5b487351a03164af41894ddfbc2 Mon Sep 17 00:00:00 2001 From: GON Date: Tue, 22 Feb 2022 18:43:35 +0900 Subject: [PATCH 1/2] fix: camera & transform --- Engine/Collection/DrawnCollection.cs | 18 ++++++++--------- Engine/Node/CameraNode.cs | 29 +++++++++++++++++----------- Engine/Node/TransformNode.cs | 4 ++-- 3 files changed, 29 insertions(+), 22 deletions(-) diff --git a/Engine/Collection/DrawnCollection.cs b/Engine/Collection/DrawnCollection.cs index 49d7a832..c206165b 100644 --- a/Engine/Collection/DrawnCollection.cs +++ b/Engine/Collection/DrawnCollection.cs @@ -29,7 +29,7 @@ internal void Register(IDrawn node) for (int i = 0; i < Engine.MaxCameraGroupCount; i++) { - var mask = 1u << i; + var mask = 1ul << i; if (!HasBit(node.CameraGroup, mask)) continue; var group = _Sorted[i]; @@ -49,7 +49,7 @@ internal void Unregister(IDrawn node) for (int i = 0; i < Engine.MaxCameraGroupCount; i++) { - var mask = 1u << i; + var mask = 1ul << i; if (!HasBit(node.CameraGroup, mask)) continue; var group = _Sorted[i]; @@ -63,7 +63,7 @@ internal void UpdateCameraGroup(IDrawn node, ulong old) for (int i = 0; i < Engine.MaxCameraGroupCount; i++) { - var mask = 1u << i; + var mask = 1ul << i; if (HasBit(old, mask) && !HasBit(node.CameraGroup, mask)) { @@ -99,7 +99,7 @@ internal void UpdateZOrder(IDrawn node, int old) for (int i = 0; i < Engine.MaxCameraGroupCount; i++) { - var mask = 1u << i; + var mask = 1ul << i; if (!HasBit(node.CameraGroup, mask)) continue; @@ -117,7 +117,7 @@ internal void UpdateZOrder(IDrawn node, int old) internal SortedDictionary> GetDrawns() => _Drawns; internal SortedDictionary> this[int cameraGroup] => _Sorted[cameraGroup]; - private bool HasBit(ulong value, uint mask) => (value & mask) != 0; + private bool HasBit(ulong value, ulong mask) => (value & mask) != 0; } internal class CameraNodeCollection @@ -138,7 +138,7 @@ internal void AddCamera(CameraNode node) { for (int i = 0; i < Engine.MaxCameraGroupCount; i++) { - var mask = 1u << i; + var mask = 1ul << i; if (HasBit(node.Group, mask)) { _Lists[i].Add(node); @@ -151,7 +151,7 @@ internal void RemoveCamera(CameraNode node) { for (int i = 0; i < Engine.MaxCameraGroupCount; i++) { - var mask = 1u << i; + var mask = 1ul << i; if (HasBit(node.Group, mask)) { _Lists[i].Remove(node); @@ -164,7 +164,7 @@ internal void UpdateGroup(CameraNode node, ulong oldGroup) { for (int i = 0; i < Engine.MaxCameraGroupCount; i++) { - var mask = 1u << i; + var mask = 1ul << i; if (HasBit(oldGroup, mask) && !HasBit(node.Group, mask)) { _Lists[i].Remove(node); @@ -178,6 +178,6 @@ internal void UpdateGroup(CameraNode node, ulong oldGroup) internal List this[int index] => _Lists[index]; - private bool HasBit(ulong value, uint mask) => (value & mask) != 0; + private bool HasBit(ulong value, ulong mask) => (value & mask) != 0; } } diff --git a/Engine/Node/CameraNode.cs b/Engine/Node/CameraNode.cs index 6794933c..f142e972 100644 --- a/Engine/Node/CameraNode.cs +++ b/Engine/Node/CameraNode.cs @@ -95,21 +95,28 @@ public RenderTexture TargetTexture internal override void Update() { - if (_RequireCalcTransform || _TargetSize != (TargetTexture?.Size ?? Engine.WindowSize)) + base.Update(); + + if (_TargetSize != (TargetTexture?.Size ?? Engine.WindowSize)) { - _TargetSize = (TargetTexture?.Size ?? Engine.WindowSize); + CalcTransform(); + } + } - RenderedCamera.ViewMatrix = - Matrix44F.GetTranslation2D(CenterPosition - _TargetSize / 2) - * Matrix44F.GetScale2D(new Vector2F(1f, 1f) / Scale) - * Matrix44F.GetRotationZ(MathHelper.DegreeToRadian(-Angle)) - * Matrix44F.GetTranslation2D(-Position); - // NOTE: DrawnNodeのTransformとは逆 + private protected override void CalcTransform() + { + _TargetSize = (TargetTexture?.Size ?? Engine.WindowSize); - _RequireCalcTransform = false; - } + RenderedCamera.ViewMatrix = + Matrix44F.GetTranslation2D(CenterPosition - _TargetSize / 2) + * Matrix44F.GetScale2D(new Vector2F(1f, 1f) / Scale) + * Matrix44F.GetRotationZ(MathHelper.DegreeToRadian(-Angle)) + * Matrix44F.GetTranslation2D(-Position); + // NOTE: DrawnNodeのTransformとは逆 - base.Update(); + _RequireCalcTransform = false; + + base.CalcTransform(); } #region Node diff --git a/Engine/Node/TransformNode.cs b/Engine/Node/TransformNode.cs index e094889e..11724769 100644 --- a/Engine/Node/TransformNode.cs +++ b/Engine/Node/TransformNode.cs @@ -179,10 +179,10 @@ internal override void Registered() internal override void Update() { + base.Update(); + if (_RequireCalcTransform || (Transfomer?.RequireCalcTransform ?? false)) UpdateTransform(); - - base.Update(); } /// From 050ad8e97d57e909796ff005fdf688c1be59f730 Mon Sep 17 00:00:00 2001 From: GON Date: Tue, 22 Feb 2022 18:43:45 +0900 Subject: [PATCH 2/2] add: camera test --- Test/Camera.cs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Test/Camera.cs b/Test/Camera.cs index eaddcad4..83ddfa1e 100644 --- a/Test/Camera.cs +++ b/Test/Camera.cs @@ -40,6 +40,36 @@ public void NoRenderTexture() tc.End(); } + [Test, Apartment(ApartmentState.STA)] + public void CameraGroup() + { + var tc = new TestCore(); + tc.Init(); + + var texture = Texture2D.Load(@"TestData/IO/AltseedPink.png"); + Assert.NotNull(texture); + + var node = new SpriteNode(); + node.Texture = texture; + node.CenterPosition = texture.Size / 2; + node.CameraGroup = 0b1L << 40; + Engine.AddNode(node); + + var camera = new CameraNode(); + camera.Position = new Vector2F(100, 0); + camera.Scale = new Vector2F(2, 2); + camera.Group = 0b1L << 40; + Engine.AddNode(camera); + + tc.LoopBody(c => + { + node.Angle++; + } + , null); + + tc.End(); + } + [Test, Apartment(ApartmentState.STA)] public void _RenderTexture() {