summaryrefslogtreecommitdiff
path: root/engine/src/rendering/shader/default.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/rendering/shader/default.rs')
-rw-r--r--engine/src/rendering/shader/default.rs305
1 files changed, 153 insertions, 152 deletions
diff --git a/engine/src/rendering/shader/default.rs b/engine/src/rendering/shader/default.rs
index bb5c366..6621d06 100644
--- a/engine/src/rendering/shader/default.rs
+++ b/engine/src/rendering/shader/default.rs
@@ -165,22 +165,20 @@ pub fn enqueue_set_shader_bindings(
let lighting_shader_cursor = shader_cursor.field("Uniforms").field("lighting");
let material_shader_cursor = lighting_shader_cursor.field("material");
- shader_bindings.extend([
- (model_3d_shader_cursor.field("model"), model_matrix.into()),
- (
- model_3d_shader_cursor.field("model_inverted"),
- inverted_model_matrix.into(),
- ),
- (
- model_3d_shader_cursor.field("view"),
- create_view_matrix(&camera, camera_world_pos.position).into(),
- ),
- (
- lighting_shader_cursor.field("view_pos"),
- camera_world_pos.position.into(),
- ),
- (
- material_shader_cursor.field("ambient"),
+ shader_bindings.bindings.extend([
+ model_3d_shader_cursor
+ .field("model")
+ .binding(model_matrix.into())?,
+ model_3d_shader_cursor
+ .field("model_inverted")
+ .binding(inverted_model_matrix.into())?,
+ model_3d_shader_cursor
+ .field("view")
+ .binding(create_view_matrix(&camera, camera_world_pos.position).into())?,
+ lighting_shader_cursor
+ .field("view_pos")
+ .binding(camera_world_pos.position.into())?,
+ material_shader_cursor.field("ambient").binding(
(if material_flags.use_ambient_color {
&model_material.ambient
} else {
@@ -188,161 +186,164 @@ pub fn enqueue_set_shader_bindings(
}
.clone())
.into(),
- ),
- (
- material_shader_cursor.field("diffuse"),
- model_material.diffuse.clone().into(),
- ),
- (
- material_shader_cursor.field("specular"),
- model_material.specular.clone().into(),
- ),
- (
- material_shader_cursor.field("shininess"),
- model_material.shininess.into(),
- ),
- (
- lighting_shader_cursor.field("directional_light_cnt"),
+ )?,
+ material_shader_cursor
+ .field("diffuse")
+ .binding(model_material.diffuse.clone().into())?,
+ material_shader_cursor
+ .field("specular")
+ .binding(model_material.specular.clone().into())?,
+ material_shader_cursor
+ .field("shininess")
+ .binding(model_material.shininess.into())?,
+ lighting_shader_cursor
+ .field("directional_light_cnt")
+ .binding(
u32::try_from(directional_light_query.iter().count())
.expect(
"Directional light count does not fit in 32-bit unsigned integer",
)
.into(),
- ),
- (
- lighting_shader_cursor.field("point_light_cnt"),
+ )?,
+ lighting_shader_cursor.field("point_light_cnt").binding(
u32::try_from(point_light_query.iter().count())
.expect("Point light count does not fit in 32-bit unsigned integer")
.into(),
- ),
+ )?,
]);
for (window, window_surface_spec) in &window_query {
shader_bindings.surface_specific_bindings.push((
window_surface_spec.id,
- model_3d_shader_cursor
- .field("projection")
- .into_binding_location(),
- create_projection_matrix(&camera, &window.inner_size).into(),
+ model_3d_shader_cursor.field("projection").binding(
+ create_projection_matrix(&camera, &window.inner_size).into(),
+ )?,
));
}
- shader_bindings.extend(point_light_query.iter().enumerate().flat_map(
- |(point_light_index, (point_light, point_light_world_pos))| {
- let point_light_shader_cursor = lighting_shader_cursor
- .field("point_lights")
- .element(point_light_index);
-
- let phong_shader_cursor = point_light_shader_cursor.field("phong");
-
- let attenuation_props_shader_cursor =
- point_light_shader_cursor.field("attenuation_props");
-
- [
- (
- phong_shader_cursor.field("diffuse"),
- point_light.diffuse.clone().into(),
- ),
- (
- phong_shader_cursor.field("specular"),
- point_light.specular.clone().into(),
- ),
- (
- point_light_shader_cursor.field("position"),
- (point_light_world_pos.position + point_light.local_position)
- .into(),
- ),
- (
- attenuation_props_shader_cursor.field("constant"),
- point_light.attenuation_params.constant.into(),
- ),
- (
- attenuation_props_shader_cursor.field("linear"),
- point_light.attenuation_params.linear.into(),
- ),
- (
- attenuation_props_shader_cursor.field("quadratic"),
- point_light.attenuation_params.quadratic.into(),
- ),
- ]
- },
- ));
-
- shader_bindings.extend(directional_light_query.iter().enumerate().flat_map(
- |(directional_light_index, (directional_light,))| {
- let directional_light_shader_cursor = lighting_shader_cursor
- .field("directional_lights")
- .element(directional_light_index);
-
- let phong_shader_cursor = directional_light_shader_cursor.field("phong");
-
- [
- (
- phong_shader_cursor.field("diffuse"),
- directional_light.diffuse.clone().into(),
- ),
- (
- phong_shader_cursor.field("specular"),
- directional_light.specular.clone().into(),
- ),
- (
- directional_light_shader_cursor.field("direction"),
- directional_light.direction.into(),
- ),
- ]
- },
- ));
+ shader_bindings
+ .bindings
+ .reserve(point_light_query.iter().count() * 6);
- shader_bindings.bindings.push((
- shader_cursor.field("ambient_map").into_binding_location(),
- ShaderBindingValue::Texture(
- model_material
- .ambient_map
- .as_ref()
- .map(|ambient_map| ambient_map.clone())
- .unwrap_or_else(|| {
- assets
- .get_handle_to_loaded(TEXTURE_WHITE_1X1_ASSET_LABEL.clone())
- .expect("Not possible")
- })
- .id()
- .into(),
- ),
- ));
+ for (point_light_index, (point_light, point_light_world_pos)) in
+ point_light_query.iter().enumerate()
+ {
+ let point_light_shader_cursor = lighting_shader_cursor
+ .field("point_lights")
+ .element(point_light_index);
+
+ let phong_shader_cursor = point_light_shader_cursor.field("phong");
+
+ let attenuation_props_shader_cursor =
+ point_light_shader_cursor.field("attenuation_props");
+
+ shader_bindings.bindings.extend([
+ phong_shader_cursor
+ .field("diffuse")
+ .binding(point_light.diffuse.clone().into())?,
+ phong_shader_cursor
+ .field("specular")
+ .binding(point_light.specular.clone().into())?,
+ point_light_shader_cursor.field("position").binding(
+ (point_light_world_pos.position + point_light.local_position).into(),
+ )?,
+ attenuation_props_shader_cursor
+ .field("constant")
+ .binding(point_light.attenuation_params.constant.into())?,
+ attenuation_props_shader_cursor
+ .field("linear")
+ .binding(point_light.attenuation_params.linear.into())?,
+ attenuation_props_shader_cursor
+ .field("quadratic")
+ .binding(point_light.attenuation_params.quadratic.into())?,
+ ]);
+ }
- shader_bindings.bindings.push((
- shader_cursor.field("diffuse_map").into_binding_location(),
- ShaderBindingValue::Texture(
- model_material
- .diffuse_map
- .as_ref()
- .map(|diffuse_map| diffuse_map.clone())
- .unwrap_or_else(|| {
- assets
- .get_handle_to_loaded(TEXTURE_WHITE_1X1_ASSET_LABEL.clone())
- .expect("Not possible")
- })
- .id()
- .into(),
- ),
- ));
+ shader_bindings
+ .bindings
+ .reserve(directional_light_query.iter().count() * 3);
- shader_bindings.bindings.push((
- shader_cursor.field("specular_map").into_binding_location(),
- ShaderBindingValue::Texture(
- model_material
- .specular_map
- .as_ref()
- .map(|specular_map| specular_map.clone())
- .unwrap_or_else(|| {
- assets
- .get_handle_to_loaded(TEXTURE_WHITE_1X1_ASSET_LABEL.clone())
- .expect("Not possible")
- })
- .id()
- .into(),
- ),
- ));
+ for (directional_light_index, (directional_light,)) in
+ directional_light_query.iter().enumerate()
+ {
+ let directional_light_shader_cursor = lighting_shader_cursor
+ .field("directional_lights")
+ .element(directional_light_index);
+
+ let phong_shader_cursor = directional_light_shader_cursor.field("phong");
+
+ shader_bindings.bindings.extend([
+ phong_shader_cursor
+ .field("diffuse")
+ .binding(directional_light.diffuse.clone().into())?,
+ phong_shader_cursor
+ .field("specular")
+ .binding(directional_light.specular.clone().into())?,
+ directional_light_shader_cursor
+ .field("direction")
+ .binding(directional_light.direction.into())?,
+ ]);
+ }
+
+ shader_bindings.bindings.push(
+ shader_cursor
+ .field("ambient_map")
+ .binding(ShaderBindingValue::Texture(
+ model_material
+ .ambient_map
+ .as_ref()
+ .map(|ambient_map| ambient_map.clone())
+ .unwrap_or_else(|| {
+ assets
+ .get_handle_to_loaded(
+ TEXTURE_WHITE_1X1_ASSET_LABEL.clone(),
+ )
+ .expect("Not possible")
+ })
+ .id()
+ .into(),
+ ))?,
+ );
+
+ shader_bindings.bindings.push(
+ shader_cursor
+ .field("diffuse_map")
+ .binding(ShaderBindingValue::Texture(
+ model_material
+ .diffuse_map
+ .as_ref()
+ .map(|diffuse_map| diffuse_map.clone())
+ .unwrap_or_else(|| {
+ assets
+ .get_handle_to_loaded(
+ TEXTURE_WHITE_1X1_ASSET_LABEL.clone(),
+ )
+ .expect("Not possible")
+ })
+ .id()
+ .into(),
+ ))?,
+ );
+
+ shader_bindings.bindings.push(
+ shader_cursor
+ .field("specular_map")
+ .binding(ShaderBindingValue::Texture(
+ model_material
+ .specular_map
+ .as_ref()
+ .map(|specular_map| specular_map.clone())
+ .unwrap_or_else(|| {
+ assets
+ .get_handle_to_loaded(
+ TEXTURE_WHITE_1X1_ASSET_LABEL.clone(),
+ )
+ .expect("Not possible")
+ })
+ .id()
+ .into(),
+ ))?,
+ );
if !has_pending_shader_bindings_comp {
actions.add_components(entity_id, (shader_bindings.clone(),));