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