mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-07 08:15:34 +00:00
Fixed error in calculating viewspace sun dir, minor cleanup
This commit is contained in:
parent
9e80091aff
commit
92033bca64
2 changed files with 35 additions and 15 deletions
|
@ -71,6 +71,11 @@ namespace
|
||||||
mat(2, 3) = q;
|
mat(2, 3) = q;
|
||||||
mat(3, 3) = r;
|
mat(3, 3) = r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isReflectionCamera(osg::Camera* camera)
|
||||||
|
{
|
||||||
|
return (camera->getName() == "ReflectionCamera");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace SceneUtil
|
namespace SceneUtil
|
||||||
|
@ -612,6 +617,7 @@ namespace SceneUtil
|
||||||
void operator()(osg::Node* node, osg::NodeVisitor* nv) override
|
void operator()(osg::Node* node, osg::NodeVisitor* nv) override
|
||||||
{
|
{
|
||||||
osgUtil::CullVisitor* cv = static_cast<osgUtil::CullVisitor*>(nv);
|
osgUtil::CullVisitor* cv = static_cast<osgUtil::CullVisitor*>(nv);
|
||||||
|
bool pop = false;
|
||||||
|
|
||||||
if (mLastFrameNumber != cv->getTraversalNumber())
|
if (mLastFrameNumber != cv->getTraversalNumber())
|
||||||
{
|
{
|
||||||
|
@ -642,15 +648,33 @@ namespace SceneUtil
|
||||||
{
|
{
|
||||||
auto buf = mLightManager->getLightBuffer(mLastFrameNumber);
|
auto buf = mLightManager->getLightBuffer(mLastFrameNumber);
|
||||||
|
|
||||||
buf->setDiffuse(0, sun->getDiffuse());
|
|
||||||
buf->setAmbient(0, sun->getAmbient());
|
|
||||||
buf->setSpecular(0, sun->getSpecular());
|
|
||||||
buf->setPosition(0, sun->getPosition() * (*cv->getCurrentRenderStage()->getInitialViewMatrix()));
|
buf->setPosition(0, sun->getPosition() * (*cv->getCurrentRenderStage()->getInitialViewMatrix()));
|
||||||
|
buf->setAmbient(0, sun->getAmbient());
|
||||||
|
buf->setDiffuse(0, sun->getDiffuse());
|
||||||
|
buf->setSpecular(0, sun->getSpecular());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (isReflectionCamera(cv->getCurrentCamera()))
|
||||||
|
{
|
||||||
|
auto sun = mLightManager->getSunlight();
|
||||||
|
if (sun)
|
||||||
|
{
|
||||||
|
osg::Vec4 originalPos = sun->getPosition();
|
||||||
|
sun->setPosition(originalPos * (*cv->getCurrentRenderStage()->getInitialViewMatrix()));
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet;
|
||||||
|
configureStateSetSunOverride(mLightManager->getLightingMethod(), sun, stateset);
|
||||||
|
|
||||||
|
sun->setPosition(originalPos);
|
||||||
|
cv->pushStateSet(stateset);
|
||||||
|
pop = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
traverse(node, nv);
|
traverse(node, nv);
|
||||||
|
if (pop)
|
||||||
|
cv->popStateSet();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -1151,7 +1175,7 @@ namespace SceneUtil
|
||||||
|
|
||||||
const std::vector<LightManager::LightSourceViewBound>& LightManager::getLightsInViewSpace(osg::Camera *camera, const osg::RefMatrix* viewMatrix, size_t frameNum)
|
const std::vector<LightManager::LightSourceViewBound>& LightManager::getLightsInViewSpace(osg::Camera *camera, const osg::RefMatrix* viewMatrix, size_t frameNum)
|
||||||
{
|
{
|
||||||
bool isReflectionCamera = camera->getName() == "ReflectionCamera";
|
bool isReflection = isReflectionCamera(camera);
|
||||||
osg::observer_ptr<osg::Camera> camPtr (camera);
|
osg::observer_ptr<osg::Camera> camPtr (camera);
|
||||||
auto it = mLightsInViewSpace.find(camPtr);
|
auto it = mLightsInViewSpace.find(camPtr);
|
||||||
|
|
||||||
|
@ -1168,7 +1192,7 @@ namespace SceneUtil
|
||||||
osg::BoundingSphere viewBound = osg::BoundingSphere(osg::Vec3f(0,0,0), radius * mPointLightRadiusMultiplier);
|
osg::BoundingSphere viewBound = osg::BoundingSphere(osg::Vec3f(0,0,0), radius * mPointLightRadiusMultiplier);
|
||||||
transformBoundingSphere(worldViewMat, viewBound);
|
transformBoundingSphere(worldViewMat, viewBound);
|
||||||
|
|
||||||
if (!isReflectionCamera && mPointLightFadeEnd != 0.f)
|
if (!isReflection && mPointLightFadeEnd != 0.f)
|
||||||
{
|
{
|
||||||
const float fadeDelta = mPointLightFadeEnd - mPointLightFadeStart;
|
const float fadeDelta = mPointLightFadeEnd - mPointLightFadeStart;
|
||||||
float fade = 1 - std::clamp((viewBound.center().length() - mPointLightFadeStart) / fadeDelta, 0.f, 1.f);
|
float fade = 1 - std::clamp((viewBound.center().length() - mPointLightFadeStart) / fadeDelta, 0.f, 1.f);
|
||||||
|
|
|
@ -2,8 +2,7 @@
|
||||||
|
|
||||||
void perLightSun(out vec3 diffuseOut, vec3 viewPos, vec3 viewNormal)
|
void perLightSun(out vec3 diffuseOut, vec3 viewPos, vec3 viewNormal)
|
||||||
{
|
{
|
||||||
vec3 sunDiffuse = lcalcDiffuse(0).xyz;
|
vec3 lightDir = normalize(lcalcPosition(0));
|
||||||
vec3 lightDir = normalize(lcalcPosition(0).xyz);
|
|
||||||
float lambert = dot(viewNormal.xyz, lightDir);
|
float lambert = dot(viewNormal.xyz, lightDir);
|
||||||
|
|
||||||
#ifndef GROUNDCOVER
|
#ifndef GROUNDCOVER
|
||||||
|
@ -18,7 +17,7 @@ void perLightSun(out vec3 diffuseOut, vec3 viewPos, vec3 viewNormal)
|
||||||
lambert *= clamp(-8.0 * (1.0 - 0.3) * eyeCosine + 1.0, 0.3, 1.0);
|
lambert *= clamp(-8.0 * (1.0 - 0.3) * eyeCosine + 1.0, 0.3, 1.0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
diffuseOut = sunDiffuse * lambert;
|
diffuseOut = lcalcDiffuse(0).xyz * lambert;
|
||||||
}
|
}
|
||||||
|
|
||||||
void perLightPoint(out vec3 ambientOut, out vec3 diffuseOut, int lightIndex, vec3 viewPos, vec3 viewNormal)
|
void perLightPoint(out vec3 ambientOut, out vec3 diffuseOut, int lightIndex, vec3 viewPos, vec3 viewNormal)
|
||||||
|
@ -66,14 +65,14 @@ void doLighting(vec3 viewPos, vec3 viewNormal, out vec3 diffuseLight, out vec3 a
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
vec3 ambientOut, diffuseOut;
|
vec3 ambientOut, diffuseOut;
|
||||||
ambientLight = gl_LightModel.ambient.xyz;
|
|
||||||
|
|
||||||
perLightSun(diffuseOut, viewPos, viewNormal);
|
perLightSun(diffuseOut, viewPos, viewNormal);
|
||||||
|
ambientLight = gl_LightModel.ambient.xyz;
|
||||||
#if PER_PIXEL_LIGHTING
|
#if PER_PIXEL_LIGHTING
|
||||||
diffuseLight = diffuseOut * shadowing;
|
diffuseLight = diffuseOut * shadowing;
|
||||||
#else
|
#else
|
||||||
shadowDiffuse = diffuseOut;
|
shadowDiffuse = diffuseOut;
|
||||||
diffuseLight = diffuseOut;
|
diffuseLight = vec3(0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (int i = @startLight; i < @endLight; ++i)
|
for (int i = @startLight; i < @endLight; ++i)
|
||||||
|
@ -90,14 +89,11 @@ void doLighting(vec3 viewPos, vec3 viewNormal, out vec3 diffuseLight, out vec3 a
|
||||||
|
|
||||||
vec3 getSpecular(vec3 viewNormal, vec3 viewDirection, float shininess, vec3 matSpec)
|
vec3 getSpecular(vec3 viewNormal, vec3 viewDirection, float shininess, vec3 matSpec)
|
||||||
{
|
{
|
||||||
vec3 sunDir = lcalcPosition(0);
|
vec3 lightDir = normalize(lcalcPosition(0));
|
||||||
vec3 sunSpec = lcalcSpecular(0).xyz;
|
|
||||||
|
|
||||||
vec3 lightDir = normalize(sunDir);
|
|
||||||
float NdotL = dot(viewNormal, lightDir);
|
float NdotL = dot(viewNormal, lightDir);
|
||||||
if (NdotL <= 0.0)
|
if (NdotL <= 0.0)
|
||||||
return vec3(0.0);
|
return vec3(0.0);
|
||||||
vec3 halfVec = normalize(lightDir - viewDirection);
|
vec3 halfVec = normalize(lightDir - viewDirection);
|
||||||
float NdotH = dot(viewNormal, halfVec);
|
float NdotH = dot(viewNormal, halfVec);
|
||||||
return pow(max(NdotH, 0.0), max(1e-4, shininess)) * sunSpec * matSpec;
|
return pow(max(NdotH, 0.0), max(1e-4, shininess)) * lcalcSpecular(0).xyz * matSpec;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue