#define_import_path bevy_pbr::mesh_view_types struct View { view_proj: mat4x4, inverse_view_proj: mat4x4, view: mat4x4, inverse_view: mat4x4, projection: mat4x4, inverse_projection: mat4x4, world_position: vec3, width: f32, height: f32, }; struct PointLight { // For point lights: the lower-right 2x2 values of the projection matrix [2][2] [2][3] [3][2] [3][3] // For spot lights: the direction (x,z), spot_scale and spot_offset light_custom_data: vec4, color_inverse_square_range: vec4, position_radius: vec4, // 'flags' is a bit field indicating various options. u32 is 32 bits so we have up to 32 options. flags: u32, shadow_depth_bias: f32, shadow_normal_bias: f32, spot_light_tan_angle: f32, }; const POINT_LIGHT_FLAGS_SHADOWS_ENABLED_BIT: u32 = 1u; const POINT_LIGHT_FLAGS_SPOT_LIGHT_Y_NEGATIVE: u32 = 2u; struct DirectionalLight { view_projection: mat4x4, color: vec4, direction_to_light: vec3, // 'flags' is a bit field indicating various options. u32 is 32 bits so we have up to 32 options. flags: u32, shadow_depth_bias: f32, shadow_normal_bias: f32, }; const DIRECTIONAL_LIGHT_FLAGS_SHADOWS_ENABLED_BIT: u32 = 1u; struct Lights { // NOTE: this array size must be kept in sync with the constants defined bevy_pbr2/src/render/light.rs directional_lights: array, ambient_color: vec4, // x/y/z dimensions and n_clusters in w cluster_dimensions: vec4, // xy are vec2(cluster_dimensions.xy) / vec2(view.width, view.height) // // For perspective projections: // z is cluster_dimensions.z / log(far / near) // w is cluster_dimensions.z * log(near) / log(far / near) // // For orthographic projections: // NOTE: near and far are +ve but -z is infront of the camera // z is -near // w is cluster_dimensions.z / (-far - -near) cluster_factors: vec4, n_directional_lights: u32, spot_light_shadowmap_offset: i32, }; #ifdef NO_STORAGE_BUFFERS_SUPPORT struct PointLights { data: array, }; struct ClusterLightIndexLists { // each u32 contains 4 u8 indices into the PointLights array data: array, 1024u>, }; struct ClusterOffsetsAndCounts { // each u32 contains a 24-bit index into ClusterLightIndexLists in the high 24 bits // and an 8-bit count of the number of lights in the low 8 bits data: array, 1024u>, }; #else struct PointLights { data: array, }; struct ClusterLightIndexLists { data: array, }; struct ClusterOffsetsAndCounts { data: array>, }; #endif