Mercurial > fife-parpg
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]; |