aboutsummaryrefslogtreecommitdiff
path: root/src/debug.h
Commit message (Expand)AuthorAge
* Remove assert warning in leveldb wonderlandKahrl2013-09-10
* Omnicleanup: header cleanup, add ModApiUtil shared between game and mainmenuKahrl2013-08-14
* Add support for IPv6proller2013-06-23
* Migrate to STL containers/algorithms.Ilya Zhuravlev2013-03-11
* Fix build on Windowskwolekr2013-02-25
* Update Copyright YearsSfan52013-02-24
* Change Minetest-c55 to MinetestPilzAdam2013-02-24
* Optimize headersPerttu Ahola2012-06-17
* Initially split utility.h to multiple files in util/Perttu Ahola2012-06-17
* Switch the license to be LGPLv2/later, with small parts still remaining as GP...Perttu Ahola2012-06-05
* Improve debug stack printing interfacePerttu Ahola2011-11-29
* Use the logger; also, default to not showing much crap in console. Use --info...Perttu Ahola2011-10-16
* Respect base virtual functions' signaturesGiuseppe Bilotta2011-08-08
* Get rid of all the string format warnings caused by the DSTACK macroCiaran Gultnieks2011-05-16
* new texture stuff quite workingPerttu Ahola2011-02-11
* fixes toward mingw compatibilityPerttu Ahola2011-02-10
* Lots of small stuffPerttu Ahola2011-01-08
* better debug output in segfaults and stack overflows in windowsPerttu Ahola2010-12-27
* organizing stuff.Perttu Ahola2010-12-21
* framework for modifying texturesPerttu Ahola2010-12-20
* license stuff (more to come)Perttu Ahola2010-11-29
* Working version before block send priorization updatePerttu Ahola2010-11-27
* Initial filesPerttu Ahola2010-11-27
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include <cmath> #include "client/shadows/dynamicshadows.h" #include "client/client.h" #include "client/clientenvironment.h" #include "client/clientmap.h" #include "client/camera.h" using m4f = core::matrix4; void DirectionalLight::createSplitMatrices(const Camera *cam) { v3f newCenter; v3f look = cam->getDirection(); // camera view tangents float tanFovY = tanf(cam->getFovY() * 0.5f); float tanFovX = tanf(cam->getFovX() * 0.5f); // adjusted frustum boundaries float sfNear = future_frustum.zNear; float sfFar = adjustDist(future_frustum.zFar, cam->getFovY()); // adjusted camera positions v3f cam_pos_world = cam->getPosition(); v3f cam_pos_scene = v3f(cam_pos_world.X - cam->getOffset().X * BS, cam_pos_world.Y - cam->getOffset().Y * BS, cam_pos_world.Z - cam->getOffset().Z * BS); cam_pos_scene += look * sfNear; cam_pos_world += look * sfNear; // center point of light frustum v3f center_scene = cam_pos_scene + look * 0.35 * (sfFar - sfNear); v3f center_world = cam_pos_world + look * 0.35 * (sfFar - sfNear); // Create a vector to the frustum far corner const v3f &viewUp = cam->getCameraNode()->getUpVector(); v3f viewRight = look.crossProduct(viewUp); v3f farCorner = (look + viewRight * tanFovX + viewUp * tanFovY).normalize(); // Compute the frustumBoundingSphere radius v3f boundVec = (cam_pos_scene + farCorner * sfFar) - center_scene; float radius = boundVec.getLength(); float length = radius * 3.0f; v3f eye_displacement = direction * length; // we must compute the viewmat with the position - the camera offset // but the future_frustum position must be the actual world position v3f eye = center_scene - eye_displacement; future_frustum.player = cam_pos_scene; future_frustum.position = center_world - eye_displacement; future_frustum.length = length; future_frustum.radius = radius; future_frustum.ViewMat.buildCameraLookAtMatrixLH(eye, center_scene, v3f(0.0f, 1.0f, 0.0f)); future_frustum.ProjOrthMat.buildProjectionMatrixOrthoLH(radius, radius, 0.0f, length, false); future_frustum.camera_offset = cam->getOffset(); } DirectionalLight::DirectionalLight(const u32 shadowMapResolution, const v3f &position, video::SColorf lightColor, f32 farValue) : diffuseColor(lightColor), farPlane(farValue), mapRes(shadowMapResolution), pos(position) {} void DirectionalLight::update_frustum(const Camera *cam, Client *client, bool force) { if (dirty && !force) return; float zNear = cam->getCameraNode()->getNearValue(); float zFar = getMaxFarValue(); if (!client->getEnv().getClientMap().getControl().range_all) zFar = MYMIN(zFar, client->getEnv().getClientMap().getControl().wanted_range * BS); /////////////////////////////////// // update splits near and fars future_frustum.zNear = zNear; future_frustum.zFar = zFar; // update shadow frustum createSplitMatrices(cam); // get the draw list for shadows client->getEnv().getClientMap().updateDrawListShadow( getPosition(), getDirection(), future_frustum.radius, future_frustum.length); should_update_map_shadow = true; dirty = true; // when camera offset changes, adjust the current frustum view matrix to avoid flicker v3s16 cam_offset = cam->getOffset(); if (cam_offset != shadow_frustum.camera_offset) { v3f rotated_offset; shadow_frustum.ViewMat.rotateVect(rotated_offset, intToFloat(cam_offset - shadow_frustum.camera_offset, BS)); shadow_frustum.ViewMat.setTranslation(shadow_frustum.ViewMat.getTranslation() + rotated_offset); shadow_frustum.player += intToFloat(shadow_frustum.camera_offset - cam->getOffset(), BS); shadow_frustum.camera_offset = cam_offset; } } void DirectionalLight::commitFrustum() { if (!dirty) return; shadow_frustum = future_frustum; dirty = false; } void DirectionalLight::setDirection(v3f dir) { direction = -dir; direction.normalize(); } v3f DirectionalLight::getPosition() const { return shadow_frustum.position; } v3f DirectionalLight::getPlayerPos() const { return shadow_frustum.player; } v3f DirectionalLight::getFuturePlayerPos() const { return future_frustum.player; } const m4f &DirectionalLight::getViewMatrix() const { return shadow_frustum.ViewMat; } const m4f &DirectionalLight::getProjectionMatrix() const { return shadow_frustum.ProjOrthMat; } const m4f &DirectionalLight::getFutureViewMatrix() const { return future_frustum.ViewMat; } const m4f &DirectionalLight::getFutureProjectionMatrix() const { return future_frustum.ProjOrthMat; } m4f DirectionalLight::getViewProjMatrix() { return shadow_frustum.ProjOrthMat * shadow_frustum.ViewMat; }