atomorph/src/EpsilonHook.cpp

50 lines
1.8 KiB
C++

#include "morph.h"
#define export extern "C" [[maybe_unused]]
export am::morph* create_morph(uint16_t width, uint16_t height, uint8_t img_a[], uint8_t img_b[]) {
auto* morph = new am::morph();
morph->set_blob_delimiter (am::HSP);
morph->set_blob_max_size (128);
morph->set_blob_min_size (3);
morph->set_blob_box_grip (16);
morph->set_blob_box_samples(-1);
morph->set_blob_threshold (128);
morph->set_blob_number (1);
morph->set_seed (0);
morph->set_blob_rgba_weight(1);
morph->set_blob_size_weight(0);
morph->set_blob_xy_weight (0);
morph->set_degeneration (10000);
morph->set_density (2); // Higher than 1 sets fluid to 0.
morph->set_motion (am::SPLINE);
morph->set_fading (am::PERLIN);
morph->set_threads (8);
morph->set_cycle_length (100000);
morph->set_feather (0);
morph->set_keep_background (0);
morph->set_finite (1);
morph->set_show_blobs (am::TEXTURE);
morph->set_fluid (0); // Higher than 0 sets density to 1.
morph->set_resolution(width, height);
for (int i = 0; i < width * height; i++) {
auto real_index = i * 4;
morph->add_pixel(0, am::create_pixel(i % width, i / width, img_a[real_index], img_a[real_index + 1],
img_a[real_index + 2], img_a[real_index + 3]));
}
for (int i = 0; i < width * height; i++) {
auto real_index = i * 4;
morph->add_pixel(1, am::create_pixel(i % width, i / width, img_b[real_index], img_b[real_index + 1],
img_b[real_index + 2], img_b[real_index + 3]));
}
morph->compute();
return morph;
}
export void delete_morph(am::morph* morph) { delete morph; }