void Voxelizer() { std::cout << "Loading Model . . . "; // auto model = LoadObjModuleFromFile("data/sponza/sponza.obj"); // auto model = LoadObjModuleFromFile("data/leather_chair/leather_chair.obj"); auto model = LoadObjModuleFromFile("data/primitives/box.obj"); std::cout << "DONE" << std::endl; std::cout << "Rasterizing . . . "; RasterData raster; raster.voxelSize = voxelSize; RasterizeModel(&raster, *model, Matrix44f(zero)); std::cout << "DONE" << std::endl; std::cout << "Generating Sparce Map . . . "; SparceMap<SparceMapData, sparceMapSize> sparceMap; for (auto fragment : raster.fragments) SparceTreeInsertPoint(&sparceMap, sparceMapBox, fragment.position, sparceMapLevels); std::cout << "DONE" << std::endl; Vector3f center = Vector3f(zero); float dist = 10.0f; if (!raster.fragments.empty()) { for (auto fragment : raster.fragments) center = center + fragment.position; center = center * (1.0f / raster.fragments.size()); dist = 0.0f; for (auto fragment : raster.fragments) dist = Max(dist, Distance(center, fragment.position)); } ProtoGL protoGL; protoGL.Initialize(ProtoGLDesc()); OrbitalCamera camera(protoGL.GetCanvas()); camera.SetPerspective(1.4f, 1.0f, sparceMapDimension * 2.0f); camera.SetCamera(center, Quaternionf(zero), dist * 2.0f); glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); TimeCounter counter; while (protoGL.Update()) { Time deltaTime = counter.GetElapsed(); camera.Update(deltaTime); camera.CommitToGL(); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); Time time = GetTime(); Matrix44f objectTM = ToMatrix44(QuaternionAxisAngle(Vector3f(0.0f, 1.0f, 0.0f), time.AsFloat()*0.15f)); raster.fragments.clear(); SparceTreeClearData(&sparceMap); RasterizeModel(&raster, *model, objectTM); for (auto fragment : raster.fragments) SparceTreeInsertPoint(&sparceMap, sparceMapBox, fragment.position, sparceMapLevels); glPushMatrix(); glMultMatrixf(&objectTM[0]); DrawModel(*model); glPopMatrix(); DrawSparceMap(sparceMap, sparceMapBox); protoGL.Swap(); } }