Skip to content

Commit eff36b0

Browse files
committed
Added groups
1 parent 90a2a03 commit eff36b0

File tree

11 files changed

+124
-1
lines changed

11 files changed

+124
-1
lines changed

Engine/Shaders/HelperHeaderPipeline/light_func.glsl

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ struct OmniData {
1818
float radius;
1919
};
2020

21+
struct AreaData
22+
{
23+
vec4 position;
24+
vec4 diffuse;
25+
vec4 padding;
26+
};
27+
2128

2229
layout(std430, binding = 2) buffer Directional
2330
{
@@ -32,6 +39,12 @@ layout(std430, binding = 3) buffer Omni
3239
OmniData omniData[];
3340
};
3441

42+
layout(std430, binding = 18) buffer Area
43+
{
44+
ivec4 lenArea;
45+
AreaData areaData[];
46+
};
47+
3548
struct Cluster
3649
{
3750
vec4 minPoint;

Engine/Shaders/PbrHeaderPipeline/pbr_calculation.glsl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ vec3 pbrCalculation(vec3 FragPos, vec3 N, vec3 albedo, vec4 aoSpecular,float rou
4545
}
4646
}
4747

48+
49+
for (int i = 0; i < lenArea.r; i++) {
50+
51+
}
52+
4853
// Locating which cluster this fragment is part of
4954
uint zTile = uint((log(abs(vec3(view * vec4(FragPos, 1.0)).z) / zNear) * gridSize.z) / log(zFar / zNear));
5055
vec2 tileSize = screenDimensions.xy / gridSize.xy;

Engine/include/GlobalData/Defines.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
constexpr int MAX_DIR_LIGHTS = 1024;
66
constexpr int MAX_OMNI_LIGHTS = 1024;
7+
constexpr int MAX_AREA_LIGHTS = 1024;
78
constexpr int MAX_CLUSTER_SIZE = 100;
89
constexpr int MAX_BONE_INFLUENCE = 4;
910
constexpr int MAX_BONES = 128;

Engine/include/Handlers/LightHandler.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,25 @@ namespace Prisma
2222
std::vector<LightType::LightOmni> lights;
2323
};
2424

25+
struct SSBODataArea
26+
{
27+
glm::ivec4 size;
28+
std::vector<LightType::LightArea> lights;
29+
};
30+
2531
std::shared_ptr<SSBODataDirectional> m_dataDirectional;
2632
std::shared_ptr<SSBODataOmni> m_dataOmni;
33+
std::shared_ptr<SSBODataArea> m_dataArea;
2734

2835
std::shared_ptr<SSBO> m_omniLights;
2936
std::shared_ptr<SSBO> m_dirLights;
3037
std::shared_ptr<SSBO> m_dirCSM;
38+
std::shared_ptr<SSBO> m_areaLights;
3139

3240
void updateDirectional();
3341

42+
void updateArea();
43+
3444
void updateOmni();
3545

3646
void updateCSM();
@@ -50,6 +60,8 @@ namespace Prisma
5060
std::shared_ptr<SSBO> ssboDirectional() const;
5161
std::shared_ptr<SSBODataOmni> dataOmni() const;
5262
std::shared_ptr<SSBO> ssboOmni() const;
63+
std::shared_ptr<SSBODataArea> dataArea() const;
64+
std::shared_ptr<SSBO> ssboArea() const;
5365

5466
std::shared_ptr<ClusterCalculation> m_clusterCalculation;
5567

Engine/include/SceneData/SceneData.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ namespace Prisma
1818
{
1919
struct LightDir;
2020
struct LightOmni;
21+
struct LightArea;
2122
}
2223

2324
struct SceneHandler
@@ -49,6 +50,7 @@ namespace Prisma
4950
std::vector<std::shared_ptr<AnimatedMesh>> animateMeshes;
5051
std::vector<std::shared_ptr<Light<LightType::LightDir>>> dirLights;
5152
std::vector<std::shared_ptr<Light<LightType::LightOmni>>> omniLights;
53+
std::vector<std::shared_ptr<Light<LightType::LightArea>>> areaLights;
5254
std::vector<std::shared_ptr<Sprite>> sprites;
5355
std::string name;
5456
};

Engine/include/SceneObjects/Light.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ namespace Prisma
3232
float padding = 0;
3333
float radius = 1;
3434
};
35+
36+
struct LightArea
37+
{
38+
glm::vec4 position = glm::vec4(0, 0, 0, 1);
39+
glm::vec4 diffuse = glm::vec4(1, 1, 1, 0);
40+
uint64_t shadowMap = 0;
41+
glm::vec2 padding;
42+
};
3543
};
3644

3745
template <typename T>

Engine/src/Handlers/LightHandler.cpp

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ Prisma::LightHandler::LightHandler()
1616
m_dirCSM = std::make_shared<SSBO>(9);
1717
m_dirCSM->resize(16 * sizeof(float) + sizeof(glm::vec4));
1818

19+
m_areaLights = std::make_shared<SSBO>(18);
20+
m_areaLights->resize(MAX_AREA_LIGHTS * sizeof(LightType::LightArea) + sizeof(glm::vec4));
21+
1922
glm::vec3 size = ClusterCalculation::grids();
2023

2124
m_clusterCalculation = std::make_shared<ClusterCalculation>(size.x * size.y * size.z);
@@ -69,6 +72,41 @@ void Prisma::LightHandler::updateDirectional()
6972
m_dataDirectional->lights.data());
7073
}
7174

75+
void Prisma::LightHandler::updateArea()
76+
{
77+
const auto& scene = Prisma::GlobalData::getInstance().currentGlobalScene();
78+
79+
m_dataArea = std::make_shared<SSBODataArea>();
80+
int numVisible = 0;
81+
for (int i = 0; i < scene->areaLights.size(); i++)
82+
{
83+
const auto& light = scene->areaLights[i];
84+
if (light->visible())
85+
{
86+
m_dataArea->lights.push_back(light->type());
87+
glm::mat4 areaMatrix;
88+
if (light->parent())
89+
{
90+
areaMatrix = light->parent()->finalMatrix();
91+
}
92+
else
93+
{
94+
areaMatrix = light->matrix();
95+
}
96+
m_dataArea->lights[i].position = areaMatrix * m_dataArea->lights[i].position;
97+
numVisible++;
98+
}
99+
}
100+
101+
glm::ivec4 areaLength;
102+
areaLength.r = numVisible;
103+
m_areaLights->modifyData(0, sizeof(glm::vec4),
104+
value_ptr(areaLength));
105+
106+
m_areaLights->modifyData(sizeof(glm::vec4), numVisible * sizeof(LightType::LightArea),
107+
m_dataArea->lights.data());
108+
}
109+
72110
void Prisma::LightHandler::updateOmni()
73111
{
74112
const auto& scene = Prisma::GlobalData::getInstance().currentGlobalScene();
@@ -147,10 +185,11 @@ void Prisma::LightHandler::update()
147185
if (m_init || CacheScene::getInstance().updateData() || CacheScene::getInstance().updateSizes() ||
148186
CacheScene::getInstance().updateLights() || CacheScene::getInstance().updateStatus())
149187
{
150-
if (scene->dirLights.size() < MAX_DIR_LIGHTS && scene->omniLights.size() < MAX_OMNI_LIGHTS)
188+
if (scene->dirLights.size() < MAX_DIR_LIGHTS && scene->omniLights.size() < MAX_OMNI_LIGHTS && scene->areaLights.size() < MAX_AREA_LIGHTS)
151189
{
152190
updateDirectional();
153191
updateOmni();
192+
updateArea();
154193
}
155194
else
156195
{
@@ -188,3 +227,13 @@ std::shared_ptr<Prisma::SSBO> Prisma::LightHandler::ssboOmni() const
188227
{
189228
return m_omniLights;
190229
}
230+
231+
std::shared_ptr<Prisma::LightHandler::SSBODataArea> Prisma::LightHandler::dataArea() const
232+
{
233+
return m_dataArea;
234+
}
235+
236+
std::shared_ptr<Prisma::SSBO> Prisma::LightHandler::ssboArea() const
237+
{
238+
return m_areaLights;
239+
}

Engine/src/SceneObjects/Node.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@ void Prisma::Node::removeChild(uint64_t uuid, bool removeRecursive)
8585
Prisma::VectorHelper::getInstance().remove<Sprite>(
8686
Prisma::GlobalData::getInstance().currentGlobalScene()->sprites, uuid);
8787
}
88+
else if (std::dynamic_pointer_cast<Light<LightType::LightArea>>(m_children[index]))
89+
{
90+
Prisma::VectorHelper::getInstance().remove<Light<LightType::LightArea>>(
91+
Prisma::GlobalData::getInstance().currentGlobalScene()->areaLights, uuid);
92+
}
8893

8994
auto components = m_children[index]->components();
9095
for (const auto& component : components)
@@ -240,6 +245,17 @@ void Prisma::Node::dispatch(std::shared_ptr<Node> child)
240245
}
241246
}
242247

248+
if (std::dynamic_pointer_cast<Light<LightType::LightArea>>(child))
249+
{
250+
if (nodeHelper.findUUID<Light<LightType::LightArea>>(
251+
Prisma::GlobalData::getInstance().currentGlobalScene()->areaLights, child->uuid()) < 0)
252+
{
253+
Prisma::GlobalData::getInstance().currentGlobalScene()->areaLights.push_back(
254+
std::dynamic_pointer_cast<Light<LightType::LightArea>>(child));
255+
CacheScene::getInstance().updateLights(true);
256+
}
257+
}
258+
243259
if (Prisma::GlobalData::getInstance().currentGlobalScene()->animateMeshes.size() < MAX_ANIMATION_MESHES)
244260
{
245261
if (std::dynamic_pointer_cast<AnimatedMesh>(child))

GUI/include/NodeCreator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ namespace Prisma
1818

1919
static std::shared_ptr<Prisma::Node> createDirectional();
2020

21+
static std::shared_ptr<Prisma::Node> createArea();
22+
2123
private:
2224
static std::shared_ptr<Node> createMesh(std::shared_ptr<Prisma::Mesh::VerticesData> verticesData,
2325
const std::string& name);

GUI/src/AddingMenu.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ void Prisma::ImGuiAddingMenu::addMenu(Prisma::ImGuiCamera& camera) const
2626
{
2727
Prisma::NodeCreator::createDirectional();
2828
}
29+
if (ImGui::MenuItem("Add Area"))
30+
{
31+
Prisma::NodeCreator::createArea();
32+
}
2933
ImGui::EndPopup();
3034
}
3135
}

GUI/src/NodeCreator.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,17 @@ std::shared_ptr<Prisma::Node> Prisma::NodeCreator::createDirectional()
199199
return light;
200200
}
201201

202+
std::shared_ptr<Prisma::Node> Prisma::NodeCreator::createArea()
203+
{
204+
auto parent = std::make_shared<Prisma::Node>();
205+
parent->name("ParentArea_" + std::to_string(parent->uuid()));
206+
auto light = std::make_shared<Light<LightType::LightArea>>();
207+
light->name("Area" + std::to_string(light->uuid()));
208+
parent->addChild(light);
209+
Prisma::GlobalData::getInstance().currentGlobalScene()->root->addChild(parent);
210+
return light;
211+
}
212+
202213
std::shared_ptr<Prisma::Node> Prisma::NodeCreator::createMesh(std::shared_ptr<Prisma::Mesh::VerticesData> verticesData,
203214
const std::string& name)
204215
{

0 commit comments

Comments
 (0)