Mercurial > fife-parpg
diff 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 |
line wrap: on
line diff
--- a/engine/core/view/camera.cpp Fri Jul 30 23:48:26 2010 +0000 +++ b/engine/core/view/camera.cpp Sat Jul 31 17:46:19 2010 +0000 @@ -113,6 +113,11 @@ Location location; location.setLayer(layer); setLocation(location); + if(m_renderbackend->getName() == "SDL") { + m_backendSDL = true; + } else { + m_backendSDL = false; + } } Camera::~Camera() { @@ -124,6 +129,7 @@ delete r_it->second; } m_renderers.clear(); + m_renderbackend->isClearNeeded(true); delete m_map_observer; } @@ -391,6 +397,59 @@ FL_DBG(_log, LMsg(" m_screen_cell_width=") << m_screen_cell_width); } + bool Camera::testRenderedViewPort() { + Map* map = m_location.getMap(); + Rect cv = m_viewport; + int cv2x = cv.x+cv.w; + int cv2y = cv.y+cv.h; + bool trec1 = false, trec2 = false, trec3 = false, trec4 = false; + Rect rec1 = Rect(cv.x, cv.y, 1, 1); + Rect rec2 = Rect(cv.x, cv2y, 1, 1); + Rect rec3 = Rect(cv2x, cv.y, 1, 1); + Rect rec4 = Rect(cv2x, cv2y, 1, 1); + + const std::list<Layer*>& layers = map->getLayers(); + std::list<Layer*>::const_iterator layer_it = layers.begin(); + const RenderList& layer_instances = m_layer_to_instances[*layer_it]; + RenderList::const_iterator instance_it = layer_instances.begin(); + for(; instance_it != layer_instances.end(); ++instance_it) { + Instance* i = (*instance_it)->instance; + const RenderItem& vc = **instance_it; + if(vc.dimensions.intersects(rec1) && !trec1) { + trec1 = true; + } + if(vc.dimensions.intersects(rec2) && !trec2) { + trec2 = true; + } + if(trec1 && trec2) { + break; + } + } + if(trec1 && trec2) { + RenderList::const_reverse_iterator instance_itr = layer_instances.rbegin(); + for(; instance_itr != layer_instances.rend(); ++instance_itr) { + Instance* i = (*instance_itr)->instance; + const RenderItem& vc = **instance_itr; + if(vc.dimensions.intersects(rec3) && !trec3) { + trec3 = true; + } + if(vc.dimensions.intersects(rec4) && !trec4) { + trec4 = true; + } + if(trec3 && trec4) { + break; + } + } + } + + if(trec1 && trec2 && trec3 && trec4) { + m_renderbackend->isClearNeeded(false); + return false; + } + m_renderbackend->isClearNeeded(true); + return true; + } + void Camera::getMatchingInstances(ScreenPoint screen_coords, Layer& layer, std::list<Instance*>& instances) { instances.clear(); const RenderList& layer_instances = m_layer_to_instances[&layer]; @@ -582,8 +641,12 @@ // return; //} + if(m_backendSDL) { + m_renderbackend->pushClipArea(getViewPort()); + } else { + m_renderbackend->pushClipArea(getViewPort(), testRenderedViewPort()); + } // update each layer - m_renderbackend->pushClipArea(getViewPort()); // m_layer_to_instances.clear(); const std::list<Layer*>& layers = map->getLayers(); std::list<Layer*>::const_iterator layer_it = layers.begin();