using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.IO; using Switch_Toolbox.Library.Forms; using Switch_Toolbox.Library; using System.Windows.Forms; using FirstPlugin.Turbo.CourseMuuntStructs; using GL_EditorFramework.EditorDrawables; using OpenTK; using OpenTK.Graphics.OpenGL; namespace FirstPlugin.Forms { public partial class TurboMunntEditor : UserControl, IViewportContainer { Viewport viewport; GLControl2D viewport2D; bool IsLoaded = false; public TurboMunntEditor() { InitializeComponent(); stTabControl1.myBackColor = FormThemes.BaseTheme.FormBackColor; treeView1.BackColor = FormThemes.BaseTheme.FormBackColor; treeView1.ForeColor = FormThemes.BaseTheme.FormForeColor; viewport = new Viewport(); viewport.Dock = DockStyle.Fill; viewport.scene.SelectionChanged += Scene_SelectionChanged; stPanel4.Controls.Add(viewport); viewport2D = new GLControl2D(); viewport2D.Dock = DockStyle.Fill; stPanel3.Controls.Add(viewport2D); } public Viewport GetViewport() => viewport; public void UpdateViewport() { if (viewport != null) viewport.UpdateViewport(); } public AnimationPanel GetAnimationPanel() => null; CourseMuuntScene scene; public void LoadCourseInfo(System.Collections.IEnumerable by, string FilePath) { string CourseFolder = System.IO.Path.GetDirectoryName(FilePath); scene = new CourseMuuntScene(by); if (File.Exists($"{CourseFolder}/course_kcl.szs")) scene.AddRenderableKcl($"{CourseFolder}/course_kcl.szs"); if (File.Exists($"{CourseFolder}/course.kcl")) scene.AddRenderableKcl($"{CourseFolder}/course.kcl"); if (File.Exists($"{CourseFolder}/course_model.szs")) { scene.AddRenderableBfres($"{CourseFolder}/course_model.szs"); } viewport.AddDrawable(new GL_EditorFramework.EditorDrawables.SingleObject(new OpenTK.Vector3(0))); viewport.LoadObjects(); treeView1.Nodes.Add("Scene"); if (scene.LapPaths.Count > 0) { AddPathDrawable("Lap Path", scene.LapPaths,Color.Blue); } if (scene.GravityPaths.Count > 0) { AddPathDrawable("Gravity Path", scene.GravityPaths, Color.Purple); } if (scene.EnemyPaths.Count > 0) { AddPathDrawable("Enemy Path", scene.EnemyPaths, Color.Red); } if (scene.GlidePaths.Count > 0) { AddPathDrawable("Glide Path", scene.GlidePaths, Color.Orange); } if (scene.ItemPaths.Count > 0) { AddPathDrawable("Item Path", scene.ItemPaths, Color.Yellow); } if (scene.PullPaths.Count > 0) { AddPathDrawable("Pull Path", scene.PullPaths, Color.GreenYellow); } if (scene.SteerAssistPaths.Count > 0) { AddPathDrawable("Steer Assist Path", scene.SteerAssistPaths, Color.Green); } if (scene.Paths.Count > 0) { AddPathDrawable("Path", scene.Paths, Color.Black); } if (scene.ObjPaths.Count > 0) { // AddPathDrawable("Object Path", scene.ObjPaths, Color.DarkSeaGreen); } if (scene.JugemPaths.Count > 0) { AddPathDrawable("Jugem Path", scene.JugemPaths, Color.DarkSeaGreen); } if (scene.IntroCameras.Count > 0) { AddPathDrawable("IntroCamera", scene.IntroCameras, Color.Pink); } foreach (var kcl in scene.KclObjects) { viewport.AddDrawable(kcl.Renderer); treeView1.Nodes.Add(kcl); kcl.Checked = true; } foreach (var bfres in scene.BfresObjects) { viewport.AddDrawable(bfres.BFRESRender); treeView1.Nodes.Add(bfres); bfres.Checked = true; } IsLoaded = true; } private void AddPathDrawable(string Name, IEnumerable Groups, Color color, bool CanConnect = true) { } private void AddPathDrawable(string Name, IEnumerable Groups, Color color, bool CanConnect = true) { //Create a connectable object to connect each point var renderablePathConnected = new RenderableConnectedPaths(color); if (Name == "Lap Path" || Name == "Gravity Path") renderablePathConnected.Use4PointConnection = true; if (CanConnect) { viewport.AddDrawable(renderablePathConnected); } //Load a node wrapper to the tree var pathNode = new PathCollectionNode(Name); treeView1.Nodes.Add(pathNode); int groupIndex = 0; foreach (var group in Groups) { if (CanConnect) renderablePathConnected.AddGroup(group); var groupNode = new PathGroupNode($"{Name} Group{groupIndex++}"); pathNode.Nodes.Add(groupNode); int pointIndex = 0; foreach (var path in group.PathPoints) { var pontNode = new PathPointNode($"{Name} Point{pointIndex++}"); pontNode.PathPoint = path; groupNode.Nodes.Add(pontNode); path.OnPathMoved = OnPathMoved; viewport.AddDrawable(path.RenderablePoint); } } } private void OnPathMoved() { stPropertyGrid1.Refresh(); } private void Scene_SelectionChanged(object sender, EventArgs e) { foreach (EditableObject o in viewport.scene.objects) { if (o.IsSelected() && o is RenderablePathPoint) { stPropertyGrid1.LoadProperty(((RenderablePathPoint)o).NodeObject, OnPropertyChanged); } } } private void OnPropertyChanged() { } private void viewIntroCameraToolStripMenuItem_Click(object sender, EventArgs e) { foreach (var camera in scene.IntroCameras) { var pathMove = scene.Paths[camera.Camera_Path]; var pathLookAt = scene.Paths[camera.Camera_AtPath]; for (int p = 0; p < pathMove.PathPoints.Count; p++) { var pathMovePoint = pathMove.PathPoints[p]; var pathLookAtPoint = pathLookAt.PathPoints[p]; } } } private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { List newSelection = new List(); TreeNode node = treeView1.SelectedNode; if (node == null) return; if (node.Text == "Scene") { stPropertyGrid1.LoadProperty(scene, OnPropertyChanged); } else if (node is PathCollectionNode) { foreach (var group in ((PathCollectionNode)node).Nodes) { foreach (var point in ((PathGroupNode)group).Nodes) { newSelection.Add(((PathPointNode)point).PathPoint.RenderablePoint); } } } else if (node is PathGroupNode) { foreach (var point in ((PathGroupNode)node).Nodes) { newSelection.Add(((PathPointNode)point).PathPoint.RenderablePoint); } } else if (node is PathPointNode) { newSelection.Add(((PathPointNode)node).PathPoint.RenderablePoint); } if (newSelection.Count > 0) { viewport.scene.SelectedObjects = newSelection; viewport.UpdateViewport(); } } bool IsParentChecked = false; private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) { if (!IsLoaded || IsParentChecked) return; IsParentChecked = true; CheckChildNodes(e.Node, e.Node.Checked); IsParentChecked = false; //Update viewport on the last node checked viewport.UpdateViewport(); } private void CheckChildNodes(TreeNode node, bool IsChecked) { OnNodeChecked(node, IsChecked); foreach (TreeNode n in node.Nodes) { n.Checked = IsChecked; OnNodeChecked(n, IsChecked); if (n.Nodes.Count > 0) { CheckChildNodes(n, IsChecked); } } } private void OnNodeChecked(TreeNode node, bool IsChecked) { if (node is PathPointNode) ((PathPointNode)node).OnChecked(IsChecked); } } }