bsp_loader: implement ladders and water

This commit is contained in:
2025-03-11 16:41:46 -07:00
parent 50f6fe5bd8
commit e794b2649c

@ -2,7 +2,7 @@ use std::borrow::Cow;
use vbsp_entities_css::Entity; use vbsp_entities_css::Entity;
use strafesnet_common::{map,model,integer,gameplay_attributes}; use strafesnet_common::{map,model,integer,gameplay_attributes as attr};
use strafesnet_deferred_loader::deferred_loader::{MeshDeferredLoader,RenderConfigDeferredLoader}; use strafesnet_deferred_loader::deferred_loader::{MeshDeferredLoader,RenderConfigDeferredLoader};
use strafesnet_deferred_loader::mesh::Meshes; use strafesnet_deferred_loader::mesh::Meshes;
use strafesnet_deferred_loader::texture::{RenderConfigs,Texture}; use strafesnet_deferred_loader::texture::{RenderConfigs,Texture};
@ -42,7 +42,7 @@ fn add_brush<'a>(
model:&'a str, model:&'a str,
origin:vbsp::Vector, origin:vbsp::Vector,
rendercolor:vbsp::Color, rendercolor:vbsp::Color,
attributes:gameplay_attributes::CollisionAttributesId, attributes:attr::CollisionAttributesId,
){ ){
let transform=integer::Planar64Affine3::from_translation( let transform=integer::Planar64Affine3::from_translation(
valve_transform(origin.into()) valve_transform(origin.into())
@ -83,13 +83,40 @@ pub fn convert<'a>(
)->PartialMap1{ )->PartialMap1{
let bsp=bsp.as_ref(); let bsp=bsp.as_ref();
//figure out real attributes later //figure out real attributes later
let mut unique_attributes=Vec::new(); let unique_attributes=vec![
unique_attributes.push(gameplay_attributes::CollisionAttributes::Decoration); attr::CollisionAttributes::Decoration,
unique_attributes.push(gameplay_attributes::CollisionAttributes::contact_default()); attr::CollisionAttributes::contact_default(),
unique_attributes.push(gameplay_attributes::CollisionAttributes::intersect_default()); attr::CollisionAttributes::intersect_default(),
const ATTRIBUTE_DECORATION:gameplay_attributes::CollisionAttributesId=gameplay_attributes::CollisionAttributesId::new(0); // ladder
const ATTRIBUTE_CONTACT_DEFAULT:gameplay_attributes::CollisionAttributesId=gameplay_attributes::CollisionAttributesId::new(1); attr::CollisionAttributes::Contact(
const ATTRIBUTE_INTERSECT_DEFAULT:gameplay_attributes::CollisionAttributesId=gameplay_attributes::CollisionAttributesId::new(2); attr::ContactAttributes{
contacting:attr::ContactingAttributes{
contact_behaviour:Some(attr::ContactingBehaviour::Ladder(
attr::ContactingLadder{sticky:true}
))
},
general:attr::GeneralAttributes::default(),
}
),
// water
attr::CollisionAttributes::Intersect(
attr::IntersectAttributes{
intersecting:attr::IntersectingAttributes{
water:Some(attr::IntersectingWater{
viscosity:integer::Planar64::ONE,
density:integer::Planar64::ONE,
velocity:integer::vec3::ZERO,
}),
},
general:attr::GeneralAttributes::default(),
}
),
];
const ATTRIBUTE_DECORATION:attr::CollisionAttributesId=attr::CollisionAttributesId::new(0);
const ATTRIBUTE_CONTACT_DEFAULT:attr::CollisionAttributesId=attr::CollisionAttributesId::new(1);
const ATTRIBUTE_INTERSECT_DEFAULT:attr::CollisionAttributesId=attr::CollisionAttributesId::new(2);
const ATTRIBUTE_LADDER_DEFAULT:attr::CollisionAttributesId=attr::CollisionAttributesId::new(3);
const ATTRIBUTE_WATER_DEFAULT:attr::CollisionAttributesId=attr::CollisionAttributesId::new(4);
//declare all prop models to Loader //declare all prop models to Loader
let mut prop_models=bsp.static_props().map(|prop|{ let mut prop_models=bsp.static_props().map(|prop|{
@ -237,9 +264,27 @@ pub fn convert<'a>(
// physics models // physics models
for brush in &bsp.brushes{ for brush in &bsp.brushes{
if !brush.flags.contains(vbsp::BrushFlags::SOLID){ const RELEVANT:vbsp::BrushFlags=
vbsp::BrushFlags::SOLID
.union(vbsp::BrushFlags::PLAYERCLIP)
.union(vbsp::BrushFlags::WATER)
.union(vbsp::BrushFlags::MOVEABLE)
.union(vbsp::BrushFlags::LADDER);
if !brush.flags.intersects(RELEVANT){
continue; continue;
} }
let is_ladder=brush.flags.contains(vbsp::BrushFlags::LADDER);
let is_water=brush.flags.contains(vbsp::BrushFlags::WATER);
let attributes=match (is_ladder,is_water){
(true,false)=>ATTRIBUTE_LADDER_DEFAULT,
(false,true)=>ATTRIBUTE_WATER_DEFAULT,
(false,false)=>ATTRIBUTE_CONTACT_DEFAULT,
(true,true)=>{
// water ladder? wtf
println!("brush is a water ladder o_o defaulting to ladder");
ATTRIBUTE_LADDER_DEFAULT
}
};
let mesh_result=crate::brush::brush_to_mesh(bsp,brush); let mesh_result=crate::brush::brush_to_mesh(bsp,brush);
match mesh_result{ match mesh_result{
Ok(mesh)=>{ Ok(mesh)=>{
@ -247,7 +292,7 @@ pub fn convert<'a>(
world_meshes.push(mesh); world_meshes.push(mesh);
world_models.push(model::Model{ world_models.push(model::Model{
mesh:mesh_id, mesh:mesh_id,
attributes:ATTRIBUTE_CONTACT_DEFAULT, attributes,
transform:integer::Planar64Affine3::new( transform:integer::Planar64Affine3::new(
integer::mat3::identity(), integer::mat3::identity(),
integer::vec3::ZERO, integer::vec3::ZERO,
@ -295,7 +340,7 @@ pub fn convert<'a>(
//partially constructed map types //partially constructed map types
pub struct PartialMap1{ pub struct PartialMap1{
attributes:Vec<strafesnet_common::gameplay_attributes::CollisionAttributes>, attributes:Vec<attr::CollisionAttributes>,
prop_models:Vec<model::Model>, prop_models:Vec<model::Model>,
world_meshes:Vec<model::Mesh>, world_meshes:Vec<model::Mesh>,
world_models:Vec<model::Model>, world_models:Vec<model::Model>,
@ -317,7 +362,7 @@ impl PartialMap1{
} }
} }
pub struct PartialMap2{ pub struct PartialMap2{
attributes:Vec<strafesnet_common::gameplay_attributes::CollisionAttributes>, attributes:Vec<attr::CollisionAttributes>,
prop_meshes:Vec<(model::MeshId,model::Mesh)>, prop_meshes:Vec<(model::MeshId,model::Mesh)>,
prop_models:Vec<model::Model>, prop_models:Vec<model::Model>,
world_meshes:Vec<model::Mesh>, world_meshes:Vec<model::Mesh>,