Added terrain pipeline

This commit is contained in:
Joshua Barretto 2019-01-14 23:13:58 +00:00
parent ae4f1ae2ea
commit bd561dd1aa
21 changed files with 215 additions and 11 deletions

View File

@ -9,3 +9,4 @@ specs = "0.14"
shred = "0.7" shred = "0.7"
vek = "0.9" vek = "0.9"
dot_vox = "1.0" dot_vox = "1.0"
threadpool = "1.7"

View File

@ -5,5 +5,6 @@ pub mod comp;
pub mod figure; pub mod figure;
pub mod state; pub mod state;
pub mod terrain; pub mod terrain;
pub mod util;
pub mod volumes; pub mod volumes;
pub mod vol; pub mod vol;

1
common/src/util/mod.rs Normal file
View File

@ -0,0 +1 @@
pub mod worker_pool;

View File

@ -0,0 +1,10 @@
// Library
use threadpool::ThreadPool;
pub struct WorkerPool {
thread_pool: ThreadPool,
}
impl WorkerPool {
}

View File

@ -3,6 +3,7 @@
in vec3 f_pos; in vec3 f_pos;
in vec3 f_norm; in vec3 f_norm;
in vec3 f_col; in vec3 f_col;
flat in uint f_bone_idx;
layout (std140) layout (std140)
uniform u_locals { uniform u_locals {
@ -20,10 +21,23 @@ uniform u_globals {
vec4 tick; vec4 tick;
}; };
struct BoneData {
mat4 bone_mat;
};
layout (std140)
uniform u_bones {
BoneData bones[16];
};
out vec4 tgt_color; out vec4 tgt_color;
void main() { void main() {
vec3 world_norm = (model_mat * vec4(f_norm, 0.0)).xyz; vec3 world_norm = (
model_mat *
bones[f_bone_idx].bone_mat *
vec4(f_norm, 0.0)
).xyz;
float ambient = 0.5; float ambient = 0.5;

View File

@ -33,11 +33,13 @@ uniform u_bones {
out vec3 f_pos; out vec3 f_pos;
out vec3 f_norm; out vec3 f_norm;
out vec3 f_col; out vec3 f_col;
flat out uint f_bone_idx;
void main() { void main() {
f_pos = v_pos; f_pos = v_pos;
f_norm = v_norm; f_norm = v_norm;
f_col = v_col; f_col = v_col;
f_bone_idx = v_bone_idx;
gl_Position = gl_Position =
proj_mat * proj_mat *

View File

@ -0,0 +1,33 @@
#version 330 core
in vec3 f_pos;
in vec3 f_norm;
in vec3 f_col;
layout (std140)
uniform u_locals {
vec3 model_offs;
};
layout (std140)
uniform u_globals {
mat4 view_mat;
mat4 proj_mat;
vec4 cam_pos;
vec4 focus_pos;
vec4 view_distance;
vec4 time_of_day;
vec4 tick;
};
out vec4 tgt_color;
void main() {
float ambient = 0.5;
vec3 sun_dir = normalize(vec3(1.3, 1.7, 1.1));
float sun_diffuse = dot(sun_dir, f_norm) * 0.5;
tgt_color = vec4(f_col * (ambient + sun_diffuse), 1.0);
}

View File

@ -0,0 +1,36 @@
#version 330 core
in vec3 v_pos;
in vec3 v_norm;
in vec3 v_col;
layout (std140)
uniform u_locals {
vec3 model_offs;
};
layout (std140)
uniform u_globals {
mat4 view_mat;
mat4 proj_mat;
vec4 cam_pos;
vec4 focus_pos;
vec4 view_distance;
vec4 time_of_day;
vec4 tick;
};
out vec3 f_pos;
out vec3 f_norm;
out vec3 f_col;
void main() {
f_pos = v_pos;
f_norm = v_norm;
f_col = v_col;
gl_Position =
proj_mat *
view_mat *
vec4(v_pos + model_offs, 1);
}

View File

@ -17,8 +17,8 @@ impl Animation for RunAnimation {
skeleton: &mut Self::Skeleton, skeleton: &mut Self::Skeleton,
time: f64, time: f64,
) { ) {
let wave = (time as f32 * 8.0).sin(); let wave = (time as f32 * 12.0).sin();
let wave_fast = (time as f32 * 4.0).sin(); let wave_fast = (time as f32 * 6.0).sin();
skeleton.head.offset = Vec3::unit_z() * 13.0; skeleton.head.offset = Vec3::unit_z() * 13.0;
skeleton.head.ori = Quaternion::rotation_z(wave * 0.3); skeleton.head.ori = Quaternion::rotation_z(wave * 0.3);
@ -27,16 +27,18 @@ impl Animation for RunAnimation {
skeleton.chest.ori = Quaternion::rotation_z(wave * 0.3); skeleton.chest.ori = Quaternion::rotation_z(wave * 0.3);
skeleton.belt.offset = Vec3::unit_z() * 7.0; skeleton.belt.offset = Vec3::unit_z() * 7.0;
skeleton.belt.ori = Quaternion::rotation_z(wave * 0.3); skeleton.belt.ori = Quaternion::rotation_z(wave * 0.2);
skeleton.shorts.offset = Vec3::unit_z() * 4.0; skeleton.shorts.offset = Vec3::unit_z() * 4.0;
skeleton.shorts.ori = Quaternion::rotation_z(wave * 0.3); skeleton.shorts.ori = Quaternion::rotation_z(wave * 0.1);
skeleton.l_hand.offset = Vec3::new(-8.0, wave * 5.0, 9.0); skeleton.l_hand.offset = Vec3::new(-7.5, wave * 5.0, 9.0);
skeleton.r_hand.offset = Vec3::new(8.0, -wave * 5.0, 9.0); skeleton.r_hand.offset = Vec3::new(7.5, -wave * 5.0, 9.0);
skeleton.l_foot.offset = Vec3::new(-3.5, -wave * 4.0, -(wave_fast.abs() - 0.5).abs() * 4.0); skeleton.l_foot.offset = Vec3::new(-3.5, 2.0 - wave * 8.0, 3.5 - (wave_fast.abs() - 0.5).abs() * 4.0);
skeleton.r_foot.offset = Vec3::new(3.5, wave * 4.0, -(wave_fast.abs() - 0.5).abs() * 4.0); skeleton.l_foot.ori = Quaternion::rotation_x(-wave + 1.0);
skeleton.r_foot.offset = Vec3::new(3.5, 2.0 + wave * 8.0, 3.5 - (wave_fast.abs() - 0.5).abs() * 4.0);
skeleton.r_foot.ori = Quaternion::rotation_x(wave + 1.0);
skeleton.back.offset = Vec3::new(-8.0, 5.0, 16.0); skeleton.back.offset = Vec3::new(-8.0, 5.0, 16.0);
skeleton.back.ori = Quaternion::rotation_y(2.5); skeleton.back.ori = Quaternion::rotation_y(2.5);

View File

@ -23,6 +23,10 @@ pub use self::{
SkyboxPipeline, SkyboxPipeline,
Locals as SkyboxLocals, Locals as SkyboxLocals,
}, },
terrain::{
TerrainPipeline,
Locals as TerrainLocals,
},
}, },
}; };

View File

@ -1,5 +1,6 @@
pub mod figure; pub mod figure;
pub mod skybox; pub mod skybox;
pub mod terrain;
// Library // Library
use gfx::{ use gfx::{

View File

@ -0,0 +1,68 @@
// Library
use gfx::{
self,
// Macros
gfx_defines,
gfx_vertex_struct_meta,
gfx_constant_struct_meta,
gfx_impl_struct_meta,
gfx_pipeline,
gfx_pipeline_inner,
};
use vek::*;
// Local
use super::{
Globals,
super::{
Pipeline,
TgtColorFmt,
TgtDepthFmt,
},
};
gfx_defines! {
vertex Vertex {
pos: [f32; 3] = "v_pos",
norm: [f32; 3] = "v_norm",
col: [f32; 3] = "v_col",
}
constant Locals {
model_offs: [f32; 3] = "model_offs",
}
pipeline pipe {
vbuf: gfx::VertexBuffer<Vertex> = (),
locals: gfx::ConstantBuffer<Locals> = "u_locals",
globals: gfx::ConstantBuffer<Globals> = "u_globals",
tgt_color: gfx::RenderTarget<TgtColorFmt> = "tgt_color",
tgt_depth: gfx::DepthTarget<TgtDepthFmt> = gfx::preset::depth::LESS_EQUAL_WRITE,
}
}
impl Vertex {
pub fn new(pos: Vec3<f32>, norm: Vec3<f32>, col: Rgb<f32>) -> Self {
Self {
pos: pos.into_array(),
col: col.into_array(),
norm: norm.into_array(),
}
}
}
impl Locals {
pub fn default() -> Self {
Self {
model_offs: [0.0; 3],
}
}
}
pub struct TerrainPipeline;
impl Pipeline for TerrainPipeline {
type Vertex = Vertex;
}

View File

@ -17,6 +17,7 @@ use super::{
Globals, Globals,
figure, figure,
skybox, skybox,
terrain,
}, },
}; };
@ -43,6 +44,7 @@ pub struct Renderer {
skybox_pipeline: GfxPipeline<skybox::pipe::Init<'static>>, skybox_pipeline: GfxPipeline<skybox::pipe::Init<'static>>,
figure_pipeline: GfxPipeline<figure::pipe::Init<'static>>, figure_pipeline: GfxPipeline<figure::pipe::Init<'static>>,
terrain_pipeline: GfxPipeline<terrain::pipe::Init<'static>>,
} }
impl Renderer { impl Renderer {
@ -70,6 +72,14 @@ impl Renderer {
include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/shaders/figure.frag")), include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/shaders/figure.frag")),
)?; )?;
// Construct a pipeline for rendering terrain
let terrain_pipeline = create_pipeline(
&mut factory,
terrain::pipe::new(),
include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/shaders/terrain.vert")),
include_bytes!(concat!(env!("CARGO_MANIFEST_DIR"), "/shaders/terrain.frag")),
)?;
Ok(Self { Ok(Self {
device, device,
encoder: factory.create_command_buffer().into(), encoder: factory.create_command_buffer().into(),
@ -80,6 +90,7 @@ impl Renderer {
skybox_pipeline, skybox_pipeline,
figure_pipeline, figure_pipeline,
terrain_pipeline,
}) })
} }
@ -164,6 +175,26 @@ impl Renderer {
}, },
); );
} }
/// Queue the rendering of the provided terrain chunk model in the upcoming frame.
pub fn render_terrain_chunk(
&mut self,
model: &Model<terrain::TerrainPipeline>,
globals: &Consts<Globals>,
locals: &Consts<terrain::Locals>,
) {
self.encoder.draw(
&model.slice,
&self.terrain_pipeline.pso,
&terrain::pipe::Data {
vbuf: model.vbuf.clone(),
locals: locals.buf.clone(),
globals: globals.buf.clone(),
tgt_color: self.tgt_color_view.clone(),
tgt_depth: self.tgt_depth_view.clone(),
},
);
}
} }
struct GfxPipeline<P: gfx::pso::PipelineInit> { struct GfxPipeline<P: gfx::pso::PipelineInit> {

View File

@ -82,8 +82,8 @@ impl Scene {
Some(load_segment("pants.vox").generate_mesh_with_offset(Vec3::new(-5.0, -3.0, 0.0))), Some(load_segment("pants.vox").generate_mesh_with_offset(Vec3::new(-5.0, -3.0, 0.0))),
Some(load_segment("hand.vox").generate_mesh_with_offset(Vec3::new(-2.0, -2.0, -1.0))), Some(load_segment("hand.vox").generate_mesh_with_offset(Vec3::new(-2.0, -2.0, -1.0))),
Some(load_segment("hand.vox").generate_mesh_with_offset(Vec3::new(-2.0, -2.0, -1.0))), Some(load_segment("hand.vox").generate_mesh_with_offset(Vec3::new(-2.0, -2.0, -1.0))),
Some(load_segment("foot.vox").generate_mesh_with_offset(Vec3::new(-2.5, -3.0, 0.0))), Some(load_segment("foot.vox").generate_mesh_with_offset(Vec3::new(-2.5, -3.0, -2.0))),
Some(load_segment("foot.vox").generate_mesh_with_offset(Vec3::new(-2.5, -3.0, 0.0))), Some(load_segment("foot.vox").generate_mesh_with_offset(Vec3::new(-2.5, -3.0, -2.0))),
Some(load_segment("sword.vox").generate_mesh_with_offset(Vec3::new(-6.5, -1.0, 0.0))), Some(load_segment("sword.vox").generate_mesh_with_offset(Vec3::new(-6.5, -1.0, 0.0))),
None, None,
None, None,

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.