# FerruX Viewport
Ferrux Viewport is an abstraction layer over the [Pixels](https://crates.io/crates/pixels) crate to manage the drawing of figures and entities on a 3D space. It manages the pixel buffer exposing simple operations to draw pixels, lines and figures in the screen. In its current state it only works with [Winit](https://crates.io/crates/winit).
_FerruX Viewport doesn't perform the pespective projection, it just manages the drawing of points already calculated into the normalized 3D space_
## Usage
### Building a viewport
Right now, the only Viewport provided is WinitCanvas (and one mock for testing), which requires a winit Window, which will need itself an EventLoop reference.
```rust
let event_loop = winit::event_loop::EventLoop::new();
let window = winit::window::Window::new(&event_loop)?;
let viewport = ferrux_viewport::viewport::ViewportFactory::winit(&window, 100)?;
```
### Running the viewport
The main and recommended flow to use the viewport is:
* Use the drawing functions like `draw_line` and `draw_triangle`.
* Call the `render` method to print it on screen.
* Use `reset_frame` to clear the current buffer and draw a new frame.
The following example takes the `Viewport` we built and draws a morphing line into triangles.
```rust
let mut i = 0.0;
let step = 0.05;
let mut incrementing = true;
event_loop.run(move |event, _, control_flow| {
match event {
Event::MainEventsCleared => {
i += if incrementing { step } else { -step };
if i >= 1.0 { incrementing = false } else if i <= 0.0 { incrementing = true }
window.request_redraw();
}
Event::RedrawRequested(_) => {
viewport.fill_triangle((0.0, 0.0, -0.1), (0.0 + i, -0.5 * i/2.0, -0.2), (0.0 + i, -0.3 * i/2.0, -0.2),
&[255, 0, 0, 255]);
viewport.render().expect("render failed");
viewport.reset_buffer();
}
_ => (),
}
```
## Examples
You can run the current example with
```sh
cargo run --package basic_example
```
## About
The FerruX Viewport is a tool developed while creating the FerruXengine, an attempt of 3D graphics engine I was trying to make. I made this viewport as an improvement from my previous tool to manage the use of the Pixels buffer used by the engine (being that the [FerruX Canvas](https://crates.io/crates/ferrux_canvas)).
## License
Licensed, at your option, under either of:
* Apache License, Version 2.0 (LICENSE-APACHE)
* MIT license (LICENSE-MIT)
## Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.