static void dumpSceneToOFF()

in libraries/hvvr/raycaster/render.cpp [77:125]


static void dumpSceneToOFF(const std::string& filename, const std::vector<std::unique_ptr<Model>>& models) {
    std::vector<vector3> vertices;
    std::vector<uint3> tris;
    for (uint32_t modelIndex = 0; modelIndex < uint32_t(models.size()); modelIndex++) {
        const Model& model = *(models[modelIndex]);
        const MeshData& meshData = model.getMesh();
        for (const auto& t : meshData.triShade) {
            uint32_t curVertexCount = uint32_t(vertices.size());
            tris.push_back(
                {t.indices[0] + curVertexCount, t.indices[1] + curVertexCount, t.indices[2] + curVertexCount});
        }
        for (const auto& v : meshData.verts) {
            vector4 p = model.getTransform() * vector4(v.pos, 1.0);
            vertices.push_back(vector3(p));
        }
    }

    assert(vertices.size() <= INT_MAX);
    assert(tris.size() <= INT_MAX);

#if DUMP_BINARY
    FILE* file = fopen((filename + "b").c_str(), "wb");
    char header[4] = {'O', 'F', 'F', 'b'};
    fwrite(header, sizeof(header), 1, file);

    int vertexCount = int(vertices.size());
    int triCount = int(tris.size());
    int edgeCount = 0;
    fwrite(&vertexCount, sizeof(vertexCount), 1, file);
    fwrite(&triCount, sizeof(triCount), 1, file);
    fwrite(&edgeCount, sizeof(edgeCount), 1, file);

    fwrite(vertices.data(), sizeof(vector3) * vertexCount, 1, file);
    // note - assuming 3 vertices per polygon (triangles)
    fwrite(tris.data(), sizeof(uint3) * triCount, 1, file);
    fclose(file);
#else
    FILE* file = fopen(filename.c_str(), "w");
    fprintf(file, "OFF\n");
    fprintf(file, "%d %d %d\n", (int)vertices.size(), (int)tris.size(), 0);
    for (auto v : vertices) {
        fprintf(file, "%f %f %f\n", v[0], v[1], v[2]);
    }
    for (auto t : tris) {
        fprintf(file, "3 %d %d %d\n", (int)t.x, (int)t.y, (int)t.z);
    }
    fclose(file);
#endif
}