mirror of
https://github.com/griffi-gh/kubi.git
synced 2024-11-22 14:58:44 -06:00
wip physics
This commit is contained in:
parent
4bd7371f84
commit
cd20b4ae32
|
@ -15,6 +15,8 @@ mod world;
|
||||||
mod blocks;
|
mod blocks;
|
||||||
mod items;
|
mod items;
|
||||||
mod options;
|
mod options;
|
||||||
|
mod physics;
|
||||||
|
mod player;
|
||||||
|
|
||||||
use assets::Assets;
|
use assets::Assets;
|
||||||
use display::init_display;
|
use display::init_display;
|
||||||
|
|
38
src/game/physics.rs
Normal file
38
src/game/physics.rs
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
use glam::{Vec3A, vec3a};
|
||||||
|
use crate::game::World;
|
||||||
|
|
||||||
|
const GRAVITY: Vec3A = vec3a(0., -1., 0.);
|
||||||
|
|
||||||
|
pub struct BasicPhysicsActor {
|
||||||
|
pub height: f32,
|
||||||
|
pub gravity: Vec3A,
|
||||||
|
pub position: Vec3A,
|
||||||
|
pub velocity: Vec3A,
|
||||||
|
}
|
||||||
|
impl BasicPhysicsActor {
|
||||||
|
pub fn new(height: f32) -> Self {
|
||||||
|
Self {
|
||||||
|
height,
|
||||||
|
gravity: GRAVITY,
|
||||||
|
position: vec3a(0., 0., 0.),
|
||||||
|
velocity: vec3a(0., 0., 0.),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pub fn update(&mut self, world: &World, dt: f32) {
|
||||||
|
self.velocity += GRAVITY;
|
||||||
|
self.position += self.velocity;
|
||||||
|
loop {
|
||||||
|
let block_pos = self.position.floor().as_ivec3();
|
||||||
|
if let Some(block) = world.try_get(block_pos) {
|
||||||
|
match block.descriptor().collision {
|
||||||
|
Some(super::blocks::CollisionType::Solid) => {
|
||||||
|
//todo compute restitution here
|
||||||
|
}
|
||||||
|
_ => break
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
7
src/game/player.rs
Normal file
7
src/game/player.rs
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
use crate::game::camera::Camera;
|
||||||
|
use crate::game::physics::BasicPhysicsActor;
|
||||||
|
|
||||||
|
pub struct MainPlayer {
|
||||||
|
pub camera: Camera,
|
||||||
|
pub actor: BasicPhysicsActor,
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
use glam::{Vec2, IVec2};
|
use glam::{Vec2, IVec2, IVec3, Vec3Swizzles};
|
||||||
use glium::{
|
use glium::{
|
||||||
Display, Frame, Surface,
|
Display, Frame, Surface,
|
||||||
DrawParameters, Depth,
|
DrawParameters, Depth,
|
||||||
|
@ -13,7 +13,8 @@ use hashbrown::HashMap;
|
||||||
use crate::game::{
|
use crate::game::{
|
||||||
options::GameOptions,
|
options::GameOptions,
|
||||||
shaders::Programs,
|
shaders::Programs,
|
||||||
assets::Assets
|
assets::Assets,
|
||||||
|
blocks::Block,
|
||||||
};
|
};
|
||||||
|
|
||||||
mod chunk;
|
mod chunk;
|
||||||
|
@ -43,6 +44,19 @@ impl World {
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn try_get(&self, position: IVec3) -> Option<Block> {
|
||||||
|
let chunk_coord = IVec2::new(position.x, position.z) / CHUNK_SIZE as i32;
|
||||||
|
let chunk = self.chunks.get(&chunk_coord)?;
|
||||||
|
let block_data = chunk.block_data.as_ref()?;
|
||||||
|
let block_position = position - (chunk_coord * CHUNK_SIZE as i32).extend(0).xzy();
|
||||||
|
Some(
|
||||||
|
*block_data
|
||||||
|
.get(block_position.x as usize)?
|
||||||
|
.get(block_position.y as usize)?
|
||||||
|
.get(block_position.z as usize)?
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self {
|
Self {
|
||||||
chunks: HashMap::new(),
|
chunks: HashMap::new(),
|
||||||
|
|
Loading…
Reference in a new issue