in libraries/hvvr/samples_shared/model_import_bin.cpp [69:127]
bool loadBin(const char* path, Model& model) {
bool ok = false;
FILE* file = fopen(path, "rb");
{
if (!file) {
goto load_bin_fail;
}
BinHeader header;
fread(&header, sizeof(header), 1, file);
if (header.version != BinHeader().version) {
printf("error: bin file version mismatch\n");
goto load_bin_fail;
}
model.textures.reserve(header.textureCount);
for (uint32_t n = 0; n < header.textureCount; n++) {
BinTexture binTex;
fread(&binTex, sizeof(binTex), 1, file);
Texture tex(binTex);
size_t sizeBytes = hvvr::getTextureSize(tex.tex.strideElements, tex.tex.height, tex.tex.format);
tex.tex.data = new uint8_t [sizeBytes];
fread((void*)tex.tex.data, sizeBytes, 1, file);
model.textures.emplace_back(std::move(tex));
}
model.lights.reserve(header.lightCount);
for (uint32_t n = 0; n < header.lightCount; n++) {
hvvr::LightUnion light;
fread(&light, sizeof(light), 1, file);
model.lights.emplace_back(std::move(light));
}
model.meshes.reserve(header.meshCount);
for (uint32_t n = 0; n < header.meshCount; n++) {
BinMesh binMesh;
fread(&binMesh, sizeof(binMesh), 1, file);
Mesh mesh(binMesh);
fread(mesh.data.verts.data(), sizeof(hvvr::ShadingVertex) * binMesh.vertexCount, 1, file);
fread(mesh.data.triShade.data(), sizeof(hvvr::PrecomputedTriangleShade) * binMesh.triangleCount, 1, file);
fread(mesh.data.nodes.data(), sizeof(hvvr::TopologyNode) * binMesh.nodeCount, 1, file);
fread(mesh.data.materials.data(), sizeof(hvvr::SimpleMaterial) * binMesh.materialCount, 1, file);
model.meshes.emplace_back(std::move(mesh));
}
}
ok = true;
load_bin_fail:
if (file) {
fclose(file);
}
return ok;
}