feat(glb): a loader for binary glTF, and images decoded from memory
- Crafter.Asset:GLB. GlbAsset::Load reads a .glb from a file or a buffer:
- nodes, with their parents;
- every mesh's primitives: positions, normals, UV0, tangents (computed
when absent), joints, weights (normalized), u32 indices;
- skins with their inverse-bind matrices;
- materials: PBR, emissive strength, transmission, ior, alpha mode;
- images decoded to RGBA8, and samplers;
- cameras and KHR_lights_punctual lights;
- the raw JSON, and the extras of the scene, nodes, materials and lights.
nlohmann/json 3.12.0 is vendored in lib/; only the implementation sees it.
- A broken file comes back as an error rather than a crash:
- bad magic, truncation, a sparse accessor;
- a chunk, view or accessor past its bounds, checked so that nothing
wraps round, with 32-bit size_t too;
- a stride outside 4..252, or one its elements overlap in;
- a reference to something that doesn't exist, or children that form a
cycle (found stepping through each node once, however deep);
- a path that isn't a file;
- an image larger than a texture's 65535 a side.
- TextureAsset::LoadPNGFromMemory decodes an image already in memory.
LoadPNG refuses images over 65535 a side instead of truncating their size
(in its float path, past the end of the pixels).
- Tests: GLB.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
dfd7f899cf
commit
c04b7a331a
7 changed files with 27170 additions and 6 deletions
14
project.cpp
14
project.cpp
|
|
@ -72,24 +72,32 @@ extern "C" Configuration CrafterBuildProject(std::span<const std::string_view> a
|
|||
}
|
||||
for (const fs::path& p : libdeflateSources) cfg.cFiles.push_back(p);
|
||||
|
||||
std::array<fs::path, 4> ifaces = {
|
||||
std::array<fs::path, 5> ifaces = {
|
||||
"interfaces/Crafter.Asset",
|
||||
"interfaces/Crafter.Asset-Compression",
|
||||
"interfaces/Crafter.Asset-Texture",
|
||||
"interfaces/Crafter.Asset-Mesh",
|
||||
"interfaces/Crafter.Asset-GLB",
|
||||
};
|
||||
if (cfg.type == ConfigurationType::Executable) {
|
||||
std::array<fs::path, 2> impls = {
|
||||
std::array<fs::path, 3> impls = {
|
||||
"implementations/Crafter.Asset-Compression",
|
||||
"implementations/Crafter.Asset-GLB",
|
||||
"implementations/main",
|
||||
};
|
||||
cfg.GetInterfacesAndImplementations(ifaces, impls);
|
||||
} else {
|
||||
std::array<fs::path, 1> impls = {
|
||||
std::array<fs::path, 2> impls = {
|
||||
"implementations/Crafter.Asset-Compression",
|
||||
"implementations/Crafter.Asset-GLB",
|
||||
};
|
||||
cfg.GetInterfacesAndImplementations(ifaces, impls);
|
||||
}
|
||||
|
||||
// Tests link this project's static library. wasm builds run no tests.
|
||||
if (!isWasm && cfg.type == ConfigurationType::LibraryStatic) {
|
||||
cfg.AddTest("GLB").Dependencies({ &cfg });
|
||||
}
|
||||
|
||||
return cfg;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue