[WIP] Refactoring lighting
This commit is contained in:
parent
50d499d10f
commit
fca6f4c96e
20 changed files with 324 additions and 274 deletions
5
src/render/software/LightComponent.cpp
Normal file
5
src/render/software/LightComponent.cpp
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
#include "LightComponent.h"
|
||||||
|
|
||||||
|
/*LightComponent::LightComponent()
|
||||||
|
{
|
||||||
|
}*/
|
31
src/render/software/LightComponent.h
Normal file
31
src/render/software/LightComponent.h
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
#ifndef LIGHTCOMPONENT_H
|
||||||
|
#define LIGHTCOMPONENT_H
|
||||||
|
|
||||||
|
#include "software_global.h"
|
||||||
|
|
||||||
|
#include "Color.h"
|
||||||
|
#include "Vector3.h"
|
||||||
|
|
||||||
|
namespace paysages {
|
||||||
|
namespace software {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief One component of a LightStatus.
|
||||||
|
*
|
||||||
|
* A light component represents the amount of light received at a point from a given direction.
|
||||||
|
*/
|
||||||
|
class SOFTWARESHARED_EXPORT LightComponent
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//LightComponent();
|
||||||
|
|
||||||
|
Color color; // Light power
|
||||||
|
Vector3 direction; // Direction the light is travelling
|
||||||
|
double reflection; /* Reflected factor of the light (for specular lighting) */
|
||||||
|
bool altered; /* Should the light be filtered or masked (by atmosphere, water, ground, clouds...) */
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // LIGHTCOMPONENT_H
|
6
src/render/software/LightFilter.cpp
Normal file
6
src/render/software/LightFilter.cpp
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#include "LightFilter.h"
|
||||||
|
|
||||||
|
bool LightFilter::applyLightFilter(LightComponent &, const Vector3 &)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
27
src/render/software/LightFilter.h
Normal file
27
src/render/software/LightFilter.h
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
#ifndef LIGHTFILTER_H
|
||||||
|
#define LIGHTFILTER_H
|
||||||
|
|
||||||
|
#include "software_global.h"
|
||||||
|
|
||||||
|
namespace paysages {
|
||||||
|
namespace software {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Interface for rendering parts that can alter light.
|
||||||
|
*/
|
||||||
|
class SOFTWARESHARED_EXPORT LightFilter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Apply filtering on a light component.
|
||||||
|
*
|
||||||
|
* This will alter the component and return if the component is still
|
||||||
|
* useful.
|
||||||
|
*/
|
||||||
|
bool applyLightFilter(LightComponent &light, const Vector3 &at);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // LIGHTFILTER_H
|
29
src/render/software/LightStatus.cpp
Normal file
29
src/render/software/LightStatus.cpp
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#include "LightStatus.h"
|
||||||
|
|
||||||
|
LightStatus::LightStatus(LightingManager *manager, const Vector3 &location, const Vector3 &eye)
|
||||||
|
{
|
||||||
|
this->manager = manager;
|
||||||
|
this->location = location;
|
||||||
|
this->eye = eye;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LightStatus::pushComponent(LightComponent component)
|
||||||
|
{
|
||||||
|
if (manager->filter(&component, location))
|
||||||
|
{
|
||||||
|
components.add(component);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Color LightStatus::apply(const Vector3 &normal, const SurfaceMaterial &material)
|
||||||
|
{
|
||||||
|
Color final();
|
||||||
|
|
||||||
|
for (auto component: components)
|
||||||
|
{
|
||||||
|
final.add(manager->applyFinalComponent(component, eye, location, normal, material));
|
||||||
|
}
|
||||||
|
|
||||||
|
final.a = material->base.a;
|
||||||
|
return final;
|
||||||
|
}
|
33
src/render/software/LightStatus.h
Normal file
33
src/render/software/LightStatus.h
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
#ifndef LIGHTSTATUS_H
|
||||||
|
#define LIGHTSTATUS_H
|
||||||
|
|
||||||
|
#include "software_global.h"
|
||||||
|
|
||||||
|
#include "LightComponent.h"
|
||||||
|
|
||||||
|
namespace paysages {
|
||||||
|
namespace software {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Light status at a given point.
|
||||||
|
*
|
||||||
|
* The light status is the combination of all LightComponent received at a given location.
|
||||||
|
*/
|
||||||
|
class SOFTWARESHARED_EXPORT LightStatus
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
LightStatus(LightingManager *manager, const Vector3 &location, const Vector3 &eye);
|
||||||
|
|
||||||
|
void pushComponent(LightComponent component);
|
||||||
|
|
||||||
|
private:
|
||||||
|
LightingManager* manager;
|
||||||
|
Vector3 location;
|
||||||
|
Vector3 eye;
|
||||||
|
std::vector<LightComponent> components;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // LIGHTSTATUS_H
|
113
src/render/software/LightingManager.cpp
Normal file
113
src/render/software/LightingManager.cpp
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
#include "LightingManager.h"
|
||||||
|
|
||||||
|
#include "LightFilter.h"
|
||||||
|
#include "LightComponent.h"
|
||||||
|
#include "Color.h"
|
||||||
|
|
||||||
|
LightingManager::LightingManager()
|
||||||
|
{
|
||||||
|
specularity = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LightingManager::registerFilter(LightFilter* filter)
|
||||||
|
{
|
||||||
|
if (not filters.contains(filter))
|
||||||
|
{
|
||||||
|
filters.add(filter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool LightingManager::alterLight(LightComponent &component, const Vector3 &location)
|
||||||
|
{
|
||||||
|
if (component.altered)
|
||||||
|
{
|
||||||
|
for (auto filter:filters)
|
||||||
|
{
|
||||||
|
if (not filter.app(component, location))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (not specularity)
|
||||||
|
{
|
||||||
|
component.reflection = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return component.color.getPower() > 0.0001;
|
||||||
|
}
|
||||||
|
|
||||||
|
void LightingManager::setSpecularity(bool enabled)
|
||||||
|
{
|
||||||
|
specularity = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
void applyFinalComponent(const LightComponent &component, const Vector3 &eye, const Vector3 &location, const Vector3 &normal, const SurfaceMaterial &material)
|
||||||
|
{
|
||||||
|
Color result, light_color;
|
||||||
|
double normal_norm;
|
||||||
|
Vector3 direction_inv;
|
||||||
|
|
||||||
|
light_color = component->color;
|
||||||
|
direction_inv = v3Scale(v3Normalize(component->direction), -1.0);
|
||||||
|
|
||||||
|
normal_norm = v3Norm(normal);
|
||||||
|
if (normal_norm > 1.0)
|
||||||
|
{
|
||||||
|
normal_norm = 1.0;
|
||||||
|
}
|
||||||
|
normal = v3Normalize(normal);
|
||||||
|
|
||||||
|
result = COLOR_BLACK;
|
||||||
|
|
||||||
|
/* diffused light */
|
||||||
|
double diffuse = v3Dot(direction_inv, normal);
|
||||||
|
diffuse = (diffuse + (1.0 - normal_norm)) / (1.0 + (1.0 - normal_norm));
|
||||||
|
if (diffuse > 0.0)
|
||||||
|
{
|
||||||
|
result.r += diffuse * material->_rgb.r * light_color.r;
|
||||||
|
result.g += diffuse * material->_rgb.g * light_color.g;
|
||||||
|
result.b += diffuse * material->_rgb.b * light_color.b;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* specular reflection */
|
||||||
|
if (material->reflection > 0.0 && light->reflection > 0.0)
|
||||||
|
{
|
||||||
|
Vector3 view = v3Normalize(v3Sub(location, eye));
|
||||||
|
Vector3 reflect = v3Sub(direction_inv, v3Scale(normal, 2.0 * v3Dot(direction_inv, normal)));
|
||||||
|
double specular = v3Dot(reflect, view);
|
||||||
|
if (specular > 0.0)
|
||||||
|
{
|
||||||
|
specular = pow(specular, material->shininess) * material->reflection * light->reflection * normal_norm;
|
||||||
|
if (specular > 0.0)
|
||||||
|
{
|
||||||
|
result.r += specular * light_color.r;
|
||||||
|
result.g += specular * light_color.g;
|
||||||
|
result.b += specular * light_color.b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* specular reflection with fresnel effect */
|
||||||
|
/*if (material->reflection > 0.0 && light->reflection > 0.0)
|
||||||
|
{
|
||||||
|
Vector3 view = v3Normalize(v3Sub(location, eye));
|
||||||
|
Vector3 h = v3Normalize(v3Sub(direction_inv, view));
|
||||||
|
double fresnel = 0.02 + 0.98 * pow(1.0 - v3Dot(v3Scale(view, -1.0), h), 5.0);
|
||||||
|
double refl = v3Dot(h, normal);
|
||||||
|
if (refl > 0.0)
|
||||||
|
{
|
||||||
|
double waterBrdf = fresnel * pow(refl, material->shininess);
|
||||||
|
if (waterBrdf > 0.0)
|
||||||
|
{
|
||||||
|
refl = material->reflection * waterBrdf * light->reflection;
|
||||||
|
result.r += refl * light_color.r;
|
||||||
|
result.g += refl * light_color.g;
|
||||||
|
result.b += refl * light_color.b;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
49
src/render/software/LightingManager.h
Normal file
49
src/render/software/LightingManager.h
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
#ifndef LIGHTINGMANAGER_H
|
||||||
|
#define LIGHTINGMANAGER_H
|
||||||
|
|
||||||
|
#include "software_global.h"
|
||||||
|
|
||||||
|
namespace paysages {
|
||||||
|
namespace software {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Global lighting manager.
|
||||||
|
*
|
||||||
|
* This manager handles the light filters and final light rendering.
|
||||||
|
*/
|
||||||
|
class SOFTWARESHARED_EXPORT LightingManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
LightingManager();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Register a filter that will receive all alterable lights.
|
||||||
|
*/
|
||||||
|
void registerFilter(LightFilter* filter);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Alter the light component at a given location.
|
||||||
|
* @return true if the light is useful
|
||||||
|
*/
|
||||||
|
bool alterLight(LightComponent &component, const Vector3 &location);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enable or disable the specularity lighting.
|
||||||
|
*/
|
||||||
|
void setSpecularity(bool enabled);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Apply a final component on a surface material.
|
||||||
|
*/
|
||||||
|
void applyFinalComponent(const LightComponent &component, const Vector3 &eye, const Vector3 &location, const Vector3 &normal, const SurfaceMaterial &material);
|
||||||
|
|
||||||
|
private:
|
||||||
|
int specularity;
|
||||||
|
|
||||||
|
std::vector<LightFilter*> filters;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // LIGHTINGMANAGER_H
|
|
@ -154,3 +154,12 @@ Color SoftwareRenderer::applyMediumTraversal(Vector3 location, Color color)
|
||||||
/*Vector3 eye = cameraGetLocation(scenery->getCamera());
|
/*Vector3 eye = cameraGetLocation(scenery->getCamera());
|
||||||
return fluid_medium->applyTraversal(eye, location, color);*/
|
return fluid_medium->applyTraversal(eye, location, color);*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Color SoftwareRenderer::applyLightingToSurface(const Vector3 &location, const Vector3 &normal, const SurfaceMaterial &material)
|
||||||
|
{
|
||||||
|
LightStatus* light = lightingCreateStatus(renderer->lighting, location, renderer->getCameraLocation(renderer, location));
|
||||||
|
renderer->atmosphere->getLightingStatus(renderer, light, normal, 0);
|
||||||
|
Color result = lightingApplyStatus(light, normal, material);
|
||||||
|
lightingDeleteStatus(light);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
|
@ -46,6 +46,7 @@ public:
|
||||||
inline FluidMediumManager* getFluidMediumManager() const {return fluid_medium;}
|
inline FluidMediumManager* getFluidMediumManager() const {return fluid_medium;}
|
||||||
|
|
||||||
virtual Color applyMediumTraversal(Vector3 location, Color color) override;
|
virtual Color applyMediumTraversal(Vector3 location, Color color) override;
|
||||||
|
virtual Color applyLightingToSurface(const Vector3 &location, const Vector3 &normal, const SurfaceMaterial &material);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Scenery* scenery;
|
Scenery* scenery;
|
||||||
|
|
|
@ -24,7 +24,11 @@ SOURCES += SoftwareRenderer.cpp \
|
||||||
clouds/BaseCloudsModel.cpp \
|
clouds/BaseCloudsModel.cpp \
|
||||||
clouds/CloudModelStratoCumulus.cpp \
|
clouds/CloudModelStratoCumulus.cpp \
|
||||||
TerrainRasterizer.cpp \
|
TerrainRasterizer.cpp \
|
||||||
WaterRasterizer.cpp
|
WaterRasterizer.cpp \
|
||||||
|
LightingManager.cpp \
|
||||||
|
LightStatus.cpp \
|
||||||
|
LightFilter.cpp \
|
||||||
|
LightComponent.cpp
|
||||||
|
|
||||||
HEADERS += SoftwareRenderer.h\
|
HEADERS += SoftwareRenderer.h\
|
||||||
software_global.h \
|
software_global.h \
|
||||||
|
@ -38,7 +42,11 @@ HEADERS += SoftwareRenderer.h\
|
||||||
clouds/BaseCloudsModel.h \
|
clouds/BaseCloudsModel.h \
|
||||||
clouds/CloudModelStratoCumulus.h \
|
clouds/CloudModelStratoCumulus.h \
|
||||||
TerrainRasterizer.h \
|
TerrainRasterizer.h \
|
||||||
WaterRasterizer.h
|
WaterRasterizer.h \
|
||||||
|
LightingManager.h \
|
||||||
|
LightStatus.h \
|
||||||
|
LightFilter.h \
|
||||||
|
LightComponent.h
|
||||||
|
|
||||||
unix:!symbian {
|
unix:!symbian {
|
||||||
maemo5 {
|
maemo5 {
|
||||||
|
|
|
@ -28,6 +28,11 @@ namespace software {
|
||||||
|
|
||||||
class SkyRasterizer;
|
class SkyRasterizer;
|
||||||
class TerrainRasterizer;
|
class TerrainRasterizer;
|
||||||
|
|
||||||
|
class LightingManager;
|
||||||
|
class LightStatus;
|
||||||
|
class LightFilter;
|
||||||
|
class LightComponent;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
#include "rendering_global.h"
|
#include "rendering_global.h"
|
||||||
|
|
||||||
#include "../rendering_global.h"
|
#include "../rendering_global.h"
|
||||||
#include "../tools/lighting.h"
|
|
||||||
#include "../shared/types.h"
|
#include "../shared/types.h"
|
||||||
#include "Color.h"
|
#include "Color.h"
|
||||||
|
|
||||||
|
@ -18,7 +17,6 @@ typedef struct
|
||||||
Color final;
|
Color final;
|
||||||
} AtmosphereResult;
|
} AtmosphereResult;
|
||||||
|
|
||||||
typedef void (*FuncAtmosphereGetLightingStatus)(Renderer* renderer, LightStatus* status, Vector3 normal, int opaque);
|
|
||||||
typedef AtmosphereResult (*FuncAtmosphereApplyAerialPerspective)(Renderer* renderer, Vector3 location, Color base);
|
typedef AtmosphereResult (*FuncAtmosphereApplyAerialPerspective)(Renderer* renderer, Vector3 location, Color base);
|
||||||
typedef AtmosphereResult (*FuncAtmosphereGetSkyColor)(Renderer* renderer, Vector3 direction);
|
typedef AtmosphereResult (*FuncAtmosphereGetSkyColor)(Renderer* renderer, Vector3 direction);
|
||||||
typedef Vector3 (*FuncAtmosphereGetSunDirection)(Renderer* renderer);
|
typedef Vector3 (*FuncAtmosphereGetSunDirection)(Renderer* renderer);
|
||||||
|
@ -28,7 +26,6 @@ class AtmosphereRenderer
|
||||||
public:
|
public:
|
||||||
AtmosphereDefinition* definition;
|
AtmosphereDefinition* definition;
|
||||||
|
|
||||||
FuncAtmosphereGetLightingStatus getLightingStatus;
|
|
||||||
FuncAtmosphereApplyAerialPerspective applyAerialPerspective;
|
FuncAtmosphereApplyAerialPerspective applyAerialPerspective;
|
||||||
FuncAtmosphereGetSkyColor getSkyColor;
|
FuncAtmosphereGetSkyColor getSkyColor;
|
||||||
FuncAtmosphereGetSunDirection getSunDirection;
|
FuncAtmosphereGetSunDirection getSunDirection;
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
#include "renderer.h"
|
#include "renderer.h"
|
||||||
|
|
||||||
#include "tools/lighting.h"
|
|
||||||
#include "System.h"
|
#include "System.h"
|
||||||
#include "Thread.h"
|
#include "Thread.h"
|
||||||
#include "render.h"
|
#include "render.h"
|
||||||
|
@ -91,16 +90,6 @@ static RayCastingResult _rayWalking(Renderer*, Vector3, Vector3, int, int, int,
|
||||||
return _RAYCASTING_NULL;
|
return _RAYCASTING_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Color _applyLightingToSurface(Renderer* renderer, Vector3 location, Vector3 normal, SurfaceMaterial* material)
|
|
||||||
{
|
|
||||||
LightStatus* light = lightingCreateStatus(renderer->lighting, location, renderer->getCameraLocation(renderer, location));
|
|
||||||
renderer->atmosphere->getLightingStatus(renderer, light, normal, 0);
|
|
||||||
Color result = lightingApplyStatus(light, normal, material);
|
|
||||||
lightingDeleteStatus(light);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -133,8 +122,6 @@ Renderer::Renderer()
|
||||||
|
|
||||||
rayWalking = _rayWalking;
|
rayWalking = _rayWalking;
|
||||||
|
|
||||||
applyLightingToSurface = _applyLightingToSurface;
|
|
||||||
|
|
||||||
lighting = lightingManagerCreate();
|
lighting = lightingManagerCreate();
|
||||||
|
|
||||||
atmosphere = (AtmosphereRenderer*)AtmosphereRendererClass.create();
|
atmosphere = (AtmosphereRenderer*)AtmosphereRendererClass.create();
|
||||||
|
@ -161,6 +148,11 @@ Color Renderer::applyMediumTraversal(Vector3, Color color)
|
||||||
return color;
|
return color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Color applyLightingToSurface(const Vector3 &, const Vector3 &, const SurfaceMaterial &material)
|
||||||
|
{
|
||||||
|
return material.base;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ public:
|
||||||
void (*pushDisplacedQuad)(Renderer* renderer, Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, Vector3 ov1, Vector3 ov2, Vector3 ov3, Vector3 ov4, f_RenderFragmentCallback callback, void* callback_data);
|
void (*pushDisplacedQuad)(Renderer* renderer, Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4, Vector3 ov1, Vector3 ov2, Vector3 ov3, Vector3 ov4, f_RenderFragmentCallback callback, void* callback_data);
|
||||||
|
|
||||||
/* Shortcuts */
|
/* Shortcuts */
|
||||||
Color(*applyLightingToSurface)(Renderer* renderer, Vector3 location, Vector3 normal, SurfaceMaterial* material);
|
virtual Color applyLightingToSurface(const Vector3 &location, const Vector3 &normal, const SurfaceMaterial &material);
|
||||||
virtual Color applyMediumTraversal(Vector3 location, Color color);
|
virtual Color applyMediumTraversal(Vector3 location, Color color);
|
||||||
|
|
||||||
/* Scenery related */
|
/* Scenery related */
|
||||||
|
|
|
@ -20,7 +20,6 @@ SOURCES += main.cpp \
|
||||||
textures/tex_preview.cpp \
|
textures/tex_preview.cpp \
|
||||||
tools/texture.cpp \
|
tools/texture.cpp \
|
||||||
tools/parallel.cpp \
|
tools/parallel.cpp \
|
||||||
tools/lighting.cpp \
|
|
||||||
tools/data.cpp \
|
tools/data.cpp \
|
||||||
tools/cache.cpp \
|
tools/cache.cpp \
|
||||||
water/wat_render.cpp \
|
water/wat_render.cpp \
|
||||||
|
@ -40,7 +39,6 @@ HEADERS += \
|
||||||
textures/private.h \
|
textures/private.h \
|
||||||
tools/texture.h \
|
tools/texture.h \
|
||||||
tools/parallel.h \
|
tools/parallel.h \
|
||||||
tools/lighting.h \
|
|
||||||
tools/data.h \
|
tools/data.h \
|
||||||
tools/cache.h \
|
tools/cache.h \
|
||||||
water/public.h \
|
water/public.h \
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
#include "../rendering_global.h"
|
#include "../rendering_global.h"
|
||||||
#include "Layers.h"
|
#include "Layers.h"
|
||||||
#include "tools/lighting.h"
|
|
||||||
#include "terrain/public.h"
|
#include "terrain/public.h"
|
||||||
#include "SurfaceMaterial.h"
|
#include "SurfaceMaterial.h"
|
||||||
|
|
||||||
|
|
|
@ -1,217 +0,0 @@
|
||||||
#include "lighting.h"
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "PackStream.h"
|
|
||||||
#include "SurfaceMaterial.h"
|
|
||||||
|
|
||||||
#define MAX_CALLBACK_COUNT 10
|
|
||||||
#define MAX_LIGHT_COUNT 30
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
FuncLightingAlterLight filter;
|
|
||||||
void* data;
|
|
||||||
} LightFilterCallback;
|
|
||||||
|
|
||||||
class LightingManager
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
int specularity_enabled;
|
|
||||||
int callbacks_count;
|
|
||||||
LightFilterCallback callbacks[MAX_CALLBACK_COUNT];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct LightStatus
|
|
||||||
{
|
|
||||||
LightingManager* manager;
|
|
||||||
Vector3 location;
|
|
||||||
Vector3 eye;
|
|
||||||
int light_count;
|
|
||||||
LightDefinition lights[MAX_LIGHT_COUNT];
|
|
||||||
};
|
|
||||||
|
|
||||||
LightingManager* lightingManagerCreate()
|
|
||||||
{
|
|
||||||
LightingManager* result;
|
|
||||||
|
|
||||||
result = new LightingManager;
|
|
||||||
result->callbacks_count = 0;
|
|
||||||
result->specularity_enabled = 1;
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void lightingManagerDelete(LightingManager* filter)
|
|
||||||
{
|
|
||||||
delete filter;
|
|
||||||
}
|
|
||||||
|
|
||||||
void lightingManagerRegisterFilter(LightingManager* filter, FuncLightingAlterLight callback, void* data)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < filter->callbacks_count; i++)
|
|
||||||
{
|
|
||||||
if (filter->callbacks[i].filter == callback)
|
|
||||||
{
|
|
||||||
filter->callbacks[i].data = data;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filter->callbacks_count < MAX_CALLBACK_COUNT)
|
|
||||||
{
|
|
||||||
filter->callbacks[filter->callbacks_count].filter = callback;
|
|
||||||
filter->callbacks[filter->callbacks_count].data = data;
|
|
||||||
filter->callbacks_count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void lightingManagerDisableSpecularity(LightingManager* manager)
|
|
||||||
{
|
|
||||||
manager->specularity_enabled = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
LightStatus* lightingCreateStatus(LightingManager* manager, Vector3 location, Vector3 eye)
|
|
||||||
{
|
|
||||||
LightStatus* result;
|
|
||||||
|
|
||||||
result = new LightStatus;
|
|
||||||
result->manager = manager;
|
|
||||||
result->location = location;
|
|
||||||
result->eye = eye;
|
|
||||||
result->light_count = 0;
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void lightingDeleteStatus(LightStatus* status)
|
|
||||||
{
|
|
||||||
delete status;
|
|
||||||
}
|
|
||||||
|
|
||||||
void lightingPushLight(LightStatus* status, LightDefinition* light)
|
|
||||||
{
|
|
||||||
if (status->light_count < MAX_LIGHT_COUNT)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
LightingManager* manager = status->manager;
|
|
||||||
LightDefinition final = *light;
|
|
||||||
|
|
||||||
if (light->altered)
|
|
||||||
{
|
|
||||||
for (i = 0; i < manager->callbacks_count; i++)
|
|
||||||
{
|
|
||||||
LightFilterCallback callback = manager->callbacks[i];
|
|
||||||
LightDefinition temp = final;
|
|
||||||
if (callback.filter(callback.data, &temp, status->location))
|
|
||||||
{
|
|
||||||
final = temp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!status->manager->specularity_enabled)
|
|
||||||
{
|
|
||||||
final.reflection = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
status->lights[status->light_count++] = final;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Color lightingApplyStatus(LightStatus* status, Vector3 normal, SurfaceMaterial* material)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
Color final, result;
|
|
||||||
|
|
||||||
final.r = final.g = final.b = 0.0;
|
|
||||||
final.a = material->base.a;
|
|
||||||
|
|
||||||
for (i = 0; i < status->light_count; i++)
|
|
||||||
{
|
|
||||||
result = lightingApplyOneLight(status->lights + i, status->eye, status->location, normal, material);
|
|
||||||
final.r += result.r;
|
|
||||||
final.g += result.g;
|
|
||||||
final.b += result.b;
|
|
||||||
}
|
|
||||||
|
|
||||||
return final;
|
|
||||||
}
|
|
||||||
|
|
||||||
Color lightingApplyOneLight(LightDefinition* light, Vector3 eye, Vector3 location, Vector3 normal, SurfaceMaterial* material)
|
|
||||||
{
|
|
||||||
Color result, light_color;
|
|
||||||
double normal_norm;
|
|
||||||
Vector3 direction_inv;
|
|
||||||
|
|
||||||
light_color = light->color;
|
|
||||||
direction_inv = v3Scale(v3Normalize(light->direction), -1.0);
|
|
||||||
|
|
||||||
normal_norm = v3Norm(normal);
|
|
||||||
if (normal_norm > 1.0)
|
|
||||||
{
|
|
||||||
normal_norm = 1.0;
|
|
||||||
}
|
|
||||||
normal = v3Normalize(normal);
|
|
||||||
|
|
||||||
result = COLOR_BLACK;
|
|
||||||
|
|
||||||
/* diffused light */
|
|
||||||
double diffuse = v3Dot(direction_inv, normal);
|
|
||||||
diffuse = (diffuse + (1.0 - normal_norm)) / (1.0 + (1.0 - normal_norm));
|
|
||||||
if (diffuse > 0.0)
|
|
||||||
{
|
|
||||||
result.r += diffuse * material->_rgb.r * light_color.r;
|
|
||||||
result.g += diffuse * material->_rgb.g * light_color.g;
|
|
||||||
result.b += diffuse * material->_rgb.b * light_color.b;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* specular reflection */
|
|
||||||
if (material->reflection > 0.0 && light->reflection > 0.0)
|
|
||||||
{
|
|
||||||
Vector3 view = v3Normalize(v3Sub(location, eye));
|
|
||||||
Vector3 reflect = v3Sub(direction_inv, v3Scale(normal, 2.0 * v3Dot(direction_inv, normal)));
|
|
||||||
double specular = v3Dot(reflect, view);
|
|
||||||
if (specular > 0.0)
|
|
||||||
{
|
|
||||||
specular = pow(specular, material->shininess) * material->reflection * light->reflection * normal_norm;
|
|
||||||
if (specular > 0.0)
|
|
||||||
{
|
|
||||||
result.r += specular * light_color.r;
|
|
||||||
result.g += specular * light_color.g;
|
|
||||||
result.b += specular * light_color.b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* specular reflection with fresnel effect */
|
|
||||||
/*if (material->reflection > 0.0 && light->reflection > 0.0)
|
|
||||||
{
|
|
||||||
Vector3 view = v3Normalize(v3Sub(location, eye));
|
|
||||||
Vector3 h = v3Normalize(v3Sub(direction_inv, view));
|
|
||||||
double fresnel = 0.02 + 0.98 * pow(1.0 - v3Dot(v3Scale(view, -1.0), h), 5.0);
|
|
||||||
double refl = v3Dot(h, normal);
|
|
||||||
if (refl > 0.0)
|
|
||||||
{
|
|
||||||
double waterBrdf = fresnel * pow(refl, material->shininess);
|
|
||||||
if (waterBrdf > 0.0)
|
|
||||||
{
|
|
||||||
refl = material->reflection * waterBrdf * light->reflection;
|
|
||||||
result.r += refl * light_color.r;
|
|
||||||
result.g += refl * light_color.g;
|
|
||||||
result.b += refl * light_color.b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
Vector3 lightingGetStatusLocation(LightStatus* status)
|
|
||||||
{
|
|
||||||
return status->location;
|
|
||||||
}
|
|
|
@ -1,34 +0,0 @@
|
||||||
#ifndef _PAYSAGES_TOOLS_LIGHTING_H_
|
|
||||||
#define _PAYSAGES_TOOLS_LIGHTING_H_
|
|
||||||
|
|
||||||
#include "../rendering_global.h"
|
|
||||||
#include "Color.h"
|
|
||||||
#include "Vector3.h"
|
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
Vector3 direction; /* Global direction of the light */
|
|
||||||
Color color; /* Main color of the light */
|
|
||||||
double reflection; /* Reflected factor of the light (for specular lighting) */
|
|
||||||
int altered; /* Should the light be filtered or masked (by atmosphere, water, ground, clouds...) */
|
|
||||||
} LightDefinition;
|
|
||||||
|
|
||||||
typedef int (*FuncLightingAlterLight)(void* data, LightDefinition* light, Vector3 at);
|
|
||||||
|
|
||||||
class LightingManager;
|
|
||||||
typedef struct LightStatus LightStatus;
|
|
||||||
|
|
||||||
RENDERINGSHARED_EXPORT LightingManager* lightingManagerCreate();
|
|
||||||
RENDERINGSHARED_EXPORT void lightingManagerDelete(LightingManager* filter);
|
|
||||||
RENDERINGSHARED_EXPORT void lightingManagerRegisterFilter(LightingManager* filter, FuncLightingAlterLight callback, void* data);
|
|
||||||
RENDERINGSHARED_EXPORT void lightingManagerDisableSpecularity(LightingManager* manager);
|
|
||||||
|
|
||||||
RENDERINGSHARED_EXPORT LightStatus* lightingCreateStatus(LightingManager* manager, Vector3 location, Vector3 eye);
|
|
||||||
RENDERINGSHARED_EXPORT void lightingDeleteStatus(LightStatus* status);
|
|
||||||
RENDERINGSHARED_EXPORT void lightingPushLight(LightStatus* status, LightDefinition* light);
|
|
||||||
RENDERINGSHARED_EXPORT Color lightingApplyStatus(LightStatus* status, Vector3 normal, SurfaceMaterial* material);
|
|
||||||
RENDERINGSHARED_EXPORT Vector3 lightingGetStatusLocation(LightStatus* status);
|
|
||||||
|
|
||||||
RENDERINGSHARED_EXPORT Color lightingApplyOneLight(LightDefinition* light, Vector3 eye, Vector3 location, Vector3 normal, SurfaceMaterial* material);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
#include "../rendering_global.h"
|
#include "../rendering_global.h"
|
||||||
#include "../shared/types.h"
|
#include "../shared/types.h"
|
||||||
#include "../tools/lighting.h"
|
|
||||||
#include "TerrainDefinition.h"
|
#include "TerrainDefinition.h"
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
|
|
Loading…
Reference in a new issue