Replace the FORWARD_DECAL_MESH_HANDLE with a resource that gets cloned out in a hook.

This commit is contained in:
andriyDev 2025-05-28 23:59:57 -07:00
parent 1fb5a62297
commit c05f08c03a

View File

@ -3,26 +3,26 @@ use crate::{
MaterialPlugin, StandardMaterial,
};
use bevy_app::{App, Plugin};
use bevy_asset::{uuid_handle, Asset, Assets, Handle};
use bevy_ecs::component::Component;
use bevy_asset::{Asset, Assets, Handle};
use bevy_ecs::{
component::Component, lifecycle::HookContext, resource::Resource, world::DeferredWorld,
};
use bevy_math::{prelude::Rectangle, Quat, Vec2, Vec3};
use bevy_reflect::{Reflect, TypePath};
use bevy_render::load_shader_library;
use bevy_render::mesh::Mesh3d;
use bevy_render::render_asset::RenderAssets;
use bevy_render::render_resource::{AsBindGroupShaderType, ShaderType};
use bevy_render::texture::GpuImage;
use bevy_render::{
alpha::AlphaMode,
mesh::{Mesh, Mesh3d, MeshBuilder, MeshVertexBufferLayoutRef, Meshable},
mesh::{Mesh, MeshBuilder, MeshVertexBufferLayoutRef, Meshable},
render_resource::{
AsBindGroup, CompareFunction, RenderPipelineDescriptor, SpecializedMeshPipelineError,
},
RenderDebugFlags,
};
const FORWARD_DECAL_MESH_HANDLE: Handle<Mesh> =
uuid_handle!("afa817f9-1869-4e0c-ac0d-d8cd1552d38a");
/// Plugin to render [`ForwardDecal`]s.
pub struct ForwardDecalPlugin;
@ -32,8 +32,7 @@ impl Plugin for ForwardDecalPlugin {
app.register_type::<ForwardDecal>();
app.world_mut().resource_mut::<Assets<Mesh>>().insert(
FORWARD_DECAL_MESH_HANDLE.id(),
let mesh = app.world_mut().resource_mut::<Assets<Mesh>>().add(
Rectangle::from_size(Vec2::ONE)
.mesh()
.build()
@ -42,6 +41,8 @@ impl Plugin for ForwardDecalPlugin {
.unwrap(),
);
app.insert_resource(ForwardDecalMesh(mesh));
app.add_plugins(MaterialPlugin::<ForwardDecalMaterial<StandardMaterial>> {
prepass_enabled: false,
shadows_enabled: false,
@ -63,7 +64,8 @@ impl Plugin for ForwardDecalPlugin {
/// * Looking at forward decals at a steep angle can cause distortion. This can be mitigated by padding your decal's
/// texture with extra transparent pixels on the edges.
#[derive(Component, Reflect)]
#[require(Mesh3d(FORWARD_DECAL_MESH_HANDLE))]
#[require(Mesh3d)]
#[component(on_add=forward_decal_set_mesh)]
pub struct ForwardDecal;
/// Type alias for an extended material with a [`ForwardDecalMaterialExt`] extension.
@ -146,3 +148,16 @@ impl Default for ForwardDecalMaterialExt {
}
}
}
#[derive(Resource)]
struct ForwardDecalMesh(Handle<Mesh>);
fn forward_decal_set_mesh(mut world: DeferredWorld, HookContext { entity, .. }: HookContext) {
let decal_mesh = world.resource::<ForwardDecalMesh>().0.clone();
let mut entity = world.entity_mut(entity);
let mut entity_mesh = entity.get_mut::<Mesh3d>().unwrap();
// Only replace the mesh handle if the mesh handle is defaulted.
if **entity_mesh == Handle::default() {
entity_mesh.0 = decal_mesh;
}
}