| 2071 | } |
| 2072 | |
| 2073 | Scene* LoadGltfFromBuffer(Options* importeroptions, void* mem, uint32_t file_size) |
| 2074 | { |
| 2075 | cgltf_options options; |
| 2076 | memset(&options, 0, sizeof(cgltf_options)); |
| 2077 | |
| 2078 | cgltf_data* data = NULL; |
| 2079 | cgltf_result result = cgltf_parse(&options, (uint8_t*)mem, file_size, &data); |
| 2080 | |
| 2081 | if (result != cgltf_result_success) |
| 2082 | { |
| 2083 | printf("Failed to load gltf file: %s (%d)\n", GetResultStr(result), result); |
| 2084 | return 0; |
| 2085 | } |
| 2086 | |
| 2087 | CreateNames(&options, data); |
| 2088 | |
| 2089 | // resolve as many buffers as possible |
| 2090 | result = ResolveBuffers(&options, data, 0); |
| 2091 | if (result != cgltf_result_success) |
| 2092 | { |
| 2093 | printf("Failed to load gltf buffers: %s (%d)\n", GetResultStr(result), result); |
| 2094 | cgltf_free(data); |
| 2095 | return 0; |
| 2096 | } |
| 2097 | |
| 2098 | Scene* scene = new Scene; |
| 2099 | memset(scene, 0, sizeof(Scene)); |
| 2100 | GltfData* scenedata = new GltfData; |
| 2101 | scenedata->m_Data = data; |
| 2102 | |
| 2103 | scene->m_OpaqueSceneData = scenedata; |
| 2104 | scene->m_LoadFinalizeFn = LoadFinalizeGltf; |
| 2105 | scene->m_ValidateFn = ValidateGltf; |
| 2106 | scene->m_DestroyFn = DestroyGltf; |
| 2107 | |
| 2108 | InitSize(scene->m_Buffers, data->buffers_count, data->buffers_count); |
| 2109 | |
| 2110 | for (cgltf_size i = 0; i < data->buffers_count; ++i) |
| 2111 | { |
| 2112 | scene->m_Buffers[i].m_Uri = DuplicateObjectName(&data->buffers[i]); |
| 2113 | scene->m_Buffers[i].m_Buffer = (uint8_t*)data->buffers[i].data; |
| 2114 | scene->m_Buffers[i].m_BufferCount = data->buffers[i].size; |
| 2115 | } |
| 2116 | |
| 2117 | if (!NeedsResolve(scene)) |
| 2118 | { |
| 2119 | scene->m_LoadFinalizeFn = 0; |
| 2120 | if (!LoadFinalizeGltf(scene)) |
| 2121 | { |
| 2122 | ClearScene(scene); |
| 2123 | return scene; |
| 2124 | } |
| 2125 | ValidateGltf(scene); |
| 2126 | } |
| 2127 | |
| 2128 | return scene; |
| 2129 | } |
| 2130 |
no test coverage detected