rust/lib-hedgewars-engine/src/render/camera.rs
author alfadur
Wed, 27 Mar 2019 23:26:58 +0300
changeset 14726 75ff5c643004
parent 14718 5915a199cb81
child 15120 febccab419b1
permissions -rw-r--r--
actually atlas tests were also broken
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14704
12db7e435ea6 move camera into engine
alfadur
parents:
diff changeset
     1
use integral_geometry::{Point, Rect, Size};
12db7e435ea6 move camera into engine
alfadur
parents:
diff changeset
     2
12db7e435ea6 move camera into engine
alfadur
parents:
diff changeset
     3
#[derive(Debug)]
12db7e435ea6 move camera into engine
alfadur
parents:
diff changeset
     4
pub struct Camera {
12db7e435ea6 move camera into engine
alfadur
parents:
diff changeset
     5
    pub position: Point,
12db7e435ea6 move camera into engine
alfadur
parents:
diff changeset
     6
    pub zoom: f32,
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
     7
    size: Size,
14704
12db7e435ea6 move camera into engine
alfadur
parents:
diff changeset
     8
}
12db7e435ea6 move camera into engine
alfadur
parents:
diff changeset
     9
12db7e435ea6 move camera into engine
alfadur
parents:
diff changeset
    10
impl Camera {
12db7e435ea6 move camera into engine
alfadur
parents:
diff changeset
    11
    pub fn new() -> Self {
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    12
        Self::with_size(Size::new(1024, 768))
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    13
    }
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    14
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    15
    pub fn with_size(size: Size) -> Self {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    16
        Self {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    17
            position: Point::ZERO,
14708
19358c313ebb fix texture initialization
alfadur
parents: 14705
diff changeset
    18
            zoom: 1.0,
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    19
            size,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    20
        }
14704
12db7e435ea6 move camera into engine
alfadur
parents:
diff changeset
    21
    }
12db7e435ea6 move camera into engine
alfadur
parents:
diff changeset
    22
12db7e435ea6 move camera into engine
alfadur
parents:
diff changeset
    23
    pub fn viewport(&self) -> Rect {
14709
65c971417780 fix zoom
alfadur
parents: 14708
diff changeset
    24
        #[inline]
65c971417780 fix zoom
alfadur
parents: 14708
diff changeset
    25
        fn scale(value: usize, zoom: f32) -> i32 {
65c971417780 fix zoom
alfadur
parents: 14708
diff changeset
    26
            (value as f32 / zoom / 2.0) as i32
65c971417780 fix zoom
alfadur
parents: 14708
diff changeset
    27
        }
65c971417780 fix zoom
alfadur
parents: 14708
diff changeset
    28
        let half_width = scale(self.size.width, self.zoom);
65c971417780 fix zoom
alfadur
parents: 14708
diff changeset
    29
        let half_height = scale(self.size.height, self.zoom);
65c971417780 fix zoom
alfadur
parents: 14708
diff changeset
    30
        Rect::from_box(
65c971417780 fix zoom
alfadur
parents: 14708
diff changeset
    31
            self.position.x - half_width,
65c971417780 fix zoom
alfadur
parents: 14708
diff changeset
    32
            self.position.x + half_width,
65c971417780 fix zoom
alfadur
parents: 14708
diff changeset
    33
            self.position.y - half_height,
65c971417780 fix zoom
alfadur
parents: 14708
diff changeset
    34
            self.position.y + half_height,
65c971417780 fix zoom
alfadur
parents: 14708
diff changeset
    35
        )
14704
12db7e435ea6 move camera into engine
alfadur
parents:
diff changeset
    36
    }
14718
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    37
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    38
    pub fn projection(&self) -> [f32; 16] {
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    39
        let viewport = self.viewport();
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    40
        let left = viewport.left() as f32;
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    41
        let width = viewport.width() as f32;
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    42
        let height = viewport.height() as f32;
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    43
        let top = viewport.top() as f32;
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    44
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    45
        [
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    46
            2f32 / width,
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    47
            0f32,
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    48
            0f32,
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    49
            0f32,
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    50
            0f32,
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    51
            2f32 / -height,
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    52
            0f32,
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    53
            0f32,
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    54
            0f32,
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    55
            0f32,
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    56
            0.5f32,
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    57
            0f32,
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    58
            -(2.0 * left + width) / width,
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    59
            (2.0 * top + height) / height,
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    60
            0.5f32,
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    61
            1f32,
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    62
        ]
5915a199cb81 move projection matrix into camera
alfadur
parents: 14709
diff changeset
    63
    }
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14704
diff changeset
    64
}