1extern crate asi_vulkan;
11extern crate adi_gpu_base;
12extern crate libc;
13
14pub(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
26pub 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 self.renderer.update();
53 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 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}