rust/lib-hedgewars-engine/src/render/map.rs
author alfadur
Fri, 22 Mar 2019 23:45:59 +0300
changeset 14714 4df1aac5f090
parent 14705 19122a329774
child 14718 5915a199cb81
permissions -rw-r--r--
a bit of cleanup
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
14714
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
     1
use integral_geometry::{GridIndex, Point, Rect, Size};
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
     2
use land2d::Land2D;
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
     3
use vec2d::Vec2D;
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
     4
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
     5
use super::gl::{
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
     6
    Buffer, InputElement, InputFormat, InputLayout, Shader, Texture2D, VariableBinding,
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
     7
};
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
     8
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
     9
// TODO: temp
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    10
const VERTEX_SHADER: &'static str = r#"
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    11
#version 150
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    12
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    13
in vec2 Position;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    14
in vec3 Uv;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    15
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    16
out vec3 a_Uv;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    17
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    18
//uniform Common {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    19
uniform mat4 Projection;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    20
//};
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    21
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    22
void main()
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    23
{
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    24
	a_Uv = Uv;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    25
	gl_Position = Projection * vec4(Position, 0.0, 1.0);
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    26
}
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    27
"#;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    28
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    29
const PIXEL_SHADER: &'static str = r#"
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    30
#version 150
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    31
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    32
in vec3 a_Uv;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    33
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    34
uniform sampler2D Texture;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    35
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    36
out vec4 Target;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    37
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    38
void main()
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    39
{
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    40
	 Target = texture2D(Texture, a_Uv.xy);
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    41
}
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    42
"#;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    43
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    44
pub struct MapTile {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    45
    // either index into GL texture array or emulated [Texture; N]
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    46
    texture_index: u32,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    47
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    48
    width: u32,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    49
    height: u32,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    50
}
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    51
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    52
#[repr(C)]
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    53
#[derive(Copy, Clone)]
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    54
pub struct TileVertex {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    55
    pos: [f32; 2],
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    56
    // doesn't hurt to include another float, just in case..
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    57
    uv: [f32; 3],
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    58
}
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    59
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    60
pub struct DrawTile {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    61
    texture_index: u32,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    62
    index_len: u32,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    63
}
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    64
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    65
pub struct MapRenderer {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    66
    tiles: Vec<MapTile>,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    67
    textures: Vec<Texture2D>,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    68
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    69
    tile_vertex_buffer: Buffer,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    70
    tile_index_buffer: Buffer,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    71
    tile_vertices: Vec<TileVertex>,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    72
    tile_indices: Vec<u16>,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    73
    tile_draw_calls: Vec<DrawTile>,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    74
    index_offset: u16,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    75
    tile_shader: Shader,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    76
    tile_layout: InputLayout,
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
    77
14714
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
    78
    tile_size: Size,
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
    79
    num_tile_x: usize,
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    80
}
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    81
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    82
impl MapRenderer {
14714
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
    83
    pub fn new(tile_size: Size) -> Self {
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
    84
        debug_assert!(tile_size.is_power_of_two());
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
    85
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    86
        let tile_shader = Shader::new(
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    87
            VERTEX_SHADER,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    88
            Some(PIXEL_SHADER),
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    89
            &[
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    90
                VariableBinding::Attribute("Position", 0),
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    91
                VariableBinding::Attribute("Uv", 1),
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    92
                VariableBinding::Sampler("Texture", 0),
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
    93
            ],
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
    94
        )
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
    95
        .unwrap();
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    96
14714
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
    97
        let vertex_size = std::mem::size_of::<TileVertex>() as u32;
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    98
        let tile_layout = InputLayout::new(vec![
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
    99
            // position
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   100
            InputElement {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   101
                shader_slot: 0,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   102
                buffer_slot: 0,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   103
                format: InputFormat::Float(gl::FLOAT, false),
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   104
                components: 2,
14714
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   105
                stride: vertex_size,
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   106
                offset: 0,
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   107
            },
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   108
            // uv
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   109
            InputElement {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   110
                shader_slot: 1,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   111
                buffer_slot: 0,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   112
                format: InputFormat::Float(gl::FLOAT, false),
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   113
                components: 3,
14714
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   114
                stride: vertex_size,
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   115
                offset: 8,
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   116
            },
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   117
        ]);
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   118
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   119
        MapRenderer {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   120
            tiles: Vec::new(),
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   121
            textures: Vec::new(),
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   122
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   123
            tile_vertex_buffer: Buffer::empty(gl::ARRAY_BUFFER, gl::DYNAMIC_DRAW),
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   124
            tile_index_buffer: Buffer::empty(gl::ELEMENT_ARRAY_BUFFER, gl::DYNAMIC_DRAW),
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   125
            tile_vertices: Vec::new(),
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   126
            tile_indices: Vec::new(),
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   127
            index_offset: 0,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   128
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   129
            tile_draw_calls: Vec::new(),
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   130
            tile_shader,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   131
            tile_layout,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   132
14714
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   133
            tile_size,
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   134
            num_tile_x: 0,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   135
        }
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   136
    }
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   137
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   138
    pub fn init(&mut self, land: &Vec2D<u32>) {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   139
        // clear tiles, but keep our textures for potential re-use
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   140
        self.tiles.clear();
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   141
14714
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   142
        let tw = self.tile_size.width;
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   143
        let th = self.tile_size.height;
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   144
        let lw = land.width();
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   145
        let lh = land.height();
14714
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   146
        let num_tile_x = lw / tw;
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   147
        let num_tile_y = lh / th;
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   148
14714
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   149
        self.num_tile_x = num_tile_x;
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   150
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   151
        for y in 0..num_tile_y {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   152
            for x in 0..num_tile_x {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   153
                let idx = x + y * num_tile_x;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   154
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   155
                let (data, stride) = {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   156
                    let bpp = 4;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   157
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   158
                    let offset = x * tw * bpp + y * th * lw * bpp;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   159
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   160
                    let data = unsafe { &land.as_bytes()[offset..] };
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   161
                    let stride = land.width();
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   162
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   163
                    (data, stride as u32)
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   164
                };
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   165
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   166
                let texture_index = if idx >= self.textures.len() {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   167
                    let texture = Texture2D::with_data(
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   168
                        data,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   169
                        stride,
14714
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   170
                        self.tile_size.width as u32,
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   171
                        self.tile_size.height as u32,
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   172
                        gl::RGBA8,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   173
                        gl::RGBA,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   174
                        gl::UNSIGNED_BYTE,
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   175
                        gl::NEAREST,
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   176
                    );
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   177
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   178
                    let texture_index = self.textures.len();
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   179
                    self.textures.push(texture);
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   180
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   181
                    texture_index
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   182
                } else {
14714
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   183
                    let texture_region = Rect::at_origin(self.tile_size);
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   184
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   185
                    self.textures[idx].update(
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   186
                        texture_region,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   187
                        data,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   188
                        stride,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   189
                        gl::RGBA,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   190
                        gl::UNSIGNED_BYTE,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   191
                    );
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   192
                    idx
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   193
                };
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   194
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   195
                let tile = MapTile {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   196
                    texture_index: texture_index as u32,
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   197
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   198
                    // TODO: are there ever non-power of two textures?
14714
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   199
                    width: self.tile_size.width as u32,
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   200
                    height: self.tile_size.height as u32,
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   201
                };
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   202
                self.tiles.push(tile);
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   203
            }
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   204
        }
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   205
    }
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   206
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   207
    pub fn update(&mut self, land: &Land2D<u32>, region: Rect) {}
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   208
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   209
    pub fn render(&mut self, viewport: Rect) {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   210
        self.tile_vertices.clear();
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   211
        self.tile_indices.clear();
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   212
        self.tile_draw_calls.clear();
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   213
        self.index_offset = 0;
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   214
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   215
        for (idx, tile) in self.tiles.iter().enumerate() {
14714
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   216
            let tile_x = idx % self.num_tile_x;
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   217
            let tile_y = idx / self.num_tile_x;
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   218
            let tile_w = self.tile_size.width;
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   219
            let tile_h = self.tile_size.width;
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   220
14714
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   221
            let origin = Point::new((tile_x * tile_w) as i32, (tile_y * tile_h) as i32);
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   222
            let tile_rect = Rect::from_size(origin, self.tile_size);
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   223
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   224
            if viewport.intersects(&tile_rect) {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   225
                // lazy
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   226
                //dbg!(origin);
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   227
                let tile_x = origin.x as f32;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   228
                let tile_y = origin.y as f32;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   229
                let tile_w = tile_x + tile_w as f32;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   230
                let tile_h = tile_y + tile_h as f32;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   231
                let uv_depth = tile.texture_index as f32;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   232
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   233
                //dbg!(tile_x);
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   234
                let tl = TileVertex {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   235
                    pos: [tile_x, tile_y],
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   236
                    uv: [0f32, 0f32, uv_depth],
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   237
                };
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   238
                let bl = TileVertex {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   239
                    pos: [tile_x, tile_h],
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   240
                    uv: [0f32, 1f32, uv_depth],
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   241
                };
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   242
                let br = TileVertex {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   243
                    pos: [tile_w, tile_h],
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   244
                    uv: [1f32, 1f32, uv_depth],
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   245
                };
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   246
                let tr = TileVertex {
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   247
                    pos: [tile_w, tile_y],
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   248
                    uv: [1f32, 0f32, uv_depth],
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   249
                };
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   250
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   251
                self.tile_vertices.extend(&[tl, bl, br, tr]);
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   252
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   253
                let i = self.index_offset;
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   254
                self.tile_indices
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   255
                    .extend(&[i + 0, i + 1, i + 2, i + 2, i + 3, i + 0]);
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   256
                self.index_offset += 4;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   257
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   258
                self.tile_draw_calls.push(DrawTile {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   259
                    texture_index: tile.texture_index,
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   260
                    index_len: 6,
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   261
                });
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   262
            }
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   263
        }
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   264
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   265
        self.tile_vertex_buffer.write_typed(&self.tile_vertices);
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   266
        self.tile_index_buffer.write_typed(&self.tile_indices);
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   267
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   268
        let _g = self.tile_layout.bind(
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   269
            &[(0, &self.tile_vertex_buffer)],
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   270
            Some(&self.tile_index_buffer),
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   271
        );
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   272
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   273
        let ortho = {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   274
            let l = viewport.left() as f32;
14714
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   275
            let w = viewport.width() as f32;
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   276
            let h = viewport.height() as f32;
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   277
            let t = viewport.top() as f32;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   278
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   279
            [
14714
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   280
                2f32 / w,
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   281
                0f32,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   282
                0f32,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   283
                0f32,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   284
                0f32,
14714
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   285
                2f32 / -h,
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   286
                0f32,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   287
                0f32,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   288
                0f32,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   289
                0f32,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   290
                0.5f32,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   291
                0f32,
14714
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   292
                -(2.0 * l + w) / w,
4df1aac5f090 a bit of cleanup
alfadur
parents: 14705
diff changeset
   293
                (2.0 * t + h) / h,
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   294
                0.5f32,
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   295
                1f32,
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   296
            ]
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   297
        };
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   298
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   299
        self.tile_shader.bind();
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   300
        self.tile_shader.set_matrix("Projection", ortho.as_ptr());
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   301
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   302
        let mut draw_offset = 0;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   303
        for draw_call in &self.tile_draw_calls {
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   304
            unsafe {
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   305
                self.tile_shader
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   306
                    .bind_texture_2d(0, &self.textures[draw_call.texture_index as usize]);
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   307
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   308
                gl::DrawElements(
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   309
                    gl::TRIANGLES,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   310
                    draw_call.index_len as i32,
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   311
                    gl::UNSIGNED_SHORT,
14705
19122a329774 make world renderer optional + fmt
alfadur
parents: 14702
diff changeset
   312
                    draw_offset as *const _,
14702
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   313
                );
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   314
            }
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   315
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   316
            draw_offset += draw_call.index_len * 2;
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   317
        }
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   318
    }
29dbe9ce8b7d add basic map rendering with gl
fkaa
parents:
diff changeset
   319
}