1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-04-20 11:47:45 +00:00
novus/renderer/include/renderer.hpp

147 lines
4.3 KiB
C++
Raw Normal View History

// SPDX-FileCopyrightText: 2023 Joshua Goins <josh@redstrate.com>
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QString>
#include <array>
#include <glm/ext/matrix_float4x4.hpp>
#include <map>
#include <vector>
#include <vulkan/vulkan.h>
2022-08-10 14:52:28 -04:00
#include <physis.hpp>
2022-04-12 08:55:38 -04:00
struct RenderPart {
size_t numIndices;
VkBuffer vertexBuffer, indexBuffer;
VkDeviceMemory vertexMemory, indexMemory;
int materialIndex = 0;
};
struct RenderTexture {
VkImage handle = VK_NULL_HANDLE;
VkDeviceMemory memory = VK_NULL_HANDLE;
VkImageView view = VK_NULL_HANDLE;
VkSampler sampler = VK_NULL_HANDLE;
};
2023-10-12 23:45:45 -04:00
enum class MaterialType { Object, Skin };
struct RenderMaterial {
MaterialType type = MaterialType::Object;
2023-10-12 23:45:45 -04:00
RenderTexture *diffuseTexture = nullptr;
RenderTexture *normalTexture = nullptr;
RenderTexture *specularTexture = nullptr;
RenderTexture *multiTexture = nullptr;
};
2022-04-12 08:55:38 -04:00
struct RenderModel {
QString name;
2022-08-10 14:52:28 -04:00
physis_MDL model;
2022-04-12 08:55:38 -04:00
std::vector<RenderPart> parts;
std::array<glm::mat4, 128> boneData;
std::vector<RenderMaterial> materials;
uint16_t from_body_id = 101;
uint16_t to_body_id = 101;
VkBuffer boneInfoBuffer = VK_NULL_HANDLE;
VkDeviceMemory boneInfoMemory = VK_NULL_HANDLE;
2022-04-12 08:55:38 -04:00
};
2023-09-26 17:09:12 -04:00
class ImGuiPass;
struct ImGuiContext;
2023-10-12 23:45:45 -04:00
class Renderer
{
public:
Renderer();
void initPipeline();
void initDescriptors();
2022-05-03 12:14:50 -04:00
void initDepth(int width, int height);
bool initSwapchain(VkSurfaceKHR surface, int width, int height);
void resize(VkSurfaceKHR surface, int width, int height);
void destroySwapchain();
2023-10-12 23:45:45 -04:00
RenderModel addModel(const physis_MDL &model, int lod);
2023-12-09 22:35:59 -05:00
void reloadModel(RenderModel &model, uint32_t lod);
2023-10-12 23:45:45 -04:00
RenderTexture addTexture(uint32_t width, uint32_t height, const uint8_t *data, uint32_t data_size);
2023-12-10 08:39:45 -05:00
void render(const std::vector<RenderModel> &models);
VkInstance instance = VK_NULL_HANDLE;
VkPhysicalDevice physicalDevice = VK_NULL_HANDLE;
VkDevice device = VK_NULL_HANDLE;
VkQueue graphicsQueue = VK_NULL_HANDLE, presentQueue = VK_NULL_HANDLE;
VkCommandPool commandPool = VK_NULL_HANDLE;
VkSwapchainKHR swapchain = VK_NULL_HANDLE;
VkExtent2D swapchainExtent;
std::vector<VkImage> swapchainImages;
std::vector<VkImageView> swapchainViews;
std::vector<VkFramebuffer> swapchainFramebuffers;
VkRenderPass renderPass;
std::array<VkCommandBuffer, 3> commandBuffers;
std::array<VkFence, 3> inFlightFences;
std::array<VkSemaphore, 3> imageAvailableSemaphores, renderFinishedSemaphores;
uint32_t currentFrame = 0;
2022-05-03 12:14:50 -04:00
VkImage depthImage;
VkDeviceMemory depthMemory;
VkImageView depthView;
VkImage dummyImage;
VkDeviceMemory dummyMemory;
VkImageView dummyView;
VkSampler dummySampler;
VkDescriptorPool descriptorPool = VK_NULL_HANDLE;
VkDescriptorSetLayout setLayout = VK_NULL_HANDLE;
std::map<uint64_t, VkDescriptorSet> cachedDescriptors;
VkPipeline pipeline;
VkPipelineLayout pipelineLayout;
std::tuple<VkBuffer, VkDeviceMemory> createBuffer(size_t size, VkBufferUsageFlags usageFlags);
uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties);
2023-12-10 08:39:45 -05:00
VkShaderModule createShaderModule(const uint32_t *code, int length);
2023-12-10 08:39:45 -05:00
VkShaderModule loadShaderFromDisk(std::string_view path);
VkCommandBuffer beginSingleTimeCommands();
void endSingleTimeCommands(VkCommandBuffer pT);
2023-10-12 23:45:45 -04:00
void inlineTransitionImageLayout(VkCommandBuffer commandBuffer,
VkImage image,
VkFormat format,
VkImageAspectFlags aspect,
VkImageSubresourceRange range,
VkImageLayout oldLayout,
VkImageLayout newLayout,
VkPipelineStageFlags src_stage_mask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT,
VkPipelineStageFlags dst_stage_mask = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
2023-10-12 23:45:45 -04:00
VkDescriptorSet createDescriptorFor(const RenderModel &model, const RenderMaterial &material);
2023-10-12 23:45:45 -04:00
uint64_t hash(const RenderModel &model, const RenderMaterial &material);
glm::mat4 view;
2023-09-26 17:09:12 -04:00
ImGuiContext *ctx = nullptr;
private:
void createDummyTexture();
2023-09-26 17:09:12 -04:00
ImGuiPass *imGuiPass = nullptr;
};