Merge c05f08c03a
into cb64a4aa8a
This commit is contained in:
commit
1ce5c9d168
@ -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;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user