forked from StrafesNET/strafe-project
Compare commits
13 Commits
redo-input
...
load-roblo
| Author | SHA1 | Date | |
|---|---|---|---|
| 7e9d57aebc | |||
| b1c350dc0e | |||
| 7fae3063cc | |||
| 25cfd615be | |||
| 8b9981e4b4 | |||
| 7e53e84e86 | |||
| 365ecb1d0b | |||
| 1d9d4efedb | |||
| bd04f680d8 | |||
| 46cc082c07 | |||
| 55fcdb8e27 | |||
| d7df468388 | |||
| 990199b4c7 |
23
src/body.rs
23
src/body.rs
@@ -254,7 +254,8 @@ pub struct PhysicsState {
|
||||
pub hitbox_halfsize: glam::Vec3,
|
||||
pub contacts: std::collections::HashSet::<RelativeCollision>,
|
||||
//pub intersections: Vec<ModelId>,
|
||||
pub models: Vec<ModelPhysics>,
|
||||
//temp
|
||||
pub models_cringe_clone: Vec<Model>,
|
||||
//camera must exist in state because wormholes modify the camera, also camera punch
|
||||
pub camera: Camera,
|
||||
pub mouse_interpolation: MouseInterpolationState,
|
||||
@@ -381,13 +382,13 @@ impl Aabb {
|
||||
type TreyMeshFace = AabbFace;
|
||||
type TreyMesh = Aabb;
|
||||
|
||||
pub struct ModelPhysics {
|
||||
pub struct Model {
|
||||
//A model is a thing that has a hitbox. can be represented by a list of TreyMesh-es
|
||||
//in this iteration, all it needs is extents.
|
||||
transform: glam::Mat4,
|
||||
}
|
||||
|
||||
impl ModelPhysics {
|
||||
impl Model {
|
||||
pub fn new(transform:glam::Mat4) -> Self {
|
||||
Self{transform}
|
||||
}
|
||||
@@ -431,10 +432,10 @@ pub struct RelativeCollision {
|
||||
}
|
||||
|
||||
impl RelativeCollision {
|
||||
pub fn mesh(&self,models:&Vec<ModelPhysics>) -> TreyMesh {
|
||||
pub fn mesh(&self,models:&Vec<Model>) -> TreyMesh {
|
||||
return models.get(self.model as usize).unwrap().face_mesh(self.face)
|
||||
}
|
||||
pub fn normal(&self,models:&Vec<ModelPhysics>) -> glam::Vec3 {
|
||||
pub fn normal(&self,models:&Vec<Model>) -> glam::Vec3 {
|
||||
return models.get(self.model as usize).unwrap().face_normal(self.face)
|
||||
}
|
||||
}
|
||||
@@ -493,7 +494,7 @@ impl PhysicsState {
|
||||
|
||||
fn contact_constrain_velocity(&self,velocity:&mut glam::Vec3){
|
||||
for contact in self.contacts.iter() {
|
||||
let n=contact.normal(&self.models);
|
||||
let n=contact.normal(&self.models_cringe_clone);
|
||||
let d=velocity.dot(n);
|
||||
if d<0f32{
|
||||
(*velocity)-=d/n.length_squared()*n;
|
||||
@@ -502,7 +503,7 @@ impl PhysicsState {
|
||||
}
|
||||
fn contact_constrain_acceleration(&self,acceleration:&mut glam::Vec3){
|
||||
for contact in self.contacts.iter() {
|
||||
let n=contact.normal(&self.models);
|
||||
let n=contact.normal(&self.models_cringe_clone);
|
||||
let d=acceleration.dot(n);
|
||||
if d<0f32{
|
||||
(*acceleration)-=d/n.length_squared()*n;
|
||||
@@ -602,7 +603,7 @@ impl PhysicsState {
|
||||
let mut best_time=time_limit;
|
||||
let mut exit_face:Option<TreyMeshFace>=None;
|
||||
let mesh0=self.mesh();
|
||||
let mesh1=self.models.get(collision_data.model as usize).unwrap().mesh();
|
||||
let mesh1=self.models_cringe_clone.get(collision_data.model as usize).unwrap().mesh();
|
||||
let (v,a)=(-self.body.velocity,self.body.acceleration);
|
||||
//collect x
|
||||
match collision_data.face {
|
||||
@@ -753,7 +754,7 @@ impl PhysicsState {
|
||||
let mut best_time=time_limit;
|
||||
let mut best_face:Option<TreyMeshFace>=None;
|
||||
let mesh0=self.mesh();
|
||||
let mesh1=self.models.get(model_id as usize).unwrap().mesh();
|
||||
let mesh1=self.models_cringe_clone.get(model_id as usize).unwrap().mesh();
|
||||
let (p,v,a)=(self.body.position,self.body.velocity,self.body.acceleration);
|
||||
//collect x
|
||||
for t in zeroes2(mesh0.max.x-mesh1.min.x,v.x,0.5*a.x) {
|
||||
@@ -878,7 +879,7 @@ impl crate::instruction::InstructionEmitter<PhysicsInstruction> for PhysicsState
|
||||
collector.collect(self.predict_collision_end(self.time,time_limit,collision_data));
|
||||
}
|
||||
//check for collision start instructions (against every part in the game with no optimization!!)
|
||||
for i in 0..self.models.len() {
|
||||
for i in 0..self.models_cringe_clone.len() {
|
||||
collector.collect(self.predict_collision_start(self.time,time_limit,i as u32));
|
||||
}
|
||||
if self.grounded {
|
||||
@@ -1017,4 +1018,4 @@ impl crate::instruction::InstructionConsumer<PhysicsInstruction> for PhysicsStat
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -463,13 +463,7 @@ impl strafe_client::framework::Example for GraphicsData {
|
||||
grounded: false,
|
||||
walkspeed: 18.0,
|
||||
contacts: std::collections::HashSet::new(),
|
||||
models: modeldatas.iter().map(|m|
|
||||
//make aabb and run vertices to get realistic bounds
|
||||
//this needs to be a function generate_model_physics
|
||||
m.transforms.iter().map(|t|
|
||||
strafe_client::body::ModelPhysics::new(*t)
|
||||
)
|
||||
).flatten().collect(),
|
||||
models_cringe_clone: modeldatas.iter().map(|m|m.transforms.iter().map(|t|strafe_client::body::Model::new(*t))).flatten().collect(),
|
||||
walk: strafe_client::body::WalkState::new(),
|
||||
hitbox_halfsize: glam::vec3(1.0,2.5,1.0),
|
||||
camera: strafe_client::body::Camera::from_offset(glam::vec3(0.0,4.5-2.5,0.0),(config.width as f32)/(config.height as f32)),
|
||||
@@ -725,6 +719,7 @@ impl strafe_client::framework::Example for GraphicsData {
|
||||
|
||||
#[allow(clippy::single_match)]
|
||||
fn update(&mut self, device: &wgpu::Device, event: winit::event::WindowEvent) {
|
||||
//nothing atm
|
||||
match event {
|
||||
winit::event::WindowEvent::DroppedFile(path) => {
|
||||
println!("opening file: {:?}", &path);
|
||||
|
||||
Reference in New Issue
Block a user