Moon's fractal noise is not saved in scenery
This will make the moon rendering repeatable
This commit is contained in:
parent
c74b6cbdda
commit
e6fc00a8ad
4 changed files with 17 additions and 9 deletions
|
@ -6,6 +6,7 @@
|
|||
#include "PackStream.h"
|
||||
#include "RandomGenerator.h"
|
||||
#include "FloatNode.h"
|
||||
#include "NoiseNode.h"
|
||||
#include "GodRaysDefinition.h"
|
||||
#include "CelestialBodyDefinition.h"
|
||||
|
||||
|
@ -108,6 +109,7 @@ void AtmosphereDefinition::applyPreset(AtmospherePreset preset, RandomGenerator
|
|||
moon->propRadius()->setValue(1737.4 * Scenery::KM_TO_UNIT);
|
||||
moon->propPhi()->setValue(0.5);
|
||||
moon->propTheta()->setValue(0.3);
|
||||
moon->propNoise()->setConfig(0.4, 0.2, 0.8, 1.1);
|
||||
|
||||
model = ATMOSPHERE_MODEL_BRUNETON;
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include "Vector3.h"
|
||||
#include "FloatNode.h"
|
||||
#include "Scenery.h"
|
||||
#include "NoiseNode.h"
|
||||
|
||||
CelestialBodyDefinition::CelestialBodyDefinition(DefinitionNode *parent, const string &name)
|
||||
: DefinitionNode(parent, name) {
|
||||
|
@ -11,6 +12,7 @@ CelestialBodyDefinition::CelestialBodyDefinition(DefinitionNode *parent, const s
|
|||
phi = new FloatNode(this, "phi");
|
||||
theta = new FloatNode(this, "theta");
|
||||
radius = new FloatNode(this, "radius");
|
||||
noise = new NoiseNode(this, "noise");
|
||||
}
|
||||
|
||||
Vector3 CelestialBodyDefinition::getGlobalDirection() const {
|
||||
|
|
|
@ -24,6 +24,9 @@ class DEFINITIONSHARED_EXPORT CelestialBodyDefinition : public DefinitionNode {
|
|||
inline FloatNode *propRadius() const {
|
||||
return radius;
|
||||
}
|
||||
inline NoiseNode *propNoise() const {
|
||||
return noise;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the normalized direction of the celestial body, from the center of the earth.
|
||||
|
@ -48,6 +51,7 @@ class DEFINITIONSHARED_EXPORT CelestialBodyDefinition : public DefinitionNode {
|
|||
FloatNode *phi;
|
||||
FloatNode *theta;
|
||||
FloatNode *radius;
|
||||
NoiseNode *noise;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,16 +7,14 @@
|
|||
#include "Geometry.h"
|
||||
#include "SurfaceMaterial.h"
|
||||
#include "FloatNode.h"
|
||||
#include "NoiseFunctionSimplex.h"
|
||||
#include "FractalNoise.h"
|
||||
#include "NoiseNode.h"
|
||||
|
||||
class MoonRenderer::pimpl {
|
||||
public:
|
||||
pimpl() : definition(NULL, "moon") {
|
||||
// TODO Put noise in scenery
|
||||
noise.setScaling(0.2);
|
||||
}
|
||||
CelestialBodyDefinition definition;
|
||||
NoiseFunctionSimplex noise;
|
||||
};
|
||||
|
||||
MoonRenderer::MoonRenderer(CelestialBodyDefinition *moon_node) : DefinitionWatcher("MoonRenderer"), impl(new pimpl()) {
|
||||
|
@ -35,7 +33,7 @@ void MoonRenderer::nodeChanged(const DefinitionNode *, const DefinitionDiff *, c
|
|||
bool MoonRenderer::getLightsAt(vector<LightComponent> &result, const Vector3 &location) const {
|
||||
LightComponent light;
|
||||
|
||||
// TODO Don't add if its contribution is negligible
|
||||
// TODO Don't add if its contribution is negligible or below horizon
|
||||
// TODO Take moon phase into account
|
||||
|
||||
light.color = Color(0.03, 0.03, 0.03);
|
||||
|
@ -63,21 +61,23 @@ Color MoonRenderer::getColor(const Vector3 &eye, const Vector3 &direction, Light
|
|||
auto p1 = nearest.sub(moon_location).normalize();
|
||||
auto coords = p1.toSpherical();
|
||||
|
||||
auto noise = impl->definition.propNoise()->getGenerator();
|
||||
|
||||
double precision = 0.00001;
|
||||
coords.phi += precision;
|
||||
auto p2 = Vector3(coords);
|
||||
p2 = p2.scale(1.0 - precision * fabs(impl->noise.get3d(0.01, p2.x, p2.y, p2.z)));
|
||||
p2 = p2.scale(1.0 - precision * fabs(noise->get3d(0.01, p2.x, p2.y, p2.z)));
|
||||
|
||||
coords.phi -= precision;
|
||||
coords.theta += precision;
|
||||
auto p3 = Vector3(coords);
|
||||
p3 = p3.scale(1.0 - precision * fabs(impl->noise.get3d(0.01, p3.x, p3.y, p3.z)));
|
||||
p3 = p3.scale(1.0 - precision * fabs(noise->get3d(0.01, p3.x, p3.y, p3.z)));
|
||||
|
||||
auto normal = p1.getNormal3(p2, p3);
|
||||
|
||||
double gradient =
|
||||
2.3 + 8.0 * impl->noise.get3d(0.01, 0.3 * p1.x + 12.0, 0.3 * p1.y - 4.8, -0.3 * p1.z + 7.4);
|
||||
double gradient = 2.0 + 10.0 * noise->get3d(0.01, 0.3 * p1.x + 12.0, 0.3 * p1.y - 4.8, -0.3 * p1.z + 7.4);
|
||||
SurfaceMaterial material(Color(gradient, gradient, gradient));
|
||||
material.hardness = 0.3;
|
||||
|
||||
auto moon_color = lighting->apply(eye, nearest, normal, material);
|
||||
if (dist <= 0.05) {
|
||||
|
|
Loading…
Reference in a new issue