working on shadows but they are appearing in weird places...
git-svn-id: svn://anubis/fart/trunk@185 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
parent
7d0b4c5646
commit
f9cf1381a6
@ -250,22 +250,31 @@ Color Scene::computePhong(const refptr<Material> material,
|
|||||||
Vector reflectedLightDirection =
|
Vector reflectedLightDirection =
|
||||||
directionToLight.reflect(surfaceNormal);
|
directionToLight.reflect(surfaceNormal);
|
||||||
|
|
||||||
/* calculate the diffuse term */
|
Ray surfaceToLight(surfacePoint, directionToLight);
|
||||||
double diffuse_coef = directionToLight % surfaceNormal;
|
double light_contribution =
|
||||||
if (diffuse_coef > 0.0)
|
calculateLightContribution(surfaceToLight.shift(0.0001), *it);
|
||||||
{
|
|
||||||
result += diffuseColor
|
|
||||||
* (*it)->getDiffuseColor()
|
|
||||||
* diffuse_coef;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* calculate the specular term */
|
if (light_contribution > 0.0)
|
||||||
double specular_coef = reflectedLightDirection % viewDirection;
|
|
||||||
if (specular_coef > 0.0)
|
|
||||||
{
|
{
|
||||||
result += specularColor
|
/* calculate the diffuse term */
|
||||||
* (*it)->getSpecularColor()
|
double diffuse_coef = directionToLight % surfaceNormal;
|
||||||
* pow(specular_coef, shininess);
|
if (diffuse_coef > 0.0)
|
||||||
|
{
|
||||||
|
result += diffuseColor
|
||||||
|
* (*it)->getDiffuseColor()
|
||||||
|
* diffuse_coef
|
||||||
|
* light_contribution;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* calculate the specular term */
|
||||||
|
double specular_coef = reflectedLightDirection % viewDirection;
|
||||||
|
if (specular_coef > 0.0)
|
||||||
|
{
|
||||||
|
result += specularColor
|
||||||
|
* (*it)->getSpecularColor()
|
||||||
|
* pow(specular_coef, shininess)
|
||||||
|
* light_contribution;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -279,6 +288,37 @@ Color Scene::computePhong(const refptr<Material> material,
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double Scene::calculateLightContribution(const Ray & toLight,
|
||||||
|
refptr<Light> light)
|
||||||
|
{
|
||||||
|
double contrib = 1.0;
|
||||||
|
double dist_to_light = toLight.getOrigin().dist_to(light->getPosition());
|
||||||
|
double dist_so_far = 0.0;
|
||||||
|
|
||||||
|
Ray currentRay = toLight;
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
ShapeDistance hit = getRayClosestHit(currentRay);
|
||||||
|
|
||||||
|
if ( hit.shape.isNull() )
|
||||||
|
break;
|
||||||
|
|
||||||
|
if ( dist_so_far + hit.dist > dist_to_light )
|
||||||
|
break;
|
||||||
|
|
||||||
|
contrib *= hit.shape->getMaterial()->getTransparency();
|
||||||
|
|
||||||
|
if ( contrib < SCENE_FACTOR_THRESHOLD )
|
||||||
|
break;
|
||||||
|
|
||||||
|
dist_so_far += hit.dist + 0.0001;
|
||||||
|
}
|
||||||
|
|
||||||
|
return contrib;
|
||||||
|
}
|
||||||
|
|
||||||
bool operator<(const Scene::ShapeDistance & sd1,
|
bool operator<(const Scene::ShapeDistance & sd1,
|
||||||
const Scene::ShapeDistance & sd2)
|
const Scene::ShapeDistance & sd2)
|
||||||
{
|
{
|
||||||
|
@ -56,6 +56,8 @@ class Scene
|
|||||||
const Ray & viewRay,
|
const Ray & viewRay,
|
||||||
const Vector & surfacePoint,
|
const Vector & surfacePoint,
|
||||||
const Vector & surfaceNormal);
|
const Vector & surfaceNormal);
|
||||||
|
double calculateLightContribution(const Ray & toLight,
|
||||||
|
refptr<Light> light);
|
||||||
|
|
||||||
/* In Scene-load.cc */
|
/* In Scene-load.cc */
|
||||||
void load(const char * filename);
|
void load(const char * filename);
|
||||||
|
@ -31,3 +31,8 @@ std::ostream & operator<<(std::ostream & out, const Ray & r)
|
|||||||
out << "(" << r.getOrigin() << " -> " << r.getDirection() << ")";
|
out << "(" << r.getOrigin() << " -> " << r.getDirection() << ")";
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ray Ray::shift(double amt)
|
||||||
|
{
|
||||||
|
return Ray(getPositionAt(amt), m_direction);
|
||||||
|
}
|
||||||
|
@ -14,6 +14,7 @@ class Ray
|
|||||||
const Vector & getDirection() const { return m_direction; }
|
const Vector & getDirection() const { return m_direction; }
|
||||||
Vector getPositionAt(double dist) const;
|
Vector getPositionAt(double dist) const;
|
||||||
Vector operator[](double dist) const { return getPositionAt(dist); }
|
Vector operator[](double dist) const { return getPositionAt(dist); }
|
||||||
|
Ray shift(double amt);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Vector m_origin;
|
Vector m_origin;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user