diff --git a/assets.d b/assets.d index 8a82c3b..7fe8e80 100644 --- a/assets.d +++ b/assets.d @@ -88,12 +88,19 @@ struct AssetInfo AssetType type; } +struct MeshPart +{ + u64 start; + u64 length; +} + struct ModelData { string name; Vertex[] vtx; u32[] idx; MaterialData[] mats; + MeshPart[] parts; } struct MaterialData diff --git a/packer.d b/packer.d index f69275e..1b15a65 100644 --- a/packer.d +++ b/packer.d @@ -75,17 +75,11 @@ struct Texture u32 ch; } -struct MeshGroup -{ - u32 start; - u32 length; -} - union MeshIdx { struct { - u32 v, n, uv; + u32 v, uv, n; }; u32[3] arr; } @@ -95,7 +89,6 @@ struct Model Vertex[] v; u32[] idx; MaterialData[] mats; - MeshGroup[] meshes; } u64 g_asset_count = 0; @@ -469,7 +462,10 @@ OpenFile(string file_name) Model ConvertObj(string file_name) { - import std.array; + /* + TODO: + - Deduplicate vertices + */ u8[] data = OpenFile(file_name); @@ -498,8 +494,6 @@ ConvertObj(string file_name) Vec3[] positions = new Vec3[vcount]; Vec3[] normals = new Vec3[ncount]; Vec2[] uvs = new Vec2[uvcount]; - MeshGroup[] groups = new MeshGroup[gcount]; - Vertex[] vtx = new Vertex[fcount]; MeshIdx[][] idx = []; MaterialData[] mtls = []; @@ -575,6 +569,7 @@ ConvertObj(string file_name) if(tokens[i][0] == "g" && part_idx.length > 0) { idx ~= part_idx; + Logf("%s %s", idx.length, part_idx.length); part_idx = []; continue; } @@ -644,11 +639,77 @@ ConvertObj(string file_name) } } - assert(mtls[mtls.length-1].name == "sp_zid_vani"); + u64 face_count; + foreach(part; idx) + { + face_count += part.length; + } + + positions = Deduplicate(positions, idx, 0); + uvs = Deduplicate(uvs, idx, 1); + normals = Deduplicate(normals, idx, 2); + + ModelData md = { + name: baseName(file_name, ".obj"), + vtx: new Vertex[face_count*3], + }; + + u64 vtx_count = 0; + foreach(part; idx) + { + for(u64 i = 0; i < part.length; i += 1) + { + MeshIdx* mi = part.ptr + i; + + if(mi.v ) md.vtx[vtx_count].pos = positions[mi.v-1]; + if(mi.n ) md.vtx[vtx_count].normal = normals[mi.n-1]; + if(mi.uv) md.vtx[vtx_count].uv = uvs[mi.uv-1]; + + vtx_count += 1; + } + } return model; } +T[] +Deduplicate(T)(T[] values, MeshIdx[][] indices, u32 arr_idx) +{ + u64 dup_count; + for(u64 i = 0; i < values.length; i += 1) + { + for(u64 j = i+1; j < values.length; j += 1) + { + if(values[i] == values[j]) + { + dup_count += 1; + + Logf("before"); + values[j .. $] = values[j+1 .. values.length-1]; + Logf("after"); + + foreach(ref part; indices) + { + for(u64 k = 0; k < part.length; k += 1) + { + if(part[k].arr[arr_idx] > j+1) + { + part[k].arr[arr_idx] -= 1; + } + + if(part[k].arr[arr_idx] == j+1) + { + part[k].arr[arr_idx] = cast(u32)(i+1); + } + } + } + } + } + } + + return values[0 .. values.length-dup_count]; +} + string GetFilePath(string file_name) {