protected override void Load() { DefaultMaterialMap.Init(); Title = "LancerEdit"; guiHelper = new ImGuiHelper(this, DpiScale * Config.UiScale); guiHelper.PauseWhenUnfocused = Config.PauseWhenUnfocused; Audio = new AudioManager(this); FileDialog.RegisterParent(this); options = new OptionsWindow(this); Resources = new GameResourceManager(this); Commands = new CommandBuffer(); Polyline = new PolylineRender(Commands); DebugRender = new PhysicsDebugRenderer(); RenderContext.PushViewport(0, 0, 800, 600); Keyboard.KeyDown += Keyboard_KeyDown; //TODO: Icon-setting code very messy using (var stream = typeof(MainWindow).Assembly.GetManifestResourceStream("LancerEdit.reactor_64.png")) { var icon = LibreLancer.ImageLib.Generic.BytesFromStream(stream); SetWindowIcon(icon.Width, icon.Height, icon.Data); } using (var stream = typeof(MainWindow).Assembly.GetManifestResourceStream("LancerEdit.reactor_128.png")) { var icon = (Texture2D)LibreLancer.ImageLib.Generic.FromStream(stream); logoTexture = ImGuiHelper.RegisterTexture(icon); } //Open passed in files! if (InitOpenFile != null) { foreach (var f in InitOpenFile) { OpenFile(f); } } RichText = RenderContext.Renderer2D.CreateRichTextEngine(); Fonts = new FontManager(); Fonts.ConstructDefaultFonts(); Services.Add(Fonts); Make3dbDlg = new CommodityIconDialog(this); LoadScripts(); }
void SkeletonPanel() { if (ImGui.Button("Open Anm")) { var file = FileDialog.Open(); if (file == null) { return; } anmFile = new Anm.AnmFile(file); } if (anmFile != null) { ImGui.Separator(); foreach (var script in anmFile.Scripts) { if (ImGui.Button(script.Key)) { skinning.SetPose(script.Value); } } } }
void SkeletonPanel() { ImGui.Checkbox("Draw Skeleton", ref drawSkeleton); if (ImGui.Button("Open Anm")) { var file = FileDialog.Open(); if (file == null) { return; } anmFile = new Anm.AnmFile(file); } if (anmFile != null) { ImGui.Separator(); foreach (var script in anmFile.Scripts) { var popup = $"{script.Key}Popup"; if (ImGui.Button(script.Key)) { skel.StartScript(script.Value, 0, 1, 0); } if (ImGui.IsItemClicked(1)) { ImGui.OpenPopup(popup); } if (ImGui.BeginPopupContextItem(popup)) { if (ImGui.MenuItem("Copy Nickname")) { _window.SetClipboardText(script.Key); } ImGui.EndPopup(); } } } }
void SkeletonPanel() { ImGui.Checkbox("Draw Skeleton", ref drawSkeleton); if (ImGui.Button("Open Anm")) { var file = FileDialog.Open(); if (file == null) { return; } anmFile = new Anm.AnmFile(file); } if (anmFile != null) { ImGui.Separator(); foreach (var script in anmFile.Scripts) { if (ImGui.Button(script.Key)) { skel.StartScript(script.Value, 0, 1, 0); } } } }
void RunSaveDialog(UtfTab at) { var f = FileDialog.Save(UtfFilters); if (f != null) { string errText = ""; if (!at.Utf.Save(f, ref errText)) { openError = true; if (errorText == null) { errorText = new TextBuffer(); } errorText.SetText(errText); } else { at.DocumentName = System.IO.Path.GetFileName(f); at.UpdateTitle(); at.FilePath = f; } } }
public void Draw(int i) { ImGui.PushID($"__argument_{i}"); switch (Argument.Type) { case ScriptArgumentType.Boolean: ImGui.Checkbox(Argument.Name, ref BooleanValue); break; case ScriptArgumentType.Integer: ImGui.InputInt(Argument.Name, ref IntegerValue, 1); break; case ScriptArgumentType.String: InputText.InputText(Argument.Name, ImGuiInputTextFlags.None, 100); break; case ScriptArgumentType.Dropdown: ImGui.Combo(Argument.Name, ref IntegerValue, Argument.Options.ToArray(), Argument.Options.Count); break; case ScriptArgumentType.Folder: InputText.InputText(Argument.Name, ImGuiInputTextFlags.None, 100); ImGui.SameLine(); if (ImGui.Button("..")) { var result = FileDialog.ChooseFolder(); if (!string.IsNullOrEmpty(result)) { InputText.SetText(result); } } break; case ScriptArgumentType.File: InputText.InputText(Argument.Name, ImGuiInputTextFlags.None, 100); ImGui.SameLine(); if (ImGui.Button("..")) { var result = FileDialog.Open(); if (!string.IsNullOrEmpty(result)) { InputText.SetText(result); } } break; case ScriptArgumentType.FileArray: ImGui.Text(Argument.Name); ImGui.Separator(); if (StringArray.Count == 0) { ImGui.Text("[empty]"); } else { ImGui.Columns(2); List <string> toRemove = new List <string>(); for (int j = 0; j < StringArray.Count; j++) { ImGui.Text(StringArray[j]); ImGui.NextColumn(); if (ImGui.Button($"Remove##{j}")) { toRemove.Add(StringArray[j]); } ImGui.NextColumn(); } foreach (var f in toRemove) { StringArray.Remove(f); } ImGui.Columns(1); } ImGui.Separator(); if (ImGui.Button("Add File")) { var result = FileDialog.Open(); if (!string.IsNullOrEmpty(result)) { StringArray.Add(result); } } break; } ImGui.PopID(); }
void HierarchyPanel() { if (!(drawable is DF.DfmFile) && !(drawable is SphFile)) { //Sur if (ImGui.Button("Open Sur")) { var file = FileDialog.Open(SurFilters); surname = System.IO.Path.GetFileName(file); LibreLancer.Physics.Sur.SurFile sur; try { using (var f = System.IO.File.OpenRead(file)) { sur = new LibreLancer.Physics.Sur.SurFile(f); } } catch (Exception) { sur = null; } if (sur != null) { ProcessSur(sur); } } if (surs != null) { ImGui.Separator(); ImGui.Text("Sur: " + surname); ImGui.Checkbox("Show Hull", ref surShowHull); ImGui.Checkbox("Show Hardpoints", ref surShowHps); ImGui.Separator(); } } if (ImGuiExt.Button("Apply Hardpoints", _isDirtyHp)) { if (drawable is ModelFile) { hprefs.Nodes[0].HardpointsToNodes(vmsModel.Root.Hardpoints); } else if (drawable is CmpFile) { foreach (var mdl in vmsModel.AllParts) { var node = hprefs.Nodes.First((x) => x.Name == mdl.Path); node.HardpointsToNodes(mdl.Hardpoints); } } if (_isDirtyHp) { _isDirtyHp = false; parent.DirtyCountHp--; } popups.OpenPopup("Apply Complete"); } if (vmsModel.AllParts.Length > 1 && ImGuiExt.Button("Apply Parts", _isDirtyPart)) { WriteConstructs(); if (_isDirtyPart) { _isDirtyPart = false; parent.DirtyCountPart--; } popups.OpenPopup("Apply Complete##Parts"); } if (ImGuiExt.ToggleButton("Filter", doFilter)) { doFilter = !doFilter; } if (doFilter) { ImGui.InputText("##filter", filterText.Pointer, (uint)filterText.Size, ImGuiInputTextFlags.None, filterText.Callback); currentFilter = filterText.GetText(); } else { currentFilter = null; } ImGui.Separator(); if (selectedNode != null) { ImGui.Text(selectedNode.Construct.ChildName); ImGui.Text(selectedNode.Construct.GetType().Name); ImGui.Text("Origin: " + selectedNode.Construct.Origin.ToString()); var euler = selectedNode.Construct.Rotation.GetEuler(); ImGui.Text(string.Format("Rotation: (Pitch {0:0.000}, Yaw {1:0.000}, Roll {2:0.000})", MathHelper.RadiansToDegrees(euler.X), MathHelper.RadiansToDegrees(euler.Y), MathHelper.RadiansToDegrees(euler.Z))); ImGui.Separator(); } if (!vmsModel.Root.Active) { var col = ImGui.GetStyle().Colors[(int)ImGuiCol.TextDisabled]; ImGui.PushStyleColor(ImGuiCol.Text, col); } if (ImGui.TreeNodeEx(ImGuiExt.Pad("Root"), ImGuiTreeNodeFlags.DefaultOpen)) { if (!vmsModel.Root.Active) { ImGui.PopStyleColor(); } RootModelContext(vmsModel.Root.Active); Theme.RenderTreeIcon("Root", "tree", Color4.DarkGreen); if (vmsModel.Root.Children != null) { foreach (var n in vmsModel.Root.Children) { DoConstructNode(n); } } DoModel(vmsModel.Root); //if (!(drawable is SphFile)) DoModel(rootModel, null); ImGui.TreePop(); } else { if (!vmsModel.Root.Active) { ImGui.PopStyleColor(); } RootModelContext(vmsModel.Root.Active); Theme.RenderTreeIcon("Root", "tree", Color4.DarkGreen); } }
unsafe void NodeInformation() { ImGui.BeginChild("##scrollnode", false, 0); ImGui.Text("Name: " + selectedNode.Name); if (selectedNode.Children != null) { ImGui.Text(selectedNode.Children.Count + " children"); if (selectedNode != Utf.Root) { ImGui.Separator(); ImGui.Text("Actions:"); if (ImGui.Button("Add Data")) { Confirm("Adding data will delete this node's children. Continue?", () => { selectedNode.Children = null; selectedNode.Data = new byte[0]; }); } if (ImGui.Button("Import Data")) { Confirm("Importing data will delete this node's children. Continue?", () => { string path; if ((path = FileDialog.Open()) != null) { selectedNode.Children = null; selectedNode.Data = File.ReadAllBytes(path); } }); } } } else if (selectedNode.Data != null) { ImGui.Text(string.Format("Size: {0}", LibreLancer.DebugDrawing.SizeSuffix(selectedNode.Data.Length))); ImGui.Separator(); if (selectedNode.Data.Length > 0) { ImGui.Text("Previews:"); //String Preview ImGui.Text("String:"); ImGui.SameLine(); ImGui.InputText("", selectedNode.Data, (uint)Math.Min(selectedNode.Data.Length, 32), InputTextFlags.ReadOnly, DummyCallback); //Float Preview ImGui.Text("Float:"); fixed(byte *ptr = selectedNode.Data) { for (int i = 0; i < 4 && (i < selectedNode.Data.Length / 4); i++) { ImGui.SameLine(); ImGui.Text(((float *)ptr)[i].ToString()); } } //Int Preview ImGui.Text("Int:"); fixed(byte *ptr = selectedNode.Data) { for (int i = 0; i < 4 && (i < selectedNode.Data.Length / 4); i++) { ImGui.SameLine(); ImGui.Text(((int *)ptr)[i].ToString()); } } } else { ImGui.Text("Empty Data"); } ImGui.Separator(); ImGui.Text("Actions:"); if (ImGui.Button("Edit")) { ImGui.OpenPopup("editactions"); } if (ImGui.BeginPopup("editactions")) { if (ImGui.MenuItem("String Editor")) { if (selectedNode.Data.Length > 255) { stringConfirm = true; } else { text.SetBytes(selectedNode.Data, selectedNode.Data.Length); stringEditor = true; } } if (ImGui.MenuItem("Hex Editor")) { hexdata = new byte[selectedNode.Data.Length]; selectedNode.Data.CopyTo(hexdata, 0); mem = new MemoryEditor(); hexEditor = true; } if (ImGui.MenuItem("Float Editor")) { floats = new float[selectedNode.Data.Length / 4]; for (int i = 0; i < selectedNode.Data.Length / 4; i++) { floats[i] = BitConverter.ToSingle(selectedNode.Data, i * 4); } floatEditor = true; } if (ImGui.MenuItem("Int Editor")) { ints = new int[selectedNode.Data.Length / 4]; for (int i = 0; i < selectedNode.Data.Length / 4; i++) { ints[i] = BitConverter.ToInt32(selectedNode.Data, i * 4); } intEditor = true; } if (ImGui.MenuItem("Color Picker")) { var len = selectedNode.Data.Length / 4; if (len < 3) { pickcolor4 = true; color4 = new System.Numerics.Vector4(0, 0, 0, 1); } else if (len == 3) { pickcolor4 = false; color3 = new System.Numerics.Vector3( BitConverter.ToSingle(selectedNode.Data, 0), BitConverter.ToSingle(selectedNode.Data, 4), BitConverter.ToSingle(selectedNode.Data, 8)); } else if (len > 3) { pickcolor4 = true; color4 = new System.Numerics.Vector4( BitConverter.ToSingle(selectedNode.Data, 0), BitConverter.ToSingle(selectedNode.Data, 4), BitConverter.ToSingle(selectedNode.Data, 8), BitConverter.ToSingle(selectedNode.Data, 12)); } colorPicker = true; } ImGui.EndPopup(); } ImGui.NextColumn(); if (ImGui.Button("Texture Viewer")) { Texture2D tex = null; try { using (var stream = new MemoryStream(selectedNode.Data)) { tex = LibreLancer.ImageLib.Generic.FromStream(stream); } var title = string.Format("{0} ({1})", selectedNode.Name, Title); var tab = new TextureViewer(title, tex); main.AddTab(tab); } catch (Exception) { ErrorPopup("Node data couldn't be opened as texture"); } } if (ImGui.Button("Play Audio")) { var data = main.Audio.AllocateData(); using (var stream = new MemoryStream(selectedNode.Data)) { main.Audio.PlaySound(stream); } } if (ImGui.Button("Import Data")) { string path; if ((path = FileDialog.Open()) != null) { selectedNode.Data = File.ReadAllBytes(path); } } if (ImGui.Button("Export Data")) { string path; if ((path = FileDialog.Save()) != null) { File.WriteAllBytes(path, selectedNode.Data); } } } else { ImGui.Text("Empty"); ImGui.Separator(); ImGui.Text("Actions:"); if (ImGui.Button("Add Data")) { selectedNode.Data = new byte[0]; } if (ImGui.Button("Import Data")) { string path; if ((path = FileDialog.Open()) != null) { selectedNode.Data = File.ReadAllBytes(path); } } } ImGui.EndChild(); }
void NodeInformation() { ImGui.Text("Name: " + selectedNode.Name); if (selectedNode.Children != null) { ImGui.Text(selectedNode.Children.Count + " children"); } else { ImGui.Text(string.Format("Size: {0}", LibreLancer.DebugDrawing.SizeSuffix(selectedNode.Data.Length))); if (ImGui.Button("Hex Editor")) { hexdata = new byte[selectedNode.Data.Length]; selectedNode.Data.CopyTo(hexdata, 0); mem = new MemoryEditor(); hexEditor = true; } if (ImGui.Button("Float Editor")) { floats = new float[selectedNode.Data.Length / 4]; for (int i = 0; i < selectedNode.Data.Length / 4; i++) { floats[i] = BitConverter.ToSingle(selectedNode.Data, i * 4); } floatEditor = true; } if (ImGui.Button("Int Editor")) { ints = new int[selectedNode.Data.Length / 4]; for (int i = 0; i < selectedNode.Data.Length / 4; i++) { ints[i] = BitConverter.ToInt32(selectedNode.Data, i * 4); } intEditor = true; } if (ImGui.Button("Color Picker")) { var len = selectedNode.Data.Length / 4; if (len < 3) { pickcolor4 = true; color4 = new System.Numerics.Vector4(0, 0, 0, 1); } else if (len == 3) { pickcolor4 = false; color3 = new System.Numerics.Vector3( BitConverter.ToSingle(selectedNode.Data, 0), BitConverter.ToSingle(selectedNode.Data, 4), BitConverter.ToSingle(selectedNode.Data, 8)); } else if (len > 3) { pickcolor4 = true; color4 = new System.Numerics.Vector4( BitConverter.ToSingle(selectedNode.Data, 0), BitConverter.ToSingle(selectedNode.Data, 4), BitConverter.ToSingle(selectedNode.Data, 8), BitConverter.ToSingle(selectedNode.Data, 12)); } colorPicker = true; } if (ImGui.Button("Texture Viewer")) { Texture2D tex = null; try { using (var stream = new MemoryStream(selectedNode.Data)) { tex = LibreLancer.ImageLib.Generic.FromStream(stream); } var title = string.Format("{0} ({1})", selectedNode.Name, Title); var tab = new TextureViewer(title, tex); main.AddTab(tab); } catch (Exception) { ErrorPopup("Node data couldn't be opened as texture"); } } if (ImGui.Button("Play Audio")) { var data = main.Audio.AllocateData(); using (var stream = new MemoryStream(selectedNode.Data)) { main.Audio.PlaySound(stream); } } if (ImGui.Button("Import Data")) { string path; if ((path = FileDialog.Open()) != null) { selectedNode.Data = File.ReadAllBytes(path); } } if (ImGui.Button("Export Data")) { string path; if ((path = FileDialog.Save()) != null) { File.WriteAllBytes(path, selectedNode.Data); } } if (ImGui.Button("View Model")) { IDrawable drawable = null; try { drawable = LibreLancer.Utf.UtfLoader.GetDrawable(Utf.Export(), main.Resources); drawable.Initialize(main.Resources); } catch (Exception) { ErrorPopup("Could not open as model"); drawable = null; } if (drawable != null) { main.AddTab(new ModelViewer("Model Viewer", drawable, main.RenderState, main.Viewport)); } } } }
protected override void Draw(double elapsed) { //Don't process all the imgui stuff when it isn't needed if (!loadingSpinnerActive && !guiHelper.DoRender(elapsed)) { if (lastFrame != null) { lastFrame.BlitToScreen(); } WaitForEvent(); //Yield like a regular GUI program return; } TimeStep = elapsed; Viewport.Replace(0, 0, Width, Height); RenderState.ClearColor = new Color4(0.2f, 0.2f, 0.2f, 1f); RenderState.ClearAll(); guiHelper.NewFrame(elapsed); ImGui.PushFont(ImGuiHelper.Noto); ImGui.BeginMainMenuBar(); if (ImGui.BeginMenu("File")) { if (Theme.IconMenuItem("New", "new", Color4.White, true)) { var t = new UtfTab(this, new EditableUtf(), "Untitled"); ActiveTab = t; AddTab(t); } if (Theme.IconMenuItem("Open", "open", Color4.White, true)) { var f = FileDialog.Open(UtfFilters); OpenFile(f); } if (ActiveTab == null) { Theme.IconMenuItem("Save", "save", Color4.LightGray, false); Theme.IconMenuItem("Save As", "saveas", Color4.LightGray, false); } else { if (Theme.IconMenuItem(string.Format("Save '{0}'", ActiveTab.DocumentName), "saveas", Color4.White, true)) { Save(); } if (Theme.IconMenuItem("Save As", "saveas", Color4.White, true)) { SaveAs(); } } if (Theme.IconMenuItem("Quit", "quit", Color4.White, true)) { Exit(); } ImGui.EndMenu(); } if (ImGui.BeginMenu("View")) { Theme.IconMenuToggle("Log", "log", Color4.White, ref showLog, true); ImGui.EndMenu(); } if (ImGui.BeginMenu("Tools")) { if (Theme.IconMenuItem("Options", "options", Color4.White, true)) { options.Show(); } if (Theme.IconMenuItem("Resources", "resources", Color4.White, true)) { AddTab(new ResourcesTab(this, Resources, MissingResources, ReferencedMaterials, ReferencedTextures)); } if (Theme.IconMenuItem("Import Collada", "import", Color4.White, true)) { string input; if ((input = FileDialog.Open(ColladaFilters)) != null) { StartLoadingSpinner(); new Thread(() => { List <ColladaObject> dae = null; try { dae = ColladaSupport.Parse(input); EnsureUIThread(() => FinishColladaLoad(dae, System.IO.Path.GetFileName(input))); } catch (Exception ex) { EnsureUIThread(() => ColladaError(ex)); } }).Start(); } } if (Theme.IconMenuItem("Generate Icon", "genicon", Color4.White, true)) { string input; if ((input = FileDialog.Open(ImageFilter)) != null) { gen3dbDlg.Open(input); } } if (Theme.IconMenuItem("Infocard Browser", "browse", Color4.White, true)) { string input; if ((input = FileDialog.Open(FreelancerIniFilter)) != null) { AddTab(new InfocardBrowserTab(input, this)); } } if (ImGui.MenuItem("Projectile Viewer")) { if (ProjectileViewer.Create(this, out var pj)) { tabs.Add(pj); } } ImGui.EndMenu(); } if (ImGui.BeginMenu("Help")) { if (Theme.IconMenuItem("Topics", "help", Color4.White, true)) { Shell.OpenCommand("https://wiki.librelancer.net/lanceredit:lanceredit"); } if (Theme.IconMenuItem("About", "about", Color4.White, true)) { openAbout = true; } ImGui.EndMenu(); } options.Draw(); if (openAbout) { ImGui.OpenPopup("About"); openAbout = false; } if (openError) { ImGui.OpenPopup("Error"); openError = false; } if (openLoading) { ImGui.OpenPopup("Processing"); openLoading = false; } bool pOpen = true; if (ImGui.BeginPopupModal("Error", ref pOpen, ImGuiWindowFlags.AlwaysAutoResize)) { ImGui.Text("Error:"); errorText.InputTextMultiline("##etext", new Vector2(430, 200), ImGuiInputTextFlags.ReadOnly); if (ImGui.Button("OK")) { ImGui.CloseCurrentPopup(); } ImGui.EndPopup(); } pOpen = true; if (ImGui.BeginPopupModal("About", ref pOpen, ImGuiWindowFlags.AlwaysAutoResize)) { ImGui.SameLine(ImGui.GetWindowWidth() / 2 - 64); Theme.Icon("reactor_128", Color4.White); CenterText(Version); CenterText("Callum McGing 2018-2020"); ImGui.Separator(); CenterText("Icons from Icons8: https://icons8.com/"); CenterText("Icons from komorra: https://opengameart.org/content/kmr-editor-icon-set"); ImGui.Separator(); var btnW = ImGui.CalcTextSize("OK").X + ImGui.GetStyle().FramePadding.X * 2; ImGui.Dummy(Vector2.One); ImGui.SameLine(ImGui.GetWindowWidth() / 2 - (btnW / 2)); if (ImGui.Button("OK")) { ImGui.CloseCurrentPopup(); } ImGui.EndPopup(); } pOpen = true; if (ImGuiExt.BeginModalNoClose("Processing", ImGuiWindowFlags.AlwaysAutoResize)) { ImGuiExt.Spinner("##spinner", 10, 2, ImGuiNative.igGetColorU32(ImGuiCol.ButtonHovered, 1)); ImGui.SameLine(); ImGui.Text("Processing"); if (finishLoading) { ImGui.CloseCurrentPopup(); } ImGui.EndPopup(); } //Confirmation if (doConfirm) { ImGui.OpenPopup("Confirm?##mainwindow"); doConfirm = false; } pOpen = true; if (ImGui.BeginPopupModal("Confirm?##mainwindow", ref pOpen, ImGuiWindowFlags.AlwaysAutoResize)) { ImGui.Text(confirmText); if (ImGui.Button("Yes")) { confirmAction(); ImGui.CloseCurrentPopup(); } ImGui.SameLine(); if (ImGui.Button("No")) { ImGui.CloseCurrentPopup(); } ImGui.EndPopup(); } var menu_height = ImGui.GetWindowSize().Y; ImGui.EndMainMenuBar(); var size = ImGui.GetIO().DisplaySize; size.Y -= menu_height; //Window MissingResources.Clear(); ReferencedMaterials.Clear(); ReferencedTextures.Clear(); foreach (var tab in tabs) { ((EditorTab)tab).DetectResources(MissingResources, ReferencedMaterials, ReferencedTextures); } ImGui.SetNextWindowSize(new Vector2(size.X, size.Y - 25), ImGuiCond.Always); ImGui.SetNextWindowPos(new Vector2(0, menu_height), ImGuiCond.Always, Vector2.Zero); bool childopened = true; ImGui.Begin("tabwindow", ref childopened, ImGuiWindowFlags.NoTitleBar | ImGuiWindowFlags.NoSavedSettings | ImGuiWindowFlags.NoBringToFrontOnFocus | ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoResize); TabHandler.TabLabels(tabs, ref selected); var totalH = ImGui.GetWindowHeight(); if (showLog) { ImGuiExt.SplitterV(2f, ref h1, ref h2, 8, 8, -1); h1 = totalH - h2 - 24f; if (tabs.Count > 0) { h1 -= 20f; } ImGui.BeginChild("###tabcontent" + (selected != null ? selected.RenderTitle : ""), new Vector2(-1, h1), false, ImGuiWindowFlags.None); } else { ImGui.BeginChild("###tabcontent" + (selected != null ? selected.RenderTitle : "")); } if (selected != null) { selected.Draw(); ((EditorTab)selected).SetActiveTab(this); } else { ActiveTab = null; } ImGui.EndChild(); if (showLog) { ImGui.BeginChild("###log", new Vector2(-1, h2), false, ImGuiWindowFlags.None); ImGui.Text("Log"); ImGui.SameLine(ImGui.GetWindowWidth() - 20); if (Theme.IconButton("closelog", "x", Color4.White)) { showLog = false; } logBuffer.InputTextMultiline("##logtext", new Vector2(-1, h2 - 24), ImGuiInputTextFlags.ReadOnly); ImGui.EndChild(); } ImGui.End(); gen3dbDlg.Draw(); //Status bar ImGui.SetNextWindowSize(new Vector2(size.X, 25f), ImGuiCond.Always); ImGui.SetNextWindowPos(new Vector2(0, size.Y - 6f), ImGuiCond.Always, Vector2.Zero); bool sbopened = true; ImGui.Begin("statusbar", ref sbopened, ImGuiWindowFlags.NoTitleBar | ImGuiWindowFlags.NoSavedSettings | ImGuiWindowFlags.NoBringToFrontOnFocus | ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoResize); if (updateTime > 9) { updateTime = 0; frequency = RenderFrequency; } else { updateTime++; } string activename = ActiveTab == null ? "None" : ActiveTab.DocumentName; string utfpath = ActiveTab == null ? "None" : ActiveTab.GetUtfPath(); #if DEBUG const string statusFormat = "FPS: {0} | {1} Materials | {2} Textures | Active: {3} - {4}"; #else const string statusFormat = "{1} Materials | {2} Textures | Active: {3} - {4}"; #endif ImGui.Text(string.Format(statusFormat, (int)Math.Round(frequency), Resources.MaterialDictionary.Count, Resources.TextureDictionary.Count, activename, utfpath)); ImGui.End(); if (errorTimer > 0) { ImGuiExt.ToastText("An error has occurred\nCheck the log for details", new Color4(21, 21, 22, 128), Color4.Red); } ImGui.PopFont(); if (lastFrame == null || lastFrame.Width != Width || lastFrame.Height != Height) { if (lastFrame != null) { lastFrame.Dispose(); } lastFrame = new RenderTarget2D(Width, Height); } RenderState.RenderTarget = lastFrame; RenderState.ClearColor = new Color4(0.2f, 0.2f, 0.2f, 1f); RenderState.ClearAll(); guiHelper.Render(RenderState); RenderState.RenderTarget = null; lastFrame.BlitToScreen(); foreach (var tab in toAdd) { tabs.Add(tab); selected = tab; } toAdd.Clear(); }
protected override void Draw(double elapsed) { EnableTextInput(); Viewport.Replace(0, 0, Width, Height); RenderState.ClearColor = new Color4(0.2f, 0.2f, 0.2f, 1f); RenderState.ClearAll(); guiHelper.NewFrame(elapsed); ImGui.PushFont(ImGuiHelper.Noto); ImGui.BeginMainMenuBar(); if (ImGui.BeginMenu("File")) { if (ImGui.MenuItem("New", "Ctrl-N", false, true)) { var t = new UtfTab(this, new EditableUtf(), "Untitled"); ActiveTab = t; tabs.Add(t); } if (ImGui.MenuItem("Open", "Ctrl-O", false, true)) { var f = FileDialog.Open(); if (f != null && DetectFileType.Detect(f) == FileType.Utf) { var t = new UtfTab(this, new EditableUtf(f), System.IO.Path.GetFileName(f)); ActiveTab = t; tabs.Add(t); } } if (ActiveTab == null) { ImGui.MenuItem("Save", "Ctrl-S", false, false); } else { if (ImGui.MenuItem(string.Format("Save '{0}'", ActiveTab.Title), "Ctrl-S", false, true)) { var f = FileDialog.Save(); if (f != null) { ActiveTab.Title = System.IO.Path.GetFileName(f); ActiveTab.Utf.Save(f); } } } if (ImGui.MenuItem("Quit", "Ctrl-Q", false, true)) { Exit(); } ImGui.EndMenu(); } if (ImGui.BeginMenu("Tools")) { if (ImGui.MenuItem("Resources")) { tabs.Add(new ResourcesTab(Resources, MissingResources, ReferencedMaterials, ReferencedTextures)); } ImGui.EndMenu(); } if (ImGui.BeginMenu("Help")) { if (ImGui.MenuItem("About")) { openAbout = true; } ImGui.EndMenu(); } if (openAbout) { ImGui.OpenPopup("About"); openAbout = false; } if (ImGui.BeginPopupModal("About", WindowFlags.AlwaysAutoResize)) { ImGui.Text("LancerEdit"); ImGui.Text("Callum McGing 2018"); if (ImGui.Button("OK")) { ImGui.CloseCurrentPopup(); } ImGui.EndPopup(); } var menu_height = ImGui.GetWindowSize().Y; ImGui.EndMainMenuBar(); var size = (Vector2)ImGui.GetIO().DisplaySize; size.Y -= menu_height; //Window ImGuiExt.RootDock(0, menu_height, size.X, size.Y - 25); MissingResources.Clear(); ReferencedMaterials.Clear(); ReferencedTextures.Clear(); foreach (var tab in tabs) { tab.DetectResources(MissingResources, ReferencedMaterials, ReferencedTextures); } for (int i = 0; i < tabs.Count; i++) { if (!tabs[i].Draw()) //No longer open { if (tabs[i] is UtfTab && ((UtfTab)tabs[i]) == ActiveTab) { ActiveTab = null; } tabs[i].Dispose(); tabs.RemoveAt(i); i--; } } //Status bar ImGui.SetNextWindowSize(new Vector2(size.X, 25f), Condition.Always); ImGui.SetNextWindowPos(new Vector2(0, size.Y - 6f), Condition.Always, Vector2.Zero); bool sbopened = true; ImGui.BeginWindow("statusbar", ref sbopened, WindowFlags.NoTitleBar | WindowFlags.NoSavedSettings | WindowFlags.NoBringToFrontOnFocus | WindowFlags.NoMove | WindowFlags.NoResize); if (updateTime > 9) { updateTime = 0; frequency = RenderFrequency; } else { updateTime++; } string activename = ActiveTab == null ? "None" : ActiveTab.Title; string utfpath = ActiveTab == null ? "None" : ActiveTab.GetUtfPath(); ImGui.Text(string.Format("FPS: {0} | {1} Materials | {2} Textures | Active: {3} - {4}", (int)Math.Round(frequency), Resources.MaterialDictionary.Count, Resources.TextureDictionary.Count, activename, utfpath)); ImGui.EndWindow(); ImGui.PopFont(); guiHelper.Render(RenderState); foreach (var tab in toAdd) { tabs.Add(tab); } toAdd.Clear(); }
protected override void Draw(double elapsed) { EnableTextInput(); Viewport.Replace(0, 0, Width, Height); RenderState.ClearColor = new Color4(0.2f, 0.2f, 0.2f, 1f); RenderState.ClearAll(); guiHelper.NewFrame(elapsed); ImGui.PushFont(ImGuiHelper.Noto); ImGui.BeginMainMenuBar(); if (ImGui.BeginMenu("File")) { if (Theme.IconMenuItem("New", "new", Color4.White, true)) { var t = new UtfTab(this, new EditableUtf(), "Untitled"); ActiveTab = t; AddTab(t); } if (Theme.IconMenuItem("Open", "open", Color4.White, true)) { var f = FileDialog.Open(); if (f != null && DetectFileType.Detect(f) == FileType.Utf) { var t = new UtfTab(this, new EditableUtf(f), System.IO.Path.GetFileName(f)); ActiveTab = t; AddTab(t); } } if (ActiveTab == null) { Theme.IconMenuItem("Save", "save", Color4.LightGray, false); } else { if (Theme.IconMenuItem(string.Format("Save '{0}'", ActiveTab.Title), "save", Color4.White, true)) { var f = FileDialog.Save(); if (f != null) { ActiveTab.Title = System.IO.Path.GetFileName(f); ActiveTab.Utf.Save(f); } } } if (Theme.IconMenuItem("Quit", "quit", Color4.White, true)) { Exit(); } ImGui.EndMenu(); } if (ImGui.BeginMenu("Tools")) { if (ImGui.MenuItem("Resources")) { tabs.Add(new ResourcesTab(Resources, MissingResources, ReferencedMaterials, ReferencedTextures)); } ImGui.EndMenu(); } if (ImGui.BeginMenu("Help")) { if (Theme.IconMenuItem("About", "about", Color4.White, true)) { openAbout = true; } ImGui.EndMenu(); } if (openAbout) { ImGui.OpenPopup("About"); openAbout = false; } if (ImGui.BeginPopupModal("About", WindowFlags.AlwaysAutoResize)) { ImGui.Text("LancerEdit"); ImGui.Text("Callum McGing 2018"); ImGui.Separator(); ImGui.Text("Icons from Icons8: https://icons8.com/"); ImGui.Text("Icons from komorra: https://opengameart.org/content/kmr-editor-icon-set"); ImGui.Separator(); if (ImGui.Button("OK")) { ImGui.CloseCurrentPopup(); } ImGui.EndPopup(); } var menu_height = ImGui.GetWindowSize().Y; ImGui.EndMainMenuBar(); var size = (Vector2)ImGui.GetIO().DisplaySize; size.Y -= menu_height; //Window MissingResources.Clear(); ReferencedMaterials.Clear(); ReferencedTextures.Clear(); foreach (var tab in tabs) { tab.DetectResources(MissingResources, ReferencedMaterials, ReferencedTextures); } ImGui.SetNextWindowSize(new Vector2(size.X, size.Y - 25), Condition.Always); ImGui.SetNextWindowPos(new Vector2(0, menu_height), Condition.Always, Vector2.Zero); bool childopened = true; ImGui.BeginWindow("tabwindow", ref childopened, WindowFlags.NoTitleBar | WindowFlags.NoSavedSettings | WindowFlags.NoBringToFrontOnFocus | WindowFlags.NoMove | WindowFlags.NoResize); TabHandler.TabLabels(tabs, ref selected); ImGui.BeginChild("###tabcontent"); if (selected != null) { selected.Draw(); selected.SetActiveTab(this); } else { ActiveTab = null; } ImGui.EndChild(); TabHandler.DrawTabDrag(tabs); ImGui.EndWindow(); //Status bar ImGui.SetNextWindowSize(new Vector2(size.X, 25f), Condition.Always); ImGui.SetNextWindowPos(new Vector2(0, size.Y - 6f), Condition.Always, Vector2.Zero); bool sbopened = true; ImGui.BeginWindow("statusbar", ref sbopened, WindowFlags.NoTitleBar | WindowFlags.NoSavedSettings | WindowFlags.NoBringToFrontOnFocus | WindowFlags.NoMove | WindowFlags.NoResize); if (updateTime > 9) { updateTime = 0; frequency = RenderFrequency; } else { updateTime++; } string activename = ActiveTab == null ? "None" : ActiveTab.Title; string utfpath = ActiveTab == null ? "None" : ActiveTab.GetUtfPath(); ImGui.Text(string.Format("FPS: {0} | {1} Materials | {2} Textures | Active: {3} - {4}", (int)Math.Round(frequency), Resources.MaterialDictionary.Count, Resources.TextureDictionary.Count, activename, utfpath)); ImGui.EndWindow(); ImGui.PopFont(); guiHelper.Render(RenderState); foreach (var tab in toAdd) { tabs.Add(tab); selected = tab; } toAdd.Clear(); }
protected override void Draw(double elapsed) { EnableTextInput(); Viewport.Replace(0, 0, Width, Height); RenderState.ClearColor = new Color4(0.2f, 0.2f, 0.2f, 1f); RenderState.ClearAll(); guiHelper.NewFrame(elapsed); ImGui.PushFont(ImGuiHelper.Noto); ImGui.BeginMainMenuBar(); if (ImGui.BeginMenu("File")) { if (Theme.IconMenuItem("New", "new", Color4.White, true)) { var t = new UtfTab(this, new EditableUtf(), "Untitled"); ActiveTab = t; AddTab(t); } if (Theme.IconMenuItem("Open", "open", Color4.White, true)) { var f = FileDialog.Open(UtfFilters); if (f != null && DetectFileType.Detect(f) == FileType.Utf) { var t = new UtfTab(this, new EditableUtf(f), System.IO.Path.GetFileName(f)); ActiveTab = t; AddTab(t); } } if (ActiveTab == null) { Theme.IconMenuItem("Save", "save", Color4.LightGray, false); } else { if (Theme.IconMenuItem(string.Format("Save '{0}'", ActiveTab.DocumentName), "save", Color4.White, true)) { var f = FileDialog.Save(UtfFilters); if (f != null) { ActiveTab.DocumentName = System.IO.Path.GetFileName(f); ActiveTab.UpdateTitle(); ActiveTab.Utf.Save(f); } } } if (Theme.IconMenuItem("Quit", "quit", Color4.White, true)) { Exit(); } ImGui.EndMenu(); } bool openerror = false; if (ImGui.BeginMenu("Tools")) { if (ImGui.MenuItem("Options")) { showOptions = true; } if (ImGui.MenuItem("Log")) { showLog = true; } if (ImGui.MenuItem("Resources")) { AddTab(new ResourcesTab(Resources, MissingResources, ReferencedMaterials, ReferencedTextures)); } if (ImGui.MenuItem("Import Collada")) { string input; if ((input = FileDialog.Open(ColladaFilters)) != null) { List <ColladaObject> dae = null; try { dae = ColladaSupport.Parse(input); AddTab(new ColladaTab(dae, System.IO.Path.GetFileName(input), this)); } catch (Exception ex) { if (errorText != null) { errorText.Dispose(); } var str = "Import Error:\n" + ex.Message + "\n" + ex.StackTrace; errorText = new TextBuffer(); errorText.SetText(str); openerror = true; } } } ImGui.EndMenu(); } if (ImGui.BeginMenu("Help")) { if (Theme.IconMenuItem("About", "about", Color4.White, true)) { openAbout = true; } ImGui.EndMenu(); } if (openAbout) { ImGui.OpenPopup("About"); openAbout = false; } if (openerror) { ImGui.OpenPopup("Error"); } if (ImGui.BeginPopupModal("Error", WindowFlags.AlwaysAutoResize)) { ImGui.Text("Error:"); ImGui.InputTextMultiline("##etext", errorText.Pointer, (uint)errorText.Size, new Vector2(430, 200), InputTextFlags.ReadOnly, errorText.Callback); if (ImGui.Button("OK")) { ImGui.CloseCurrentPopup(); } ImGui.EndPopup(); } if (ImGui.BeginPopupModal("About", WindowFlags.AlwaysAutoResize)) { ImGui.Text("LancerEdit"); ImGui.Text("Callum McGing 2018"); ImGui.Separator(); ImGui.Text("Icons from Icons8: https://icons8.com/"); ImGui.Text("Icons from komorra: https://opengameart.org/content/kmr-editor-icon-set"); ImGui.Separator(); if (ImGui.Button("OK")) { ImGui.CloseCurrentPopup(); } ImGui.EndPopup(); } var menu_height = ImGui.GetWindowSize().Y; ImGui.EndMainMenuBar(); var size = (Vector2)ImGui.GetIO().DisplaySize; size.Y -= menu_height; //Window MissingResources.Clear(); ReferencedMaterials.Clear(); ReferencedTextures.Clear(); foreach (var tab in tabs) { tab.DetectResources(MissingResources, ReferencedMaterials, ReferencedTextures); } ImGui.SetNextWindowSize(new Vector2(size.X, size.Y - 25), Condition.Always); ImGui.SetNextWindowPos(new Vector2(0, menu_height), Condition.Always, Vector2.Zero); bool childopened = true; ImGui.BeginWindow("tabwindow", ref childopened, WindowFlags.NoTitleBar | WindowFlags.NoSavedSettings | WindowFlags.NoBringToFrontOnFocus | WindowFlags.NoMove | WindowFlags.NoResize); TabHandler.TabLabels(tabs, ref selected); var totalH = ImGui.GetWindowHeight(); if (showLog) { ImGuiExt.SplitterV(2f, ref h1, ref h2, 8, 8, -1); h1 = totalH - h2 - 24f; if (tabs.Count > 0) { h1 -= 20f; } ImGui.BeginChild("###tabcontent" + (selected != null ? selected.Title : ""), new Vector2(-1, h1), false, WindowFlags.Default); } else { ImGui.BeginChild("###tabcontent" + (selected != null ? selected.Title : "")); } if (selected != null) { selected.Draw(); selected.SetActiveTab(this); } else { ActiveTab = null; } ImGui.EndChild(); TabHandler.DrawTabDrag(tabs); if (showLog) { ImGui.BeginChild("###log", new Vector2(-1, h2), false, WindowFlags.Default); ImGui.Text("Log"); ImGui.SameLine(ImGui.GetWindowWidth() - 20); if (Theme.IconButton("closelog", "x", Color4.White)) { showLog = false; } ImGui.InputTextMultiline("##logtext", logBuffer.Pointer, 32768, new Vector2(-1, h2 - 24), InputTextFlags.ReadOnly, logBuffer.Callback); ImGui.EndChild(); } ImGui.EndWindow(); //Status bar ImGui.SetNextWindowSize(new Vector2(size.X, 25f), Condition.Always); ImGui.SetNextWindowPos(new Vector2(0, size.Y - 6f), Condition.Always, Vector2.Zero); bool sbopened = true; ImGui.BeginWindow("statusbar", ref sbopened, WindowFlags.NoTitleBar | WindowFlags.NoSavedSettings | WindowFlags.NoBringToFrontOnFocus | WindowFlags.NoMove | WindowFlags.NoResize); if (updateTime > 9) { updateTime = 0; frequency = RenderFrequency; } else { updateTime++; } string activename = ActiveTab == null ? "None" : ActiveTab.DocumentName; string utfpath = ActiveTab == null ? "None" : ActiveTab.GetUtfPath(); ImGui.Text(string.Format("FPS: {0} | {1} Materials | {2} Textures | Active: {3} - {4}", (int)Math.Round(frequency), Resources.MaterialDictionary.Count, Resources.TextureDictionary.Count, activename, utfpath)); ImGui.EndWindow(); if (showOptions) { ImGui.BeginWindow("Options", ref showOptions, WindowFlags.AlwaysAutoResize); var pastC = cFilter; ImGui.Combo("Texture Filter", ref cFilter, filters); if (cFilter != pastC) { switch (cFilter) { case 0: RenderState.PreferredFilterLevel = TextureFiltering.Linear; break; case 1: RenderState.PreferredFilterLevel = TextureFiltering.Bilinear; break; case 2: RenderState.PreferredFilterLevel = TextureFiltering.Trilinear; break; default: RenderState.AnisotropyLevel = anisotropyLevels[cFilter - 3]; RenderState.PreferredFilterLevel = TextureFiltering.Anisotropic; break; } } ImGui.EndWindow(); } ImGui.PopFont(); guiHelper.Render(RenderState); foreach (var tab in toAdd) { tabs.Add(tab); selected = tab; } toAdd.Clear(); }
public override bool Draw() { //Child Window var size = ImGui.GetWindowSize(); ImGui.BeginChild("##utfchild", new Vector2(size.X - 15, size.Y - 50), false, 0); //Layout if (selectedNode != null) { ImGui.Columns(2, "NodeColumns", true); } //Headers ImGui.Separator(); ImGui.Text("Nodes"); if (selectedNode != null) { ImGui.NextColumn(); ImGui.Text("Node Information"); ImGui.NextColumn(); } ImGui.Separator(); //Tree ImGui.BeginChild("##scroll", false, 0); var flags = selectedNode == Utf.Root ? TreeNodeFlags.Selected | tflags : tflags; var isOpen = ImGui.TreeNodeEx("/", flags); if (ImGuiNative.igIsItemClicked(0)) { selectedNode = Utf.Root; } ImGui.PushID("/##ROOT"); DoNodeMenu("/##ROOT", Utf.Root, null); ImGui.PopID(); if (isOpen) { for (int i = 0; i < Utf.Root.Children.Count; i++) { DoNode(Utf.Root.Children[i], Utf.Root, i); } ImGui.TreePop(); } ImGui.EndChild(); //End Tree if (selectedNode != null) { //Node preview ImGui.NextColumn(); NodeInformation(); } //Action Bar ImGui.EndChild(); ImGui.Separator(); if (ImGui.Button("Actions")) { ImGui.OpenPopup("actions"); } if (ImGui.BeginPopup("actions")) { if (ImGui.MenuItem("View Model")) { IDrawable drawable = null; try { drawable = LibreLancer.Utf.UtfLoader.GetDrawable(Utf.Export(), main.Resources); drawable.Initialize(main.Resources); } catch (Exception) { ErrorPopup("Could not open as model"); drawable = null; } if (drawable != null) { main.AddTab(new ModelViewer("Model Viewer (" + DocumentName + ")", DocumentName, drawable, main, this)); } } if (ImGui.MenuItem("Dump Model")) { LibreLancer.Utf.Cmp.ModelFile model = null; LibreLancer.Utf.Cmp.CmpFile cmp = null; try { var drawable = LibreLancer.Utf.UtfLoader.GetDrawable(Utf.Export(), main.Resources); model = (drawable as LibreLancer.Utf.Cmp.ModelFile); cmp = (drawable as LibreLancer.Utf.Cmp.CmpFile); } catch (Exception) { ErrorPopup("Could not open as model"); model = null; } if (model != null) { var output = FileDialog.Save(); if (output != null) { DumpStatus(DumpObject.DumpObj(model, output)); } } if (cmp != null) { dumpcmp = cmp; DoPickObject(); } } if (ImGui.MenuItem("View Ale")) { AleFile ale = null; try { ale = new AleFile(Utf.Export()); } catch (Exception) { ErrorPopup("Could not open as ale"); ale = null; } if (ale != null) { main.AddTab(new AleViewer("Ale Viewer (" + Title + ")", Title, ale, main)); } } if (ImGui.MenuItem("Refresh Resources")) { main.Resources.RemoveResourcesForId(Unique.ToString()); main.Resources.AddResources(Utf.Export(), Unique.ToString()); } ImGui.EndPopup(); } Popups(); return(open); }
protected override void Draw(double elapsed) { //Don't process all the imgui stuff when it isn't needed if (!loadingSpinnerActive && !guiHelper.DoRender(elapsed)) { if (lastFrame != null) { lastFrame.BlitToScreen(); } WaitForEvent(); //Yield like a regular GUI program return; } TimeStep = elapsed; RenderContext.ReplaceViewport(0, 0, Width, Height); RenderContext.ClearColor = new Color4(0.2f, 0.2f, 0.2f, 1f); RenderContext.ClearAll(); guiHelper.NewFrame(elapsed); ImGui.PushFont(ImGuiHelper.Noto); ImGui.BeginMainMenuBar(); if (ImGui.BeginMenu("File")) { var lst = ImGui.GetWindowDrawList(); if (Theme.IconMenuItem(Icons.File, "New", true)) { var t = new UtfTab(this, new EditableUtf(), "Untitled"); ActiveTab = t; AddTab(t); } if (Theme.IconMenuItem(Icons.Open, "Open", true)) { var f = FileDialog.Open(UtfFilters); OpenFile(f); } recentFiles.Menu(); if (ActiveTab == null) { Theme.IconMenuItem(Icons.Save, "Save", false); Theme.IconMenuItem(Icons.Save, "Save As", false); } else { if (Theme.IconMenuItem(Icons.Save, string.Format("Save '{0}'", ActiveTab.DocumentName), true)) { Save(); } if (Theme.IconMenuItem(Icons.Save, "Save As", true)) { SaveAs(); } } if (Theme.IconMenuItem(Icons.Quit, "Quit", true)) { Exit(); } ImGui.EndMenu(); } if (ImGui.BeginMenu("View")) { Theme.IconMenuToggle(Icons.Log, "Log", ref showLog, true); ImGui.EndMenu(); } if (ImGui.BeginMenu("Tools")) { if (Theme.IconMenuItem(Icons.Cog, "Options", true)) { options.Show(); } if (Theme.IconMenuItem(Icons.Palette, "Resources", true)) { AddTab(new ResourcesTab(this, Resources, MissingResources, ReferencedMaterials, ReferencedTextures)); } if (Theme.IconMenuItem(Icons.FileImport, "Import Model", true)) { string input; if ((input = FileDialog.Open(ImportModelFilters)) != null) { StartLoadingSpinner(); new Thread(() => { SimpleMesh.Model model = null; try { using var stream = File.OpenRead(input); model = SimpleMesh.Model.FromStream(stream).AutoselectRoot(out _).ApplyRootTransforms(false).CalculateBounds(); foreach (var x in model.Geometries) { if (x.Vertices.Length >= 65534) { throw new Exception("Too many vertices"); } if (x.Indices.Length >= 65534) { throw new Exception("Too many indices"); } } EnsureUIThread(() => FinishImporterLoad(model, System.IO.Path.GetFileName(input))); } catch (Exception ex) { EnsureUIThread(() => ImporterError(ex)); } }).Start(); } } if (Theme.IconMenuItem(Icons.SprayCan, "Generate Icon", true)) { string input; if ((input = FileDialog.Open(ImageFilter)) != null) { Make3dbDlg.Open(input); } } if (Theme.IconMenuItem(Icons.BookOpen, "Infocard Browser", true)) { string input; if ((input = FileDialog.Open(FreelancerIniFilter)) != null) { AddTab(new InfocardBrowserTab(input, this)); } } if (ImGui.MenuItem("Projectile Viewer")) { if (ProjectileViewer.Create(this, out var pj)) { tabs.Add(pj); } } if (ImGui.MenuItem("ParamCurve Visualiser")) { tabs.Add(new ParamCurveVis()); } ImGui.EndMenu(); } if (ImGui.BeginMenu("Window")) { if (ImGui.MenuItem("Close All Tabs", tabs.Count > 0)) { Confirm("Are you sure you want to close all tabs?", () => { selected = null; foreach (var t in tabs) { t.Dispose(); } tabs.Clear(); }); } ImGui.EndMenu(); } if (ImGui.BeginMenu("Scripts")) { if (ImGui.MenuItem("Refresh")) { LoadScripts(); } ImGui.Separator(); int k = 0; foreach (var sc in Scripts) { var n = ImGuiExt.IDWithExtra(sc.Info.Name, k++); if (ImGui.MenuItem(n)) { RunScript(sc); } } ImGui.EndMenu(); } if (ImGui.BeginMenu("Help")) { if (Theme.IconMenuItem(Icons.Book, "Topics", true)) { var selfPath = Path.GetDirectoryName(typeof(MainWindow).Assembly.Location); var helpFile = Path.Combine(selfPath, "Docs", "index.html"); Shell.OpenCommand(helpFile); } if (Theme.IconMenuItem(Icons.Info, "About", true)) { openAbout = true; } ImGui.EndMenu(); } options.Draw(); if (openAbout) { ImGui.OpenPopup("About"); openAbout = false; } if (openError) { ImGui.OpenPopup("Error"); openError = false; } if (openLoading) { ImGui.OpenPopup("Processing"); openLoading = false; } for (int i = activeScripts.Count - 1; i >= 0; i--) { if (!activeScripts[i].Draw()) { activeScripts.RemoveAt(i); } } bool pOpen = true; if (ImGui.BeginPopupModal("Error", ref pOpen, ImGuiWindowFlags.AlwaysAutoResize)) { ImGui.Text("Error:"); errorText.InputTextMultiline("##etext", new Vector2(430, 200), ImGuiInputTextFlags.ReadOnly); if (ImGui.Button("OK")) { ImGui.CloseCurrentPopup(); } ImGui.EndPopup(); } recentFiles.DrawErrors(); pOpen = true; if (ImGui.BeginPopupModal("About", ref pOpen, ImGuiWindowFlags.AlwaysAutoResize)) { ImGui.SameLine(ImGui.GetWindowWidth() / 2 - 64); ImGui.Image((IntPtr)logoTexture, new Vector2(128), new Vector2(0, 1), new Vector2(1, 0)); CenterText(Version); CenterText("Callum McGing 2018-2022"); ImGui.Separator(); var btnW = ImGui.CalcTextSize("OK").X + ImGui.GetStyle().FramePadding.X * 2; ImGui.Dummy(Vector2.One); ImGui.SameLine(ImGui.GetWindowWidth() / 2 - (btnW / 2)); if (ImGui.Button("OK")) { ImGui.CloseCurrentPopup(); } ImGui.EndPopup(); } pOpen = true; if (ImGuiExt.BeginModalNoClose("Processing", ImGuiWindowFlags.AlwaysAutoResize)) { ImGuiExt.Spinner("##spinner", 10, 2, ImGui.GetColorU32(ImGuiCol.ButtonHovered, 1)); ImGui.SameLine(); ImGui.Text("Processing"); if (finishLoading) { ImGui.CloseCurrentPopup(); } ImGui.EndPopup(); } //Confirmation if (doConfirm) { ImGui.OpenPopup("Confirm?##mainwindow"); doConfirm = false; } pOpen = true; if (ImGui.BeginPopupModal("Confirm?##mainwindow", ref pOpen, ImGuiWindowFlags.AlwaysAutoResize)) { ImGui.Text(confirmText); if (ImGui.Button("Yes")) { confirmAction(); ImGui.CloseCurrentPopup(); } ImGui.SameLine(); if (ImGui.Button("No")) { ImGui.CloseCurrentPopup(); } ImGui.EndPopup(); } var menu_height = ImGui.GetWindowSize().Y; ImGui.EndMainMenuBar(); var size = ImGui.GetIO().DisplaySize; size.Y -= menu_height; //Window MissingResources.Clear(); ReferencedMaterials.Clear(); ReferencedTextures.Clear(); foreach (var tab in tabs) { ((EditorTab)tab).DetectResources(MissingResources, ReferencedMaterials, ReferencedTextures); } ImGui.SetNextWindowSize(new Vector2(size.X, size.Y - (25 * ImGuiHelper.Scale)), ImGuiCond.Always); ImGui.SetNextWindowPos(new Vector2(0, menu_height), ImGuiCond.Always, Vector2.Zero); bool childopened = true; ImGui.Begin("tabwindow", ref childopened, ImGuiWindowFlags.NoTitleBar | ImGuiWindowFlags.NoSavedSettings | ImGuiWindowFlags.NoBringToFrontOnFocus | ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoResize); TabHandler.TabLabels(tabs, ref selected); var totalH = ImGui.GetWindowHeight(); if (showLog) { ImGuiExt.SplitterV(2f, ref h1, ref h2, 8, 8, -1); h1 = totalH - h2 - 24f * ImGuiHelper.Scale; if (tabs.Count > 0) { h1 -= 20f * ImGuiHelper.Scale; } ImGui.BeginChild("###tabcontent" + (selected != null ? selected.RenderTitle : ""), new Vector2(-1, h1), false, ImGuiWindowFlags.None); } else { ImGui.BeginChild("###tabcontent" + (selected != null ? selected.RenderTitle : "")); } if (selected != null) { selected.Draw(); ((EditorTab)selected).SetActiveTab(this); } else { ActiveTab = null; } ImGui.EndChild(); if (showLog) { ImGui.BeginChild("###log", new Vector2(-1, h2), false, ImGuiWindowFlags.None); ImGui.Text("Log"); ImGui.SameLine(ImGui.GetWindowWidth() - 30 * ImGuiHelper.Scale); ImGui.PushStyleVar(ImGuiStyleVar.FramePadding, Vector2.Zero); if (ImGui.Button(Icons.X.ToString())) { showLog = false; } ImGui.PopStyleVar(); logBuffer.InputTextMultiline("##logtext", new Vector2(-1, h2 - 28 * ImGuiHelper.Scale), ImGuiInputTextFlags.ReadOnly); ImGui.EndChild(); } ImGui.End(); Make3dbDlg.Draw(); //Status bar ImGui.SetNextWindowSize(new Vector2(size.X, 25f * ImGuiHelper.Scale), ImGuiCond.Always); ImGui.SetNextWindowPos(new Vector2(0, size.Y - 6f), ImGuiCond.Always, Vector2.Zero); bool sbopened = true; ImGui.Begin("statusbar", ref sbopened, ImGuiWindowFlags.NoTitleBar | ImGuiWindowFlags.NoSavedSettings | ImGuiWindowFlags.NoBringToFrontOnFocus | ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoResize); if (updateTime > 9) { updateTime = 0; frequency = RenderFrequency; } else { updateTime++; } string activename = ActiveTab == null ? "None" : ActiveTab.DocumentName; string utfpath = ActiveTab == null ? "None" : ActiveTab.GetUtfPath(); #if DEBUG const string statusFormat = "FPS: {0} | {1} Materials | {2} Textures | Active: {3} - {4}"; #else const string statusFormat = "{1} Materials | {2} Textures | Active: {3} - {4}"; #endif ImGui.Text(string.Format(statusFormat, (int)Math.Round(frequency), Resources.MaterialDictionary.Count, Resources.TextureDictionary.Count, activename, utfpath)); ImGui.End(); if (errorTimer > 0) { ImGuiExt.ToastText("An error has occurred\nCheck the log for details", new Color4(21, 21, 22, 128), Color4.Red); } ImGui.PopFont(); if (lastFrame == null || lastFrame.Width != Width || lastFrame.Height != Height) { if (lastFrame != null) { lastFrame.Dispose(); } lastFrame = new RenderTarget2D(Width, Height); } RenderContext.RenderTarget = lastFrame; RenderContext.ClearColor = new Color4(0.2f, 0.2f, 0.2f, 1f); RenderContext.ClearAll(); guiHelper.Render(RenderContext); RenderContext.RenderTarget = null; lastFrame.BlitToScreen(); foreach (var tab in toAdd) { tabs.Add(tab); selected = tab; } toAdd.Clear(); }
public override void Draw() { //Child Window var size = ImGui.GetWindowSize(); ImGui.BeginChild("##utfchild", new Vector2(size.X - 15, size.Y - 50), false, 0); //Layout if (selectedNode != null) { ImGui.Columns(2, "NodeColumns", true); } //Headers ImGui.Separator(); ImGui.Text("Nodes"); if (selectedNode != null) { ImGui.NextColumn(); ImGui.Text("Node Information"); ImGui.NextColumn(); } ImGui.Separator(); //Tree ImGui.BeginChild("##scroll"); var flags = selectedNode == Utf.Root ? ImGuiTreeNodeFlags.Selected | tflags : tflags; var isOpen = ImGui.TreeNodeEx("/", flags); if (ImGui.IsItemClicked(0)) { selectedNode = Utf.Root; } ImGui.PushID("/##ROOT"); DoNodeMenu("/##ROOT", Utf.Root, null); ImGui.PopID(); if (isOpen) { for (int i = 0; i < Utf.Root.Children.Count; i++) { DoNode(Utf.Root.Children[i], Utf.Root, i); } ImGui.TreePop(); } ImGui.EndChild(); //End Tree if (selectedNode != null) { //Node preview ImGui.NextColumn(); NodeInformation(); } //Action Bar ImGui.EndChild(); ImGui.Separator(); if (ImGui.Button("Actions")) { ImGui.OpenPopup("actions"); } if (ImGui.BeginPopup("actions")) { if (ImGui.MenuItem("View Model")) { IDrawable drawable = null; ModelNodes hpn = new ModelNodes(); try { drawable = LibreLancer.Utf.UtfLoader.GetDrawable(Utf.Export(), main.Resources); drawable.Initialize(main.Resources); if (Utf.Root.Children.Any((x) => x.Name.Equals("cmpnd", StringComparison.OrdinalIgnoreCase))) { foreach (var child in Utf.Root.Children.Where((x) => x.Name.EndsWith(".3db", StringComparison.OrdinalIgnoreCase))) { var n = new ModelHpNode(); n.Name = child.Name; n.Node = child; n.HardpointsNode = child.Children.FirstOrDefault((x) => x.Name.Equals("hardpoints", StringComparison.OrdinalIgnoreCase)); hpn.Nodes.Add(n); } var cmpnd = Utf.Root.Children.First((x) => x.Name.Equals("cmpnd", StringComparison.OrdinalIgnoreCase)); hpn.Cons = cmpnd.Children.FirstOrDefault((x) => x.Name.Equals("cons", StringComparison.OrdinalIgnoreCase)); } else { var n = new ModelHpNode(); n.Name = "ROOT"; n.Node = Utf.Root; n.HardpointsNode = Utf.Root.Children.FirstOrDefault((x) => x.Name.Equals("hardpoints", StringComparison.OrdinalIgnoreCase)); hpn.Nodes.Add(n); } } catch (Exception ex) { ErrorPopup("Could not open as model\n" + ex.Message + "\n" + ex.StackTrace); drawable = null; } if (drawable != null) { main.AddTab(new ModelViewer(DocumentName, drawable, main, this, hpn)); } } if (ImGui.MenuItem("Export Collada")) { LibreLancer.Utf.Cmp.ModelFile model = null; LibreLancer.Utf.Cmp.CmpFile cmp = null; try { var drawable = LibreLancer.Utf.UtfLoader.GetDrawable(Utf.Export(), main.Resources); model = (drawable as LibreLancer.Utf.Cmp.ModelFile); cmp = (drawable as LibreLancer.Utf.Cmp.CmpFile); } catch (Exception) { ErrorPopup("Could not open as model"); model = null; } if (model != null) { var output = FileDialog.Save(); if (output != null) { model.Path = DocumentName; try { ColladaExport.ExportCollada(model, main.Resources, output); } catch (Exception ex) { ErrorPopup("Error\n" + ex.Message + "\n" + ex.StackTrace); } } } if (cmp != null) { var output = FileDialog.Save(); if (output != null) { cmp.Path = DocumentName; try { ColladaExport.ExportCollada(cmp, main.Resources, output); } catch (Exception ex) { ErrorPopup("Error\n" + ex.Message + "\n" + ex.StackTrace); } } } } if (ImGui.MenuItem("View Ale")) { AleFile ale = null; try { ale = new AleFile(Utf.Export()); } catch (Exception) { ErrorPopup("Could not open as ale"); ale = null; } if (ale != null) { main.AddTab(new AleViewer(Title, ale, main)); } } if (ImGui.MenuItem("Resolve Audio Hashes")) { var folder = FileDialog.ChooseFolder(); if (folder != null) { var idtable = new IDTable(folder); foreach (var n in Utf.Root.IterateAll()) { if (n.Name.StartsWith("0x")) { uint v; if (uint.TryParse(n.Name.Substring(2), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out v)) { idtable.UtfNicknameTable.TryGetValue(v, out n.ResolvedName); } } else { n.ResolvedName = null; } } } } ImGui.EndPopup(); } ImGui.SameLine(); if (ImGui.Button("Reload Resources")) { main.Resources.RemoveResourcesForId(Unique.ToString()); main.Resources.AddResources(Utf.Export(), Unique.ToString()); } Popups(); }
unsafe void NodeInformation() { ImGui.BeginChild("##scrollnode"); ImGui.Text("Name: " + selectedNode.Name); if (selectedNode.Children != null) { ImGui.Text(selectedNode.Children.Count + " children"); if (selectedNode != Utf.Root) { ImGui.Separator(); ImGui.Text("Actions:"); if (ImGui.Button("Add Data")) { Confirm("Adding data will delete this node's children. Continue?", () => { selectedNode.Children = null; selectedNode.Data = new byte[0]; }); } if (ImGui.Button("Import Data")) { ImGui.OpenPopup("importactions"); } if (ImGui.BeginPopup("importactions")) { if (ImGui.MenuItem("File")) { Confirm("Importing data will delete this node's children. Continue?", () => { string path; if ((path = FileDialog.Open()) != null) { selectedNode.Children = null; selectedNode.Data = File.ReadAllBytes(path); } }); } if (ImGui.MenuItem("Texture")) { Confirm("Importing data will delete this node's children. Continue?", () => { ImportTexture(); }); } ImGui.EndPopup(); } if (selectedNode.Name.StartsWith("joint map", StringComparison.OrdinalIgnoreCase)) { if (ImGui.Button("View Joint Map")) { JointMapView jmv; if ((jmv = JointMapView.Create(selectedNode)) != null) { jointViews.Add(jmv); } } ; } if (selectedNode.Name.StartsWith("object map", StringComparison.OrdinalIgnoreCase)) { if (ImGui.Button("View Object Map")) { JointMapView jmv; if ((jmv = JointMapView.Create(selectedNode)) != null) { jointViews.Add(jmv); } } ; } } } else if (selectedNode.Data != null) { ImGui.Text(string.Format("Size: {0}", LibreLancer.DebugDrawing.SizeSuffix(selectedNode.Data.Length))); ImGui.Separator(); if (selectedNode.Data.Length > 0) { ImGui.Text("Previews:"); //String Preview ImGui.Text("String:"); ImGui.SameLine(); ImGui.InputText("##strpreview", selectedNode.Data, (uint)Math.Min(selectedNode.Data.Length, 32), ImGuiInputTextFlags.ReadOnly, DummyCallback); //Float Preview ImGui.Text("Float:"); fixed(byte *ptr = selectedNode.Data) { for (int i = 0; i < 4 && (i < selectedNode.Data.Length / 4); i++) { ImGui.SameLine(); ImGui.Text(((float *)ptr)[i].ToString()); } } //Int Preview ImGui.Text("Int:"); fixed(byte *ptr = selectedNode.Data) { for (int i = 0; i < 4 && (i < selectedNode.Data.Length / 4); i++) { ImGui.SameLine(); ImGui.Text(((int *)ptr)[i].ToString()); } } } else { ImGui.Text("Empty Data"); } ImGui.Separator(); ImGui.Text("Actions:"); if (ImGui.Button("Edit")) { ImGui.OpenPopup("editactions"); } if (ImGui.BeginPopup("editactions")) { if (ImGui.MenuItem("String Editor")) { if (selectedNode.Data.Length > 255) { popups.OpenPopup("Confirm?##stringedit"); } else { text.SetBytes(selectedNode.Data, selectedNode.Data.Length); popups.OpenPopup("String Editor"); } } if (ImGui.MenuItem("Hex Editor")) { hexdata = new byte[selectedNode.Data.Length]; selectedNode.Data.CopyTo(hexdata, 0); mem = new MemoryEditor(); popups.OpenPopup("Hex Editor"); } if (ImGui.MenuItem("Float Editor")) { floats = new float[selectedNode.Data.Length / 4]; for (int i = 0; i < selectedNode.Data.Length / 4; i++) { floats[i] = BitConverter.ToSingle(selectedNode.Data, i * 4); } floatEditor = true; } if (ImGui.MenuItem("Int Editor")) { ints = new int[selectedNode.Data.Length / 4]; for (int i = 0; i < selectedNode.Data.Length / 4; i++) { ints[i] = BitConverter.ToInt32(selectedNode.Data, i * 4); } intEditor = true; } if (ImGui.MenuItem("Color Picker")) { var len = selectedNode.Data.Length / 4; if (len < 3) { pickcolor4 = true; color4 = Color4.Black; } else if (len == 3) { pickcolor4 = false; color3 = new Vector3( BitConverter.ToSingle(selectedNode.Data, 0), BitConverter.ToSingle(selectedNode.Data, 4), BitConverter.ToSingle(selectedNode.Data, 8)); } else if (len > 3) { pickcolor4 = true; color4 = new Vector4( BitConverter.ToSingle(selectedNode.Data, 0), BitConverter.ToSingle(selectedNode.Data, 4), BitConverter.ToSingle(selectedNode.Data, 8), BitConverter.ToSingle(selectedNode.Data, 12)); } popups.OpenPopup("Color Picker"); } ImGui.EndPopup(); } ImGui.NextColumn(); if (ImGui.Button("Texture Viewer")) { Texture tex = null; try { using (var stream = new MemoryStream(selectedNode.Data)) { tex = LibreLancer.ImageLib.Generic.FromStream(stream); } var title = string.Format("{0} ({1})", selectedNode.Name, Title); if (tex is Texture2D tex2d) { var tab = new TextureViewer(title, tex2d, null); main.AddTab(tab); } else if (tex is TextureCube texcube) { var tab = new CubemapViewer(title, texcube, main); main.AddTab(tab); } } catch (Exception ex) { #if DEBUG throw; #else ErrorPopup("Node data couldn't be opened as texture:\n" + ex.Message); #endif } } if (ImGui.Button("Play Audio")) { var data = main.Audio.AllocateData(); using (var stream = new MemoryStream(selectedNode.Data)) { main.Audio.PlayStream(stream); } } if (ImGui.Button("Import Data")) { ImGui.OpenPopup("importactions"); } if (ImGui.BeginPopup("importactions")) { if (ImGui.MenuItem("File")) { string path; if ((path = FileDialog.Open()) != null) { selectedNode.Data = File.ReadAllBytes(path); } } if (ImGui.MenuItem("Texture")) { ImportTexture(); } ImGui.EndPopup(); } if (ImGui.Button("Export Data")) { if (selectedNode.Name.ToLowerInvariant() == "vmeshdata") { ImGui.OpenPopup("exportactions"); } else { string path; if ((path = FileDialog.Save()) != null) { File.WriteAllBytes(path, selectedNode.Data); } } } if (ImGui.BeginPopup("exportactions")) { if (ImGui.MenuItem("Raw")) { string path; if ((path = FileDialog.Save()) != null) { File.WriteAllBytes(path, selectedNode.Data); } } if (ImGui.MenuItem("VMeshData")) { string path; if ((path = FileDialog.Save()) != null) { LibreLancer.Utf.Vms.VMeshData dat = null; try { dat = new LibreLancer.Utf.Vms.VMeshData(new ArraySegment <byte>(selectedNode.Data), new EmptyLib(), ""); } catch (Exception ex) { ErrorPopup(string.Format("Not a valid VMeshData node\n{0}\n{1}", ex.Message, ex.StackTrace)); } if (dat != null) { DumpObject.DumpVmeshData(path, dat); } } } ImGui.EndPopup(); } } else { ImGui.Text("Empty"); ImGui.Separator(); ImGui.Text("Actions:"); if (ImGui.Button("Add Data")) { selectedNode.Data = new byte[0]; } if (ImGui.Button("Import Data")) { ImGui.OpenPopup("importactions"); } if (ImGui.BeginPopup("importactions")) { if (ImGui.MenuItem("File")) { string path; if ((path = FileDialog.Open()) != null) { selectedNode.Data = File.ReadAllBytes(path); } } if (ImGui.MenuItem("Texture")) { ImportTexture(); } ImGui.EndPopup(); } } var removeJmv = new List <JointMapView>(); foreach (var jm in jointViews) { if (!jm.Draw()) { removeJmv.Add(jm); } } foreach (var jmv in removeJmv) { jointViews.Remove(jmv); } ImGui.EndChild(); }
protected override void Draw(double elapsed) { TimeStep = elapsed; Viewport.Replace(0, 0, Width, Height); RenderState.ClearColor = new Color4(0.2f, 0.2f, 0.2f, 1f); RenderState.ClearAll(); guiHelper.NewFrame(elapsed); ImGui.PushFont(ImGuiHelper.Noto); ImGui.BeginMainMenuBar(); if (ImGui.BeginMenu("File")) { if (Theme.IconMenuItem("New", "new", Color4.White, true)) { var t = new UtfTab(this, new EditableUtf(), "Untitled"); ActiveTab = t; AddTab(t); } if (Theme.IconMenuItem("Open", "open", Color4.White, true)) { var f = FileDialog.Open(UtfFilters); OpenFile(f); } if (ActiveTab == null) { Theme.IconMenuItem("Save", "save", Color4.LightGray, false); } else { if (Theme.IconMenuItem(string.Format("Save '{0}'", ActiveTab.DocumentName), "save", Color4.White, true)) { var f = FileDialog.Save(UtfFilters); if (f != null) { ActiveTab.DocumentName = System.IO.Path.GetFileName(f); ActiveTab.UpdateTitle(); string errText = ""; if (!ActiveTab.Utf.Save(f, ref errText)) { openError = true; if (errorText == null) { errorText = new TextBuffer(); } errorText.SetText(errText); } } } } if (Theme.IconMenuItem("Quit", "quit", Color4.White, true)) { Exit(); } ImGui.EndMenu(); } bool openLoading = false; if (ImGui.BeginMenu("View")) { Theme.IconMenuToggle("Log", "log", Color4.White, ref showLog, true); ImGui.EndMenu(); } if (ImGui.BeginMenu("Tools")) { if (Theme.IconMenuItem("Options", "options", Color4.White, true)) { showOptions = true; } if (Theme.IconMenuItem("Resources", "resources", Color4.White, true)) { AddTab(new ResourcesTab(Resources, MissingResources, ReferencedMaterials, ReferencedTextures)); } if (Theme.IconMenuItem("Import Collada", "import", Color4.White, true)) { string input; if ((input = FileDialog.Open(ColladaFilters)) != null) { openLoading = true; finishLoading = false; new Thread(() => { List <ColladaObject> dae = null; try { dae = ColladaSupport.Parse(input); EnsureUIThread(() => FinishColladaLoad(dae, System.IO.Path.GetFileName(input))); } catch (Exception ex) { EnsureUIThread(() => ColladaError(ex)); } }).Start(); } } ImGui.EndMenu(); } if (ImGui.BeginMenu("Help")) { if (Theme.IconMenuItem("Topics", "help", Color4.White, true)) { Shell.OpenCommand("https://wiki.librelancer.net/lanceredit:lanceredit"); } if (Theme.IconMenuItem("About", "about", Color4.White, true)) { openAbout = true; } ImGui.EndMenu(); } if (openAbout) { ImGui.OpenPopup("About"); openAbout = false; } if (openError) { ImGui.OpenPopup("Error"); openError = false; } if (openLoading) { ImGui.OpenPopup("Processing"); } bool pOpen = true; if (ImGui.BeginPopupModal("Error", ref pOpen, ImGuiWindowFlags.AlwaysAutoResize)) { ImGui.Text("Error:"); errorText.InputTextMultiline("##etext", new Vector2(430, 200), ImGuiInputTextFlags.ReadOnly); if (ImGui.Button("OK")) { ImGui.CloseCurrentPopup(); } ImGui.EndPopup(); } pOpen = true; if (ImGui.BeginPopupModal("About", ref pOpen, ImGuiWindowFlags.AlwaysAutoResize)) { ImGui.SameLine(ImGui.GetWindowWidth() / 2 - 64); Theme.Icon("reactor_128", Color4.White); CenterText(Version); CenterText("Callum McGing 2018-2019"); ImGui.Separator(); CenterText("Icons from Icons8: https://icons8.com/"); CenterText("Icons from komorra: https://opengameart.org/content/kmr-editor-icon-set"); ImGui.Separator(); var btnW = ImGui.CalcTextSize("OK").X + ImGui.GetStyle().FramePadding.X * 2; ImGui.Dummy(Vector2.One); ImGui.SameLine(ImGui.GetWindowWidth() / 2 - (btnW / 2)); if (ImGui.Button("OK")) { ImGui.CloseCurrentPopup(); } ImGui.EndPopup(); } pOpen = true; if (ImGui.BeginPopupModal("Processing", ref pOpen, ImGuiWindowFlags.AlwaysAutoResize)) { ImGuiExt.Spinner("##spinner", 10, 2, ImGuiNative.igGetColorU32(ImGuiCol.ButtonHovered, 1)); ImGui.SameLine(); ImGui.Text("Processing"); if (finishLoading) { ImGui.CloseCurrentPopup(); } ImGui.EndPopup(); } var menu_height = ImGui.GetWindowSize().Y; ImGui.EndMainMenuBar(); var size = (Vector2)ImGui.GetIO().DisplaySize; size.Y -= menu_height; //Window MissingResources.Clear(); ReferencedMaterials.Clear(); ReferencedTextures.Clear(); foreach (var tab in tabs) { ((EditorTab)tab).DetectResources(MissingResources, ReferencedMaterials, ReferencedTextures); } ImGui.SetNextWindowSize(new Vector2(size.X, size.Y - 25), ImGuiCond.Always); ImGui.SetNextWindowPos(new Vector2(0, menu_height), ImGuiCond.Always, Vector2.Zero); bool childopened = true; ImGui.Begin("tabwindow", ref childopened, ImGuiWindowFlags.NoTitleBar | ImGuiWindowFlags.NoSavedSettings | ImGuiWindowFlags.NoBringToFrontOnFocus | ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoResize); TabHandler.TabLabels(tabs, ref selected); var totalH = ImGui.GetWindowHeight(); if (showLog) { ImGuiExt.SplitterV(2f, ref h1, ref h2, 8, 8, -1); h1 = totalH - h2 - 24f; if (tabs.Count > 0) { h1 -= 20f; } ImGui.BeginChild("###tabcontent" + (selected != null ? selected.Title : ""), new Vector2(-1, h1), false, ImGuiWindowFlags.None); } else { ImGui.BeginChild("###tabcontent" + (selected != null ? selected.Title : "")); } if (selected != null) { selected.Draw(); ((EditorTab)selected).SetActiveTab(this); } else { ActiveTab = null; } ImGui.EndChild(); TabHandler.DrawTabDrag(tabs); if (showLog) { ImGui.BeginChild("###log", new Vector2(-1, h2), false, ImGuiWindowFlags.None); ImGui.Text("Log"); ImGui.SameLine(ImGui.GetWindowWidth() - 20); if (Theme.IconButton("closelog", "x", Color4.White)) { showLog = false; } logBuffer.InputTextMultiline("##logtext", new Vector2(-1, h2 - 24), ImGuiInputTextFlags.ReadOnly); ImGui.EndChild(); } ImGui.End(); //Status bar ImGui.SetNextWindowSize(new Vector2(size.X, 25f), ImGuiCond.Always); ImGui.SetNextWindowPos(new Vector2(0, size.Y - 6f), ImGuiCond.Always, Vector2.Zero); bool sbopened = true; ImGui.Begin("statusbar", ref sbopened, ImGuiWindowFlags.NoTitleBar | ImGuiWindowFlags.NoSavedSettings | ImGuiWindowFlags.NoBringToFrontOnFocus | ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoResize); if (updateTime > 9) { updateTime = 0; frequency = RenderFrequency; } else { updateTime++; } string activename = ActiveTab == null ? "None" : ActiveTab.DocumentName; string utfpath = ActiveTab == null ? "None" : ActiveTab.GetUtfPath(); ImGui.Text(string.Format("FPS: {0} | {1} Materials | {2} Textures | Active: {3} - {4}", (int)Math.Round(frequency), Resources.MaterialDictionary.Count, Resources.TextureDictionary.Count, activename, utfpath)); ImGui.End(); if (errorTimer > 0) { ImGuiExt.ToastText("An error has occurred\nCheck the log for details", new Color4(21, 21, 22, 128), Color4.Red); } if (showOptions) { ImGui.Begin("Options", ref showOptions, ImGuiWindowFlags.AlwaysAutoResize); var pastC = cFilter; ImGui.Combo("Texture Filter", ref cFilter, filters, filters.Length); if (cFilter != pastC) { switch (cFilter) { case 0: RenderState.PreferredFilterLevel = TextureFiltering.Linear; break; case 1: RenderState.PreferredFilterLevel = TextureFiltering.Bilinear; break; case 2: RenderState.PreferredFilterLevel = TextureFiltering.Trilinear; break; default: RenderState.AnisotropyLevel = anisotropyLevels[cFilter - 3]; RenderState.PreferredFilterLevel = TextureFiltering.Anisotropic; break; } } ImGui.End(); } ImGui.PopFont(); guiHelper.Render(RenderState); foreach (var tab in toAdd) { tabs.Add(tab); selected = tab; } toAdd.Clear(); }
protected override void Draw(double elapsed) { EnableTextInput(); RenderState.SetViewport(0, 0, Width, Height); RenderState.ClearColor = new Color4(0.2f, 0.2f, 0.2f, 1f); RenderState.ClearAll(); guiHelper.NewFrame(elapsed); ImGui.PushFont(ImGuiHelper.Noto); ImGui.BeginMainMenuBar(); if (ImGui.BeginMenu("File")) { if (ImGui.MenuItem("Open", "Ctrl-O", false, true)) { var f = FileDialog.Open(); if (f != null && DetectFileType.Detect(f) == FileType.Utf) { tabs.Add(new UtfTab(this, new EditableUtf(f), System.IO.Path.GetFileName(f))); } } if (ImGui.MenuItem("Quit", "Ctrl-Q", false, true)) { Exit(); } ImGui.EndMenu(); } if (ImGui.BeginMenu("Help")) { if (ImGui.MenuItem("About")) { openAbout = true; } ImGui.EndMenu(); } if (openAbout) { ImGui.OpenPopup("About"); openAbout = false; } if (ImGui.BeginPopupModal("About")) { ImGui.Text("LancerEdit"); ImGui.Text("Callum McGing 2018"); if (ImGui.Button("OK")) { ImGui.CloseCurrentPopup(); } ImGui.EndPopup(); } var menu_height = ImGui.GetWindowSize().Y; ImGui.EndMainMenuBar(); var size = (Vector2)ImGui.GetIO().DisplaySize; size.Y -= menu_height; ImGuiExt.RootDock(0, menu_height, size.X, size.Y - 25f); for (int i = 0; i < tabs.Count; i++) { if (!tabs[i].Draw()) //No longer open { tabs[i].Dispose(); tabs.RemoveAt(i); i--; } } //Status bar ImGui.SetNextWindowSize(new Vector2(size.X, 25f), Condition.Always); ImGui.SetNextWindowPos(new Vector2(0, size.Y - 6f), Condition.Always, Vector2.Zero); bool sbopened = true; ImGui.BeginWindow("statusbar", ref sbopened, WindowFlags.NoTitleBar | WindowFlags.NoSavedSettings | WindowFlags.NoBringToFrontOnFocus | WindowFlags.NoMove | WindowFlags.NoResize); if (updateTime > 9) { updateTime = 0; frequency = RenderFrequency; } else { updateTime++; } ImGui.Text(string.Format("FPS: {0}", (int)Math.Round(frequency))); ImGui.EndWindow(); ImGui.PopFont(); guiHelper.Render(RenderState); }
void HierachyPanel() { if (!(drawable is DF.DfmFile) && !(drawable is SphFile)) { //Sur if (ImGui.Button("Open Sur")) { var file = FileDialog.Open(SurFilters); surname = System.IO.Path.GetFileName(file); LibreLancer.Physics.Sur.SurFile sur; try { using (var f = System.IO.File.OpenRead(file)) { sur = new LibreLancer.Physics.Sur.SurFile(f); } } catch (Exception) { sur = null; } if (sur != null) { ProcessSur(sur); } } if (surs != null) { ImGui.Separator(); ImGui.Text("Sur: " + surname); ImGui.Checkbox("Show Hull", ref surShowHull); ImGui.Checkbox("Show Hardpoints", ref surShowHps); ImGui.Separator(); } } if (ImGui.Button("Apply Hardpoints")) { if (drawable is CmpFile) { var cmp = (CmpFile)drawable; foreach (var kv in cmp.Models) { var node = hprefs.Nodes.Where((x) => x.Name == kv.Key).First(); node.HardpointsToNodes(kv.Value.Hardpoints); } } else if (drawable is ModelFile) { hprefs.Nodes[0].HardpointsToNodes(((ModelFile)drawable).Hardpoints); } popups.OpenPopup("Apply Complete"); } if ((drawable is CmpFile) && ((CmpFile)drawable).Parts.Count > 1 && ImGui.Button("Apply Parts")) { WriteConstructs(); popups.OpenPopup("Apply Complete##Parts"); } if (ImGuiExt.ToggleButton("Filter", doFilter)) { doFilter = !doFilter; } if (doFilter) { ImGui.InputText("##filter", filterText.Pointer, (uint)filterText.Size, ImGuiInputTextFlags.None, filterText.Callback); currentFilter = filterText.GetText(); } else { currentFilter = null; } ImGui.Separator(); if (selectedNode != null) { ImGui.Text(selectedNode.Con.ChildName); ImGui.Text(selectedNode.Con.GetType().Name); ImGui.Text("Origin: " + selectedNode.Con.Origin.ToString()); var euler = selectedNode.Con.Rotation.GetEuler(); ImGui.Text(string.Format("Rotation: (Pitch {0:0.000}, Yaw {1:0.000}, Roll {2:0.000})", MathHelper.RadiansToDegrees(euler.X), MathHelper.RadiansToDegrees(euler.Y), MathHelper.RadiansToDegrees(euler.Z))); ImGui.Separator(); } if (ImGui.TreeNodeEx(ImGuiExt.Pad("Root"), ImGuiTreeNodeFlags.DefaultOpen)) { Theme.RenderTreeIcon("Root", "tree", Color4.DarkGreen); foreach (var n in cons) { DoConstructNode(n); } if (!(drawable is SphFile)) { DoModel(rootModel, null); } ImGui.TreePop(); } else { Theme.RenderTreeIcon("Root", "tree", Color4.DarkGreen); } }