added function storage
parent
d94bea7415
commit
b41ab02c9d
|
@ -1,3 +1,3 @@
|
||||||
Start testing: Jul 17 21:33 EDT
|
Start testing: Jul 18 18:10 EDT
|
||||||
----------------------------------------------------------
|
----------------------------------------------------------
|
||||||
End testing: Jul 17 21:33 EDT
|
End testing: Jul 18 18:10 EDT
|
||||||
|
|
|
@ -33,7 +33,11 @@ namespace parks::genetic {
|
||||||
b = b - trunc(b);
|
b = b - trunc(b);
|
||||||
}
|
}
|
||||||
|
|
||||||
explicit Color(double v): Color(v, v, v) {}
|
explicit Color(double v) {
|
||||||
|
r = v;
|
||||||
|
g = 0;
|
||||||
|
b = 0;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
inline Color normalize(Color c) {
|
inline Color normalize(Color c) {
|
||||||
|
@ -99,7 +103,7 @@ namespace parks::genetic {
|
||||||
public:
|
public:
|
||||||
ParameterSet() = default;
|
ParameterSet() = default;
|
||||||
|
|
||||||
const inline Color& operator[](int index){return parameters[index];}
|
inline const Color& operator[](int index) const {return parameters[index];}
|
||||||
inline size_t size(){return parameters.size();}
|
inline size_t size(){return parameters.size();}
|
||||||
|
|
||||||
void add(Color c) {parameters.push_back(c);}
|
void add(Color c) {parameters.push_back(c);}
|
||||||
|
|
|
@ -54,7 +54,6 @@ namespace parks::genetic {
|
||||||
public:
|
public:
|
||||||
Function(std::function<Color(OperatorArguments, ParameterSet)> func, unsigned int requiredScalars, unsigned int requiredColors, unsigned int acceptsArgs): func(std::move(func)), requiredScalars(requiredScalars), requiredColors(requiredColors), acceptsArgs(acceptsArgs) {
|
Function(std::function<Color(OperatorArguments, ParameterSet)> func, unsigned int requiredScalars, unsigned int requiredColors, unsigned int acceptsArgs): func(std::move(func)), requiredScalars(requiredScalars), requiredColors(requiredColors), acceptsArgs(acceptsArgs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// in the case of single argument, it is provided to the left side!
|
// in the case of single argument, it is provided to the left side!
|
||||||
[[nodiscard]] inline bool singleArgument() const {
|
[[nodiscard]] inline bool singleArgument() const {
|
||||||
return acceptsArgs & ARGS_SINGLE;
|
return acceptsArgs & ARGS_SINGLE;
|
||||||
|
@ -103,22 +102,52 @@ namespace parks::genetic {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
std::unordered_map<FunctionID, Function> functions = {
|
class FunctionStorage {
|
||||||
{FunctionID::ADD, Function{parks::genetic::add, 0, 0, ARGS_BOTH | ARGS_SCALARS | ARGS_COLORS | ARGS_VARIABLES | ARGS_FUNCS}},
|
private:
|
||||||
{FunctionID::SUBTRACT, Function{parks::genetic::subtract, 0, 0, ARGS_BOTH | ARGS_SCALARS | ARGS_COLORS | ARGS_VARIABLES | ARGS_FUNCS}},
|
Function** functions;
|
||||||
{FunctionID::MULTIPLY, Function{parks::genetic::multiply, 0, 0, ARGS_BOTH | ARGS_SCALARS | ARGS_COLORS | ARGS_VARIABLES | ARGS_FUNCS}},
|
size_t size = 0;
|
||||||
{FunctionID::DIVIDE, Function{parks::genetic::divide, 0, 0, ARGS_BOTH | ARGS_SCALARS | ARGS_COLORS | ARGS_VARIABLES | ARGS_FUNCS}},
|
public:
|
||||||
{FunctionID::MOD, Function{parks::genetic::mod, 0, 0, ARGS_BOTH | ARGS_SCALARS | ARGS_COLORS | ARGS_VARIABLES | ARGS_FUNCS}},
|
FunctionStorage(std::initializer_list<std::pair<FunctionID, Function*>>&& init){
|
||||||
{FunctionID::ROUND, Function{parks::genetic::round, 0, 0, ARGS_SINGLE | ARGS_VARIABLES | ARGS_FUNCS}},
|
size_t max_value = init.size();
|
||||||
{FunctionID::MIN, Function{parks::genetic::min, 0, 0, ARGS_BOTH | ARGS_SCALARS | ARGS_COLORS | ARGS_VARIABLES | ARGS_FUNCS}},
|
for (const auto& v : init){
|
||||||
{FunctionID::MAX, Function{parks::genetic::max, 0, 0, ARGS_BOTH | ARGS_SCALARS | ARGS_COLORS | ARGS_VARIABLES | ARGS_FUNCS}},
|
int enumID = (int)v.first;
|
||||||
{FunctionID::ABS, Function{parks::genetic::abs, 0, 0, ARGS_SINGLE | ARGS_VARIABLES | ARGS_FUNCS}},
|
max_value = std::max(max_value, (size_t)enumID);
|
||||||
{FunctionID::LOG, Function{parks::genetic::log, 0, 0, ARGS_SINGLE | ARGS_SCALARS | ARGS_COLORS | ARGS_VARIABLES | ARGS_FUNCS}},
|
}
|
||||||
{FunctionID::SIN, Function{parks::genetic::sin, 0, 0, ARGS_SINGLE | ARGS_VARIABLES | ARGS_FUNCS}},
|
functions = new Function*[max_value];
|
||||||
{FunctionID::COS, Function{parks::genetic::cos, 0, 0, ARGS_SINGLE | ARGS_VARIABLES | ARGS_FUNCS}},
|
|
||||||
{FunctionID::ATAN, Function{parks::genetic::atan, 0, 0, ARGS_SINGLE | ARGS_VARIABLES | ARGS_FUNCS}},
|
for (auto& v : init){
|
||||||
{FunctionID::NOISE, Function{parks::genetic::noise, 3, 0, ARGS_NONE}},
|
functions[(int)v.first] = v.second;
|
||||||
{FunctionID::COLOR_NOISE, Function{parks::genetic::colorNoise, 3, 0, ARGS_NONE}},
|
}
|
||||||
|
size = max_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] const Function& operator[](FunctionID id) const {
|
||||||
|
return *functions[(int)id];
|
||||||
|
}
|
||||||
|
|
||||||
|
~FunctionStorage(){
|
||||||
|
for (size_t i = 0; i < size; i++)
|
||||||
|
delete functions[i];
|
||||||
|
delete[] functions;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
FunctionStorage functions = {
|
||||||
|
{FunctionID::ADD, new Function{parks::genetic::add, 0, 0, ARGS_BOTH | ARGS_SCALARS | ARGS_COLORS | ARGS_VARIABLES | ARGS_FUNCS}},
|
||||||
|
{FunctionID::SUBTRACT, new Function{parks::genetic::subtract, 0, 0, ARGS_BOTH | ARGS_SCALARS | ARGS_COLORS | ARGS_VARIABLES | ARGS_FUNCS}},
|
||||||
|
{FunctionID::MULTIPLY, new Function{parks::genetic::multiply, 0, 0, ARGS_BOTH | ARGS_SCALARS | ARGS_COLORS | ARGS_VARIABLES | ARGS_FUNCS}},
|
||||||
|
{FunctionID::DIVIDE, new Function{parks::genetic::divide, 0, 0, ARGS_BOTH | ARGS_SCALARS | ARGS_COLORS | ARGS_VARIABLES | ARGS_FUNCS}},
|
||||||
|
{FunctionID::MOD, new Function{parks::genetic::mod, 0, 0, ARGS_BOTH | ARGS_SCALARS | ARGS_COLORS | ARGS_VARIABLES | ARGS_FUNCS}},
|
||||||
|
{FunctionID::ROUND, new Function{parks::genetic::round, 0, 0, ARGS_SINGLE | ARGS_VARIABLES | ARGS_FUNCS}},
|
||||||
|
{FunctionID::MIN, new Function{parks::genetic::min, 0, 0, ARGS_BOTH | ARGS_SCALARS | ARGS_COLORS | ARGS_VARIABLES | ARGS_FUNCS}},
|
||||||
|
{FunctionID::MAX, new Function{parks::genetic::max, 0, 0, ARGS_BOTH | ARGS_SCALARS | ARGS_COLORS | ARGS_VARIABLES | ARGS_FUNCS}},
|
||||||
|
{FunctionID::ABS, new Function{parks::genetic::abs, 0, 0, ARGS_SINGLE | ARGS_VARIABLES | ARGS_FUNCS}},
|
||||||
|
{FunctionID::LOG, new Function{parks::genetic::log, 0, 0, ARGS_SINGLE | ARGS_SCALARS | ARGS_COLORS | ARGS_VARIABLES | ARGS_FUNCS}},
|
||||||
|
{FunctionID::SIN, new Function{parks::genetic::sin, 0, 0, ARGS_SINGLE | ARGS_VARIABLES | ARGS_FUNCS}},
|
||||||
|
{FunctionID::COS, new Function{parks::genetic::cos, 0, 0, ARGS_SINGLE | ARGS_VARIABLES | ARGS_FUNCS}},
|
||||||
|
{FunctionID::ATAN, new Function{parks::genetic::atan, 0, 0, ARGS_SINGLE | ARGS_VARIABLES | ARGS_FUNCS}},
|
||||||
|
{FunctionID::NOISE, new Function{parks::genetic::noise, 5, 0, ARGS_BOTH | ARGS_VARIABLES}},
|
||||||
|
{FunctionID::COLOR_NOISE, new Function{parks::genetic::colorNoise, 5, 0, ARGS_BOTH | ARGS_VARIABLES}},
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
// Created by brett on 7/17/23.
|
// Created by brett on 7/17/23.
|
||||||
//
|
//
|
||||||
#include <genetic/v3/v3_functions.h>
|
#include <genetic/v3/v3_functions.h>
|
||||||
|
#include <stb/stb_perlin.h>
|
||||||
|
|
||||||
namespace parks::genetic {
|
namespace parks::genetic {
|
||||||
|
|
||||||
|
@ -47,26 +48,41 @@ namespace parks::genetic {
|
||||||
}
|
}
|
||||||
|
|
||||||
Color log(OperatorArguments args, const ParameterSet& params) {
|
Color log(OperatorArguments args, const ParameterSet& params) {
|
||||||
return Color(0, 0, 0);
|
return Color(std::log(args.left.r), std::log(args.left.g), std::log(args.left.b));
|
||||||
}
|
}
|
||||||
|
|
||||||
Color sin(OperatorArguments args, const ParameterSet& params) {
|
Color sin(OperatorArguments args, const ParameterSet& params) {
|
||||||
return Color(0, 0, 0);
|
return Color(std::sin(args.left.r), std::sin(args.left.g), std::sin(args.left.b));
|
||||||
}
|
}
|
||||||
|
|
||||||
Color cos(OperatorArguments args, const ParameterSet& params) {
|
Color cos(OperatorArguments args, const ParameterSet& params) {
|
||||||
return Color(0, 0, 0);
|
return Color(std::cos(args.left.r), std::cos(args.left.g), std::cos(args.left.b));
|
||||||
}
|
}
|
||||||
|
|
||||||
Color atan(OperatorArguments args, const ParameterSet& params) {
|
Color atan(OperatorArguments args, const ParameterSet& params) {
|
||||||
return Color(0, 0, 0);
|
return Color(std::atan(args.left.r), std::atan(args.left.g), std::atan(args.left.b));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const float lacunarity = 6;
|
||||||
|
const float octaves = 12;
|
||||||
|
const float gain = 2;
|
||||||
|
const float scale = 1024;
|
||||||
|
|
||||||
Color noise(OperatorArguments args, const ParameterSet& params) {
|
Color noise(OperatorArguments args, const ParameterSet& params) {
|
||||||
return Color(0, 0, 0);
|
float scaleX = (float)args.left.r * (float)params[3].r * scale;
|
||||||
|
float scaleY = (float)args.right.r * (float)params[3].r * scale;
|
||||||
|
|
||||||
|
return Color(stb_perlin_turbulence_noise3(scaleX, scaleY, 0.52342, (float)params[0].r * lacunarity, (float)params[1].r * gain, (int)std::max(2.0, params[2].r * octaves)));
|
||||||
}
|
}
|
||||||
|
|
||||||
Color colorNoise(OperatorArguments args, const ParameterSet& params) {
|
Color colorNoise(OperatorArguments args, const ParameterSet& params) {
|
||||||
return Color(0, 0, 0);
|
float scaleX = (float)args.left.r * (float)params[3].r * scale;
|
||||||
|
float scaleY = (float)args.right.r * (float)params[3].r * scale;
|
||||||
|
|
||||||
|
float r = stb_perlin_turbulence_noise3(scaleX, scaleY, 0.52342, (float)params[0].r * lacunarity, (float)params[1].r * gain, (int)std::max(2.0, params[2].r * octaves));
|
||||||
|
float g = stb_perlin_turbulence_noise3(scaleX, 0.21045, scaleY, (float)params[0].r * lacunarity, (float)params[1].r * gain, (int)std::max(2.0, params[2].r * octaves));
|
||||||
|
float b = stb_perlin_turbulence_noise3(0.78423, scaleY, scaleX, (float)params[0].r * lacunarity, (float)params[1].r * gain, (int)std::max(2.0, params[2].r * octaves));
|
||||||
|
|
||||||
|
return Color(r, g, b);
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue