parent
							
								
									81068f820d
								
							
						
					
					
						commit
						d7a45311ed
					
				|  | @ -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<int>(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;i<m_numLights;++i) | ||||
|         drawLightSource(m_lightMap[i].center, m_lightMap[i].color, m_lightMap[i].radius); | ||||
|     for(const LightSource& source : m_lightMap) | ||||
|         drawLightSource(source.center, source.color, source.radius); | ||||
|     m_lightbuffer->release(); | ||||
| 
 | ||||
|     g_painter->setCompositionMode(Painter::CompositionMode_Light); | ||||
|  |  | |||
|  | @ -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<LightSource, MAX_LIGHTS> m_lightMap; | ||||
|     std::vector<LightSource> m_lightMap; | ||||
| }; | ||||
| 
 | ||||
| #endif // LIGHTVIEW_H
 | ||||
|  |  | |||
|  | @ -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<uint8>(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; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Eduardo Bart
						Eduardo Bart