2020-07-10 08:37:06 +00:00
|
|
|
use crate::{ColorMaterial, Sprite, TextureAtlas, TextureAtlasSprite};
|
2020-05-30 19:31:04 +00:00
|
|
|
use bevy_asset::{Assets, Handle};
|
2020-07-10 08:37:06 +00:00
|
|
|
use bevy_ecs::Resources;
|
2020-05-30 19:31:04 +00:00
|
|
|
use bevy_render::{
|
2020-07-17 01:26:21 +00:00
|
|
|
pipeline::{
|
|
|
|
BlendDescriptor, BlendFactor, BlendOperation, ColorStateDescriptor, ColorWrite,
|
|
|
|
CompareFunction, CullMode, DepthStencilStateDescriptor, FrontFace, PipelineDescriptor,
|
2020-08-13 20:58:36 +00:00
|
|
|
RasterizationStateDescriptor, StencilStateDescriptor, StencilStateFaceDescriptor,
|
2020-05-30 19:31:04 +00:00
|
|
|
},
|
2020-07-17 01:26:21 +00:00
|
|
|
render_graph::{base, AssetRenderResourcesNode, RenderGraph, RenderResourcesNode},
|
2020-05-30 19:31:04 +00:00
|
|
|
shader::{Shader, ShaderStage, ShaderStages},
|
|
|
|
texture::TextureFormat,
|
|
|
|
};
|
2020-10-18 20:48:15 +00:00
|
|
|
use bevy_type_registry::TypeUuid;
|
2020-05-30 19:31:04 +00:00
|
|
|
|
|
|
|
pub const SPRITE_PIPELINE_HANDLE: Handle<PipelineDescriptor> =
|
2020-10-18 20:48:15 +00:00
|
|
|
Handle::weak_from_u64(PipelineDescriptor::TYPE_UUID, 2785347840338765446);
|
2020-05-30 19:31:04 +00:00
|
|
|
|
2020-06-02 02:23:11 +00:00
|
|
|
pub const SPRITE_SHEET_PIPELINE_HANDLE: Handle<PipelineDescriptor> =
|
2020-10-18 20:48:15 +00:00
|
|
|
Handle::weak_from_u64(PipelineDescriptor::TYPE_UUID, 9016885805180281612);
|
2020-06-02 02:23:11 +00:00
|
|
|
|
|
|
|
pub fn build_sprite_sheet_pipeline(shaders: &mut Assets<Shader>) -> PipelineDescriptor {
|
|
|
|
PipelineDescriptor {
|
|
|
|
rasterization_state: Some(RasterizationStateDescriptor {
|
2020-07-20 08:33:30 +00:00
|
|
|
front_face: FrontFace::Ccw,
|
2020-08-22 02:52:31 +00:00
|
|
|
cull_mode: CullMode::None,
|
2020-06-02 02:23:11 +00:00
|
|
|
depth_bias: 0,
|
|
|
|
depth_bias_slope_scale: 0.0,
|
|
|
|
depth_bias_clamp: 0.0,
|
2020-08-13 20:58:36 +00:00
|
|
|
clamp_depth: false,
|
2020-06-02 02:23:11 +00:00
|
|
|
}),
|
|
|
|
depth_stencil_state: Some(DepthStencilStateDescriptor {
|
|
|
|
format: TextureFormat::Depth32Float,
|
|
|
|
depth_write_enabled: true,
|
2020-08-28 23:45:54 +00:00
|
|
|
depth_compare: CompareFunction::LessEqual,
|
2020-08-13 20:58:36 +00:00
|
|
|
stencil: StencilStateDescriptor {
|
|
|
|
front: StencilStateFaceDescriptor::IGNORE,
|
|
|
|
back: StencilStateFaceDescriptor::IGNORE,
|
|
|
|
read_mask: 0,
|
|
|
|
write_mask: 0,
|
|
|
|
},
|
2020-06-02 02:23:11 +00:00
|
|
|
}),
|
|
|
|
color_states: vec![ColorStateDescriptor {
|
2020-10-16 18:44:31 +00:00
|
|
|
format: TextureFormat::default(),
|
2020-06-02 02:23:11 +00:00
|
|
|
color_blend: BlendDescriptor {
|
|
|
|
src_factor: BlendFactor::SrcAlpha,
|
|
|
|
dst_factor: BlendFactor::OneMinusSrcAlpha,
|
|
|
|
operation: BlendOperation::Add,
|
|
|
|
},
|
|
|
|
alpha_blend: BlendDescriptor {
|
|
|
|
src_factor: BlendFactor::One,
|
|
|
|
dst_factor: BlendFactor::One,
|
|
|
|
operation: BlendOperation::Add,
|
|
|
|
},
|
|
|
|
write_mask: ColorWrite::ALL,
|
|
|
|
}],
|
|
|
|
..PipelineDescriptor::new(ShaderStages {
|
|
|
|
vertex: shaders.add(Shader::from_glsl(
|
|
|
|
ShaderStage::Vertex,
|
|
|
|
include_str!("sprite_sheet.vert"),
|
|
|
|
)),
|
|
|
|
fragment: Some(shaders.add(Shader::from_glsl(
|
|
|
|
ShaderStage::Fragment,
|
|
|
|
include_str!("sprite_sheet.frag"),
|
|
|
|
))),
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-30 19:31:04 +00:00
|
|
|
pub fn build_sprite_pipeline(shaders: &mut Assets<Shader>) -> PipelineDescriptor {
|
|
|
|
PipelineDescriptor {
|
|
|
|
rasterization_state: Some(RasterizationStateDescriptor {
|
2020-07-20 08:33:30 +00:00
|
|
|
front_face: FrontFace::Ccw,
|
2020-08-22 02:52:31 +00:00
|
|
|
cull_mode: CullMode::None,
|
2020-05-30 19:31:04 +00:00
|
|
|
depth_bias: 0,
|
|
|
|
depth_bias_slope_scale: 0.0,
|
|
|
|
depth_bias_clamp: 0.0,
|
2020-08-13 20:58:36 +00:00
|
|
|
clamp_depth: false,
|
2020-05-30 19:31:04 +00:00
|
|
|
}),
|
|
|
|
depth_stencil_state: Some(DepthStencilStateDescriptor {
|
|
|
|
format: TextureFormat::Depth32Float,
|
|
|
|
depth_write_enabled: true,
|
2020-08-28 23:45:54 +00:00
|
|
|
depth_compare: CompareFunction::LessEqual,
|
2020-08-13 20:58:36 +00:00
|
|
|
stencil: StencilStateDescriptor {
|
|
|
|
front: StencilStateFaceDescriptor::IGNORE,
|
|
|
|
back: StencilStateFaceDescriptor::IGNORE,
|
|
|
|
read_mask: 0,
|
|
|
|
write_mask: 0,
|
|
|
|
},
|
2020-05-30 19:31:04 +00:00
|
|
|
}),
|
|
|
|
color_states: vec![ColorStateDescriptor {
|
2020-10-16 18:44:31 +00:00
|
|
|
format: TextureFormat::default(),
|
2020-05-30 19:31:04 +00:00
|
|
|
color_blend: BlendDescriptor {
|
|
|
|
src_factor: BlendFactor::SrcAlpha,
|
|
|
|
dst_factor: BlendFactor::OneMinusSrcAlpha,
|
|
|
|
operation: BlendOperation::Add,
|
|
|
|
},
|
|
|
|
alpha_blend: BlendDescriptor {
|
|
|
|
src_factor: BlendFactor::One,
|
|
|
|
dst_factor: BlendFactor::One,
|
|
|
|
operation: BlendOperation::Add,
|
|
|
|
},
|
|
|
|
write_mask: ColorWrite::ALL,
|
|
|
|
}],
|
|
|
|
..PipelineDescriptor::new(ShaderStages {
|
|
|
|
vertex: shaders.add(Shader::from_glsl(
|
|
|
|
ShaderStage::Vertex,
|
|
|
|
include_str!("sprite.vert"),
|
|
|
|
)),
|
|
|
|
fragment: Some(shaders.add(Shader::from_glsl(
|
|
|
|
ShaderStage::Fragment,
|
|
|
|
include_str!("sprite.frag"),
|
|
|
|
))),
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub mod node {
|
2020-08-16 07:30:04 +00:00
|
|
|
pub const COLOR_MATERIAL: &str = "color_material";
|
|
|
|
pub const SPRITE: &str = "sprite";
|
|
|
|
pub const SPRITE_SHEET: &str = "sprite_sheet";
|
|
|
|
pub const SPRITE_SHEET_SPRITE: &str = "sprite_sheet_sprite";
|
2020-05-30 19:31:04 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub trait SpriteRenderGraphBuilder {
|
|
|
|
fn add_sprite_graph(&mut self, resources: &Resources) -> &mut Self;
|
|
|
|
}
|
|
|
|
|
|
|
|
impl SpriteRenderGraphBuilder for RenderGraph {
|
|
|
|
fn add_sprite_graph(&mut self, resources: &Resources) -> &mut Self {
|
|
|
|
self.add_system_node(
|
|
|
|
node::COLOR_MATERIAL,
|
2020-06-11 01:54:17 +00:00
|
|
|
AssetRenderResourcesNode::<ColorMaterial>::new(false),
|
2020-05-30 19:31:04 +00:00
|
|
|
);
|
2020-07-17 01:26:21 +00:00
|
|
|
self.add_node_edge(node::COLOR_MATERIAL, base::node::MAIN_PASS)
|
2020-05-30 19:31:04 +00:00
|
|
|
.unwrap();
|
|
|
|
|
2020-06-22 19:14:40 +00:00
|
|
|
self.add_system_node(node::SPRITE, RenderResourcesNode::<Sprite>::new(true));
|
2020-07-17 01:26:21 +00:00
|
|
|
self.add_node_edge(node::SPRITE, base::node::MAIN_PASS)
|
2020-06-22 19:14:40 +00:00
|
|
|
.unwrap();
|
2020-05-30 19:31:04 +00:00
|
|
|
|
2020-06-03 18:39:10 +00:00
|
|
|
self.add_system_node(
|
|
|
|
node::SPRITE_SHEET,
|
2020-06-11 01:54:17 +00:00
|
|
|
AssetRenderResourcesNode::<TextureAtlas>::new(false),
|
2020-06-03 18:39:10 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
self.add_system_node(
|
|
|
|
node::SPRITE_SHEET_SPRITE,
|
2020-06-11 01:54:17 +00:00
|
|
|
RenderResourcesNode::<TextureAtlasSprite>::new(true),
|
2020-06-03 18:39:10 +00:00
|
|
|
);
|
|
|
|
|
2020-05-30 19:31:04 +00:00
|
|
|
let mut pipelines = resources.get_mut::<Assets<PipelineDescriptor>>().unwrap();
|
|
|
|
let mut shaders = resources.get_mut::<Assets<Shader>>().unwrap();
|
2020-10-18 20:48:15 +00:00
|
|
|
pipelines.set_untracked(SPRITE_PIPELINE_HANDLE, build_sprite_pipeline(&mut shaders));
|
|
|
|
pipelines.set_untracked(
|
2020-06-04 03:08:20 +00:00
|
|
|
SPRITE_SHEET_PIPELINE_HANDLE,
|
|
|
|
build_sprite_sheet_pipeline(&mut shaders),
|
|
|
|
);
|
2020-05-30 19:31:04 +00:00
|
|
|
self
|
|
|
|
}
|
|
|
|
}
|