2023-01-29 18:58:59 +01:00
|
|
|
#include "SkyboxRenderPass.h"
|
|
|
|
|
#include "Graphics/Graphics.h"
|
2023-10-26 18:37:29 +02:00
|
|
|
#include "Asset/AssetRegistry.h"
|
2023-01-29 18:58:59 +01:00
|
|
|
|
|
|
|
|
using namespace Seele;
|
|
|
|
|
|
2023-10-26 18:37:29 +02:00
|
|
|
SkyboxRenderPass::SkyboxRenderPass(Gfx::PGraphics graphics, PScene scene)
|
|
|
|
|
: RenderPass(graphics, scene)
|
2023-01-29 18:58:59 +01:00
|
|
|
{
|
2023-10-26 18:37:29 +02:00
|
|
|
skybox = Seele::Component::Skybox{
|
|
|
|
|
.day = AssetRegistry::findTexture("FS000_Day_01")->getTexture().cast<Gfx::TextureCube>(),
|
|
|
|
|
.night = AssetRegistry::findTexture("FS000_Night_01")->getTexture().cast<Gfx::TextureCube>(),
|
|
|
|
|
.fogColor = Vector(0.2, 0.1, 0.6),
|
|
|
|
|
.blendFactor = 0,
|
|
|
|
|
};
|
2023-01-29 18:58:59 +01:00
|
|
|
Array<Vector> vertices = {
|
|
|
|
|
// Back
|
2023-02-01 22:13:04 +01:00
|
|
|
Vector(-512, -512, 512),
|
|
|
|
|
Vector(-512, 512, 512),
|
|
|
|
|
Vector( 512, -512, 512),
|
2023-01-29 18:58:59 +01:00
|
|
|
|
2023-02-01 22:13:04 +01:00
|
|
|
Vector( 512, -512, 512),
|
|
|
|
|
Vector(-512, 512, 512),
|
|
|
|
|
Vector( 512, 512, 512),
|
2023-01-29 18:58:59 +01:00
|
|
|
|
|
|
|
|
// Front
|
2023-02-01 22:13:04 +01:00
|
|
|
Vector( 512, -512, -512),
|
|
|
|
|
Vector( 512, 512, -512),
|
|
|
|
|
Vector(-512, -512, -512),
|
2023-01-29 18:58:59 +01:00
|
|
|
|
2023-02-01 22:13:04 +01:00
|
|
|
Vector(-512, -512, -512),
|
|
|
|
|
Vector( 512, 512, -512),
|
|
|
|
|
Vector(-512, 512, -512),
|
2023-01-29 18:58:59 +01:00
|
|
|
|
|
|
|
|
// Top
|
2023-02-01 22:13:04 +01:00
|
|
|
Vector(-512, -512, -512),
|
|
|
|
|
Vector(-512, -512, 512),
|
|
|
|
|
Vector( 512, -512, -512),
|
2023-01-29 18:58:59 +01:00
|
|
|
|
2023-02-01 22:13:04 +01:00
|
|
|
Vector( 512, -512, -512),
|
|
|
|
|
Vector(-512, -512, 512),
|
|
|
|
|
Vector( 512, -512, 512),
|
2023-01-29 18:58:59 +01:00
|
|
|
|
|
|
|
|
// Bottom
|
2023-02-01 22:13:04 +01:00
|
|
|
Vector(-512, 512, 512),
|
|
|
|
|
Vector(-512, 512, -512),
|
|
|
|
|
Vector( 512, 512, 512),
|
2023-01-29 18:58:59 +01:00
|
|
|
|
2023-02-01 22:13:04 +01:00
|
|
|
Vector( 512, 512, 512),
|
|
|
|
|
Vector(-512, 512, -512),
|
|
|
|
|
Vector( 512, 512, -512),
|
2023-01-29 18:58:59 +01:00
|
|
|
|
|
|
|
|
// Left
|
2023-02-01 22:13:04 +01:00
|
|
|
Vector(-512, -512, -512),
|
|
|
|
|
Vector(-512, 512, -512),
|
|
|
|
|
Vector(-512, -512, 512),
|
2023-01-29 18:58:59 +01:00
|
|
|
|
2023-02-01 22:13:04 +01:00
|
|
|
Vector(-512, -512, 512),
|
|
|
|
|
Vector(-512, 512, -512),
|
|
|
|
|
Vector(-512, 512, 512),
|
2023-01-29 18:58:59 +01:00
|
|
|
|
|
|
|
|
// Right
|
2023-02-01 22:13:04 +01:00
|
|
|
Vector( 512, -512, 512),
|
|
|
|
|
Vector( 512, 512, 512),
|
|
|
|
|
Vector( 512, -512, -512),
|
2023-01-29 18:58:59 +01:00
|
|
|
|
2023-02-01 22:13:04 +01:00
|
|
|
Vector( 512, -512, -512),
|
|
|
|
|
Vector( 512, 512, 512),
|
|
|
|
|
Vector( 512, 512, -512),
|
2023-01-29 18:58:59 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
VertexBufferCreateInfo vertexBufferInfo = {
|
2023-11-01 23:12:30 +01:00
|
|
|
.sourceData = {
|
2023-01-29 18:58:59 +01:00
|
|
|
.size = sizeof(Vector) * vertices.size(),
|
|
|
|
|
.data = (uint8*)vertices.data(),
|
|
|
|
|
},
|
|
|
|
|
.vertexSize = sizeof(Vector),
|
|
|
|
|
.numVertices = (uint32)vertices.size(),
|
|
|
|
|
};
|
|
|
|
|
cubeBuffer = graphics->createVertexBuffer(vertexBufferInfo);
|
|
|
|
|
}
|
|
|
|
|
SkyboxRenderPass::~SkyboxRenderPass()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SkyboxRenderPass::beginFrame(const Component::Camera& cam)
|
|
|
|
|
{
|
2023-11-01 23:12:30 +01:00
|
|
|
DataSource uniformUpdate;
|
2023-01-29 18:58:59 +01:00
|
|
|
|
|
|
|
|
viewParams.viewMatrix = cam.getViewMatrix();
|
|
|
|
|
viewParams.projectionMatrix = viewport->getProjectionMatrix();
|
2023-02-27 13:52:57 +01:00
|
|
|
viewParams.cameraPosition = Vector4(cam.getCameraPosition(), 1);
|
2023-01-29 18:58:59 +01:00
|
|
|
viewParams.screenDimensions = Vector2(static_cast<float>(viewport->getSizeX()), static_cast<float>(viewport->getSizeY()));
|
|
|
|
|
uniformUpdate.size = sizeof(ViewParameter);
|
|
|
|
|
uniformUpdate.data = (uint8*)&viewParams;
|
|
|
|
|
viewParamsBuffer->updateContents(uniformUpdate);
|
|
|
|
|
descriptorLayout->reset();
|
|
|
|
|
descriptorSet = descriptorLayout->allocateDescriptorSet();
|
|
|
|
|
descriptorSet->updateBuffer(0, viewParamsBuffer);
|
2023-10-26 18:37:29 +02:00
|
|
|
descriptorSet->updateTexture(1, skybox.day);
|
|
|
|
|
descriptorSet->updateTexture(2, skybox.night);
|
2023-02-01 22:13:04 +01:00
|
|
|
descriptorSet->updateSampler(3, skyboxSampler);
|
2023-01-29 18:58:59 +01:00
|
|
|
descriptorSet->writeChanges();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SkyboxRenderPass::render()
|
|
|
|
|
{
|
|
|
|
|
graphics->beginRenderPass(renderPass);
|
|
|
|
|
Gfx::PRenderCommand renderCommand = graphics->createRenderCommand("SkyboxRender");
|
|
|
|
|
renderCommand->setViewport(viewport);
|
|
|
|
|
renderCommand->bindPipeline(pipeline);
|
|
|
|
|
renderCommand->bindDescriptor(descriptorSet);
|
2023-10-26 18:37:29 +02:00
|
|
|
renderCommand->bindVertexBuffer({ cubeBuffer });
|
|
|
|
|
renderCommand->pushConstants(pipelineLayout, Gfx::SE_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(Vector), &skybox.fogColor);
|
|
|
|
|
renderCommand->pushConstants(pipelineLayout, Gfx::SE_SHADER_STAGE_FRAGMENT_BIT, sizeof(Vector), sizeof(float), &skybox.blendFactor);
|
2023-01-29 18:58:59 +01:00
|
|
|
renderCommand->draw(36, 1, 0, 0);
|
|
|
|
|
graphics->executeCommands(Array{ renderCommand });
|
|
|
|
|
graphics->endRenderPass();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SkyboxRenderPass::endFrame()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SkyboxRenderPass::publishOutputs()
|
|
|
|
|
{
|
|
|
|
|
UniformBufferCreateInfo viewCreateInfo = {
|
2023-11-01 23:12:30 +01:00
|
|
|
.sourceData = DataSource {
|
2023-01-29 18:58:59 +01:00
|
|
|
.size = sizeof(ViewParameter),
|
|
|
|
|
.data = nullptr,
|
|
|
|
|
},
|
|
|
|
|
.bDynamic = true
|
|
|
|
|
};
|
|
|
|
|
viewParamsBuffer = graphics->createUniformBuffer(viewCreateInfo);
|
|
|
|
|
|
|
|
|
|
descriptorLayout = graphics->createDescriptorLayout("SkyboxDescLayout");
|
|
|
|
|
descriptorLayout->addDescriptorBinding(0, Gfx::SE_DESCRIPTOR_TYPE_UNIFORM_BUFFER);
|
|
|
|
|
descriptorLayout->addDescriptorBinding(1, Gfx::SE_DESCRIPTOR_TYPE_SAMPLED_IMAGE);
|
|
|
|
|
descriptorLayout->addDescriptorBinding(2, Gfx::SE_DESCRIPTOR_TYPE_SAMPLED_IMAGE);
|
|
|
|
|
descriptorLayout->addDescriptorBinding(3, Gfx::SE_DESCRIPTOR_TYPE_SAMPLER);
|
|
|
|
|
descriptorLayout->create();
|
|
|
|
|
|
|
|
|
|
pipelineLayout = graphics->createPipelineLayout();
|
|
|
|
|
pipelineLayout->addDescriptorLayout(0, descriptorLayout);
|
|
|
|
|
pipelineLayout->addPushConstants(Gfx::SePushConstantRange{
|
2023-02-01 22:13:04 +01:00
|
|
|
.stageFlags = Gfx::SE_SHADER_STAGE_FRAGMENT_BIT,
|
2023-01-29 18:58:59 +01:00
|
|
|
.offset = 0,
|
2023-02-01 22:13:04 +01:00
|
|
|
.size = sizeof(Vector4),
|
2023-01-29 18:58:59 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
pipelineLayout->create();
|
2023-02-01 22:13:04 +01:00
|
|
|
|
|
|
|
|
skyboxSampler = graphics->createSamplerState({});
|
2023-01-29 18:58:59 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SkyboxRenderPass::createRenderPass()
|
|
|
|
|
{
|
|
|
|
|
Gfx::PRenderTargetAttachment baseColorAttachment = resources->requestRenderTarget("BASEPASS_COLOR");
|
|
|
|
|
baseColorAttachment->loadOp = Gfx::SE_ATTACHMENT_LOAD_OP_LOAD;
|
|
|
|
|
Gfx::PRenderTargetAttachment depthAttachment = resources->requestRenderTarget("DEPTHPREPASS_DEPTH");
|
|
|
|
|
depthAttachment->loadOp = Gfx::SE_ATTACHMENT_LOAD_OP_LOAD;
|
|
|
|
|
Gfx::PRenderTargetLayout layout = new Gfx::RenderTargetLayout(baseColorAttachment, depthAttachment);
|
|
|
|
|
renderPass = graphics->createRenderPass(layout, viewport);
|
|
|
|
|
|
|
|
|
|
ShaderCreateInfo createInfo;
|
|
|
|
|
createInfo.name = "SkyboxVertex";
|
|
|
|
|
createInfo.mainModule = "Skybox";
|
|
|
|
|
createInfo.entryPoint = "vertexMain";
|
|
|
|
|
createInfo.defines["INDEX_VIEW_PARAMS"] = "0";
|
|
|
|
|
Gfx::PVertexShader vertexShader = graphics->createVertexShader(createInfo);
|
|
|
|
|
|
|
|
|
|
createInfo.name = "SkyboxFragment";
|
|
|
|
|
createInfo.entryPoint = "fragmentMain";
|
|
|
|
|
Gfx::PFragmentShader fragmentShader = graphics->createFragmentShader(createInfo);
|
|
|
|
|
|
|
|
|
|
Gfx::PVertexDeclaration vertexDecl = graphics->createVertexDeclaration({
|
|
|
|
|
Gfx::VertexElement {
|
2023-10-26 18:37:29 +02:00
|
|
|
.binding = 0,
|
2023-01-29 18:58:59 +01:00
|
|
|
.offset = 0,
|
|
|
|
|
.vertexFormat = Gfx::SE_FORMAT_R32G32B32_SFLOAT,
|
|
|
|
|
.attributeIndex = 0,
|
|
|
|
|
.stride = sizeof(Vector),
|
|
|
|
|
}
|
2023-10-26 18:37:29 +02:00
|
|
|
});
|
2023-01-29 18:58:59 +01:00
|
|
|
|
2023-10-26 18:37:29 +02:00
|
|
|
Gfx::LegacyPipelineCreateInfo gfxInfo;
|
2023-01-29 18:58:59 +01:00
|
|
|
gfxInfo.vertexDeclaration = vertexDecl;
|
|
|
|
|
gfxInfo.vertexShader = vertexShader;
|
|
|
|
|
gfxInfo.fragmentShader = fragmentShader;
|
|
|
|
|
gfxInfo.rasterizationState.polygonMode = Gfx::SE_POLYGON_MODE_FILL;
|
|
|
|
|
gfxInfo.rasterizationState.lineWidth = 5.f;
|
|
|
|
|
gfxInfo.topology = Gfx::SE_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST;
|
|
|
|
|
gfxInfo.pipelineLayout = pipelineLayout;
|
|
|
|
|
gfxInfo.renderPass = renderPass;
|
|
|
|
|
pipeline = graphics->createGraphicsPipeline(gfxInfo);
|
|
|
|
|
}
|