bool loadBin()

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;
}