more work on assets/packer
This commit is contained in:
parent
1501b5bc07
commit
50b9ce9ee8
7
assets.d
7
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
|
||||
|
||||
85
packer.d
85
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)
|
||||
{
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user