| 6 | namespace skd::asset |
| 7 | { |
| 8 | bool SSkinCooker::Cook(SCookContext* ctx) |
| 9 | { |
| 10 | using namespace skr::anim; |
| 11 | SkrZoneScopedNS("SSkinCooker::Cook", 4); |
| 12 | |
| 13 | cgltf_data* rawMesh = ctx->Import<cgltf_data>(); |
| 14 | if (!rawMesh) |
| 15 | { |
| 16 | return false; |
| 17 | } |
| 18 | SKR_DEFER({ctx->Destroy(rawMesh);}); |
| 19 | //TODO; indexing skin |
| 20 | cgltf_skin* rawSkin = &rawMesh->skins[0]; |
| 21 | SkinResource resource; |
| 22 | auto blob = skr::make_blob_builder<SkinBlobView>(); |
| 23 | blob.name = rawSkin->name ? (const char8_t*)rawSkin->name : u8"UnnamedSkin"; |
| 24 | blob.joint_remaps.reserve(rawSkin->joints_count); |
| 25 | for (auto i = 0; i < rawSkin->joints_count; ++i) |
| 26 | blob.joint_remaps.add((const char8_t*)rawSkin->joints[i]->name); |
| 27 | auto buffer_view = rawSkin->inverse_bind_matrices->buffer_view; |
| 28 | const auto buffer_data = static_cast<const uint8_t*>(buffer_view->data ? buffer_view->data : buffer_view->buffer->data); |
| 29 | auto matrix = (cgltf_float*)(buffer_data + buffer_view->offset); |
| 30 | auto components = cgltf_num_components(cgltf_type_mat4); |
| 31 | SKR_ASSERT(components == 16); |
| 32 | blob.inverse_bind_poses.resize_default(rawSkin->joints_count); |
| 33 | std::memcpy(blob.inverse_bind_poses.data(), matrix, sizeof(cgltf_float) * components * rawSkin->joints_count); |
| 34 | resource.arena = skr::binary::make_arena<SkinBlobView>(resource.blob, blob); |
| 35 | return ctx->Save(resource); |
| 36 | } |
| 37 | } // namespace skd::asset |
nothing calls this directly
no test coverage detected