Nebula
Loading...
Searching...
No Matches
lightcontext.h
Go to the documentation of this file.
1#pragma once
2//------------------------------------------------------------------------------
9//------------------------------------------------------------------------------
11#include "coregraphics/shader.h"
12#include "coregraphics/buffer.h"
14#include <array>
15//#include <render/system_shaders/lights_cluster.h>
16#include "gpulang/render/system_shaders/lights_cluster.h"
17
18
19namespace Frame
20{
21class FrameScript;
22};
23
24namespace Lighting
25{
27{
29public:
30
38
39 enum class AreaLightShape
40 {
44 };
45
49 virtual ~LightContext();
50
52 static void Create();
54 static void Discard();
55
65
68
70 {
72 float intensity = 1.0f;
73 float range = 10.0f;
75 bool castShadows = false;
76 CoreGraphics::TextureId projection = CoreGraphics::InvalidTextureId;
77 };
78
79 static void SetupPointLight(const Graphics::GraphicsEntityId id, const PointLightSetupInfo& info);
80
82 {
84 float intensity = 1.0f;
85 float innerConeAngle = 30_rad;
86 float outerConeAngle = 45_rad;
87 float range = 10.0f;
89 bool castShadows = false;
90 CoreGraphics::TextureId projection = CoreGraphics::InvalidTextureId;
91 };
92
94 static void SetupSpotLight(
96 , const SpotLightSetupInfo& info
97 );
98
100 {
103 float intensity = 1.0f;
104 float range = 10.0f;
106 bool twoSided = false;
107 bool castShadows = false;
108 bool renderMesh = false;
109 };
110
111 static void SetupAreaLight(const Graphics::GraphicsEntityId id, const AreaLightSetupInfo& info);
112
114 static void SetColor(const Graphics::GraphicsEntityId id, const Math::vec3& color);
118 static void SetRange(const Graphics::GraphicsEntityId id, const float range);
120 static void SetIntensity(const Graphics::GraphicsEntityId id, const float intensity);
122 static float GetIntensity(const Graphics::GraphicsEntityId id);
124 static void SetTransform(const Graphics::GraphicsEntityId id, const float azimuth, const float zenith);
129
131 static const void SetPosition(const Graphics::GraphicsEntityId id, const Math::point& position);
135 static const void SetRotation(const Graphics::GraphicsEntityId id, const Math::quat& rotation);
139 static const void SetScale(const Graphics::GraphicsEntityId id, const Math::vec3& scale);
141 static const Math::vec3 GetScale(const Graphics::GraphicsEntityId id);
142
145
147 static void GetInnerOuterAngle(const Graphics::GraphicsEntityId id, float& inner, float& outer);
149 static void SetInnerOuterAngle(const Graphics::GraphicsEntityId id, float inner, float outer);
150
152 static void OnPrepareView(const Graphics::ViewId view, const Graphics::FrameContext& ctx);
153
155 static void UpdateLights(const Graphics::FrameContext& ctx);
159 static void Resize(const uint framescriptHash, SizeT width, SizeT height);
160#ifndef PUBLIC_BUILD
162 static void OnRenderDebug(uint32_t flags);
163#endif
164
166 static void SetupTerrainShadows(const CoreGraphics::TextureId terrainShadowMap, const uint worldSize);
167
173 static const LightsCluster::LightUniforms::STRUCT& GetLightUniforms();
174
175private:
176
178 static void SetDirectionalLightTransform(const Graphics::ContextEntityId id, const Math::mat4& transform, const Math::vector& direction);
179
180 enum
181 {
190 };
191
192 typedef Ids::IdAllocator<
194 LightType, // type
195 Math::vec3, // color
196 float, // intensity
197 bool, // shadow caster
198 float, // range
199 Ids::Id32, // typed light id (index into pointlights, spotlights and globallights)
203
205 {
207 };
208
209 enum
210 {
216 };
217
218 typedef Ids::IdAllocator<
219 Math::transform44, // transform
220 CoreGraphics::TextureId, // projection (if invalid, don't use)
221 std::array<Graphics::GraphicsEntityId, 6>, // graphics entity used for observer stuff
222 std::array<Math::rectangle<int>, 6>, // cascade shadow tiles
223 std::array<Math::mat4, 6> // cascade shadow tiles
226
227 enum
228 {
236 };
237
238 typedef Ids::IdAllocator<
239 Math::transform44, // transform
240 std::array<float, 2>, // cone angle
241 CoreGraphics::TextureId, // projection (if invalid, don't use)
242 Math::mat4, // projection matrix
243 Math::mat4, // shadow projection transform
244 Math::rectangle<int>, // shadow tile
245 Graphics::GraphicsEntityId // graphics entity used for observer stuff
248
249 enum
250 {
258 };
259
260 typedef Ids::IdAllocator<
261 Math::transform44, // transform
262 AreaLightShape, // shape of area light
263 bool, // two sides
264 std::array<Graphics::GraphicsEntityId, 2>, // graphics entity used for observer stuff
265 std::array<Math::mat4, 2>, // shadow rendering projection transforms for front and back
266 std::array<Math::rectangle<int>, 2>, // shadow rendering tiles for front and back
267 bool // render mesh as well
270
271 enum
272 {
280 };
281
288
289 typedef Ids::IdAllocator<
290 Graphics::ViewId, // camera used for shadow mapping
291 Math::vector, // direction
292 Math::mat4, // transform (basically just a rotation in the direction)
293 Util::FixedArray<Graphics::GraphicsEntityId>, // view ids for cascades
294 Util::FixedArray<Math::rectangle<int>>, // cascade shadow tiles
295 Util::FixedArray<float>, // cascade distances
296 Util::FixedArray<Math::mat4> // cascade transforms
299
300
301 enum
302 {
304 };
305
306 typedef Ids::IdAllocator<
309
312
316 static void Dealloc(Graphics::ContextEntityId id);
317};
318} // namespace Lighting
A FrameScript describes render operations being done to produce a single frame.
Definition framescript.h:41
Definition graphicscontext.h:175
An ID allocator associates an id with a slice in an N number of arrays.
Definition idallocator.h:39
static Math::vec3 GetColor(const Graphics::GraphicsEntityId id)
Definition lightcontext.cc:661
static const void SetScale(const Graphics::GraphicsEntityId id, const Math::vec3 &scale)
Set light scale.
Definition lightcontext.cc:865
@ PointLight_ShadowProjectionTransforms
Definition lightcontext.h:215
@ PointLight_Transform
Definition lightcontext.h:211
@ PointLight_ProjectionTexture
Definition lightcontext.h:212
@ PointLight_ShadowTiles
Definition lightcontext.h:214
@ PointLight_Observers
Definition lightcontext.h:213
@ ShadowCaster_Transform
Definition lightcontext.h:303
static ShadowCasterAllocator shadowCasterAllocator
Definition lightcontext.h:310
static void UpdateLights(const Graphics::FrameContext &ctx)
prepare light lists
Definition lightcontext.cc:1289
static const CoreGraphics::BufferId GetLightIndexBuffer()
get light index lists buffer
Definition lightcontext.cc:1251
@ DirectionalLight_Direction
Definition lightcontext.h:274
@ DirectionalLight_CascadeObservers
Definition lightcontext.h:276
@ DirectionalLight_CascadeTransforms
Definition lightcontext.h:279
@ DirectionalLight_CascadeDistances
Definition lightcontext.h:278
@ DirectionalLight_Transform
Definition lightcontext.h:275
@ DirectionalLight_View
Definition lightcontext.h:273
@ DirectionalLight_CascadeTiles
Definition lightcontext.h:277
static const Math::mat4 GetTransform(const Graphics::GraphicsEntityId id)
get transform
Definition lightcontext.cc:726
static float GetIntensity(const Graphics::GraphicsEntityId id)
Definition lightcontext.cc:691
static const Math::point GetPosition(const Graphics::GraphicsEntityId id)
Get light position.
Definition lightcontext.cc:791
static void SetRange(const Graphics::GraphicsEntityId id, const float range)
set range of light
Definition lightcontext.cc:671
static const Math::quat GetRotation(const Graphics::GraphicsEntityId id)
Get light rotation.
Definition lightcontext.cc:843
static void GetInnerOuterAngle(const Graphics::GraphicsEntityId id, float &inner, float &outer)
get inner and outer angle for spotlights
Definition lightcontext.cc:935
static const LightsCluster::LightUniforms::STRUCT & GetLightUniforms()
get light uniforms
Definition lightcontext.cc:1269
static const CoreGraphics::BufferId GetLightsBuffer()
get light lists buffer
Definition lightcontext.cc:1260
static const void SetRotation(const Graphics::GraphicsEntityId id, const Math::quat &rotation)
Set light rotation.
Definition lightcontext.cc:813
LightType
Definition lightcontext.h:32
@ PointLightType
Definition lightcontext.h:34
@ AreaLightType
Definition lightcontext.h:36
@ SpotLightType
Definition lightcontext.h:35
@ DirectionalLightType
Definition lightcontext.h:33
static void SetColor(const Graphics::GraphicsEntityId id, const Math::vec3 &color)
set color of light
Definition lightcontext.cc:651
static Graphics::ContextEntityId Alloc()
allocate a new slice for this context
Definition lightcontext.cc:1628
static const Math::vec3 GetScale(const Graphics::GraphicsEntityId id)
Get light scale.
Definition lightcontext.cc:903
static void SetIntensity(const Graphics::GraphicsEntityId id, const float intensity)
set intensity of light
Definition lightcontext.cc:681
static void Discard()
discard light context
Definition lightcontext.cc:346
Ids::IdAllocator< Graphics::GraphicsEntityId, LightType, Math::vec3, float, bool, float, Ids::Id32, Graphics::StageMask > GenericLightAllocator
Definition lightcontext.h:201
static void SetInnerOuterAngle(const Graphics::GraphicsEntityId id, float inner, float outer)
set inner and outer angle for spotlights
Definition lightcontext.cc:949
static const void SetPosition(const Graphics::GraphicsEntityId id, const Math::point &position)
Set light position.
Definition lightcontext.cc:761
static void SetDirectionalLightTransform(const Graphics::ContextEntityId id, const Math::mat4 &transform, const Math::vector &direction)
Set global light transform.
Definition lightcontext.cc:1278
static AreaLightAllocator areaLightAllocator
Definition lightcontext.h:269
LightContext()
constructor
Definition lightcontext.cc:102
Ids::IdAllocator< Math::transform44, AreaLightShape, bool, std::array< Graphics::GraphicsEntityId, 2 >, std::array< Math::mat4, 2 >, std::array< Math::rectangle< int >, 2 >, bool > AreaLightAllocator
Definition lightcontext.h:268
static DirectionalLightAllocator directionalLightAllocator
Definition lightcontext.h:298
Ids::IdAllocator< Math::transform44, CoreGraphics::TextureId, std::array< Graphics::GraphicsEntityId, 6 >, std::array< Math::rectangle< int >, 6 >, std::array< Math::mat4, 6 > > PointLightAllocator
Definition lightcontext.h:224
static void OnPrepareView(const Graphics::ViewId view, const Graphics::FrameContext &ctx)
prepare light visibility
Definition lightcontext.cc:1100
@ SpotLight_Transform
Definition lightcontext.h:229
@ SpotLight_ProjectionTexture
Definition lightcontext.h:231
@ SpotLight_ShadowTile
Definition lightcontext.h:234
@ SpotLight_ShadowProjectionTransform
Definition lightcontext.h:233
@ SpotLight_ProjectionTransform
Definition lightcontext.h:232
@ SpotLight_Observer
Definition lightcontext.h:235
@ SpotLight_ConeAngles
Definition lightcontext.h:230
static PointLightAllocator pointLightAllocator
Definition lightcontext.h:225
@ Light_TypedLightId
Definition lightcontext.h:188
@ Light_Color
Definition lightcontext.h:184
@ Light_Entity
Definition lightcontext.h:182
@ Light_StageMask
Definition lightcontext.h:189
@ Light_Type
Definition lightcontext.h:183
@ Light_ShadowCaster
Definition lightcontext.h:186
@ Light_Intensity
Definition lightcontext.h:185
@ Light_Range
Definition lightcontext.h:187
static void SetTransform(const Graphics::GraphicsEntityId id, const float azimuth, const float zenith)
Set transform as angles.
Definition lightcontext.cc:701
static void OnRenderDebug(uint32_t flags)
render debug
Definition lightcontext.cc:1740
AreaLightShape
Definition lightcontext.h:40
@ Disk
Definition lightcontext.h:41
@ Rectangle
Definition lightcontext.h:42
@ Tube
Definition lightcontext.h:43
Ids::IdAllocator< Math::transform44, std::array< float, 2 >, CoreGraphics::TextureId, Math::mat4, Math::mat4, Math::rectangle< int >, Graphics::GraphicsEntityId > SpotLightAllocator
Definition lightcontext.h:246
virtual ~LightContext()
destructor
Definition lightcontext.cc:110
static void SetupSpotLight(const Graphics::GraphicsEntityId id, const SpotLightSetupInfo &info)
Setup entity as spot light.
Definition lightcontext.cc:483
static void Resize(const uint framescriptHash, SizeT width, SizeT height)
React to window resize event.
Definition lightcontext.cc:1574
static const Math::mat4 GetObserverTransform(const Graphics::GraphicsEntityId id)
get the view transform including projections
Definition lightcontext.cc:751
static void SetupTerrainShadows(const CoreGraphics::TextureId terrainShadowMap, const uint worldSize)
Setup terrain shadows.
Definition lightcontext.cc:1240
static SpotLightAllocator spotLightAllocator
Definition lightcontext.h:247
static GenericLightAllocator genericLightAllocator
Definition lightcontext.h:202
static LightType GetType(const Graphics::GraphicsEntityId id)
get the light type
Definition lightcontext.cc:925
static void SetupPointLight(const Graphics::GraphicsEntityId id, const PointLightSetupInfo &info)
Setup entity as point light source.
Definition lightcontext.cc:424
Ids::IdAllocator< Math::mat4 > ShadowCasterAllocator
Definition lightcontext.h:308
static void Create()
setup light context
Definition lightcontext.cc:119
static void Dealloc(Graphics::ContextEntityId id)
deallocate a slice
Definition lightcontext.cc:1637
static void SetupDirectionalLight(const Graphics::GraphicsEntityId id, const DirectionalLightSetupInfo &info)
setup entity as global light
Definition lightcontext.cc:355
Ids::IdAllocator< Graphics::ViewId, Math::vector, Math::mat4, Util::FixedArray< Graphics::GraphicsEntityId >, Util::FixedArray< Math::rectangle< int > >, Util::FixedArray< float >, Util::FixedArray< Math::mat4 > > DirectionalLightAllocator
Definition lightcontext.h:297
static Util::HashTable< Graphics::GraphicsEntityId, uint, 16, 1 > shadowCasterIndexMap
Definition lightcontext.h:311
static void RunFrameScriptJobs(const Graphics::FrameContext &ctx)
run framescript when visibility is done
@ AreaLight_ShadowProjectionTransforms
Definition lightcontext.h:255
@ AreaLight_TwoSided
Definition lightcontext.h:253
@ AreaLight_Shape
Definition lightcontext.h:252
@ AreaLight_ShadowTiles
Definition lightcontext.h:256
@ AreaLight_Observers
Definition lightcontext.h:254
@ AreaLight_RenderMesh
Definition lightcontext.h:257
@ AreaLight_Transform
Definition lightcontext.h:251
static void SetupAreaLight(const Graphics::GraphicsEntityId id, const AreaLightSetupInfo &info)
Setup entity as area light.
Definition lightcontext.cc:542
A 2d rectangle class.
Definition rectangle.h:20
A 4x4 matrix which is described by translation, rotation and scale.
Definition transform44.h:20
Implements a fixed size one-dimensional array.
Definition fixedarray.h:20
Organizes key/value pairs by a hash code.
Definition hashtable.h:42
ImGUI debug interface for inspecting frame scripts.
Definition shaderserverbase.h:52
uint16_t StageMask
Definition view.h:23
uint32_t Id32
Definition id.h:138
The lighting subsystem allows for attaching light source functionality to a GraphicsEntityId.
Definition lightcontext.cc:34
CoreGraphics::TextureId terrainShadowMap
Definition lightcontext.cc:50
A shader represents an entire shader resource, containing several stages and programs.
Definition buffer.h:23
Definition pass.h:28
texture type
Definition texture.h:25
Definition textureview.h:16
Definition graphicscontext.h:143
Definition graphicsserver.h:31
The graphics entity is only an Id, to which we can attach GraphicsContexts.
Definition graphicsentity.h:16
Definition view.h:34
Definition lightcontext.h:100
bool castShadows
Definition lightcontext.h:107
bool twoSided
Definition lightcontext.h:106
Graphics::StageMask stageMask
Definition lightcontext.h:105
bool renderMesh
Definition lightcontext.h:108
float range
Definition lightcontext.h:104
Math::vec3 color
Definition lightcontext.h:102
AreaLightShape shape
Definition lightcontext.h:101
float intensity
Definition lightcontext.h:103
Definition lightcontext.h:205
uint offset
Definition lightcontext.h:206
uint slice
Definition lightcontext.h:206
Graphics::ViewId view
Definition lightcontext.h:58
Graphics::StageMask stageMask
Definition lightcontext.h:62
float zenith
Definition lightcontext.h:61
Math::vec3 color
Definition lightcontext.h:59
float azimuth
Definition lightcontext.h:61
float intensity
Definition lightcontext.h:60
bool castShadows
Definition lightcontext.h:63
bool castShadows
Definition lightcontext.h:75
float intensity
Definition lightcontext.h:72
CoreGraphics::TextureId projection
Definition lightcontext.h:76
Math::vec3 color
Definition lightcontext.h:71
Graphics::StageMask stageMask
Definition lightcontext.h:74
float range
Definition lightcontext.h:73
Definition lightcontext.h:283
CoreGraphics::PassId shadowPass
Definition lightcontext.h:286
CoreGraphics::TextureId shadowMap
Definition lightcontext.h:284
CoreGraphics::TextureViewId shadowView
Definition lightcontext.h:285
Definition lightcontext.h:82
float innerConeAngle
Definition lightcontext.h:85
float outerConeAngle
Definition lightcontext.h:86
Graphics::StageMask stageMask
Definition lightcontext.h:88
Math::vec3 color
Definition lightcontext.h:83
float intensity
Definition lightcontext.h:84
CoreGraphics::TextureId projection
Definition lightcontext.h:90
float range
Definition lightcontext.h:87
bool castShadows
Definition lightcontext.h:89
A 4x4 single point precision float matrix.
Definition mat4.h:49
Represents a 3D point in space.
Definition point.h:22
A quaternion is usually used to represent an orientation in 3D space.
Definition quat.h:30
A 3D vector.
Definition vec3.h:37
A vector is a 3D direction in space.
Definition vector.h:22
int SizeT
Definition types.h:42
unsigned int uint
Definition types.h:33