diff --git a/src/graphics/irr_driver.cpp b/src/graphics/irr_driver.cpp index 281debc9e..4e48cdd72 100644 --- a/src/graphics/irr_driver.cpp +++ b/src/graphics/irr_driver.cpp @@ -2546,6 +2546,8 @@ scene::ISceneNode *IrrDriver::addLight(const core::vector3df &pos, float energy, m_suncam->setPosition(pos); m_suncam->updateAbsolutePosition(); + m_rsm_matrix_initialized = false; + ((WaterShaderProvider *) m_shaders->m_callbacks[ES_WATER])->setSunPosition(pos); } diff --git a/src/graphics/irr_driver.hpp b/src/graphics/irr_driver.hpp index 9e1210355..d7e30b765 100644 --- a/src/graphics/irr_driver.hpp +++ b/src/graphics/irr_driver.hpp @@ -218,6 +218,7 @@ private: core::vector3df rh_extend; core::matrix4 rh_matrix; core::matrix4 rsm_matrix; + bool m_rsm_matrix_initialized; core::vector2df m_current_screen_size; /** Additional details to be shown in case that a texture is not found. diff --git a/src/graphics/render.cpp b/src/graphics/render.cpp index 1ab2c8733..cd131fd5b 100644 --- a/src/graphics/render.cpp +++ b/src/graphics/render.cpp @@ -825,12 +825,21 @@ void IrrDriver::computeCameraMatrix(scene::ICameraSceneNode * const camnode, siz memcpy(&tmp[64], irr_driver->getProjViewMatrix().pointer(), 16 * sizeof(float)); m_suncam->render(); - const core::matrix4 &SunCamViewMatrix = m_suncam->getViewMatrix(); + const core::vector3df &camdir = (camnode->getTarget() - camnode->getAbsolutePosition()).normalize(); + const core::vector3df &sundir = (m_suncam->getTarget() - m_suncam->getAbsolutePosition()).normalize(); + const core::vector3df &up = camdir.crossProduct(sundir).normalize(); + if (up.getLength()) + m_suncam->setUpVector(up); + m_suncam->render(); + for (unsigned i = 0; i < 4; i++) { - if (!m_shadow_camnodes[i]) - m_shadow_camnodes[i] = (scene::ICameraSceneNode *) m_suncam->clone(); + if (m_shadow_camnodes[i]) + delete m_shadow_camnodes[i]; + m_shadow_camnodes[i] = (scene::ICameraSceneNode *) m_suncam->clone(); } + const core::matrix4 &SunCamViewMatrix = m_suncam->getViewMatrix(); + sun_ortho_matrix.clear(); if (World::getWorld() && World::getWorld()->getTrack()) @@ -925,6 +934,7 @@ void IrrDriver::computeCameraMatrix(scene::ICameraSceneNode * const camnode, siz sun_ortho_matrix.push_back(getVideoDriver()->getTransform(video::ETS_PROJECTION) * getVideoDriver()->getTransform(video::ETS_VIEW)); } + if (!m_rsm_matrix_initialized) { core::aabbox3df trackbox(vmin.toIrrVector(), vmax.toIrrVector() - core::vector3df(0, 30, 0)); @@ -942,6 +952,7 @@ void IrrDriver::computeCameraMatrix(scene::ICameraSceneNode * const camnode, siz m_suncam->render(); } rsm_matrix = getVideoDriver()->getTransform(video::ETS_PROJECTION) * getVideoDriver()->getTransform(video::ETS_VIEW); + m_rsm_matrix_initialized = true; } rh_extend = core::vector3df(128, 64, 128); core::vector3df campos = camnode->getAbsolutePosition();