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

116 lines
3.6 KiB
C++
Raw Normal View History

#pragma once
#include <vulkan/vulkan.h>
#include <vector>
#include <array>
#include <glm/ext/matrix_float4x4.hpp>
#include <map>
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;
};
enum class MaterialType {
Object,
Skin
};
struct RenderMaterial {
MaterialType type = MaterialType::Object;
RenderTexture* diffuseTexture = nullptr;
RenderTexture* normalTexture = nullptr;
RenderTexture* specularTexture = nullptr;
RenderTexture* multiTexture = nullptr;
};
2022-04-12 08:55:38 -04:00
struct RenderModel {
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;
VkBuffer boneInfoBuffer = VK_NULL_HANDLE;
VkDeviceMemory boneInfoMemory = VK_NULL_HANDLE;
2022-04-12 08:55:38 -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);
2022-08-10 14:52:28 -04:00
RenderModel addModel(const physis_MDL& model, int lod);
RenderTexture addTexture(uint32_t width, uint32_t height, const uint8_t* data, uint32_t data_size);
void render(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;
VkDescriptorPool descriptorPool = VK_NULL_HANDLE;
VkDescriptorSetLayout setLayout = VK_NULL_HANDLE;
std::map<int, VkDescriptorSet> cachedDescriptors;
VkPipeline pipeline;
VkPipelineLayout pipelineLayout;
std::tuple<VkBuffer, VkDeviceMemory> createBuffer(size_t size, VkBufferUsageFlags usageFlags);
uint32_t findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties);
VkShaderModule createShaderModule(const uint32_t *code, const int length);
VkShaderModule loadShaderFromDisk(const std::string_view path);
VkCommandBuffer beginSingleTimeCommands();
void endSingleTimeCommands(VkCommandBuffer pT);
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);
VkDescriptorSet createDescriptorFor(const RenderModel& model, const RenderMaterial& material);
int hash(const RenderModel& model, const RenderMaterial& material);
};