Added NoiseNode

This commit is contained in:
Michaël Lemaire 2015-10-19 00:26:25 +02:00
parent 52bad18d26
commit 75e32beea7
6 changed files with 131 additions and 36 deletions

View file

@ -29,7 +29,7 @@ NoiseGenerator::~NoiseGenerator()
{
}
void NoiseGenerator::save(PackStream* stream)
void NoiseGenerator::save(PackStream* stream) const
{
int x;
@ -43,7 +43,7 @@ void NoiseGenerator::save(PackStream* stream)
for (x = 0; x < level_count; x++)
{
NoiseLevel* level = levels + x;
const NoiseLevel* level = levels + x;
stream->write(&level->frequency);
stream->write(&level->amplitude);
@ -84,7 +84,7 @@ void NoiseGenerator::load(PackStream* stream)
validate();
}
void NoiseGenerator::copy(NoiseGenerator* destination)
void NoiseGenerator::copy(NoiseGenerator* destination) const
{
destination->function = function;
destination->height_offset = height_offset;
@ -94,7 +94,7 @@ void NoiseGenerator::copy(NoiseGenerator* destination)
state.copy(&destination->state);
validate();
destination->validate();
}
void NoiseGenerator::validate()
@ -189,13 +189,13 @@ void NoiseGenerator::forceValue(double value)
addLevelSimple(1.0, 0.0, 0.0); /* FIXME Should not be needed */
}
void NoiseGenerator::getRange(double* minvalue, double* maxvalue)
void NoiseGenerator::getRange(double* minvalue, double* maxvalue) const
{
*minvalue = _min_value;
*maxvalue = _max_value;
}
int NoiseGenerator::getLevelCount()
int NoiseGenerator::getLevelCount() const
{
return level_count;
}
@ -263,7 +263,7 @@ void NoiseGenerator::removeLevel(int level)
}
}
int NoiseGenerator::getLevel(int level, NoiseLevel* params)
int NoiseGenerator::getLevel(int level, NoiseLevel* params) const
{
if (level >= 0 && level < level_count)
{
@ -374,12 +374,12 @@ static inline double _fixValue(double value, double ridge, double curve)
inline double NoiseGenerator::_get1DLevelValue(NoiseLevel* level, const NoiseState::NoiseOffset &offset, double x)
inline double NoiseGenerator::_get1DLevelValue(const NoiseLevel* level, const NoiseState::NoiseOffset &offset, double x) const
{
return level->minvalue + _fixValue(_func_noise_1d(x * level->frequency + offset.x), function.ridge_factor, function.curve_factor) * level->amplitude;
}
double NoiseGenerator::get1DLevel(int level, double x)
double NoiseGenerator::get1DLevel(int level, double x) const
{
if (level >= 0 && level < level_count)
{
@ -391,7 +391,7 @@ double NoiseGenerator::get1DLevel(int level, double x)
}
}
double NoiseGenerator::get1DTotal(double x)
double NoiseGenerator::get1DTotal(double x) const
{
int level;
double result;
@ -404,7 +404,7 @@ double NoiseGenerator::get1DTotal(double x)
return result + height_offset;
}
double NoiseGenerator::get1DDetail(double x, double detail)
double NoiseGenerator::get1DDetail(double x, double detail) const
{
int level;
double result, height, factor;
@ -431,12 +431,12 @@ double NoiseGenerator::get1DDetail(double x, double detail)
inline double NoiseGenerator::_get2DLevelValue(NoiseLevel* level, const NoiseState::NoiseOffset &offset, double x, double y)
inline double NoiseGenerator::_get2DLevelValue(const NoiseLevel* level, const NoiseState::NoiseOffset &offset, double x, double y) const
{
return level->minvalue + _fixValue(_func_noise_2d(x * level->frequency + offset.x, y * level->frequency + offset.y), function.ridge_factor, function.curve_factor) * level->amplitude;
}
double NoiseGenerator::get2DLevel(int level, double x, double y)
double NoiseGenerator::get2DLevel(int level, double x, double y) const
{
if (level >= 0 && level < level_count)
{
@ -448,7 +448,7 @@ double NoiseGenerator::get2DLevel(int level, double x, double y)
}
}
double NoiseGenerator::get2DTotal(double x, double y)
double NoiseGenerator::get2DTotal(double x, double y) const
{
int level;
double result;
@ -461,7 +461,7 @@ double NoiseGenerator::get2DTotal(double x, double y)
return result + height_offset;
}
double NoiseGenerator::get2DDetail(double x, double y, double detail)
double NoiseGenerator::get2DDetail(double x, double y, double detail) const
{
int level;
double result, height, factor;
@ -488,12 +488,12 @@ double NoiseGenerator::get2DDetail(double x, double y, double detail)
inline double NoiseGenerator::_get3DLevelValue(NoiseLevel* level, const NoiseState::NoiseOffset &offset, double x, double y, double z)
inline double NoiseGenerator::_get3DLevelValue(const NoiseLevel* level, const NoiseState::NoiseOffset &offset, double x, double y, double z) const
{
return level->minvalue + _fixValue(_func_noise_3d(x * level->frequency + offset.x, y * level->frequency + offset.y, z * level->frequency + offset.z), function.ridge_factor, function.curve_factor) * level->amplitude;
}
double NoiseGenerator::get3DLevel(int level, double x, double y, double z)
double NoiseGenerator::get3DLevel(int level, double x, double y, double z) const
{
if (level >= 0 && level < level_count)
{
@ -505,7 +505,7 @@ double NoiseGenerator::get3DLevel(int level, double x, double y, double z)
}
}
double NoiseGenerator::get3DTotal(double x, double y, double z)
double NoiseGenerator::get3DTotal(double x, double y, double z) const
{
int level;
double result;
@ -518,7 +518,7 @@ double NoiseGenerator::get3DTotal(double x, double y, double z)
return result + height_offset;
}
double NoiseGenerator::get3DDetail(double x, double y, double z, double detail)
double NoiseGenerator::get3DDetail(double x, double y, double z, double detail) const
{
int level;
double result, height, factor;

View file

@ -37,9 +37,9 @@ public:
NoiseGenerator();
virtual ~NoiseGenerator();
virtual void save(PackStream* stream);
virtual void save(PackStream* stream) const;
virtual void load(PackStream* stream);
virtual void copy(NoiseGenerator* destination);
virtual void copy(NoiseGenerator* destination) const;
virtual void validate();
inline const NoiseState &getState() const {return state;}
@ -51,32 +51,32 @@ public:
void setFunction(NoiseFunction* function);
void setFunctionParams(NoiseFunctionAlgorithm algorithm, double ridge_factor, double curve_factor);
void forceValue(double value);
void getRange(double* minvalue, double* maxvalue);
int getLevelCount();
void getRange(double* minvalue, double* maxvalue) const;
int getLevelCount() const;
void clearLevels();
void addLevel(NoiseLevel level);
void addLevelSimple(double scaling, double minvalue, double maxvalue);
void addLevels(int level_count, NoiseLevel start_level, double scaling_factor, double amplitude_factor, double center_factor);
void addLevelsSimple(int level_count, double scaling, double minvalue, double maxvalue, double center_factor);
void removeLevel(int level);
int getLevel(int level, NoiseLevel* params);
int getLevel(int level, NoiseLevel* params) const;
void setLevel(int index, NoiseLevel level);
void setLevelSimple(int index, double scaling, double minvalue, double maxvalue);
void normalizeAmplitude(double minvalue, double maxvalue, int adjust_scaling);
double get1DLevel(int level, double x);
double get1DTotal(double x);
double get1DDetail(double x, double detail);
double get2DLevel(int level, double x, double y);
double get2DTotal(double x, double y);
double get2DDetail(double x, double y, double detail);
double get3DLevel(int level, double x, double y, double z);
double get3DTotal(double x, double y, double z);
double get3DDetail(double x, double y, double z, double detail);
double get1DLevel(int level, double x) const;
double get1DTotal(double x) const;
double get1DDetail(double x, double detail) const;
double get2DLevel(int level, double x, double y) const;
double get2DTotal(double x, double y) const;
double get2DDetail(double x, double y, double detail) const;
double get3DLevel(int level, double x, double y, double z) const;
double get3DTotal(double x, double y, double z) const;
double get3DDetail(double x, double y, double z, double detail) const;
private:
double _get1DLevelValue(NoiseLevel* level, const NoiseState::NoiseOffset &offset, double x);
double _get2DLevelValue(NoiseLevel* level, const NoiseState::NoiseOffset &offset, double x, double y);
double _get3DLevelValue(NoiseLevel* level, const NoiseState::NoiseOffset &offset, double x, double y, double z);
double _get1DLevelValue(const NoiseLevel* level, const NoiseState::NoiseOffset &offset, double x) const;
double _get2DLevelValue(const NoiseLevel* level, const NoiseState::NoiseOffset &offset, double x, double y) const;
double _get3DLevelValue(const NoiseLevel* level, const NoiseState::NoiseOffset &offset, double x, double y, double z) const;
NoiseFunction function;
double height_offset;

View file

@ -0,0 +1,51 @@
#include "NoiseNode.h"
#include "NoiseGenerator.h"
#include "Logs.h"
NoiseNode::NoiseNode(DefinitionNode *parent):
DefinitionNode(parent, "noise")
{
noise = new NoiseGenerator();
}
NoiseNode::~NoiseNode()
{
delete noise;
}
void NoiseNode::setLevels(int levels, double min_value, double max_value)
{
noise->clearLevels();
noise->addLevelsSimple(levels, 1.0, -1.0, 1.0, 0.5);
noise->normalizeAmplitude(min_value, max_value, false);
noise->randomizeOffsets();
noise->validate();
}
void NoiseNode::save(PackStream *stream) const
{
noise->save(stream);
}
void NoiseNode::load(PackStream *stream)
{
noise->load(stream);
}
void NoiseNode::copy(DefinitionNode *destination) const
{
if (destination->getTypeName() == getTypeName())
{
noise->copy(((NoiseNode *)destination)->noise);
}
else
{
Logs::error() << "Can't copy from " << getTypeName() << " to " << destination->getTypeName() << std::endl;
}
}
void NoiseNode::validate()
{
noise->validate();
}

View file

@ -0,0 +1,41 @@
#ifndef NOISENODE_H
#define NOISENODE_H
#include "definition_global.h"
#include "DefinitionNode.h"
namespace paysages {
namespace definition {
/**
* Definition node with noise parameters.
*/
class DEFINITIONSHARED_EXPORT NoiseNode: public DefinitionNode
{
public:
NoiseNode(DefinitionNode *parent);
virtual ~NoiseNode();
inline const NoiseGenerator *getGenerator() {return noise;}
/**
* Set the number of levels to use in the noise generator.
*/
void setLevels(int levels, double min_value=-1.0, double max_value=1.0);
protected:
virtual void save(PackStream *stream) const override;
virtual void load(PackStream *stream) override;
virtual void copy(DefinitionNode *destination) const override;
virtual void validate() override;
private:
NoiseGenerator *noise;
};
}
}
#endif // NOISENODE_H

View file

@ -38,6 +38,7 @@ SOURCES += \
DefinitionWatcher.cpp \
IntNode.cpp \
IntDiff.cpp \
NoiseNode.cpp \
GodRaysDefinition.cpp \
TimeManager.cpp
@ -67,6 +68,7 @@ HEADERS +=\
DefinitionWatcher.h \
IntNode.h \
IntDiff.h \
NoiseNode.h \
GodRaysDefinition.h \
TimeManager.h

View file

@ -19,6 +19,7 @@ namespace definition {
class FloatDiff;
class IntNode;
class IntDiff;
class NoiseNode;
class DiffManager;
class DefinitionWatcher;
class Scenery;