2013-12-01 18:24:53 +00:00
|
|
|
#include "CloudsRenderer.h"
|
|
|
|
|
|
|
|
#include "SoftwareRenderer.h"
|
|
|
|
#include "Scenery.h"
|
|
|
|
#include "CloudsDefinition.h"
|
2013-12-04 21:52:18 +00:00
|
|
|
#include "CloudLayerDefinition.h"
|
2013-12-01 18:24:53 +00:00
|
|
|
#include "BaseCloudLayerRenderer.h"
|
|
|
|
#include "CloudBasicLayerRenderer.h"
|
2013-12-17 22:45:09 +00:00
|
|
|
#include "CameraDefinition.h"
|
2015-11-18 18:37:00 +00:00
|
|
|
#include "Logs.h"
|
2013-12-01 18:24:53 +00:00
|
|
|
|
2013-12-04 21:52:18 +00:00
|
|
|
#include "clouds/BaseCloudsModel.h"
|
2014-03-18 20:08:17 +00:00
|
|
|
#include "clouds/CloudModelAltoCumulus.h"
|
2014-03-18 20:17:41 +00:00
|
|
|
#include "clouds/CloudModelCirrus.h"
|
2014-03-18 20:27:35 +00:00
|
|
|
#include "clouds/CloudModelCumuloNimbus.h"
|
2013-12-04 21:52:18 +00:00
|
|
|
#include "clouds/CloudModelStratoCumulus.h"
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
CloudsRenderer::CloudsRenderer(SoftwareRenderer *parent) : parent(parent) {
|
2015-09-13 16:58:11 +00:00
|
|
|
quality = 0.5;
|
2015-08-19 17:28:36 +00:00
|
|
|
enabled = true;
|
2013-12-01 18:24:53 +00:00
|
|
|
fake_renderer = new BaseCloudLayerRenderer(parent);
|
2013-12-04 21:52:18 +00:00
|
|
|
|
2015-11-20 00:07:31 +00:00
|
|
|
CloudLayerDefinition *fake_layer = new CloudLayerDefinition(NULL, "#fake#");
|
2013-12-04 21:52:18 +00:00
|
|
|
fake_model = new BaseCloudsModel(fake_layer);
|
2013-12-01 18:24:53 +00:00
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
CloudsRenderer::~CloudsRenderer() {
|
|
|
|
for (auto renderer : layer_renderers) {
|
2013-12-01 18:24:53 +00:00
|
|
|
delete renderer;
|
|
|
|
}
|
|
|
|
delete fake_renderer;
|
2013-12-04 21:52:18 +00:00
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
for (auto model : layer_models) {
|
2013-12-04 21:52:18 +00:00
|
|
|
delete model;
|
|
|
|
}
|
|
|
|
delete fake_model->getLayer();
|
|
|
|
delete fake_model;
|
2013-12-01 18:24:53 +00:00
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void CloudsRenderer::setQuality(double factor) {
|
2015-09-13 16:58:11 +00:00
|
|
|
this->quality = factor;
|
2015-11-09 21:30:46 +00:00
|
|
|
for (auto &renderer : layer_renderers) {
|
2015-09-13 16:58:11 +00:00
|
|
|
renderer->setQuality(factor);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void CloudsRenderer::setEnabled(bool enabled) {
|
2015-08-19 17:28:36 +00:00
|
|
|
this->enabled = enabled;
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void CloudsRenderer::update() {
|
|
|
|
for (auto renderer : layer_renderers) {
|
2013-12-01 18:24:53 +00:00
|
|
|
delete renderer;
|
|
|
|
}
|
|
|
|
layer_renderers.clear();
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
for (auto model : layer_models) {
|
2013-12-04 21:52:18 +00:00
|
|
|
delete model;
|
|
|
|
}
|
|
|
|
layer_models.clear();
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
CloudsDefinition *clouds = parent->getScenery()->getClouds();
|
2015-11-20 00:07:31 +00:00
|
|
|
int n = clouds->getLayerCount();
|
2015-11-09 21:30:46 +00:00
|
|
|
for (int i = 0; i < n; i++) {
|
2013-12-01 18:24:53 +00:00
|
|
|
layer_renderers.push_back(new CloudBasicLayerRenderer(parent));
|
2013-12-04 21:52:18 +00:00
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
CloudLayerDefinition *layer = clouds->getCloudLayer(i);
|
|
|
|
BaseCloudsModel *model;
|
|
|
|
switch (layer->type) {
|
2013-12-04 21:52:18 +00:00
|
|
|
case CloudLayerDefinition::STRATOCUMULUS:
|
|
|
|
model = new CloudModelStratoCumulus(layer);
|
|
|
|
break;
|
|
|
|
case CloudLayerDefinition::ALTOCUMULUS:
|
2014-03-18 20:08:17 +00:00
|
|
|
model = new CloudModelAltoCumulus(layer);
|
|
|
|
break;
|
2014-03-18 20:27:35 +00:00
|
|
|
case CloudLayerDefinition::CIRRUS:
|
|
|
|
model = new CloudModelCirrus(layer);
|
|
|
|
break;
|
2013-12-04 21:52:18 +00:00
|
|
|
case CloudLayerDefinition::CUMULONIMBUS:
|
2014-03-18 20:27:35 +00:00
|
|
|
model = new CloudModelCumuloNimbus(layer);
|
|
|
|
break;
|
|
|
|
case CloudLayerDefinition::STRATUS:
|
|
|
|
case CloudLayerDefinition::NIMBOSTRATUS:
|
|
|
|
case CloudLayerDefinition::CUMULUS:
|
|
|
|
case CloudLayerDefinition::ALTOSTRATUS:
|
2013-12-04 21:52:18 +00:00
|
|
|
case CloudLayerDefinition::CIRROCUMULUS:
|
|
|
|
case CloudLayerDefinition::CIRROSTRATUS:
|
2016-02-01 19:38:29 +00:00
|
|
|
case CloudLayerDefinition::_COUNT:
|
2013-12-04 21:52:18 +00:00
|
|
|
model = new BaseCloudsModel(layer);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
layer_models.push_back(model);
|
|
|
|
model->update();
|
2013-12-01 18:24:53 +00:00
|
|
|
}
|
2015-09-13 16:58:11 +00:00
|
|
|
|
|
|
|
setQuality(quality);
|
2013-12-01 18:24:53 +00:00
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
BaseCloudLayerRenderer *CloudsRenderer::getLayerRenderer(unsigned int layer) {
|
|
|
|
if (layer < layer_renderers.size()) {
|
2013-12-01 18:24:53 +00:00
|
|
|
return layer_renderers[layer];
|
2015-11-09 21:30:46 +00:00
|
|
|
} else {
|
2015-12-13 19:08:38 +00:00
|
|
|
Logs::warning("Software.Clouds") << "Asked for unknown layer renderer " << layer << endl;
|
2013-12-01 18:24:53 +00:00
|
|
|
return fake_renderer;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
BaseCloudsModel *CloudsRenderer::getLayerModel(unsigned int layer) {
|
|
|
|
if (layer < layer_models.size()) {
|
2013-12-04 21:52:18 +00:00
|
|
|
return layer_models[layer];
|
2015-11-09 21:30:46 +00:00
|
|
|
} else {
|
2015-12-13 19:08:38 +00:00
|
|
|
Logs::warning("Software.Clouds") << "Asked for unknown layer model" << layer << endl;
|
2013-12-04 21:52:18 +00:00
|
|
|
return fake_model;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
void CloudsRenderer::setLayerModel(unsigned int layer, BaseCloudsModel *model, bool delete_old) {
|
|
|
|
if (layer < layer_models.size()) {
|
|
|
|
if (delete_old) {
|
2013-12-20 16:30:27 +00:00
|
|
|
delete layer_models[layer];
|
|
|
|
}
|
|
|
|
layer_models[layer] = model;
|
2015-11-09 21:30:46 +00:00
|
|
|
} else {
|
2015-12-13 19:08:38 +00:00
|
|
|
Logs::warning("Software.Clouds") << "Asked to set an unknown layer model" << layer << endl;
|
2013-12-20 16:30:27 +00:00
|
|
|
delete model;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
Color CloudsRenderer::getColor(const Vector3 &eye, const Vector3 &location, const Color &base) {
|
|
|
|
CloudsDefinition *definition = parent->getScenery()->getClouds();
|
2013-12-01 18:24:53 +00:00
|
|
|
|
2015-11-20 00:07:31 +00:00
|
|
|
int n = definition->getLayerCount();
|
2015-11-09 21:30:46 +00:00
|
|
|
if (not enabled or n < 1) {
|
2013-12-01 18:24:53 +00:00
|
|
|
return base;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* TODO Iter layers in sorted order */
|
|
|
|
Color cumul = base;
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
|
BaseCloudLayerRenderer *layer_renderer = getLayerRenderer(i);
|
|
|
|
BaseCloudsModel *layer_model = getLayerModel(i);
|
2013-12-01 18:24:53 +00:00
|
|
|
|
2013-12-04 21:52:18 +00:00
|
|
|
Color layer_color = layer_renderer->getColor(layer_model, eye, location);
|
2013-12-01 18:24:53 +00:00
|
|
|
|
2013-12-11 09:24:35 +00:00
|
|
|
cumul.mask(layer_color);
|
2013-12-01 18:24:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return cumul;
|
|
|
|
}
|
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
bool CloudsRenderer::applyLightFilter(LightComponent &light, const Vector3 &at) {
|
|
|
|
CloudsDefinition *definition = parent->getScenery()->getClouds();
|
2013-12-04 22:28:34 +00:00
|
|
|
|
2015-11-20 00:07:31 +00:00
|
|
|
int n = definition->getLayerCount();
|
2015-11-09 21:30:46 +00:00
|
|
|
if (not enabled or n < 1) {
|
2013-12-17 22:45:09 +00:00
|
|
|
return true;
|
2013-12-04 22:28:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* TODO Iter layers in sorted order */
|
2015-11-09 21:30:46 +00:00
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
|
BaseCloudLayerRenderer *layer_renderer = getLayerRenderer(i);
|
|
|
|
BaseCloudsModel *layer_model = getLayerModel(i);
|
2013-12-04 22:28:34 +00:00
|
|
|
|
2013-12-17 22:45:09 +00:00
|
|
|
layer_renderer->alterLight(layer_model, &light, parent->render_camera->getLocation(), at);
|
2013-12-04 22:28:34 +00:00
|
|
|
}
|
|
|
|
|
2013-12-17 22:45:09 +00:00
|
|
|
return true;
|
2013-12-01 18:24:53 +00:00
|
|
|
}
|
2015-09-29 20:31:25 +00:00
|
|
|
|
2015-11-09 21:30:46 +00:00
|
|
|
double CloudsRenderer::getHighestAltitude() {
|
|
|
|
CloudsDefinition *definition = parent->getScenery()->getClouds();
|
2015-09-29 20:31:25 +00:00
|
|
|
double highest = 0.0;
|
|
|
|
|
2015-11-20 00:07:31 +00:00
|
|
|
int n = definition->getLayerCount();
|
2015-09-29 20:31:25 +00:00
|
|
|
double low, high;
|
2015-11-09 21:30:46 +00:00
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
|
BaseCloudsModel *layer_model = getLayerModel(i);
|
2015-09-29 20:31:25 +00:00
|
|
|
layer_model->getAltitudeRange(&low, &high);
|
2015-11-09 21:30:46 +00:00
|
|
|
if (high > highest) {
|
2015-09-29 20:31:25 +00:00
|
|
|
highest = high;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return highest;
|
|
|
|
}
|