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
use crate::context::{consts, DataType};
use crate::core::render_target::*;
use crate::core::*;
pub struct Screen {}
impl Screen {
pub fn write<F: FnOnce() -> ThreeDResult<()>>(
context: &Context,
clear_state: ClearState,
render: F,
) -> ThreeDResult<()> {
context.bind_framebuffer(consts::DRAW_FRAMEBUFFER, None);
clear(context, &clear_state);
render()?;
Ok(())
}
pub fn read_color(context: &Context, viewport: Viewport) -> ThreeDResult<Vec<u8>> {
let mut pixels = vec![0u8; viewport.width as usize * viewport.height as usize * 4];
context.bind_framebuffer(consts::READ_FRAMEBUFFER, None);
context.read_pixels_with_u8_data(
viewport.x as u32,
viewport.y as u32,
viewport.width,
viewport.height,
consts::RGBA,
DataType::UnsignedByte,
&mut pixels,
);
Ok(pixels)
}
#[cfg(not(target_arch = "wasm32"))]
pub fn read_depth(context: &Context, viewport: Viewport) -> ThreeDResult<Vec<f32>> {
let mut pixels = vec![0f32; viewport.width as usize * viewport.height as usize];
context.bind_framebuffer(consts::READ_FRAMEBUFFER, None);
context.read_pixels_with_f32_data(
viewport.x as u32,
viewport.y as u32,
viewport.width,
viewport.height,
consts::DEPTH_COMPONENT,
DataType::Float,
&mut pixels,
);
Ok(pixels)
}
pub fn copy_from<T: TextureDataType>(
context: &Context,
color_texture: Option<&Texture2D<T>>,
depth_texture: Option<&DepthTargetTexture2D>,
viewport: Viewport,
write_mask: WriteMask,
) -> ThreeDResult<()> {
Self::write(context, ClearState::none(), || {
copy_from(context, color_texture, depth_texture, viewport, write_mask)
})
}
pub fn copy_from_array<T: TextureDataType>(
context: &Context,
color_texture: Option<(&Texture2DArray<T>, u32)>,
depth_texture: Option<(&DepthTargetTexture2DArray, u32)>,
viewport: Viewport,
write_mask: WriteMask,
) -> ThreeDResult<()> {
Self::write(context, ClearState::none(), || {
copy_from_array(context, color_texture, depth_texture, viewport, write_mask)
})
}
}