Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simple3DViewport submodule and Mdlx Editor update #830

Merged
merged 5 commits into from
Jul 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -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
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
<ProjectReference Include="..\OpenKh.AssimpUtils\OpenKh.AssimpUtils.csproj" />
<ProjectReference Include="..\OpenKh.Command.Bar\OpenKh.Command.Bar.csproj" />
<ProjectReference Include="..\OpenKh.Tools.ImageViewer\OpenKh.Tools.ImageViewer.csproj" />
<ProjectReference Include="..\Simple3DViewport\Simple3DViewport\Simple3DViewport.csproj" />
<PackageReference Include="System.Drawing.Common" Version="7.0.0" />
</ItemGroup>

Expand Down
100 changes: 96 additions & 4 deletions OpenKh.Tools.Kh2MdlxEditor/ViewModels/CollisionV_VM.cs
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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; }
Expand All @@ -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)
{
Expand All @@ -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<GeometryModel3D> meshes = OpenKh.Tools.Kh2MdlxEditor.Utils.Viewport3DUtils.getGeometryFromModel(ModelFile, TextureFile);
List<SimpleMesh> simpleMeshes = new List<SimpleMesh>();
for (int i = 0; i < meshes.Count; i++)
{
simpleMeshes.Add(new SimpleMesh(meshes[i], "MESH_"+i, new List<string> { "MODEL" }));
}
ThisModel = new SimpleModel(simpleMeshes, "MODEL_1", new List<string> { "MODEL" });
}
}
public void loadCollisions()
{
if (CollisionFile != null)
{
Matrix4x4[] boneMatrices = new Matrix4x4[0];

if (ModelFile != null) boneMatrices = GetBoneMatrices(ModelFile.Bones);

List<SimpleMesh> simpleMeshes = new List<SimpleMesh>();

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<string> { "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<string> { "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<string> { "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<string> { "COLLISION", "COLLISION_SINGLE" }
));
}
}

ThisCollisions = new SimpleModel(simpleMeshes, "COLLISIONS_1", new List<string> { "COLLISION", "COLLISION_GROUP" });
}
}
}


public class CollisionWrapper : INotifyPropertyChanged
{
public bool selected { get; set; }
Expand Down
51 changes: 19 additions & 32 deletions OpenKh.Tools.Kh2MdlxEditor/Views/CollisionV_Control.xaml.cs
Original file line number Diff line number Diff line change
@@ -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()
{
Expand All @@ -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<SimpleModel> { 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)
{
Expand All @@ -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<GeometryModel3D> geometry = new List<GeometryModel3D>();

// 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();
}
}
}
10 changes: 10 additions & 0 deletions OpenKh.sln
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions Simple3DViewport
Submodule Simple3DViewport added at 254157
Loading