Loading of complex scene graphs is now working well!

Managed to load a huge glb file, not included in commit cause I don't want to use
lots of storage in git lfs
This commit is contained in:
sergeypdev 2024-02-25 03:32:53 +04:00
parent 892c2c643a
commit e0e951c46b
9 changed files with 86 additions and 341 deletions

View File

@ -1,2 +0,0 @@
# Blender 4.0.2 MTL File: 'None'
# www.blender.org

View File

@ -1,303 +0,0 @@
# Blender 4.0.2
# www.blender.org
mtllib test_scene.mtl
o Cube
v -1.000000 -1.000000 1.000000
v -1.000000 1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v -1.000000 1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v 1.000000 1.000000 1.000000
v 1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -1.000000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vn -0.0000 -1.0000 -0.0000
vn -0.0000 1.0000 -0.0000
vt 0.375000 0.000000
vt 0.625000 0.000000
vt 0.625000 0.250000
vt 0.375000 0.250000
vt 0.625000 0.500000
vt 0.375000 0.500000
vt 0.625000 0.750000
vt 0.375000 0.750000
vt 0.625000 1.000000
vt 0.375000 1.000000
vt 0.125000 0.500000
vt 0.125000 0.750000
vt 0.875000 0.500000
vt 0.875000 0.750000
s 0
f 1/1/1 2/2/1 4/3/1 3/4/1
f 3/4/2 4/3/2 8/5/2 7/6/2
f 7/6/3 8/5/3 6/7/3 5/8/3
f 5/8/4 6/7/4 2/9/4 1/10/4
f 3/11/5 7/6/5 5/8/5 1/12/5
f 8/5/6 4/13/6 2/14/6 6/7/6
o Cylinder
v -4.365820 -1.000000 -1.000000
v -4.365820 1.000000 -1.000000
v -4.170730 -1.000000 -0.980785
v -4.170730 1.000000 -0.980785
v -3.983137 -1.000000 -0.923880
v -3.983137 1.000000 -0.923880
v -3.810250 -1.000000 -0.831470
v -3.810250 1.000000 -0.831470
v -3.658714 -1.000000 -0.707107
v -3.658714 1.000000 -0.707107
v -3.534351 -1.000000 -0.555570
v -3.534351 1.000000 -0.555570
v -3.441941 -1.000000 -0.382683
v -3.441941 1.000000 -0.382683
v -3.385035 -1.000000 -0.195090
v -3.385035 1.000000 -0.195090
v -3.365820 -1.000000 0.000000
v -3.365820 1.000000 0.000000
v -3.385035 -1.000000 0.195090
v -3.385035 1.000000 0.195090
v -3.441941 -1.000000 0.382683
v -3.441941 1.000000 0.382683
v -3.534351 -1.000000 0.555570
v -3.534351 1.000000 0.555570
v -3.658714 -1.000000 0.707107
v -3.658714 1.000000 0.707107
v -3.810250 -1.000000 0.831470
v -3.810250 1.000000 0.831470
v -3.983137 -1.000000 0.923880
v -3.983137 1.000000 0.923880
v -4.170730 -1.000000 0.980785
v -4.170730 1.000000 0.980785
v -4.365820 -1.000000 1.000000
v -4.365820 1.000000 1.000000
v -4.560911 -1.000000 0.980785
v -4.560911 1.000000 0.980785
v -4.748504 -1.000000 0.923880
v -4.748504 1.000000 0.923880
v -4.921391 -1.000000 0.831470
v -4.921391 1.000000 0.831470
v -5.072927 -1.000000 0.707107
v -5.072927 1.000000 0.707107
v -5.197290 -1.000000 0.555570
v -5.197290 1.000000 0.555570
v -5.289700 -1.000000 0.382683
v -5.289700 1.000000 0.382683
v -5.346606 -1.000000 0.195090
v -5.346606 1.000000 0.195090
v -5.365820 -1.000000 0.000000
v -5.365820 1.000000 0.000000
v -5.346606 -1.000000 -0.195090
v -5.346606 1.000000 -0.195090
v -5.289700 -1.000000 -0.382683
v -5.289700 1.000000 -0.382683
v -5.197290 -1.000000 -0.555570
v -5.197290 1.000000 -0.555570
v -5.072927 -1.000000 -0.707107
v -5.072927 1.000000 -0.707107
v -4.921391 -1.000000 -0.831470
v -4.921391 1.000000 -0.831470
v -4.748504 -1.000000 -0.923880
v -4.748504 1.000000 -0.923880
v -4.560911 -1.000000 -0.980785
v -4.560911 1.000000 -0.980785
vn 0.0980 -0.0000 -0.9952
vn 0.2903 -0.0000 -0.9569
vn 0.4714 -0.0000 -0.8819
vn 0.6344 -0.0000 -0.7730
vn 0.7730 -0.0000 -0.6344
vn 0.8819 -0.0000 -0.4714
vn 0.9569 -0.0000 -0.2903
vn 0.9952 -0.0000 -0.0980
vn 0.9952 -0.0000 0.0980
vn 0.9569 -0.0000 0.2903
vn 0.8819 -0.0000 0.4714
vn 0.7730 -0.0000 0.6344
vn 0.6344 -0.0000 0.7730
vn 0.4714 -0.0000 0.8819
vn 0.2903 -0.0000 0.9569
vn 0.0980 -0.0000 0.9952
vn -0.0980 -0.0000 0.9952
vn -0.2903 -0.0000 0.9569
vn -0.4714 -0.0000 0.8819
vn -0.6344 -0.0000 0.7730
vn -0.7730 -0.0000 0.6344
vn -0.8819 -0.0000 0.4714
vn -0.9569 -0.0000 0.2903
vn -0.9952 -0.0000 0.0980
vn -0.9952 -0.0000 -0.0980
vn -0.9569 -0.0000 -0.2903
vn -0.8819 -0.0000 -0.4714
vn -0.7730 -0.0000 -0.6344
vn -0.6344 -0.0000 -0.7730
vn -0.4714 -0.0000 -0.8819
vn -0.0000 1.0000 -0.0000
vn -0.2903 -0.0000 -0.9569
vn -0.0980 -0.0000 -0.9952
vn -0.0000 -1.0000 -0.0000
vt 1.000000 0.500000
vt 1.000000 1.000000
vt 0.968750 1.000000
vt 0.968750 0.500000
vt 0.937500 1.000000
vt 0.937500 0.500000
vt 0.906250 1.000000
vt 0.906250 0.500000
vt 0.875000 1.000000
vt 0.875000 0.500000
vt 0.843750 1.000000
vt 0.843750 0.500000
vt 0.812500 1.000000
vt 0.812500 0.500000
vt 0.781250 1.000000
vt 0.781250 0.500000
vt 0.750000 1.000000
vt 0.750000 0.500000
vt 0.718750 1.000000
vt 0.718750 0.500000
vt 0.687500 1.000000
vt 0.687500 0.500000
vt 0.656250 1.000000
vt 0.656250 0.500000
vt 0.625000 1.000000
vt 0.625000 0.500000
vt 0.593750 1.000000
vt 0.593750 0.500000
vt 0.562500 1.000000
vt 0.562500 0.500000
vt 0.531250 1.000000
vt 0.531250 0.500000
vt 0.500000 1.000000
vt 0.500000 0.500000
vt 0.468750 1.000000
vt 0.468750 0.500000
vt 0.437500 1.000000
vt 0.437500 0.500000
vt 0.406250 1.000000
vt 0.406250 0.500000
vt 0.375000 1.000000
vt 0.375000 0.500000
vt 0.343750 1.000000
vt 0.343750 0.500000
vt 0.312500 1.000000
vt 0.312500 0.500000
vt 0.281250 1.000000
vt 0.281250 0.500000
vt 0.250000 1.000000
vt 0.250000 0.500000
vt 0.218750 1.000000
vt 0.218750 0.500000
vt 0.187500 1.000000
vt 0.187500 0.500000
vt 0.156250 1.000000
vt 0.156250 0.500000
vt 0.125000 1.000000
vt 0.125000 0.500000
vt 0.093750 1.000000
vt 0.093750 0.500000
vt 0.062500 1.000000
vt 0.062500 0.500000
vt 0.296822 0.485388
vt 0.250000 0.490000
vt 0.203178 0.485388
vt 0.158156 0.471731
vt 0.116663 0.449553
vt 0.080294 0.419706
vt 0.050447 0.383337
vt 0.028269 0.341844
vt 0.014612 0.296822
vt 0.010000 0.250000
vt 0.014612 0.203178
vt 0.028269 0.158156
vt 0.050447 0.116663
vt 0.080294 0.080294
vt 0.116663 0.050447
vt 0.158156 0.028269
vt 0.203178 0.014612
vt 0.250000 0.010000
vt 0.296822 0.014612
vt 0.341844 0.028269
vt 0.383337 0.050447
vt 0.419706 0.080294
vt 0.449553 0.116663
vt 0.471731 0.158156
vt 0.485388 0.203178
vt 0.490000 0.250000
vt 0.485388 0.296822
vt 0.471731 0.341844
vt 0.449553 0.383337
vt 0.419706 0.419706
vt 0.383337 0.449553
vt 0.341844 0.471731
vt 0.031250 1.000000
vt 0.031250 0.500000
vt 0.000000 1.000000
vt 0.000000 0.500000
vt 0.750000 0.490000
vt 0.796822 0.485388
vt 0.841844 0.471731
vt 0.883337 0.449553
vt 0.919706 0.419706
vt 0.949553 0.383337
vt 0.971731 0.341844
vt 0.985388 0.296822
vt 0.990000 0.250000
vt 0.985388 0.203178
vt 0.971731 0.158156
vt 0.949553 0.116663
vt 0.919706 0.080294
vt 0.883337 0.050447
vt 0.841844 0.028269
vt 0.796822 0.014612
vt 0.750000 0.010000
vt 0.703178 0.014612
vt 0.658156 0.028269
vt 0.616663 0.050447
vt 0.580294 0.080294
vt 0.550447 0.116663
vt 0.528269 0.158156
vt 0.514612 0.203178
vt 0.510000 0.250000
vt 0.514612 0.296822
vt 0.528269 0.341844
vt 0.550447 0.383337
vt 0.580294 0.419706
vt 0.616663 0.449553
vt 0.658156 0.471731
vt 0.703178 0.485388
s 0
f 9/15/7 10/16/7 12/17/7 11/18/7
f 11/18/8 12/17/8 14/19/8 13/20/8
f 13/20/9 14/19/9 16/21/9 15/22/9
f 15/22/10 16/21/10 18/23/10 17/24/10
f 17/24/11 18/23/11 20/25/11 19/26/11
f 19/26/12 20/25/12 22/27/12 21/28/12
f 21/28/13 22/27/13 24/29/13 23/30/13
f 23/30/14 24/29/14 26/31/14 25/32/14
f 25/32/15 26/31/15 28/33/15 27/34/15
f 27/34/16 28/33/16 30/35/16 29/36/16
f 29/36/17 30/35/17 32/37/17 31/38/17
f 31/38/18 32/37/18 34/39/18 33/40/18
f 33/40/19 34/39/19 36/41/19 35/42/19
f 35/42/20 36/41/20 38/43/20 37/44/20
f 37/44/21 38/43/21 40/45/21 39/46/21
f 39/46/22 40/45/22 42/47/22 41/48/22
f 41/48/23 42/47/23 44/49/23 43/50/23
f 43/50/24 44/49/24 46/51/24 45/52/24
f 45/52/25 46/51/25 48/53/25 47/54/25
f 47/54/26 48/53/26 50/55/26 49/56/26
f 49/56/27 50/55/27 52/57/27 51/58/27
f 51/58/28 52/57/28 54/59/28 53/60/28
f 53/60/29 54/59/29 56/61/29 55/62/29
f 55/62/30 56/61/30 58/63/30 57/64/30
f 57/64/31 58/63/31 60/65/31 59/66/31
f 59/66/32 60/65/32 62/67/32 61/68/32
f 61/68/33 62/67/33 64/69/33 63/70/33
f 63/70/34 64/69/34 66/71/34 65/72/34
f 65/72/35 66/71/35 68/73/35 67/74/35
f 67/74/36 68/73/36 70/75/36 69/76/36
f 12/77/37 10/78/37 72/79/37 70/80/37 68/81/37 66/82/37 64/83/37 62/84/37 60/85/37 58/86/37 56/87/37 54/88/37 52/89/37 50/90/37 48/91/37 46/92/37 44/93/37 42/94/37 40/95/37 38/96/37 36/97/37 34/98/37 32/99/37 30/100/37 28/101/37 26/102/37 24/103/37 22/104/37 20/105/37 18/106/37 16/107/37 14/108/37
f 69/76/38 70/75/38 72/109/38 71/110/38
f 71/110/39 72/109/39 10/111/39 9/112/39
f 9/113/40 11/114/40 13/115/40 15/116/40 17/117/40 19/118/40 21/119/40 23/120/40 25/121/40 27/122/40 29/123/40 31/124/40 33/125/40 35/126/40 37/127/40 39/128/40 41/129/40 43/130/40 45/131/40 47/132/40 49/133/40 51/134/40 53/135/40 55/136/40 57/137/40 59/138/40 61/139/40 63/140/40 65/141/40 67/142/40 69/143/40 71/144/40

View File

@ -150,6 +150,9 @@ const asset_extensions = [_][]const u8{
"png", "png",
"jpg", "jpg",
"exr", "exr",
"fbx",
"gltf",
"glb",
}; };
// Find all assets and cook them using assetc // Find all assets and cook them using assetc
@ -208,13 +211,11 @@ fn buildAssetCompiler(b: *Build, optimize: std.builtin.OptimizeMode, assets_mod:
.target = b.host, .target = b.host,
.optimize = optimize, .optimize = optimize,
//.formats = @as([]const u8, "3DS,3MF,AC,AMF,ASE,Assbin,Assjson,Assxml,B3D,Blender,BVH,C4D,COB,Collada,CSM,DXF,FBX,glTF,glTF2,HMP,IFC,Irr,LWO,LWS,M3D,MD2,MD3,MD5,MDC,MDL,MMD,MS3D,NDO,NFF,Obj,OFF,Ogre,OpenGEX,Ply,Q3BSP,Q3D,Raw,SIB,SMD,Step,STEPParser,STL,Terragen,Unreal,X,X3D,XGL"), //.formats = @as([]const u8, "3DS,3MF,AC,AMF,ASE,Assbin,Assjson,Assxml,B3D,Blender,BVH,C4D,COB,Collada,CSM,DXF,FBX,glTF,glTF2,HMP,IFC,Irr,LWO,LWS,M3D,MD2,MD3,MD5,MDC,MDL,MMD,MS3D,NDO,NFF,Obj,OFF,Ogre,OpenGEX,Ply,Q3BSP,Q3D,Raw,SIB,SMD,Step,STEPParser,STL,Terragen,Unreal,X,X3D,XGL"),
.formats = @as([]const u8, "Obj"), .formats = @as([]const u8, "Obj,FBX,glTF,glTF2,Blend"),
}); });
const zalgebra_dep = b.dependency("zalgebra", .{}); const zalgebra_dep = b.dependency("zalgebra", .{});
const assimp_lib = assimp_dep.artifact("assimp"); const assimp_lib = assimp_dep.artifact("assimp");
// HACK: fix in assimp
assimp_lib.defineCMacro("AI_CONFIG_FBX_USE_SKELETON_BONE_CONTAINER", "\"AI_CONFIG_FBX_USE_SKELETON_BONE_CONTAINER\"");
const assetc = b.addExecutable(.{ const assetc = b.addExecutable(.{
.name = "assetc", .name = "assetc",

View File

@ -20,8 +20,8 @@
.hash = "1220483cbb42231cb056f4ea6669894c68ccd560d3af5832d6e9c84c61844bc20b7d", .hash = "1220483cbb42231cb056f4ea6669894c68ccd560d3af5832d6e9c84c61844bc20b7d",
}, },
.@"zig-assimp" = .{ .@"zig-assimp" = .{
.url = "https://github.com/sergeypdev/zig-assimp/tarball/64b31e9c01132352246955f496642332cb611577", .url = "https://github.com/sergeypdev/zig-assimp/tarball/59c2f0202bf1e5110f3eb219669f3762e3db2768",
.hash = "1220a57ac5fe4f45eae98d9b26f7cba93dca90782d631ef73a740b0190559d424054", .hash = "122015247b178258ee2fd9f7fbd3f8025138e8e38b5cbecdc94262974da49bd1c225",
}, },
.zalgebra = .{ .zalgebra = .{
.url = "git+https://github.com/sergeypdev/zalgebra.git#232ff76712dc7cc270b6c48cedc84617536f3a59", .url = "git+https://github.com/sergeypdev/zalgebra.git#232ff76712dc7cc270b6c48cedc84617536f3a59",

View File

@ -269,9 +269,7 @@ export fn game_init(global_allocator: *std.mem.Allocator) void {
} }
} }
const test_scene_root = globals.g_mem.world.createScene(globals.g_assetman.resolveScene(a.Scenes.test_scene.scene)); // const test_scene_root = globals.g_mem.world.createScene(globals.g_assetman.resolveScene(a.Scenes.test_scene.scene));
std.log.debug("test scene root idx {}\n", .{test_scene_root.idx});
} }
export fn game_update() bool { export fn game_update() bool {

View File

@ -55,7 +55,7 @@ fn make(step: *Step, prog_node: *std.Progress.Node) !void {
// Random bytes to make WriteFile unique. Refresh this with // Random bytes to make WriteFile unique. Refresh this with
// new random bytes when GenerateAssetManifest implementation is modified // new random bytes when GenerateAssetManifest implementation is modified
// in a non-backwards-compatible way. // in a non-backwards-compatible way.
man.hash.add(@as(u32, 0xd767ee71)); man.hash.add(@as(u32, 0xd767ee75));
// TODO: sort generated asset lists to make sure cache is predictable // TODO: sort generated asset lists to make sure cache is predictable
@ -153,7 +153,7 @@ fn writeAssetManifest(arena: std.mem.Allocator, writer: anytype, assets: []Asset
// TODO: think about building a perfect hashmap // TODO: think about building a perfect hashmap
// AssetId -> Asset path mapping // AssetId -> Asset path mapping
try writer.writeAll( try writer.writeAll(
\\var buf: [4096]u8 = undefined; \\var buf: [1024 * 1024]u8 = undefined;
\\var fba = std.heap.FixedBufferAllocator.init(&buf); \\var fba = std.heap.FixedBufferAllocator.init(&buf);
\\pub var asset_paths = std.AutoHashMapUnmanaged(u64, []const u8){}; \\pub var asset_paths = std.AutoHashMapUnmanaged(u64, []const u8){};
\\var initialized = false; \\var initialized = false;
@ -166,6 +166,7 @@ fn writeAssetManifest(arena: std.mem.Allocator, writer: anytype, assets: []Asset
); );
for (assets) |asset_list_entry| { for (assets) |asset_list_entry| {
const path = try asset_list_entry.getOutputPath(&buf); const path = try asset_list_entry.getOutputPath(&buf);
std.log.debug("asset output path: {s}\n", .{path});
try std.fmt.format(writer, " asset_paths.put(fba.allocator(), {}, \"{}\") catch @panic(\"OOM\");\n", .{ asset_list_entry.getAssetId(), std.zig.fmtEscapes(path) }); try std.fmt.format(writer, " asset_paths.put(fba.allocator(), {}, \"{}\") catch @panic(\"OOM\");\n", .{ asset_list_entry.getAssetId(), std.zig.fmtEscapes(path) });
} }
try writer.writeAll("}\n\n"); try writer.writeAll("}\n\n");
@ -191,7 +192,6 @@ const NestedAssetDef = union(enum) {
path: types.AssetPath, path: types.AssetPath,
asset_list_entry: AssetListEntry, asset_list_entry: AssetListEntry,
) !void { ) !void {
std.log.debug("NestedAssetDef.put {s}", .{path.getPath()});
var iter = try std.fs.path.componentIterator(path.getPath()); var iter = try std.fs.path.componentIterator(path.getPath());
const filename = iter.last().?.name; const filename = iter.last().?.name;
_ = iter.first(); _ = iter.first();
@ -199,10 +199,8 @@ const NestedAssetDef = union(enum) {
var current = &self.path; var current = &self.path;
while (iter.next()) |comp| { while (iter.next()) |comp| {
std.log.debug("NestedAssetDef comp next {s}\n", .{comp.name});
if (comp.name.ptr == filename.ptr) break; if (comp.name.ptr == filename.ptr) break;
const gop = try current.getOrPut(allocator, comp.name); const gop = try current.getOrPut(allocator, comp.name);
std.log.debug("NestedAssetDef put path {s}\n", .{comp.name});
if (!gop.found_existing) { if (!gop.found_existing) {
gop.value_ptr.* = NestedAssetDef{ .path = .{} }; gop.value_ptr.* = NestedAssetDef{ .path = .{} };
} }
@ -216,7 +214,6 @@ const NestedAssetDef = union(enum) {
} }
try gop.value_ptr.put(allocator, .{ .simple = sub_path }, asset_list_entry); try gop.value_ptr.put(allocator, .{ .simple = sub_path }, asset_list_entry);
} else { } else {
std.log.debug("NestedAssetDef put filename {s}\n", .{std.fs.path.stem(filename)});
try current.put(allocator, std.fs.path.stem(filename), NestedAssetDef{ try current.put(allocator, std.fs.path.stem(filename), NestedAssetDef{
.asset = asset_list_entry, .asset = asset_list_entry,
}); });

View File

@ -9,6 +9,7 @@ const Vector2 = formats.Vector2;
const Vector3 = formats.Vector3; const Vector3 = formats.Vector3;
const za = @import("zalgebra"); const za = @import("zalgebra");
const Vec3 = za.Vec3; const Vec3 = za.Vec3;
const Mat4 = za.Mat4;
const c = @cImport({ const c = @cImport({
@cInclude("assimp/cimport.h"); @cInclude("assimp/cimport.h");
@cInclude("assimp/scene.h"); @cInclude("assimp/scene.h");
@ -23,9 +24,18 @@ const c = @cImport({
const ASSET_MAX_BYTES = 1024 * 1024 * 1024; const ASSET_MAX_BYTES = 1024 * 1024 * 1024;
const scene_formats = [_][]const u8{
".obj",
".fbx",
".gltf",
".glb",
};
pub fn resolveAssetTypeByExtension(path: []const u8) ?AssetType { pub fn resolveAssetTypeByExtension(path: []const u8) ?AssetType {
if (std.mem.endsWith(u8, path, ".obj") or std.mem.endsWith(u8, path, ".fbx")) { for (scene_formats) |ext| {
return .Scene; if (std.mem.endsWith(u8, path, ext)) {
return .Scene;
}
} }
if (std.mem.endsWith(u8, path, ".prog")) { if (std.mem.endsWith(u8, path, ".prog")) {
return .ShaderProgram; return .ShaderProgram;
@ -68,7 +78,7 @@ pub fn main() !void {
var buf_asset_list_writer = std.io.bufferedWriter(std.io.getStdOut().writer()); var buf_asset_list_writer = std.io.bufferedWriter(std.io.getStdOut().writer());
const asset_list_writer = buf_asset_list_writer.writer(); const asset_list_writer = buf_asset_list_writer.writer();
std.log.debug("rel_input: {s}", .{rel_input}); std.log.debug("type: {s}, rel_input: {s}", .{ @tagName(asset_type), rel_input });
switch (asset_type) { switch (asset_type) {
.Scene => try processScene(allocator, rel_input, output_dir, asset_list_writer), .Scene => try processScene(allocator, rel_input, output_dir, asset_list_writer),
@ -129,6 +139,12 @@ fn createOutput(_type: AssetType, asset_path: AssetPath, output_dir: std.fs.Dir,
/// It all depends on the source asset. /// It all depends on the source asset.
fn processScene(allocator: std.mem.Allocator, input: []const u8, output_dir: std.fs.Dir, asset_list_writer: anytype) !void { fn processScene(allocator: std.mem.Allocator, input: []const u8, output_dir: std.fs.Dir, asset_list_writer: anytype) !void {
const input_z = try std.mem.concatWithSentinel(allocator, u8, &.{input}, 0); const input_z = try std.mem.concatWithSentinel(allocator, u8, &.{input}, 0);
const config: *c.aiPropertyStore = @as(?*c.aiPropertyStore, @ptrCast(c.aiCreatePropertyStore())) orelse return error.PropertyStore;
defer c.aiReleasePropertyStore(config);
// Remove point and line meshes
c.aiSetImportPropertyInteger(config, c.AI_CONFIG_PP_SBP_REMOVE, c.aiPrimitiveType_POINT | c.aiPrimitiveType_LINE);
const maybe_scene: ?*const c.aiScene = @ptrCast(c.aiImportFile( const maybe_scene: ?*const c.aiScene = @ptrCast(c.aiImportFile(
input_z.ptr, input_z.ptr,
c.aiProcess_CalcTangentSpace | c.aiProcess_Triangulate | c.aiProcess_JoinIdenticalVertices | c.aiProcess_SortByPType | c.aiProcess_GenNormals, c.aiProcess_CalcTangentSpace | c.aiProcess_Triangulate | c.aiProcess_JoinIdenticalVertices | c.aiProcess_SortByPType | c.aiProcess_GenNormals,
@ -158,8 +174,9 @@ fn processScene(allocator: std.mem.Allocator, input: []const u8, output_dir: std
for (meshes) |mesh| { for (meshes) |mesh| {
const name = mesh.mName.data[0..mesh.mName.length]; const name = mesh.mName.data[0..mesh.mName.length];
std.log.debug("mesh name {s}\n", .{name});
var output = try createOutput(.Mesh, base_asset_path.subPath(name), output_dir, asset_list_writer); var output = try createOutput(.Mesh, base_asset_path.subPath(try allocator.dupe(u8, name)), output_dir, asset_list_writer);
defer output.file.close(); defer output.file.close();
try mesh_outputs.append(output.list_entry); try mesh_outputs.append(output.list_entry);
@ -201,21 +218,35 @@ fn processScene(allocator: std.mem.Allocator, input: []const u8, output_dir: std
const ent = &entities.items[idx]; const ent = &entities.items[idx];
// TODO: extract transform var mat = Mat4.fromSlice(@ptrCast(&node.mTransformation));
mat = mat.transpose();
const mat_decomp = mat.decompose();
ent.transform.pos = mat_decomp.t;
ent.transform.rot = mat_decomp.r;
ent.transform.scale = mat_decomp.s;
if (node.mMeshes != null) { if (node.mMeshes != null) {
const mesh_indices = node.mMeshes[0..node.mNumMeshes]; const mesh_indices = node.mMeshes[0..node.mNumMeshes];
for (mesh_indices) |mesh_idx| { if (mesh_indices.len == 1) {
const mesh_entry = mesh_outputs.items[@intCast(mesh_idx)]; const mesh_entry = mesh_outputs.items[mesh_indices[0]];
ent.flags.mesh = true;
ent.flags.rotate = true;
// TODO: turn multiple meshes into sub-entities ent.flags.mesh = true;
ent.mesh = .{ ent.mesh.handle = .{ .id = mesh_entry.src_path.hash() };
.handle = .{ .id = mesh_entry.src_path.hash() }, } else {
// TODO: extract material for (mesh_indices) |mesh_idx| {
}; const mesh_entry = mesh_outputs.items[@intCast(mesh_idx)];
ent.rotate = .{ .axis = Vec3.up(), .rate = 80 };
try entities.append(.{});
const sub_idx = entities.items.len - 1;
try parents.append(@intCast(idx));
const sub_ent = &entities.items[sub_idx];
sub_ent.flags.mesh = true;
sub_ent.mesh = .{
.handle = .{ .id = mesh_entry.src_path.hash() },
};
}
} }
} }
} }
@ -273,7 +304,7 @@ fn processMesh(allocator: std.mem.Allocator, scene: *const c.aiScene, mesh: *con
} }
for (0..mesh.mNumFaces) |i| { for (0..mesh.mNumFaces) |i| {
std.debug.assert(mesh.mFaces[i].mNumIndices == 3); if (mesh.mFaces[i].mNumIndices != 3) continue;
for (0..3) |j| { for (0..3) |j| {
const index = mesh.mFaces[i].mIndices[j]; const index = mesh.mFaces[i].mIndices[j];
if (index > std.math.maxInt(formats.Index)) { if (index > std.math.maxInt(formats.Index)) {

View File

@ -16,6 +16,7 @@ pub const AssetListEntry = struct {
// TODO: might be a better way to do this // TODO: might be a better way to do this
pub fn getOutputPath(self: *const AssetListEntry, out_buf: []u8) ![]u8 { pub fn getOutputPath(self: *const AssetListEntry, out_buf: []u8) ![]u8 {
const path_len = self.src_path.strLen(); const path_len = self.src_path.strLen();
if (path_len == 0) return error.InvalidSrcPath;
const len = path_len + self.type.ext().len + 1; const len = path_len + self.type.ext().len + 1;
if (out_buf.len < len) { if (out_buf.len < len) {
return error.BufferTooSmall; return error.BufferTooSmall;
@ -24,8 +25,13 @@ pub const AssetListEntry = struct {
_ = try self.src_path.toStringSep(out_buf, std.fs.path.sep); _ = try self.src_path.toStringSep(out_buf, std.fs.path.sep);
var end = path_len; var end = path_len;
const ext_len = std.fs.path.extension(out_buf[0..path_len]).len; switch (self.src_path) {
end -= ext_len; .simple => {
const ext_len = std.fs.path.extension(out_buf[0..path_len]).len;
end -= ext_len;
},
else => {},
}
// Extension // Extension
out_buf[end] = '.'; out_buf[end] = '.';
@ -38,17 +44,18 @@ pub const AssetListEntry = struct {
pub fn writeAssetListEntryText(writer: anytype, entry: AssetListEntry) !void { pub fn writeAssetListEntryText(writer: anytype, entry: AssetListEntry) !void {
try writer.writeAll(@tagName(entry.type)); try writer.writeAll(@tagName(entry.type));
try writer.writeByte(' '); try writer.writeByte(0);
try entry.src_path.writeString(writer); try entry.src_path.writeString(writer);
try writer.writeByte(0);
try writer.writeByte('\n'); try writer.writeByte('\n');
} }
pub fn readAssetListEntryText(alloc: std.mem.Allocator, reader: anytype) !AssetListEntry { pub fn readAssetListEntryText(alloc: std.mem.Allocator, reader: anytype) !AssetListEntry {
var buf: [std.fs.MAX_PATH_BYTES * 2 + 1]u8 = undefined; var buf: [std.fs.MAX_PATH_BYTES * 2 + 1]u8 = undefined;
const asset_type_str = try alloc.dupe(u8, try reader.readUntilDelimiterOrEof(&buf, ' ') orelse return error.MissingAssetType); const asset_type_str = try alloc.dupe(u8, try reader.readUntilDelimiterOrEof(&buf, 0) orelse return error.MissingAssetType);
const asset_type = std.meta.stringToEnum(AssetType, asset_type_str) orelse return error.InvalidAssetType; const asset_type = std.meta.stringToEnum(AssetType, asset_type_str) orelse return error.InvalidAssetType;
const src_path_str = try alloc.dupe(u8, try reader.readUntilDelimiterOrEof(&buf, ' ') orelse return error.MissingSrcPath); const src_path_str = try alloc.dupe(u8, try reader.readUntilDelimiterOrEof(&buf, 0) orelse return error.MissingSrcPath);
const src_path = AssetPath.fromString(src_path_str); const src_path = AssetPath.fromString(src_path_str);
return AssetListEntry{ return AssetListEntry{

View File

@ -29,6 +29,7 @@ pub const AssetType = enum {
}; };
pub const AssetPath = union(enum) { pub const AssetPath = union(enum) {
invalid: void, // translates to handle with id: 0
simple: []const u8, simple: []const u8,
nested: struct { nested: struct {
path: []const u8, path: []const u8,
@ -36,6 +37,10 @@ pub const AssetPath = union(enum) {
}, },
pub fn hash(self: AssetPath) u64 { pub fn hash(self: AssetPath) u64 {
switch (self) {
.invalid => return 0,
else => {},
}
var hasher = std.hash.Wyhash.init(0); var hasher = std.hash.Wyhash.init(0);
std.hash.autoHashStrat(&hasher, self.getPath(), .Deep); std.hash.autoHashStrat(&hasher, self.getPath(), .Deep);
std.hash.autoHashStrat(&hasher, self.getSubPath(), .Deep); std.hash.autoHashStrat(&hasher, self.getSubPath(), .Deep);
@ -44,6 +49,7 @@ pub const AssetPath = union(enum) {
pub fn subPath(self: AssetPath, sub_path: []const u8) AssetPath { pub fn subPath(self: AssetPath, sub_path: []const u8) AssetPath {
return switch (self) { return switch (self) {
.invalid => self,
.simple => |path| AssetPath{ .nested = .{ .path = path, .sub_path = sub_path } }, .simple => |path| AssetPath{ .nested = .{ .path = path, .sub_path = sub_path } },
.nested => |nested| AssetPath{ .nested = .{ .path = nested.path, .sub_path = sub_path } }, .nested => |nested| AssetPath{ .nested = .{ .path = nested.path, .sub_path = sub_path } },
}; };
@ -51,6 +57,7 @@ pub const AssetPath = union(enum) {
pub fn getPath(self: AssetPath) []const u8 { pub fn getPath(self: AssetPath) []const u8 {
return switch (self) { return switch (self) {
.invalid => "",
.simple => |path| path, .simple => |path| path,
.nested => |nested| nested.path, .nested => |nested| nested.path,
}; };
@ -58,6 +65,7 @@ pub const AssetPath = union(enum) {
pub fn getSubPath(self: AssetPath) ?[]const u8 { pub fn getSubPath(self: AssetPath) ?[]const u8 {
return switch (self) { return switch (self) {
.invalid => null,
.nested => |nested| nested.sub_path, .nested => |nested| nested.sub_path,
else => null, else => null,
}; };
@ -65,6 +73,7 @@ pub const AssetPath = union(enum) {
pub inline fn strLen(self: AssetPath) usize { pub inline fn strLen(self: AssetPath) usize {
return switch (self) { return switch (self) {
.invalid => 0,
.simple => |path| path.len, .simple => |path| path.len,
.nested => |nested| return nested.path.len + nested.sub_path.len + 1, .nested => |nested| return nested.path.len + nested.sub_path.len + 1,
}; };
@ -72,6 +81,7 @@ pub const AssetPath = union(enum) {
pub fn writeString(self: AssetPath, writer: anytype) !void { pub fn writeString(self: AssetPath, writer: anytype) !void {
switch (self) { switch (self) {
.invalid => {},
.simple => |path| { .simple => |path| {
try writer.writeAll(path); try writer.writeAll(path);
}, },
@ -93,6 +103,9 @@ pub const AssetPath = union(enum) {
} }
switch (self) { switch (self) {
.invalid => {
return out_buf[0..0];
},
.simple => |path| { .simple => |path| {
@memcpy(out_buf[0..path.len], path); @memcpy(out_buf[0..path.len], path);
return out_buf[0..path.len]; return out_buf[0..path.len];
@ -113,7 +126,10 @@ pub const AssetPath = union(enum) {
} }
pub fn fromString(str: []const u8) AssetPath { pub fn fromString(str: []const u8) AssetPath {
if (std.mem.lastIndexOf(u8, str, "#")) |sep_idx| { if (str.len == 0) {
return .invalid;
}
if (std.mem.indexOf(u8, str, "#")) |sep_idx| {
return .{ return .{
.nested = .{ .nested = .{
.path = str[0..sep_idx], .path = str[0..sep_idx],