diff --git a/project/code/TMV/Model.cs b/project/code/TMV/Model.cs index d653d37..8a7a26f 100644 --- a/project/code/TMV/Model.cs +++ b/project/code/TMV/Model.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.IO; using Godot; @@ -36,6 +37,7 @@ public partial class Model : Node3D MatchCasing = MatchCasing.CaseInsensitive, RecurseSubdirectories = true, }; + var textures = new List(); foreach (var material in modelFile.Materials) { var paths = Directory.GetFiles(baseDir, material.Name, options); @@ -44,33 +46,52 @@ public partial class Model : Node3D var texture = TextureLoader.LoadTexture(paths[0]); var saveName = material.Name.GetBaseName() + ".png"; texture.GetImage().SavePng(ProjectSettings.GlobalizePath($"user://debug/{saveName}")); + textures.Add(texture); } - var vertices = new List(); - var indices = new List(); - - foreach (var v in modelFile.Vertices) + var mat = new StandardMaterial3D { - vertices.Add(v.ToGodotVec3()); - } + AlbedoTexture = textures[0] + }; + // TODO: Support multiple materials and colour based materials + var surfaceData = new MeshSurfaceData(); foreach (var poly in modelFile.Polygons) { - for (var i = 1; i < poly.VertexCount - 1; i++) + var vertices = new List(); + var normal = modelFile.Normals[poly.Normal].ToGodotVec3(); + var uvs = new List(); + for (var i = 0; i < poly.VertexCount; i++) { - indices.Add(poly.VertexIndices[0]); - indices.Add(poly.VertexIndices[i]); - indices.Add(poly.VertexIndices[i + 1]); - } - } + var vertex = modelFile.Vertices[poly.VertexIndices[i]]; + vertices.Add(vertex.ToGodotVec3()); + if (i < poly.UvIndices.Length) + { + var uv = modelFile.Uvs[poly.UvIndices[i]]; + uvs.Add(new Vector2(uv.X, uv.Y)); + } + else + { + var uv = (i % 4) switch + { + 0 => new Vector2(0, 0), + 1 => new Vector2(0, 1), + 2 => new Vector2(1, 0), + 3 => new Vector2(1, 1), + _ => throw new NotImplementedException(), + }; + uvs.Add(uv); + } - var array = new Array(); - array.Resize((int)Mesh.ArrayType.Max); - array[(int)Mesh.ArrayType.Vertex] = vertices.ToArray(); - array[(int)Mesh.ArrayType.Index] = indices.ToArray(); + } + + surfaceData.AddPolygon(vertices, normal, uvs, uvs); + } + var array = surfaceData.BuildSurfaceArray(); var mesh = new ArrayMesh(); mesh.AddSurfaceFromArrays(Mesh.PrimitiveType.Triangles, array); + mesh.SurfaceSetMaterial(0, mat); var meshInstance = new MeshInstance3D { Mesh = mesh }; AddChild(meshInstance);