1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
use crate::math::Color;
use crate::graphics::DrawContext;
use super::{
OpenGlRenderPlatform,
OpenGlContext,
Mat4,
};
use super::context::bindings::types::*;
use super::context::bindings::{
COLOR_BUFFER_BIT,
BLEND,
SRC_ALPHA,
ONE_MINUS_SRC_ALPHA,
COLOR_CLEAR_VALUE,
PACK_ALIGNMENT,
VIEWPORT,
RGBA,
UNSIGNED_BYTE,
};
use super::drawparams::DrawParams;
pub struct Window {
ctx: OpenGlContext,
}
impl Window {
pub fn new(ctx: OpenGlContext) -> Self {
Window { ctx }
}
pub fn clear_color(&mut self, color: Color) {
let (r, g, b, a) = color.rgba();
unsafe {
self.ctx.bindings.ClearColor(r, g, b, a);
}
}
pub fn get_clear_color(&self) -> Color {
let mut array = [0f32; 4];
unsafe {
self.ctx.bindings.GetFloatv(
COLOR_CLEAR_VALUE,
array.as_mut_ptr(),
);
}
Color::create_rgba(array[0], array[1], array[2], array[3])
}
pub fn viewport(&mut self, x: i32, y: i32, width: u32, height: u32) {
unsafe {
self.ctx.bindings.Viewport(
x as GLint,
y as GLint,
width as GLsizei,
height as GLsizei,
);
}
}
pub fn prepare_draw(&mut self, screen_size: (f32, f32), first_pass: bool)
-> DrawContext<OpenGlRenderPlatform>
{
unsafe {
self.ctx.bindings.Enable(BLEND);
self.ctx.bindings.BlendFunc(SRC_ALPHA, ONE_MINUS_SRC_ALPHA);
}
let mut params = DrawParams::new();
params.transform(
Mat4::translate(-1.0, -1.0)
* Mat4::scale(2.0 / screen_size.0, 2.0 / screen_size.1)
);
DrawContext::new(&mut self.ctx, params, first_pass)
}
pub fn clear(&mut self) {
unsafe {
self.ctx.bindings.Clear(COLOR_BUFFER_BIT);
}
}
pub fn flip(&mut self) {
}
pub fn take_screenshot(&self) -> Box<[u8]> {
let mut answer: [GLint; 4] = [0; 4];
unsafe {
self.ctx.bindings.GetIntegerv(VIEWPORT, answer.as_mut_ptr());
self.ctx.bindings.PixelStorei(PACK_ALIGNMENT, 1);
}
let x = answer[0];
let y = answer[1];
let width = answer[2] as GLsizei;
let height = answer[3] as GLsizei;
let pixel_size = 4;
let buflen = pixel_size * (width as usize) * (height as usize);
let mut buffer = vec![0u8; buflen].into_boxed_slice();
unsafe {
self.ctx.bindings.ReadPixels(
x, y,
width, height,
RGBA,
UNSIGNED_BYTE,
buffer.as_mut_ptr() as *mut _,
);
}
buffer
}
}