Merge branch 'return_of_the_crab'
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Sijmen 2021-06-02 17:21:15 +02:00
commit 023d010c84
Signed by: vijfhoek
GPG key ID: 82D05C89B28B0DAE
8 changed files with 221 additions and 7 deletions

9
.drone.yml Normal file
View file

@ -0,0 +1,9 @@
kind: pipeline
type: docker
name: frontend
steps:
- name: dependencies
image: rust:slim
commands:
- cargo doc

84
Cargo.lock generated
View file

@ -85,6 +85,12 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
[[package]]
name = "base64"
version = "0.12.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff"
[[package]] [[package]]
name = "bit-set" name = "bit-set"
version = "0.5.2" version = "0.5.2"
@ -805,6 +811,43 @@ dependencies = [
"web-sys", "web-sys",
] ]
[[package]]
name = "gltf"
version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ff38b75359a0096dd0a8599b6e4f37a6ee41d5df300cc7669e62aafa697f7a2"
dependencies = [
"base64",
"byteorder",
"gltf-json",
"image",
"lazy_static",
]
[[package]]
name = "gltf-derive"
version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f2a9333e0f9c7bca94dfc20bcf44fa12a61eeec662d6e007563ff748aa59c70"
dependencies = [
"inflections",
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "gltf-json"
version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1414d3a98cbaabdb2f134328b1f6036d14b282febc1df51952a435d2ca17fb6"
dependencies = [
"gltf-derive",
"serde",
"serde_derive",
"serde_json",
]
[[package]] [[package]]
name = "gpu-alloc" name = "gpu-alloc"
version = "0.4.7" version = "0.4.7"
@ -903,6 +946,12 @@ dependencies = [
"hashbrown", "hashbrown",
] ]
[[package]]
name = "inflections"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a"
[[package]] [[package]]
name = "inplace_it" name = "inplace_it"
version = "0.3.3" version = "0.3.3"
@ -921,6 +970,12 @@ dependencies = [
"web-sys", "web-sys",
] ]
[[package]]
name = "itoa"
version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736"
[[package]] [[package]]
name = "jni-sys" name = "jni-sys"
version = "0.3.0" version = "0.3.0"
@ -1058,6 +1113,7 @@ dependencies = [
"cgmath", "cgmath",
"env_logger", "env_logger",
"futures", "futures",
"gltf",
"image", "image",
"log", "log",
"noise", "noise",
@ -1537,6 +1593,12 @@ version = "0.6.25"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
[[package]]
name = "ryu"
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
[[package]] [[package]]
name = "scoped_threadpool" name = "scoped_threadpool"
version = "0.1.9" version = "0.1.9"
@ -1555,6 +1617,28 @@ version = "1.0.126"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03"
[[package]]
name = "serde_derive"
version = "1.0.126"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.64"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79"
dependencies = [
"itoa",
"ryu",
"serde",
]
[[package]] [[package]]
name = "slab" name = "slab"
version = "0.4.3" version = "0.4.3"

View file

@ -6,6 +6,7 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
gltf = "0.16"
ahash = "0.7.4" ahash = "0.7.4"
anyhow = "1.0.40" anyhow = "1.0.40"
bytemuck = { version = "1.5.1", features = ["derive"] } bytemuck = { version = "1.5.1", features = ["derive"] }

BIN
assets/models/minecrab.glb (Stored with Git LFS) Normal file

Binary file not shown.

View file

@ -11,6 +11,7 @@ mod time;
mod vertex; mod vertex;
mod view; mod view;
mod world; mod world;
mod npc;
use std::time::{Duration, Instant}; use std::time::{Duration, Instant};
use wgpu::SwapChainError; use wgpu::SwapChainError;

65
src/npc.rs Normal file
View file

@ -0,0 +1,65 @@
extern crate gltf;
extern crate wgpu;
use cgmath::Vector3;
use crate::vertex::BlockVertex;
pub struct Npc {
pub position: Vector3<f32>,
pub scale: Vector3<f32>,
pub rotation: Vector3<f32>,
pub vertices: Vec<BlockVertex>,
pub indices: Vec<u32>,
pub vertex_buffer: Option<wgpu::Buffer>,
pub index_buffer: Option<wgpu::Buffer>,
}
impl Npc {
pub fn load() -> Self {
let position: Vector3<f32> = Vector3::new(0.0, 0.0, 0.0);
let scale: Vector3<f32> = Vector3::new(0.0, 0.0, 0.0);
let rotation: Vector3<f32> = Vector3::new(0.0, 0.0, 0.0);
let (model, buffers, _) = gltf::import("assets/models/minecrab.glb").unwrap();
let mut indices = Vec::new();
let mut vertices = Vec::new();
for mesh in model.meshes() {
for primitive in mesh.primitives() {
let reader = primitive.reader(|buffer| Some(&buffers[buffer.index()]));
indices = reader.read_indices().unwrap().into_u32().collect();
// loop over all primitives and get the normals, position and color
let pos_iter = reader.read_positions().unwrap();
let norm_iter = reader.read_normals().unwrap();
let tex_iter = reader.read_tex_coords(0).unwrap().into_f32();
for ((position, normal), texture_coordinates) in
pos_iter.zip(norm_iter).zip(tex_iter)
{
let current_vert = BlockVertex {
position,
texture_coordinates,
normal,
highlighted: 0,
texture_id: 0,
};
vertices.push(current_vert);
}
}
}
return Self {
position,
scale,
rotation,
indices,
vertices,
vertex_buffer: None,
index_buffer: None,
};
}
}

View file

@ -50,6 +50,7 @@ pub struct WorldState {
pub up_speed: f32, pub up_speed: f32,
pub sprinting: bool, pub sprinting: bool,
pub creative: bool,
} }
impl WorldState { impl WorldState {
@ -234,6 +235,24 @@ impl WorldState {
println!("World update took {:?}", elapsed); println!("World update took {:?}", elapsed);
} }
pub fn load_npc_geometry(&mut self, render_context: &RenderContext) {
self.world.npc.vertex_buffer = Some(render_context.device.create_buffer_init(
&BufferInitDescriptor {
label: None,
contents: &bytemuck::cast_slice(&self.world.npc.vertices),
usage: wgpu::BufferUsage::VERTEX,
},
));
self.world.npc.index_buffer = Some(render_context.device.create_buffer_init(
&BufferInitDescriptor {
label: None,
contents: &bytemuck::cast_slice(&self.world.npc.indices),
usage: wgpu::BufferUsage::INDEX,
},
));
}
pub fn update_chunk_geometry( pub fn update_chunk_geometry(
&mut self, &mut self,
render_context: &RenderContext, render_context: &RenderContext,
@ -326,9 +345,11 @@ impl WorldState {
backward_pressed: false, backward_pressed: false,
left_pressed: false, left_pressed: false,
right_pressed: false, right_pressed: false,
creative: false,
}; };
world_state.update_world_geometry(render_context); world_state.update_world_geometry(render_context);
world_state.load_npc_geometry(render_context);
world_state world_state
} }
@ -383,6 +404,16 @@ impl WorldState {
triangle_count += buffers.index_count / 3; triangle_count += buffers.index_count / 3;
} }
{
let vertex_buffer = self.world.npc.vertex_buffer.as_ref();
let index_buffer = self.world.npc.index_buffer.as_ref();
render_pass.set_vertex_buffer(0, vertex_buffer.unwrap().slice(..));
render_pass
.set_index_buffer(index_buffer.unwrap().slice(..), wgpu::IndexFormat::Uint32);
render_pass.draw_indexed(0..self.world.npc.indices.len() as u32, 0, 0..1);
}
triangle_count triangle_count
} }
@ -459,7 +490,21 @@ impl WorldState {
VirtualKeyCode::S => self.backward_pressed = pressed, VirtualKeyCode::S => self.backward_pressed = pressed,
VirtualKeyCode::A => self.left_pressed = pressed, VirtualKeyCode::A => self.left_pressed = pressed,
VirtualKeyCode::D => self.right_pressed = pressed, VirtualKeyCode::D => self.right_pressed = pressed,
VirtualKeyCode::Space if state == ElementState::Pressed => self.up_speed = 0.6, VirtualKeyCode::F2 if pressed => self.creative = !self.creative,
VirtualKeyCode::Space => {
self.up_speed = if self.creative {
if pressed {
1.0
} else {
0.0
}
} else {
0.6
}
}
VirtualKeyCode::LShift if self.creative => {
self.up_speed = if pressed { -1.0 } else { 0.0 }
}
VirtualKeyCode::LControl => self.sprinting = state == ElementState::Pressed, VirtualKeyCode::LControl => self.sprinting = state == ElementState::Pressed,
_ => (), _ => (),
} }
@ -485,7 +530,7 @@ impl WorldState {
let up = Vector3::unit_y() * self.up_speed * speed * dt_seconds; let up = Vector3::unit_y() * self.up_speed * speed * dt_seconds;
new_position += up; new_position += up;
if self.check_collision(new_position) { if !self.creative && self.check_collision(new_position) {
new_position -= up; new_position -= up;
self.up_speed = 0.0; self.up_speed = 0.0;
} }
@ -494,7 +539,7 @@ impl WorldState {
let forward = Vector3::new(yaw_cos, 0.0, yaw_sin).normalize(); let forward = Vector3::new(yaw_cos, 0.0, yaw_sin).normalize();
let forward = forward * forward_speed as f32 * speed * dt_seconds; let forward = forward * forward_speed as f32 * speed * dt_seconds;
new_position += forward; new_position += forward;
if self.check_collision(new_position) { if !self.creative && self.check_collision(new_position) {
new_position -= forward; new_position -= forward;
} }
@ -502,14 +547,16 @@ impl WorldState {
let right = Vector3::new(-yaw_sin, 0.0, yaw_cos).normalize(); let right = Vector3::new(-yaw_sin, 0.0, yaw_cos).normalize();
let right = right * right_speed as f32 * speed * dt_seconds; let right = right * right_speed as f32 * speed * dt_seconds;
new_position += right; new_position += right;
if self.check_collision(new_position) { if !self.creative && self.check_collision(new_position) {
new_position -= right; new_position -= right;
} }
self.camera.position = new_position; self.camera.position = new_position;
self.up_speed -= 1.6 * dt.as_secs_f32(); if !self.creative {
self.up_speed *= 0.98_f32.powf(dt.as_secs_f32() / 20.0); self.up_speed -= 1.6 * dt.as_secs_f32();
self.up_speed *= 0.98_f32.powf(dt.as_secs_f32() / 20.0);
}
} }
pub fn update(&mut self, dt: Duration, render_context: &RenderContext) { pub fn update(&mut self, dt: Duration, render_context: &RenderContext) {

View file

@ -1,6 +1,7 @@
use crate::{ use crate::{
chunk::{Block, Chunk, CHUNK_SIZE}, chunk::{Block, Chunk, CHUNK_SIZE},
geometry::Geometry, geometry::Geometry,
npc::Npc,
vertex::BlockVertex, vertex::BlockVertex,
}; };
use cgmath::{InnerSpace, Vector3}; use cgmath::{InnerSpace, Vector3};
@ -8,6 +9,7 @@ use rayon::prelude::*;
pub struct World { pub struct World {
pub chunks: Vec<Vec<Vec<Chunk>>>, pub chunks: Vec<Vec<Vec<Chunk>>>,
pub npc: Npc,
} }
const WORLD_SIZE: Vector3<usize> = Vector3::new( const WORLD_SIZE: Vector3<usize> = Vector3::new(
@ -20,6 +22,8 @@ impl World {
pub fn generate() -> Self { pub fn generate() -> Self {
let mut chunks = Vec::new(); let mut chunks = Vec::new();
let npc = Npc::load();
(0..WORLD_SIZE.y) (0..WORLD_SIZE.y)
.into_par_iter() .into_par_iter()
.map(|y| { .map(|y| {
@ -36,7 +40,7 @@ impl World {
}) })
.collect_into_vec(&mut chunks); .collect_into_vec(&mut chunks);
Self { chunks } Self { chunks, npc }
} }
pub fn highlighted_for_chunk( pub fn highlighted_for_chunk(