adi_gpu_vulkan/
lib.rs

1// Copyright Jeron A. Lau 2018.
2// Dual-licensed under either the MIT License or the Boost Software License,
3// Version 1.0.  (See accompanying file LICENSE_1_0.txt or copy at
4// https://www.boost.org/LICENSE_1_0.txt)
5
6//! Vulkan implementation for adi_gpu.
7
8// #![no_std]
9
10extern crate asi_vulkan;
11extern crate adi_gpu_base;
12extern crate libc;
13
14/// Transform represents a transformation matrix.
15pub(crate) mod renderer;
16
17pub use base::Shape;
18pub use base::Gradient;
19pub use base::Model;
20pub use base::TexCoords;
21pub use base::Texture;
22
23use adi_gpu_base as base;
24use adi_gpu_base::*;
25
26/// To render anything with adi_gpu, you have to make a `Display`
27pub struct Display {
28	window: adi_gpu_base::Window,
29	renderer: renderer::Renderer,
30}
31
32pub fn new(title: &str, icon: &afi::Video) -> Result<Box<Display>, String> {
33	let (renderer, window) = renderer::Renderer::new(
34		Some((title, icon)),
35		vec3!(0.0, 0.0, 0.0)
36	)?;
37
38	Ok(Box::new(Display { window, renderer }))
39}
40
41impl base::Display for Display {
42	fn color(&mut self, color: (f32, f32, f32)) {
43		self.renderer.bg_color(vec3!(color.0, color.1, color.2));
44	}
45
46	fn update(&mut self) -> Option<adi_gpu_base::Input> {
47		if let Some(input) = self.window.update() {
48			return Some(input);
49		}
50
51		// Update Window:
52		self.renderer.update();
53		// Return None, there was no input, updated screen.
54		None
55	}
56
57	fn camera(&mut self, xyz: Vec3, rotate_xyz: Vec3) {
58		self.renderer.set_camera(xyz, rotate_xyz);
59		self.renderer.camera();
60	}
61
62	fn model(&mut self, vertices: &[f32], fans: Vec<(u32, u32)>) -> Model {
63		Model(self.renderer.model(vertices, fans))
64	}
65
66	fn fog(&mut self, fog: Option<(f32, f32)>) -> () {
67		if let Some(fog) = fog {
68			self.renderer.fog(fog);
69		} else {
70			self.renderer.fog((::std::f32::MAX, 0.0));
71		}
72	}
73
74	fn texture(&mut self, wh: (u16,u16), graphic: &VFrame) -> Texture {
75		let (w, h) = wh;
76		let pixels = graphic.0.as_slice();
77
78		Texture(self.renderer.texture(w, h, pixels), wh.0, wh.1)
79	}
80
81	fn gradient(&mut self, colors: &[f32]) -> Gradient {
82		Gradient(self.renderer.colors(colors))
83	}
84
85	fn texcoords(&mut self, texcoords: &[f32]) -> TexCoords {
86		TexCoords(self.renderer.texcoords(texcoords))
87	}
88
89	fn set_texture(&mut self, texture: &mut Texture, wh: (u16,u16),
90		graphic: &VFrame)
91	{
92		if texture.1 == wh.0 && texture.2 == wh.1 {
93			self.renderer.set_texture(texture.0,
94				graphic.0.as_slice());
95		} else {
96			// resize
97			self.renderer.resize_texture(texture.0, wh.0, wh.1,
98				graphic.0.as_slice());
99		}
100	}
101
102	#[inline(always)]
103	fn shape_solid(&mut self, model: &Model, transform: Transform,
104		color: [f32; 4], blending: bool, fog: bool,
105		camera: bool) -> Shape
106	{
107		base::new_shape(self.renderer.solid(model.0, transform, color,
108			blending, fog, camera))
109	}
110
111	#[inline(always)]
112	fn shape_gradient(&mut self, model: &Model, transform: Transform,
113		colors: Gradient, blending: bool, fog: bool,
114		camera: bool) -> Shape
115	{
116		base::new_shape(self.renderer.gradient(model.0, transform,
117			colors.0, blending, fog, camera))
118	}
119
120	#[inline(always)]
121	fn shape_texture(&mut self, model: &Model, transform: Transform,
122		texture: &Texture, tc: TexCoords, blending: bool,
123		fog: bool, camera: bool) -> Shape
124	{
125		base::new_shape(self.renderer.textured(model.0, transform,
126			texture.0, tc.0, blending, fog, camera))
127	}
128
129	#[inline(always)]
130	fn shape_faded(&mut self, model: &Model, transform: Transform,
131		texture: &Texture, tc: TexCoords, alpha: f32,
132		fog: bool, camera: bool) -> Shape
133	{
134		base::new_shape(self.renderer.faded(model.0, transform,
135			texture.0, tc.0, alpha, fog, camera))
136	}
137
138	#[inline(always)]
139	fn shape_tinted(&mut self, model: &Model, transform: Transform,
140		texture: &Texture, tc: TexCoords, tint: [f32; 4], blending: bool,
141		fog: bool, camera: bool) -> Shape
142	{
143		base::new_shape(self.renderer.tinted(model.0, transform,
144			texture.0, tc.0, tint, blending, fog, camera))
145	}
146
147	#[inline(always)]
148	fn shape_complex(&mut self, model: &Model, transform: Transform,
149		texture: &Texture, tc: TexCoords, tints: Gradient,
150		blending: bool, fog: bool, camera: bool) -> Shape
151	{
152		base::new_shape(self.renderer.complex(model.0, transform,
153			texture.0, tc.0, tints.0, blending, fog, camera))
154	}
155
156	#[inline(always)]
157	fn drop_shape(&mut self, shape: &Shape) {
158		self.renderer.drop_shape(get_shape(&shape));
159	}
160
161	fn transform(&mut self, shape: &Shape, transform: Transform) {
162		self.renderer.transform(&base::get_shape(shape), transform);
163	}
164
165	fn resize(&mut self, wh: (u16, u16)) -> () {
166		self.renderer.resize(wh);
167	}
168
169	fn wh(&self) -> (u16, u16) {
170		self.window.wh()
171	}
172}