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
}