1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-04-26 13:47:46 +00:00

Load all parts in render model

This commit is contained in:
Joshua Goins 2022-04-12 08:55:38 -04:00
parent 4123dc3f3f
commit a2688ca2dc
2 changed files with 64 additions and 50 deletions

View file

@ -6,13 +6,17 @@
#include "mdlparser.h" #include "mdlparser.h"
struct RenderModel { struct RenderPart {
size_t numIndices; size_t numIndices;
VkBuffer vertexBuffer, indexBuffer; VkBuffer vertexBuffer, indexBuffer;
VkDeviceMemory vertexMemory, indexMemory; VkDeviceMemory vertexMemory, indexMemory;
}; };
struct RenderModel {
std::vector<RenderPart> parts;
};
class Renderer { class Renderer {
public: public:
Renderer(); Renderer();

View file

@ -381,18 +381,21 @@ void Renderer::render(std::vector<RenderModel> models) {
vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
for(auto model : models) { for(auto model : models) {
for(auto part : model.parts) {
VkDeviceSize offsets[] = {0}; VkDeviceSize offsets[] = {0};
vkCmdBindVertexBuffers(commandBuffer, 0, 1, &model.vertexBuffer, offsets); vkCmdBindVertexBuffers(commandBuffer, 0, 1, &part.vertexBuffer, offsets);
vkCmdBindIndexBuffer(commandBuffer, model.indexBuffer, 0, VK_INDEX_TYPE_UINT16); vkCmdBindIndexBuffer(commandBuffer, part.indexBuffer, 0, VK_INDEX_TYPE_UINT16);
glm::mat4 p = glm::perspective(glm::radians(45.0f), swapchainExtent.width / (float)swapchainExtent.height, 0.1f, 100.0f); glm::mat4 p = glm::perspective(glm::radians(45.0f), swapchainExtent.width / (float) swapchainExtent.height,
0.1f, 100.0f);
p[1][1] *= -1; p[1][1] *= -1;
glm::mat4 v = glm::lookAt(glm::vec3(0, 1, -2.5), glm::vec3(0, 1, 0), glm::vec3(0, 1, 0)); glm::mat4 v = glm::lookAt(glm::vec3(0, 1, -2.5), glm::vec3(0, 1, 0), glm::vec3(0, 1, 0));
glm::mat4 mvp = p * v; glm::mat4 mvp = p * v;
vkCmdPushConstants(commandBuffer, pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(glm::mat4), &mvp); vkCmdPushConstants(commandBuffer, pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(glm::mat4), &mvp);
vkCmdDrawIndexed(commandBuffer, model.numIndices, 1, 0, 0, 0); vkCmdDrawIndexed(commandBuffer, part.numIndices, 1, 0, 0, 0);
}
} }
vkCmdEndRenderPass(commandBuffer); vkCmdEndRenderPass(commandBuffer);
@ -487,19 +490,23 @@ uint32_t Renderer::findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags pro
RenderModel Renderer::addModel(const Model& model) { RenderModel Renderer::addModel(const Model& model) {
RenderModel renderModel; RenderModel renderModel;
size_t vertexSize = model.lods[0].parts[0].vertices.size() * sizeof(float) * 3; for(auto part : model.lods[0].parts) {
auto [vertexBuffer, vertexMemory] = createBuffer(vertexSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT); RenderPart renderPart;
size_t indexSize = model.lods[0].parts[0].indices.size() * sizeof(uint16_t); size_t vertexSize = part.vertices.size() * sizeof(float) * 3;
auto [indexBuffer, indexMemory] = createBuffer(indexSize, VK_BUFFER_USAGE_INDEX_BUFFER_BIT); auto[vertexBuffer, vertexMemory] = createBuffer(vertexSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
size_t indexSize = part.indices.size() * sizeof(uint16_t);
auto[indexBuffer, indexMemory] = createBuffer(indexSize, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
// copy vertex data // copy vertex data
{ {
void* mapped_data = nullptr; void *mapped_data = nullptr;
vkMapMemory(device, vertexMemory, 0, vertexSize, 0, &mapped_data); vkMapMemory(device, vertexMemory, 0, vertexSize, 0, &mapped_data);
for(int i = 0; i < model.lods[0].parts[0].vertices.size(); i++) { for (int i = 0; i < part.vertices.size(); i++) {
memcpy((char*)mapped_data + ((sizeof(float) * 3) * i), model.lods[0].parts[0].vertices[i].position.data(), sizeof(float) * 3); memcpy((char *) mapped_data + ((sizeof(float) * 3) * i),
part.vertices[i].position.data(), sizeof(float) * 3);
} }
VkMappedMemoryRange range = {}; VkMappedMemoryRange range = {};
@ -513,10 +520,10 @@ RenderModel Renderer::addModel(const Model& model) {
// copy index data // copy index data
{ {
void* mapped_data = nullptr; void *mapped_data = nullptr;
vkMapMemory(device, indexMemory, 0, indexSize, 0, &mapped_data); vkMapMemory(device, indexMemory, 0, indexSize, 0, &mapped_data);
memcpy(mapped_data, model.lods[0].parts[0].indices.data(), indexSize); memcpy(mapped_data, part.indices.data(), indexSize);
VkMappedMemoryRange range = {}; VkMappedMemoryRange range = {};
range.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; range.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
@ -527,13 +534,16 @@ RenderModel Renderer::addModel(const Model& model) {
vkUnmapMemory(device, indexMemory); vkUnmapMemory(device, indexMemory);
} }
renderModel.numIndices = model.lods[0].parts[0].indices.size(); renderPart.numIndices = part.indices.size();
renderModel.vertexBuffer = vertexBuffer; renderPart.vertexBuffer = vertexBuffer;
renderModel.vertexMemory = vertexMemory; renderPart.vertexMemory = vertexMemory;
renderModel.indexBuffer = indexBuffer; renderPart.indexBuffer = indexBuffer;
renderModel.indexMemory = indexMemory; renderPart.indexMemory = indexMemory;
renderModel.parts.push_back(renderPart);
}
return renderModel; return renderModel;
} }