1
0
Fork 0
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:
glassmancody.info 2021-04-12 01:08:45 -07:00
parent 9e80091aff
commit 92033bca64
2 changed files with 35 additions and 15 deletions

View file

@ -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);

View file

@ -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;
} }