This commit is contained in:
Quaternions 2024-02-06 20:29:21 -08:00
parent 9eb8397e6a
commit 5b38b2ca33
2 changed files with 21 additions and 59 deletions

View File

@ -335,7 +335,7 @@ impl GraphicsState{
let map_pos_id:Vec<PositionId>=model.unique_pos.iter().map(|untransformed_pos|{ let map_pos_id:Vec<PositionId>=model.unique_pos.iter().map(|untransformed_pos|{
let pos=instance.transform.transform_point3(glam::Vec3::from_array(untransformed_pos.clone())).to_array(); let pos=instance.transform.transform_point3(glam::Vec3::from_array(untransformed_pos.clone())).to_array();
let h=bytemuck::cast::<[f32;3],[u32;3]>(pos); let h=bytemuck::cast::<[f32;3],[u32;3]>(pos);
PositionId::id((if let Some(&pos_id)=pos_id_from.get(&h){ PositionId::new((if let Some(&pos_id)=pos_id_from.get(&h){
pos_id pos_id
}else{ }else{
let pos_id=unique_pos.len(); let pos_id=unique_pos.len();
@ -346,7 +346,7 @@ impl GraphicsState{
}).collect(); }).collect();
let map_tex_id:Vec<TextureCoordinateId>=model.unique_tex.iter().map(|&tex|{ let map_tex_id:Vec<TextureCoordinateId>=model.unique_tex.iter().map(|&tex|{
let h=bytemuck::cast::<[f32;2],[u32;2]>(tex); let h=bytemuck::cast::<[f32;2],[u32;2]>(tex);
TextureCoordinateId::id((if let Some(&tex_id)=tex_id_from.get(&h){ TextureCoordinateId::new((if let Some(&tex_id)=tex_id_from.get(&h){
tex_id tex_id
}else{ }else{
let tex_id=unique_tex.len(); let tex_id=unique_tex.len();
@ -358,7 +358,7 @@ impl GraphicsState{
let map_normal_id:Vec<NormalId>=model.unique_normal.iter().map(|untransformed_normal|{ let map_normal_id:Vec<NormalId>=model.unique_normal.iter().map(|untransformed_normal|{
let normal=(instance.normal_transform*glam::Vec3::from_array(untransformed_normal.clone())).to_array(); let normal=(instance.normal_transform*glam::Vec3::from_array(untransformed_normal.clone())).to_array();
let h=bytemuck::cast::<[f32;3],[u32;3]>(normal); let h=bytemuck::cast::<[f32;3],[u32;3]>(normal);
NormalId::id((if let Some(&normal_id)=normal_id_from.get(&h){ NormalId::new((if let Some(&normal_id)=normal_id_from.get(&h){
normal_id normal_id
}else{ }else{
let normal_id=unique_normal.len(); let normal_id=unique_normal.len();
@ -369,7 +369,7 @@ impl GraphicsState{
}).collect(); }).collect();
let map_color_id:Vec<ColorId>=model.unique_color.iter().map(|&color|{ let map_color_id:Vec<ColorId>=model.unique_color.iter().map(|&color|{
let h=bytemuck::cast::<[f32;4],[u32;4]>(color); let h=bytemuck::cast::<[f32;4],[u32;4]>(color);
ColorId::id((if let Some(&color_id)=color_id_from.get(&h){ ColorId::new((if let Some(&color_id)=color_id_from.get(&h){
color_id color_id
}else{ }else{
let color_id=unique_color.len(); let color_id=unique_color.len();
@ -387,7 +387,7 @@ impl GraphicsState{
normal:map_normal_id[unmapped_vertex.normal.get() as usize], normal:map_normal_id[unmapped_vertex.normal.get() as usize],
color:map_color_id[unmapped_vertex.color.get() as usize], color:map_color_id[unmapped_vertex.color.get() as usize],
}; };
VertexId::id((if let Some(&vertex_id)=vertex_id_from.get(&vertex){ VertexId::new((if let Some(&vertex_id)=vertex_id_from.get(&vertex){
vertex_id vertex_id
}else{ }else{
let vertex_id=unique_vertices.len(); let vertex_id=unique_vertices.len();

View File

@ -189,12 +189,12 @@ impl PhysicsModels{
self.meshes.push(mesh); self.meshes.push(mesh);
} }
fn push_model(&mut self,model:PhysicsModel)->PhysicsModelId{ fn push_model(&mut self,model:PhysicsModel)->PhysicsModelId{
let model_id=PhysicsModelId::id(self.models.len() as u32); let model_id=PhysicsModelId::new(self.models.len() as u32);
self.models.push(model); self.models.push(model);
model_id model_id
} }
fn push_attr(&mut self,attr:PhysicsCollisionAttributes)->PhysicsAttributesId{ fn push_attr(&mut self,attr:PhysicsCollisionAttributes)->PhysicsAttributesId{
let attr_id=PhysicsAttributesId::id(self.attributes.len() as u32); let attr_id=PhysicsAttributesId::new(self.attributes.len() as u32);
self.attributes.push(attr); self.attributes.push(attr);
attr_id attr_id
} }
@ -271,9 +271,9 @@ pub struct ModeState{
impl std::default::Default for ModeState{ impl std::default::Default for ModeState{
fn default()->Self{ fn default()->Self{
Self{ Self{
mode_id:gameplay_modes::ModeId::id(0), mode_id:gameplay_modes::ModeId::new(0),
stage_id:gameplay_modes::StageId::id(0), stage_id:gameplay_modes::StageId::new(0),
next_ordered_checkpoint_id:gameplay_modes::CheckpointId::id(0), next_ordered_checkpoint_id:gameplay_modes::CheckpointId::new(0),
unordered_checkpoints:HashSet::new(), unordered_checkpoints:HashSet::new(),
jump_counts:HashMap::new(), jump_counts:HashMap::new(),
} }
@ -479,67 +479,29 @@ impl TryFrom<&gameplay_attributes::CollisionAttributes> for PhysicsCollisionAttr
} }
} }
} }
#[derive(id::Id)]
struct PhysicsAttributesId(u32); struct PhysicsAttributesId(u32);
impl PhysicsAttributesId{
#[inline]
pub const fn id(id:u32)->Self{
Self(id)
}
#[inline]
pub const fn get(self)->u32{
self.0
}
}
//id assigned to deindexed IndexedPhysicsGroup //id assigned to deindexed IndexedPhysicsGroup
#[derive(id::Id)]
struct PhysicsMeshId(u32); struct PhysicsMeshId(u32);
impl PhysicsMeshId{ #[derive(id::Id)]
#[inline]
pub const fn id(id:u32)->Self{
Self(id)
}
#[inline]
pub const fn get(self)->u32{
self.0
}
}
struct PhysicsGroupId(u32); struct PhysicsGroupId(u32);
impl PhysicsGroupId{
#[inline]
pub const fn id(id:u32)->Self{
Self(id)
}
#[inline]
pub const fn get(self)->u32{
self.0
}
}
//unique physics meshes indexed by this //unique physics meshes indexed by this
struct ConvexMeshId{ struct ConvexMeshId{
model_id:PhysicsModelId,// 1:1 with IndexedModelId model_id:PhysicsModelId,// 1:1 with IndexedModelId
group_id:PhysicsGroupId,// group in model group_id:PhysicsGroupId,// group in model
} }
#[derive(Debug,Clone,Copy,Eq,Hash,PartialEq)] #[derive(Debug,Clone,Copy,Hash,id::Id,Eq,PartialEq)]
struct PhysicsModelId(u32); struct PhysicsModelId(u32);
impl PhysicsModelId{
#[inline]
pub const fn id(id:u32)->Self{
Self(id)
}
#[inline]
pub const fn get(self)->u32{
self.0
}
}
impl Into<ModelId> for PhysicsModelId{ impl Into<ModelId> for PhysicsModelId{
fn into(self)->ModelId{ fn into(self)->ModelId{
ModelId::id(self.0) ModelId::new(self.0)
} }
} }
impl From<ModelId> for PhysicsModelId{ impl From<ModelId> for PhysicsModelId{
fn from(value:ModelId)->Self{ fn from(value:ModelId)->Self{
Self::id(value.get()) Self::new(value.get())
} }
} }
pub struct PhysicsModel{ pub struct PhysicsModel{
@ -649,7 +611,7 @@ impl TouchingState{
fn constrain_velocity(&self,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,velocity:&mut Planar64Vec3){ fn constrain_velocity(&self,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,velocity:&mut Planar64Vec3){
//TODO: trey push solve //TODO: trey push solve
for contact in &self.contacts{ for contact in &self.contacts{
let n=contact_normal(models,style_mesh,contact); let n=contact_normal(models,hitbox_mesh,contact);
let d=n.dot128(*velocity); let d=n.dot128(*velocity);
if d<0{ if d<0{
*velocity-=n*Planar64::raw(((d<<32)/n.dot128(n)) as i64); *velocity-=n*Planar64::raw(((d<<32)/n.dot128(n)) as i64);
@ -659,7 +621,7 @@ impl TouchingState{
fn constrain_acceleration(&self,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,acceleration:&mut Planar64Vec3){ fn constrain_acceleration(&self,models:&PhysicsModels,hitbox_mesh:&HitboxMesh,acceleration:&mut Planar64Vec3){
//TODO: trey push solve //TODO: trey push solve
for contact in &self.contacts{ for contact in &self.contacts{
let n=contact_normal(models,style_mesh,contact); let n=contact_normal(models,hitbox_mesh,contact);
let d=n.dot128(*acceleration); let d=n.dot128(*acceleration);
if d<0{ if d<0{
*acceleration-=n*Planar64::raw(((d<<32)/n.dot128(n)) as i64); *acceleration-=n*Planar64::raw(((d<<32)/n.dot128(n)) as i64);
@ -970,7 +932,7 @@ impl instruction::InstructionEmitter<PhysicsInstruction> for PhysicsContext{
} }
impl PhysicsContext{ impl PhysicsContext{
pub fn spawn(&mut self){ pub fn spawn(&mut self){
self.state.mode_state.stage_id=gameplay_modes::StageId::id(0); self.state.mode_state.stage_id=gameplay_modes::StageId::new(0);
self.process_instruction(instruction::TimedInstruction{ self.process_instruction(instruction::TimedInstruction{
time:self.state.time, time:self.state.time,
instruction: PhysicsInstruction::Input(PhysicsInputInstruction::Reset), instruction: PhysicsInstruction::Input(PhysicsInputInstruction::Reset),
@ -1002,7 +964,7 @@ impl PhysicsContext{
self.models.push_mesh(PhysicsMesh::from(model)); self.models.push_mesh(PhysicsMesh::from(model));
} }
} }
self.bvh=bvh::generate_bvh(self.models.aabb_list(),|i|PhysicsModelId::id(i as u32)); self.bvh=bvh::generate_bvh(self.models.aabb_list(),|i|PhysicsModelId::new(i as u32));
println!("Physics Objects: {}",self.models.models.len()); println!("Physics Objects: {}",self.models.models.len());
} }
@ -1192,7 +1154,7 @@ fn run_teleport_behaviour(wormhole:&Option<gameplay_attributes::Wormhole>,game:&
if model_id==next_checkpoint{ if model_id==next_checkpoint{
//if you hit the next number in a sequence of ordered checkpoints //if you hit the next number in a sequence of ordered checkpoints
//increment the current checkpoint id //increment the current checkpoint id
game.next_ordered_checkpoint_id=gameplay_modes::CheckpointId::id(game.next_ordered_checkpoint_id.get()+1); game.next_ordered_checkpoint_id=gameplay_modes::CheckpointId::new(game.next_ordered_checkpoint_id.get()+1);
} }
} }
if stage.unordered_checkpoints.contains(model_id.into()){ if stage.unordered_checkpoints.contains(model_id.into()){