RavEngine
Loading...
Searching...
No Matches
ParticleMaterial.hpp
1#pragma once
2#include <RGL/Types.hpp>
3#include "mathtypes.hpp"
4#include <string>
5#include <variant>
6#include "Ref.hpp"
7#include <RGL/Span.hpp>
8#include <RGL/Pipeline.hpp>
9#include <bitset>
10#include <span>
11#include "MaterialShared.hpp"
12
13namespace RavEngine {
14
15 extern const RGL::RenderPipelineDescriptor::VertexConfig quadVertexConfig;
16 extern const RGL::RenderPipelineDescriptor::VertexConfig defaultVertexConfig;
17
18 struct Texture;
19 struct MeshCollectionStatic;
20
22 float fpsScale;
23 };
24
26 vector2i spritesheetDim;
27 vector2i numSprites;
28 uint32_t bytesPerParticle;
29 uint32_t particlePositionOffset;
30 uint32_t particleScaleOffset;
31 uint32_t particleFrameOffset;
32 };
33
35 vector2 pos;
36 };
37
39 friend class RenderEngine;
40 protected:
41 ParticleUpdateMaterial(const std::string_view initShaderName, const std::string_view updateShaderName);
42
43 public:
44 const auto GetInitShader() const {
45 return userInitPipeline;
46 }
47
48 const auto GetUpdateShader() const {
49 return userUpdatePipeline;
50 }
51
52 private:
53 RGLComputePipelinePtr userInitPipeline, userUpdatePipeline;
54 };
55
57 std::vector<RGL::PipelineLayoutDescriptor::LayoutBindingDesc> bindings;
58 size_t pushConstantSize = 0;
59 OpacityMode opacityMode = OpacityMode::Opaque;
60 bool zTestEnabled = true;
61 bool zWriteEnabled = true;
62 };
63
64 enum class LightingMode : uint8_t {
65 Unlit,
66 Lit
67 };
68
70 friend class RenderEngine;
71 constexpr static uint8_t
72 particleDataBufferBinding = 18,
73 particleAliveIndexBufferBinding = 19,
74 particleMatrixBufferBinding = 20,
75 particleEmitterStateBufferBinding = 22
76 ;
77
78 bool IsTransparent() const {
79 return opacityMode == OpacityMode::Transparent;
80 }
81 protected:
84 const RGL::PrimitiveTopology topology;
85 const LightingMode mode;
86 };
87 ParticleRenderMaterial(const std::string_view particleVS, const std::string_view particleFS, const InternalConfig& internalConfig, const ParticleRenderMaterialConfig& config);
88
89 RGLRenderPipelinePtr GetMainRenderPipeline() const {
90 return userRenderPipeline;
91 }
92
93 RGLRenderPipelinePtr GetShadowRenderPipeline() const {
94 return shadowRenderPipeline;
95 }
96
97 auto GetDepthPrepassPipeline() const {
98 return prepassRenderPipeline;
99 }
100
101 private:
102 OpacityMode opacityMode = OpacityMode::Opaque;
103 RGLRenderPipelinePtr userRenderPipeline, prepassRenderPipeline, shadowRenderPipeline;
104
105
106 };
107
109 ParticleRenderMaterialConfig augmentBillboardConfig(const ParticleRenderMaterialConfig& in, LightingMode mode);
110 };
111
112 // Subclass this to make custom particle materials
113 template<LightingMode mode>
115 protected:
116 BillboardRenderParticleMaterial(const std::string_view particleVS, const std::string_view particleFS, const ParticleRenderMaterialConfig& config = {}) : ParticleRenderMaterial(particleVS, particleFS, {
117 .vertexConfig = quadVertexConfig,
118 .topology = RGL::PrimitiveTopology::TriangleStrip,
119 .mode = mode
120 }, augmentBillboardConfig(config,mode)) {}
121 };
122
124 ParticleRenderMaterialConfig augmentMeshConfig(const ParticleRenderMaterialConfig& in, LightingMode mode);
125 };
126
127 // Subclass this to make custom particle materials
128 template<LightingMode mode>
130 protected:
131 MeshParticleRenderMaterial(const std::string_view particleVS, const std::string_view particleFS, const ParticleRenderMaterialConfig& config = {}) : ParticleRenderMaterial(particleVS, particleFS, {
132 .vertexConfig = defaultVertexConfig,
133 .topology = RGL::PrimitiveTopology::TriangleList,
134 .mode = mode
135 }, augmentMeshConfig(config, mode)) {}
136 };
137
138 // Subclass to create custom mesh particle selection
140 friend class RenderEngine;
141 MeshParticleMeshSelectionMaterial(const std::string_view name);
142 private:
143 RGLComputePipelinePtr userSelectionPipeline;
144 };
145
146 // subclass this in tandem with the SelectionMaterial
153
155 friend class RenderEngine;
156 protected:
157 std::array<Ref<Texture>, 16> textureBindings;
158 std::bitset<16> samplerBindings;
159 public:
160
161
166 virtual uint8_t SetPushConstantData(std::span<std::byte,128> data) const {
167 return 0;
168 }
169 };
170
171 // subclass to define your own particle material instances
173 using MaterialVariant = std::variant<Ref<BillboardRenderParticleMaterial<LightingMode::Lit>>, Ref<BillboardRenderParticleMaterial<LightingMode::Unlit>> >;
174 protected:
175 MaterialVariant material;
176 public:
177
178 BillboardParticleRenderMaterialInstance(const decltype(material)& mat) : material(mat) {}
179
180 auto GetMaterial() const {
181 return material;
182 }
183 };
184
185 // subclass to define your own particle material instances
187 friend class RenderEngine;
188 static constexpr uint32_t kEngineDataBinding = 21;
189 using MaterialVariant = std::variant<Ref<MeshParticleRenderMaterial<LightingMode::Lit>>, Ref<MeshParticleRenderMaterial<LightingMode::Unlit>> >;
190 private:
191 MaterialVariant material;
192 public:
193 // use this constructor if you want to use the default mesh selection behavior (all particles go to mesh 0)
194 MeshParticleRenderMaterialInstance(const decltype(material)& mat, Ref<MeshCollectionStatic> meshes) : material(mat), meshes(meshes) {}
195
196 // use this constructor if you have custom mesh selection logic to apply
197 MeshParticleRenderMaterialInstance(const decltype(material)& mat, Ref<MeshCollectionStatic> meshes, Ref<MeshParticleMeshSelectionMaterialInstance> customSelection) : material(mat), meshes(meshes), customSelectionFunction(customSelection) {}
198
199 void SetMeshSelectionFunction(const Ref<MeshParticleMeshSelectionMaterialInstance> selfn) {
200 customSelectionFunction = selfn;
201 }
202
203 auto GetMaterial() const {
204 return material;
205 }
206 private:
208 Ref<MeshParticleMeshSelectionMaterialInstance> customSelectionFunction = nullptr;
209 };
210
211 // subclass to define your own particle material instances
214 ParticleUpdateMaterialInstance(decltype(mat) m) : mat(m) {}
215 };
216
217 // built-in billboard renderer that does spritesheets
218 template<LightingMode mode>
220 constexpr static uint16_t SpritesheetBindingSlot = 1;
221 constexpr static uint16_t SamplerBindingSlot = 0;
222
223
224
225 SpritesheetParticleRenderMaterial(const std::string_view vs_name, const std::string_view fs_name, OpacityMode opacityMode, size_t pushConstantSize) : BillboardRenderParticleMaterial<mode>(vs_name, fs_name, {
226 .bindings = {
227 {
228 .binding = SamplerBindingSlot,
229 .type = RGL::BindingType::Sampler,
230 .stageFlags = RGL::BindingVisibility::Fragment,
231 .writable = false,
232 },
233 {
234 .binding = SpritesheetBindingSlot,
235 .type = RGL::BindingType::SampledImage,
236 .stageFlags = RGL::BindingVisibility::Fragment,
237 .writable = false,
238 }
239 },
240 .pushConstantSize = pushConstantSize,
241 .opacityMode = opacityMode
242 }) {}
243
244 constexpr static std::string_view fs_particle_name = mode == LightingMode::Lit ? "default_billboard_particle" : "default_billboard_particle_unlit";
245 SpritesheetParticleRenderMaterial() : SpritesheetParticleRenderMaterial("default_billboard_particle", fs_particle_name, OpacityMode::Opaque, sizeof(ParticleBillboardUBO)) {}
246 };
247
249
250 template<LightingMode mode>
251 SpritesheetParticleRenderMaterialInstance(Ref<SpritesheetParticleRenderMaterial<mode>> mat, uint32_t bytesPerParticle, uint32_t particlePositionOffset, uint32_t particleScaleOffset, uint32_t particleFrameOffset) : BillboardParticleRenderMaterialInstance(mat), bytesPerParticle(bytesPerParticle), particlePositionOffset(particlePositionOffset), particleScaleOffset(particleScaleOffset), particleFrameOffset(particleFrameOffset){
253 };
254 struct spriteCount {
255 uint16_t numSpritesWidth = 0;
256 uint16_t numSpritesHeight = 0;
257 } spriteDim;
258
259 void SetSpritesheet(Ref<Texture> spriteTex) {
261 }
262
263 virtual uint8_t SetPushConstantData(std::span<std::byte, 128> data) const;
264 private:
265 const uint32_t bytesPerParticle;
266 const uint32_t particlePositionOffset;
267 const uint32_t particleScaleOffset;
268 const uint32_t particleFrameOffset;
269 };
270
274
276 PBRMeshParticleRenderMaterialInstance(Ref<PBRMeshParticleRenderMaterial> mat, Ref<MeshCollectionStatic> meshes, uint32_t bytesPerParticle, uint32_t positionOffsetBytes, uint32_t scaleOffsetBytes, uint32_t rotationOffsetBytes);
277 virtual uint8_t SetPushConstantData(std::span<std::byte, 128> data) const;
278
279 constexpr static uint8_t
280 kSamplerBinding = 0,
281 kDiffuseBinding = 1,
282 kNormalBinding = 2,
283 kSpecularBinding = 3,
284 kMetallicBinding = 4,
285 kRoughnessBinding = 5,
286 kAOBinding = 6,
287 kEmissiveBinding = 7
288 ;
289
290 private:
291 const uint32_t bytesPerParticle;
292 const uint32_t positionOffsetBytes;
293 const uint32_t scaleOffsetBytes;
294 const uint32_t rotationOffsetBytes;
295 };
296}
Definition RenderEngine.hpp:64
Definition concurrentqueue.h:747
Definition Animation.hpp:6
Definition ParticleMaterial.hpp:172
Definition ParticleMaterial.hpp:108
Definition ParticleMaterial.hpp:114
Definition ParticleMaterial.hpp:147
Definition ParticleMaterial.hpp:139
Definition ParticleMaterial.hpp:186
Definition ParticleMaterial.hpp:123
Definition ParticleMaterial.hpp:129
Definition ParticleMaterial.hpp:275
virtual uint8_t SetPushConstantData(std::span< std::byte, 128 > data) const
Definition ParticleMaterial.cpp:396
Definition ParticleMaterial.hpp:271
Definition ParticleMaterial.hpp:25
Definition ParticleMaterial.hpp:34
Definition ParticleMaterial.hpp:56
Definition ParticleMaterial.hpp:154
virtual uint8_t SetPushConstantData(std::span< std::byte, 128 > data) const
Definition ParticleMaterial.hpp:166
Definition ParticleMaterial.hpp:82
Definition ParticleMaterial.hpp:69
Definition ParticleMaterial.hpp:212
Definition ParticleMaterial.hpp:38
Definition ParticleMaterial.hpp:21
Definition ParticleMaterial.hpp:248
virtual uint8_t SetPushConstantData(std::span< std::byte, 128 > data) const
Definition ParticleMaterial.cpp:239
Definition ParticleMaterial.hpp:219
Definition qualifier.hpp:35