@@ -18,7 +18,7 @@

#include "Core/scene.h.generated.h"

static void CreatePrimitives(ResourceManager * resMan)
void Scene::CreatePrimitives()
{
using namespace std::chrono_literals;
const float plainQuadVerts[] = {
@@ -128,15 +128,15 @@ static void CreatePrimitives(ResourceManager * resMan)
VertexComponentType::FLOAT,
3,
false,
3
3 * sizeof(float)
},
{
0,
2,
VertexComponentType::FLOAT,
2,
false,
6
6 * sizeof(float)
}
};

@@ -153,23 +153,61 @@ static void CreatePrimitives(ResourceManager * resMan)
ptInputState
});

RenderPassHandle::AttachmentDescription attachment = {
0,
Format::RGBA8,
RenderPassHandle::AttachmentDescription::LoadOp::LOAD,
RenderPassHandle::AttachmentDescription::StoreOp::STORE,
RenderPassHandle::AttachmentDescription::LoadOp::DONT_CARE,
RenderPassHandle::AttachmentDescription::StoreOp::DONT_CARE,
ImageLayout::COLOR_ATTACHMENT_OPTIMAL,
ImageLayout::COLOR_ATTACHMENT_OPTIMAL
};

RenderPassHandle::AttachmentReference reference = {
0,
ImageLayout::COLOR_ATTACHMENT_OPTIMAL
};

RenderPassHandle::SubpassDescription subpass = {
RenderPassHandle::PipelineBindPoint::GRAPHICS,
0,
nullptr,
1,
&reference,
nullptr,
nullptr,
0,
nullptr
};


this->main_renderpass_ = ctx.CreateRenderPass({
1,
&attachment,
1,
&subpass,
0,
nullptr
});

finishedJobs++;
}));

resMan->PushRenderCommand(rc);
resourceManager->PushRenderCommand(rc);

while (finishedJobs.load() < 1) {
std::this_thread::sleep_for(1ms);
}

resMan->AddResource("_Primitives/Buffers/QuadVBO.buffer", quadVerts);
resMan->AddResource("_Primitives/Buffers/QuadEBO.buffer", quadElems);
resourceManager->AddResource("_Primitives/Buffers/QuadVBO.buffer", quadVerts);
resourceManager->AddResource("_Primitives/Buffers/QuadEBO.buffer", quadElems);

resMan->AddResource("_Primitives/Shaders/passthrough-transform.vert", ptvShader);
resMan->AddResource("_Primitives/Shaders/passthrough.frag", pfShader);
resourceManager->AddResource("_Primitives/Shaders/passthrough-transform.vert", ptvShader);
resourceManager->AddResource("_Primitives/Shaders/passthrough.frag", pfShader);

resMan->AddResource("_Primitives/VertexInputStates/passthrough-transform.state", ptInputState);
resMan->AddResource("_Primitives/Pipelines/passthrough-transform.pipe", ptPipeline);
resourceManager->AddResource("_Primitives/VertexInputStates/passthrough-transform.state", ptInputState);
resourceManager->AddResource("_Primitives/Pipelines/passthrough-transform.pipe", ptPipeline);

}

@@ -180,7 +218,7 @@ Scene::Scene(const std::string& name, ResourceManager * resMan, Queue<SDL_Event>
using nlohmann::json;
this->name = name;

CreatePrimitives(resMan);
CreatePrimitives();

json j = json::parse(serializedScene);

@@ -221,9 +259,11 @@ void Scene::EndFrame() noexcept
ViewDef * vd = std::get<ViewDef *>(nextViewDef);
std::swap(vd->camera, camerasToSubmit);
std::swap(vd->sprites, spritesToSubmit);
std::swap(vd->commandBuffers, command_buffers_);
PushRenderCommand(RenderCommand(RenderCommand::DrawViewParams(vd)));
camerasToSubmit.clear();
spritesToSubmit.clear();
command_buffers_.clear();
}

void Scene::PushRenderCommand(const RenderCommand& rc) noexcept
@@ -236,6 +276,11 @@ void Scene::SubmitCamera(CameraComponent * cam) noexcept
camerasToSubmit.emplace_back(cam->GetViewMatrix(), cam->GetProjectionMatrix(), cam->GetRenderTarget()->GetRendererData());
}

void Scene::SubmitCommandBuffer(RenderCommandContext * ctx)
{
command_buffers_.push_back(ctx);
}

void Scene::SubmitSprite(Sprite * sprite) noexcept
{
spritesToSubmit.emplace_back(sprite->transform->GetLocalToWorldSpace(), sprite->minUV, sprite->sizeUV, sprite->image->GetImageHandle());
@@ -249,9 +294,39 @@ void Scene::Tick() noexcept
physicsWorld->world->stepSimulation(time.GetDeltaTime());
BroadcastEvent("Tick", { { "deltaTime", time.GetDeltaTime() } });

auto ctx = Renderer::CreateCommandContext();
RenderCommandContext::RenderPassBeginInfo beginInfo = {
main_renderpass_,
&Renderer::Backbuffer,
{
{
0,
0
},
{
//TODO:
800,
600
}
},
0,
nullptr
};
ctx->CmdBeginRenderPass(&beginInfo, RenderCommandContext::SubpassContents::SECONDARY_COMMAND_BUFFERS);

for (auto& cc : camerasToSubmit) {
BroadcastEvent("GatherRenderCommands", { { "camera", &cc } });
}

//TODO: Assumes single thread
if (command_buffers_.size() > 0) {
ctx->CmdExecuteCommands(command_buffers_.size(), &command_buffers_[0]);
}

ctx->CmdEndRenderPass();

RenderCommand rc(RenderCommand::ExecuteCommandContextParams(std::move(ctx)));
renderQueue.Push(rc);
}

Entity * Scene::GetEntityByName(std::string name)
@@ -42,6 +42,7 @@ struct Scene : LuaSerializable, Resource
void EndFrame() noexcept;
void PushRenderCommand(const RenderCommand&) noexcept;
void SubmitCamera(CameraComponent *) noexcept;
void SubmitCommandBuffer(RenderCommandContext *);
void SubmitMesh(Mesh *) noexcept;
void SubmitSprite(Sprite *) noexcept;
void Tick() noexcept;
@@ -75,10 +76,8 @@ struct Scene : LuaSerializable, Resource
std::vector<SubmittedCamera> camerasToSubmit;
std::vector<SubmittedMesh> meshesToSubmit;
std::vector<SubmittedSprite> spritesToSubmit;
void CreatePrimitives();

//TODO:
std::vector<std::shared_ptr<Accessor>> accessors;
std::vector<std::shared_ptr<Material>> materials;
std::vector<std::shared_ptr<Mesh>> meshes;
std::vector<std::shared_ptr<Program>> programs;
std::vector<RenderCommandContext *> command_buffers_;
RenderPassHandle * main_renderpass_;
};