candlewick 0.1.0
A renderer
Loading...
Searching...
No Matches
RobotScene.h
Go to the documentation of this file.
1
4#pragma once
5
6#include "Multibody.h"
7#include "../core/Device.h"
8#include "../core/Scene.h"
9#include "../core/Renderer.h"
11#include "../core/Collision.h"
13#include "../core/Texture.h"
14#include "../posteffects/SSAO.h"
15#include "../utils/MeshData.h"
16#include <magic_enum/magic_enum.hpp>
17
18#include <entt/entity/fwd.hpp>
19#include <coal/fwd.hh>
20#include <pinocchio/multibody/fwd.hpp>
21
22namespace candlewick {
23
25template <typename T>
26 requires std::is_enum_v<T>
27[[noreturn]] void
28invalid_enum(const char *msg, T type,
29 std::source_location location = std::source_location::current()) {
30 terminate_with_message(location, "Invalid enum: {:s} - {:s}", msg,
31 magic_enum::enum_name(type));
32}
33
34namespace multibody {
35
42 void updateRobotTransforms(entt::registry &registry,
43 const pin::GeometryModel &geom_model,
44 const pin::GeometryData &geom_data);
45
50 class RobotScene final {
51 [[nodiscard]] bool hasInternalPointers() const {
52 return m_geomModel && m_geomData;
53 }
54
55 void compositeTransparencyPass(CommandBuffer &command_buffer);
56
57 void renderPBRTriangleGeometry(CommandBuffer &command_buffer,
58 const Camera &camera, bool transparent);
59
60 void renderOtherGeometry(CommandBuffer &command_buffer,
61 const Camera &camera);
62
63 void initGBuffer();
64
65 void initCompositePipeline(const MeshLayout &layout);
66
67 public:
73 static constexpr size_t kNumPipelineTypes =
74 magic_enum::enum_count<PipelineType>();
75 enum VertexUniformSlots : Uint32 { TRANSFORM = 0 };
76 enum FragmentUniformSlots : Uint32 { MATERIAL = 0, LIGHTING = 1 };
77
79 static PipelineType pinGeomToPipeline(const coal::CollisionGeometry &geom);
80
82 static constexpr SDL_GPUPrimitiveType
84 switch (type) {
86 return SDL_GPU_PRIMITIVETYPE_TRIANGLELIST;
88 return SDL_GPU_PRIMITIVETYPE_LINELIST;
90 return SDL_GPU_PRIMITIVETYPE_POINTLIST;
91 }
92 }
93
94 template <PipelineType t> using pipeline_tag = entt::tag<t>;
95
97 // shader set
98 const char *vertex_shader_path;
100 SDL_GPUCullMode cull_mode = SDL_GPU_CULLMODE_BACK;
101 SDL_GPUFillMode fill_mode = SDL_GPU_FILLMODE_FILL;
102 };
103 struct Config {
106 .vertex_shader_path = "PbrBasic.vert",
107 .fragment_shader_path = "PbrBasic.frag",
108 };
110 .vertex_shader_path = "PbrBasic.vert",
111 .fragment_shader_path = "PbrTransparent.frag",
112 .cull_mode = SDL_GPU_CULLMODE_NONE,
113 };
116 .vertex_shader_path = "Hud3dElement.vert",
117 .fragment_shader_path = "Hud3dElement.frag",
118 };
120 bool enable_msaa = false;
121 bool enable_shadows = true;
122 bool enable_ssao = true;
125 SDL_GPUSampleCount msaa_samples = SDL_GPU_SAMPLECOUNT_1;
127 };
128
129 struct Pipelines {
130 struct {
131 SDL_GPUGraphicsPipeline *opaque = nullptr;
132 SDL_GPUGraphicsPipeline *transparent = nullptr;
134 SDL_GPUGraphicsPipeline *heightfield = nullptr;
135 SDL_GPUGraphicsPipeline *pointcloud = nullptr;
136 SDL_GPUGraphicsPipeline *wboitComposite = nullptr;
138
141 struct GBuffer {
143
144 // WBOIT buffers
147 SDL_GPUSampler *sampler = nullptr; // composite pass
151
153 RobotScene(entt::registry &registry, const Renderer &renderer);
154
158 RobotScene(entt::registry &registry, const Renderer &renderer,
159 const pin::GeometryModel &geom_model,
160 const pin::GeometryData &geom_data, Config config);
161
162 RobotScene(const RobotScene &) = delete;
163
164 void setConfig(const Config &config) {
166 !m_initialized,
167 "Cannot call setConfig() after render system was initialized.");
168 m_config = config;
169 }
170
173 void loadModels(const pin::GeometryModel &geom_model,
174 const pin::GeometryData &geom_data);
175
178
180 const std::vector<OpaqueCastable> &castables() const { return m_castables; }
181
182 entt::entity
185
186 entt::entity
187 addEnvironmentObject(MeshData &&data, const Eigen::Affine3f &T,
189 return addEnvironmentObject(std::move(data), T.matrix(), pipe_type);
190 }
191
197
198 void createPipeline(const MeshLayout &layout,
199 SDL_GPUTextureFormat render_target_format,
200 SDL_GPUTextureFormat depth_stencil_format,
201 PipelineType type, bool transparent);
202
205 void render(CommandBuffer &command_buffer, const Camera &camera);
206
207 void renderOpaque(CommandBuffer &command_buffer, const Camera &camera);
208
209 void renderTransparent(CommandBuffer &command_buffer, const Camera &camera);
210
212 void release();
213
214 Config &config() { return m_config; }
215 const Config &config() const { return m_config; }
216 inline bool pbrHasPrepass() const { return m_config.triangle_has_prepass; }
217 inline bool shadowsEnabled() const { return m_config.enable_shadows; }
218
220 const pin::GeometryModel &geomModel() const { return *m_geomModel; }
221
223 const pin::GeometryData &geomData() const { return *m_geomData; }
224
225 const entt::registry &registry() const { return m_registry; }
226
227 const Device &device() { return m_renderer.device; }
228
229 SDL_GPUGraphicsPipeline *getPipeline(PipelineType type,
230 bool transparent = false) {
231 return *routePipeline(type, transparent);
232 }
233
234 private:
235 entt::registry &m_registry;
236 const Renderer &m_renderer;
237 Config m_config;
238 const pin::GeometryModel *m_geomModel;
239 const pin::GeometryData *m_geomData;
240 std::vector<OpaqueCastable> m_castables;
241 bool m_initialized;
242
243 SDL_GPUGraphicsPipeline **routePipeline(PipelineType type,
244 bool transparent) {
245 switch (type) {
247 return transparent ? &pipelines.triangleMesh.transparent
250 return &pipelines.heightfield;
252 return &pipelines.pointcloud;
253 }
254 }
255 };
256 static_assert(Scene<RobotScene>);
257
258} // namespace multibody
259} // namespace candlewick
#define CDW_ASSERT(condition, msg)
Definition Core.h:6
Definition CommandBuffer.h:17
A class to store type-erased vertex data and index data.
Definition MeshData.h:33
This class defines the layout of a mesh's vertices.
Definition MeshLayout.h:98
Helper struct for shadow mapping pass.
Definition DepthAndShadowPass.h:98
Definition Texture.h:9
void clearEnvironment()
Destroy all entities with the EnvironmentTag component.
const entt::registry & registry() const
Definition RobotScene.h:225
RobotScene(const RobotScene &)=delete
static constexpr SDL_GPUPrimitiveType getPrimitiveTopologyForType(PipelineType type)
Map pipeline type to geometry primitive.
Definition RobotScene.h:83
entt::tag< t > pipeline_tag
Definition RobotScene.h:94
const pin::GeometryModel & geomModel() const
Getter for the pinocchio GeometryModel object.
Definition RobotScene.h:220
RobotScene(entt::registry &registry, const Renderer &renderer, const pin::GeometryModel &geom_model, const pin::GeometryData &geom_data, Config config)
Constructor which initializes the system.
bool shadowsEnabled() const
Definition RobotScene.h:217
void clearRobotGeometries()
Destroy all entities with the PinGeomObjComponent component (Pinocchio geometry objects).
const pin::GeometryData & geomData() const
Getter for the pinocchio GeometryData object.
Definition RobotScene.h:223
void setConfig(const Config &config)
Definition RobotScene.h:164
ssao::SsaoPass ssaoPass
Definition RobotScene.h:140
const std::vector< OpaqueCastable > & castables() const
Definition RobotScene.h:180
const Device & device()
Definition RobotScene.h:227
void renderOpaque(CommandBuffer &command_buffer, const Camera &camera)
VertexUniformSlots
Definition RobotScene.h:75
@ TRANSFORM
Definition RobotScene.h:75
void renderTransparent(CommandBuffer &command_buffer, const Camera &camera)
RobotScene(entt::registry &registry, const Renderer &renderer)
Non-initializing constructor.
void createPipeline(const MeshLayout &layout, SDL_GPUTextureFormat render_target_format, SDL_GPUTextureFormat depth_stencil_format, PipelineType type, bool transparent)
static constexpr size_t kNumPipelineTypes
Definition RobotScene.h:73
ShadowMapPass shadowPass
Definition RobotScene.h:149
entt::entity addEnvironmentObject(MeshData &&data, Mat4f placement, PipelineType pipe_type=PIPELINE_TRIANGLEMESH)
struct candlewick::multibody::RobotScene::GBuffer gBuffer
void loadModels(const pin::GeometryModel &geom_model, const pin::GeometryData &geom_data)
Set the internal geometry model and data pointers, and load the corresponding models.
entt::entity addEnvironmentObject(MeshData &&data, const Eigen::Affine3f &T, PipelineType pipe_type=PIPELINE_TRIANGLEMESH)
Definition RobotScene.h:187
void updateTransforms()
Update the transform component of the GeometryObject entities.
FragmentUniformSlots
Definition RobotScene.h:76
@ MATERIAL
Definition RobotScene.h:76
@ LIGHTING
Definition RobotScene.h:76
void render(CommandBuffer &command_buffer, const Camera &camera)
Config & config()
Definition RobotScene.h:214
void release()
Release all resources.
const Config & config() const
Definition RobotScene.h:215
AABB worldSpaceBounds
Definition RobotScene.h:150
DirectionalLight directionalLight
Definition RobotScene.h:139
SDL_GPUGraphicsPipeline * getPipeline(PipelineType type, bool transparent=false)
Definition RobotScene.h:229
PipelineType
Definition RobotScene.h:68
@ PIPELINE_HEIGHTFIELD
Definition RobotScene.h:70
@ PIPELINE_POINTCLOUD
Definition RobotScene.h:71
@ PIPELINE_TRIANGLEMESH
Definition RobotScene.h:69
bool pbrHasPrepass() const
Definition RobotScene.h:216
static PipelineType pinGeomToPipeline(const coal::CollisionGeometry &geom)
Map hpp-fcl/coal collision geometry to desired pipeline type.
struct candlewick::multibody::RobotScene::Pipelines pipelines
void updateRobotTransforms(entt::registry &registry, const pin::GeometryModel &geom_model, const pin::GeometryData &geom_data)
A system for updating the transform components for robot geometry entities.
Definition Camera.h:8
void terminate_with_message(std::source_location location, std::string_view fmt, Ts &&...args)
Definition errors.h:51
void invalid_enum(const char *msg, T type, std::source_location location=std::source_location::current())
Terminate the application after encountering an invalid enum value.
Definition RobotScene.h:28
ShadowMapPass::Config ShadowPassConfig
Definition DepthAndShadowPass.h:140
Eigen::Matrix4f Mat4f
Definition math_types.h:11
constexpr NoInitT NoInit
Definition Tags.h:9
The main way of using a camera to render things.
Definition Camera.h:19
RAII wrapper for SDL_GPUDevice.
Definition Device.h:17
Definition LightUniforms.h:7
The Renderer class provides a rendering context for a graphical application.
Definition Renderer.h:20
PipelineConfig transparent
Definition RobotScene.h:109
ShadowPassConfig shadow_config
Definition RobotScene.h:126
struct candlewick::multibody::RobotScene::Config::TrianglePipelineConfig triangle_config
bool enable_normal_target
Definition RobotScene.h:124
PipelineConfig pointcloud_config
Definition RobotScene.h:119
bool enable_shadows
Definition RobotScene.h:121
bool enable_ssao
Definition RobotScene.h:122
SDL_GPUSampleCount msaa_samples
Definition RobotScene.h:125
PipelineConfig heightfield_config
Definition RobotScene.h:115
bool enable_msaa
Definition RobotScene.h:120
bool triangle_has_prepass
Definition RobotScene.h:123
Texture accumTexture
Definition RobotScene.h:145
Texture revealTexture
Definition RobotScene.h:146
SDL_GPUSampler * sampler
Definition RobotScene.h:147
Texture normalMap
Definition RobotScene.h:142
SDL_GPUFillMode fill_mode
Definition RobotScene.h:101
const char * fragment_shader_path
Definition RobotScene.h:99
SDL_GPUCullMode cull_mode
Definition RobotScene.h:100
const char * vertex_shader_path
Definition RobotScene.h:98
SDL_GPUGraphicsPipeline * transparent
Definition RobotScene.h:132
SDL_GPUGraphicsPipeline * opaque
Definition RobotScene.h:131
SDL_GPUGraphicsPipeline * heightfield
Definition RobotScene.h:134
SDL_GPUGraphicsPipeline * pointcloud
Definition RobotScene.h:135
struct candlewick::multibody::RobotScene::Pipelines::@173370065110064371102147354360310021261035041233 triangleMesh
SDL_GPUGraphicsPipeline * wboitComposite
Definition RobotScene.h:136
Definition SSAO.h:9