Added safety offset on lighting

This avoids shadow algorithm to hit the surface it is currently checking
This commit is contained in:
Michaël Lemaire 2015-10-16 00:14:54 +02:00
parent cafa9b4c74
commit e81487ae08
5 changed files with 32 additions and 4 deletions

View file

@ -110,6 +110,7 @@ Color GodRaysSampler::getRawLight(const Vector3 &location, bool filtered) const
if (lighting) if (lighting)
{ {
LightStatus status(lighting, location, *camera_location, filtered); LightStatus status(lighting, location, *camera_location, filtered);
status.setSafetyOffset(0.0); // Not a hard surface, safety offset not needed
lighting->fillStatus(status, location); lighting->fillStatus(status, location);
return status.getSum(); return status.getSum();
} }

View file

@ -7,6 +7,7 @@
LightStatus::LightStatus(LightingManager *manager, const Vector3 &location, const Vector3 &eye, bool filtered) LightStatus::LightStatus(LightingManager *manager, const Vector3 &location, const Vector3 &eye, bool filtered)
{ {
this->safety_offset = -0.0000001;
this->max_power = 0.0; this->max_power = 0.0;
this->manager = manager; this->manager = manager;
this->location = location; this->location = location;
@ -25,7 +26,7 @@ void LightStatus::pushComponent(LightComponent component)
return; return;
} }
if (manager->alterLight(component, location)) if (manager->alterLight(component, location.add(component.direction.scale(safety_offset))))
{ {
if (power > max_power) if (power > max_power)
{ {
@ -64,3 +65,8 @@ Color LightStatus::getSum() const
return final; return final;
} }
void LightStatus::setSafetyOffset(double safety_offset)
{
this->safety_offset = -safety_offset;
}

View file

@ -29,7 +29,17 @@ public:
*/ */
Color getSum() const; Color getSum() const;
/**
* Set the safety offset for this status.
*
* The offset is used to not hit the surface we are currently working on immediately.
* It adds a small vector toward the light at the start of shadow casting.
* This number should remain very small to not produce precision errors.
*/
void setSafetyOffset(double safety_offset);
private: private:
double safety_offset;
double max_power; double max_power;
LightingManager* manager; LightingManager* manager;
Vector3 location; Vector3 location;

View file

@ -10,6 +10,7 @@
LightingManager::LightingManager() LightingManager::LightingManager()
{ {
specularity = true; specularity = true;
filtering = true;
} }
int LightingManager::getStaticLightsCount() const int LightingManager::getStaticLightsCount() const
@ -81,7 +82,7 @@ void LightingManager::unregisterFilter(LightFilter *filter)
bool LightingManager::alterLight(LightComponent &component, const Vector3 &location) bool LightingManager::alterLight(LightComponent &component, const Vector3 &location)
{ {
if (component.altered) if (filtering and component.altered)
{ {
for (auto filter:filters) for (auto filter:filters)
{ {
@ -105,6 +106,11 @@ void LightingManager::setSpecularity(bool enabled)
specularity = enabled; specularity = enabled;
} }
void LightingManager::setFiltering(bool enabled)
{
filtering = enabled;
}
Color LightingManager::applyFinalComponent(const LightComponent &component, const Vector3 &eye, const Vector3 &location, const Vector3 &normal, const SurfaceMaterial &material) Color LightingManager::applyFinalComponent(const LightComponent &component, const Vector3 &eye, const Vector3 &location, const Vector3 &normal, const SurfaceMaterial &material)
{ {
Color result, light_color; Color result, light_color;

View file

@ -77,6 +77,11 @@ public:
*/ */
void setSpecularity(bool enabled); void setSpecularity(bool enabled);
/**
* Enable or disable the filtering (shadows).
*/
void setFiltering(bool enabled);
/** /**
* Apply a final component on a surface material. * Apply a final component on a surface material.
*/ */
@ -93,11 +98,11 @@ public:
Color apply(const Vector3 &eye, const Vector3 &location, const Vector3 &normal, const SurfaceMaterial &material); Color apply(const Vector3 &eye, const Vector3 &location, const Vector3 &normal, const SurfaceMaterial &material);
private: private:
int specularity; bool specularity;
bool filtering;
std::vector<LightComponent> static_lights; std::vector<LightComponent> static_lights;
std::vector<LightFilter *> filters; std::vector<LightFilter *> filters;
std::vector<LightSource *> sources; std::vector<LightSource *> sources;
}; };
} }