void ProcessSur(LibreLancer.Physics.Sur.SurFile surfile) { if (surs != null) { foreach (var mdl in surs) { mdl.Vertices.Dispose(); mdl.Elements.Dispose(); } } surs = new List <SurModel>(); if ((drawable is ModelFile)) { surs.Add(GetSurModel(surfile.GetMesh(0, false), null, surPart)); foreach (var hpid in surfile.HardpointIds) { surs.Add(GetSurModel(surfile.GetMesh(hpid, true), null, surHardpoint)); } } else { Dictionary <uint, SurModel> crcLookup = new Dictionary <uint, SurModel>(); foreach (var part in ((CmpFile)drawable).Parts) { crcLookup.Add(CrcTool.FLModelCrc(part.ObjectName), new SurModel() { Part = part }); } foreach (var part in ((CmpFile)drawable).Parts) { var crc = CrcTool.FLModelCrc(part.ObjectName); foreach (var msh in surfile.GetMesh(crc, false)) { AddVertices(crcLookup[msh.ParentCrc], msh); } foreach (var hp in part.Model.Hardpoints) { crc = CrcTool.FLModelCrc(hp.Name); Color4 c = surHardpoint; if (hp.Name.Equals("hpmount", StringComparison.OrdinalIgnoreCase)) { c = surShield; } if (surfile.HardpointIds.Contains(crc)) { surs.Add(GetSurModel(surfile.GetMesh(crc, true), null, c)); } } } foreach (var mdl in crcLookup.Values) { mdl.Vertices = new VertexBuffer(typeof(VertexPositionColor), mdl.BuildVertices.Count); mdl.Vertices.SetData(mdl.BuildVertices.ToArray()); mdl.BuildVertices = null; mdl.Elements = new ElementBuffer(mdl.BuildIndices.Count); mdl.Elements.SetData(mdl.BuildIndices.ToArray()); mdl.Vertices.SetElementBuffer(mdl.Elements); mdl.BuildIndices = null; surs.Add(mdl); } } }
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); } }
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); } }