|
|
|
|
@ -73,12 +73,11 @@ arenaAllocateBlock(memory_arena* arena, size_t block_size)
|
|
|
|
|
|
|
|
|
|
// forward declarations
|
|
|
|
|
void dumpNodes(tinygltf::Model t_mdl); |
|
|
|
|
model* initModel(model_assets* assets, |
|
|
|
|
model* initModel(Assets* assets, |
|
|
|
|
memory_arena* arena, |
|
|
|
|
tinygltf::Model t_mdl, |
|
|
|
|
const char* filename); |
|
|
|
|
bool parseMeshNode(mesh* m, |
|
|
|
|
texture_assets* textures, |
|
|
|
|
memory_arena* arena, |
|
|
|
|
const tinygltf::Node& node, |
|
|
|
|
const tinygltf::Model& t_mdl); |
|
|
|
|
@ -86,31 +85,8 @@ bool parseMeshNode(mesh* m,
|
|
|
|
|
|
|
|
|
|
// interface
|
|
|
|
|
|
|
|
|
|
model_assets* |
|
|
|
|
assetInitModelBlock(memory_arena* arena, uint asset_count) |
|
|
|
|
{ |
|
|
|
|
model_assets* assets = |
|
|
|
|
(model_assets*) arenaAllocateBlock(arena, sizeof(model_assets)); |
|
|
|
|
assets->models = |
|
|
|
|
(model*) arenaAllocateBlock(arena, asset_count * sizeof(model)); |
|
|
|
|
assets->max = asset_count; |
|
|
|
|
|
|
|
|
|
return assets; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
texture_assets* |
|
|
|
|
assetInitTextureBlock(memory_arena* arena, uint asset_count) |
|
|
|
|
{ |
|
|
|
|
texture_assets* assets = |
|
|
|
|
(texture_assets*) arenaAllocateBlock(arena, sizeof(texture_assets)); |
|
|
|
|
assets->images = (util_image*) arenaAllocateBlock( |
|
|
|
|
arena, asset_count * sizeof(util_image)); |
|
|
|
|
assets->max = asset_count; |
|
|
|
|
|
|
|
|
|
return assets; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// FIXME: move to internal when finished
|
|
|
|
|
# if 0 |
|
|
|
|
util_image* |
|
|
|
|
copyDiffuseTexture(texture_assets* textures, |
|
|
|
|
memory_arena* arena, |
|
|
|
|
@ -141,10 +117,10 @@ copyDiffuseTexture(texture_assets* textures,
|
|
|
|
|
|
|
|
|
|
return dtex; |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
model* |
|
|
|
|
assetLoadFromFile(model_assets* assets, |
|
|
|
|
texture_assets* textures, |
|
|
|
|
assetLoadFromFile(Assets* assets, |
|
|
|
|
memory_arena* arena, |
|
|
|
|
const char* filename) |
|
|
|
|
{ |
|
|
|
|
@ -180,9 +156,7 @@ assetLoadFromFile(model_assets* assets,
|
|
|
|
|
|
|
|
|
|
for (tinygltf::Node node : t_mdl.nodes) { |
|
|
|
|
if (node.mesh >= 0) { |
|
|
|
|
if (!parseMeshNode(&mdl->meshes[mesh_idx++], |
|
|
|
|
textures, arena, node, t_mdl)) |
|
|
|
|
{ |
|
|
|
|
if (!parseMeshNode(&mdl->meshes[mesh_idx++], arena, node, t_mdl)) { |
|
|
|
|
LOG(Error) << "Error parsing node\n"; |
|
|
|
|
return nullptr; |
|
|
|
|
} |
|
|
|
|
@ -193,9 +167,9 @@ assetLoadFromFile(model_assets* assets,
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
model* |
|
|
|
|
assetGetCached(model_assets* assets, uint64_t path_hash) |
|
|
|
|
assetGetCached(Assets* assets, uint64_t path_hash) |
|
|
|
|
{ |
|
|
|
|
for (uint i = 0; i < assets->count; i++) { |
|
|
|
|
for (uint i = 0; i < assets->num_models; i++) { |
|
|
|
|
if (assets->models[i].filepath_hash == path_hash) |
|
|
|
|
return &assets->models[i]; |
|
|
|
|
} |
|
|
|
|
@ -208,15 +182,15 @@ assetGetCached(model_assets* assets, uint64_t path_hash)
|
|
|
|
|
// internal
|
|
|
|
|
|
|
|
|
|
model* |
|
|
|
|
initModel(model_assets* assets, |
|
|
|
|
initModel(Assets* assets, |
|
|
|
|
memory_arena* arena, |
|
|
|
|
tinygltf::Model t_mdl, |
|
|
|
|
const char* filename) |
|
|
|
|
{ |
|
|
|
|
// TODO: re-alloc array when out of space
|
|
|
|
|
assert(assets->count < assets->max && arena != nullptr); |
|
|
|
|
model* mdl = &assets->models[assets->count]; |
|
|
|
|
assets->count++; |
|
|
|
|
assert(assets->num_models < assets->max_models && arena != nullptr); |
|
|
|
|
model* mdl = &assets->models[assets->num_models]; |
|
|
|
|
assets->num_models++; |
|
|
|
|
|
|
|
|
|
uint buf_count = t_mdl.bufferViews.size(); |
|
|
|
|
mdl->meshes = (mesh*) arenaAllocateBlock(arena, buf_count * sizeof(mesh)); |
|
|
|
|
@ -296,7 +270,6 @@ parseNodeTransform(memory_arena* arena, const tinygltf::Node* node)
|
|
|
|
|
|
|
|
|
|
bool |
|
|
|
|
parseMeshNode(mesh* m, |
|
|
|
|
texture_assets* textures, |
|
|
|
|
memory_arena* arena, |
|
|
|
|
const tinygltf::Node& node, |
|
|
|
|
const tinygltf::Model& t_mdl) |
|
|
|
|
|