#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; }