Added /atmosphere/godrays/ definition node
This commit is contained in:
parent
b045b731ad
commit
98e3128c31
12 changed files with 109 additions and 11 deletions
|
@ -3,10 +3,12 @@
|
|||
#include "PackStream.h"
|
||||
#include "RandomGenerator.h"
|
||||
#include "FloatNode.h"
|
||||
#include "GodRaysDefinition.h"
|
||||
|
||||
AtmosphereDefinition::AtmosphereDefinition(DefinitionNode* parent):
|
||||
DefinitionNode(parent, "atmosphere", "atmosphere")
|
||||
{
|
||||
godrays = new GodRaysDefinition(this);
|
||||
daytime = new FloatNode(this, "daytime");
|
||||
humidity = new FloatNode(this, "humidity");
|
||||
sun_radius = new FloatNode(this, "sun_radius");
|
||||
|
|
|
@ -45,6 +45,7 @@ public:
|
|||
|
||||
virtual void copy(DefinitionNode* destination) const override;
|
||||
|
||||
inline GodRaysDefinition *childGodRays() const {return godrays;}
|
||||
inline FloatNode *propDayTime() const {return daytime;}
|
||||
inline FloatNode *propHumidity() const {return humidity;}
|
||||
inline FloatNode *propSunRadius() const {return sun_radius;}
|
||||
|
@ -78,6 +79,7 @@ public:
|
|||
std::vector<Star> stars;
|
||||
|
||||
private:
|
||||
GodRaysDefinition *godrays;
|
||||
FloatNode *humidity;
|
||||
FloatNode *daytime;
|
||||
FloatNode *sun_radius;
|
||||
|
|
12
src/definition/GodRaysDefinition.cpp
Normal file
12
src/definition/GodRaysDefinition.cpp
Normal file
|
@ -0,0 +1,12 @@
|
|||
#include "GodRaysDefinition.h"
|
||||
|
||||
#include "FloatNode.h"
|
||||
|
||||
GodRaysDefinition::GodRaysDefinition(DefinitionNode *parent):
|
||||
DefinitionNode(parent, "godrays", "godrays")
|
||||
{
|
||||
penetration = new FloatNode(this, "penetration", 0.01);
|
||||
resistance = new FloatNode(this, "resistance", 0.3);
|
||||
boost = new FloatNode(this, "boost", 8.0);
|
||||
}
|
||||
|
29
src/definition/GodRaysDefinition.h
Normal file
29
src/definition/GodRaysDefinition.h
Normal file
|
@ -0,0 +1,29 @@
|
|||
#ifndef GODRAYSDEFINITION_H
|
||||
#define GODRAYSDEFINITION_H
|
||||
|
||||
#include "definition_global.h"
|
||||
|
||||
#include "DefinitionNode.h"
|
||||
|
||||
namespace paysages {
|
||||
namespace definition {
|
||||
|
||||
class DEFINITIONSHARED_EXPORT GodRaysDefinition: public DefinitionNode
|
||||
{
|
||||
public:
|
||||
GodRaysDefinition(DefinitionNode *parent);
|
||||
|
||||
inline FloatNode *propPenetration() const {return penetration;}
|
||||
inline FloatNode *propResistance() const {return resistance;}
|
||||
inline FloatNode *propBoost() const {return boost;}
|
||||
|
||||
private:
|
||||
FloatNode *penetration;
|
||||
FloatNode *resistance;
|
||||
FloatNode *boost;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif // GODRAYSDEFINITION_H
|
|
@ -37,7 +37,8 @@ SOURCES += \
|
|||
DiffManager.cpp \
|
||||
DefinitionWatcher.cpp \
|
||||
IntNode.cpp \
|
||||
IntDiff.cpp
|
||||
IntDiff.cpp \
|
||||
GodRaysDefinition.cpp
|
||||
|
||||
HEADERS +=\
|
||||
definition_global.h \
|
||||
|
@ -64,7 +65,8 @@ HEADERS +=\
|
|||
DiffManager.h \
|
||||
DefinitionWatcher.h \
|
||||
IntNode.h \
|
||||
IntDiff.h
|
||||
IntDiff.h \
|
||||
GodRaysDefinition.h
|
||||
|
||||
unix:!symbian {
|
||||
maemo5 {
|
||||
|
|
|
@ -30,6 +30,7 @@ namespace definition {
|
|||
class CloudsDefinition;
|
||||
class CloudLayerDefinition;
|
||||
class AtmosphereDefinition;
|
||||
class GodRaysDefinition;
|
||||
class TexturesDefinition;
|
||||
class TextureLayerDefinition;
|
||||
class TerrainDefinition;
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include "TerrainDefinition.h"
|
||||
#include "AtmosphereDefinition.h"
|
||||
#include "TexturesDefinition.h"
|
||||
#include "GodRaysDefinition.h"
|
||||
#include "TextureLayerDefinition.h"
|
||||
#include "WaterDefinition.h"
|
||||
#include "SurfaceMaterial.h"
|
||||
|
@ -157,11 +158,37 @@ static void testGodRays()
|
|||
TestLightFilter filter;
|
||||
renderer.getLightingManager()->clearFilters();
|
||||
renderer.getLightingManager()->registerFilter(&filter);
|
||||
|
||||
// quality
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
renderer.setQuality((double)i / 5.0);
|
||||
rasterizer->setQuality(0.2);
|
||||
startTestRender(&renderer, "god_rays", i);
|
||||
startTestRender(&renderer, "god_rays_quality", i);
|
||||
}
|
||||
renderer.setQuality(0.5);
|
||||
|
||||
// penetration
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
scenery.getAtmosphere()->childGodRays()->propPenetration()->setValue(0.01 + 0.02 * (double)i);
|
||||
startTestRender(&renderer, "god_rays_penetration", i);
|
||||
}
|
||||
|
||||
// resistance
|
||||
scenery.getAtmosphere()->childGodRays()->propPenetration()->setValue(0.01);
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
scenery.getAtmosphere()->childGodRays()->propResistance()->setValue(0.1 + 0.1 * (double)i);
|
||||
startTestRender(&renderer, "god_rays_resistance", i);
|
||||
}
|
||||
|
||||
// boost
|
||||
scenery.getAtmosphere()->childGodRays()->propResistance()->setValue(0.3);
|
||||
for (int i = 0; i < 3; i++)
|
||||
{
|
||||
scenery.getAtmosphere()->childGodRays()->propBoost()->setValue(2.0 + 4.0 * (double)i);
|
||||
startTestRender(&renderer, "god_rays_boost", i);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ GodRaysResult::GodRaysResult(double inside_length, double full_length):
|
|||
{
|
||||
}
|
||||
|
||||
Color GodRaysResult::apply(const Color &raw, const Color &atmosphered)
|
||||
Color GodRaysResult::apply(const Color &raw, const Color &atmosphered, const GodRaysParams ¶ms)
|
||||
{
|
||||
if (inside_length == 0.0)
|
||||
{
|
||||
|
@ -14,14 +14,16 @@ Color GodRaysResult::apply(const Color &raw, const Color &atmosphered)
|
|||
else if (inside_length < full_length)
|
||||
{
|
||||
double diff = full_length - inside_length;
|
||||
double factor = 1.0 - 0.01 * diff;
|
||||
if (factor < 0.3)
|
||||
double factor = 1.0 - params.penetration * diff;
|
||||
double minimum = params.resistance;
|
||||
double complement = 1.0 - minimum;
|
||||
if (factor < minimum)
|
||||
{
|
||||
factor = 0.3;
|
||||
factor = minimum;
|
||||
}
|
||||
else
|
||||
{
|
||||
factor = pow((factor - 0.3) / 0.7, 8.0) * 0.7 + 0.3;
|
||||
factor = pow((factor - minimum) / complement, params.boost) * complement + minimum;
|
||||
}
|
||||
|
||||
return Color(raw.r + (atmosphered.r - raw.r) * factor,
|
||||
|
|
|
@ -13,6 +13,13 @@ namespace software {
|
|||
*/
|
||||
class SOFTWARESHARED_EXPORT GodRaysResult
|
||||
{
|
||||
public:
|
||||
typedef struct {
|
||||
double penetration;
|
||||
double resistance;
|
||||
double boost;
|
||||
} GodRaysParams;
|
||||
|
||||
public:
|
||||
GodRaysResult() = default;
|
||||
GodRaysResult(double inside_length, double full_length);
|
||||
|
@ -20,7 +27,7 @@ public:
|
|||
/**
|
||||
* Apply the result on a base color.
|
||||
*/
|
||||
Color apply(const Color &raw, const Color &atmosphered);
|
||||
Color apply(const Color &raw, const Color &atmosphered, const GodRaysParams ¶ms);
|
||||
|
||||
private:
|
||||
double inside_length;
|
||||
|
|
|
@ -1,10 +1,13 @@
|
|||
#include "GodRaysSampler.h"
|
||||
|
||||
#include "GodRaysDefinition.h"
|
||||
#include "AtmosphereDefinition.h"
|
||||
#include "SoftwareRenderer.h"
|
||||
#include "Vector3.h"
|
||||
#include "SpaceSegment.h"
|
||||
#include "GodRaysResult.h"
|
||||
#include "LightingManager.h"
|
||||
#include "FloatNode.h"
|
||||
#include "LightStatus.h"
|
||||
#include "Scenery.h"
|
||||
#include "TerrainDefinition.h"
|
||||
|
@ -16,6 +19,7 @@ GodRaysSampler::GodRaysSampler()
|
|||
{
|
||||
enabled = true;
|
||||
bounds = new SpaceSegment();
|
||||
definition = new GodRaysDefinition(NULL);
|
||||
camera_location = new Vector3(0, 0, 0);
|
||||
lighting = NULL;
|
||||
low_altitude = -1.0;
|
||||
|
@ -28,6 +32,7 @@ GodRaysSampler::GodRaysSampler()
|
|||
|
||||
GodRaysSampler::~GodRaysSampler()
|
||||
{
|
||||
delete definition;
|
||||
delete bounds;
|
||||
delete camera_location;
|
||||
delete[] data;
|
||||
|
@ -38,6 +43,7 @@ void GodRaysSampler::prepare(SoftwareRenderer *renderer)
|
|||
setCameraLocation(renderer->getCameraLocation(VECTOR_ZERO));
|
||||
setLighting(renderer->getLightingManager());
|
||||
setAltitudes(renderer->getScenery()->getTerrain()->getHeightInfo().min_height, renderer->getCloudsRenderer()->getHighestAltitude());
|
||||
renderer->getScenery()->getAtmosphere()->childGodRays()->copy(definition);
|
||||
reset();
|
||||
}
|
||||
|
||||
|
@ -178,7 +184,13 @@ Color GodRaysSampler::apply(const Color &raw, const Color &atmosphered, const Ve
|
|||
if (enabled)
|
||||
{
|
||||
GodRaysResult result = getResult(SpaceSegment(*camera_location, location));
|
||||
return result.apply(raw, atmosphered);
|
||||
|
||||
GodRaysResult::GodRaysParams params;
|
||||
params.penetration = definition->propPenetration()->getValue();
|
||||
params.resistance = definition->propResistance()->getValue();
|
||||
params.boost = definition->propBoost()->getValue();
|
||||
|
||||
return result.apply(raw, atmosphered, params);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
@ -99,6 +99,8 @@ private:
|
|||
bool enabled;
|
||||
SpaceSegment *bounds;
|
||||
|
||||
GodRaysDefinition *definition;
|
||||
|
||||
double sampling_step;
|
||||
double max_length;
|
||||
double walk_step;
|
||||
|
|
|
@ -95,7 +95,7 @@ const Color NightSky::getColor(double altitude, const Vector3 &direction)
|
|||
|
||||
}
|
||||
|
||||
bool NightSky::getLightsAt(std::vector<LightComponent> &result, const Vector3 &location) const
|
||||
bool NightSky::getLightsAt(std::vector<LightComponent> &result, const Vector3 &) const
|
||||
{
|
||||
LightComponent moon, sky;
|
||||
|
||||
|
|
Loading…
Reference in a new issue