Skip to content

Instantly share code, notes, and snippets.

@Nihlus
Created March 2, 2019 12:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Nihlus/719b3a638d467f8abf74e6c55ec9a626 to your computer and use it in GitHub Desktop.
Save Nihlus/719b3a638d467f8abf74e6c55ec9a626 to your computer and use it in GitHub Desktop.
/// <summary>
/// Converts the given MDX model into an Assimp representation.
/// </summary>
/// <param name="model">The model.</param>
/// <returns>The Assimp representation.</returns>
public static Scene FromMDX(MDX model)
{
var scene = new Scene();
var rootNode = new Node();
scene.RootNode = rootNode;
var modelNode = new Node(model.Name, rootNode);
rootNode.Children.Add(modelNode);
var defaultMaterial = new Material();
scene.Materials.Add(defaultMaterial);
foreach (var skin in model.Skins)
{
var skinNode = new Node($"LOD_{model.Skins.ToList().IndexOf(skin)}", modelNode);
modelNode.Children.Add(skinNode);
var skinVerts = skin.VertexIndices.Select(i => model.Vertices[i]).ToArray();
foreach (var section in skin.Sections)
{
var mesh = new Mesh();
scene.Meshes.Add(mesh);
mesh.MaterialIndex = scene.Materials.IndexOf(defaultMaterial);
var modelBones = model.Bones.Skip(section.StartBoneIndex).Take(section.BoneCount);
foreach (var modelBone in modelBones)
{
var bone = new Bone();
// TODO: Calculate offset matrices
mesh.Bones.Add(bone);
}
var batchNode = new Node($"Section_{skin.Sections.ToList().IndexOf(section)}", skinNode);
skinNode.Children.Add(batchNode);
batchNode.MeshIndices.Add(scene.Meshes.IndexOf(mesh));
var skinVertexIndexes = new Span<ushort>
(
skin.VertexIndices.ToArray(),
section.StartVertexIndex,
section.VertexCount
).ToArray();
mesh.UVComponentCount[0] = 2;
mesh.UVComponentCount[1] = 2;
for (int i = 0; i < skinVertexIndexes.Length; ++i)
{
var localIndex = skinVertexIndexes[i];
var vertex = skinVerts[localIndex];
mesh.Vertices.Add(new Vector3D(vertex.Position.X, vertex.Position.Y, vertex.Position.Z));
mesh.Normals.Add(new Vector3D(vertex.Normal.X, vertex.Normal.Y, vertex.Normal.Z));
mesh.TextureCoordinateChannels[0].Add(new Vector3D(vertex.UV1.X, vertex.UV1.Y, 0.0f));
mesh.TextureCoordinateChannels[1].Add(new Vector3D(vertex.UV2.X, vertex.UV2.Y, 0.0f));
if (mesh.HasBones)
{
for (int boneAttributeIndex = 0; boneAttributeIndex < 4; ++boneAttributeIndex)
{
var bone = mesh.Bones[vertex.BoneIndices[boneAttributeIndex]];
var weight = vertex.BoneWeights[boneAttributeIndex];
bone.VertexWeights.Add(new VertexWeight(i, weight));
}
}
}
var triangleIndexes = new Span<ushort>
(
skin.Triangles.ToArray(),
section.StartTriangleIndex,
section.TriangleCount
).ToArray();
mesh.SetIndices(triangleIndexes.Select(i => (int)i).ToArray(), 3);
}
}
return scene;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment