#pragma once
#include <vkcv/Core.hpp>

struct RenderTargets {
	vkcv::ImageHandle depthBuffer;
	vkcv::ImageHandle colorBuffer;
	vkcv::ImageHandle motionBuffer;
};

struct GraphicPassHandles {
	vkcv::PipelineHandle    pipeline;
	vkcv::PassHandle        renderPass;
};

struct ComputePassHandles {
	vkcv::PipelineHandle        pipeline;
	vkcv::DescriptorSetHandle   descriptorSet;
};

struct MeshResources {
	vkcv::Mesh          mesh;
	vkcv::BufferHandle  vertexBuffer;
	vkcv::BufferHandle  indexBuffer;
};

// loads position and normal of the first mesh in a scene
bool loadMesh(vkcv::Core& core, const std::filesystem::path& path, MeshResources* outMesh);

bool loadGraphicPass(
	vkcv::Core& core,
	const std::filesystem::path vertexPath,
	const std::filesystem::path fragmentPath,
	const vkcv::PassConfig&     passConfig,
	const vkcv::DepthTest       depthTest,
	GraphicPassHandles*         outPassHandles);

bool loadMeshPass(vkcv::Core& core, GraphicPassHandles* outHandles);
bool loadSkyPass (vkcv::Core& core, GraphicPassHandles* outHandles);
bool loadPrePass (vkcv::Core& core, GraphicPassHandles* outHandles);

bool loadComputePass(vkcv::Core& core, const std::filesystem::path& path, ComputePassHandles* outComputePass);

RenderTargets createRenderTargets(vkcv::Core& core, const uint32_t width, const uint32_t height);