Merge branch 'cloud_types'
Conflicts: src/render/software/software.pro
This commit is contained in:
commit
0abfa97295
8 changed files with 304 additions and 9 deletions
|
@ -9,6 +9,9 @@
|
||||||
#include "CameraDefinition.h"
|
#include "CameraDefinition.h"
|
||||||
|
|
||||||
#include "clouds/BaseCloudsModel.h"
|
#include "clouds/BaseCloudsModel.h"
|
||||||
|
#include "clouds/CloudModelAltoCumulus.h"
|
||||||
|
#include "clouds/CloudModelCirrus.h"
|
||||||
|
#include "clouds/CloudModelCumuloNimbus.h"
|
||||||
#include "clouds/CloudModelStratoCumulus.h"
|
#include "clouds/CloudModelStratoCumulus.h"
|
||||||
|
|
||||||
CloudsRenderer::CloudsRenderer(SoftwareRenderer* parent):
|
CloudsRenderer::CloudsRenderer(SoftwareRenderer* parent):
|
||||||
|
@ -60,20 +63,24 @@ void CloudsRenderer::update()
|
||||||
BaseCloudsModel* model;
|
BaseCloudsModel* model;
|
||||||
switch (layer->type)
|
switch (layer->type)
|
||||||
{
|
{
|
||||||
case CloudLayerDefinition::STRATUS:
|
|
||||||
case CloudLayerDefinition::NIMBOSTRATUS:
|
|
||||||
case CloudLayerDefinition::CUMULUS:
|
|
||||||
model = new BaseCloudsModel(layer);
|
|
||||||
break;
|
|
||||||
case CloudLayerDefinition::STRATOCUMULUS:
|
case CloudLayerDefinition::STRATOCUMULUS:
|
||||||
model = new CloudModelStratoCumulus(layer);
|
model = new CloudModelStratoCumulus(layer);
|
||||||
break;
|
break;
|
||||||
case CloudLayerDefinition::ALTOCUMULUS:
|
case CloudLayerDefinition::ALTOCUMULUS:
|
||||||
case CloudLayerDefinition::ALTOSTRATUS:
|
model = new CloudModelAltoCumulus(layer);
|
||||||
|
break;
|
||||||
|
case CloudLayerDefinition::CIRRUS:
|
||||||
|
model = new CloudModelCirrus(layer);
|
||||||
|
break;
|
||||||
case CloudLayerDefinition::CUMULONIMBUS:
|
case CloudLayerDefinition::CUMULONIMBUS:
|
||||||
|
model = new CloudModelCumuloNimbus(layer);
|
||||||
|
break;
|
||||||
|
case CloudLayerDefinition::STRATUS:
|
||||||
|
case CloudLayerDefinition::NIMBOSTRATUS:
|
||||||
|
case CloudLayerDefinition::CUMULUS:
|
||||||
|
case CloudLayerDefinition::ALTOSTRATUS:
|
||||||
case CloudLayerDefinition::CIRROCUMULUS:
|
case CloudLayerDefinition::CIRROCUMULUS:
|
||||||
case CloudLayerDefinition::CIRROSTRATUS:
|
case CloudLayerDefinition::CIRROSTRATUS:
|
||||||
case CloudLayerDefinition::CIRRUS:
|
|
||||||
model = new BaseCloudsModel(layer);
|
model = new BaseCloudsModel(layer);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
64
src/render/software/clouds/CloudModelAltoCumulus.cpp
Normal file
64
src/render/software/clouds/CloudModelAltoCumulus.cpp
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
#include "CloudModelAltoCumulus.h"
|
||||||
|
|
||||||
|
#include "NoiseGenerator.h"
|
||||||
|
#include "Vector3.h"
|
||||||
|
#include "CloudLayerDefinition.h"
|
||||||
|
|
||||||
|
CloudModelAltoCumulus::CloudModelAltoCumulus(CloudLayerDefinition* layer):
|
||||||
|
BaseCloudsModel(layer)
|
||||||
|
{
|
||||||
|
noise = new NoiseGenerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
CloudModelAltoCumulus::~CloudModelAltoCumulus()
|
||||||
|
{
|
||||||
|
delete noise;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CloudModelAltoCumulus::update()
|
||||||
|
{
|
||||||
|
noise->clearLevels();
|
||||||
|
noise->addLevelSimple(4.0, -1.0, 1.0);
|
||||||
|
noise->addLevelSimple(1.0 / 2.0, -0.6, 0.6);
|
||||||
|
noise->addLevelSimple(1.0 / 4.0, -0.3, 0.3);
|
||||||
|
noise->addLevelSimple(1.0 / 10.0, -0.15, 0.15);
|
||||||
|
noise->addLevelSimple(1.0 / 20.0, -0.09, 0.09);
|
||||||
|
noise->addLevelSimple(1.0 / 40.0, -0.06, 0.06);
|
||||||
|
noise->addLevelSimple(1.0 / 60.0, -0.03, 0.03);
|
||||||
|
noise->addLevelSimple(1.0 / 80.0, -0.015, 0.015);
|
||||||
|
noise->addLevelSimple(1.0 / 100.0, -0.06, 0.06);
|
||||||
|
noise->normalizeAmplitude(-4.0, 3.0, 0);
|
||||||
|
noise->setState(layer->getNoiseState());
|
||||||
|
}
|
||||||
|
|
||||||
|
void CloudModelAltoCumulus::getAltitudeRange(double *min_altitude, double *max_altitude) const
|
||||||
|
{
|
||||||
|
*min_altitude = 15.0 + 10.0 * layer->altitude;
|
||||||
|
*max_altitude = *min_altitude + 18.0 * layer->scaling;
|
||||||
|
}
|
||||||
|
|
||||||
|
double CloudModelAltoCumulus::getDensity(const Vector3 &location) const
|
||||||
|
{
|
||||||
|
double val;
|
||||||
|
double min_altitude, max_altitude;
|
||||||
|
double noise_scaling = 18.0 * layer->scaling;
|
||||||
|
|
||||||
|
getAltitudeRange(&min_altitude, &max_altitude);
|
||||||
|
|
||||||
|
if (location.y < min_altitude || location.y > max_altitude)
|
||||||
|
{
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double x = 0.6 * location.x / noise_scaling;
|
||||||
|
double y = (location.y - min_altitude) / noise_scaling;
|
||||||
|
double z = 0.6 * location.z / noise_scaling;
|
||||||
|
|
||||||
|
//double coverage = layer->coverage * layer->_coverage_by_altitude->getValue((position.y - layer->altitude) / layer->scaling);
|
||||||
|
double coverage = layer->coverage;
|
||||||
|
|
||||||
|
val = 0.5 * noise->get3DTotal(x, y, z);
|
||||||
|
return val - 1.1 + coverage;
|
||||||
|
}
|
||||||
|
}
|
29
src/render/software/clouds/CloudModelAltoCumulus.h
Normal file
29
src/render/software/clouds/CloudModelAltoCumulus.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#ifndef CLOUDMODELALTOCUMULUS_H
|
||||||
|
#define CLOUDMODELALTOCUMULUS_H
|
||||||
|
|
||||||
|
#include "../software_global.h"
|
||||||
|
|
||||||
|
#include "BaseCloudsModel.h"
|
||||||
|
|
||||||
|
namespace paysages {
|
||||||
|
namespace software {
|
||||||
|
|
||||||
|
class CloudModelAltoCumulus : public BaseCloudsModel
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CloudModelAltoCumulus(CloudLayerDefinition* layer);
|
||||||
|
virtual ~CloudModelAltoCumulus();
|
||||||
|
|
||||||
|
virtual void update() override;
|
||||||
|
|
||||||
|
virtual void getAltitudeRange(double *min_altitude, double *max_altitude) const override;
|
||||||
|
virtual double getDensity(const Vector3 &location) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
NoiseGenerator* noise;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // CLOUDMODELALTOCUMULUS_H
|
62
src/render/software/clouds/CloudModelCirrus.cpp
Normal file
62
src/render/software/clouds/CloudModelCirrus.cpp
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
#include "CloudModelCirrus.h"
|
||||||
|
|
||||||
|
#include "NoiseGenerator.h"
|
||||||
|
#include "Vector3.h"
|
||||||
|
#include "CloudLayerDefinition.h"
|
||||||
|
|
||||||
|
CloudModelCirrus::CloudModelCirrus(CloudLayerDefinition* layer):
|
||||||
|
BaseCloudsModel(layer)
|
||||||
|
{
|
||||||
|
noise = new NoiseGenerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
CloudModelCirrus::~CloudModelCirrus()
|
||||||
|
{
|
||||||
|
delete noise;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CloudModelCirrus::update()
|
||||||
|
{
|
||||||
|
noise->clearLevels();
|
||||||
|
noise->addLevelSimple(1.0, -1.0, 1.0);
|
||||||
|
noise->addLevelSimple(1.0 / 6.0, -0.6, 0.6);
|
||||||
|
noise->addLevelSimple(1.0 / 10.0, -0.15, 0.15);
|
||||||
|
noise->addLevelSimple(1.0 / 20.0, -0.09, 0.09);
|
||||||
|
noise->addLevelSimple(1.0 / 40.0, -0.06, 0.06);
|
||||||
|
noise->addLevelSimple(1.0 / 120.0, -0.03, 0.03);
|
||||||
|
noise->addLevelSimple(1.0 / 300.0, -0.01, 0.01);
|
||||||
|
noise->normalizeAmplitude(-4.0, 3.0, 0);
|
||||||
|
noise->setState(layer->getNoiseState());
|
||||||
|
}
|
||||||
|
|
||||||
|
void CloudModelCirrus::getAltitudeRange(double *min_altitude, double *max_altitude) const
|
||||||
|
{
|
||||||
|
*min_altitude = 45.0 + 20.0 * layer->altitude;
|
||||||
|
*max_altitude = *min_altitude + 20.0 * layer->scaling;
|
||||||
|
}
|
||||||
|
|
||||||
|
double CloudModelCirrus::getDensity(const Vector3 &location) const
|
||||||
|
{
|
||||||
|
double val;
|
||||||
|
double min_altitude, max_altitude;
|
||||||
|
double noise_scaling = 30.0 * layer->scaling;
|
||||||
|
|
||||||
|
getAltitudeRange(&min_altitude, &max_altitude);
|
||||||
|
|
||||||
|
if (location.y < min_altitude || location.y > max_altitude)
|
||||||
|
{
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double x = 0.03 * location.x / noise_scaling;
|
||||||
|
double y = (location.y - min_altitude) / noise_scaling;
|
||||||
|
double z = 0.03 * location.z / noise_scaling;
|
||||||
|
|
||||||
|
//double coverage = layer->coverage * layer->_coverage_by_altitude->getValue((position.y - layer->altitude) / layer->scaling);
|
||||||
|
double coverage = layer->coverage;
|
||||||
|
|
||||||
|
val = 0.6 * noise->get3DTotal(x, y, z);
|
||||||
|
return val - 1.1 + coverage;
|
||||||
|
}
|
||||||
|
}
|
29
src/render/software/clouds/CloudModelCirrus.h
Normal file
29
src/render/software/clouds/CloudModelCirrus.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#ifndef CLOUDMODELCIRRUS_H
|
||||||
|
#define CLOUDMODELCIRRUS_H
|
||||||
|
|
||||||
|
#include "../software_global.h"
|
||||||
|
|
||||||
|
#include "BaseCloudsModel.h"
|
||||||
|
|
||||||
|
namespace paysages {
|
||||||
|
namespace software {
|
||||||
|
|
||||||
|
class CloudModelCirrus : public BaseCloudsModel
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CloudModelCirrus(CloudLayerDefinition* layer);
|
||||||
|
virtual ~CloudModelCirrus();
|
||||||
|
|
||||||
|
virtual void update() override;
|
||||||
|
|
||||||
|
virtual void getAltitudeRange(double *min_altitude, double *max_altitude) const override;
|
||||||
|
virtual double getDensity(const Vector3 &location) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
NoiseGenerator* noise;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // CLOUDMODELCIRRUS_H
|
69
src/render/software/clouds/CloudModelCumuloNimbus.cpp
Normal file
69
src/render/software/clouds/CloudModelCumuloNimbus.cpp
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
#include "CloudModelCumuloNimbus.h"
|
||||||
|
|
||||||
|
#include "NoiseGenerator.h"
|
||||||
|
#include "Vector3.h"
|
||||||
|
#include "CloudLayerDefinition.h"
|
||||||
|
|
||||||
|
CloudModelCumuloNimbus::CloudModelCumuloNimbus(CloudLayerDefinition* layer):
|
||||||
|
BaseCloudsModel(layer)
|
||||||
|
{
|
||||||
|
noise = new NoiseGenerator();
|
||||||
|
}
|
||||||
|
|
||||||
|
CloudModelCumuloNimbus::~CloudModelCumuloNimbus()
|
||||||
|
{
|
||||||
|
delete noise;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CloudModelCumuloNimbus::update()
|
||||||
|
{
|
||||||
|
noise->clearLevels();
|
||||||
|
noise->addLevelSimple(8.0, -1.0, 1.0);
|
||||||
|
noise->addLevelSimple(7.0 / 2.0, -0.6, 0.6);
|
||||||
|
noise->addLevelSimple(6.0 / 4.0, -0.3, 0.3);
|
||||||
|
noise->addLevelSimple(5.0 / 10.0, -0.15, 0.15);
|
||||||
|
/*noise->addLevelSimple(1.0 / 20.0, -0.09, 0.09);
|
||||||
|
noise->addLevelSimple(1.0 / 40.0, -0.06, 0.06);
|
||||||
|
noise->addLevelSimple(1.0 / 60.0, -0.03, 0.03);*/
|
||||||
|
noise->addLevelSimple(1.0 / 80.0, -0.015, 0.015);
|
||||||
|
noise->addLevelSimple(1.0 / 100.0, -0.06, 0.06);
|
||||||
|
noise->addLevelSimple(1.0 / 150.0, -0.015, 0.015);
|
||||||
|
noise->addLevelSimple(1.0 / 200.0, -0.009, 0.009);
|
||||||
|
noise->addLevelSimple(1.0 / 400.0, -0.024, 0.024);
|
||||||
|
noise->addLevelSimple(1.0 / 800.0, -0.003, 0.003);
|
||||||
|
noise->addLevelSimple(1.0 / 1000.0, -0.0015, 0.0015);
|
||||||
|
noise->normalizeAmplitude(-3.0, 4.0, 0);
|
||||||
|
noise->setState(layer->getNoiseState());
|
||||||
|
}
|
||||||
|
|
||||||
|
void CloudModelCumuloNimbus::getAltitudeRange(double *min_altitude, double *max_altitude) const
|
||||||
|
{
|
||||||
|
*min_altitude = 5.0 + 10.0 * layer->altitude;
|
||||||
|
*max_altitude = *min_altitude + 50.0 + 50.0 * layer->scaling;
|
||||||
|
}
|
||||||
|
|
||||||
|
double CloudModelCumuloNimbus::getDensity(const Vector3 &location) const
|
||||||
|
{
|
||||||
|
double val;
|
||||||
|
double min_altitude, max_altitude;
|
||||||
|
double noise_scaling = 60.0 * layer->scaling;
|
||||||
|
|
||||||
|
getAltitudeRange(&min_altitude, &max_altitude);
|
||||||
|
|
||||||
|
if (location.y < min_altitude || location.y > max_altitude)
|
||||||
|
{
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
double x = 1.5 * location.x / noise_scaling;
|
||||||
|
double y = (location.y - min_altitude) / noise_scaling;
|
||||||
|
double z = 1.5 * location.z / noise_scaling;
|
||||||
|
|
||||||
|
//double coverage = layer->coverage * layer->_coverage_by_altitude->getValue((position.y - layer->altitude) / layer->scaling);
|
||||||
|
double coverage = layer->coverage;
|
||||||
|
|
||||||
|
val = 0.5 * noise->get3DTotal(x, y, z);
|
||||||
|
return val - 1.0 + coverage;
|
||||||
|
}
|
||||||
|
}
|
29
src/render/software/clouds/CloudModelCumuloNimbus.h
Normal file
29
src/render/software/clouds/CloudModelCumuloNimbus.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#ifndef CLOUDMODELCUMULONIMBUS_H
|
||||||
|
#define CLOUDMODELCUMULONIMBUS_H
|
||||||
|
|
||||||
|
#include "../software_global.h"
|
||||||
|
|
||||||
|
#include "BaseCloudsModel.h"
|
||||||
|
|
||||||
|
namespace paysages {
|
||||||
|
namespace software {
|
||||||
|
|
||||||
|
class CloudModelCumuloNimbus : public BaseCloudsModel
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CloudModelCumuloNimbus(CloudLayerDefinition* layer);
|
||||||
|
virtual ~CloudModelCumuloNimbus();
|
||||||
|
|
||||||
|
virtual void update() override;
|
||||||
|
|
||||||
|
virtual void getAltitudeRange(double *min_altitude, double *max_altitude) const override;
|
||||||
|
virtual double getDensity(const Vector3 &location) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
NoiseGenerator* noise;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // CLOUDMODELCUMULONIMBUS_H
|
|
@ -47,7 +47,10 @@ SOURCES += SoftwareRenderer.cpp \
|
||||||
CanvasPreview.cpp \
|
CanvasPreview.cpp \
|
||||||
RenderConfig.cpp \
|
RenderConfig.cpp \
|
||||||
CanvasPixelShader.cpp \
|
CanvasPixelShader.cpp \
|
||||||
CanvasPictureWriter.cpp
|
CanvasPictureWriter.cpp \
|
||||||
|
clouds/CloudModelAltoCumulus.cpp \
|
||||||
|
clouds/CloudModelCirrus.cpp \
|
||||||
|
clouds/CloudModelCumuloNimbus.cpp
|
||||||
|
|
||||||
HEADERS += SoftwareRenderer.h\
|
HEADERS += SoftwareRenderer.h\
|
||||||
software_global.h \
|
software_global.h \
|
||||||
|
@ -84,7 +87,10 @@ HEADERS += SoftwareRenderer.h\
|
||||||
CanvasPreview.h \
|
CanvasPreview.h \
|
||||||
RenderConfig.h \
|
RenderConfig.h \
|
||||||
CanvasPixelShader.h \
|
CanvasPixelShader.h \
|
||||||
CanvasPictureWriter.h
|
CanvasPictureWriter.h \
|
||||||
|
clouds/CloudModelAltoCumulus.h \
|
||||||
|
clouds/CloudModelCirrus.h \
|
||||||
|
clouds/CloudModelCumuloNimbus.h
|
||||||
|
|
||||||
unix:!symbian {
|
unix:!symbian {
|
||||||
maemo5 {
|
maemo5 {
|
||||||
|
|
Loading…
Reference in a new issue