45 lines
1.4 KiB
C++
45 lines
1.4 KiB
C++
#include "CloudModelStratoCumulus.h"
|
|
|
|
#include <cmath>
|
|
#include "NoiseFunctionSimplex.h"
|
|
#include "Vector3.h"
|
|
#include "CloudLayerDefinition.h"
|
|
|
|
CloudModelStratoCumulus::CloudModelStratoCumulus(CloudLayerDefinition *layer) : BaseCloudsModel(layer) {
|
|
noise = new NoiseFunctionSimplex();
|
|
base_detail = 0.1;
|
|
}
|
|
|
|
CloudModelStratoCumulus::~CloudModelStratoCumulus() {
|
|
delete noise;
|
|
}
|
|
|
|
void CloudModelStratoCumulus::update() {
|
|
noise->setState(layer->getNoiseState());
|
|
|
|
noise->setScaling(30.0 * layer->scaling);
|
|
noise->normalizeRange(1.0, base_detail);
|
|
}
|
|
|
|
void CloudModelStratoCumulus::getAltitudeRange(double *min_altitude, double *max_altitude) const {
|
|
*min_altitude = 20.0 + 10.0 * layer->altitude;
|
|
*max_altitude = *min_altitude + 11.0 * layer->scaling;
|
|
}
|
|
|
|
BaseCloudsModel::CloudDensityInfo CloudModelStratoCumulus::getDensity(const Vector3 &location, double quality) const {
|
|
double val;
|
|
double min_altitude, max_altitude;
|
|
|
|
getAltitudeRange(&min_altitude, &max_altitude);
|
|
|
|
if (location.y < min_altitude) {
|
|
return {0.0, min_altitude - location.y};
|
|
} else if (location.y > max_altitude) {
|
|
return {0.0, location.y - max_altitude};
|
|
} else {
|
|
val = noise->get3d(base_detail, 0.3 * location.x, location.y - min_altitude, 0.3 * location.z);
|
|
val = val - 0.8 + layer->coverage;
|
|
return {val, fabs(val)};
|
|
}
|
|
}
|