Fixed terrain preview
This commit is contained in:
parent
00e04df25a
commit
97a950947a
7 changed files with 121 additions and 67 deletions
|
@ -15,7 +15,8 @@ class AtmosphereDefinition : public BaseDefinition
|
||||||
public:
|
public:
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
ATMOSPHERE_MODEL_BRUNETON = 0
|
ATMOSPHERE_MODEL_DISABLED = 0,
|
||||||
|
ATMOSPHERE_MODEL_BRUNETON = 1
|
||||||
} AtmosphereModel;
|
} AtmosphereModel;
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
|
|
|
@ -11,46 +11,29 @@
|
||||||
#include "LightStatus.h"
|
#include "LightStatus.h"
|
||||||
#include "TerrainRenderer.h"
|
#include "TerrainRenderer.h"
|
||||||
|
|
||||||
/*static void _getLightingStatus(Renderer*, LightStatus* status, Vector3, int)
|
|
||||||
{
|
|
||||||
LightComponent light;
|
|
||||||
|
|
||||||
light.color.r = 0.6;
|
|
||||||
light.color.g = 0.6;
|
|
||||||
light.color.b = 0.6;
|
|
||||||
light.direction.x = -1.0;
|
|
||||||
light.direction.y = -0.5;
|
|
||||||
light.direction.z = 1.0;
|
|
||||||
light.direction = v3Normalize(light.direction);
|
|
||||||
light.altered = 1;
|
|
||||||
light.reflection = 0.0;
|
|
||||||
status->pushComponent(light);
|
|
||||||
|
|
||||||
light.color.r = 0.2;
|
|
||||||
light.color.g = 0.2;
|
|
||||||
light.color.b = 0.2;
|
|
||||||
light.direction.x = 1.0;
|
|
||||||
light.direction.y = -0.5;
|
|
||||||
light.direction.z = -1.0;
|
|
||||||
light.direction = v3Normalize(light.direction);
|
|
||||||
light.altered = 0;
|
|
||||||
light.reflection = 0.0;
|
|
||||||
status->pushComponent(light);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Vector3 _getCameraLocation(Renderer*, Vector3 location)
|
|
||||||
{
|
|
||||||
location.x -= 10.0;
|
|
||||||
location.y += 15.0;
|
|
||||||
location.z += 10.0;
|
|
||||||
return location;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
TerrainShapePreviewRenderer::TerrainShapePreviewRenderer(TerrainDefinition* terrain)
|
TerrainShapePreviewRenderer::TerrainShapePreviewRenderer(TerrainDefinition* terrain)
|
||||||
{
|
{
|
||||||
_terrain = terrain;
|
_terrain = terrain;
|
||||||
|
|
||||||
render_quality = 3;
|
render_quality = 3;
|
||||||
|
|
||||||
|
disableClouds();
|
||||||
|
|
||||||
|
getScenery()->getTextures()->clear();
|
||||||
|
getScenery()->getTextures()->addLayer();
|
||||||
|
TextureLayerDefinition* layer = getScenery()->getTextures()->getTextureLayer(0);
|
||||||
|
layer->terrain_zone->clear();
|
||||||
|
layer->displacement_height = 0.0;
|
||||||
|
layer->material->base = colorToHSL(COLOR_WHITE);
|
||||||
|
layer->material->reflection = 0.05;
|
||||||
|
layer->material->shininess = 2.0;
|
||||||
|
layer->validate();
|
||||||
|
layer->_detail_noise->clearLevels();
|
||||||
|
}
|
||||||
|
|
||||||
|
Vector3 TerrainShapePreviewRenderer::getCameraLocation(const Vector3 &target)
|
||||||
|
{
|
||||||
|
return target.add(Vector3(-10.0, 15.0, 10.0));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TerrainShapePreviewRenderer::bindEvent(BasePreview* preview)
|
void TerrainShapePreviewRenderer::bindEvent(BasePreview* preview)
|
||||||
|
@ -67,17 +50,32 @@ void TerrainShapePreviewRenderer::updateEvent()
|
||||||
|
|
||||||
prepare();
|
prepare();
|
||||||
|
|
||||||
/*getCameraLocation = _getCameraLocation;
|
LightComponent light;
|
||||||
atmosphere->getLightingStatus = _getLightingStatus;*/
|
std::vector<LightComponent> lights;
|
||||||
|
|
||||||
TextureLayerDefinition* layer = getScenery()->getTextures()->getTextureLayer(0);
|
light.color.r = 0.6;
|
||||||
layer->terrain_zone->clear();
|
light.color.g = 0.6;
|
||||||
layer->displacement_height = 0.0;
|
light.color.b = 0.6;
|
||||||
layer->material->base = colorToHSL(COLOR_WHITE);
|
light.direction.x = -1.0;
|
||||||
layer->material->reflection = 0.05;
|
light.direction.y = -0.5;
|
||||||
layer->material->shininess = 2.0;
|
light.direction.z = 1.0;
|
||||||
layer->validate();
|
light.direction = light.direction.normalize();
|
||||||
layer->_detail_noise->clearLevels();
|
light.altered = 1;
|
||||||
|
light.reflection = 0.0;
|
||||||
|
lights.push_back(light);
|
||||||
|
|
||||||
|
light.color.r = 0.2;
|
||||||
|
light.color.g = 0.2;
|
||||||
|
light.color.b = 0.2;
|
||||||
|
light.direction.x = 1.0;
|
||||||
|
light.direction.y = -0.5;
|
||||||
|
light.direction.z = -1.0;
|
||||||
|
light.direction = light.direction.normalize();
|
||||||
|
light.altered = 0;
|
||||||
|
light.reflection = 0.0;
|
||||||
|
lights.push_back(light);
|
||||||
|
|
||||||
|
disableAtmosphere(lights);
|
||||||
}
|
}
|
||||||
|
|
||||||
Color TerrainShapePreviewRenderer::getColor2D(double x, double y, double scaling)
|
Color TerrainShapePreviewRenderer::getColor2D(double x, double y, double scaling)
|
||||||
|
|
|
@ -14,6 +14,8 @@ public:
|
||||||
explicit TerrainShapePreviewRenderer(TerrainDefinition* terrain);
|
explicit TerrainShapePreviewRenderer(TerrainDefinition* terrain);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
virtual Vector3 getCameraLocation(const Vector3 &target) override;
|
||||||
|
|
||||||
virtual void bindEvent(BasePreview* preview) override;
|
virtual void bindEvent(BasePreview* preview) override;
|
||||||
virtual void updateEvent() override;
|
virtual void updateEvent() override;
|
||||||
virtual Color getColor2D(double x, double y, double scaling) override;
|
virtual Color getColor2D(double x, double y, double scaling) override;
|
||||||
|
|
|
@ -24,6 +24,12 @@ static inline double _getDayFactor(double daytime)
|
||||||
|
|
||||||
static inline void _applyWeatherEffects(AtmosphereDefinition* definition, AtmosphereResult* result)
|
static inline void _applyWeatherEffects(AtmosphereDefinition* definition, AtmosphereResult* result)
|
||||||
{
|
{
|
||||||
|
if (definition->model == AtmosphereDefinition::ATMOSPHERE_MODEL_DISABLED)
|
||||||
|
{
|
||||||
|
result->updateFinal();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
double distance = result->distance;
|
double distance = result->distance;
|
||||||
double max_distance = 100.0 - 90.0 * definition->humidity;
|
double max_distance = 100.0 - 90.0 * definition->humidity;
|
||||||
double distancefactor, dayfactor;
|
double distancefactor, dayfactor;
|
||||||
|
@ -76,26 +82,10 @@ BaseAtmosphereRenderer::BaseAtmosphereRenderer(SoftwareRenderer* renderer):
|
||||||
|
|
||||||
void BaseAtmosphereRenderer::getLightingStatus(LightStatus* status, Vector3, int)
|
void BaseAtmosphereRenderer::getLightingStatus(LightStatus* status, Vector3, int)
|
||||||
{
|
{
|
||||||
LightComponent light;
|
for (LightComponent light:lights)
|
||||||
|
{
|
||||||
light.color.r = 1.0;
|
|
||||||
light.color.g = 1.0;
|
|
||||||
light.color.b = 1.0;
|
|
||||||
light.direction.x = -0.7;
|
|
||||||
light.direction.y = -0.7;
|
|
||||||
light.direction.z = 0.7;
|
|
||||||
light.altered = 0;
|
|
||||||
light.reflection = 0.0;
|
|
||||||
status->pushComponent(light);
|
|
||||||
light.color.r = 0.3;
|
|
||||||
light.color.g = 0.31;
|
|
||||||
light.color.b = 0.34;
|
|
||||||
light.direction.x = 0.7;
|
|
||||||
light.direction.y = -0.7;
|
|
||||||
light.direction.z = -0.7;
|
|
||||||
light.altered = 0;
|
|
||||||
light.reflection = 0.0;
|
|
||||||
status->pushComponent(light);
|
status->pushComponent(light);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
AtmosphereResult BaseAtmosphereRenderer::applyAerialPerspective(Vector3, Color base)
|
AtmosphereResult BaseAtmosphereRenderer::applyAerialPerspective(Vector3, Color base)
|
||||||
|
@ -121,6 +111,40 @@ Vector3 BaseAtmosphereRenderer::getSunDirection()
|
||||||
return Vector3(cos(sun_angle), sin(sun_angle), 0.0);
|
return Vector3(cos(sun_angle), sin(sun_angle), 0.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BaseAtmosphereRenderer::setBasicLights()
|
||||||
|
{
|
||||||
|
LightComponent light;
|
||||||
|
|
||||||
|
lights.clear();
|
||||||
|
|
||||||
|
light.color.r = 0.6;
|
||||||
|
light.color.g = 0.6;
|
||||||
|
light.color.b = 0.6;
|
||||||
|
light.direction.x = -1.0;
|
||||||
|
light.direction.y = -0.5;
|
||||||
|
light.direction.z = 1.0;
|
||||||
|
light.direction = light.direction.normalize();
|
||||||
|
light.altered = 1;
|
||||||
|
light.reflection = 0.0;
|
||||||
|
lights.push_back(light);
|
||||||
|
|
||||||
|
light.color.r = 0.2;
|
||||||
|
light.color.g = 0.2;
|
||||||
|
light.color.b = 0.2;
|
||||||
|
light.direction.x = 1.0;
|
||||||
|
light.direction.y = -0.5;
|
||||||
|
light.direction.z = -1.0;
|
||||||
|
light.direction = light.direction.normalize();
|
||||||
|
light.altered = 0;
|
||||||
|
light.reflection = 0.0;
|
||||||
|
lights.push_back(light);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BaseAtmosphereRenderer::setStaticLights(const std::vector<LightComponent> &lights)
|
||||||
|
{
|
||||||
|
this->lights = lights;
|
||||||
|
}
|
||||||
|
|
||||||
AtmosphereDefinition* BaseAtmosphereRenderer::getDefinition()
|
AtmosphereDefinition* BaseAtmosphereRenderer::getDefinition()
|
||||||
{
|
{
|
||||||
return parent->getScenery()->getAtmosphere();
|
return parent->getScenery()->getAtmosphere();
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include "software_global.h"
|
#include "software_global.h"
|
||||||
|
|
||||||
#include "Color.h"
|
#include "Color.h"
|
||||||
|
#include "LightComponent.h"
|
||||||
|
|
||||||
namespace paysages {
|
namespace paysages {
|
||||||
namespace software {
|
namespace software {
|
||||||
|
@ -19,9 +20,13 @@ public:
|
||||||
virtual AtmosphereResult getSkyColor(Vector3 direction);
|
virtual AtmosphereResult getSkyColor(Vector3 direction);
|
||||||
virtual Vector3 getSunDirection();
|
virtual Vector3 getSunDirection();
|
||||||
|
|
||||||
|
void setBasicLights();
|
||||||
|
void setStaticLights(const std::vector<LightComponent> &lights);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual AtmosphereDefinition* getDefinition();
|
virtual AtmosphereDefinition* getDefinition();
|
||||||
SoftwareRenderer* parent;
|
SoftwareRenderer* parent;
|
||||||
|
std::vector<LightComponent> lights;
|
||||||
};
|
};
|
||||||
|
|
||||||
class SoftwareBrunetonAtmosphereRenderer: public BaseAtmosphereRenderer
|
class SoftwareBrunetonAtmosphereRenderer: public BaseAtmosphereRenderer
|
||||||
|
|
|
@ -88,7 +88,14 @@ void SoftwareRenderer::prepare()
|
||||||
{
|
{
|
||||||
// Prepare sub renderers
|
// Prepare sub renderers
|
||||||
delete atmosphere_renderer;
|
delete atmosphere_renderer;
|
||||||
|
if (getScenery()->getAtmosphere()->model == AtmosphereDefinition::ATMOSPHERE_MODEL_BRUNETON)
|
||||||
|
{
|
||||||
atmosphere_renderer = new SoftwareBrunetonAtmosphereRenderer(this);
|
atmosphere_renderer = new SoftwareBrunetonAtmosphereRenderer(this);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
atmosphere_renderer = new BaseAtmosphereRenderer(this);
|
||||||
|
}
|
||||||
|
|
||||||
delete clouds_renderer;
|
delete clouds_renderer;
|
||||||
clouds_renderer = new CloudsRenderer(this);
|
clouds_renderer = new CloudsRenderer(this);
|
||||||
|
@ -125,6 +132,15 @@ void SoftwareRenderer::disableClouds()
|
||||||
scenery->getClouds()->clear();
|
scenery->getClouds()->clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SoftwareRenderer::disableAtmosphere(const std::vector<LightComponent> &lights)
|
||||||
|
{
|
||||||
|
scenery->getAtmosphere()->model = AtmosphereDefinition::ATMOSPHERE_MODEL_DISABLED;
|
||||||
|
|
||||||
|
delete atmosphere_renderer;
|
||||||
|
atmosphere_renderer = new BaseAtmosphereRenderer(this);
|
||||||
|
atmosphere_renderer->setStaticLights(lights);
|
||||||
|
}
|
||||||
|
|
||||||
void SoftwareRenderer::setPreviewCallbacks(RenderArea::RenderCallbackStart start, RenderArea::RenderCallbackDraw draw, RenderArea::RenderCallbackUpdate update)
|
void SoftwareRenderer::setPreviewCallbacks(RenderArea::RenderCallbackStart start, RenderArea::RenderCallbackDraw draw, RenderArea::RenderCallbackUpdate update)
|
||||||
{
|
{
|
||||||
render_area->setPreviewCallbacks(start, draw, update);
|
render_area->setPreviewCallbacks(start, draw, update);
|
||||||
|
|
|
@ -66,8 +66,16 @@ public:
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \brief Disable the clouds feature.
|
* \brief Disable the clouds feature.
|
||||||
|
*
|
||||||
|
* This toggle is permanent, provided the clouds part of the sceney is not changed.
|
||||||
*/
|
*/
|
||||||
void disableClouds();
|
void disableClouds();
|
||||||
|
/*!
|
||||||
|
* \brief Disable atmosphere and sky lighting, replacing it by static lights.
|
||||||
|
*
|
||||||
|
* This function needs to be called after each prepare().
|
||||||
|
*/
|
||||||
|
void disableAtmosphere(const std::vector<LightComponent> &lights);
|
||||||
|
|
||||||
void setPreviewCallbacks(RenderArea::RenderCallbackStart start, RenderArea::RenderCallbackDraw draw, RenderArea::RenderCallbackUpdate update);
|
void setPreviewCallbacks(RenderArea::RenderCallbackStart start, RenderArea::RenderCallbackDraw draw, RenderArea::RenderCallbackUpdate update);
|
||||||
void start(RenderArea::RenderParams params);
|
void start(RenderArea::RenderParams params);
|
||||||
|
|
Loading…
Reference in a new issue