1
Fork 0
mirror of https://github.com/redstrate/Novus.git synced 2025-04-26 05:37: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"
struct RenderModel {
struct RenderPart {
size_t numIndices;
VkBuffer vertexBuffer, indexBuffer;
VkDeviceMemory vertexMemory, indexMemory;
};
struct RenderModel {
std::vector<RenderPart> parts;
};
class Renderer {
public:
Renderer();

View file

@ -381,18 +381,21 @@ void Renderer::render(std::vector<RenderModel> models) {
vkCmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
for(auto model : models) {
for(auto part : model.parts) {
VkDeviceSize offsets[] = {0};
vkCmdBindVertexBuffers(commandBuffer, 0, 1, &model.vertexBuffer, offsets);
vkCmdBindIndexBuffer(commandBuffer, model.indexBuffer, 0, VK_INDEX_TYPE_UINT16);
vkCmdBindVertexBuffers(commandBuffer, 0, 1, &part.vertexBuffer, offsets);
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;
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;
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);
@ -487,19 +490,23 @@ uint32_t Renderer::findMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags pro
RenderModel Renderer::addModel(const Model& model) {
RenderModel renderModel;
size_t vertexSize = model.lods[0].parts[0].vertices.size() * sizeof(float) * 3;
auto [vertexBuffer, vertexMemory] = createBuffer(vertexSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
for(auto part : model.lods[0].parts) {
RenderPart renderPart;
size_t indexSize = model.lods[0].parts[0].indices.size() * sizeof(uint16_t);
auto [indexBuffer, indexMemory] = createBuffer(indexSize, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
size_t vertexSize = part.vertices.size() * sizeof(float) * 3;
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
{
void* mapped_data = nullptr;
void *mapped_data = nullptr;
vkMapMemory(device, vertexMemory, 0, vertexSize, 0, &mapped_data);
for(int i = 0; i < model.lods[0].parts[0].vertices.size(); i++) {
memcpy((char*)mapped_data + ((sizeof(float) * 3) * i), model.lods[0].parts[0].vertices[i].position.data(), sizeof(float) * 3);
for (int i = 0; i < part.vertices.size(); i++) {
memcpy((char *) mapped_data + ((sizeof(float) * 3) * i),
part.vertices[i].position.data(), sizeof(float) * 3);
}
VkMappedMemoryRange range = {};
@ -513,10 +520,10 @@ RenderModel Renderer::addModel(const Model& model) {
// copy index data
{
void* mapped_data = nullptr;
void *mapped_data = nullptr;
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 = {};
range.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
@ -527,13 +534,16 @@ RenderModel Renderer::addModel(const Model& model) {
vkUnmapMemory(device, indexMemory);
}
renderModel.numIndices = model.lods[0].parts[0].indices.size();
renderPart.numIndices = part.indices.size();
renderModel.vertexBuffer = vertexBuffer;
renderModel.vertexMemory = vertexMemory;
renderPart.vertexBuffer = vertexBuffer;
renderPart.vertexMemory = vertexMemory;
renderModel.indexBuffer = indexBuffer;
renderModel.indexMemory = indexMemory;
renderPart.indexBuffer = indexBuffer;
renderPart.indexMemory = indexMemory;
renderModel.parts.push_back(renderPart);
}
return renderModel;
}