comparison engine/core/view/camera.cpp @ 579:b2feacaed53c

* Added the colorbuffer patch with a small change due to SDL. Performance boost between 20-30% under OpenGL. * Improved the most renderers with setColor() function. * Fixed the genericrenderer, is now tested whether the images are in the viewport. * Fixed the gridrenderer, the grid is now drawn only up to the viewport. * Changed the vertex functions in opengl/renderbackendopengl.cpp from vertex3f() to vertex2f(). * Improved the Editor, now you can use blocking, grid and coordinate renderer over gui or keys. Additionally, the colors can be changed with the settings.xml.
author helios2000@33b003aa-7bff-0310-803a-e67f0ece8222
date Sat, 31 Jul 2010 17:46:19 +0000
parents c9113e23b004
children d242e6ce6f9f
comparison
equal deleted inserted replaced
578:54d83a0462ee 579:b2feacaed53c
111 m_map_observer = new MapObserver(this); 111 m_map_observer = new MapObserver(this);
112 m_map = 0; 112 m_map = 0;
113 Location location; 113 Location location;
114 location.setLayer(layer); 114 location.setLayer(layer);
115 setLocation(location); 115 setLocation(location);
116 if(m_renderbackend->getName() == "SDL") {
117 m_backendSDL = true;
118 } else {
119 m_backendSDL = false;
120 }
116 } 121 }
117 122
118 Camera::~Camera() { 123 Camera::~Camera() {
119 // Trigger removal of LayerCaches and MapObserver 124 // Trigger removal of LayerCaches and MapObserver
120 updateMap(NULL); 125 updateMap(NULL);
122 std::map<std::string, RendererBase*>::iterator r_it = m_renderers.begin(); 127 std::map<std::string, RendererBase*>::iterator r_it = m_renderers.begin();
123 for(; r_it != m_renderers.end(); ++r_it) { 128 for(; r_it != m_renderers.end(); ++r_it) {
124 delete r_it->second; 129 delete r_it->second;
125 } 130 }
126 m_renderers.clear(); 131 m_renderers.clear();
132 m_renderbackend->isClearNeeded(true);
127 delete m_map_observer; 133 delete m_map_observer;
128 } 134 }
129 135
130 void Camera::setTilt(double tilt) { 136 void Camera::setTilt(double tilt) {
131 if(m_tilt != tilt) { 137 if(m_tilt != tilt) {
387 m_reference_scale = static_cast<double>(m_screen_cell_width) / dim.x; 393 m_reference_scale = static_cast<double>(m_screen_cell_width) / dim.x;
388 394
389 FL_DBG(_log, "Updating reference scale"); 395 FL_DBG(_log, "Updating reference scale");
390 FL_DBG(_log, LMsg(" tilt=") << m_tilt << " rot=" << m_rotation); 396 FL_DBG(_log, LMsg(" tilt=") << m_tilt << " rot=" << m_rotation);
391 FL_DBG(_log, LMsg(" m_screen_cell_width=") << m_screen_cell_width); 397 FL_DBG(_log, LMsg(" m_screen_cell_width=") << m_screen_cell_width);
398 }
399
400 bool Camera::testRenderedViewPort() {
401 Map* map = m_location.getMap();
402 Rect cv = m_viewport;
403 int cv2x = cv.x+cv.w;
404 int cv2y = cv.y+cv.h;
405 bool trec1 = false, trec2 = false, trec3 = false, trec4 = false;
406 Rect rec1 = Rect(cv.x, cv.y, 1, 1);
407 Rect rec2 = Rect(cv.x, cv2y, 1, 1);
408 Rect rec3 = Rect(cv2x, cv.y, 1, 1);
409 Rect rec4 = Rect(cv2x, cv2y, 1, 1);
410
411 const std::list<Layer*>& layers = map->getLayers();
412 std::list<Layer*>::const_iterator layer_it = layers.begin();
413 const RenderList& layer_instances = m_layer_to_instances[*layer_it];
414 RenderList::const_iterator instance_it = layer_instances.begin();
415 for(; instance_it != layer_instances.end(); ++instance_it) {
416 Instance* i = (*instance_it)->instance;
417 const RenderItem& vc = **instance_it;
418 if(vc.dimensions.intersects(rec1) && !trec1) {
419 trec1 = true;
420 }
421 if(vc.dimensions.intersects(rec2) && !trec2) {
422 trec2 = true;
423 }
424 if(trec1 && trec2) {
425 break;
426 }
427 }
428 if(trec1 && trec2) {
429 RenderList::const_reverse_iterator instance_itr = layer_instances.rbegin();
430 for(; instance_itr != layer_instances.rend(); ++instance_itr) {
431 Instance* i = (*instance_itr)->instance;
432 const RenderItem& vc = **instance_itr;
433 if(vc.dimensions.intersects(rec3) && !trec3) {
434 trec3 = true;
435 }
436 if(vc.dimensions.intersects(rec4) && !trec4) {
437 trec4 = true;
438 }
439 if(trec3 && trec4) {
440 break;
441 }
442 }
443 }
444
445 if(trec1 && trec2 && trec3 && trec4) {
446 m_renderbackend->isClearNeeded(false);
447 return false;
448 }
449 m_renderbackend->isClearNeeded(true);
450 return true;
392 } 451 }
393 452
394 void Camera::getMatchingInstances(ScreenPoint screen_coords, Layer& layer, std::list<Instance*>& instances) { 453 void Camera::getMatchingInstances(ScreenPoint screen_coords, Layer& layer, std::list<Instance*>& instances) {
395 instances.clear(); 454 instances.clear();
396 const RenderList& layer_instances = m_layer_to_instances[&layer]; 455 const RenderList& layer_instances = m_layer_to_instances[&layer];
580 } 639 }
581 //if ((!map->isChanged()) && (!m_iswarped) && (cammove == ScreenPoint(0,0,0))) { 640 //if ((!map->isChanged()) && (!m_iswarped) && (cammove == ScreenPoint(0,0,0))) {
582 // return; 641 // return;
583 //} 642 //}
584 643
644 if(m_backendSDL) {
645 m_renderbackend->pushClipArea(getViewPort());
646 } else {
647 m_renderbackend->pushClipArea(getViewPort(), testRenderedViewPort());
648 }
585 // update each layer 649 // update each layer
586 m_renderbackend->pushClipArea(getViewPort());
587 // m_layer_to_instances.clear(); 650 // m_layer_to_instances.clear();
588 const std::list<Layer*>& layers = map->getLayers(); 651 const std::list<Layer*>& layers = map->getLayers();
589 std::list<Layer*>::const_iterator layer_it = layers.begin(); 652 std::list<Layer*>::const_iterator layer_it = layers.begin();
590 for (;layer_it != layers.end(); ++layer_it) { 653 for (;layer_it != layers.end(); ++layer_it) {
591 LayerCache* cache = m_cache[*layer_it]; 654 LayerCache* cache = m_cache[*layer_it];