85 glm::mat4 model{ 1.0f };
86 glm::vec4 base_color_factor{ 1.0f };
87 glm::vec4 material_factors{ 0.0f, 1.0f, 0.0f, 0.0f };
88 glm::vec4 emissive_factor{ 0.0f };
89 glm::vec4 material_strengths{ 1.0f, 1.0f, 1.0f, 0.0f };
90 glm::vec4 ior_factor{ 1.5f, 0.0f, 0.0f, 0.0f };
91 glm::vec4 transmission_factors{ 0.0f };
92 glm::vec4 transmission_semantics{ 0.0f };
93 glm::vec4 transmission_texture_uv_sets{ 0.0f };
94 glm::vec4 transmission_uv_transform{ 0.0f, 0.0f, 1.0f, 1.0f };
95 glm::vec4 transmission_uv_rotations{ 0.0f };
96 glm::vec4 volume_factors{ 0.0f };
97 glm::vec4 volume_attenuation_color{ 1.0f, 1.0f, 1.0f, 0.0f };
98 glm::vec4 volume_semantics{ 0.0f };
99 glm::vec4 volume_texture_uv_sets{ 0.0f };
100 glm::vec4 volume_uv_transform{ 0.0f, 0.0f, 1.0f, 1.0f };
101 glm::vec4 volume_uv_rotations{ 0.0f };
102 glm::vec4 material_semantics{ 0.0f, 0.5f, 0.0f, 0.0f };
103 glm::vec4 texture_uv_sets{ 0.0f };
104 glm::vec4 base_color_uv_transform{ 0.0f, 0.0f, 1.0f, 1.0f };
105 glm::vec4 normal_uv_transform{ 0.0f, 0.0f, 1.0f, 1.0f };
106 glm::vec4 orm_uv_transform{ 0.0f, 0.0f, 1.0f, 1.0f };
107 glm::vec4 emissive_uv_transform{ 0.0f, 0.0f, 1.0f, 1.0f };
108 glm::vec4 texture_uv_rotations{ 0.0f };
109 glm::vec4 specular_factors{ 1.0f, 1.0f, 1.0f, 1.0f };
110 glm::vec4 specular_semantics{ 0.0f };
111 glm::vec4 specular_texture_uv_sets{ 0.0f };
112 glm::vec4 specular_uv_transform{ 0.0f, 0.0f, 1.0f, 1.0f };
113 glm::vec4 specular_color_uv_transform{ 0.0f, 0.0f, 1.0f, 1.0f };
114 glm::vec4 specular_uv_rotations{ 0.0f };
115 glm::vec4 clearcoat_factors{ 0.0f, 0.0f, 1.0f, 0.0f };
116 glm::vec4 clearcoat_semantics{ 0.0f };
117 glm::vec4 clearcoat_texture_uv_sets{ 0.0f };
118 glm::vec4 clearcoat_uv_transform{ 0.0f, 0.0f, 1.0f, 1.0f };
119 glm::vec4 clearcoat_roughness_uv_transform{ 0.0f, 0.0f, 1.0f, 1.0f };
120 glm::vec4 clearcoat_normal_uv_transform{ 0.0f, 0.0f, 1.0f, 1.0f };
121 glm::vec4 clearcoat_uv_rotations{ 0.0f };
122 glm::vec4 sheen_factors{ 0.0f };
123 glm::vec4 sheen_semantics{ 0.0f };
124 glm::vec4 sheen_texture_uv_sets{ 0.0f };
125 glm::vec4 sheen_color_uv_transform{ 0.0f, 0.0f, 1.0f, 1.0f };
126 glm::vec4 sheen_roughness_uv_transform{ 0.0f, 0.0f, 1.0f, 1.0f };
127 glm::vec4 sheen_uv_rotations{ 0.0f };
128 glm::vec4 iridescence_factors{ 0.0f, 1.3f, 100.0f, 400.0f };
129 glm::vec4 iridescence_semantics{ 0.0f };
130 glm::vec4 iridescence_texture_uv_sets{ 0.0f };
131 glm::vec4 iridescence_uv_transform{ 0.0f, 0.0f, 1.0f, 1.0f };
132 glm::vec4 iridescence_thickness_uv_transform{ 0.0f, 0.0f, 1.0f, 1.0f };
133 glm::vec4 iridescence_uv_rotations{ 0.0f };
145 std::shared_ptr<StaticMeshResource> static_mesh;
146 std::shared_ptr<MorphMeshResource> morph_mesh;
147 std::shared_ptr<SkinnedMeshResource> skinned_mesh;
148 std::shared_ptr<SkinnedMorphMeshResource> skinned_morph_mesh;
149 std::shared_ptr<Image2D> base_color_texture;
150 std::shared_ptr<Image2D> normal_texture;
151 std::shared_ptr<Image2D> orm_texture;
152 std::shared_ptr<Image2D> emissive_texture;
153 std::shared_ptr<Image2D> transmission_texture;
154 std::shared_ptr<Image2D> volume_thickness_texture;
155 std::shared_ptr<Image2D> specular_texture;
156 std::shared_ptr<Image2D> specular_color_texture;
157 std::shared_ptr<Image2D> clearcoat_texture;
158 std::shared_ptr<Image2D> clearcoat_roughness_texture;
159 std::shared_ptr<Image2D> clearcoat_normal_texture;
160 std::shared_ptr<Image2D> sheen_color_texture;
161 std::shared_ptr<Image2D> sheen_roughness_texture;
162 std::shared_ptr<Image2D> iridescence_texture;
163 std::shared_ptr<Image2D> iridescence_thickness_texture;
164 std::vector<std::unique_ptr<StorageBuffer>> joint_palette_buffers;
165 std::vector<std::unique_ptr<StorageBuffer>> morph_weights_buffers;
167 void ResetResolvedBindings()
noexcept
171 skinned_mesh.reset();
172 skinned_morph_mesh.reset();
173 base_color_texture.reset();
174 normal_texture.reset();
176 emissive_texture.reset();
177 transmission_texture.reset();
178 volume_thickness_texture.reset();
179 specular_texture.reset();
180 specular_color_texture.reset();
181 clearcoat_texture.reset();
182 clearcoat_roughness_texture.reset();
183 clearcoat_normal_texture.reset();
184 sheen_color_texture.reset();
185 sheen_roughness_texture.reset();
186 iridescence_texture.reset();
187 iridescence_thickness_texture.reset();
190 [[nodiscard]] StorageBuffer* GetJointPaletteBuffer(
const uint32_t image_index)
const noexcept
192 return image_index < joint_palette_buffers.size() ? joint_palette_buffers[image_index].get() :
nullptr;
195 [[nodiscard]] StorageBuffer* GetMorphWeightsBuffer(
const uint32_t image_index)
const noexcept
197 return image_index < morph_weights_buffers.size() ? morph_weights_buffers[image_index].get() :
nullptr;
200 [[nodiscard]]
const Buffer* GetVertexBuffer()
const noexcept
204 return static_mesh->GetVertexBuffer();
208 return morph_mesh->GetVertexBuffer();
212 return skinned_mesh->GetVertexBuffer();
214 if (skinned_morph_mesh)
216 return skinned_morph_mesh->GetVertexBuffer();
221 [[nodiscard]]
const Buffer* GetIndexBuffer()
const noexcept
225 return static_mesh->GetIndexBuffer();
229 return morph_mesh->GetIndexBuffer();
233 return skinned_mesh->GetIndexBuffer();
235 if (skinned_morph_mesh)
237 return skinned_morph_mesh->GetIndexBuffer();
242 [[nodiscard]] uint32_t GetIndexCount()
const noexcept
246 return static_mesh->GetIndexCount();
250 return morph_mesh->GetIndexCount();
254 return skinned_mesh->GetIndexCount();
256 if (skinned_morph_mesh)
258 return skinned_morph_mesh->GetIndexCount();
263 [[nodiscard]]
bool HasRenderableMesh()
const noexcept
265 return GetVertexBuffer() !=
nullptr && GetIndexBuffer() !=
nullptr && GetIndexCount() > 0u;
298struct ForwardLitSceneMeshSubrenderImpl
300 ForwardLitSceneMeshSubrenderImpl(
const Subrender::Stage& stage,
RenderDevice& render_device,
Filesystem& filesystem,
302 const ForwardLitMaterialOverrideProvider* material_override_provider);
304 void EnsureMeshCapacity(std::size_t mesh_count)
306 ASSERT(mesh_layout.has_value(),
"Forward lit scene mesh layout must be initialized");
307 while (mesh_uniforms.size() < mesh_count)
309 UniformHandler mesh_uniform(render_device);
310 mesh_uniform.Update(mesh_layout);
311 mesh_uniforms.emplace_back(std::move(mesh_uniform));
312 mesh_descriptors.emplace_back(culled_pipeline);
313 resolved_resources.emplace_back();
314 slot_draw_kinds.emplace_back(forward_lit_scene_mesh_internal::MeshDrawKind::None);
315 slot_dependencies.emplace_back(std::nullopt);
319 void InvalidateSlotState(std::size_t slot_index)
321 if (slot_index >= resolved_resources.size())
326 resolved_resources[slot_index].ResetResolvedBindings();
327 slot_draw_kinds[slot_index] = forward_lit_scene_mesh_internal::MeshDrawKind::None;
328 slot_dependencies[slot_index].reset();
331 void InvalidateAllSlotState()
333 for (std::size_t slot_index = 0; slot_index < resolved_resources.size(); ++slot_index)
335 InvalidateSlotState(slot_index);
339 void ClearUnusedSlotState(std::size_t mesh_count)
341 for (std::size_t mesh_index = mesh_count; mesh_index < resolved_resources.size(); ++mesh_index)
343 InvalidateSlotState(mesh_index);
347 [[nodiscard]] std::size_t CountActiveSlots()
const noexcept
349 return static_cast<std::size_t
>(
350 std::count_if(slot_dependencies.begin(), slot_dependencies.end(), [](
const auto& slot) { return slot.has_value(); }));
353 [[nodiscard]] std::vector<std::size_t> CollectMatchingSlotIndices(
const ForwardLitSceneMeshAssetChangeSet& change_set)
const;
357 RenderResourceResolver resource_resolver;
358 const ForwardLitMaterialOverrideProvider* material_override_provider =
nullptr;
359 PipelineGraphics culled_pipeline;
360 PipelineGraphics double_sided_pipeline;
361 PipelineGraphics transparent_culled_pipeline;
362 PipelineGraphics transparent_double_sided_pipeline;
363 PipelineGraphics morph_culled_pipeline;
364 PipelineGraphics morph_double_sided_pipeline;
365 PipelineGraphics morph_transparent_culled_pipeline;
366 PipelineGraphics morph_transparent_double_sided_pipeline;
367 PipelineGraphics skinned_culled_pipeline;
368 PipelineGraphics skinned_double_sided_pipeline;
369 PipelineGraphics skinned_transparent_culled_pipeline;
370 PipelineGraphics skinned_transparent_double_sided_pipeline;
371 PipelineGraphics skinned_morph_culled_pipeline;
372 PipelineGraphics skinned_morph_double_sided_pipeline;
373 PipelineGraphics skinned_morph_transparent_culled_pipeline;
374 PipelineGraphics skinned_morph_transparent_double_sided_pipeline;
375 std::optional<BufferLayout> mesh_layout;
376 UniformHandler scene_uniforms;
377 UniformHandler lighting_uniforms;
378 std::vector<UniformHandler> mesh_uniforms;
379 std::vector<DescriptorsHandler> mesh_descriptors;
380 std::vector<forward_lit_scene_mesh_internal::ResolvedResources> resolved_resources;
381 std::vector<forward_lit_scene_mesh_internal::MeshDrawKind> slot_draw_kinds;
382 std::vector<std::optional<forward_lit_scene_mesh_internal::SlotDependencies>> slot_dependencies;
383 std::optional<std::string> environment_asset_path;
384 std::optional<std::string> environment_skybox_cubemap_root;
385 std::optional<std::string> environment_diffuse_irradiance_cubemap_root;
386 std::optional<std::string> environment_specular_prefilter_cubemap_root;
387 std::shared_ptr<ImageCube> environment_skybox_cubemap;
388 std::shared_ptr<ImageCube> environment_diffuse_irradiance_cubemap;
389 std::shared_ptr<ImageCube> environment_specular_prefilter_cubemap;