@@ -5,24 +5,27 @@ use processing_core::app_mut;
55use processing_core:: error:: { self , ProcessingError , Result } ;
66
77use crate :: geometry:: Geometry ;
8+ use crate :: particles:: kernels:: set_requires;
89use crate :: shader_value:: ShaderValue ;
910use crate :: {
1011 buffer_create_with_data, compute_create, compute_set, geometry_attribute_position, shader_load,
1112} ;
1213
1314pub fn particles_scatter_create ( source_geometry : Entity ) -> error:: Result < Entity > {
14- let ( cdf_bytes, indices_bytes, face_count) = app_mut ( |app| {
15+ let ( cdf_bytes, indices_bytes, uv_bytes , face_count) = app_mut ( |app| {
1516 app. world_mut ( )
1617 . run_system_cached_with ( prepare_scatter_source, source_geometry)
1718 . unwrap ( )
1819 } ) ?;
1920
2021 let cdf_buf = buffer_create_with_data ( cdf_bytes) ?;
2122 let idx_buf = buffer_create_with_data ( indices_bytes) ?;
23+ let uv_buf = buffer_create_with_data ( uv_bytes) ?;
2224
2325 let shader =
2426 shader_load ( "embedded://processing_render/particles/kernels/scatter_surface.wgsl" ) ?;
2527 let scatter = compute_create ( shader) ?;
28+ set_requires ( scatter, & [ "position" , "scale" , "age" , "life" , "uv" ] ) ?;
2629
2730 let position_attr = geometry_attribute_position ( ) ;
2831 compute_set (
@@ -32,6 +35,7 @@ pub fn particles_scatter_create(source_geometry: Entity) -> error::Result<Entity
3235 ) ?;
3336 compute_set ( scatter, "source_indices" , ShaderValue :: Buffer ( idx_buf) ) ?;
3437 compute_set ( scatter, "cdf" , ShaderValue :: Buffer ( cdf_buf) ) ?;
38+ compute_set ( scatter, "source_uv" , ShaderValue :: Buffer ( uv_buf) ) ?;
3539 compute_set ( scatter, "face_count" , ShaderValue :: UInt ( face_count) ) ?;
3640 compute_set ( scatter, "seed" , ShaderValue :: UInt ( 0xc0ffeeu32 ) ) ?;
3741
@@ -119,7 +123,7 @@ pub fn prepare_scatter_source(
119123 In ( geom_entity) : In < Entity > ,
120124 geometries : Query < & Geometry > ,
121125 mut meshes : ResMut < Assets < Mesh > > ,
122- ) -> Result < ( Vec < u8 > , Vec < u8 > , u32 ) > {
126+ ) -> Result < ( Vec < u8 > , Vec < u8 > , Vec < u8 > , u32 ) > {
123127 let geom = geometries
124128 . get ( geom_entity)
125129 . map_err ( |_| ProcessingError :: GeometryNotFound ) ?;
@@ -130,6 +134,11 @@ pub fn prepare_scatter_source(
130134
131135 let ( positions, dense_indices) = extract_scatter_geometry ( mesh) ?;
132136 let face_count = ( dense_indices. len ( ) / 3 ) as u32 ;
137+ // a mesh without UVs scatters with uv (0, 0)
138+ let uvs = match mesh. attribute ( Mesh :: ATTRIBUTE_UV_0 ) {
139+ Some ( VertexAttributeValues :: Float32x2 ( uv) ) => uv. clone ( ) ,
140+ _ => vec ! [ [ 0.0 , 0.0 ] ; positions. len( ) ] ,
141+ } ;
133142
134143 let mut cum = Vec :: with_capacity ( face_count as usize ) ;
135144 let mut total = 0.0_f32 ;
@@ -156,7 +165,8 @@ pub fn prepare_scatter_source(
156165
157166 let cdf_bytes: Vec < u8 > = cum. iter ( ) . flat_map ( |f| f. to_le_bytes ( ) ) . collect ( ) ;
158167 let indices_bytes: Vec < u8 > = dense_indices. iter ( ) . flat_map ( |i| i. to_le_bytes ( ) ) . collect ( ) ;
159- Ok ( ( cdf_bytes, indices_bytes, face_count) )
168+ let uv_bytes: Vec < u8 > = uvs. iter ( ) . flatten ( ) . flat_map ( |f| f. to_le_bytes ( ) ) . collect ( ) ;
169+ Ok ( ( cdf_bytes, indices_bytes, uv_bytes, face_count) )
160170}
161171
162172pub fn prepare_scatter_volume_source (
0 commit comments