Scene * AssimpSceneLoader::load(const std::string & filename, const reflectionzeug::Variant & options, std::function<void(int, int)> /*progress*/) const { bool smoothNormals = false; // Get options const reflectionzeug::VariantMap * map = options.asMap(); if (map) { if (map->count("smoothNormals") > 0) smoothNormals = map->at("smoothNormals").value<bool>(); } // Import scene auto assimpScene = aiImportFile( filename.c_str(), aiProcess_Triangulate | aiProcess_JoinIdenticalVertices | aiProcess_SortByPType | (smoothNormals ? aiProcess_GenSmoothNormals : aiProcess_GenNormals)); // Check for errors if (!assimpScene) { std::cout << aiGetErrorString(); return nullptr; } // Convert scene into gloperate scene Scene * scene = convertScene(assimpScene); // Release scene aiReleaseImport(assimpScene); // Return loaded scene return scene; }
Common::Error FullpipeEngine::run() { const Graphics::PixelFormat format(4, 8, 8, 8, 8, 24, 16, 8, 0); // Initialize backend initGraphics(800, 600, true, &format); _backgroundSurface.create(800, 600, format); _origFormat = new Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0); _console = new Console(this); initialize(); _isSaveAllowed = false; int scene = 0; if (ConfMan.hasKey("boot_param")) scene = convertScene(ConfMan.getInt("boot_param")); if (!loadGam("fullpipe.gam", scene)) return Common::kNoGameDataFoundError; #if 0 loadAllScenes(); #endif _gameContinue = true; while (_gameContinue) { updateEvents(); updateScreen(); if (_needRestart) { if (_modalObject) { delete _modalObject; _modalObject = 0; } freeGameLoader(); _currentScene = 0; _updateTicks = 0; loadGam("fullpipe.gam"); _needRestart = false; } if (_normalSpeed) _system->delayMillis(10); _system->updateScreen(); } freeGameLoader(); cleanup(); return Common::kNoError; }
/* called by the C++ code for initialization */ extern "C" void device_init (char* cfg) { /* create new Embree device */ g_device = rtcNewDevice(cfg); error_handler(rtcDeviceGetError(g_device)); /* set error handler */ rtcDeviceSetErrorFunction(g_device,error_handler); /* create scene */ g_scene = convertScene(g_ispc_scene); rtcCommit (g_scene); /* set render tile function to use */ renderTile = renderTileStandard; key_pressed_handler = device_key_pressed_default; }
/* called by the C++ code to render */ extern "C" void device_render (int* pixels, const int width, const int height, const float time, const Vec3fa& vx, const Vec3fa& vy, const Vec3fa& vz, const Vec3fa& p) { /* create scene */ if (g_scene == NULL) g_scene = convertScene(g_ispc_scene); /* create accumulator */ if (g_accu_width != width || g_accu_height != height) { //g_accu = new Vec3fa[width*height]; g_accu = (Vec3fa*)alignedMalloc(width*height*sizeof(Vec3fa)); g_accu_width = width; g_accu_height = height; memset(g_accu,0,width*height*sizeof(Vec3fa)); } /* reset accumulator */ bool camera_changed = g_changed; g_changed = false; camera_changed |= ne(g_accu_vx,vx); g_accu_vx = vx; // FIXME: use != operator camera_changed |= ne(g_accu_vy,vy); g_accu_vy = vy; // FIXME: use != operator camera_changed |= ne(g_accu_vz,vz); g_accu_vz = vz; // FIXME: use != operator camera_changed |= ne(g_accu_p, p); g_accu_p = p; // FIXME: use != operator g_accu_count++; if (camera_changed) { g_accu_count=0; memset(g_accu,0,width*height*sizeof(Vec3fa)); } /* render frame */ const int numTilesX = (width +TILE_SIZE_X-1)/TILE_SIZE_X; const int numTilesY = (height+TILE_SIZE_Y-1)/TILE_SIZE_Y; enableFilterDispatch = renderPixel == renderPixelStandard; launch_renderTile(numTilesX*numTilesY,pixels,width,height,time,vx,vy,vz,p,numTilesX,numTilesY); enableFilterDispatch = false; rtcDebug(); }
/* called by the C++ code to render */ extern "C" void device_render (int* pixels, const unsigned int width, const unsigned int height, const float time, const ISPCCamera& camera) { bool camera_changed = g_changed; g_changed = false; /* create scene */ if (g_scene == nullptr) { g_scene = convertScene(g_ispc_scene); if (g_subdiv_mode) updateEdgeLevels(g_ispc_scene, camera.xfm.p); rtcCommit (g_scene); old_p = camera.xfm.p; } else { /* check if camera changed */ if (ne(camera.xfm.p,old_p)) { camera_changed = true; old_p = camera.xfm.p; } /* update edge levels if camera changed */ if (camera_changed && g_subdiv_mode) { updateEdgeLevels(g_ispc_scene,camera.xfm.p); rtcCommit (g_scene); } } /* render image */ const int numTilesX = (width +TILE_SIZE_X-1)/TILE_SIZE_X; const int numTilesY = (height+TILE_SIZE_Y-1)/TILE_SIZE_Y; parallel_for(size_t(0),size_t(numTilesX*numTilesY),[&](const range<size_t>& range) { const int threadIndex = (int)TaskScheduler::threadIndex(); for (size_t i=range.begin(); i<range.end(); i++) renderTileTask((int)i,threadIndex,pixels,width,height,time,camera,numTilesX,numTilesY); }); //rtcDebug(); }
Common::Error FullpipeEngine::run() { const Graphics::PixelFormat format(4, 8, 8, 8, 8, 24, 16, 8, 0); // Initialize backend initGraphics(800, 600, true, &format); _backgroundSurface = new Graphics::Surface; _backgroundSurface->create(800, 600, format); _origFormat = new Graphics::PixelFormat(2, 5, 6, 5, 0, 11, 5, 0, 0); _console = new Console(this); initialize(); _isSaveAllowed = false; int scene = 0; if (ConfMan.hasKey("boot_param")) scene = convertScene(ConfMan.getInt("boot_param")); if (ConfMan.hasKey("save_slot")) scene = -1; if (!loadGam("fullpipe.gam", scene)) return Common::kNoGameDataFoundError; if (ConfMan.hasKey("save_slot")) { loadGameState(ConfMan.getInt("save_slot")); } #if 0 loadAllScenes(); #endif _gameContinue = true; int time1 = g_fp->_system->getMillis(); // Center mouse _system->warpMouse(400, 300); while (_gameContinue) { updateEvents(); int time2 = g_fp->_system->getMillis(); // 30fps if (time2 - time1 >= 33 || !_normalSpeed) { time1 = time2; updateScreen(); } if (_needRestart) { if (_modalObject) { delete _modalObject; _modalObject = 0; } freeGameLoader(); _currentScene = 0; _updateTicks = 0; loadGam("fullpipe.gam"); _needRestart = false; } _system->delayMillis(5); _system->updateScreen(); } freeGameLoader(); cleanup(); return Common::kNoError; }