From 691c66c601cdd01d26ea60977b708e2bd7b7c00c Mon Sep 17 00:00:00 2001 From: Wullean Date: Thu, 18 May 2023 14:28:28 +0200 Subject: [PATCH 01/19] Fix Scene.Write() --- zzio/scn/Scene.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zzio/scn/Scene.cs b/zzio/scn/Scene.cs index 42e4b056..c589dedb 100644 --- a/zzio/scn/Scene.cs +++ b/zzio/scn/Scene.cs @@ -147,4 +147,4 @@ public void Write(Stream stream) } } } -} \ No newline at end of file +} From 7092c7cbd719c492d155df4d1c0b883cbd122c4c Mon Sep 17 00:00:00 2001 From: Wullean Date: Fri, 12 May 2023 21:28:52 +0200 Subject: [PATCH 02/19] Add save button to scene editor --- zzre/tools/sceneeditor/SceneEditor.FOModel.cs | 13 ++++++++++ zzre/tools/sceneeditor/SceneEditor.Trigger.cs | 12 ++++++++++ zzre/tools/sceneeditor/SceneEditor.cs | 24 ++++++++++++++++--- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/zzre/tools/sceneeditor/SceneEditor.FOModel.cs b/zzre/tools/sceneeditor/SceneEditor.FOModel.cs index 792d83a0..df62e767 100644 --- a/zzre/tools/sceneeditor/SceneEditor.FOModel.cs +++ b/zzre/tools/sceneeditor/SceneEditor.FOModel.cs @@ -34,6 +34,12 @@ private sealed class FOModel : BaseDisposable, ISelectable public IRaycastable RenderedBounds => SelectableBounds; public float ViewSize => mesh.BoundingBox.MaxSizeComponent; + public void SyncWithScene() + { + SceneFOModel.pos = Location.LocalPosition; + //SceneFOModel.rot = Location.LocalRotation.ToEuler(); + } + public FOModel(ITagContainer diContainer, zzio.scn.FOModel sceneModel) { this.diContainer = diContainer; @@ -143,6 +149,7 @@ public void Content() Location.LocalRotation *= Quaternion.CreateFromYawPitchRoll(rotEuler.Y, rotEuler.X, rotEuler.Z); diContainer.GetTag().IsDirty = true; } + } } @@ -174,6 +181,12 @@ public FOModelComponent(ITagContainer diContainer) editor.editor.AddInfoSection("FOModels", HandleInfoSection, false); } + public void SyncWithScene() + { + foreach(var foModel in models) + foModel.SyncWithScene(); + } + protected override void DisposeManaged() { base.DisposeManaged(); diff --git a/zzre/tools/sceneeditor/SceneEditor.Trigger.cs b/zzre/tools/sceneeditor/SceneEditor.Trigger.cs index f60f8e86..bb3f0e97 100644 --- a/zzre/tools/sceneeditor/SceneEditor.Trigger.cs +++ b/zzre/tools/sceneeditor/SceneEditor.Trigger.cs @@ -77,6 +77,12 @@ public void Content() break; } } + + public void SyncWithScene() + { + //Console.WriteLine(Location.LocalPosition.ToString()); + SceneTrigger.pos = Location.LocalPosition; + } } private sealed class TriggerComponent : BaseDisposable, IEnumerable @@ -112,6 +118,12 @@ public TriggerComponent(ITagContainer diContainer) iconRenderer.Material.MainSampler.Sampler = iconFont.Sampler; HandleResize(); } + public void SyncWithScene() + { + //Console.WriteLine("bruh"); + foreach(var trigger in triggers) + trigger.SyncWithScene(); + } protected override void DisposeManaged() { diff --git a/zzre/tools/sceneeditor/SceneEditor.cs b/zzre/tools/sceneeditor/SceneEditor.cs index 738f75fc..10a017f0 100644 --- a/zzre/tools/sceneeditor/SceneEditor.cs +++ b/zzre/tools/sceneeditor/SceneEditor.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Numerics; using Veldrid; @@ -23,6 +23,10 @@ public partial class SceneEditor : ListDisposable, IDocumentEditor private readonly AssetLocalRegistry assetRegistry; private readonly DefaultEcs.World ecsWorld; + private TriggerComponent triggerComponent; + + private FOModelComponent foModelComponent; + private event Action OnLoadScene = () => { }; private readonly ITagContainer localDiContainer; @@ -46,6 +50,7 @@ public SceneEditor(ITagContainer diContainer) AddDisposable(locationBuffer); var menuBar = new MenuBarWindowTag(Window); menuBar.AddButton("Open", HandleMenuOpen); + menuBar.AddButton("Save", SaveScene); openFileModal = new OpenFileModal(diContainer) { Filter = "*.scn", @@ -81,8 +86,8 @@ public SceneEditor(ITagContainer diContainer) new DatasetComponent(localDiContainer); new WorldComponent(localDiContainer); new ModelComponent(localDiContainer); - new FOModelComponent(localDiContainer); - new TriggerComponent(localDiContainer); + foModelComponent = new FOModelComponent(localDiContainer); + triggerComponent = new TriggerComponent(localDiContainer); new LightComponent(localDiContainer); new EffectComponent(localDiContainer); new Sample3DComponent(localDiContainer); @@ -133,4 +138,17 @@ private void HandleMenuOpen() openFileModal.InitialSelectedResource = CurrentResource; openFileModal.Modal.Open(); } + private void SaveScene() + { + if(CurrentResource == null || scene == null) + return; + + File.Copy(CurrentResource.Path.Absolute.ToString(), CurrentResource.Path.Absolute.ToString()+"backup", true); + + triggerComponent.SyncWithScene(); + foModelComponent.SyncWithScene(); + + var stream = new FileStream(CurrentResource.Path.Absolute.ToString(), FileMode.Create); + scene.Write(stream); + } } From 6e08c1c3fb12e58e9b85b829439df94b257acd11 Mon Sep 17 00:00:00 2001 From: Wullean Date: Sat, 13 May 2023 21:10:53 +0200 Subject: [PATCH 03/19] Cleanups --- zzre/tools/sceneeditor/SceneEditor.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/zzre/tools/sceneeditor/SceneEditor.cs b/zzre/tools/sceneeditor/SceneEditor.cs index 10a017f0..120dd524 100644 --- a/zzre/tools/sceneeditor/SceneEditor.cs +++ b/zzre/tools/sceneeditor/SceneEditor.cs @@ -24,7 +24,7 @@ public partial class SceneEditor : ListDisposable, IDocumentEditor private readonly DefaultEcs.World ecsWorld; private TriggerComponent triggerComponent; - + private FOModelComponent foModelComponent; private event Action OnLoadScene = () => { }; @@ -86,13 +86,13 @@ public SceneEditor(ITagContainer diContainer) new DatasetComponent(localDiContainer); new WorldComponent(localDiContainer); new ModelComponent(localDiContainer); - foModelComponent = new FOModelComponent(localDiContainer); - triggerComponent = new TriggerComponent(localDiContainer); new LightComponent(localDiContainer); new EffectComponent(localDiContainer); new Sample3DComponent(localDiContainer); new WaypointComponent(localDiContainer); new SelectionComponent(localDiContainer); + foModelComponent = new FOModelComponent(localDiContainer); + triggerComponent = new TriggerComponent(localDiContainer, menuBar); diContainer.GetTag().AddEditor(this); } @@ -140,10 +140,10 @@ private void HandleMenuOpen() } private void SaveScene() { - if(CurrentResource == null || scene == null) + if (CurrentResource == null || scene == null) return; - File.Copy(CurrentResource.Path.Absolute.ToString(), CurrentResource.Path.Absolute.ToString()+"backup", true); + File.Copy(CurrentResource.Path.Absolute.ToString(), CurrentResource.Path.Absolute.ToString() + "backup", true); triggerComponent.SyncWithScene(); foModelComponent.SyncWithScene(); From 7bfb01743129feb5d47156d9c6fcab0c46062aa4 Mon Sep 17 00:00:00 2001 From: Wullean Date: Sat, 13 May 2023 21:16:19 +0200 Subject: [PATCH 04/19] Add button for duplicating triggers --- zzio/scn/Trigger.cs | 4 ++ zzre/tools/sceneeditor/SceneEditor.FOModel.cs | 2 - zzre/tools/sceneeditor/SceneEditor.Trigger.cs | 39 +++++++++++++++++-- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/zzio/scn/Trigger.cs b/zzio/scn/Trigger.cs index 6ec0df7c..3dd928c0 100644 --- a/zzio/scn/Trigger.cs +++ b/zzio/scn/Trigger.cs @@ -82,4 +82,8 @@ public void Write(Stream stream) break; } } + public Trigger Clone() + { + return (Trigger)this.MemberwiseClone(); + } } diff --git a/zzre/tools/sceneeditor/SceneEditor.FOModel.cs b/zzre/tools/sceneeditor/SceneEditor.FOModel.cs index df62e767..fbb9905e 100644 --- a/zzre/tools/sceneeditor/SceneEditor.FOModel.cs +++ b/zzre/tools/sceneeditor/SceneEditor.FOModel.cs @@ -37,7 +37,6 @@ private sealed class FOModel : BaseDisposable, ISelectable public void SyncWithScene() { SceneFOModel.pos = Location.LocalPosition; - //SceneFOModel.rot = Location.LocalRotation.ToEuler(); } public FOModel(ITagContainer diContainer, zzio.scn.FOModel sceneModel) @@ -149,7 +148,6 @@ public void Content() Location.LocalRotation *= Quaternion.CreateFromYawPitchRoll(rotEuler.Y, rotEuler.X, rotEuler.Z); diContainer.GetTag().IsDirty = true; } - } } diff --git a/zzre/tools/sceneeditor/SceneEditor.Trigger.cs b/zzre/tools/sceneeditor/SceneEditor.Trigger.cs index bb3f0e97..4eba1338 100644 --- a/zzre/tools/sceneeditor/SceneEditor.Trigger.cs +++ b/zzre/tools/sceneeditor/SceneEditor.Trigger.cs @@ -80,7 +80,6 @@ public void Content() public void SyncWithScene() { - //Console.WriteLine(Location.LocalPosition.ToString()); SceneTrigger.pos = Location.LocalPosition; } } @@ -98,7 +97,7 @@ private sealed class TriggerComponent : BaseDisposable, IEnumerable private bool wasSelected; private float iconSize = 128f; - public TriggerComponent(ITagContainer diContainer) + public TriggerComponent(ITagContainer diContainer, MenuBar menuBar) { diContainer.AddTag(this); editor = diContainer.GetTag(); @@ -117,11 +116,12 @@ public TriggerComponent(ITagContainer diContainer) iconRenderer.Material.MainTexture.Texture = iconFont.Texture; iconRenderer.Material.MainSampler.Sampler = iconFont.Sampler; HandleResize(); + + menuBar.AddButton("Duplicate Trigger", DuplicateCurrentTrigger); } public void SyncWithScene() { - //Console.WriteLine("bruh"); - foreach(var trigger in triggers) + foreach (var trigger in triggers) trigger.SyncWithScene(); } @@ -133,6 +133,37 @@ protected override void DisposeManaged() trigger.Dispose(); } + private void DuplicateCurrentTrigger() + { + var currentTrigger = FindCurrentTrigger(); + if (currentTrigger == null || editor.scene == null) + return; + SyncWithScene(); + + var copy = currentTrigger.SceneTrigger.Clone(); + copy.idx = GetNextAvailableTriggerID(); + editor.scene.triggers = editor.scene.triggers.Append(copy).ToArray(); + HandleLoadScene(); + editor.Selected = triggers.Last(); + } + private uint GetNextAvailableTriggerID() + { + uint result = 1; + foreach (var trigger in triggers) + { + result = Math.Max(result, trigger.SceneTrigger.idx); + } + return result + 1; + } + private Trigger? FindCurrentTrigger() + { + foreach (var trigger in triggers) + { + if (trigger == editor.Selected) + return trigger; + } + return null; + } private void HandleLoadScene() { foreach (var oldTrigger in triggers) From 917c2b113b7de96f09aae5804b79c5a674eb85f4 Mon Sep 17 00:00:00 2001 From: Wullean Date: Sat, 13 May 2023 21:46:12 +0200 Subject: [PATCH 05/19] Add button for deleting triggers --- zzre/tools/sceneeditor/SceneEditor.Trigger.cs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/zzre/tools/sceneeditor/SceneEditor.Trigger.cs b/zzre/tools/sceneeditor/SceneEditor.Trigger.cs index 4eba1338..bc9f94e6 100644 --- a/zzre/tools/sceneeditor/SceneEditor.Trigger.cs +++ b/zzre/tools/sceneeditor/SceneEditor.Trigger.cs @@ -118,6 +118,7 @@ public TriggerComponent(ITagContainer diContainer, MenuBar menuBar) HandleResize(); menuBar.AddButton("Duplicate Trigger", DuplicateCurrentTrigger); + menuBar.AddButton("Delete Trigger", DeleteCurrentTrigger); } public void SyncWithScene() { @@ -138,6 +139,7 @@ private void DuplicateCurrentTrigger() var currentTrigger = FindCurrentTrigger(); if (currentTrigger == null || editor.scene == null) return; + SyncWithScene(); var copy = currentTrigger.SceneTrigger.Clone(); @@ -146,6 +148,21 @@ private void DuplicateCurrentTrigger() HandleLoadScene(); editor.Selected = triggers.Last(); } + private void DeleteCurrentTrigger() + { + var currentTrigger = FindCurrentTrigger(); + if (currentTrigger == null || editor.scene == null) + return; + + SyncWithScene(); + + editor.scene.triggers = editor.scene.triggers.Where( + trigger => trigger.idx != currentTrigger.SceneTrigger.idx + ).ToArray(); + + HandleLoadScene(); + editor.Selected = null; + } private uint GetNextAvailableTriggerID() { uint result = 1; From b306776daabd797c8038bb0d635897e9bc5da3b4 Mon Sep 17 00:00:00 2001 From: Wullean Date: Sat, 13 May 2023 22:06:17 +0200 Subject: [PATCH 06/19] Move trigger edit buttons to scene editor --- zzre/tools/sceneeditor/SceneEditor.Trigger.cs | 9 +++------ zzre/tools/sceneeditor/SceneEditor.cs | 11 +++++++++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/zzre/tools/sceneeditor/SceneEditor.Trigger.cs b/zzre/tools/sceneeditor/SceneEditor.Trigger.cs index bc9f94e6..a21a480e 100644 --- a/zzre/tools/sceneeditor/SceneEditor.Trigger.cs +++ b/zzre/tools/sceneeditor/SceneEditor.Trigger.cs @@ -97,7 +97,7 @@ private sealed class TriggerComponent : BaseDisposable, IEnumerable private bool wasSelected; private float iconSize = 128f; - public TriggerComponent(ITagContainer diContainer, MenuBar menuBar) + public TriggerComponent(ITagContainer diContainer) { diContainer.AddTag(this); editor = diContainer.GetTag(); @@ -116,9 +116,6 @@ public TriggerComponent(ITagContainer diContainer, MenuBar menuBar) iconRenderer.Material.MainTexture.Texture = iconFont.Texture; iconRenderer.Material.MainSampler.Sampler = iconFont.Sampler; HandleResize(); - - menuBar.AddButton("Duplicate Trigger", DuplicateCurrentTrigger); - menuBar.AddButton("Delete Trigger", DeleteCurrentTrigger); } public void SyncWithScene() { @@ -134,7 +131,7 @@ protected override void DisposeManaged() trigger.Dispose(); } - private void DuplicateCurrentTrigger() + public void DuplicateCurrentTrigger() { var currentTrigger = FindCurrentTrigger(); if (currentTrigger == null || editor.scene == null) @@ -148,7 +145,7 @@ private void DuplicateCurrentTrigger() HandleLoadScene(); editor.Selected = triggers.Last(); } - private void DeleteCurrentTrigger() + public void DeleteCurrentTrigger() { var currentTrigger = FindCurrentTrigger(); if (currentTrigger == null || editor.scene == null) diff --git a/zzre/tools/sceneeditor/SceneEditor.cs b/zzre/tools/sceneeditor/SceneEditor.cs index 120dd524..f41d8795 100644 --- a/zzre/tools/sceneeditor/SceneEditor.cs +++ b/zzre/tools/sceneeditor/SceneEditor.cs @@ -51,6 +51,8 @@ public SceneEditor(ITagContainer diContainer) var menuBar = new MenuBarWindowTag(Window); menuBar.AddButton("Open", HandleMenuOpen); menuBar.AddButton("Save", SaveScene); + menuBar.AddButton("Duplicate Selection", DuplicateCurrentSelection); + menuBar.AddButton("Delete Selection", DeleteCurrentSelection); openFileModal = new OpenFileModal(diContainer) { Filter = "*.scn", @@ -103,6 +105,14 @@ protected override void DisposeManaged() assetRegistry.Dispose(); } + private void DuplicateCurrentSelection() + { + triggerComponent.DuplicateCurrentTrigger(); + } + private void DeleteCurrentSelection() + { + triggerComponent.DeleteCurrentTrigger(); + } public void Load(string pathText) { var resource = resourcePool.FindFile(pathText) ?? throw new FileNotFoundException($"Could not find world at {pathText}"); @@ -151,4 +161,5 @@ private void SaveScene() var stream = new FileStream(CurrentResource.Path.Absolute.ToString(), FileMode.Create); scene.Write(stream); } + } From 524741af8abfe1a54a980dd2fa2d19a6166ad9ec Mon Sep 17 00:00:00 2001 From: Wullean Date: Sat, 13 May 2023 22:45:48 +0200 Subject: [PATCH 07/19] Implement fomodel duplication and deletion --- zzio/scn/FOModel.cs | 4 ++ zzre/tools/sceneeditor/SceneEditor.FOModel.cs | 49 ++++++++++++++++++- zzre/tools/sceneeditor/SceneEditor.cs | 4 +- 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/zzio/scn/FOModel.cs b/zzio/scn/FOModel.cs index 8b290657..eea75bdb 100644 --- a/zzio/scn/FOModel.cs +++ b/zzio/scn/FOModel.cs @@ -72,4 +72,8 @@ public void Write(Stream stream) writer.Write(useCachedModels); writer.Write(wiggleAmpl); } + public FOModel Clone() + { + return (FOModel)this.MemberwiseClone(); + } } diff --git a/zzre/tools/sceneeditor/SceneEditor.FOModel.cs b/zzre/tools/sceneeditor/SceneEditor.FOModel.cs index fbb9905e..2f4342e5 100644 --- a/zzre/tools/sceneeditor/SceneEditor.FOModel.cs +++ b/zzre/tools/sceneeditor/SceneEditor.FOModel.cs @@ -181,7 +181,7 @@ public FOModelComponent(ITagContainer diContainer) public void SyncWithScene() { - foreach(var foModel in models) + foreach (var foModel in models) foModel.SyncWithScene(); } @@ -232,7 +232,54 @@ private void HandleInfoSection() TreePop(); } } + private FOModel? FindCurrentFoModel() + { + foreach (var foModel in models) + { + if (foModel == editor.Selected) + return foModel; + } + return null; + } + private uint GetNextAvailableFoModelID() + { + uint result = 1; + foreach (var foModel in models) + { + result = Math.Max(result, foModel.SceneFOModel.idx); + } + return result + 1; + } + public void DeleteCurrentFoModel() + { + var currentFoModel = FindCurrentFoModel(); + if (currentFoModel == null || editor.scene == null) + return; + SyncWithScene(); + + + editor.scene.foModels = editor.scene.foModels.Where( + model => model.idx != currentFoModel.SceneFOModel.idx + ).ToArray(); + + HandleLoadScene(); + editor.Selected = null; + } + public void DuplicateCurrentFoModel() + { + var currentFoModel = FindCurrentFoModel(); + if (currentFoModel == null || editor.scene == null) + return; + + SyncWithScene(); + + var copy = currentFoModel.SceneFOModel.Clone(); + copy.idx = GetNextAvailableFoModelID(); + editor.scene.foModels = editor.scene.foModels.Append(copy).ToArray(); + HandleLoadScene(); + editor.Selected = models.Last(); + } IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable)models).GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() => models.Cast().GetEnumerator(); } diff --git a/zzre/tools/sceneeditor/SceneEditor.cs b/zzre/tools/sceneeditor/SceneEditor.cs index f41d8795..1fde1707 100644 --- a/zzre/tools/sceneeditor/SceneEditor.cs +++ b/zzre/tools/sceneeditor/SceneEditor.cs @@ -108,10 +108,13 @@ protected override void DisposeManaged() private void DuplicateCurrentSelection() { triggerComponent.DuplicateCurrentTrigger(); + foModelComponent.DuplicateCurrentFoModel(); + } private void DeleteCurrentSelection() { triggerComponent.DeleteCurrentTrigger(); + foModelComponent.DeleteCurrentFoModel(); } public void Load(string pathText) { @@ -161,5 +164,4 @@ private void SaveScene() var stream = new FileStream(CurrentResource.Path.Absolute.ToString(), FileMode.Create); scene.Write(stream); } - } From 47c863d92b32450c9436739aa35bbf924e3ed32b Mon Sep 17 00:00:00 2001 From: Wullean Date: Sat, 13 May 2023 23:59:12 +0200 Subject: [PATCH 08/19] Add shortcuts for saving, deleting and duplicating --- zzre/tools/sceneeditor/SceneEditor.cs | 34 ++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/zzre/tools/sceneeditor/SceneEditor.cs b/zzre/tools/sceneeditor/SceneEditor.cs index 1fde1707..9d7e43ba 100644 --- a/zzre/tools/sceneeditor/SceneEditor.cs +++ b/zzre/tools/sceneeditor/SceneEditor.cs @@ -35,6 +35,8 @@ public partial class SceneEditor : ListDisposable, IDocumentEditor public IResource? CurrentResource { get; private set; } public Window Window { get; } + private bool ControlIsPressed = false; + public SceneEditor(ITagContainer diContainer) { resourcePool = diContainer.GetTag(); @@ -94,7 +96,10 @@ public SceneEditor(ITagContainer diContainer) new WaypointComponent(localDiContainer); new SelectionComponent(localDiContainer); foModelComponent = new FOModelComponent(localDiContainer); - triggerComponent = new TriggerComponent(localDiContainer, menuBar); + triggerComponent = new TriggerComponent(localDiContainer); + Window.OnKeyUp += HandleKeyUp; + Window.OnKeyDown += HandleKeyDown; + Window.OnContent += HandleOnContent; diContainer.GetTag().AddEditor(this); } @@ -105,6 +110,32 @@ protected override void DisposeManaged() assetRegistry.Dispose(); } + private void HandleKeyDown(Key key) + { + if (key == Key.ControlLeft) + ControlIsPressed = true; + } + private void HandleKeyUp(Key key) + { + if (key == Key.ControlLeft) + ControlIsPressed = false; + else if (ControlIsPressed) + { + if (key == Key.D) + DuplicateCurrentSelection(); + else if (key == Key.S) + SaveScene(); + else if (key == Key.X) + DeleteCurrentSelection(); + } + } + private void HandleOnContent() + { + if (Window.IsFocused == false) + { + ControlIsPressed = false; + } + } private void DuplicateCurrentSelection() { triggerComponent.DuplicateCurrentTrigger(); @@ -164,4 +195,5 @@ private void SaveScene() var stream = new FileStream(CurrentResource.Path.Absolute.ToString(), FileMode.Create); scene.Write(stream); } + } From d1db80b6b948971612fe8fb5faf210805824902b Mon Sep 17 00:00:00 2001 From: Wullean Date: Tue, 16 May 2023 21:53:08 +0200 Subject: [PATCH 09/19] Make paths relative to zanzarah system directory --- zzre/tools/sceneeditor/SceneEditor.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/zzre/tools/sceneeditor/SceneEditor.cs b/zzre/tools/sceneeditor/SceneEditor.cs index 9d7e43ba..a77a70ba 100644 --- a/zzre/tools/sceneeditor/SceneEditor.cs +++ b/zzre/tools/sceneeditor/SceneEditor.cs @@ -186,13 +186,11 @@ private void SaveScene() { if (CurrentResource == null || scene == null) return; - - File.Copy(CurrentResource.Path.Absolute.ToString(), CurrentResource.Path.Absolute.ToString() + "backup", true); - triggerComponent.SyncWithScene(); foModelComponent.SyncWithScene(); + var path = Path.Combine(Environment.CurrentDirectory, "..", CurrentResource.Path.ToString()); - var stream = new FileStream(CurrentResource.Path.Absolute.ToString(), FileMode.Create); + var stream = new FileStream(path, FileMode.Create); scene.Write(stream); } From 3105a7543975c44cb826b29f527779a1e85d111b Mon Sep 17 00:00:00 2001 From: Wullean Date: Wed, 17 May 2023 23:01:05 +0200 Subject: [PATCH 10/19] Ignore unsupported fomodels --- zzre/tools/sceneeditor/SceneEditor.FOModel.cs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/zzre/tools/sceneeditor/SceneEditor.FOModel.cs b/zzre/tools/sceneeditor/SceneEditor.FOModel.cs index 2f4342e5..7aa32db1 100644 --- a/zzre/tools/sceneeditor/SceneEditor.FOModel.cs +++ b/zzre/tools/sceneeditor/SceneEditor.FOModel.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Numerics; using Veldrid; @@ -200,7 +201,19 @@ private void HandleLoadScene() if (editor.scene == null) return; - models = editor.scene.foModels.Select(m => new FOModel(diContainer, m)).ToArray(); + var list = new List(); + foreach (var m in editor.scene.foModels) + { + try + { + list.Add(new FOModel(diContainer, m)); + } + catch (InvalidDataException e) + { + Console.Error.WriteLine("Fail to load FOModel with ID {0}, ignoring file {1}", m.idx, m.filename); + } + } + models = list.ToArray(); } private void HandleRender(CommandList cl) From c9c9dfbd7f5963b3446ba53ff0596bbeae1ef548 Mon Sep 17 00:00:00 2001 From: Helco Date: Thu, 19 Oct 2023 11:15:49 +0200 Subject: [PATCH 11/19] Update release.yml --- .github/workflows/release.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d313053e..782b12a8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -39,7 +39,10 @@ jobs: with: dotnet-version: 8.0.x - name: Build local dependencies - run: bash zzio/get-dependencies.sh + run: | + cd zzio + bash ./get-dependencies.sh + cd .. - name: Install remote dependencies run: dotnet restore zzio/zzio.sln -r ${{ matrix.target }} -p:NoWarn=NU1605 - name: Build From 309ac4e52c88472aca6d2f01db95e8f8a181eb31 Mon Sep 17 00:00:00 2001 From: AcipenserSturio Date: Fri, 12 Jul 2024 16:07:19 +0500 Subject: [PATCH 12/19] Update branch to use Silk.NET.SDL.KeyCode --- zzre/tools/sceneeditor/SceneEditor.cs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/zzre/tools/sceneeditor/SceneEditor.cs b/zzre/tools/sceneeditor/SceneEditor.cs index a77a70ba..928d9788 100644 --- a/zzre/tools/sceneeditor/SceneEditor.cs +++ b/zzre/tools/sceneeditor/SceneEditor.cs @@ -8,6 +8,8 @@ using zzre.materials; using zzre.rendering; +using KeyCode = Silk.NET.SDL.KeyCode; + namespace zzre.tools; public partial class SceneEditor : ListDisposable, IDocumentEditor @@ -110,22 +112,22 @@ protected override void DisposeManaged() assetRegistry.Dispose(); } - private void HandleKeyDown(Key key) + private void HandleKeyDown(KeyCode key) { - if (key == Key.ControlLeft) + if (key == KeyCode.KLctrl) ControlIsPressed = true; } - private void HandleKeyUp(Key key) + private void HandleKeyUp(KeyCode key) { - if (key == Key.ControlLeft) + if (key == KeyCode.KLctrl) ControlIsPressed = false; else if (ControlIsPressed) { - if (key == Key.D) + if (key == KeyCode.KD) DuplicateCurrentSelection(); - else if (key == Key.S) + else if (key == KeyCode.KS) SaveScene(); - else if (key == Key.X) + else if (key == KeyCode.KX) DeleteCurrentSelection(); } } From 5c9076e0379142f8a5c4b5fccc43bcfcdc3f93f1 Mon Sep 17 00:00:00 2001 From: AcipenserSturio Date: Fri, 12 Jul 2024 16:52:51 +0500 Subject: [PATCH 13/19] Fix Scene.Write() --- zzio/scn/Scene.cs | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/zzio/scn/Scene.cs b/zzio/scn/Scene.cs index c589dedb..e8a394bc 100644 --- a/zzio/scn/Scene.cs +++ b/zzio/scn/Scene.cs @@ -115,6 +115,11 @@ public void Write(Stream stream) writer.WriteZString("[Scenefile]"); writeSingle(writer, version, "[Version]"); writeSingle(writer, misc, "[Misc]"); + if (backdropFile.Length > 0) + { + writer.WriteZString("[Backdrop]"); + writer.WriteZString(backdropFile); + } writeArray(writer, lights, "[Lights]"); writeArray(writer, foModels, "[FOModels_v4]"); writeArray(writer, models, "[Models_v3]"); @@ -136,13 +141,6 @@ public void Write(Stream stream) writer.Write(sceneOrigin); writeArray(writer, textureProperties, "[TextureProperties]"); writeSingle(writer, waypointSystem, "[WaypointSystem]"); - - if (backdropFile.Length > 0) - { - writer.WriteZString("[Backdrop]"); - writer.WriteZString(backdropFile); - } - writeArray(writer, effects, "[Effects]"); writer.WriteZString("[EOS]"); } } From e4f659f197f766811c706c99f0803212c05369f1 Mon Sep 17 00:00:00 2001 From: AcipenserSturio Date: Fri, 12 Jul 2024 17:50:26 +0500 Subject: [PATCH 14/19] Fix style in SceneEditor --- zzre/tools/sceneeditor/SceneEditor.FOModel.cs | 6 +++--- zzre/tools/sceneeditor/SceneEditor.Trigger.cs | 2 +- zzre/tools/sceneeditor/SceneEditor.cs | 7 +++---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/zzre/tools/sceneeditor/SceneEditor.FOModel.cs b/zzre/tools/sceneeditor/SceneEditor.FOModel.cs index 7aa32db1..76d8f24e 100644 --- a/zzre/tools/sceneeditor/SceneEditor.FOModel.cs +++ b/zzre/tools/sceneeditor/SceneEditor.FOModel.cs @@ -208,12 +208,12 @@ private void HandleLoadScene() { list.Add(new FOModel(diContainer, m)); } - catch (InvalidDataException e) + catch (InvalidDataException) { Console.Error.WriteLine("Fail to load FOModel with ID {0}, ignoring file {1}", m.idx, m.filename); } } - models = list.ToArray(); + models = [.. list]; } private void HandleRender(CommandList cl) @@ -289,7 +289,7 @@ public void DuplicateCurrentFoModel() var copy = currentFoModel.SceneFOModel.Clone(); copy.idx = GetNextAvailableFoModelID(); - editor.scene.foModels = editor.scene.foModels.Append(copy).ToArray(); + editor.scene.foModels = [.. editor.scene.foModels, copy]; HandleLoadScene(); editor.Selected = models.Last(); } diff --git a/zzre/tools/sceneeditor/SceneEditor.Trigger.cs b/zzre/tools/sceneeditor/SceneEditor.Trigger.cs index a21a480e..3b366432 100644 --- a/zzre/tools/sceneeditor/SceneEditor.Trigger.cs +++ b/zzre/tools/sceneeditor/SceneEditor.Trigger.cs @@ -141,7 +141,7 @@ public void DuplicateCurrentTrigger() var copy = currentTrigger.SceneTrigger.Clone(); copy.idx = GetNextAvailableTriggerID(); - editor.scene.triggers = editor.scene.triggers.Append(copy).ToArray(); + editor.scene.triggers = [.. editor.scene.triggers, copy]; HandleLoadScene(); editor.Selected = triggers.Last(); } diff --git a/zzre/tools/sceneeditor/SceneEditor.cs b/zzre/tools/sceneeditor/SceneEditor.cs index 928d9788..210eb362 100644 --- a/zzre/tools/sceneeditor/SceneEditor.cs +++ b/zzre/tools/sceneeditor/SceneEditor.cs @@ -25,9 +25,8 @@ public partial class SceneEditor : ListDisposable, IDocumentEditor private readonly AssetLocalRegistry assetRegistry; private readonly DefaultEcs.World ecsWorld; - private TriggerComponent triggerComponent; - - private FOModelComponent foModelComponent; + private readonly TriggerComponent triggerComponent; + private readonly FOModelComponent foModelComponent; private event Action OnLoadScene = () => { }; @@ -37,7 +36,7 @@ public partial class SceneEditor : ListDisposable, IDocumentEditor public IResource? CurrentResource { get; private set; } public Window Window { get; } - private bool ControlIsPressed = false; + private bool ControlIsPressed; public SceneEditor(ITagContainer diContainer) { From ca2e4aba930164cf620cd952dfb6f6aaa8a5282b Mon Sep 17 00:00:00 2001 From: AcipenserSturio Date: Sat, 13 Jul 2024 13:41:16 +0500 Subject: [PATCH 15/19] Reset column width on scene load --- zzre/imgui/TwoColumnEditorTag.cs | 2 ++ zzre/tools/sceneeditor/SceneEditor.cs | 1 + 2 files changed, 3 insertions(+) diff --git a/zzre/imgui/TwoColumnEditorTag.cs b/zzre/imgui/TwoColumnEditorTag.cs index 80e50cef..a786ddc5 100644 --- a/zzre/imgui/TwoColumnEditorTag.cs +++ b/zzre/imgui/TwoColumnEditorTag.cs @@ -37,6 +37,8 @@ public void AddInfoSection(string name, Action content, bool defaultOpen = true, public void ClearInfoSections() => infoSections.Clear(); + public void ResetColumnWidth() => didSetColumnWidth = 0; + private void HandleContent() { ImGui.Columns(2, null, true); diff --git a/zzre/tools/sceneeditor/SceneEditor.cs b/zzre/tools/sceneeditor/SceneEditor.cs index 210eb362..567ecb62 100644 --- a/zzre/tools/sceneeditor/SceneEditor.cs +++ b/zzre/tools/sceneeditor/SceneEditor.cs @@ -174,6 +174,7 @@ private void LoadSceneNow(IResource resource) ecsWorld.Publish(new game.messages.SceneLoaded(scene, Savegame: null!)); OnLoadScene(); assetRegistry.ApplyAssets(); + editor.ResetColumnWidth(); } private void HandleResize() => camera.Aspect = fbArea.Ratio; From 50bc52c377d5ed5c6a676d0538ed551821d1b335 Mon Sep 17 00:00:00 2001 From: AcipenserSturio Date: Sat, 13 Jul 2024 14:58:19 +0500 Subject: [PATCH 16/19] Increase icon size --- zzre/tools/sceneeditor/SceneEditor.Trigger.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zzre/tools/sceneeditor/SceneEditor.Trigger.cs b/zzre/tools/sceneeditor/SceneEditor.Trigger.cs index 3b366432..380829ef 100644 --- a/zzre/tools/sceneeditor/SceneEditor.Trigger.cs +++ b/zzre/tools/sceneeditor/SceneEditor.Trigger.cs @@ -95,7 +95,7 @@ private sealed class TriggerComponent : BaseDisposable, IEnumerable private Trigger[] triggers = []; private bool wasSelected; - private float iconSize = 128f; + private float iconSize = 256f; public TriggerComponent(ITagContainer diContainer) { From a8bf464b03c90dc959c2747a3bd2914f25dd2c87 Mon Sep 17 00:00:00 2001 From: AcipenserSturio Date: Sat, 13 Jul 2024 16:33:51 +0500 Subject: [PATCH 17/19] Fix object re-selection on drag release --- zzre/tools/sceneeditor/SceneEditor.ISelectable.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/zzre/tools/sceneeditor/SceneEditor.ISelectable.cs b/zzre/tools/sceneeditor/SceneEditor.ISelectable.cs index 6390fb12..28359ba6 100644 --- a/zzre/tools/sceneeditor/SceneEditor.ISelectable.cs +++ b/zzre/tools/sceneeditor/SceneEditor.ISelectable.cs @@ -24,6 +24,7 @@ public interface ISelectable private readonly List> selectableContainers = []; private IEnumerable Selectables => selectableContainers.SelectMany(c => c); + private static bool dragMode; private ISelectable? _selected; private ISelectable? Selected { @@ -96,6 +97,7 @@ private void HandleGizmos() ImGuizmo.SetDrawlist(); if (ImGuizmo.Manipulate(ref view.M11, ref projection.M11, OPERATION.TRANSLATE, MODE.LOCAL, ref matrix.M11)) { + dragMode = true; selected.Location.LocalToWorld = matrix; editor.TriggerSelectionManipulate(); HandleNewSelection(selected); // to update the bounds @@ -120,6 +122,12 @@ private void HandleClick(MouseButton button, Vector2 pos) if (button != MouseButton.Left)// || ImGuizmo.IsOver() || ImGuizmo.IsUsing()) return; + if (dragMode) + { + dragMode = false; + return; + } + var ray = camera.RayAt((pos * 2f - Vector2.One) * new Vector2(1f, -1f)); var newPotentials = editor.Selectables .Select(s => (obj: s, rayCast: s.SelectableBounds.Cast(ray))) From c8c001dd286bfb222861fc4dd6efb945df4b5770 Mon Sep 17 00:00:00 2001 From: AcipenserSturio Date: Mon, 15 Jul 2024 02:27:46 +0500 Subject: [PATCH 18/19] Add rotation gizmo --- .../tools/sceneeditor/SceneEditor.ISelectable.cs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/zzre/tools/sceneeditor/SceneEditor.ISelectable.cs b/zzre/tools/sceneeditor/SceneEditor.ISelectable.cs index 28359ba6..c61446e6 100644 --- a/zzre/tools/sceneeditor/SceneEditor.ISelectable.cs +++ b/zzre/tools/sceneeditor/SceneEditor.ISelectable.cs @@ -1,4 +1,5 @@ using ImGuizmoNET; +using ImGuiNET; using System; using System.Collections.Generic; using System.Linq; @@ -24,7 +25,7 @@ public interface ISelectable private readonly List> selectableContainers = []; private IEnumerable Selectables => selectableContainers.SelectMany(c => c); - private static bool dragMode; + private static OPERATION gizmoOperation = OPERATION.TRANSLATE; private ISelectable? _selected; private ISelectable? Selected { @@ -95,9 +96,10 @@ private void HandleGizmos() var projection = camera.Projection; var matrix = selected.Location.LocalToWorld; ImGuizmo.SetDrawlist(); - if (ImGuizmo.Manipulate(ref view.M11, ref projection.M11, OPERATION.TRANSLATE, MODE.LOCAL, ref matrix.M11)) + if (!ImGuizmo.IsUsing()) + gizmoOperation = ImGui.IsKeyDown(ImGuiKey.ModShift) ? OPERATION.ROTATE : OPERATION.TRANSLATE; + if (ImGuizmo.Manipulate(ref view.M11, ref projection.M11, gizmoOperation, MODE.LOCAL, ref matrix.M11)) { - dragMode = true; selected.Location.LocalToWorld = matrix; editor.TriggerSelectionManipulate(); HandleNewSelection(selected); // to update the bounds @@ -119,15 +121,9 @@ private void HandleNewSelection(ISelectable? newSelected) private void HandleClick(MouseButton button, Vector2 pos) { - if (button != MouseButton.Left)// || ImGuizmo.IsOver() || ImGuizmo.IsUsing()) + if (button != MouseButton.Left || ImGuizmo.IsUsing()) // || ImGuizmo.IsOver() return; - if (dragMode) - { - dragMode = false; - return; - } - var ray = camera.RayAt((pos * 2f - Vector2.One) * new Vector2(1f, -1f)); var newPotentials = editor.Selectables .Select(s => (obj: s, rayCast: s.SelectableBounds.Cast(ray))) From 44d85a39177254e75f8915c1aa5387841efee8b8 Mon Sep 17 00:00:00 2001 From: AcipenserSturio Date: Mon, 15 Jul 2024 04:36:49 +0500 Subject: [PATCH 19/19] Sync rotation --- zzre.core/math/ZZIOExtensions.cs | 10 ++++++++-- zzre/tools/sceneeditor/SceneEditor.FOModel.cs | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/zzre.core/math/ZZIOExtensions.cs b/zzre.core/math/ZZIOExtensions.cs index 01248009..36073dc4 100644 --- a/zzre.core/math/ZZIOExtensions.cs +++ b/zzre.core/math/ZZIOExtensions.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Numerics; using Veldrid; using zzio; @@ -28,6 +28,12 @@ public static Quaternion ToZZRotation(this Vector3 v) return Quaternion.Conjugate(Quaternion.CreateFromRotationMatrix(Matrix4x4.CreateLookAt(Vector3.Zero, v, up))); } + public static Vector3 FromZZRotation(this Quaternion q) + { + Matrix4x4 rotationMatrix = Matrix4x4.CreateFromQuaternion(Quaternion.Conjugate(q)); + return Vector3.Normalize(new Vector3(rotationMatrix.M13, rotationMatrix.M23, rotationMatrix.M33)); + } + public static Vector3 ToZZRotationVector(this Quaternion rotation) => Vector3.Transform(-Vector3.UnitZ, rotation) * -1f; @@ -45,7 +51,7 @@ public static Vector3 ToZZRotationVector(this Quaternion rotation) => }; // adapted from https://gist.github.com/ciembor/1494530 - "It's the do what you want license :)" - + public static FColor RGBToHSL(this FColor c) { float max = Max(Max(c.r, c.g), c.b); diff --git a/zzre/tools/sceneeditor/SceneEditor.FOModel.cs b/zzre/tools/sceneeditor/SceneEditor.FOModel.cs index 76d8f24e..eb8da23b 100644 --- a/zzre/tools/sceneeditor/SceneEditor.FOModel.cs +++ b/zzre/tools/sceneeditor/SceneEditor.FOModel.cs @@ -38,6 +38,7 @@ private sealed class FOModel : BaseDisposable, ISelectable public void SyncWithScene() { SceneFOModel.pos = Location.LocalPosition; + SceneFOModel.rot = Location.LocalRotation.FromZZRotation(); } public FOModel(ITagContainer diContainer, zzio.scn.FOModel sceneModel)