mirror of
https://github.com/OpenMW/openmw.git
synced 2025-01-30 19:15:41 +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(3, 3) = r;
|
||||
}
|
||||
|
||||
bool isReflectionCamera(osg::Camera* camera)
|
||||
{
|
||||
return (camera->getName() == "ReflectionCamera");
|
||||
}
|
||||
}
|
||||
|
||||
namespace SceneUtil
|
||||
|
@ -612,6 +617,7 @@ namespace SceneUtil
|
|||
void operator()(osg::Node* node, osg::NodeVisitor* nv) override
|
||||
{
|
||||
osgUtil::CullVisitor* cv = static_cast<osgUtil::CullVisitor*>(nv);
|
||||
bool pop = false;
|
||||
|
||||
if (mLastFrameNumber != cv->getTraversalNumber())
|
||||
{
|
||||
|
@ -642,15 +648,33 @@ namespace SceneUtil
|
|||
{
|
||||
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->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);
|
||||
if (pop)
|
||||
cv->popStateSet();
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -1151,7 +1175,7 @@ namespace SceneUtil
|
|||
|
||||
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);
|
||||
auto it = mLightsInViewSpace.find(camPtr);
|
||||
|
||||
|
@ -1168,7 +1192,7 @@ namespace SceneUtil
|
|||
osg::BoundingSphere viewBound = osg::BoundingSphere(osg::Vec3f(0,0,0), radius * mPointLightRadiusMultiplier);
|
||||
transformBoundingSphere(worldViewMat, viewBound);
|
||||
|
||||
if (!isReflectionCamera && mPointLightFadeEnd != 0.f)
|
||||
if (!isReflection && mPointLightFadeEnd != 0.f)
|
||||
{
|
||||
const float fadeDelta = mPointLightFadeEnd - mPointLightFadeStart;
|
||||
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)
|
||||
{
|
||||
vec3 sunDiffuse = lcalcDiffuse(0).xyz;
|
||||
vec3 lightDir = normalize(lcalcPosition(0).xyz);
|
||||
vec3 lightDir = normalize(lcalcPosition(0));
|
||||
float lambert = dot(viewNormal.xyz, lightDir);
|
||||
|
||||
#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);
|
||||
#endif
|
||||
|
||||
diffuseOut = sunDiffuse * lambert;
|
||||
diffuseOut = lcalcDiffuse(0).xyz * lambert;
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
vec3 ambientOut, diffuseOut;
|
||||
ambientLight = gl_LightModel.ambient.xyz;
|
||||
|
||||
perLightSun(diffuseOut, viewPos, viewNormal);
|
||||
ambientLight = gl_LightModel.ambient.xyz;
|
||||
#if PER_PIXEL_LIGHTING
|
||||
diffuseLight = diffuseOut * shadowing;
|
||||
#else
|
||||
shadowDiffuse = diffuseOut;
|
||||
diffuseLight = diffuseOut;
|
||||
diffuseLight = vec3(0);
|
||||
#endif
|
||||
|
||||
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 sunDir = lcalcPosition(0);
|
||||
vec3 sunSpec = lcalcSpecular(0).xyz;
|
||||
|
||||
vec3 lightDir = normalize(sunDir);
|
||||
vec3 lightDir = normalize(lcalcPosition(0));
|
||||
float NdotL = dot(viewNormal, lightDir);
|
||||
if (NdotL <= 0.0)
|
||||
return vec3(0.0);
|
||||
vec3 halfVec = normalize(lightDir - viewDirection);
|
||||
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