From 3e52ae4ca9e27607b5691da0edbf3454e5e6099b Mon Sep 17 00:00:00 2001 From: Piotr Dziwinski Date: Mon, 27 Aug 2012 01:02:25 +0200 Subject: Fixes in terrain rendering --- src/graphics/engine/engine.cpp | 32 +++++++++++++++++++++----------- src/graphics/engine/lightman.cpp | 1 + src/graphics/engine/terrain.cpp | 12 +++++++++--- 3 files changed, 31 insertions(+), 14 deletions(-) (limited to 'src/graphics') diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp index 3187dde..1359cf6 100644 --- a/src/graphics/engine/engine.cpp +++ b/src/graphics/engine/engine.cpp @@ -260,6 +260,8 @@ bool Gfx::CEngine::Create() m_lightning = new Gfx::CLightning(m_iMan, this); m_planet = new Gfx::CPlanet(m_iMan, this); + m_lightMan->SetDevice(m_device); + m_text->SetDevice(m_device); if (! m_text->Create()) { @@ -979,7 +981,7 @@ Gfx::EngineObjLevel4* Gfx::CEngine::FindTriangles(int objRank, const Gfx::Materi for (int l3 = 0; l3 < static_cast( p2.next.size() ); l3++) { - Gfx::EngineObjLevel3& p3 = p2.next[l1]; + Gfx::EngineObjLevel3& p3 = p2.next[l3]; if (! p3.used) continue; if (p3.min != min || p3.max != max) continue; @@ -1031,7 +1033,7 @@ int Gfx::CEngine::GetPartialTriangles(int objRank, float min, float max, float p for (int l3 = 0; l3 < static_cast( p2.next.size() ); l3++) { - Gfx::EngineObjLevel3& p3 = p2.next[l1]; + Gfx::EngineObjLevel3& p3 = p2.next[l3]; if (! p3.used) continue; if (p3.min != min || p3.max != max) continue; @@ -1126,7 +1128,7 @@ void Gfx::CEngine::ChangeLOD() for (int l3 = 0; l3 < static_cast( p2.next.size() ); l3++) { - Gfx::EngineObjLevel3& p3 = p2.next[l1]; + Gfx::EngineObjLevel3& p3 = p2.next[l3]; if (! p3.used) continue; if ( Math::IsEqual(p3.min, 0.0f ) && @@ -1620,7 +1622,7 @@ void Gfx::CEngine::UpdateGeometry() for (int l3 = 0; l3 < static_cast( p2.next.size() ); l3++) { - Gfx::EngineObjLevel3& p3 = p2.next[l1]; + Gfx::EngineObjLevel3& p3 = p2.next[l3]; if (! p3.used) continue; for (int l4 = 0; l4 < static_cast( p3.next.size() ); l4++) @@ -1712,7 +1714,7 @@ int Gfx::CEngine::DetectObject(Math::Point mouse) for (int l3 = 0; l3 < static_cast( p2.next.size() ); l3++) { - Gfx::EngineObjLevel3& p3 = p2.next[l1]; + Gfx::EngineObjLevel3& p3 = p2.next[l3]; if (! p3.used) continue; if (p3.min != 0.0f) continue; // LOD B or C? @@ -2315,7 +2317,7 @@ void Gfx::CEngine::SetFocus(float focus) m_focus = focus; m_size = m_app->GetVideoConfig().size; - float aspect = (static_cast(m_size.y)) / m_size.x; + float aspect = (static_cast(m_size.x)) / m_size.y; Math::LoadProjectionMatrix(m_matProj, m_focus, aspect, 0.5f, m_deepView[0]); } @@ -2889,6 +2891,8 @@ void Gfx::CEngine::Draw3DScene() if (m_shadowVisible) { + m_lightMan->UpdateLightsEnableState(Gfx::ENG_OBJTYPE_TERRAIN); + // Draw the terrain for (int l1 = 0; l1 < static_cast( m_objectTree.size() ); l1++) @@ -2911,13 +2915,19 @@ void Gfx::CEngine::Draw3DScene() if (! m_objects[objRank].drawWorld) continue; + m_device->SetTransform(Gfx::TRANSFORM_WORLD, m_objects[objRank].transform); + + if (! IsVisible(objRank)) + continue; + for (int l3 = 0; l3 < static_cast( p2.next.size() ); l3++) { - Gfx::EngineObjLevel3& p3 = p2.next[l1]; + Gfx::EngineObjLevel3& p3 = p2.next[l3]; if (! p3.used) continue; if ( m_objects[objRank].distance < p3.min || - m_objects[objRank].distance >= p3.max ) continue; + m_objects[objRank].distance >= p3.max ) + continue; for (int l4 = 0; l4 < static_cast( p3.next.size() ); l4++) { @@ -2985,7 +2995,7 @@ void Gfx::CEngine::Draw3DScene() for (int l3 = 0; l3 < static_cast( p2.next.size() ); l3++) { - Gfx::EngineObjLevel3& p3 = p2.next[l1]; + Gfx::EngineObjLevel3& p3 = p2.next[l3]; if (! p3.used) continue; if ( m_objects[objRank].distance < p3.min || @@ -3074,7 +3084,7 @@ void Gfx::CEngine::Draw3DScene() for (int l3 = 0; l3 < static_cast( p2.next.size() ); l3++) { - Gfx::EngineObjLevel3& p3 = p2.next[l1]; + Gfx::EngineObjLevel3& p3 = p2.next[l3]; if (! p3.used) continue; if ( m_objects[objRank].distance < p3.min || @@ -3189,7 +3199,7 @@ void Gfx::CEngine::DrawInterface() for (int l3 = 0; l3 < static_cast( p2.next.size() ); l3++) { - Gfx::EngineObjLevel3& p3 = p2.next[l1]; + Gfx::EngineObjLevel3& p3 = p2.next[l3]; if (! p3.used) continue; if ( m_objects[objRank].distance < p3.min || diff --git a/src/graphics/engine/lightman.cpp b/src/graphics/engine/lightman.cpp index 9e15b5a..b9796d2 100644 --- a/src/graphics/engine/lightman.cpp +++ b/src/graphics/engine/lightman.cpp @@ -65,6 +65,7 @@ void Gfx::LightProgression::SetTarget(float value) Gfx::DynamicLight::DynamicLight() { used = enabled = false; + includeType = excludeType = Gfx::ENG_OBJTYPE_NULL; } diff --git a/src/graphics/engine/terrain.cpp b/src/graphics/engine/terrain.cpp index 6b26281..368796a 100644 --- a/src/graphics/engine/terrain.cpp +++ b/src/graphics/engine/terrain.cpp @@ -241,8 +241,13 @@ bool Gfx::CTerrain::ResFromPNG(const std::string& fileName) (data->surface->format->BytesPerPixel != 3) ) return false; - // Assuming the data format is compatible - memcpy(&m_resources[0], data->surface->pixels, 3*size*size); + unsigned char* pixels = static_cast(data->surface->pixels); + int pitch = data->surface->pitch; + + for (int y = 0; y < size; y++) + { + memcpy(&m_resources[3*size*y], &pixels[pitch*y], 3*size); + } return true; } @@ -314,13 +319,14 @@ bool Gfx::CTerrain::ReliefFromPNG(const std::string &fileName, float scaleRelief return false; unsigned char* pixels = static_cast(data->surface->pixels); + int pitch = data->surface->pitch; float limit = 0.9f; for (int y = 0; y < size; y++) { for (int x = 0; x < size; x++) { - float level = (255 - pixels[3*x+3*size*(size-y-1)]) * scaleRelief; + float level = (255 - pixels[3*x+pitch*(size-y-1)]) * scaleRelief; float dist = Math::Max(fabs(static_cast(x-size/2)), fabs(static_cast(y-size/2))); -- cgit v1.2.3-1-g7c22