Função de onda única Biblioteca de colapso em C, mais uma ferramenta de linha de comando
Esta é uma versão inicial que suporta o método WFC sobreposto. O método pega uma imagem de entrada pequena e gera uma imagem de saída maior que é localmente semelhante à imagem de entrada. Alguns exemplos de pares de entrada/saída:

O WFC é frequentemente usado para geração de mapas processuais, mas não se limita a esse caso de uso.
A biblioteca é muito executada e inclui várias otimizações não encontradas em outras implementações. Como exemplo, a geração das imagens de 128x128 acima (de 3x3 padrões, invertida e girada), em um MacBook Air M1 (2020) levou: 1,35, 0,92, 0,31, 7,7, 1,74 e 0,67 segundos, respectivamente. Isso inclui o tempo de carregamento/economia de imagem.
Um arquivo em seu projeto deve incluir wfc.h como este:
#define WFC_IMPLEMENTATION
#include "wfc.h" Outros arquivos também podem incluir e usar wfc.h , mas não devem definir a macro WFC_IMPLEMENTATION .
Como alternativa, você pode criar um arquivo .O tradicional com make wfc.o e usar wfc.h como um arquivo de cabeçalho regular.
Uso:
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); Por padrão, você trabalha com struct wfc_image para entradas e saídas.
struct wfc_image {
unsigned char * data ;
int component_cnt ;
int width ;
int height ;
} data são fortemente embalados sem preenchimento. Cada pixel consiste em componentes component_cnt (por exemplo, quatro componentes para o formato RGBA). A imagem de saída terá o mesmo número de componentes que a imagem de entrada.
wfc_run retorna 0 se não conseguir encontrar uma solução. Você pode tentar novamente assim:
wfc_init ( wfc );
wfc_run ( wfc , -1 );Opcionalmente, o WFC pode usar stb_image.h e stb_image_write.h para fornecer funções de conveniência para trabalhar diretamente com arquivos de imagem.
Você normalmente colocará stb_image.h e stb_image_write.h no mesmo diretório que wfc.h e incluirá suas implementações em um dos arquivos do projeto:
#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image.h"
#include "stb_image_write.h" Além disso, você instruirá wfc.h a usar o STB:
#define WFC_IMPLEMENTATION
#define WFC_USE_STB
#include "wfc.h"Uso:
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 );Funções extras ativadas pela inclusão do 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 A ferramenta de linha de comando usa a biblioteca e permite gerar imagens WFC. A ferramenta depende de stb_image.h e stb_image_write.h. Coloque os dois arquivos no mesmo diretório que wfctool.c .
make
./wfc
Execute ./wfc para ver as opções disponíveis
Uso básico:
./wfc -m overlapping samples/wrinkles.png output.png
Obrigado por usar o WFC. Se você encontrar bugs, tiver dúvidas ou feedback, entre em contato. Além disso, se você quiser compartilhar seus trabalhos, é muito apreciado.
samp.krystian em gmail.com