Files
Seele/src/Engine/Scene/LightEnvironment.cpp
T

125 lines
4.2 KiB
C++
Raw Normal View History

2023-10-26 18:37:29 +02:00
#include "LightEnvironment.h"
#include "Graphics/Graphics.h"
using namespace Seele;
LightEnvironment::LightEnvironment(Gfx::PGraphics graphics)
: graphics(graphics)
{
2024-04-19 18:23:36 +02:00
layout = graphics->createDescriptorLayout("pLightEnv");
2024-04-19 22:44:00 +02:00
layout->addDescriptorBinding(Gfx::DescriptorBinding{.binding = 0, .descriptorType = Gfx::SE_DESCRIPTOR_TYPE_UNIFORM_BUFFER,});
layout->addDescriptorBinding(Gfx::DescriptorBinding{.binding = 1, .descriptorType = Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER,});
layout->addDescriptorBinding(Gfx::DescriptorBinding{.binding = 2, .descriptorType = Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER,});
2023-10-31 16:16:23 +01:00
layout->create();
lightEnvBuffer = graphics->createUniformBuffer(UniformBufferCreateInfo{
2023-11-01 23:12:30 +01:00
.sourceData = {
2023-10-31 16:16:23 +01:00
.size = sizeof(LightEnv),
.data = (uint8*) &lightEnv,
},
2023-11-05 10:36:01 +01:00
.dynamic = true,
2023-10-31 16:16:23 +01:00
});
directionalLights = graphics->createShaderBuffer(ShaderBufferCreateInfo{
2023-11-01 23:12:30 +01:00
.sourceData = {
2024-02-01 17:07:51 +01:00
.size = sizeof(Component::DirectionalLight) * INIT_DIRECTIONAL_LIGHTS,
2023-11-08 23:27:21 +01:00
.data = nullptr,
2023-10-31 16:16:23 +01:00
},
2024-02-01 17:07:51 +01:00
.numElements = INIT_DIRECTIONAL_LIGHTS,
2023-11-05 10:36:01 +01:00
.dynamic = true,
2023-10-31 16:16:23 +01:00
});
pointLights = graphics->createShaderBuffer(ShaderBufferCreateInfo{
2023-11-01 23:12:30 +01:00
.sourceData = {
2024-02-01 17:07:51 +01:00
.size = sizeof(Component::PointLight) * INIT_POINT_LIGHTS,
2023-11-08 23:27:21 +01:00
.data = nullptr,
2023-10-31 16:16:23 +01:00
},
2024-02-01 17:07:51 +01:00
.numElements = INIT_POINT_LIGHTS,
2023-11-05 10:36:01 +01:00
.dynamic = true,
2023-10-31 16:16:23 +01:00
});
2023-10-26 18:37:29 +02:00
}
LightEnvironment::~LightEnvironment()
{
}
void LightEnvironment::reset()
{
2023-10-31 16:16:23 +01:00
layout->reset();
set = layout->allocateDescriptorSet();
dirs.clear();
points.clear();
2023-10-26 18:37:29 +02:00
}
void LightEnvironment::addDirectionalLight(Component::DirectionalLight dirLight)
{
2023-10-31 16:16:23 +01:00
dirs.add(dirLight);
2023-10-26 18:37:29 +02:00
}
void LightEnvironment::addPointLight(Component::PointLight pointLight)
{
2023-10-31 16:16:23 +01:00
points.add(pointLight);
2023-10-26 18:37:29 +02:00
}
void LightEnvironment::commit()
{
2024-03-28 09:48:55 +01:00
lightEnvBuffer->pipelineBarrier(
Gfx::SE_ACCESS_SHADER_READ_BIT, Gfx::SE_PIPELINE_STAGE_ALL_COMMANDS_BIT,
Gfx::SE_ACCESS_TRANSFER_WRITE_BIT, Gfx::SE_PIPELINE_STAGE_TRANSFER_BIT
);
pointLights->pipelineBarrier(
Gfx::SE_ACCESS_SHADER_READ_BIT, Gfx::SE_PIPELINE_STAGE_ALL_COMMANDS_BIT,
Gfx::SE_ACCESS_TRANSFER_WRITE_BIT, Gfx::SE_PIPELINE_STAGE_TRANSFER_BIT
);
directionalLights->pipelineBarrier(
Gfx::SE_ACCESS_SHADER_READ_BIT, Gfx::SE_PIPELINE_STAGE_ALL_COMMANDS_BIT,
Gfx::SE_ACCESS_TRANSFER_WRITE_BIT, Gfx::SE_PIPELINE_STAGE_TRANSFER_BIT
);
2023-10-31 16:16:23 +01:00
lightEnv.numDirectionalLights = dirs.size();
lightEnv.numPointLights = points.size();
2023-11-01 23:12:30 +01:00
lightEnvBuffer->updateContents(DataSource{
2023-10-31 16:16:23 +01:00
.size = sizeof(LightEnv),
.data = (uint8*) & lightEnv,
});
2024-05-15 15:27:13 +02:00
directionalLights->rotateBuffer(sizeof(Component::DirectionalLight) * dirs.size());
directionalLights->updateContents({
.sourceData = {
2024-02-01 17:07:51 +01:00
.size = sizeof(Component::DirectionalLight) * dirs.size(),
.data = (uint8*)dirs.data(),
2024-05-15 15:27:13 +02:00
},
.numElements = dirs.size(),
});
pointLights->rotateBuffer(sizeof(Component::PointLight) * points.size());
pointLights->updateContents({
.sourceData = {
2024-02-01 17:07:51 +01:00
.size = sizeof(Component::PointLight) * points.size(),
2024-05-15 15:27:13 +02:00
.data = (uint8*)points.data()
},
.numElements = points.size(),
});
2024-03-28 09:48:55 +01:00
lightEnvBuffer->pipelineBarrier(
Gfx::SE_ACCESS_TRANSFER_WRITE_BIT, Gfx::SE_PIPELINE_STAGE_TRANSFER_BIT,
Gfx::SE_ACCESS_SHADER_READ_BIT, Gfx::SE_PIPELINE_STAGE_ALL_COMMANDS_BIT
);
pointLights->pipelineBarrier(
Gfx::SE_ACCESS_TRANSFER_WRITE_BIT, Gfx::SE_PIPELINE_STAGE_TRANSFER_BIT,
Gfx::SE_ACCESS_SHADER_READ_BIT, Gfx::SE_PIPELINE_STAGE_ALL_COMMANDS_BIT
);
directionalLights->pipelineBarrier(
Gfx::SE_ACCESS_TRANSFER_WRITE_BIT, Gfx::SE_PIPELINE_STAGE_TRANSFER_BIT,
Gfx::SE_ACCESS_SHADER_READ_BIT, Gfx::SE_PIPELINE_STAGE_ALL_COMMANDS_BIT
);
2023-10-31 16:16:23 +01:00
set->updateBuffer(0, lightEnvBuffer);
set->updateBuffer(1, directionalLights);
set->updateBuffer(2, pointLights);
2023-11-08 23:27:21 +01:00
set->writeChanges();
2023-10-26 18:37:29 +02:00
}
2023-11-05 10:36:01 +01:00
2024-05-15 15:27:13 +02:00
const Gfx::PDescriptorLayout LightEnvironment::getDescriptorLayout() const
2023-11-05 10:36:01 +01:00
{
return layout;
}
2024-05-15 15:27:13 +02:00
Gfx::PDescriptorSet LightEnvironment::getDescriptorSet()
2023-11-05 10:36:01 +01:00
{
return set;
}