diff --git a/assets/models/test_char.m3d b/assets/models/test_char.m3d new file mode 100644 index 0000000..ecb623b Binary files /dev/null and b/assets/models/test_char.m3d differ diff --git a/assets/models/yoda.m3d b/assets/models/yoda.m3d new file mode 100644 index 0000000..de34cb5 Binary files /dev/null and b/assets/models/yoda.m3d differ diff --git a/assets/shaders/gui.frag.spv b/assets/shaders/gui.frag.spv new file mode 100644 index 0000000..89e67b5 Binary files /dev/null and b/assets/shaders/gui.frag.spv differ diff --git a/assets/shaders/gui.vert.spv b/assets/shaders/gui.vert.spv new file mode 100644 index 0000000..0fad4d6 Binary files /dev/null and b/assets/shaders/gui.vert.spv differ diff --git a/assets/shaders/pbr.frag.spv b/assets/shaders/pbr.frag.spv new file mode 100644 index 0000000..e2f8c2c Binary files /dev/null and b/assets/shaders/pbr.frag.spv differ diff --git a/assets/shaders/pbr.vert.spv b/assets/shaders/pbr.vert.spv new file mode 100644 index 0000000..81ae640 Binary files /dev/null and b/assets/shaders/pbr.vert.spv differ diff --git a/assets/shaders/quad.frag.spv b/assets/shaders/quad.frag.spv new file mode 100644 index 0000000..c9fb610 Binary files /dev/null and b/assets/shaders/quad.frag.spv differ diff --git a/assets/shaders/quad.vert.spv b/assets/shaders/quad.vert.spv new file mode 100644 index 0000000..291e27e Binary files /dev/null and b/assets/shaders/quad.vert.spv differ diff --git a/assets/textures/cheesoid.png b/assets/textures/cheesoid.png new file mode 100644 index 0000000..931d6b4 Binary files /dev/null and b/assets/textures/cheesoid.png differ diff --git a/assets/textures/ham_smoke.png b/assets/textures/ham_smoke.png new file mode 100644 index 0000000..1f82fe0 Binary files /dev/null and b/assets/textures/ham_smoke.png differ diff --git a/assets/textures/hamster.png b/assets/textures/hamster.png new file mode 100644 index 0000000..57fbae0 Binary files /dev/null and b/assets/textures/hamster.png differ diff --git a/assets/textures/hog.jpg b/assets/textures/hog.jpg new file mode 100644 index 0000000..f1e17cb Binary files /dev/null and b/assets/textures/hog.jpg differ diff --git a/assets/textures/patamon.png b/assets/textures/patamon.png new file mode 100644 index 0000000..d2d8590 Binary files /dev/null and b/assets/textures/patamon.png differ diff --git a/assets/textures/pattermon.png b/assets/textures/pattermon.png new file mode 100644 index 0000000..1f94d75 Binary files /dev/null and b/assets/textures/pattermon.png differ diff --git a/assets/textures/purplemon.png b/assets/textures/purplemon.png new file mode 100644 index 0000000..27c75b7 Binary files /dev/null and b/assets/textures/purplemon.png differ diff --git a/dub.json b/dub.json index 69bf847..e925884 100644 --- a/dub.json +++ b/dub.json @@ -24,6 +24,19 @@ "importPaths": ["src/packer", "src/shared"], "sourcePaths": ["src/packer", "src/shared"], "sourceFiles-linux": ["build/libxxhash.a"], + "preGenerateCommands-linux": ["./build-vma.sh"], + "preGenerateCommands-windows": [], + }, + { + "name": "codegen", + "targetType": "executable", + "targetPath": "build", + "targetName": "Codegen", + "importPaths": ["src/codegen", "src/shared"], + "sourcePaths": ["src/codegen", "src/shared"], + "sourceFiles-linux": ["build/libxxhash.a"], + "preGenerateCommands-linux": ["./build-vma.sh"], + "preGenerateCommands-windows": [], } ] } diff --git a/src/codegen/codegen.d b/src/codegen/codegen.d new file mode 100644 index 0000000..d6b8632 --- /dev/null +++ b/src/codegen/codegen.d @@ -0,0 +1,75 @@ +import aliases; +import util; +import std.stdio; +import std.file; +import std.string; +import std.path; + +void +main() +{ + CreateAssetLookups(); +} + +void +CreateAssetLookups() +{ + try + { + mkdir("src/generated"); + } + catch(Exception e) {} + + string[] dirs; + string[][string] file_names; + string[][string] base_names; + u64[][string] file_hashes; + + foreach(string dir; dirEntries("assets", SpanMode.shallow)) + { + dirs ~= baseName(dir); + } + + foreach(dir; dirs) + { + string[] files; + string[] names; + foreach(string file; dirEntries("assets/" ~ dir, SpanMode.shallow)) + { + files ~= dir ~ "/" ~ baseName(file); + names ~= dir ~ "/" ~ baseName(stripExtension(file)); + } + + file_names[dir] = files; + base_names[dir] = names; + } + + foreach(dir, names; base_names) + { + u64[] hashes; + foreach(name; names) + { + hashes ~= Hash(name); + } + + file_hashes[dir] = hashes; + } + + auto f = File("src/generated/assets.d", "w"); + + foreach(dir; dirs) + { + string asset_type = stripRight(dir, "s").toUpper(); + + string file_array = format("static immutable string[] %s_FILES = [\n", asset_type); + foreach(file; file_names[dir]) + { + file_array ~= format("\t\"%s\",\n", file); + } + file_array ~= "];\n\n"; + + f.write(file_array); + } + + f.close(); +} diff --git a/src/generated/codegen.d b/src/generated/codegen.d new file mode 100644 index 0000000..a0c8a66 --- /dev/null +++ b/src/generated/codegen.d @@ -0,0 +1,24 @@ +static immutable string[] MODEL_FILES = [ + "models/test_char.m3d", + "models/yoda.m3d", +]; + +static immutable string[] SHADER_FILES = [ + "shaders/gui.frag.spv", + "shaders/pbr.frag.spv", + "shaders/gui.vert.spv", + "shaders/quad.frag.spv", + "shaders/quad.vert.spv", + "shaders/pbr.vert.spv", +]; + +static immutable string[] TEXTURE_FILES = [ + "textures/ham_smoke.png", + "textures/cheesoid.png", + "textures/hog.jpg", + "textures/patamon.png", + "textures/pattermon.png", + "textures/hamster.png", + "textures/purplemon.png", +]; + diff --git a/src/packer/packer.d b/src/packer/packer.d index b96563b..deadc27 100644 --- a/src/packer/packer.d +++ b/src/packer/packer.d @@ -1,7 +1,38 @@ -import std.stdio; +import aliases; +import std.file; import util; +import assets; + +const u32 FILE_VERSION = 1; void main() { - Log("Hello, World!"); + if (isDir("build")) + { + chdir("build"); + } + + static foreach(file; AssetFiles) + { + Log(file); + } } + +u32 +MagicValue(string str) +{ + assert(str.length == 4, "Magic value must 4 characters"); + return cast(u32)(cast(u32)(str[0] << 24) | cast(u32)(str[1] << 16) | cast(u32)(str[2] << 8) | cast(u32)(str[3] << 0)); +} + +FileHeader +InitHeader() +{ + FileHeader header = { + magic: MagicValue("steg"), + file_version: FILE_VERSION, + }; + + return header; +} + diff --git a/src/shared/assets.d b/src/shared/assets.d index e69de29..a45a509 100644 --- a/src/shared/assets.d +++ b/src/shared/assets.d @@ -0,0 +1,45 @@ +import aliases; +import std.file; + +struct FileHeader +{ + u32 magic; + u32 file_version; + u64 asset_counts; + u64 asset_offset; +} + +struct ModelMeta +{ + u64 index_count; +} + +struct TexMeta +{ + u32 w; + u32 h; + u32 ch; +} + +enum AssetType : u32 +{ + None, + Shader, + Texture, + Model, +} + +alias AT = AssetType; + +struct AssetInfo +{ + union + { + ModelMeta model; + TexMeta texture; + }; + u64 hash; + u64 offset; + u64 len; + AssetType type; +}