Replaced NoiseGenerator by NoiseState in WaterDefinition
This commit is contained in:
parent
e79692bb5d
commit
3e72fc7bf8
8 changed files with 53 additions and 39 deletions
|
@ -10,6 +10,10 @@ FractalNoise::FractalNoise()
|
||||||
ridge = 0.0;
|
ridge = 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FractalNoise::~FractalNoise()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void FractalNoise::setScaling(double scaling, double height)
|
void FractalNoise::setScaling(double scaling, double height)
|
||||||
{
|
{
|
||||||
this->scaling = scaling < 0.00000001 ? 0.0 : 1.0 / scaling;
|
this->scaling = scaling < 0.00000001 ? 0.0 : 1.0 / scaling;
|
||||||
|
|
|
@ -15,6 +15,7 @@ class BASICSSHARED_EXPORT FractalNoise
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FractalNoise();
|
FractalNoise();
|
||||||
|
virtual ~FractalNoise();
|
||||||
|
|
||||||
void setScaling(double scaling, double height=1.0);
|
void setScaling(double scaling, double height=1.0);
|
||||||
void setStep(double scaling_factor, double height_factor=1.0);
|
void setStep(double scaling_factor, double height_factor=1.0);
|
||||||
|
|
|
@ -480,6 +480,15 @@ double noiseSimplexGet4DValue(double x, double y, double z, double w)
|
||||||
return 13.5 * (n0 + n1 + n2 + n3 + n4) + 0.5;
|
return 13.5 * (n0 + n1 + n2 + n3 + n4) + 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double NoiseFunctionSimplex::getBase2d(double x, double y) const
|
||||||
|
{
|
||||||
|
return noiseSimplexGet2DValue(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
double NoiseFunctionSimplex::getBase3d(double x, double y, double z) const
|
||||||
|
{
|
||||||
|
return noiseSimplexGet3DValue(x, y, z);
|
||||||
|
}
|
||||||
|
|
||||||
static Texture2D *_valueTexture = NULL;
|
static Texture2D *_valueTexture = NULL;
|
||||||
|
|
||||||
|
|
|
@ -3,11 +3,16 @@
|
||||||
|
|
||||||
#include "basics_global.h"
|
#include "basics_global.h"
|
||||||
|
|
||||||
|
#include "FractalNoise.h"
|
||||||
|
|
||||||
namespace paysages {
|
namespace paysages {
|
||||||
namespace basics {
|
namespace basics {
|
||||||
|
|
||||||
class NoiseFunctionSimplex
|
class NoiseFunctionSimplex:public FractalNoise
|
||||||
{
|
{
|
||||||
|
virtual double getBase2d(double x, double y) const override;
|
||||||
|
virtual double getBase3d(double x, double y, double z) const override;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static const Texture2D *getValueTexture();
|
static const Texture2D *getValueTexture();
|
||||||
static const Texture2D *getNormalTexture();
|
static const Texture2D *getNormalTexture();
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include "WaterDefinition.h"
|
#include "WaterDefinition.h"
|
||||||
|
|
||||||
#include "PackStream.h"
|
#include "PackStream.h"
|
||||||
#include "NoiseGenerator.h"
|
#include "NoiseState.h"
|
||||||
#include "Color.h"
|
#include "Color.h"
|
||||||
#include "SurfaceMaterial.h"
|
#include "SurfaceMaterial.h"
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ WaterDefinition::WaterDefinition(BaseDefinition* parent):
|
||||||
material = new SurfaceMaterial;
|
material = new SurfaceMaterial;
|
||||||
depth_color = new Color;
|
depth_color = new Color;
|
||||||
foam_material = new SurfaceMaterial;
|
foam_material = new SurfaceMaterial;
|
||||||
_waves_noise = new NoiseGenerator;
|
noise_state = new NoiseState();
|
||||||
|
|
||||||
transparency_depth = 0.0;
|
transparency_depth = 0.0;
|
||||||
transparency = 0.0;
|
transparency = 0.0;
|
||||||
|
@ -29,7 +29,7 @@ WaterDefinition::~WaterDefinition()
|
||||||
delete material;
|
delete material;
|
||||||
delete depth_color;
|
delete depth_color;
|
||||||
delete foam_material;
|
delete foam_material;
|
||||||
delete _waves_noise;
|
delete noise_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WaterDefinition::save(PackStream* stream) const
|
void WaterDefinition::save(PackStream* stream) const
|
||||||
|
@ -51,7 +51,7 @@ void WaterDefinition::save(PackStream* stream) const
|
||||||
stream->write(&foam_coverage);
|
stream->write(&foam_coverage);
|
||||||
foam_material->save(stream);
|
foam_material->save(stream);
|
||||||
|
|
||||||
_waves_noise->save(stream);
|
noise_state->save(stream);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WaterDefinition::load(PackStream* stream)
|
void WaterDefinition::load(PackStream* stream)
|
||||||
|
@ -73,7 +73,7 @@ void WaterDefinition::load(PackStream* stream)
|
||||||
stream->read(&foam_coverage);
|
stream->read(&foam_coverage);
|
||||||
foam_material->load(stream);
|
foam_material->load(stream);
|
||||||
|
|
||||||
_waves_noise->load(stream);
|
noise_state->load(stream);
|
||||||
|
|
||||||
validate();
|
validate();
|
||||||
}
|
}
|
||||||
|
@ -95,34 +95,20 @@ void WaterDefinition::copy(BaseDefinition* _destination) const
|
||||||
destination->turbulence = turbulence;
|
destination->turbulence = turbulence;
|
||||||
destination->foam_coverage = foam_coverage;
|
destination->foam_coverage = foam_coverage;
|
||||||
*destination->foam_material = *foam_material;
|
*destination->foam_material = *foam_material;
|
||||||
_waves_noise->copy(destination->_waves_noise);
|
noise_state->copy(destination->noise_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WaterDefinition::validate()
|
void WaterDefinition::validate()
|
||||||
{
|
{
|
||||||
BaseDefinition::validate();
|
BaseDefinition::validate();
|
||||||
|
|
||||||
double scaling = this->scaling * 0.3;
|
|
||||||
|
|
||||||
_waves_noise->clearLevels();
|
|
||||||
if (waves_height > 0.0)
|
|
||||||
{
|
|
||||||
_waves_noise->addLevelsSimple(2, scaling, -waves_height * scaling * 0.015, waves_height * scaling * 0.015, 0.5);
|
|
||||||
}
|
|
||||||
if (detail_height > 0.0)
|
|
||||||
{
|
|
||||||
_waves_noise->addLevelsSimple(3, scaling * 0.1, -detail_height * scaling * 0.015, detail_height * scaling * 0.015, 0.5);
|
|
||||||
}
|
|
||||||
_waves_noise->setFunctionParams(NoiseGenerator::NOISE_FUNCTION_SIMPLEX, -turbulence, 0.0);
|
|
||||||
_waves_noise->validate();
|
|
||||||
|
|
||||||
material->validate();
|
material->validate();
|
||||||
foam_material->validate();
|
foam_material->validate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void WaterDefinition::applyPreset(WaterPreset preset)
|
void WaterDefinition::applyPreset(WaterPreset preset)
|
||||||
{
|
{
|
||||||
_waves_noise->randomizeOffsets();
|
noise_state->randomizeOffsets();
|
||||||
|
|
||||||
if (preset == WATER_PRESET_LAKE)
|
if (preset == WATER_PRESET_LAKE)
|
||||||
{
|
{
|
||||||
|
|
|
@ -44,7 +44,7 @@ public:
|
||||||
double foam_coverage;
|
double foam_coverage;
|
||||||
SurfaceMaterial* foam_material;
|
SurfaceMaterial* foam_material;
|
||||||
|
|
||||||
NoiseGenerator* _waves_noise;
|
NoiseState* noise_state;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,26 +7,33 @@
|
||||||
#include "LightComponent.h"
|
#include "LightComponent.h"
|
||||||
#include "Scenery.h"
|
#include "Scenery.h"
|
||||||
#include "SurfaceMaterial.h"
|
#include "SurfaceMaterial.h"
|
||||||
|
#include "NoiseFunctionSimplex.h"
|
||||||
|
|
||||||
WaterRenderer::WaterRenderer(SoftwareRenderer* parent):
|
WaterRenderer::WaterRenderer(SoftwareRenderer* parent):
|
||||||
parent(parent)
|
parent(parent)
|
||||||
{
|
{
|
||||||
|
noise = new NoiseFunctionSimplex();
|
||||||
}
|
}
|
||||||
|
|
||||||
WaterRenderer::~WaterRenderer()
|
WaterRenderer::~WaterRenderer()
|
||||||
{
|
{
|
||||||
|
delete noise;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WaterRenderer::update()
|
void WaterRenderer::update()
|
||||||
{
|
{
|
||||||
|
WaterDefinition* definition = parent->getScenery()->getWater();
|
||||||
|
noise->setState(*definition->noise_state);
|
||||||
|
noise->setScaling(definition->scaling * 0.3, definition->waves_height * 0.05);
|
||||||
|
noise->setStep(0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline double _getHeight(WaterDefinition* definition, double x, double z)
|
static inline double _getHeight(FractalNoise* noise, double x, double z)
|
||||||
{
|
{
|
||||||
return definition->_waves_noise->get2DTotal(x, z);
|
return noise->get2d(0.00001, x, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Vector3 _getNormal(WaterDefinition* definition, Vector3 base, double detail)
|
static inline Vector3 _getNormal(FractalNoise* noise, Vector3 base, double detail)
|
||||||
{
|
{
|
||||||
Vector3 back, right;
|
Vector3 back, right;
|
||||||
double x, z;
|
double x, z;
|
||||||
|
@ -35,12 +42,12 @@ static inline Vector3 _getNormal(WaterDefinition* definition, Vector3 base, doub
|
||||||
z = base.z;
|
z = base.z;
|
||||||
|
|
||||||
back.x = x;
|
back.x = x;
|
||||||
back.y = _getHeight(definition, x, z + detail);
|
back.y = _getHeight(noise, x, z + detail);
|
||||||
back.z = z + detail;
|
back.z = z + detail;
|
||||||
back = back.sub(base);
|
back = back.sub(base);
|
||||||
|
|
||||||
right.x = x + detail;
|
right.x = x + detail;
|
||||||
right.y = _getHeight(definition, x + detail, z);
|
right.y = _getHeight(noise, x + detail, z);
|
||||||
right.z = z;
|
right.z = z;
|
||||||
right = right.sub(base);
|
right = right.sub(base);
|
||||||
|
|
||||||
|
@ -72,7 +79,7 @@ static inline Vector3 _refractRay(Vector3 incoming, Vector3 normal)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline Color _getFoamMask(SoftwareRenderer* renderer, WaterDefinition* definition, Vector3 location, Vector3 normal, double detail)
|
static inline Color _getFoamMask(SoftwareRenderer* renderer, WaterDefinition* definition, FractalNoise* noise, Vector3 location, Vector3 normal, double detail)
|
||||||
{
|
{
|
||||||
Color result;
|
Color result;
|
||||||
double foam_factor, normal_diff, location_offset;
|
double foam_factor, normal_diff, location_offset;
|
||||||
|
@ -81,26 +88,26 @@ static inline Color _getFoamMask(SoftwareRenderer* renderer, WaterDefinition* de
|
||||||
|
|
||||||
foam_factor = 0.0;
|
foam_factor = 0.0;
|
||||||
location.x += location_offset;
|
location.x += location_offset;
|
||||||
normal_diff = 1.0 - normal.dotProduct(_getNormal(definition, location, detail));
|
normal_diff = 1.0 - normal.dotProduct(_getNormal(noise, location, detail));
|
||||||
if (normal_diff > foam_factor)
|
if (normal_diff > foam_factor)
|
||||||
{
|
{
|
||||||
foam_factor = normal_diff;
|
foam_factor = normal_diff;
|
||||||
}
|
}
|
||||||
location.x -= location_offset * 2.0;
|
location.x -= location_offset * 2.0;
|
||||||
normal_diff = 1.0 - normal.dotProduct(_getNormal(definition, location, detail));
|
normal_diff = 1.0 - normal.dotProduct(_getNormal(noise, location, detail));
|
||||||
if (normal_diff > foam_factor)
|
if (normal_diff > foam_factor)
|
||||||
{
|
{
|
||||||
foam_factor = normal_diff;
|
foam_factor = normal_diff;
|
||||||
}
|
}
|
||||||
location.x += location_offset;
|
location.x += location_offset;
|
||||||
location.z -= location_offset;
|
location.z -= location_offset;
|
||||||
normal_diff = 1.0 - normal.dotProduct(_getNormal(definition, location, detail));
|
normal_diff = 1.0 - normal.dotProduct(_getNormal(noise, location, detail));
|
||||||
if (normal_diff > foam_factor)
|
if (normal_diff > foam_factor)
|
||||||
{
|
{
|
||||||
foam_factor = normal_diff;
|
foam_factor = normal_diff;
|
||||||
}
|
}
|
||||||
location.z += location_offset * 2.0;
|
location.z += location_offset * 2.0;
|
||||||
normal_diff = 1.0 - normal.dotProduct(_getNormal(definition, location, detail));
|
normal_diff = 1.0 - normal.dotProduct(_getNormal(noise, location, detail));
|
||||||
if (normal_diff > foam_factor)
|
if (normal_diff > foam_factor)
|
||||||
{
|
{
|
||||||
foam_factor = normal_diff;
|
foam_factor = normal_diff;
|
||||||
|
@ -139,12 +146,13 @@ static inline Color _getFoamMask(SoftwareRenderer* renderer, WaterDefinition* de
|
||||||
|
|
||||||
HeightInfo WaterRenderer::getHeightInfo()
|
HeightInfo WaterRenderer::getHeightInfo()
|
||||||
{
|
{
|
||||||
WaterDefinition* definition = parent->getScenery()->getWater();
|
|
||||||
HeightInfo info;
|
HeightInfo info;
|
||||||
double noise_minvalue, noise_maxvalue;
|
double noise_minvalue, noise_maxvalue;
|
||||||
|
|
||||||
info.base_height = 0.0;
|
info.base_height = 0.0;
|
||||||
definition->_waves_noise->getRange(&noise_minvalue, &noise_maxvalue);
|
// TODO
|
||||||
|
//noise->getRange(&noise_minvalue, &noise_maxvalue);
|
||||||
|
noise_minvalue = noise_maxvalue = 0.0;
|
||||||
info.min_height = info.base_height + noise_minvalue;
|
info.min_height = info.base_height + noise_minvalue;
|
||||||
info.max_height = info.base_height + noise_maxvalue;
|
info.max_height = info.base_height + noise_maxvalue;
|
||||||
|
|
||||||
|
@ -153,7 +161,7 @@ HeightInfo WaterRenderer::getHeightInfo()
|
||||||
|
|
||||||
double WaterRenderer::getHeight(double x, double z)
|
double WaterRenderer::getHeight(double x, double z)
|
||||||
{
|
{
|
||||||
return _getHeight(parent->getScenery()->getWater(), x, z);
|
return _getHeight(noise, x, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
WaterRenderer::WaterResult WaterRenderer::getResult(double x, double z)
|
WaterRenderer::WaterResult WaterRenderer::getResult(double x, double z)
|
||||||
|
@ -166,7 +174,7 @@ WaterRenderer::WaterResult WaterRenderer::getResult(double x, double z)
|
||||||
double detail, depth;
|
double detail, depth;
|
||||||
|
|
||||||
location.x = x;
|
location.x = x;
|
||||||
location.y = _getHeight(definition, x, z);
|
location.y = _getHeight(noise, x, z);
|
||||||
location.z = z;
|
location.z = z;
|
||||||
result.location = location;
|
result.location = location;
|
||||||
|
|
||||||
|
@ -176,7 +184,7 @@ WaterRenderer::WaterResult WaterRenderer::getResult(double x, double z)
|
||||||
detail = 0.00001;
|
detail = 0.00001;
|
||||||
}
|
}
|
||||||
|
|
||||||
normal = _getNormal(definition, location, detail);
|
normal = _getNormal(noise, location, detail);
|
||||||
look_direction = location.sub(parent->getCameraLocation(location)).normalize();
|
look_direction = location.sub(parent->getCameraLocation(location)).normalize();
|
||||||
|
|
||||||
/* Reflection */
|
/* Reflection */
|
||||||
|
@ -222,7 +230,7 @@ WaterRenderer::WaterResult WaterRenderer::getResult(double x, double z)
|
||||||
color.b += result.reflected.b * definition->reflection + result.refracted.b * definition->transparency;
|
color.b += result.reflected.b * definition->reflection + result.refracted.b * definition->transparency;
|
||||||
|
|
||||||
/* Merge with foam */
|
/* Merge with foam */
|
||||||
foam = _getFoamMask(parent, definition, location, normal, detail);
|
foam = _getFoamMask(parent, definition, noise, location, normal, detail);
|
||||||
color.mask(foam);
|
color.mask(foam);
|
||||||
|
|
||||||
/* Bring color to the camera */
|
/* Bring color to the camera */
|
||||||
|
|
|
@ -38,6 +38,7 @@ public:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SoftwareRenderer* parent;
|
SoftwareRenderer* parent;
|
||||||
|
FractalNoise* noise;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue