diff --git a/lib/common/src/gameplay_style.rs b/lib/common/src/gameplay_style.rs index 9475e270e..f1d6efdad 100644 --- a/lib/common/src/gameplay_style.rs +++ b/lib/common/src/gameplay_style.rs @@ -66,18 +66,18 @@ impl JumpImpulse{ _mass:Planar64, )->Planar64Vec3{ match self{ - &JumpImpulse::Time(time)=>velocity-(*gravity*time).map(|t|t.divide().fix_1()), + &JumpImpulse::Time(time)=>velocity-(*gravity*time).map(|t|t.divide().clamp_1()), &JumpImpulse::Height(height)=>{ //height==-v.y*v.y/(2*g.y); //use energy to determine max height let gg=gravity.length_squared(); - let g=gg.sqrt().fix_1(); + let g=gg.sqrt(); let v_g=gravity.dot(velocity); //do it backwards - let radicand=v_g*v_g+(g*height*2).fix_4(); - velocity-(*gravity*(radicand.sqrt().fix_2()+v_g)/gg).divide().fix_1() + let radicand=v_g*v_g+(g*height*2).widen_4(); + velocity-(*gravity*(radicand.sqrt().wrap_2()+v_g)/gg).divide().clamp_1() }, - &JumpImpulse::Linear(jump_speed)=>velocity+(jump_dir*jump_speed/jump_dir.length()).divide().fix_1(), + &JumpImpulse::Linear(jump_speed)=>velocity+(jump_dir*jump_speed/jump_dir.length()).divide().clamp_1(), &JumpImpulse::Energy(_energy)=>{ //calculate energy //let e=gravity.dot(velocity); @@ -91,10 +91,10 @@ impl JumpImpulse{ pub fn get_jump_deltav(&self,gravity:&Planar64Vec3,mass:Planar64)->Planar64{ //gravity.length() is actually the proper calculation because the jump is always opposite the gravity direction match self{ - &JumpImpulse::Time(time)=>(gravity.length().fix_1()*time/2).divide().fix_1(), - &JumpImpulse::Height(height)=>(gravity.length()*height*2).sqrt().fix_1(), + &JumpImpulse::Time(time)=>(gravity.length().wrap_1()*time/2).divide().clamp_1(), + &JumpImpulse::Height(height)=>(gravity.length()*height*2).sqrt().wrap_1(), &JumpImpulse::Linear(deltav)=>deltav, - &JumpImpulse::Energy(energy)=>(energy.sqrt()*2/mass.sqrt()).divide().fix_1(), + &JumpImpulse::Energy(energy)=>(energy.sqrt()*2/mass.sqrt()).divide().clamp_1(), } } } @@ -126,10 +126,10 @@ impl JumpSettings{ None=>rel_velocity, }; let j=boost_vel.dot(jump_dir); - let js=jump_speed.fix_2(); + let js=jump_speed.widen_2(); if j<js{ //weak booster: just do a regular jump - boost_vel+jump_dir.with_length(js-j).divide().fix_1() + boost_vel+jump_dir.with_length(js-j).divide().wrap_1() }else{ //activate booster normally, jump does nothing boost_vel @@ -142,13 +142,13 @@ impl JumpSettings{ None=>rel_velocity, }; let j=boost_vel.dot(jump_dir); - let js=jump_speed.fix_2(); + let js=jump_speed.widen_2(); if j<js{ //speed in direction of jump cannot be lower than amount - boost_vel+jump_dir.with_length(js-j).divide().fix_1() + boost_vel+jump_dir.with_length(js-j).divide().wrap_1() }else{ //boost and jump add together - boost_vel+jump_dir.with_length(js).divide().fix_1() + boost_vel+jump_dir.with_length(js).divide().wrap_1() } } (false,JumpCalculation::Max)=>{ @@ -159,10 +159,10 @@ impl JumpSettings{ None=>rel_velocity, }; let boost_dot=boost_vel.dot(jump_dir); - let js=jump_speed.fix_2(); + let js=jump_speed.widen_2(); if boost_dot<js{ //weak boost is extended to jump speed - boost_vel+jump_dir.with_length(js-boost_dot).divide().fix_1() + boost_vel+jump_dir.with_length(js-boost_dot).divide().wrap_1() }else{ //activate booster normally, jump does nothing boost_vel @@ -174,7 +174,7 @@ impl JumpSettings{ Some(booster)=>booster.boost(rel_velocity), None=>rel_velocity, }; - boost_vel+jump_dir.with_length(jump_speed).divide().fix_1() + boost_vel+jump_dir.with_length(jump_speed).divide().wrap_1() }, } } @@ -267,9 +267,9 @@ pub struct StrafeSettings{ impl StrafeSettings{ pub fn tick_velocity(&self,velocity:Planar64Vec3,control_dir:Planar64Vec3)->Option<Planar64Vec3>{ let d=velocity.dot(control_dir); - let mv=self.mv.fix_2(); + let mv=self.mv.widen_2(); match d<mv{ - true=>Some(velocity+(control_dir*self.air_accel_limit.map_or(mv-d,|limit|limit.fix_2().min(mv-d))).fix_1()), + true=>Some(velocity+(control_dir*self.air_accel_limit.map_or(mv-d,|limit|limit.widen_2().min(mv-d))).wrap_1()), false=>None, } } @@ -290,7 +290,7 @@ pub struct PropulsionSettings{ } impl PropulsionSettings{ pub fn acceleration(&self,control_dir:Planar64Vec3)->Planar64Vec3{ - (control_dir*self.magnitude).fix_1() + (control_dir*self.magnitude).clamp_1() } } @@ -310,13 +310,13 @@ pub struct WalkSettings{ impl WalkSettings{ pub fn accel(&self,target_diff:Planar64Vec3,gravity:Planar64Vec3)->Planar64{ //TODO: fallible walk accel - let diff_len=target_diff.length().fix_1(); + let diff_len=target_diff.length().wrap_1(); let friction=if diff_len<self.accelerate.topspeed{ self.static_friction }else{ self.kinetic_friction }; - self.accelerate.accel.min((-gravity.y*friction).fix_1()) + self.accelerate.accel.min((-gravity.y*friction).clamp_1()) } pub fn get_walk_target_velocity(&self,control_dir:Planar64Vec3,normal:Planar64Vec3)->Planar64Vec3{ if control_dir==crate::integer::vec3::ZERO{ @@ -332,7 +332,7 @@ impl WalkSettings{ if cr==crate::integer::vec3::ZERO_2{ crate::integer::vec3::ZERO }else{ - (cr.cross(normal)*self.accelerate.topspeed/((nn*(nnmm-dd)).sqrt())).divide().fix_1() + (cr.cross(normal)*self.accelerate.topspeed/((nn*(nnmm-dd)).sqrt())).divide().clamp_1() } }else{ crate::integer::vec3::ZERO @@ -341,7 +341,7 @@ impl WalkSettings{ pub fn is_slope_walkable(&self,normal:Planar64Vec3,up:Planar64Vec3)->bool{ //normal is not guaranteed to be unit length let ny=normal.dot(up); - let h=normal.length().fix_1(); + let h=normal.length().wrap_1(); //remember this is a normal vector ny.is_positive()&&h*self.surf_dot<ny } @@ -368,13 +368,13 @@ impl LadderSettings{ let nnmm=nn*mm; let d=normal.dot(control_dir); let mut dd=d*d; - if (self.dot*self.dot*nnmm).fix_4()<dd{ + if (self.dot*self.dot*nnmm).clamp_4()<dd{ if d.is_negative(){ - control_dir=Planar64Vec3::new([Planar64::ZERO,mm.fix_1(),Planar64::ZERO]); + control_dir=Planar64Vec3::new([Planar64::ZERO,mm.clamp_1(),Planar64::ZERO]); }else{ - control_dir=Planar64Vec3::new([Planar64::ZERO,-mm.fix_1(),Planar64::ZERO]); + control_dir=Planar64Vec3::new([Planar64::ZERO,-mm.clamp_1(),Planar64::ZERO]); } - dd=(normal.y*normal.y).fix_4(); + dd=(normal.y*normal.y).widen_4(); } //n=d if you are standing on top of a ladder and press E. //two fixes: @@ -385,7 +385,7 @@ impl LadderSettings{ if cr==crate::integer::vec3::ZERO_2{ crate::integer::vec3::ZERO }else{ - (cr.cross(normal)*self.accelerate.topspeed/((nn*(nnmm-dd)).sqrt())).divide().fix_1() + (cr.cross(normal)*self.accelerate.topspeed/((nn*(nnmm-dd)).sqrt())).divide().clamp_1() } }else{ crate::integer::vec3::ZERO @@ -417,7 +417,7 @@ impl Hitbox{ } pub fn source()->Self{ Self{ - halfsize:((int3(33,73,33)>>1)*VALVE_SCALE).fix_1(), + halfsize:((int3(33,73,33)>>1)*VALVE_SCALE).narrow_1().unwrap(), mesh:HitboxMesh::Box, } } @@ -538,11 +538,11 @@ impl StyleModifiers{ tick_rate:Ratio64::new(100,AbsoluteTime::ONE_SECOND.get() as u64).unwrap(), }), jump:Some(JumpSettings{ - impulse:JumpImpulse::Height((int(52)*VALVE_SCALE).fix_1()), + impulse:JumpImpulse::Height((int(52)*VALVE_SCALE).narrow_1().unwrap()), calculation:JumpCalculation::JumpThenBoost, limit_minimum:true, }), - gravity:(int3(0,-800,0)*VALVE_SCALE).fix_1(), + gravity:(int3(0,-800,0)*VALVE_SCALE).narrow_1().unwrap(), mass:int(1), rocket:None, walk:Some(WalkSettings{ @@ -565,7 +565,7 @@ impl StyleModifiers{ magnitude:int(12),//? }), hitbox:Hitbox::source(), - camera_offset:((int3(0,64,0)-(int3(0,73,0)>>1))*VALVE_SCALE).fix_1(), + camera_offset:((int3(0,64,0)-(int3(0,73,0)>>1))*VALVE_SCALE).narrow_1().unwrap(), } } pub fn source_surf()->Self{ @@ -574,16 +574,16 @@ impl StyleModifiers{ controls_mask_state:Controls::all(), strafe:Some(StrafeSettings{ enable:ControlsActivation::full_2d(), - air_accel_limit:Some((int(150)*66*VALVE_SCALE).fix_1()), + air_accel_limit:Some((int(150)*66*VALVE_SCALE).narrow_1().unwrap()), mv:Planar64::raw(30<<28), tick_rate:Ratio64::new(66,AbsoluteTime::ONE_SECOND.get() as u64).unwrap(), }), jump:Some(JumpSettings{ - impulse:JumpImpulse::Height((int(52)*VALVE_SCALE).fix_1()), + impulse:JumpImpulse::Height((int(52)*VALVE_SCALE).narrow_1().unwrap()), calculation:JumpCalculation::JumpThenBoost, limit_minimum:true, }), - gravity:(int3(0,-800,0)*VALVE_SCALE).fix_1(), + gravity:(int3(0,-800,0)*VALVE_SCALE).narrow_1().unwrap(), mass:int(1), rocket:None, walk:Some(WalkSettings{ @@ -606,7 +606,7 @@ impl StyleModifiers{ magnitude:int(12),//? }), hitbox:Hitbox::source(), - camera_offset:((int3(0,64,0)-(int3(0,73,0)>>1))*VALVE_SCALE).fix_1(), + camera_offset:((int3(0,64,0)-(int3(0,73,0)>>1))*VALVE_SCALE).narrow_1().unwrap(), } } } diff --git a/lib/common/src/integer.rs b/lib/common/src/integer.rs index b75172f7f..5c79f5e63 100644 --- a/lib/common/src/integer.rs +++ b/lib/common/src/integer.rs @@ -1,4 +1,4 @@ -pub use fixed_wide::fixed::{Fixed,Fix}; +pub use fixed_wide::fixed::*; pub use ratio_ops::ratio::{Ratio,Divide}; //integer units @@ -60,7 +60,7 @@ impl<T> Time<T>{ impl<T> From<Planar64> for Time<T>{ #[inline] fn from(value:Planar64)->Self{ - Self::raw((value*Planar64::raw(1_000_000_000)).fix_1().to_raw()) + Self::raw((value*Planar64::raw(1_000_000_000)).clamp_1().to_raw()) } } impl<T> From<Time<T>> for Ratio<Planar64,Planar64>{ @@ -73,11 +73,11 @@ impl<T,Num,Den,N1,T1> From<Ratio<Num,Den>> for Time<T> where Num:core::ops::Mul<Planar64,Output=N1>, N1:Divide<Den,Output=T1>, - T1:Fix<Planar64>, + T1:Clamp<Planar64>, { #[inline] fn from(value:Ratio<Num,Den>)->Self{ - Self::raw((value*Planar64::raw(1_000_000_000)).divide().fix().to_raw()) + Self::raw((value*Planar64::raw(1_000_000_000)).divide().clamp().to_raw()) } } impl<T> std::fmt::Display for Time<T>{ @@ -515,8 +515,8 @@ fn angle_sin_cos(){ println!("cordic s={} c={}",(s/h).divide(),(c/h).divide()); let (fs,fc)=f.sin_cos(); println!("float s={} c={}",fs,fc); - assert!(close_enough((c/h).divide().fix_1(),Planar64::raw((fc*((1u64<<32) as f64)) as i64))); - assert!(close_enough((s/h).divide().fix_1(),Planar64::raw((fs*((1u64<<32) as f64)) as i64))); + assert!(close_enough((c/h).divide().wrap_1(),Planar64::raw((fc*((1u64<<32) as f64)) as i64))); + assert!(close_enough((s/h).divide().wrap_1(),Planar64::raw((fs*((1u64<<32) as f64)) as i64))); } test_angle(1.0); test_angle(std::f64::consts::PI/4.0); @@ -625,8 +625,8 @@ pub mod mat3{ let (yc,ys)=y.cos_sin(); Planar64Mat3::from_cols([ Planar64Vec3::new([xc,Planar64::ZERO,-xs]), - Planar64Vec3::new([(xs*ys).fix_1(),yc,(xc*ys).fix_1()]), - Planar64Vec3::new([(xs*yc).fix_1(),-ys,(xc*yc).fix_1()]), + Planar64Vec3::new([(xs*ys).wrap_1(),yc,(xc*ys).wrap_1()]), + Planar64Vec3::new([(xs*yc).wrap_1(),-ys,(xc*yc).wrap_1()]), ]) } #[inline] @@ -668,7 +668,7 @@ impl Planar64Affine3{ } #[inline] pub fn transform_point3(&self,point:Planar64Vec3)->vec3::Vector3<Fixed<2,64>>{ - self.translation.fix_2()+self.matrix3*point + self.translation.widen_2()+self.matrix3*point } } impl Into<glam::Mat4> for Planar64Affine3{ diff --git a/lib/common/src/ray.rs b/lib/common/src/ray.rs index fe1612713..ea096e7a6 100644 --- a/lib/common/src/ray.rs +++ b/lib/common/src/ray.rs @@ -13,8 +13,8 @@ impl Ray{ Num:core::ops::Mul<Planar64,Output=N1>, Planar64:core::ops::Mul<Den,Output=N1>, N1:integer::Divide<Den,Output=T1>, - T1:integer::Fix<Planar64>, + T1:integer::Clamp<Planar64>, { - self.origin+self.direction.map(|elem|(t*elem).divide().fix()) + self.origin+self.direction.map(|elem|(t*elem).divide().clamp()) } }