2024-04-20 17:29:29 -04:00
|
|
|
// SPDX-FileCopyrightText: 2024 Joshua Goins <josh@redstrate.com>
|
|
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <QDebug>
|
|
|
|
#include <string_view>
|
|
|
|
|
2024-04-21 09:01:02 -04:00
|
|
|
#include <glm/glm.hpp>
|
2024-04-20 17:29:29 -04:00
|
|
|
#include <physis.hpp>
|
|
|
|
#include <spirv.hpp>
|
|
|
|
#include <spirv_cross.hpp>
|
|
|
|
#include <spirv_glsl.hpp>
|
|
|
|
#include <vulkan/vulkan.h>
|
|
|
|
|
|
|
|
class Renderer;
|
|
|
|
struct RenderModel;
|
|
|
|
|
|
|
|
class RenderSystem
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
RenderSystem(Renderer &renderer, GameData *data);
|
|
|
|
|
|
|
|
void testInit(::RenderModel *m);
|
|
|
|
|
|
|
|
void render(uint32_t imageIndex, VkCommandBuffer commandBuffer);
|
|
|
|
|
|
|
|
void setSize(uint32_t width, uint32_t height);
|
|
|
|
|
|
|
|
private:
|
|
|
|
void beginPass(uint32_t imageIndex, VkCommandBuffer commandBuffer, std::string_view passName);
|
|
|
|
void endPass(VkCommandBuffer commandBuffer);
|
|
|
|
void bindPipeline(VkCommandBuffer commandBuffer, physis_Shader &vertexShader, physis_Shader &pixelShader);
|
|
|
|
VkShaderModule convertShaderModule(const physis_Shader &shader, spv::ExecutionModel executionModel);
|
|
|
|
spirv_cross::CompilerGLSL getShaderModuleResources(const physis_Shader &shader);
|
|
|
|
|
2024-04-21 10:25:52 -04:00
|
|
|
physis_SHPK directionalLightningShpk;
|
|
|
|
|
2024-04-20 17:29:29 -04:00
|
|
|
struct RenderModel {
|
|
|
|
physis_SHPK shpk;
|
|
|
|
|
|
|
|
::RenderModel *internal_model = nullptr;
|
|
|
|
};
|
|
|
|
std::vector<RenderModel> m_renderModels;
|
|
|
|
|
|
|
|
struct RequestedBinding {
|
|
|
|
VkDescriptorType type;
|
|
|
|
VkShaderStageFlags stageFlags;
|
|
|
|
bool used = false;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct RequestedSet {
|
|
|
|
bool used = true;
|
|
|
|
VkDescriptorSetLayout layout = VK_NULL_HANDLE;
|
|
|
|
std::vector<RequestedBinding> bindings;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct CachedPipeline {
|
|
|
|
VkPipeline pipeline = VK_NULL_HANDLE;
|
|
|
|
VkPipelineLayout pipelineLayout = VK_NULL_HANDLE;
|
|
|
|
std::vector<VkDescriptorSetLayout> setLayouts;
|
|
|
|
std::map<uint64_t, VkDescriptorSet> cachedDescriptors;
|
|
|
|
std::vector<RequestedSet> requestedSets;
|
2024-04-21 09:01:02 -04:00
|
|
|
physis_Shader vertexShader, pixelShader;
|
2024-04-20 17:29:29 -04:00
|
|
|
};
|
|
|
|
|
|
|
|
// combined vertex + pixel code length
|
|
|
|
std::unordered_map<uint32_t, CachedPipeline> m_cachedPipelines;
|
|
|
|
|
|
|
|
Renderer &m_renderer;
|
|
|
|
GameData *m_data = nullptr;
|
|
|
|
VkExtent2D m_extent = {640, 480};
|
|
|
|
|
|
|
|
VkDescriptorSet createDescriptorFor(const RenderModel &model, const CachedPipeline &cachedPipeline, int i);
|
2024-04-21 09:01:02 -04:00
|
|
|
|
|
|
|
struct UniformBuffer {
|
|
|
|
VkBuffer buffer;
|
|
|
|
VkDeviceMemory memory;
|
|
|
|
size_t size;
|
|
|
|
};
|
|
|
|
|
|
|
|
UniformBuffer createUniformBuffer(size_t size);
|
|
|
|
void copyDataToUniform(UniformBuffer &uniformBuffer, void *data, size_t size);
|
|
|
|
|
|
|
|
// Structure definitions from https://github.com/Shaderlayan/Ouroboros
|
|
|
|
struct CameraParameter {
|
|
|
|
glm::mat3x4 m_ViewMatrix;
|
|
|
|
glm::mat3x4 m_InverseViewMatrix;
|
|
|
|
glm::mat4 m_InverseViewProjectionMatrix;
|
|
|
|
glm::mat4 m_InverseProjectionMatrix;
|
|
|
|
glm::mat4 m_ProjectionMatrix;
|
|
|
|
glm::mat4 m_ViewProjectionMatrix;
|
|
|
|
/*glm::mat4 m_MainViewToProjectionMatrix;
|
|
|
|
glm::vec3 m_EyePosition;
|
|
|
|
glm::vec3 m_LookAtVector;*/
|
|
|
|
};
|
|
|
|
|
|
|
|
UniformBuffer g_CameraParameter;
|
|
|
|
|
|
|
|
struct JointMatrixArray {
|
|
|
|
glm::mat3x4 g_JointMatrixArray[64];
|
|
|
|
};
|
|
|
|
|
|
|
|
UniformBuffer g_JointMatrixArray;
|
|
|
|
|
|
|
|
struct CameraLight {
|
|
|
|
glm::vec4 m_DiffuseSpecular;
|
|
|
|
glm::vec4 m_Rim;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct InstanceParameterStruct {
|
|
|
|
glm::vec4 m_MulColor;
|
|
|
|
glm::vec4 m_EnvParameter;
|
|
|
|
CameraLight m_CameraLight;
|
|
|
|
glm::vec4 m_Wetness;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct InstanceParameter {
|
|
|
|
InstanceParameterStruct g_InstanceParameter;
|
|
|
|
};
|
|
|
|
|
|
|
|
UniformBuffer g_InstanceParameter;
|
|
|
|
|
|
|
|
struct ModelParameterStruct {
|
|
|
|
glm::vec4 m_Params;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct ModelParameter {
|
|
|
|
ModelParameterStruct g_ModelParameter;
|
|
|
|
};
|
|
|
|
|
|
|
|
UniformBuffer g_ModelParameter;
|
|
|
|
|
|
|
|
struct MaterialParameter {
|
|
|
|
glm::vec3 g_DiffuseColor;
|
|
|
|
float g_AlphaThreshold;
|
|
|
|
};
|
|
|
|
|
|
|
|
UniformBuffer g_MaterialParameter;
|
2024-04-20 17:29:29 -04:00
|
|
|
};
|