diff --git a/GlitchyEditor/src/EditWindows/EntityHierarchyWindow.bf b/GlitchyEditor/src/EditWindows/EntityHierarchyWindow.bf index b761d19..012f03b 100644 --- a/GlitchyEditor/src/EditWindows/EntityHierarchyWindow.bf +++ b/GlitchyEditor/src/EditWindows/EntityHierarchyWindow.bf @@ -23,8 +23,9 @@ namespace GlitchyEditor.EditWindows public List SelectedEntities => _selectedEntities; - public this(Scene scene) + public this(Editor editor, Scene scene) { + _editor = editor; SetContext(scene); } @@ -61,6 +62,23 @@ namespace GlitchyEditor.EditWindows ImGui.EndPopup(); } + if (_editor.SceneViewportWindow.SelectionChanged) + { + if (Input.IsKeyReleased(.Control)) + { + _selectedEntities.Clear(); + } + + var handle = _scene.[Friend]_ecsWorld.GetCurrentVersion(EcsEntity.[Friend]CreateEntityID(_editor.SceneViewportWindow.SelectedEntityId, 0)); + + if (handle case .Ok(let h)) + { + Entity e = .(h, _scene); + + _selectedEntities.Add(e); + } + } + ShowEntityHierarchy(); if ((ImGui.IsMouseDown(.Left) || ImGui.IsMouseDown(.Right)) && !ImGui.IsAnyItemHovered() && !ImGui.GetIO().KeyCtrl && ImGui.IsWindowHovered(.AllowWhenBlockedByPopup)) @@ -113,6 +131,8 @@ namespace GlitchyEditor.EditWindows { _scene.DestroyEntity(entity, true); } + + _selectedEntities.Clear(); } private void ShowEntityHierarchyMenuBar() diff --git a/GlitchyEditor/src/EditWindows/SceneViewportWindow.bf b/GlitchyEditor/src/EditWindows/SceneViewportWindow.bf index 05f1bfd..356f17e 100644 --- a/GlitchyEditor/src/EditWindows/SceneViewportWindow.bf +++ b/GlitchyEditor/src/EditWindows/SceneViewportWindow.bf @@ -5,6 +5,7 @@ using GlitchyEngine.Math; using GlitchyEngine; using GlitchyEngine.World; using ImGuizmo; +using GlitchyEngine.Events; namespace GlitchyEditor.EditWindows { @@ -15,6 +16,7 @@ namespace GlitchyEditor.EditWindows private RenderTargetGroup _renderTarget ~ _?.ReleaseRef(); public Event> ViewportSizeChangedEvent ~ _.Dispose(); + public Event> EntityClickedEvent ~ _.Dispose(); public RenderTargetGroup RenderTarget { @@ -36,6 +38,9 @@ namespace GlitchyEditor.EditWindows private ImGui.Vec2 oldViewportSize; private bool viewPortChanged; + public uint32 SelectedEntityId; + public bool SelectionChanged; + protected override void InternalShow() { ImGui.PushStyleVar(.WindowPadding, ImGui.Vec2(1, 1)); @@ -94,35 +99,35 @@ namespace GlitchyEditor.EditWindows if(_renderTarget != null) { //ImGui.Image(_renderTarget.GetViewBinding(0), viewportSize); - ImGui.Image(_editor.CurrentCamera.RenderTarget.GetViewBinding(0), viewportSize); + //ImGui.Image(_editor.CurrentCamera.RenderTarget.GetViewBinding(0), viewportSize); + ImGui.Image(_editor.CurrentScene.[Friend]_compositeTarget.GetViewBinding(0), viewportSize); } + + + bool gizmoUsed = DrawImGuizmo(viewportSize); Vector2 relativeMouse = (Vector2)ImGui.GetMousePos() - (Vector2)ImGui.GetItemRectMin(); int x = Renderer.[Friend]_gBuffer.Target.Width; int y = Renderer.[Friend]_gBuffer.Target.Height; - if (Input.IsMouseButtonPressing(.LeftButton) && relativeMouse.X >= 0 && relativeMouse.Y >= 0 && + if (!gizmoUsed && !_editor.CurrentCamera.[Friend]BindMouse && Input.IsMouseButtonPressing(.LeftButton) && relativeMouse.X >= 0 && relativeMouse.Y >= 0 && relativeMouse.X < viewportSize.x && relativeMouse.Y < viewportSize.y && relativeMouse.X < x && relativeMouse.Y < y) { uint32 id = uint32.MaxValue; - _editor.CurrentCamera.RenderTarget.GetData(&id, 1, (.)relativeMouse.X, (.)relativeMouse.Y, 1, 1); - - //_renderTarget.GetData(&pixel, 0, ); + _editor.CurrentScene.[Friend]_compositeTarget.GetData(&id, 1, (.)relativeMouse.X, (.)relativeMouse.Y, 1, 1); - Log.EngineLogger.Info($"{relativeMouse} || ID = {id}"); + SelectionChanged = true; + SelectedEntityId = id; - if (id != uint32.MaxValue) - { - //_editor.CurrentScene.[Friend]_ecsWorld.GetCurrentVersion() - } - //_editor.EntityHierarchyWindow.SelectEntityWithId(id, true); - + EntityClickedEvent(this, id); + } + else + { + SelectionChanged = false; } - - DrawImGuizmo(viewportSize); ImGui.End(); @@ -203,7 +208,7 @@ namespace GlitchyEditor.EditWindows } } - private void DrawImGuizmo(ImGui.Vec2 viewportSize) + private bool DrawImGuizmo(ImGui.Vec2 viewportSize) { ImGuizmo.SetOrthographic(false); ImGuizmo.SetDrawlist(); @@ -219,7 +224,7 @@ namespace GlitchyEditor.EditWindows var projection = _editor.CurrentCamera.Projection; if(_editor.EntityHierarchyWindow.SelectedEntities.Count == 0) - return; + return false; var entity = _editor.EntityHierarchyWindow.SelectedEntities.Back; @@ -245,6 +250,8 @@ namespace GlitchyEditor.EditWindows // (probably because scaling a rotated matrix results in a skewed matrix, but unity can do it, so should we) transformCmp.LocalTransform = parentView * worldTransform; } + + return ImGuizmo.IsUsing(); } } } diff --git a/GlitchyEditor/src/Editor.bf b/GlitchyEditor/src/Editor.bf index 1d5bb79..f246b4b 100644 --- a/GlitchyEditor/src/Editor.bf +++ b/GlitchyEditor/src/Editor.bf @@ -35,7 +35,7 @@ namespace GlitchyEditor /// Creates a new editor for the given world public this(Scene scene) { - _entityHierarchyWindow = new EntityHierarchyWindow(_scene); + _entityHierarchyWindow = new EntityHierarchyWindow(this, _scene); CurrentScene = scene; _componentEditWindow = new ComponentEditWindow(_entityHierarchyWindow); diff --git a/GlitchyEngine/src/Renderer/Renderer.bf b/GlitchyEngine/src/Renderer/Renderer.bf index ad694c3..8c5a87b 100644 --- a/GlitchyEngine/src/Renderer/Renderer.bf +++ b/GlitchyEngine/src/Renderer/Renderer.bf @@ -341,11 +341,12 @@ namespace GlitchyEngine.Renderer _lights.Clear(); - // Copy EntityIDs to camera target - _gBuffer.Target.CopyTo(_sceneConstants.CameraTarget, 1, Int2.Zero, Int2(_sceneConstants.CameraTarget.Width, _sceneConstants.CameraTarget.Height), Int2.Zero, 5); + // Copy EntityIDs to compositionTarget + _gBuffer.Target.CopyTo(_sceneConstants.CompositionTarget, 1, Int2.Zero, Int2(_sceneConstants.CameraTarget.Width, _sceneConstants.CameraTarget.Height), Int2.Zero, 5); RenderCommand.SetBlendState(_gBufferBlend); - + + RenderCommand.UnbindRenderTargets(); RenderCommand.SetRenderTargetGroup(_sceneConstants.CompositionTarget, true); RenderCommand.BindRenderTargets(); diff --git a/GlitchyEngine/src/World/EcsWorld.bf b/GlitchyEngine/src/World/EcsWorld.bf index 619e135..c82edc8 100644 --- a/GlitchyEngine/src/World/EcsWorld.bf +++ b/GlitchyEngine/src/World/EcsWorld.bf @@ -161,10 +161,10 @@ namespace GlitchyEngine.World } /// Returns the entity with the same ID and the current version. Or null, if no such entity exists. - public EcsEntity? GetCurrentVersion(EcsEntity entity) + public Result GetCurrentVersion(EcsEntity entity) { if(entity.Index > _entities.Count) - return null; + return .Err; var listEntity = ref _entities[entity.Index]; diff --git a/GlitchyEngine/src/World/Scene.bf b/GlitchyEngine/src/World/Scene.bf index c3b234b..44d3670 100644 --- a/GlitchyEngine/src/World/Scene.bf +++ b/GlitchyEngine/src/World/Scene.bf @@ -12,7 +12,9 @@ namespace GlitchyEngine.World internal EcsWorld _ecsWorld = new .() ~ delete _; private Dictionary _onComponentAddedHandlers = new .() ~ delete _; - + + private RenderTargetGroup _compositeTarget ~ _.ReleaseRef(); + public Entity ActiveCamera => { Entity cameraEntity = .(); @@ -42,6 +44,13 @@ namespace GlitchyEngine.World cameraComponent.Camera.SetViewportSize(e.Scene.ViewportWidth, e.Scene.ViewportHeight); }); + + RenderTargetGroupDescription desc = .(100, 100, + TargetDescription[]( + RenderTargetFormat.R16G16B16A16_Float, + .(RenderTargetFormat.R32_UInt) {ClearColor = .UInt(uint32.MaxValue)}), + RenderTargetFormat.D24_UNorm_S8_UInt); + _compositeTarget = new RenderTargetGroup(desc); } public ~this() @@ -50,6 +59,9 @@ namespace GlitchyEngine.World public void UpdateRuntime(GameTime gameTime, RenderTargetGroup finalTarget) { + // TODO: adapt changes from UpdateEditor! + Runtime.NotImplemented(); + /* Debug.Profiler.ProfileRendererFunction!(); TransformSystem.Update(_ecsWorld); @@ -109,6 +121,7 @@ namespace GlitchyEngine.World renderTarget?.ReleaseRef(); } + */ } public void UpdateEditor(GameTime gameTime, EditorCamera camera, RenderTargetGroup viewportTarget, delegate void() DebugDraw3D, delegate void() DrawDebug2D) @@ -120,7 +133,7 @@ namespace GlitchyEngine.World TransformSystem.Update(_ecsWorld); // 3D render - Renderer.BeginScene(camera, viewportTarget); + Renderer.BeginScene(camera, _compositeTarget); for (var (entity, transform, mesh, meshRenderer) in _ecsWorld.Enumerate()) { @@ -136,9 +149,10 @@ namespace GlitchyEngine.World Renderer.EndScene(); - // TODO: alphablending + // TODO: alphablending (handle in Renderer2D) + // TODO: 2D-Postprocessing requires rendering into separate target instead of directly into compositeTarget - RenderCommand.SetRenderTargetGroup(camera.RenderTarget); + RenderCommand.SetRenderTargetGroup(_compositeTarget); RenderCommand.BindRenderTargets(); // Sprite renderer @@ -157,7 +171,7 @@ namespace GlitchyEngine.World Renderer2D.EndScene(); - // TODO: cameraTarget into viewportTarget (gamma correction!) + // TODO: compositeTarget into viewportTarget (gamma correction!) viewportTarget.ReleaseRef(); } @@ -206,6 +220,8 @@ namespace GlitchyEngine.World cameraComponent.Camera.SetViewportSize(width, height); } } + + _compositeTarget.Resize(ViewportWidth, ViewportHeight); } private void OnComponentAdded(Entity entity, Type componentType, void* component)