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:
parent
4123dc3f3f
commit
a2688ca2dc
2 changed files with 64 additions and 50 deletions
|
@ -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();
|
||||||
|
|
|
@ -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,10 +490,13 @@ 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) {
|
||||||
|
RenderPart renderPart;
|
||||||
|
|
||||||
|
size_t vertexSize = part.vertices.size() * sizeof(float) * 3;
|
||||||
auto[vertexBuffer, vertexMemory] = createBuffer(vertexSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
|
auto[vertexBuffer, vertexMemory] = createBuffer(vertexSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
|
||||||
|
|
||||||
size_t indexSize = model.lods[0].parts[0].indices.size() * sizeof(uint16_t);
|
size_t indexSize = part.indices.size() * sizeof(uint16_t);
|
||||||
auto[indexBuffer, indexMemory] = createBuffer(indexSize, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
|
auto[indexBuffer, indexMemory] = createBuffer(indexSize, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
|
||||||
|
|
||||||
// copy vertex data
|
// copy vertex data
|
||||||
|
@ -498,8 +504,9 @@ RenderModel Renderer::addModel(const Model& model) {
|
||||||
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 = {};
|
||||||
|
@ -516,7 +523,7 @@ RenderModel Renderer::addModel(const Model& model) {
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue