Connor Olding
e5ee52ccff
additional layers of polish yield too negligible of an effect to bother with. tweaking the magic parameter is preferred.
136 lines
4.2 KiB
Markdown
136 lines
4.2 KiB
Markdown
# resynth
|
|
|
|
resynthesis is the process of taking a source texture and
|
|
creating similar (oft tiling) textures based on it.
|
|
|
|
resynth is a C rewrite of the original resynthesizer by [Paul Harrison.][pfh]
|
|
it does not require GIMP to function; just feed it image paths and it will save copies.
|
|
however, this program lacks the patching (masking) and texture transfer abilities of the original plugin.
|
|
|
|
resynth produces [tiling images like those seen here.][examples]
|
|
|
|
[pfh]: http://logarithmic.net/pfh/
|
|
[examples]: http://logarithmic.net/pfh/resynthesizer/more
|
|
|
|
## related projects
|
|
|
|
* [the original resynthesizer GIMP plugin in C++][orig] and [the associated paper][paper]
|
|
* [an updated resynthesizer GIMP plugin in C and C++][gimp]
|
|
* [syntex: similar algorithms based on resynthesizer in C#][syntex]
|
|
|
|
[orig]: http://logarithmic.net/pfh/resynthesizer
|
|
[paper]: http://www.logarithmic.net/pfh-files/thesis/dissertation.pdf
|
|
[gimp]: https://github.com/bootchk/resynthesizer/
|
|
[syntex]: https://github.com/mxgmn/SynTex/
|
|
|
|
## help
|
|
|
|
```
|
|
usage:
|
|
-a --autism
|
|
sensitivity to outliers
|
|
range: [0,256]; default: 32
|
|
-N --neighbors
|
|
points to use when sampling
|
|
range: [0,1024]; default: 29
|
|
-r --radius
|
|
square neighborhood, always odd
|
|
range: [0,32]; default: [n/a]
|
|
-R --circle-radius
|
|
circle neighborhood radius
|
|
range: [1,128]; default: [n/a]
|
|
-M --tries
|
|
random points added to candidates
|
|
range: [0,65536]; default: 192
|
|
-m --magic
|
|
magic constant, affects iterations
|
|
range: [0,255]; default: 192
|
|
-s --scale
|
|
output size multiplier; negative values set width and height
|
|
range: [-8192,32]; default: 1
|
|
-S --seed
|
|
initial RNG value
|
|
default: 0 [time(0)]
|
|
{files...}
|
|
image files to open, resynthesize, and save as {filename}.resynth.png
|
|
required default: [none]
|
|
```
|
|
|
|
the `radius` parameter should probably be removed.
|
|
|
|
### neighborhood
|
|
|
|
offsets are sorted in ascending distance from the center (the 0,0 point).
|
|
|
|
the order of equal distances is undefined.
|
|
this probably doesn't matter matter,
|
|
considering the algorithm handles non-circular
|
|
neighborhoods just fine — more on that later.
|
|
|
|
consider the first 29 offsets,
|
|
which is the default number of neighbors:
|
|
|
|
* distance of 0:
|
|
`{ 0, 0}`
|
|
* distance of 1:
|
|
`{ 0,-1}, {+1, 0}, {-1, 0}, { 0,+1}`
|
|
* distance of sqrt(2):
|
|
`{-1,-1}, {-1,+1}, {+1,+1}, {+1,-1}`
|
|
* distance of 2:
|
|
`{+2, 0}, {-2, 0}, { 0,+2}, { 0,-2}`
|
|
* distance of sqrt(5):
|
|
`{-1,-2}, {-2,+1}, {-2,-1}, {+1,+2}, {-1,+2}, {+2,-1}, {+1,-2}, {+2,+1}`
|
|
* distance of sqrt(8):
|
|
`{+2,-2}, {-2,-2}, {-2,+2}, {+2,+2}`
|
|
* distance of 3:
|
|
`{+3, 0}, { 0,-3}, {-3, 0}, { 0,+3}`
|
|
|
|
the default neighborhood of 29 yields a (pixelated) circle,
|
|
as in this crude ascii art:
|
|
```
|
|
X
|
|
XXXXX
|
|
XXXXX
|
|
XXXXXXX
|
|
XXXXX
|
|
XXXXX
|
|
X
|
|
```
|
|
|
|
resynth provides a portion of [the associated integer sequence A057961,][A057961]
|
|
allowing the neighborhood to be specified as a radius-like size,
|
|
with guaranteed symmetry about the X and Y axes.
|
|
this is the `-R` flag, and the first few values are visualized here:
|
|
```
|
|
-R1 -R2 -R3 -R4 -R5 -R6 -R7
|
|
|
|
X
|
|
X XXX XXXXX XXXXX
|
|
X XXX XXX XXXXX XXXXX XXXXX
|
|
X XXX XXX XXXXX XXXXX XXXXX XXXXXXX
|
|
X XXX XXX XXXXX XXXXX XXXXX
|
|
X XXX XXXXX XXXXX
|
|
X
|
|
equivalent to
|
|
-N1 -N5 -N9 -N13 -N21 -N25 -N29
|
|
```
|
|
[A057961]: http://oeis.org/A057961
|
|
|
|
## notes
|
|
|
|
includes header libraries from [nothings (stb)][stb] and [notwa (kyaa).][kyaa]
|
|
|
|
[stb]: https://github.com/nothings/stb
|
|
[kyaa]: https://gist.github.com/notwa/5d287d807ffe11bbb553462c9940445c#file-kyaa-md
|
|
|
|
compile like
|
|
```
|
|
clang -std=gnu11 -lm -Ofast resynth.c -o resynth
|
|
```
|
|
|
|
extra flags that i use are
|
|
```
|
|
-Wall -Wextra -Werror=implicit-function-declaration -Winline -Wshadow
|
|
-Wno-unused -Wno-padded -Wno-missing-field-initializers -Wno-misleading-indentation -Wno-disabled-macro-expansion -Wno-language-extension-token -Wno-unknown-warning-option
|
|
```
|