diff --git a/.gitmodules b/.gitmodules index f7d12fe4f..40a2166db 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "nQuant"] path = nQuant url = https://github.com/OpenKH/nQuant.git +[submodule "Simple3DViewport"] + path = Simple3DViewport + url = https://github.com/osdanova/Simple3DViewport.git diff --git a/OpenKh.Tools.Kh2MdlxEditor/OpenKh.Tools.Kh2MdlxEditor.csproj b/OpenKh.Tools.Kh2MdlxEditor/OpenKh.Tools.Kh2MdlxEditor.csproj index 8fe3531f4..6783f18e9 100644 --- a/OpenKh.Tools.Kh2MdlxEditor/OpenKh.Tools.Kh2MdlxEditor.csproj +++ b/OpenKh.Tools.Kh2MdlxEditor/OpenKh.Tools.Kh2MdlxEditor.csproj @@ -20,6 +20,7 @@ + diff --git a/OpenKh.Tools.Kh2MdlxEditor/ViewModels/CollisionV_VM.cs b/OpenKh.Tools.Kh2MdlxEditor/ViewModels/CollisionV_VM.cs index f288524b1..0262beb34 100644 --- a/OpenKh.Tools.Kh2MdlxEditor/ViewModels/CollisionV_VM.cs +++ b/OpenKh.Tools.Kh2MdlxEditor/ViewModels/CollisionV_VM.cs @@ -1,6 +1,6 @@ using OpenKh.Kh2; using OpenKh.Kh2.Models; -using OpenKh.Tools.Kh2MdlxEditor.Utils; +using Simple3DViewport.Objects; using System.Collections.Generic; using System.ComponentModel; using System.Numerics; @@ -12,6 +12,8 @@ namespace OpenKh.Tools.Kh2MdlxEditor.ViewModels { internal class CollisionV_VM { + public SimpleModel ThisModel { get; set; } + public SimpleModel ThisCollisions { get; set; } public ModelSkeletal? ModelFile { get; set; } public ModelTexture? TextureFile { get; set; } public ModelCollision CollisionFile { get; set; } @@ -28,8 +30,11 @@ public CollisionV_VM(ModelCollision collisionFile, ModelSkeletal? modelFile = nu for (int i = 0; i < this.CollisionFile.EntryList.Count; i++) { ObjectCollision collision = this.CollisionFile.EntryList[i]; - Collisions.Add(new CollisionWrapper("Collision " + i, collision)); + Collisions.Add(new CollisionWrapper("COLLISION_" + i, collision)); } + + loadModel(); + loadCollisions(); } public GeometryModel3D getCollisionBox(ObjectCollision collision) { @@ -41,17 +46,104 @@ public GeometryModel3D getCollisionBox(ObjectCollision collision) if (collision.Bone != 16384 && boneMatrices.Length != 0) { basePosition = Vector3.Transform(new Vector3(collision.PositionX, collision.PositionY, collision.PositionZ), boneMatrices[collision.Bone]); - collisionBox = Viewport3DUtils.getCube(collision.Radius, collision.Height, new Vector3D(basePosition.X, basePosition.Y, basePosition.Z), Color.FromArgb(100, 255, 0, 0)); + collisionBox = OpenKh.Tools.Kh2MdlxEditor.Utils.Viewport3DUtils.getCube(collision.Radius, collision.Height, new Vector3D(basePosition.X, basePosition.Y, basePosition.Z), Color.FromArgb(100, 255, 0, 0)); } else { - collisionBox = Viewport3DUtils.getCube(collision.Radius, collision.Height, new Vector3D(basePosition.X, basePosition.Y, basePosition.Z), Color.FromArgb(100, 200, 200, 0)); + collisionBox = OpenKh.Tools.Kh2MdlxEditor.Utils.Viewport3DUtils.getCube(collision.Radius, collision.Height, new Vector3D(basePosition.X, basePosition.Y, basePosition.Z), Color.FromArgb(100, 200, 200, 0)); } return collisionBox; } + + public void loadModel() + { + if (ModelFile != null) + { + List meshes = OpenKh.Tools.Kh2MdlxEditor.Utils.Viewport3DUtils.getGeometryFromModel(ModelFile, TextureFile); + List simpleMeshes = new List(); + for (int i = 0; i < meshes.Count; i++) + { + simpleMeshes.Add(new SimpleMesh(meshes[i], "MESH_"+i, new List { "MODEL" })); + } + ThisModel = new SimpleModel(simpleMeshes, "MODEL_1", new List { "MODEL" }); + } + } + public void loadCollisions() + { + if (CollisionFile != null) + { + Matrix4x4[] boneMatrices = new Matrix4x4[0]; + + if (ModelFile != null) boneMatrices = GetBoneMatrices(ModelFile.Bones); + + List simpleMeshes = new List(); + + for (int i = 0; i < Collisions.Count; i++) + { + ObjectCollision collision = Collisions[i].Collision; + + Vector3 basePosition = Vector3.Zero; + if (collision.Bone != 16384 && boneMatrices.Length != 0) + { + basePosition = Vector3.Transform(new Vector3(collision.PositionX, collision.PositionY, collision.PositionZ), boneMatrices[collision.Bone]); + } + + + Color color = new Color(); + if (collision.Type == (byte)ObjectCollision.TypeEnum.HIT) + { + color = Color.FromArgb(100, 255, 0, 0); + } + else if (collision.Type == (byte)ObjectCollision.TypeEnum.REACTION) + { + color = Color.FromArgb(100, 0, 255, 0); + } + else + { + color = Color.FromArgb(100, 0, 0, 255); + } + + if(collision.Shape == (byte) ObjectCollision.ShapeEnum.ELLIPSOID) + { + simpleMeshes.Add(new SimpleMesh( + Simple3DViewport.Utils.GeometryShapes.getEllipsoid(collision.Radius, collision.Height, 10, new Vector3D(basePosition.X, basePosition.Y, basePosition.Z), color), + "COLLISION_" + i, + new List { "COLLISION", "COLLISION_SINGLE" } + )); + } + else if (collision.Shape == (byte)ObjectCollision.ShapeEnum.COLUMN) + { + simpleMeshes.Add(new SimpleMesh( + Simple3DViewport.Utils.GeometryShapes.getCylinder(collision.Radius, collision.Height, 10, new Vector3D(basePosition.X, basePosition.Y, basePosition.Z), color), + "COLLISION_" + i, + new List { "COLLISION", "COLLISION_SINGLE" } + )); + } + else if (collision.Shape == (byte)ObjectCollision.ShapeEnum.CUBE) + { + simpleMeshes.Add(new SimpleMesh( + Simple3DViewport.Utils.GeometryShapes.getCuboid(collision.Radius, collision.Height, collision.Radius, new Vector3D(basePosition.X, basePosition.Y, basePosition.Z), color), + "COLLISION_" + i, + new List { "COLLISION", "COLLISION_SINGLE" } + )); + } + else if (collision.Shape == (byte)ObjectCollision.ShapeEnum.SPHERE) + { + simpleMeshes.Add(new SimpleMesh( + Simple3DViewport.Utils.GeometryShapes.getSphere(collision.Radius, 10, new Vector3D(basePosition.X, basePosition.Y, basePosition.Z), color), + "COLLISION_" + i, + new List { "COLLISION", "COLLISION_SINGLE" } + )); + } + } + + ThisCollisions = new SimpleModel(simpleMeshes, "COLLISIONS_1", new List { "COLLISION", "COLLISION_GROUP" }); + } + } } + public class CollisionWrapper : INotifyPropertyChanged { public bool selected { get; set; } diff --git a/OpenKh.Tools.Kh2MdlxEditor/Views/CollisionV_Control.xaml.cs b/OpenKh.Tools.Kh2MdlxEditor/Views/CollisionV_Control.xaml.cs index 98f0db296..92975a5c8 100644 --- a/OpenKh.Tools.Kh2MdlxEditor/Views/CollisionV_Control.xaml.cs +++ b/OpenKh.Tools.Kh2MdlxEditor/Views/CollisionV_Control.xaml.cs @@ -1,16 +1,17 @@ using OpenKh.Kh2; using OpenKh.Kh2.Models; -using OpenKh.Tools.Kh2MdlxEditor.Utils; using OpenKh.Tools.Kh2MdlxEditor.ViewModels; +using Simple3DViewport.Controls; +using Simple3DViewport.Objects; using System.Collections.Generic; using System.Windows.Controls; using System.Windows.Input; -using System.Windows.Media.Media3D; namespace OpenKh.Tools.Kh2MdlxEditor.Views { public partial class CollisionV_Control : UserControl { + Simple3DViewport_Control thisViewport { get; set; } CollisionV_VM CollisionVM { get; set; } public CollisionV_Control() { @@ -22,7 +23,20 @@ public CollisionV_Control(ModelCollision collisionFile, ModelSkeletal? modelFile CollisionVM = new CollisionV_VM(collisionFile, modelFile, textureFile); DataContext = CollisionVM; - drawSelectedGroups(); + if(CollisionVM.ThisModel != null) + { + thisViewport = new Simple3DViewport_Control(new List { CollisionVM.ThisModel }); + } + else + { + thisViewport = new Simple3DViewport_Control(); + } + + thisViewport.setOpacityById(0.7, "MODEL_1"); + thisViewport.VPModels.Add(CollisionVM.ThisCollisions); + thisViewport.setVisibilityByLabel(false, "COLLISION_SINGLE"); + + viewportFrame.Content = thisViewport; } public void CollisionList_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { @@ -34,35 +48,8 @@ public void CollisionList_MouseRightButtonUp(object sender, MouseButtonEventArgs CollisionWrapper collision = ((ListViewItem)sender).Content as CollisionWrapper; collisionPropertiesFrame.Content = new CollisionProperties_Control(collision.Collision); collision.Selected_VM = !collision.Selected_VM; - drawSelectedGroups(); - } - - public void drawSelectedGroups() - { - List geometry = new List(); - - // Model - if (CollisionVM.ModelFile != null) { - geometry.AddRange(Viewport3DUtils.getGeometryFromModel(CollisionVM.ModelFile, CollisionVM.TextureFile)); - } - - // Collisions - foreach (CollisionWrapper collision in CollisionVM.Collisions) - { - if (collision.Selected_VM) { - geometry.Add(CollisionVM.getCollisionBox(collision.Collision)); - } - } - - if(viewportFrame.Content == null) - { - viewportFrame.Content = new Viewport_Control(geometry); - } - else - { - viewportFrame.Content = new Viewport_Control(geometry, ((Viewport_Control)viewportFrame.Content).VPCamera); - } - + thisViewport.setVisibilityById(collision.Selected_VM, collision.Name); + thisViewport.render(); } } } diff --git a/OpenKh.sln b/OpenKh.sln index 37ada6981..42b6468e2 100644 --- a/OpenKh.sln +++ b/OpenKh.sln @@ -210,6 +210,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenKh.DeeperTree", "OpenKh EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OpenKh.Command.Txa", "OpenKh.Command.Txa\OpenKh.Command.Txa.csproj", "{EAD6D51F-5106-4E11-A4E4-104A18C0235B}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Simple3DViewport", "Simple3DViewport\Simple3DViewport\Simple3DViewport.csproj", "{CA7DCF50-324E-4C36-B476-49940EBA393A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution .NET Debug|x64 = .NET Debug|x64 @@ -838,6 +840,14 @@ Global {EAD6D51F-5106-4E11-A4E4-104A18C0235B}.Debug|x64.Build.0 = Debug|Any CPU {EAD6D51F-5106-4E11-A4E4-104A18C0235B}.Release|x64.ActiveCfg = Release|Any CPU {EAD6D51F-5106-4E11-A4E4-104A18C0235B}.Release|x64.Build.0 = Release|Any CPU + {CA7DCF50-324E-4C36-B476-49940EBA393A}..NET Debug|x64.ActiveCfg = Debug|Any CPU + {CA7DCF50-324E-4C36-B476-49940EBA393A}..NET Debug|x64.Build.0 = Debug|Any CPU + {CA7DCF50-324E-4C36-B476-49940EBA393A}..NET Release|x64.ActiveCfg = Release|Any CPU + {CA7DCF50-324E-4C36-B476-49940EBA393A}..NET Release|x64.Build.0 = Release|Any CPU + {CA7DCF50-324E-4C36-B476-49940EBA393A}.Debug|x64.ActiveCfg = Debug|Any CPU + {CA7DCF50-324E-4C36-B476-49940EBA393A}.Debug|x64.Build.0 = Debug|Any CPU + {CA7DCF50-324E-4C36-B476-49940EBA393A}.Release|x64.ActiveCfg = Release|Any CPU + {CA7DCF50-324E-4C36-B476-49940EBA393A}.Release|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Simple3DViewport b/Simple3DViewport new file mode 160000 index 000000000..254157cf0 --- /dev/null +++ b/Simple3DViewport @@ -0,0 +1 @@ +Subproject commit 254157cf0825166f75e613f9b49f3393f01bd879