Prep for chunk rendering
This commit is contained in:
parent
72712e4d42
commit
7f10580b67
|
@ -529,6 +529,13 @@ impl Uniform {
|
||||||
gl::Uniform4f(self.0, x, y, z, w);
|
gl::Uniform4f(self.0, x, y, z, w);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn set_matrix4(&self, m: &::cgmath::Matrix4<f32>) {
|
||||||
|
use cgmath::Matrix;
|
||||||
|
unsafe {
|
||||||
|
gl::UniformMatrix4fv(self.0, 1, false as u8, m.as_ptr());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Attribute(i32);
|
pub struct Attribute(i32);
|
||||||
|
|
|
@ -26,10 +26,21 @@ use image;
|
||||||
use image::GenericImage;
|
use image::GenericImage;
|
||||||
use byteorder::{WriteBytesExt, NativeEndian};
|
use byteorder::{WriteBytesExt, NativeEndian};
|
||||||
use serde_json;
|
use serde_json;
|
||||||
use cgmath;
|
use cgmath::{self, Vector, Point};
|
||||||
|
|
||||||
const ATLAS_SIZE: usize = 1024;
|
const ATLAS_SIZE: usize = 1024;
|
||||||
|
|
||||||
|
// TEMP
|
||||||
|
const NUM_SAMPLES: i32 = 1;
|
||||||
|
const LIGHT_LEVEL: f32 = 0.8;
|
||||||
|
const SKY_OFFSET: f32 = 1.0;
|
||||||
|
|
||||||
|
pub struct Camera {
|
||||||
|
pub pos: cgmath::Point3<f64>,
|
||||||
|
pub yaw: f64,
|
||||||
|
pub pitch: f64,
|
||||||
|
}
|
||||||
|
|
||||||
pub struct Renderer {
|
pub struct Renderer {
|
||||||
resource_version: usize,
|
resource_version: usize,
|
||||||
pub resources: Arc<RwLock<resources::Manager>>,
|
pub resources: Arc<RwLock<resources::Manager>>,
|
||||||
|
@ -43,6 +54,7 @@ pub struct Renderer {
|
||||||
chunk_shader_alpha: ChunkShaderAlpha,
|
chunk_shader_alpha: ChunkShaderAlpha,
|
||||||
trans_shader: TransShader,
|
trans_shader: TransShader,
|
||||||
|
|
||||||
|
camera: Camera,
|
||||||
perspective_matrix: cgmath::Matrix4<f32>,
|
perspective_matrix: cgmath::Matrix4<f32>,
|
||||||
|
|
||||||
trans: Option<TransInfo>,
|
trans: Option<TransInfo>,
|
||||||
|
@ -154,6 +166,11 @@ impl Renderer {
|
||||||
last_width: 0,
|
last_width: 0,
|
||||||
last_height: 0,
|
last_height: 0,
|
||||||
|
|
||||||
|
camera: Camera {
|
||||||
|
pos: cgmath::Point3::new(0.0, 0.0, 0.0),
|
||||||
|
yaw: 0.0,
|
||||||
|
pitch: ::std::f64::consts::PI,
|
||||||
|
},
|
||||||
perspective_matrix: cgmath::Matrix4::zero(),
|
perspective_matrix: cgmath::Matrix4::zero(),
|
||||||
|
|
||||||
trans: None,
|
trans: None,
|
||||||
|
@ -161,6 +178,7 @@ impl Renderer {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn tick(&mut self, delta: f64, width: u32, height: u32) {
|
pub fn tick(&mut self, delta: f64, width: u32, height: u32) {
|
||||||
|
use std::f64::consts::PI as PI64;
|
||||||
{
|
{
|
||||||
let rm = self.resources.read().unwrap();
|
let rm = self.resources.read().unwrap();
|
||||||
if rm.version() != self.resource_version {
|
if rm.version() != self.resource_version {
|
||||||
|
@ -201,9 +219,31 @@ impl Renderer {
|
||||||
gl::clear(gl::ClearFlags::Color | gl::ClearFlags::Depth);
|
gl::clear(gl::ClearFlags::Color | gl::ClearFlags::Depth);
|
||||||
|
|
||||||
// Chunk rendering
|
// Chunk rendering
|
||||||
|
self.chunk_shader.program.use_program();
|
||||||
|
|
||||||
|
let view_vector = cgmath::Vector3::new(
|
||||||
|
((self.camera.yaw - PI64/2.0).cos() * -self.camera.pitch.cos()) as f32,
|
||||||
|
(-self.camera.pitch.sin()) as f32,
|
||||||
|
(-(self.camera.yaw - PI64/2.0).sin() * -self.camera.pitch.cos()) as f32
|
||||||
|
);
|
||||||
|
let camera = cgmath::Point3::new(-self.camera.pos.x as f32, -self.camera.pos.y as f32, self.camera.pos.z as f32);
|
||||||
|
let camera_matrix = cgmath::Matrix4::look_at(
|
||||||
|
camera,
|
||||||
|
camera + cgmath::Point3::new(-view_vector.x, -view_vector.y, view_vector.z).to_vec(),
|
||||||
|
cgmath::Vector3::new(0.0, -1.0, 0.0)
|
||||||
|
);
|
||||||
|
let camera_matrix = camera_matrix * cgmath::Matrix4::from_nonuniform_scale(-1.0, 1.0, 1.0);
|
||||||
|
|
||||||
|
// TODO Frustum
|
||||||
|
|
||||||
|
self.chunk_shader.perspective_matrix.set_matrix4(&self.perspective_matrix);
|
||||||
|
self.chunk_shader.camera_matrix.set_matrix4(&camera_matrix);
|
||||||
|
self.chunk_shader.texture.set_int(0);
|
||||||
|
self.chunk_shader.light_level.set_float(LIGHT_LEVEL);
|
||||||
|
self.chunk_shader.sky_offset.set_float(SKY_OFFSET);
|
||||||
|
|
||||||
// Line rendering
|
// Line rendering
|
||||||
// Mode rendering
|
// Model rendering
|
||||||
// Cloud rendering
|
// Cloud rendering
|
||||||
|
|
||||||
// Trans chunk rendering
|
// Trans chunk rendering
|
||||||
|
@ -400,8 +440,6 @@ init_shader! {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const NUM_SAMPLES: i32 = 1;
|
|
||||||
|
|
||||||
impl TransInfo {
|
impl TransInfo {
|
||||||
pub fn new(width: u32, height: u32, shader: &TransShader) -> TransInfo {
|
pub fn new(width: u32, height: u32, shader: &TransShader) -> TransInfo {
|
||||||
let trans = gl::Framebuffer::new();
|
let trans = gl::Framebuffer::new();
|
||||||
|
|
Loading…
Reference in New Issue