Remove use of magic constants.
Apply cameraOffset
Calculate distance projected on SM plane
uniform vec3 eyePosition;
uniform float animationTimer;
uniform vec4 emissiveColor;
+uniform vec3 cameraOffset;
varying vec3 vNormal;
// Calculate normal offset scale based on the texel size adjusted for
// curvature of the SM texture. This code must be change together with
// getPerspectiveFactor or any light-space transformation.
- float distanceToPlayer = length((eyePosition - worldPosition).xyz) / f_shadowfar;
+ vec3 eyeToVertex = worldPosition - eyePosition + cameraOffset;
+ // Distance from the vertex to the player
+ float distanceToPlayer = length(eyeToVertex - v_LightDirection * dot(eyeToVertex, v_LightDirection)) / f_shadowfar;
+ // perspective factor estimation according to the
float perspectiveFactor = distanceToPlayer * bias0 + bias1;
- float texelSize = 1.0 / f_textureresolution;
- texelSize *= f_shadowfar * perspectiveFactor / (bias1 / perspectiveFactor - texelSize * bias0) * 0.15;
+ float texelSize = f_shadowfar * perspectiveFactor * perspectiveFactor /
+ (f_textureresolution * bias1 - perspectiveFactor * bias0);
float slopeScale = clamp(pow(1.0 - cosLight*cosLight, 0.5), 0.0, 1.0);
normalOffsetScale = texelSize * slopeScale;
const v3f &viewUp = cam->getCameraNode()->getUpVector();
v3f viewRight = look.crossProduct(viewUp);
- v3f farCorner = look + viewRight * tanFovX + viewUp * tanFovY;
+ v3f farCorner = (look + viewRight * tanFovX + viewUp * tanFovY).normalize();
// Compute the frustumBoundingSphere radius
v3f boundVec = (camPos + farCorner * sfFar) - newCenter;
- radius = boundVec.getLength() * 2.0f;
+ radius = boundVec.getLength();
// boundVec.getLength();
- float vvolume = radius * 2.0f;
-
+ float vvolume = radius;
v3f frustumCenter = newCenter;
- // probar radius multipliacdor en funcion del I, a menor I mas multiplicador
v3f eye_displacement = direction * vvolume;
// we must compute the viewmat with the position - the camera offset
#include "irrlichttypes_bloated.h"
#include <matrix4.h>
#include "util/basic_macros.h"
+#include "constants.h"
class Camera;
class Client;
/// Gets the light's far value.
f32 getMaxFarValue() const
{
- return farPlane;
+ return farPlane * BS;
}
f32 ShadowRenderer::getMaxShadowFar() const
{
if (!m_light_list.empty()) {
- float wanted_range = m_client->getEnv().getClientMap().getWantedRange();
-
- float zMax = m_light_list[0].getMaxFarValue() > wanted_range
- ? wanted_range
- : m_light_list[0].getMaxFarValue();
- return zMax * MAP_BLOCKSIZE;
+ float zMax = m_light_list[0].getMaxFarValue();
+ return zMax;
}
return 0.0f;
}