diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 1903173..f99ccee 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -11,6 +11,9 @@
+
+
+
diff --git a/CMakeLists.txt b/CMakeLists.txt
index bdd1ccb..6c954bf 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.25)
-project(image-gp-2 VERSION 0.0.9)
+project(image-gp-2 VERSION 0.0.10)
option(ENABLE_ADDRSAN "Enable the address sanitizer" OFF)
option(ENABLE_UBSAN "Enable the ub sanitizer" OFF)
diff --git a/lib/blt-gp b/lib/blt-gp
index 0dc083e..2e09696 160000
--- a/lib/blt-gp
+++ b/lib/blt-gp
@@ -1 +1 @@
-Subproject commit 0dc083e095393beaf88d58f07b6f06c04439cdb8
+Subproject commit 2e09696a673eeae099bc87024e6f32e6c5815fa3
diff --git a/src/gp_system.cpp b/src/gp_system.cpp
index 65fcdb7..386748b 100644
--- a/src/gp_system.cpp
+++ b/src/gp_system.cpp
@@ -83,6 +83,12 @@ void setup_operations(gp_program* program)
}
return ret;
});
+ static auto op_image_noise = operation_t([program]() {
+ image_t ret{};
+ for (auto& v : ret.get_data().data)
+ v = program->get_random().get_float(0, 1.0f);
+ return ret;
+ }).set_ephemeral();
static auto op_image_ephemeral = operation_t([program]() {
image_t ret{};
const auto value = program->get_random().get_float();
@@ -175,6 +181,14 @@ void setup_operations(gp_program* program)
lacunarity + 2, gain + 0.5f, 1.0f, static_cast(octaves));
return ret;
}, "perlin_image");
+ static operation_t op_image_perlin_bounded([](float octaves) {
+ octaves = std::min(std::max(octaves, 4.0f), 8.0f);
+ image_t ret{};
+ for (const auto& [i, out] : blt::enumerate(ret.get_data().data))
+ out = stb_perlin_fbm_noise3(static_cast(i % IMAGE_DIMENSIONS) + 0.23423f, static_cast(i / IMAGE_DIMENSIONS) + 0.6234f, 0.4861f,
+ 2, 0.5, static_cast(octaves));
+ return ret;
+ }, "perlin_image_bounded");
static operation_t op_sin([](const float a) {
return std::sin(a);
}, "sin_float");
@@ -198,7 +212,7 @@ void setup_operations(gp_program* program)
operator_builder builder{};
builder.build(op_image_ephemeral, make_add(), make_sub(), make_mul(), make_div(), op_image_x, op_image_y,
op_image_sin, op_image_gt, op_image_lt, op_image_cos, op_image_log, op_image_exp, op_image_or, op_image_and, op_image_xor,
- op_image_not, op_image_perlin, make_add(), make_sub(), make_mul(), make_prot_div(), op_sin, op_cos,
+ op_image_not, op_image_perlin_bounded, op_image_blend, make_add(), make_sub(), make_mul(), make_prot_div(), op_sin, op_cos,
op_exp, op_log, lit);
program->set_operations(builder.grab());
}