From d7a45311ed8c007cee550660ac434921b017b70e Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Thu, 29 Nov 2012 00:45:26 -0200 Subject: [PATCH] Fix issue #145, #29 and #39 --- src/otclient/lightview.cpp | 29 ++++++++++++++--------------- src/otclient/lightview.h | 9 ++------- src/otclient/mapview.cpp | 30 ++++++++++++++++-------------- 3 files changed, 32 insertions(+), 36 deletions(-) diff --git a/src/otclient/lightview.cpp b/src/otclient/lightview.cpp index c8f00bc5..c1fcc15c 100644 --- a/src/otclient/lightview.cpp +++ b/src/otclient/lightview.cpp @@ -29,7 +29,7 @@ LightView::LightView() { - m_lightbuffer = g_framebuffers.getTemporaryFrameBuffer(); + m_lightbuffer = g_framebuffers.createFrameBuffer(); generateLightBuble(); reset(); } @@ -64,7 +64,7 @@ void LightView::generateLightBuble() void LightView::reset() { - m_numLights = 0; + m_lightMap.clear(); } void LightView::setGlobalLight(const Light& light) @@ -74,26 +74,25 @@ void LightView::setGlobalLight(const Light& light) void LightView::addLightSource(const Point& center, float scaleFactor, const Light& light) { - if(m_numLights > MAX_LIGHTS) - return; - int radius = light.intensity * 64 * scaleFactor; - m_lightMap[m_numLights].center = center; - m_lightMap[m_numLights].color = Color::from8bit(light.color); - m_lightMap[m_numLights].radius = radius; - m_numLights++; + LightSource source; + source.center = center; + source.color = Color::from8bit(light.color); + source.radius = radius; + m_lightMap.push_back(source); } -void LightView::drawGlobalLight(const Light& light) +void LightView::drawGlobalLight(const Light& light, const Size& size) { Color color = Color::from8bit(light.color); - float factor = 0;//std::max(256 - light.intensity, 0) / 256.0f; + float factor = light.intensity / 256.0f; color.setRed(color.rF() * factor); color.setGreen(color.gF() * factor); color.setBlue(color.bF() * factor); color.setAlpha(1.0f); - g_painter->clear(color); + g_painter->setColor(color); + g_painter->drawFilledRect(Rect(0,0,size)); } void LightView::drawLightSource(const Point& center, const Color& color, int radius) @@ -110,10 +109,10 @@ void LightView::draw(Size size) { m_lightbuffer->resize(size); m_lightbuffer->bind(); - drawGlobalLight(m_globalLight); + drawGlobalLight(m_globalLight, size); g_painter->setCompositionMode(Painter::CompositionMode_Add); - for(int i=0;irelease(); g_painter->setCompositionMode(Painter::CompositionMode_Light); diff --git a/src/otclient/lightview.h b/src/otclient/lightview.h index 6ad86799..a6ff856f 100644 --- a/src/otclient/lightview.h +++ b/src/otclient/lightview.h @@ -35,10 +35,6 @@ struct LightSource { class LightView : public LuaObject { - enum { - MAX_LIGHTS = 1024 - }; - public: LightView(); @@ -48,16 +44,15 @@ public: void draw(Size size); private: - void drawGlobalLight(const Light& light); + void drawGlobalLight(const Light& light, const Size& size); void drawLightSource(const Point& center, const Color& color, int radius); void generateLightBuble(); TexturePtr m_lightTexture; FrameBufferPtr m_lightbuffer; MapView* m_mapView; - int m_numLights; Light m_globalLight; - std::array m_lightMap; + std::vector m_lightMap; }; #endif // LIGHTVIEW_H diff --git a/src/otclient/mapview.cpp b/src/otclient/mapview.cpp index b2ec5c0b..9eebd78d 100644 --- a/src/otclient/mapview.cpp +++ b/src/otclient/mapview.cpp @@ -90,14 +90,6 @@ void MapView::draw(const Rect& rect) Size tileSize = Size(1,1) * m_tileSize; - if(m_drawLights) { - m_lightView->reset(); - Light globalLight = g_map.getLight(); - if(cameraPosition.z <= 7) - globalLight.intensity = std::min(200, globalLight.intensity); - m_lightView->setGlobalLight(globalLight); - } - if(m_mustDrawVisibleTilesCache || (drawFlags & Otc::DrawAnimations)) { m_framebuffer->bind(); @@ -105,6 +97,19 @@ void MapView::draw(const Rect& rect) Rect clearRect = Rect(0, 0, m_drawDimension * m_tileSize); g_painter->setColor(Color::black); g_painter->drawFilledRect(clearRect); + + if(m_drawLights) { + m_lightView->reset(); + + if(cameraPosition.z <= 7) + m_lightView->setGlobalLight(g_map.getLight()); + else { + Light undergroundLight; + undergroundLight.color = 0; + undergroundLight.intensity = 0; + m_lightView->setGlobalLight(undergroundLight); + } + } } g_painter->setColor(Color::white); @@ -139,6 +144,9 @@ void MapView::draw(const Rect& rect) } } + if(m_drawLights && m_updateTilesPos == 0) + m_lightView->draw(m_framebuffer->getSize()); + m_framebuffer->release(); // generating mipmaps each frame can be slow in older cards @@ -147,12 +155,6 @@ void MapView::draw(const Rect& rect) m_mustDrawVisibleTilesCache = false; } - if(m_drawLights) { - m_framebuffer->bind(); - m_lightView->draw(m_framebuffer->getSize()); - m_framebuffer->release(); - } - Point drawOffset = ((m_drawDimension - m_visibleDimension - Size(1,1)).toPoint()/2) * m_tileSize; if(isFollowingCreature()) drawOffset += m_followingCreature->getWalkOffset() * scaleFactor;