An open API service indexing awesome lists of open source software.

https://github.com/samiperttu/funutd

Procedural texture library
https://github.com/samiperttu/funutd

graphics procedural-generation texture

Last synced: 2 months ago
JSON representation

Procedural texture library

Awesome Lists containing this project

README

        

# FunUTD

[![crates.io](https://img.shields.io/crates/v/funutd.svg)](https://crates.io/crates/funutd)
[![License](https://img.shields.io/crates/l/funutd.svg)](https://github.com/SamiPerttu/funutd/README.md)

## Fun Universal Texture Definitions

FunUTD is a 3-D [procedural texture](https://en.wikipedia.org/wiki/Procedural_texture) library running on the CPU.
This is an alpha version undergoing rapid development and may contain rough edges.

### Features

* Different tiling modes, including tiling of all 3 dimensions
* An endless supply of procedurally generated, self-describing volumetric textures
* Isotropic value noise, isotropic gradient noise and Voronoi bases
* Palette generation with Okhsv and Okhsl color spaces
* Interactive texture explorer (in the example `editor`)
* `no_std` support (enable by disabling the `std` feature)

## Basics

The type returned by texture generators is `Box`.
`Texture` is the trait implemented by procedural textures.

The basic operation is querying the value of a texture at a point in 3-D space
with the `at` method. The value is another 3-D vector.

The canonical range of texture values is -1...1 in each component.
This applies to the palette component as well.

Some components may slightly exceed the range, while others may come under.
Many unary nodes such as `reflect`, `vreflect`, `saturate` and `overdrive` remap
any range back to -1...1.

Data for procedural generation is contained in `Dna` objects, which contain
the necessary context that is threaded through the generation process.
Generator functions draw whatever data they need from the supplied `Dna` object.

Textures can describe themself, that is, print the code that generates them.
This is done using the `get_code` method. Obtained codes can be copied and
pasted around and subjected to further scrutiny.

### Tiling Modes

Tiling modes - whether the texture loops seamlessly for each dimension -
are implemented via a hasher parameter.

Currently implemented tiling modes are:

- `tile_none()` - none of the axes tile.
- `tile_all()` - space is filled with copies of the unit cube and texture
frequencies are rounded to the nearest whole number.
- `tile_xy()` - for each fixed `z`, the `xy` plane is filled with copies
of the unit square, while moving in the `z` dimension produces infinite variation.
Texture frequencies are rounded to the nearest whole number.
- `tile_z()` - moving in the `xy` plane produces infinite variation,
with the texture repeating at integer intervals along the `z` axis only.
Texture frequencies are rounded to the nearest whole number.

To tile a different shape than the unit cube or square:

- `tile_all_in(x, y, z)` - space is filled with copies of `(x, y, z)` sized boxes.
Texture frequencies are rounded to the nearest whole number.
- `tile_xy_in(x, y)` - for each fixed `z`, the `xy` plane is filled with copies
of `(x, y)` sized rectangles, while moving in the `z` dimension produces infinite
variation. Texture frequencies are rounded to the nearest whole number.
- `tile_z_in(z)` - moving in the `xy` plane produces infinite variation,
with the texture repeating at intervals of `z` along the `z` axis only.
Texture frequencies are rounded to the nearest whole number.

## Future

`Dna` objects can be mutated or crossed over to create variations of genotypes
or to optimize a texture for a purpose.

## Texture Explorer

The texture explorer, which is a work in progress,
can be found under the example `editor`.

It supports an explorative workflow: click on one of the small images,
and the other images become its mutations.

The code of the currently selected texture is shown below the large image.
You can copy the code to clipboard by clicking "Copy Code".

Codes can be pasted in source code directly. It is just required to
import the prelude to the paste site (`use funutd::prelude::*;`).

The tree shaped parameters are shown on the right side of the screen,
where they can be edited as well.

### Mutation Modes

The mutation mode determines how mutations are made:

- Any: parameters are changed arbitrarily.
- Finetune: only non-structural parameters are changed.

![](editor_gui.jpg "explorer GUI")

---

## Examples

These examples are from an earlier version of FunUTD.

```rust
palette(
Space::HSL,
0.160739,
0.401973,
0.250040,
0.234684,
displace(
0.10390177,
layer(
2.4686515,
layer(
3.0395193,
noise(4077839245, 11.842703, tile_all()),
vnoise(1246086663, 12.16001, Ease::Smooth5, tile_all()),
),
rotate(
9.744911,
vnoise(3984989388, 8.905142, Ease::Smooth5, tile_all()),
vnoise(168447214, 5.8911786, Ease::Smooth5, tile_all()),
),
),
reflect(
1.884496,
vec3(0.5632216, -0.31983083, -0.7500508),
fractal(
7.6917915,
5,
0.50210387,
2.4051504,
0.0,
2.0523214,
worley_basis(3902470283, tile_all(), 7, 10, 17),
),
),
),
)
```

![](example1.png "texture example")

---

```rust
palette(
Space::HSL,
0.550072,
0.228674,
0.165266,
0.317444,
saturate(
8.597511,
fractal(
5.8026867,
4,
0.5642442,
2.114186,
0.07022904,
1.0159429,
displace(
0.15992701,
voronoi_basis(1401237949, tile_all(), 10, 25, 7),
worley_basis(785949362, tile_all(), 0, 22, 14),
),
),
),
)
```

![](example2.png "texture example")

---

## License

Licensed under either of Apache License, Version 2.0
or MIT license at your option.

Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in FunUTD by you, as defined in the Apache-2.0 license,
shall be dual licensed as above, without any additional terms or conditions.