vxdraw 0.2.2

Simple 2D rendering library
Documentation
# VxDraw - Simple 2D rendering for Rust #
[![Latest Version][s1]][l1] [![docs.rs][s4]][l4]

[s1]: https://img.shields.io/crates/v/vxdraw.svg
[l1]: https://crates.io/crates/vxdraw
[s4]: https://docs.rs/vxdraw/badge.svg
[l4]: https://docs.rs/vxdraw/

## Introduction ##

`vxdraw` is a rendering library for drawing sprites, text, and streaming textures to a window. It is not an engine, just a library, and has no runtime.

Note: This software is in its early stages and has only been built to satisfy the requirements of a work in progress. There will be some rough edges. Any contributions are very much welcome. Currently only Vulkan is supported as a back-end.

## Features and Motivation ##

Documentation of the API can be found on https://docs.rs/vxdraw.

`vxdraw` is made for streaming changing sprites to the GPU, and is meant mainly for video games with animated, moving, and/or deforming sprites. If no sprite changes are made, the data is not re-uploaded to the GPU for the sake of efficiency.

`vxdraw` packs data tightly to acquire near-optimal GPU-upload performance. Its main organization point is the `layer` - which defines an absolute draw ordering. A layer is a collection of the same type of drawable item, of which there are 4:

 * dyntex - Dynamic Textures, sprites based on a single texture
 * strtex - Streaming Texture, sprites based on a texture of which pixels can be edited
 * quads - Colored 4-point shape
 * text - Font rendering and letter control

And finally a pseudo-layer for debugging

 * debtri - Debug triangle, triangles that are always drawn on top of everything else. Mainly to check if something works or to implement a quick-and-dirty visual tool to check a condition in code.

Further features:

 * Custom blend modes (per-layer)
 * Filter mode (per-layer)
 * Fixed or dynamic perspective matrices (per-layer)
 * User-supplied vertex/fragment shaders for quads, text, dyntex, and strtex (per-layer)

### Snapshot Testing ###
`vxdraw` allows for snapshot testing by retrieving the full frame data.

### Benchmark Results ###

Here are benchmark results running `cargo bench` on an AMD Vega 56 video card:

    test debtri::tests::bench_rotating_windmills_no_render                      ... bench:         855 ns/iter (+/- 77)
    test debtri::tests::bench_rotating_windmills_only                           ... bench:      57,253 ns/iter (+/- 8,600)
    test debtri::tests::bench_rotating_windmills_set_color                      ... bench:      64,500 ns/iter (+/- 25,971)
    test debtri::tests::bench_simple_triangle                                   ... bench:      50,443 ns/iter (+/- 5,055)
    test debtri::tests::bench_still_windmills                                   ... bench:      52,454 ns/iter (+/- 5,280)
    test debtri::tests::bench_windmills_set_color                               ... bench:           8 ns/iter (+/- 2)
    test dyntex::tests::animated_fireballs_20x20_uvs2                           ... bench:     114,045 ns/iter (+/- 31,969)
    test dyntex::tests::bench_many_particles                                    ... bench:      58,473 ns/iter (+/- 12,086)
    test dyntex::tests::bench_many_sprites                                      ... bench:   3,250,726 ns/iter (+/- 119,911)
    test dyntex::tests::bench_push_and_pop_sprite                               ... bench:          31 ns/iter (+/- 4)
    test dyntex::tests::bench_push_and_pop_texture                              ... bench:  55,676,043 ns/iter (+/- 56,986,205)
    test strtex::tests::adding_sprites                                          ... bench:          23 ns/iter (+/- 2)
    test strtex::tests::bench_streaming_texture_set_500x500_area                ... bench:          10 ns/iter (+/- 1)
    test strtex::tests::bench_streaming_texture_set_500x500_area_using_iterator ... bench:   2,636,501 ns/iter (+/- 374,451)
    test strtex::tests::bench_streaming_texture_set_single_pixel                ... bench:          10 ns/iter (+/- 1)
    test strtex::tests::bench_streaming_texture_set_single_pixel_while_drawing  ... bench:      65,817 ns/iter (+/- 10,654)
    test strtex::tests::generate_perlin_noise                                   ... bench:   1,895,628 ns/iter (+/- 820,344)
    test tests::clears_per_second                                               ... bench:      48,371 ns/iter (+/- 8,677)
    test text::tests::text_flag                                                 ... bench:      75,114 ns/iter (+/- 28,652)

## Example Outputs ##

* Multiple sprites of the same texture with different opacity settings
![result-1]tests/vxdraw/bunch_of_different_opacity_sprites.png

* Linear filtering mode on a 3-colored texture
![result-2]tests/vxdraw/linear_filtering_mode.png

* Various quads
![result-3]tests/vxdraw/quad_mass_manip.png