From 0107f6a52027c2afffbbdbc6c755a60b3d935c73 Mon Sep 17 00:00:00 2001 From: extrawurst Date: Tue, 29 Apr 2025 21:08:17 +0200 Subject: [PATCH] wip --- assets/maps/map1.map | 5 +++++ src/camera.rs | 3 ++- src/tb_entities.rs | 47 +++++++++++++++++++++++++++++++++++++++ trenchbroom/hedz/hedz.fgd | 4 ++++ 4 files changed, 58 insertions(+), 1 deletion(-) diff --git a/assets/maps/map1.map b/assets/maps/map1.map index c272d08..d3be3a6 100644 --- a/assets/maps/map1.map +++ b/assets/maps/map1.map @@ -1530,3 +1530,8 @@ ( 832 7360 -1568 ) ( 832 7360 -1567 ) ( 832 7361 -1568 ) water [ 0 1 0 0 ] [ 0 0 -1 -32 ] 270 1 1 } } +// entity 40 +{ +"classname" "decal" +"origin" "56 -440 -232" +} diff --git a/src/camera.rs b/src/camera.rs index 39f3cd9..d792b31 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -1,5 +1,5 @@ use avian3d::prelude::*; -use bevy::prelude::*; +use bevy::{core_pipeline::prepass::DepthPrepass, prelude::*}; use crate::{ GameState, @@ -59,6 +59,7 @@ pub fn plugin(app: &mut App) { fn startup(mut commands: Commands) { commands.spawn(( Camera3d::default(), + DepthPrepass, MainCamera::new(Vec3::new(0., 2.5, -13.)), CameraRotationInput::default(), )); diff --git a/src/tb_entities.rs b/src/tb_entities.rs index b87ddf3..f7ca4b7 100644 --- a/src/tb_entities.rs +++ b/src/tb_entities.rs @@ -2,6 +2,7 @@ use avian3d::prelude::*; use bevy::{ ecs::{component::HookContext, world::DeferredWorld}, math::*, + pbr::decal::{ForwardDecal, ForwardDecalMaterial, ForwardDecalMaterialExt}, prelude::*, }; use bevy_trenchbroom::prelude::*; @@ -64,6 +65,52 @@ pub struct NamedEntity { #[geometry(GeometryProvider::new().convex_collider())] pub struct Platform; +#[derive(PointClass, Component, Reflect, Default)] +#[reflect(Component)] +#[require(Transform)] +#[component(on_add = Self::on_add)] +pub struct Decal; + +impl Decal { + fn on_add(mut world: DeferredWorld, HookContext { entity, .. }: HookContext) { + let Some(server) = world.get_resource::() else { + return; + }; + + let fence = server.load("textures/fence.png"); + + let Some(mut decal_standard_materials) = + world.get_resource_mut::>>() + else { + return; + }; + + let decal = decal_standard_materials.add(ForwardDecalMaterial { + base: StandardMaterial { + base_color_texture: Some(fence), + unlit: true, + ..default() + }, + extension: ForwardDecalMaterialExt { + depth_fade_factor: 1., + }, + }); + + let mut this_transform = *world + .get_entity(entity) + .unwrap() + .get::() + .unwrap(); + this_transform.scale = Vec3::splat(100.); + + world.commands().entity(entity).insert(( + this_transform, + ForwardDecal, + MeshMaterial3d(decal), + )); + } +} + #[derive(PointClass, Component, Reflect, Default)] #[reflect(Component)] #[require(Transform)] diff --git a/trenchbroom/hedz/hedz.fgd b/trenchbroom/hedz/hedz.fgd index 10c1464..92f1181 100644 --- a/trenchbroom/hedz/hedz.fgd +++ b/trenchbroom/hedz/hedz.fgd @@ -79,6 +79,10 @@ [ ] +@PointClass base(transform) = decal +[ +] + @PointClass base(transform) model({ "path": "models/alien_naked.glb" }) = enemy_spawn [ head(string) : "head" : "" : ""