bsp_loader: implement ladders and water
This commit is contained in:
@ -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>,
|
||||||
|
Reference in New Issue
Block a user