Библиотека коллапса волновой функции с одним файлом в C, а также инструмент командной строки
Это ранняя версия, которая поддерживает перекрывающийся метод WFC. Метод принимает небольшое входное изображение и генерирует более крупное выходное изображение, которое локально похоже на входное изображение. Несколько примеров паров ввода/вывода:

WFC часто используется для процедурной генерации карт, но не ограничивается этим вариантом использования.
Библиотека очень эффективна и включает в себя ряд оптимизаций, не найденных в других реализациях. В качестве примера, генерация вышеуказанных изображений 128x128 (из шаблонов 3x3, перевернута и вращения), на MacBook Air M1 (2020) взял: 1,35, 0,92, 0,31, 7,7, 1,74 и 0,67 секунды соответственно. Это включает в себя время загрузки/сбережения изображения.
Один файл в вашем проекте должен включать wfc.h , как это:
#define WFC_IMPLEMENTATION
#include "wfc.h" Другие файлы также могут включать и использовать wfc.h , но они не должны определять макрос WFC_IMPLEMENTATION .
В качестве альтернативы, вы можете построить традиционный файл .o с помощью make wfc.o и использовать wfc.h в качестве регулярного файла заголовка.
Использование:
struct wfc * wfc = wfc_overlapping (
128 , // Output image width in pixels
128 , // Output image height in pixels
input_image , // Input image that will be cut into tiles
3 , // Tile width in pixels
3 , // Tile height in pixels
1 , // Expand input image on the right and bottom
1 , // Add horizontal flips of all tiles
1 , // Add vertical flips of all tiles
1 // Add n*90deg rotations of all tiles
);
wfc_run ( wfc , -1 ); // Run Wave Function Collapse
// -1 means no limit on iterations
struct wfc_image * output_image = wfc_output_image ( wfc );
wfc_destroy ( wfc );
// use output_image->data
// wfc_img_destroy(output_image); По умолчанию вы работаете со struct wfc_image для входов и выходов.
struct wfc_image {
unsigned char * data ;
int component_cnt ;
int width ;
int height ;
} data плотно упакованы без прокладки. Каждый пиксель состоит из компонентов component_cnt (например, четыре компонента для формата RGBA). Выходное изображение будет иметь такое же количество компонентов, что и входное изображение.
wfc_run возвращает 0, если он не может найти решение. Вы можете попробовать еще раз, так:
wfc_init ( wfc );
wfc_run ( wfc , -1 );WFC может при желании использовать STB_IMAGE.H и STB_IMAGE_WRITE.H, чтобы предоставить удобные функции для непосредственной работы с файлами изображений.
Обычно вы размещаете stb_image.h и stb_image_write.h в том же каталоге, что и wfc.h , и включите их реализации в один из файлов проекта:
#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image.h"
#include "stb_image_write.h" Кроме того, вы поручите wfc.h использовать STB:
#define WFC_IMPLEMENTATION
#define WFC_USE_STB
#include "wfc.h"Использование:
struct wfc_image * input_image = wfc_img_load ( "input.png" );
struct wfc * wfc = wfc_overlapping (
...
input_image ,
...
);
wfc_run ( wfc , -1 ); // Run Wave Function Collapse
// -1 means no restriction on number of iterations
wfc_export ( wfc , "output.png" );
wfc_img_destroy ( input_image );
wfc_destroy ( wfc );Дополнительные функции, включенные путем включения STB:
struct wfc_image * image = wfc_img_load ( "image.png" )
wfc_img_save ( image , "image.png" )
wfc_export ( wfc , "output.png" )
wfc_export_tiles ( wfc , "directory" )
// don't forget to wfc_img_destroy(image) loaded images Инструмент командной строки использует библиотеку и позволяет генерировать изображения WFC. Инструмент зависит от stb_image.h и stb_image_write.h. Поместите оба файла в один и тот же каталог, что и wfctool.c .
make
./wfc
Запустить ./wfc чтобы увидеть доступные варианты
Основное использование:
./wfc -m overlapping samples/wrinkles.png output.png
Спасибо за использование WFC. Если вы найдете какие -либо ошибки, у вас есть вопросы или отзывы, пожалуйста, дайте мне знать. Кроме того, если вы хотите поделиться своими работами, это очень ценится.
Samp.krystian на gmail.com