2023-11-05 10:36:01 +01:00
|
|
|
#include "RenderPass.h"
|
|
|
|
|
|
|
|
|
|
using namespace Seele;
|
|
|
|
|
|
2024-06-09 12:20:04 +02:00
|
|
|
RenderPass::RenderPass(Gfx::PGraphics graphics, PScene scene) : graphics(graphics), scene(scene) {
|
2024-04-19 18:23:36 +02:00
|
|
|
viewParamsLayout = graphics->createDescriptorLayout("pViewParams");
|
2024-06-09 12:20:04 +02:00
|
|
|
viewParamsLayout->addDescriptorBinding(Gfx::DescriptorBinding{
|
|
|
|
|
.binding = 0,
|
|
|
|
|
.descriptorType = Gfx::SE_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
|
|
|
|
|
});
|
2023-11-05 10:36:01 +01:00
|
|
|
UniformBufferCreateInfo uniformInitializer = {
|
2024-06-09 12:20:04 +02:00
|
|
|
.sourceData =
|
|
|
|
|
{
|
|
|
|
|
.size = sizeof(ViewParameter),
|
|
|
|
|
.data = (uint8*)&viewParams,
|
|
|
|
|
},
|
2024-04-20 21:35:43 +02:00
|
|
|
.name = "viewParamsBuffer",
|
2023-11-05 10:36:01 +01:00
|
|
|
};
|
|
|
|
|
viewParamsBuffer = graphics->createUniformBuffer(uniformInitializer);
|
|
|
|
|
viewParamsLayout->create();
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-09 12:20:04 +02:00
|
|
|
RenderPass::~RenderPass() {}
|
2023-11-05 10:36:01 +01:00
|
|
|
|
2024-06-09 12:20:04 +02:00
|
|
|
void RenderPass::beginFrame(const Component::Camera& cam) {
|
2024-10-07 20:14:00 +02:00
|
|
|
auto screenDim = Vector2(static_cast<float>(viewport->getWidth()), static_cast<float>(viewport->getHeight()));
|
2024-10-21 22:12:50 +02:00
|
|
|
Matrix4 cameraMatrix = cam.getViewMatrix();
|
|
|
|
|
Matrix4 projectionMatrix = viewport->getProjectionMatrix();
|
2023-11-05 10:36:01 +01:00
|
|
|
viewParams = {
|
2024-10-18 19:01:04 +02:00
|
|
|
.viewFrustum =
|
|
|
|
|
{
|
|
|
|
|
.planes =
|
|
|
|
|
{
|
|
|
|
|
Plane{
|
|
|
|
|
.n = Vector(-0.62628, 0, 0.7796),
|
|
|
|
|
.d = 3.898,
|
|
|
|
|
},
|
|
|
|
|
Plane{
|
|
|
|
|
.n = Vector(0.62628, 0, 0.7796),
|
|
|
|
|
.d = 3.898,
|
|
|
|
|
},
|
|
|
|
|
Plane{
|
|
|
|
|
.n = Vector(0, 0.81915, 0.57358),
|
|
|
|
|
.d = 2.86788,
|
|
|
|
|
},
|
|
|
|
|
Plane{
|
|
|
|
|
.n = Vector(0, -0.81915, 0.57358),
|
|
|
|
|
.d = 2.86788,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2024-10-21 22:12:50 +02:00
|
|
|
.viewMatrix = cameraMatrix,
|
|
|
|
|
.inverseViewMatrix = glm::inverse(cameraMatrix),
|
|
|
|
|
.projectionMatrix = projectionMatrix,
|
|
|
|
|
.inverseProjection = glm::inverse(projectionMatrix),
|
|
|
|
|
.viewProjectionMatrix = projectionMatrix * cameraMatrix,
|
|
|
|
|
.inverseViewProjectionMatrix = glm::inverse(projectionMatrix * cameraMatrix),
|
2024-10-07 20:14:00 +02:00
|
|
|
.cameraPosition_WS = Vector4(cam.getCameraPosition(), 1),
|
|
|
|
|
.cameraForward_WS = Vector4(cam.getCameraForward(), 1),
|
|
|
|
|
.screenDimensions = screenDim,
|
|
|
|
|
.invScreenDimensions = 1.0f / screenDim,
|
|
|
|
|
.frameIndex = Gfx::getCurrentFrameIndex(),
|
|
|
|
|
.time = static_cast<float>(Gfx::getCurrentFrameTime()),
|
2023-11-05 10:36:01 +01:00
|
|
|
};
|
2024-10-21 22:12:50 +02:00
|
|
|
|
|
|
|
|
// screen space
|
|
|
|
|
StaticArray<Vector4, 4> corners = {
|
|
|
|
|
Vector4(0, 0, -1, 1),
|
|
|
|
|
Vector4(screenDim.x, 0, -1, 1),
|
|
|
|
|
Vector4(screenDim.y, 0, -1, 1),
|
|
|
|
|
Vector4(screenDim.x, screenDim.y, -1, 1),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
for (uint32 i = 0; i < corners.size(); ++i) {
|
|
|
|
|
Vector2 texCoord = Vector2(corners[i].x, corners[i].y) / screenDim;
|
|
|
|
|
|
|
|
|
|
Vector4 clip = Vector4(Vector2(texCoord.x, 1 - texCoord.y) * 2.0f - 1.0f, corners[i].z, corners[i].w);
|
|
|
|
|
|
|
|
|
|
Vector4 world = viewParams.inverseViewProjectionMatrix * clip;
|
|
|
|
|
|
|
|
|
|
corners[i] = world / world.w;
|
|
|
|
|
}
|
|
|
|
|
|
2024-10-22 13:31:58 +02:00
|
|
|
extract_planes_from_view_projection_matrix(viewParams.viewProjectionMatrix, viewParams.viewFrustum);
|
2024-10-21 22:12:50 +02:00
|
|
|
|
2024-05-22 10:30:45 +02:00
|
|
|
viewParamsBuffer->rotateBuffer(sizeof(ViewParameter));
|
2024-08-08 22:14:25 +02:00
|
|
|
viewParamsBuffer->updateContents(0, sizeof(ViewParameter), &viewParams);
|
2024-06-09 12:20:04 +02:00
|
|
|
viewParamsBuffer->pipelineBarrier(Gfx::SE_ACCESS_TRANSFER_WRITE_BIT, Gfx::SE_PIPELINE_STAGE_TRANSFER_BIT,
|
2024-07-16 15:32:51 +02:00
|
|
|
Gfx::SE_ACCESS_UNIFORM_READ_BIT | Gfx::SE_ACCESS_TRANSFER_WRITE_BIT,
|
2024-07-05 12:02:46 +02:00
|
|
|
Gfx::SE_PIPELINE_STAGE_TASK_SHADER_BIT_EXT | Gfx::SE_PIPELINE_STAGE_MESH_SHADER_BIT_EXT |
|
2024-07-16 15:32:51 +02:00
|
|
|
Gfx::SE_PIPELINE_STAGE_VERTEX_SHADER_BIT | Gfx::SE_PIPELINE_STAGE_COMPUTE_SHADER_BIT |
|
|
|
|
|
Gfx::SE_PIPELINE_STAGE_TRANSFER_BIT);
|
2023-11-05 10:36:01 +01:00
|
|
|
viewParamsLayout->reset();
|
|
|
|
|
viewParamsSet = viewParamsLayout->allocateDescriptorSet();
|
2024-09-27 15:57:37 +02:00
|
|
|
viewParamsSet->updateBuffer(0, 0, viewParamsBuffer);
|
2023-11-05 10:36:01 +01:00
|
|
|
viewParamsSet->writeChanges();
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-09 12:20:04 +02:00
|
|
|
void RenderPass::setResources(PRenderGraphResources _resources) { resources = _resources; }
|
2023-11-05 10:36:01 +01:00
|
|
|
|
2024-06-09 12:20:04 +02:00
|
|
|
void RenderPass::setViewport(Gfx::PViewport _viewport) { viewport = _viewport; }
|
2024-10-22 13:31:58 +02:00
|
|
|
|
|
|
|
|
void RenderPass::normalize_plane(Plane& plane) {
|
|
|
|
|
float l = sqrtf(plane.n.x * plane.n.x + plane.n.y * plane.n.y + plane.n.z * plane.n.z);
|
|
|
|
|
plane.n.x /= l;
|
|
|
|
|
plane.n.y /= l;
|
|
|
|
|
plane.n.z /= l;
|
|
|
|
|
plane.d /= l;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void RenderPass::extract_planes_from_view_projection_matrix(const Matrix4 viewProj, Frustum& frustum) {
|
|
|
|
|
// Compute all the planes
|
|
|
|
|
frustum.planes[0] = {
|
|
|
|
|
.n = Vector(viewProj[0][0] + viewProj[0][3], viewProj[1][0] + viewProj[1][3], viewProj[2][0] + viewProj[2][3]),
|
|
|
|
|
.d = viewProj[3][0] + viewProj[3][3],
|
|
|
|
|
};
|
|
|
|
|
frustum.planes[1] = {
|
|
|
|
|
.n = Vector(-viewProj[0][0] + viewProj[0][3], -viewProj[1][0] + viewProj[1][3], -viewProj[2][0] + viewProj[2][3]),
|
|
|
|
|
.d = -viewProj[3][0] + viewProj[3][3],
|
|
|
|
|
};
|
|
|
|
|
frustum.planes[2] = {
|
|
|
|
|
.n = Vector(viewProj[0][1] + viewProj[0][3], viewProj[1][1] + viewProj[1][3], viewProj[2][1] + viewProj[2][3]),
|
|
|
|
|
.d = viewProj[3][1] + viewProj[3][3],
|
|
|
|
|
};
|
|
|
|
|
frustum.planes[3] = {
|
|
|
|
|
.n = Vector(-viewProj[0][1] + viewProj[0][3], -viewProj[1][1] + viewProj[1][3], -viewProj[2][1] + viewProj[2][3]),
|
|
|
|
|
.d = -viewProj[3][1] + viewProj[3][3],
|
|
|
|
|
};
|
|
|
|
|
// Normalize all the planes
|
|
|
|
|
for (uint32_t planeIdx = 0; planeIdx < 4; ++planeIdx)
|
|
|
|
|
normalize_plane(frustum.planes[planeIdx]);
|
|
|
|
|
}
|