Changeset 15 in flair-src for trunk/lib/FlairSimulator/src/Gui_impl.cpp
- Timestamp:
- 04/08/16 15:40:57 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/lib/FlairSimulator/src/Gui_impl.cpp
r10 r15 37 37 using namespace flair::simulator; 38 38 39 class MyEventReceiver : public IEventReceiver 40 { 39 class MyEventReceiver : public IEventReceiver { 41 40 public: 42 // This is the one method that we have to implement 43 virtual bool OnEvent(const SEvent& event) 44 { 45 // Remember whether each key is down or up 46 if (event.EventType == EET_KEY_INPUT_EVENT ) 47 KeyIsDown[event.KeyInput.Key] = event.KeyInput.PressedDown; 48 49 //Send all other events to camera 50 if (event.EventType == EET_MOUSE_INPUT_EVENT && camera) 51 //return camera->OnEvent(event); 52 return camera->MouseMoved(event,cursorControl->getRelativePosition()); 53 54 if(model) 55 return model->OnEvent(event); 56 57 return false; 58 } 59 60 // This is used to check whether a key is being held down 61 virtual bool IsKeyDown(EKEY_CODE keyCode) 62 { 63 if(KeyIsDown[keyCode]==true) 64 { 65 KeyIsDown[keyCode]=false; 66 return true; 67 } 68 else 69 { 70 return false; 71 } 72 } 73 74 MyEventReceiver(ICursorControl* cursorControl) 75 { 76 this->cursorControl=cursorControl; 77 camera=NULL; 78 model=NULL; 79 for (u32 i=0; i<KEY_KEY_CODES_COUNT; ++i) 80 KeyIsDown[i] = false; 81 } 82 void SetCamera(AnimPoursuite* camera) 83 { 84 this->camera=camera; 85 } 86 void SetModel(Model* model) 87 { 88 this->model=model; 89 } 41 // This is the one method that we have to implement 42 virtual bool OnEvent(const SEvent &event) { 43 // Remember whether each key is down or up 44 if (event.EventType == EET_KEY_INPUT_EVENT) 45 KeyIsDown[event.KeyInput.Key] = event.KeyInput.PressedDown; 46 47 // Send all other events to camera 48 if (event.EventType == EET_MOUSE_INPUT_EVENT && camera) 49 // return camera->OnEvent(event); 50 return camera->MouseMoved(event, cursorControl->getRelativePosition()); 51 52 if (model) 53 return model->OnEvent(event); 54 55 return false; 56 } 57 58 // This is used to check whether a key is being held down 59 virtual bool IsKeyDown(EKEY_CODE keyCode) { 60 if (KeyIsDown[keyCode] == true) { 61 KeyIsDown[keyCode] = false; 62 return true; 63 } else { 64 return false; 65 } 66 } 67 68 MyEventReceiver(ICursorControl *cursorControl) { 69 this->cursorControl = cursorControl; 70 camera = NULL; 71 model = NULL; 72 for (u32 i = 0; i < KEY_KEY_CODES_COUNT; ++i) 73 KeyIsDown[i] = false; 74 } 75 void SetCamera(AnimPoursuite *camera) { this->camera = camera; } 76 void SetModel(Model *model) { this->model = model; } 90 77 91 78 private: 92 93 94 AnimPoursuite*camera;95 Model*model;96 ICursorControl*cursorControl;79 // We use this array to store the current state of each key 80 bool KeyIsDown[KEY_KEY_CODES_COUNT]; 81 AnimPoursuite *camera; 82 Model *model; 83 ICursorControl *cursorControl; 97 84 }; 98 85 99 Gui_impl::Gui_impl(Gui* self,int app_width, int app_height,int scene_width, int scene_height,std::string media_path,E_DRIVER_TYPE driver_type) 100 { 101 this->self=self; 102 dbtFile_w=NULL; 103 dbtFile_r=NULL; 104 this->media_path=media_path; 105 this->scene_width=scene_width; 106 this->scene_height=scene_height; 107 108 device =createDevice(driver_type, dimension2d<u32>(app_width, app_height),16, false, false, false); 109 receiver=new MyEventReceiver(device->getCursorControl()); 110 device->setEventReceiver(receiver); 111 device->getLogger()->setLogLevel(ELL_NONE); 112 113 device->getCursorControl()->setVisible(false); 114 device->setResizable(false); 115 116 //font = device->getGUIEnvironment()->getBuiltInFont(); 117 driver = device->getVideoDriver(); 118 smgr = device->getSceneManager(); 119 120 smgr->setAmbientLight(video::SColorf(1,1,1)); 121 122 123 /* 124 env = device->getGUIEnvironment(); 86 Gui_impl::Gui_impl(Gui *self, int app_width, int app_height, int scene_width, 87 int scene_height, std::string media_path, 88 E_DRIVER_TYPE driver_type) { 89 this->self = self; 90 dbtFile_w = NULL; 91 dbtFile_r = NULL; 92 this->media_path = media_path; 93 this->scene_width = scene_width; 94 this->scene_height = scene_height; 95 96 device = createDevice(driver_type, dimension2d<u32>(app_width, app_height), 97 16, false, false, false); 98 receiver = new MyEventReceiver(device->getCursorControl()); 99 device->setEventReceiver(receiver); 100 device->getLogger()->setLogLevel(ELL_NONE); 101 102 device->getCursorControl()->setVisible(false); 103 device->setResizable(false); 104 105 // font = device->getGUIEnvironment()->getBuiltInFont(); 106 driver = device->getVideoDriver(); 107 smgr = device->getSceneManager(); 108 109 smgr->setAmbientLight(video::SColorf(1, 1, 1)); 110 111 /* 112 env = device->getGUIEnvironment(); 125 113 IGUISkin* skin = env->getSkin(); 126 font = env->getFont("./fonthaettenschweiler.bmp"); 127 128 if (font) 129 skin->setFont(font); 130 131 // create menu 132 133 IGUIContextMenu* menu = env->addMenu(); 134 menu->setMinSize(core::dimension2du(640,20)); 135 menu->addItem(L"File", -1, true, true); 136 menu->addItem(L"View", -1, true, true); 137 menu->addItem(L"Camera", -1, true, true); 138 menu->addItem(L"Help", -1, true, true); 139 140 // disable alpha 141 142 for (s32 i=0; i<gui::EGDC_COUNT ; ++i) 143 { 144 video::SColor col = env->getSkin()->getColor((gui::EGUI_DEFAULT_COLOR)i); 145 col.setAlpha(255); 146 env->getSkin()->setColor((gui::EGUI_DEFAULT_COLOR)i, col); 147 } 148 */ 149 } 150 151 Gui_impl::~Gui_impl() 152 { 153 //printf("del Gui_impl\n"); 154 device->drop(); 155 156 delete receiver; 157 // printf("del Gui_impl ok\n"); 158 } 159 160 void Gui_impl::setMesh(std::string file,vector3df position,vector3df rotation,vector3df scale) 161 { 162 IAnimatedMesh* mesh = smgr->getMesh(file.c_str()); 163 164 if (!mesh) { 165 // model could not be loaded 166 self->Err("Model %s could not be loaded\n",file.c_str()); 167 return; 168 } 169 170 171 node = smgr->addOctreeSceneNode(mesh->getMesh(0), 0, -1, 1024); 172 node->setPosition(position); 173 rotation+=irr::core::vector3df(90,0,Euler::ToDegree(getSimulator()->Yaw())); 174 node->setRotation(rotation); 175 for(int i=0; i<node->getMaterialCount();i++){ 176 node->getMaterial(i).TextureLayer->TextureWrapU = video::ETC_REPEAT; 177 node->getMaterial(i).TextureLayer->TextureWrapV = video::ETC_REPEAT; 178 } 179 //Ceillig 180 //node->getMaterial(0).getTextureMatrix(0).setTextureScale(scale.X/2.0,scale.Z/2.0); 181 //Walls 182 node->getMaterial(1).getTextureMatrix(0).setTextureScale(1/(scale.Y/2.5),1/(scale.Z/2.5)); 183 //Floor 184 node->getMaterial(2).getTextureMatrix(0).setTextureScale(1/(scale.X/20.0),1/(scale.Z/20.0)); 185 186 node->setScale(scale); 187 //selector 188 selector = smgr->createOctreeTriangleSelector(node->getMesh(), node, 128); 189 node->setTriangleSelector(selector); 190 } 191 192 void Gui_impl::RunGui(std::vector<Model*> models,std::vector<GenericObject*> objects) 193 { 194 int lastFPS = -1; 195 int cam_id=0; 196 197 receiver->SetCamera(models.at(cam_id)->pimpl_->animator); 198 receiver->SetModel(models.at(cam_id)); 199 200 for(size_t i=0;i<models.size();i++) 201 { 202 models.at(i)->Draw(); 203 } 204 205 for(size_t i=0;i<models.size();i++) 206 { 207 models.at(i)->pimpl_->MetaTriangleSelector()->addTriangleSelector(selector); 208 for(size_t j=0;j<objects.size();j++) 209 { 210 models.at(i)->pimpl_->MetaTriangleSelector()->addTriangleSelector(objects.at(j)->TriangleSelector()); 211 } 212 for(size_t j=0;j<models.size();j++) 213 { 214 if(i==j) continue; 215 models.at(i)->pimpl_->MetaTriangleSelector()->addTriangleSelector(models.at(j)->pimpl_->TriangleSelector()); 216 } 217 } 218 219 selector->drop(); // As soon as we're done with the selector, drop it.*/ 220 221 //wait all models to be started 222 for(size_t i=0;i<models.size();i++) 223 { 224 models.at(i)->pimpl_->SynchronizationPoint(); 225 } 226 227 setWindowCaption(models.at(0),0); 228 229 while(device->run()) 230 { 231 if(dbtFile_r!=NULL)//rejeu 232 { 233 takeScreenshot();//on enregistre l'image precedente 234 road_time_t time; 235 road_timerange_t tr = 0; 236 if(read_hdfile(dbtFile_r,(void*)dbtbuf,&time,&tr)!=0) 237 { 238 vector3df vect; 239 char *buf=dbtbuf; 240 for(size_t i=0;i<models.size();i++) 241 { 242 models.at(i)->ReaddbtBuf(buf); 243 buf+=models.at(i)->dbtSize(); 244 } 245 } 246 else 247 { 248 //Printf("fin play\n"); 249 close_hdfile(dbtFile_r); 250 dbtFile_r=NULL; 251 free(dbtbuf); 252 for(size_t i=0;i<models.size();i++) 253 { 254 models.at(i)->pimpl_->Resume(); 255 } 256 } 257 } 258 else//mode normal 259 { 260 for(size_t i=0;i<models.size();i++) 261 { 262 models.at(i)->pimpl_->UpdatePos(); 263 } 264 } 265 266 driver->beginScene(true, true, video::SColor(255,200,200,200)); 267 268 //vue poursuite 269 smgr->setActiveCamera(models.at(cam_id)->pimpl_->camera); 270 driver->setViewPort(core::rect<s32>(0,0,scene_width,scene_height)); 271 smgr->drawAll();//commente voir plus bas 272 /* 273 env->drawAll(); 274 if (font) 275 { 276 font->draw(L"This demo shows that Irrlicht is also capable of drawing 2D graphics.", 277 core::rect<s32>(130,10,300,50), 278 video::SColor(255,255,255,255)); 279 } 280 else 281 { 282 printf("err\n"); 283 } 284 device->setWindowCaption(L"toto");*/ 285 286 if(dbtFile_r==NULL)//mode normal 287 { 288 for(size_t i=0;i<models.size();i++) 289 { 290 models.at(i)->pimpl_->CheckCollision(); 291 } 292 } 293 294 for(size_t i=0;i<models.size();i++) 295 { 296 models.at(i)->ProcessUpdate(NULL); 297 } 298 299 //on fait ca ici, devrait etre un peu plus haut 300 //mais a priori souci avec models.at(i)->pimpl_->CheckCollision(); (setelipsoid?) 301 smgr->setActiveCamera(models.at(cam_id)->pimpl_->camera); 302 driver->setViewPort(core::rect<s32>(0,0,scene_width,scene_height)); 303 smgr->drawAll(); 304 305 driver->endScene(); 306 307 int fps =driver->getFPS(); 308 //printf("fps %i\n",fps); 309 if (lastFPS != fps) 310 { 311 setWindowCaption(models.at(cam_id),fps); 312 lastFPS = fps; 313 } 314 315 if(receiver->IsKeyDown(KEY_PRIOR)) 316 { 317 cam_id++; 318 if(cam_id>=(int)models.size()) cam_id=0; 319 receiver->SetCamera(models.at(cam_id)->pimpl_->animator); 320 receiver->SetModel(models.at(cam_id)); 321 setWindowCaption(models.at(cam_id),fps); 322 } 323 if(receiver->IsKeyDown(KEY_NEXT)) 324 { 325 cam_id--; 326 if(cam_id<0) cam_id=models.size()-1; 327 receiver->SetCamera(models.at(cam_id)->pimpl_->animator); 328 receiver->SetModel(models.at(cam_id)); 329 setWindowCaption(models.at(cam_id),fps); 330 } 331 332 //enregistrement DBT 333 if(receiver->IsKeyDown(KEY_KEY_R) && dbtFile_w==NULL) 334 { 335 dbtFile_w = inithdFile((char*)"./record.dbt",UAV,dbtSize(models)); 336 dbtbuf=(char*)malloc(dbtSize(models)); 337 } 338 if(receiver->IsKeyDown(KEY_KEY_S) && dbtFile_w!=NULL) 339 { 340 close_hdfile(dbtFile_w); 341 dbtFile_w=NULL; 342 free(dbtbuf); 343 //rt_printf("stop rec\n"); 344 } 345 if(dbtFile_w!=NULL) 346 { 347 Time time=GetTime(); 348 vector3df vect; 349 char *buf=dbtbuf; 350 351 for(size_t i=0;i<models.size();i++) 352 { 353 models.at(i)->WritedbtBuf(buf); 354 buf+=models.at(i)->dbtSize(); 355 } 356 357 write_hdfile(dbtFile_w,dbtbuf,(road_time_t)(time/1000),(road_timerange_t)(time%1000),dbtSize(models)); 358 } 359 360 //lecture dbt 361 if(receiver->IsKeyDown(KEY_KEY_P) && dbtFile_r==NULL) 362 { 363 dbtFile_r = open_hdfile((char*)"./record.dbt",READ_MODE); 364 dbtbuf=(char*)malloc(dbtSize(models)); 365 //on suspend les models pour ne pas interferer 366 for(size_t i=0;i<models.size();i++) 367 { 368 models.at(i)->pimpl_->Suspend(); 369 } 370 } 371 if(receiver->IsKeyDown(KEY_KEY_S) && dbtFile_r!=NULL) 372 { 373 //rt_printf("stop play\n"); 374 close_hdfile(dbtFile_r); 375 dbtFile_r=NULL; 376 free(dbtbuf); 377 //on resume les models 378 for(size_t i=0;i<models.size();i++) 379 { 380 models.at(i)->pimpl_->Resume(); 381 } 382 } 383 384 } 385 386 receiver->SetCamera(NULL); 387 receiver->SetModel(NULL); 388 389 } 390 391 void Gui_impl::setWindowCaption(Object* object, int fps) 392 { 393 std::ostringstream text; 394 text << "Cam: " << object->ObjectName().c_str() << ", Kbd: " << object->ObjectName().c_str() << ", FPS: " << fps; 395 396 device->setWindowCaption(stringw(text.str().c_str()).c_str()); 397 } 398 399 void Gui_impl::takeScreenshot(void) 400 { 401 static int cpt=0; 402 //get image from the last rendered frame 403 IImage* const image = driver->createScreenShot(); 404 if (image) //should always be true, but you never know. ;) 405 { 406 //construct a filename, consisting of local time and file extension 407 c8 filename[64]; 408 //snprintf(filename, 64, "screenshot_%u.png", device->getTimer()->getRealTime()); 409 snprintf(filename, 64, "screenshot_%u.png", cpt); 410 cpt++; 411 //write screenshot to file 412 if (!driver->writeImageToFile(image, filename)) 413 device->getLogger()->log(L"Failed to take screenshot.", ELL_WARNING); 414 415 //Don't forget to drop image since we don't need it anymore. 416 image->drop(); 417 } 418 } 419 420 size_t Gui_impl::dbtSize(std::vector<Model*> models) 421 { 422 size_t size=0; 423 for(size_t i=0;i<models.size();i++) 424 { 425 size+=models.at(i)->dbtSize(); 426 } 427 428 return size; 429 } 430 #endif //GL 114 font = env->getFont("./fonthaettenschweiler.bmp"); 115 116 if (font) 117 skin->setFont(font); 118 119 // create menu 120 121 IGUIContextMenu* menu = env->addMenu(); 122 menu->setMinSize(core::dimension2du(640,20)); 123 menu->addItem(L"File", -1, true, true); 124 menu->addItem(L"View", -1, true, true); 125 menu->addItem(L"Camera", -1, true, true); 126 menu->addItem(L"Help", -1, true, true); 127 128 // disable alpha 129 130 for (s32 i=0; i<gui::EGDC_COUNT ; ++i) 131 { 132 video::SColor col = 133 env->getSkin()->getColor((gui::EGUI_DEFAULT_COLOR)i); 134 col.setAlpha(255); 135 env->getSkin()->setColor((gui::EGUI_DEFAULT_COLOR)i, col); 136 } 137 */ 138 } 139 140 Gui_impl::~Gui_impl() { 141 // printf("del Gui_impl\n"); 142 device->drop(); 143 144 delete receiver; 145 // printf("del Gui_impl ok\n"); 146 } 147 148 void Gui_impl::setMesh(std::string file, vector3df position, vector3df rotation, 149 vector3df scale) { 150 IAnimatedMesh *mesh = smgr->getMesh(file.c_str()); 151 152 if (!mesh) { 153 // model could not be loaded 154 self->Err("Model %s could not be loaded\n", file.c_str()); 155 return; 156 } 157 158 node = smgr->addOctreeSceneNode(mesh->getMesh(0), 0, -1, 1024); 159 node->setPosition(position); 160 rotation += 161 irr::core::vector3df(90, 0, Euler::ToDegree(getSimulator()->Yaw())); 162 node->setRotation(rotation); 163 for (int i = 0; i < node->getMaterialCount(); i++) { 164 node->getMaterial(i).TextureLayer->TextureWrapU = video::ETC_REPEAT; 165 node->getMaterial(i).TextureLayer->TextureWrapV = video::ETC_REPEAT; 166 } 167 // Ceillig 168 // node->getMaterial(0).getTextureMatrix(0).setTextureScale(scale.X/2.0,scale.Z/2.0); 169 // Walls 170 node->getMaterial(1).getTextureMatrix(0).setTextureScale(1 / (scale.Y / 2.5), 171 1 / (scale.Z / 2.5)); 172 // Floor 173 node->getMaterial(2).getTextureMatrix(0).setTextureScale( 174 1 / (scale.X / 20.0), 1 / (scale.Z / 20.0)); 175 176 node->setScale(scale); 177 // selector 178 selector = smgr->createOctreeTriangleSelector(node->getMesh(), node, 128); 179 node->setTriangleSelector(selector); 180 } 181 182 void Gui_impl::RunGui(std::vector<Model *> models, 183 std::vector<GenericObject *> objects) { 184 int lastFPS = -1; 185 int cam_id = 0; 186 187 receiver->SetCamera(models.at(cam_id)->pimpl_->animator); 188 receiver->SetModel(models.at(cam_id)); 189 190 for (size_t i = 0; i < models.size(); i++) { 191 models.at(i)->Draw(); 192 } 193 194 for (size_t i = 0; i < models.size(); i++) { 195 models.at(i)->pimpl_->MetaTriangleSelector()->addTriangleSelector(selector); 196 for (size_t j = 0; j < objects.size(); j++) { 197 models.at(i)->pimpl_->MetaTriangleSelector()->addTriangleSelector( 198 objects.at(j)->TriangleSelector()); 199 } 200 for (size_t j = 0; j < models.size(); j++) { 201 if (i == j) 202 continue; 203 models.at(i)->pimpl_->MetaTriangleSelector()->addTriangleSelector( 204 models.at(j)->pimpl_->TriangleSelector()); 205 } 206 } 207 208 selector->drop(); // As soon as we're done with the selector, drop it.*/ 209 210 // wait all models to be started 211 for (size_t i = 0; i < models.size(); i++) { 212 models.at(i)->pimpl_->SynchronizationPoint(); 213 } 214 215 setWindowCaption(models.at(0), 0); 216 217 while (device->run()) { 218 if (dbtFile_r != NULL) // rejeu 219 { 220 takeScreenshot(); // on enregistre l'image precedente 221 road_time_t time; 222 road_timerange_t tr = 0; 223 if (read_hdfile(dbtFile_r, (void *)dbtbuf, &time, &tr) != 0) { 224 vector3df vect; 225 char *buf = dbtbuf; 226 for (size_t i = 0; i < models.size(); i++) { 227 models.at(i)->ReaddbtBuf(buf); 228 buf += models.at(i)->dbtSize(); 229 } 230 } else { 231 // Printf("fin play\n"); 232 close_hdfile(dbtFile_r); 233 dbtFile_r = NULL; 234 free(dbtbuf); 235 for (size_t i = 0; i < models.size(); i++) { 236 models.at(i)->pimpl_->Resume(); 237 } 238 } 239 } else // mode normal 240 { 241 for (size_t i = 0; i < models.size(); i++) { 242 models.at(i)->pimpl_->UpdatePos(); 243 } 244 } 245 246 driver->beginScene(true, true, video::SColor(255, 200, 200, 200)); 247 248 // vue poursuite 249 smgr->setActiveCamera(models.at(cam_id)->pimpl_->camera); 250 driver->setViewPort(core::rect<s32>(0, 0, scene_width, scene_height)); 251 smgr->drawAll(); // commente voir plus bas 252 /* 253 env->drawAll(); 254 if (font) 255 { 256 font->draw(L"This demo shows that Irrlicht is also capable 257 of drawing 2D graphics.", 258 core::rect<s32>(130,10,300,50), 259 video::SColor(255,255,255,255)); 260 } 261 else 262 { 263 printf("err\n"); 264 } 265 device->setWindowCaption(L"toto");*/ 266 267 if (dbtFile_r == NULL) // mode normal 268 { 269 for (size_t i = 0; i < models.size(); i++) { 270 models.at(i)->pimpl_->CheckCollision(); 271 } 272 } 273 274 for (size_t i = 0; i < models.size(); i++) { 275 models.at(i)->ProcessUpdate(NULL); 276 } 277 278 // on fait ca ici, devrait etre un peu plus haut 279 // mais a priori souci avec models.at(i)->pimpl_->CheckCollision(); 280 // (setelipsoid?) 281 smgr->setActiveCamera(models.at(cam_id)->pimpl_->camera); 282 driver->setViewPort(core::rect<s32>(0, 0, scene_width, scene_height)); 283 smgr->drawAll(); 284 285 driver->endScene(); 286 287 int fps = driver->getFPS(); 288 // printf("fps %i\n",fps); 289 if (lastFPS != fps) { 290 setWindowCaption(models.at(cam_id), fps); 291 lastFPS = fps; 292 } 293 294 if (receiver->IsKeyDown(KEY_PRIOR)) { 295 cam_id++; 296 if (cam_id >= (int)models.size()) 297 cam_id = 0; 298 receiver->SetCamera(models.at(cam_id)->pimpl_->animator); 299 receiver->SetModel(models.at(cam_id)); 300 setWindowCaption(models.at(cam_id), fps); 301 } 302 if (receiver->IsKeyDown(KEY_NEXT)) { 303 cam_id--; 304 if (cam_id < 0) 305 cam_id = models.size() - 1; 306 receiver->SetCamera(models.at(cam_id)->pimpl_->animator); 307 receiver->SetModel(models.at(cam_id)); 308 setWindowCaption(models.at(cam_id), fps); 309 } 310 311 // enregistrement DBT 312 if (receiver->IsKeyDown(KEY_KEY_R) && dbtFile_w == NULL) { 313 dbtFile_w = inithdFile((char *)"./record.dbt", UAV, dbtSize(models)); 314 dbtbuf = (char *)malloc(dbtSize(models)); 315 } 316 if (receiver->IsKeyDown(KEY_KEY_S) && dbtFile_w != NULL) { 317 close_hdfile(dbtFile_w); 318 dbtFile_w = NULL; 319 free(dbtbuf); 320 // rt_printf("stop rec\n"); 321 } 322 if (dbtFile_w != NULL) { 323 Time time = GetTime(); 324 vector3df vect; 325 char *buf = dbtbuf; 326 327 for (size_t i = 0; i < models.size(); i++) { 328 models.at(i)->WritedbtBuf(buf); 329 buf += models.at(i)->dbtSize(); 330 } 331 332 write_hdfile(dbtFile_w, dbtbuf, (road_time_t)(time / 1000), 333 (road_timerange_t)(time % 1000), dbtSize(models)); 334 } 335 336 // lecture dbt 337 if (receiver->IsKeyDown(KEY_KEY_P) && dbtFile_r == NULL) { 338 dbtFile_r = open_hdfile((char *)"./record.dbt", READ_MODE); 339 dbtbuf = (char *)malloc(dbtSize(models)); 340 // on suspend les models pour ne pas interferer 341 for (size_t i = 0; i < models.size(); i++) { 342 models.at(i)->pimpl_->Suspend(); 343 } 344 } 345 if (receiver->IsKeyDown(KEY_KEY_S) && dbtFile_r != NULL) { 346 // rt_printf("stop play\n"); 347 close_hdfile(dbtFile_r); 348 dbtFile_r = NULL; 349 free(dbtbuf); 350 // on resume les models 351 for (size_t i = 0; i < models.size(); i++) { 352 models.at(i)->pimpl_->Resume(); 353 } 354 } 355 } 356 357 receiver->SetCamera(NULL); 358 receiver->SetModel(NULL); 359 } 360 361 void Gui_impl::setWindowCaption(Object *object, int fps) { 362 std::ostringstream text; 363 text << "Cam: " << object->ObjectName().c_str() 364 << ", Kbd: " << object->ObjectName().c_str() << ", FPS: " << fps; 365 366 device->setWindowCaption(stringw(text.str().c_str()).c_str()); 367 } 368 369 void Gui_impl::takeScreenshot(void) { 370 static int cpt = 0; 371 // get image from the last rendered frame 372 IImage *const image = driver->createScreenShot(); 373 if (image) // should always be true, but you never know. ;) 374 { 375 // construct a filename, consisting of local time and file extension 376 c8 filename[64]; 377 // snprintf(filename, 64, "screenshot_%u.png", 378 // device->getTimer()->getRealTime()); 379 snprintf(filename, 64, "screenshot_%u.png", cpt); 380 cpt++; 381 // write screenshot to file 382 if (!driver->writeImageToFile(image, filename)) 383 device->getLogger()->log(L"Failed to take screenshot.", ELL_WARNING); 384 385 // Don't forget to drop image since we don't need it anymore. 386 image->drop(); 387 } 388 } 389 390 size_t Gui_impl::dbtSize(std::vector<Model *> models) { 391 size_t size = 0; 392 for (size_t i = 0; i < models.size(); i++) { 393 size += models.at(i)->dbtSize(); 394 } 395 396 return size; 397 } 398 #endif // GL
Note:
See TracChangeset
for help on using the changeset viewer.