2015-10-18 20:15:19 +00:00
|
|
|
#include "VegetationPresenceDefinition.h"
|
|
|
|
|
|
|
|
#include "Scenery.h"
|
|
|
|
#include "TerrainDefinition.h"
|
|
|
|
#include "VegetationLayerDefinition.h"
|
2015-10-18 22:30:20 +00:00
|
|
|
#include "VegetationModelDefinition.h"
|
2015-10-18 20:15:19 +00:00
|
|
|
#include "VegetationInstance.h"
|
2015-10-18 22:30:20 +00:00
|
|
|
#include "FloatNode.h"
|
|
|
|
#include "NoiseNode.h"
|
|
|
|
#include "NoiseGenerator.h"
|
2015-10-18 20:15:19 +00:00
|
|
|
|
|
|
|
VegetationPresenceDefinition::VegetationPresenceDefinition(VegetationLayerDefinition *parent):
|
|
|
|
DefinitionNode(parent, "presence")
|
|
|
|
{
|
2015-10-18 22:30:20 +00:00
|
|
|
noise = new NoiseNode(this);
|
|
|
|
noise->setLevels(4);
|
|
|
|
interval = new FloatNode(this, "interval", 0.1);
|
2015-10-18 20:15:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool VegetationPresenceDefinition::collectInstances(std::vector<VegetationInstance> *result, const VegetationModelDefinition &model, double xmin, double zmin, double xmax, double zmax, bool outcomers) const
|
|
|
|
{
|
2015-11-02 22:00:02 +00:00
|
|
|
if (outcomers)
|
|
|
|
{
|
|
|
|
// Expand the area to include outcoming instances
|
|
|
|
double max_radius = getMaxHeight();
|
|
|
|
xmin -= max_radius;
|
|
|
|
zmin -= max_radius;
|
|
|
|
xmax += max_radius;
|
|
|
|
zmax += max_radius;
|
|
|
|
}
|
|
|
|
|
2015-10-18 22:30:20 +00:00
|
|
|
bool added = 0;
|
|
|
|
|
|
|
|
const NoiseGenerator *generator = noise->getGenerator();
|
|
|
|
double interval_value = interval->getValue();
|
|
|
|
|
|
|
|
double xstart = xmin - fmod(xmin, interval_value);
|
|
|
|
double zstart = zmin - fmod(zmin, interval_value);
|
|
|
|
for (double x = xstart; x < xmax; x += interval_value)
|
|
|
|
{
|
|
|
|
for (double z = zstart; z < zmax; z += interval_value)
|
|
|
|
{
|
|
|
|
double noise_presence = generator->get2DTotal(x * 0.1, z * 0.1);
|
|
|
|
if (noise_presence > 0.0)
|
|
|
|
{
|
|
|
|
double size = 0.1 + 0.2 * fabs(generator->get2DTotal(z * 10.0, x * 10.0)) * (noise_presence * 0.5 + 0.5);
|
|
|
|
double angle = 3.0 * generator->get2DTotal(-x * 20.0, z * 20.0); // TODO balanced distribution
|
|
|
|
double xoffset = fabs(generator->get2DTotal(x * 12.0, -z * 12.0));
|
|
|
|
double zoffset = fabs(generator->get2DTotal(-x * 27.0, -z * 27.0));
|
|
|
|
double y = getScenery()->getTerrain()->getInterpolatedHeight(x + xoffset, z + zoffset, true, true);
|
|
|
|
result->push_back(VegetationInstance(model, Vector3(x + xoffset, y, z + zoffset), size, angle));
|
|
|
|
added++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return added > 0;
|
2015-10-18 20:15:19 +00:00
|
|
|
}
|
2015-11-02 22:00:02 +00:00
|
|
|
|
|
|
|
double VegetationPresenceDefinition::getMaxHeight() const
|
|
|
|
{
|
|
|
|
return 0.3;
|
|
|
|
}
|