public void Update(float dt) { ViewportUsingKeyboard = Viewport.Update(Window, dt); if (_loadingTask != null && _loadingTask.IsCompleted) { _loadingTask = null; if (_renderMesh != null) { var box = _renderMesh.GetBounds(); Viewport.FrameBox(box); var dim = box.GetDimensions(); var mindim = Math.Min(dim.X, Math.Min(dim.Y, dim.Z)); var maxdim = Math.Max(dim.X, Math.Max(dim.Y, dim.Z)); var basespeed = (float)Math.Sqrt(mindim / 3.0f); Viewport._worldView.CameraMoveSpeed = basespeed; Viewport._worldView.CameraMoveSpeedSlow = basespeed / 10.0f; Viewport._worldView.CameraMoveSpeedFast = basespeed * 10.0f; Viewport.FarClip = Math.Max(10.0f, maxdim * 10.0f); Viewport.NearClip = Math.Max(0.001f, maxdim / 10000.0f); } if (_flverhandle.IsLoaded && _flverhandle.Get() != null) { if (_flverhandle.TryLock()) { var r = _flverhandle.Get(); if (r.Flver != null) { _universe.LoadFlver(r.Flver, _renderMesh, _currentModel); } _flverhandle.Unlock(); } } } }
unsafe private void MapObjectSelectable(Entity e, bool visicon, bool hierarchial = false) { // Main selectable if (e is MapEntity me) { ImGui.PushID(me.Type.ToString() + e.Name); } else { ImGui.PushID(e.Name); } bool doSelect = false; if (_setNextFocus) { ImGui.SetItemDefaultFocus(); _setNextFocus = false; doSelect = true; } bool nodeopen = false; string padding = hierarchial ? " " : " "; if (hierarchial && e.Children.Count > 0) { var treeflags = ImGuiTreeNodeFlags.OpenOnArrow | ImGuiTreeNodeFlags.SpanAvailWidth; if (_selection.GetSelection().Contains(e)) { treeflags |= ImGuiTreeNodeFlags.Selected; } nodeopen = ImGui.TreeNodeEx(e.PrettyName, treeflags); if (ImGui.IsItemHovered() && ImGui.IsMouseDoubleClicked(0)) { if (e.RenderSceneMesh != null) { _viewport.FrameBox(e.RenderSceneMesh.GetBounds()); } } } else { if (ImGui.Selectable(padding + e.PrettyName, _selection.GetSelection().Contains(e), ImGuiSelectableFlags.AllowDoubleClick | ImGuiSelectableFlags.AllowItemOverlap)) { // If double clicked frame the selection in the viewport if (ImGui.IsMouseDoubleClicked(0)) { if (e.RenderSceneMesh != null) { _viewport.FrameBox(e.RenderSceneMesh.GetBounds()); } } } } if (ImGui.IsItemClicked(0)) { _pendingClick = e; } if (_pendingClick == e && ImGui.IsMouseReleased(ImGuiMouseButton.Left)) { if (ImGui.IsItemHovered()) { doSelect = true; } _pendingClick = null; } if (ImGui.IsItemFocused() && !_selection.IsSelected(e)) { doSelect = true; } if (hierarchial && doSelect) { if ((nodeopen && !_treeOpenEntities.Contains(e)) || (!nodeopen && _treeOpenEntities.Contains(e))) { doSelect = false; } if (nodeopen && !_treeOpenEntities.Contains(e)) { _treeOpenEntities.Add(e); } else if (!nodeopen && _treeOpenEntities.Contains(e)) { _treeOpenEntities.Remove(e); } } if (ImGui.BeginPopupContextItem()) { _handler.OnEntityContextMenu(e); ImGui.EndPopup(); } if (ImGui.BeginDragDropSource()) { ImGui.Text(e.PrettyName); // Kinda meme DragDropPayload p = new DragDropPayload(); p.Entity = e; _dragDropPayloads.Add(_dragDropPayloadCounter, p); DragDropPayloadReference r = new DragDropPayloadReference(); r.Index = _dragDropPayloadCounter; _dragDropPayloadCounter++; GCHandle handle = GCHandle.Alloc(r, GCHandleType.Pinned); ImGui.SetDragDropPayload("entity", handle.AddrOfPinnedObject(), (uint)sizeof(DragDropPayloadReference)); ImGui.EndDragDropSource(); handle.Free(); _initiatedDragDrop = true; } if (hierarchial && ImGui.BeginDragDropTarget()) { var payload = ImGui.AcceptDragDropPayload("entity"); if (payload.NativePtr != null) { DragDropPayloadReference *h = (DragDropPayloadReference *)payload.Data; var pload = _dragDropPayloads[h->Index]; _dragDropPayloads.Remove(h->Index); _dragDropSources.Add(pload.Entity); _dragDropDestObjects.Add(e); _dragDropDests.Add(e.Children.Count); } ImGui.EndDragDropTarget(); } // Visibility icon if (visicon) { ImGui.SetItemAllowOverlap(); bool visible = e.EditorVisible; ImGui.SameLine(ImGui.GetWindowContentRegionWidth() - 18.0f); ImGui.PushStyleColor(ImGuiCol.Text, visible ? new Vector4(1.0f, 1.0f, 1.0f, 1.0f) : new Vector4(0.6f, 0.6f, 0.6f, 1.0f)); ImGui.TextWrapped(visible ? ForkAwesome.Eye : ForkAwesome.EyeSlash); ImGui.PopStyleColor(); if (ImGui.IsItemClicked(0)) { e.EditorVisible = !e.EditorVisible; doSelect = false; } } // If the visibility icon wasn't clicked actually perform the selection if (doSelect) { if (InputTracker.GetKey(Key.ControlLeft) || InputTracker.GetKey(Key.ControlRight)) { _selection.AddSelection(e); } else { _selection.ClearSelection(); _selection.AddSelection(e); } } ImGui.PopID(); // Invisible item to be a drag drop target between nodes if (_pendingDragDrop) { if (e is MapEntity me2) { ImGui.SetItemAllowOverlap(); ImGui.InvisibleButton(me2.Type.ToString() + e.Name, new Vector2(-1, 3.0f)); } else { ImGui.SetItemAllowOverlap(); ImGui.InvisibleButton(e.Name, new Vector2(-1, 3.0f)); } if (ImGui.IsItemFocused()) { _setNextFocus = true; } if (ImGui.BeginDragDropTarget()) { var payload = ImGui.AcceptDragDropPayload("entity"); if (payload.NativePtr != null) { DragDropPayloadReference *h = (DragDropPayloadReference *)payload.Data; var pload = _dragDropPayloads[h->Index]; _dragDropPayloads.Remove(h->Index); if (hierarchial) { _dragDropSources.Add(pload.Entity); _dragDropDestObjects.Add(e.Parent); _dragDropDests.Add(e.Parent.ChildIndex(e) + 1); } else { _dragDropSources.Add(pload.Entity); _dragDropDests.Add(pload.Entity.Container.Objects.IndexOf(e) + 1); } } ImGui.EndDragDropTarget(); } } // If there's children then draw them if (nodeopen) { HierarchyView(e); ImGui.TreePop(); } }
public void OnGUI(string[] initcmd) { // Docking setup //var vp = ImGui.GetMainViewport(); var wins = ImGui.GetWindowSize(); var winp = ImGui.GetWindowPos(); winp.Y += 20.0f; wins.Y -= 20.0f; ImGui.SetNextWindowPos(winp); ImGui.SetNextWindowSize(wins); ImGui.PushStyleVar(ImGuiStyleVar.WindowRounding, 0.0f); ImGui.PushStyleVar(ImGuiStyleVar.WindowBorderSize, 0.0f); ImGui.PushStyleVar(ImGuiStyleVar.WindowPadding, new Vector2(0.0f, 0.0f)); ImGui.PushStyleVar(ImGuiStyleVar.ChildBorderSize, 0.0f); ImGuiWindowFlags flags = ImGuiWindowFlags.NoTitleBar | ImGuiWindowFlags.NoCollapse | ImGuiWindowFlags.NoResize | ImGuiWindowFlags.NoMove; flags |= ImGuiWindowFlags.MenuBar | ImGuiWindowFlags.NoDocking; flags |= ImGuiWindowFlags.NoBringToFrontOnFocus | ImGuiWindowFlags.NoNavFocus; flags |= ImGuiWindowFlags.NoBackground; //ImGui.Begin("DockSpace_MapEdit", flags); ImGui.PopStyleVar(4); var dsid = ImGui.GetID("DockSpace_MapEdit"); ImGui.DockSpace(dsid, new Vector2(0, 0)); // Keyboard shortcuts if (EditorActionManager.CanUndo() && InputTracker.GetControlShortcut(Key.Z)) { EditorActionManager.UndoAction(); } if (EditorActionManager.CanRedo() && InputTracker.GetControlShortcut(Key.Y)) { EditorActionManager.RedoAction(); } if (!ViewportUsingKeyboard && !ImGui.GetIO().WantCaptureKeyboard) { if (InputTracker.GetControlShortcut(Key.D) && _selection.IsSelection()) { var action = new CloneMapObjectsAction(Universe, RenderScene, _selection.GetFilteredSelection <MapEntity>().ToList(), true); EditorActionManager.ExecuteAction(action); } if (InputTracker.GetKeyDown(Key.Delete) && _selection.IsSelection()) { var action = new DeleteMapObjectsAction(Universe, RenderScene, _selection.GetFilteredSelection <MapEntity>().ToList(), true); EditorActionManager.ExecuteAction(action); } if (InputTracker.GetKeyDown(Key.W)) { Gizmos.Mode = Gizmos.GizmosMode.Translate; } if (InputTracker.GetKeyDown(Key.E)) { Gizmos.Mode = Gizmos.GizmosMode.Rotate; } // Use home key to cycle between gizmos origin modes if (InputTracker.GetKeyDown(Key.Home)) { if (Gizmos.Origin == Gizmos.GizmosOrigin.World) { Gizmos.Origin = Gizmos.GizmosOrigin.BoundingBox; } else if (Gizmos.Origin == Gizmos.GizmosOrigin.BoundingBox) { Gizmos.Origin = Gizmos.GizmosOrigin.World; } } // F key frames the selection if (InputTracker.GetKeyDown(Key.F)) { var selected = _selection.GetFilteredSelection <Entity>(); bool first = false; BoundingBox box = new BoundingBox(); foreach (var s in selected) { if (s.RenderSceneMesh != null) { if (!first) { box = s.RenderSceneMesh.GetBounds(); first = true; } else { box = BoundingBox.Combine(box, s.RenderSceneMesh.GetBounds()); } } } if (first) { Viewport.FrameBox(box); } } // Render settings if (InputTracker.GetControlShortcut(Key.Number1)) { RenderScene.DrawFilter = Scene.RenderFilter.MapPiece | Scene.RenderFilter.Object | Scene.RenderFilter.Character | Scene.RenderFilter.Region; } else if (InputTracker.GetControlShortcut(Key.Number2)) { RenderScene.DrawFilter = Scene.RenderFilter.Collision | Scene.RenderFilter.Object | Scene.RenderFilter.Character | Scene.RenderFilter.Region; } else if (InputTracker.GetControlShortcut(Key.Number3)) { RenderScene.DrawFilter = Scene.RenderFilter.Collision | Scene.RenderFilter.Navmesh | Scene.RenderFilter.Object | Scene.RenderFilter.Character | Scene.RenderFilter.Region; } CFG.Current.LastSceneFilter = RenderScene.DrawFilter; } // Parse select commands string propSearchKey = null; if (initcmd != null && initcmd[0] == "propsearch") { if (initcmd.Length > 1) { propSearchKey = initcmd[1]; } } ImGui.SetNextWindowSize(new Vector2(300, 500), ImGuiCond.FirstUseEver); ImGui.SetNextWindowPos(new Vector2(20, 20), ImGuiCond.FirstUseEver); System.Numerics.Vector3 clear_color = new System.Numerics.Vector3(114f / 255f, 144f / 255f, 154f / 255f); //ImGui.Text($@"Viewport size: {Viewport.Width}x{Viewport.Height}"); //ImGui.Text(string.Format("Application average {0:F3} ms/frame ({1:F1} FPS)", 1000f / ImGui.GetIO().Framerate, ImGui.GetIO().Framerate)); Viewport.OnGui(); SceneTree.OnGui(); if (MapStudioNew.FirstFrame) { ImGui.SetNextWindowFocus(); } PropEditor.OnGui(_selection.GetSingleFilteredSelection <Entity>(), "mapeditprop", Viewport.Width, Viewport.Height); DispGroupEditor.OnGui(AssetLocator.Type); PropSearch.OnGui(propSearchKey); // Not usable yet //NavMeshEditor.OnGui(AssetLocator.Type); ResourceManager.OnGuiDrawTasks(Viewport.Width, Viewport.Height); ResourceManager.OnGuiDrawResourceList(); if (_activeModal != null) { if (_activeModal.IsClosed) { _activeModal.OpenModal(); } _activeModal.OnGui(); if (_activeModal.IsClosed) { _activeModal = null; } } }