From 85b7b2cd3113c0c620fcf6254aac20c0d679a6f0 Mon Sep 17 00:00:00 2001 From: kearwood Date: Wed, 6 Jul 2022 23:11:00 -0700 Subject: [PATCH] (continued...) KRMesh::renderSubmesh is now private. Added KRMesh::renderNoMaterials. Replaced renderSubmesh loops outside KRMesh with calls to KRMesh::renderNoMaterials. Added KRMesh::getVertexAttributes. Call sites are now using KRMesh::getVertexAttributes and KRMesh::getModelFormat to configure the pipeline. --- kraken/KRAmbientZone.cpp | 37 +++++++++++++++++++------------------ kraken/KRAudioSource.cpp | 18 +++++++++--------- kraken/KRBone.cpp | 36 ++++++++++++++++++------------------ kraken/KRCamera.cpp | 34 +++++++++++++++++++--------------- kraken/KRCollider.cpp | 6 +++--- kraken/KRMesh.cpp | 15 +++++++++++++++ 6 files changed, 83 insertions(+), 63 deletions(-) diff --git a/kraken/KRAmbientZone.cpp b/kraken/KRAmbientZone.cpp index 334e2e6..fa5cc44 100755 --- a/kraken/KRAmbientZone.cpp +++ b/kraken/KRAmbientZone.cpp @@ -127,27 +127,28 @@ void KRAmbientZone::render(RenderInfo& ri) bool bVisualize = ri.camera->settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_SIREN_AMBIENT_ZONES; if(ri.renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT && bVisualize) { - Matrix4 sphereModelMatrix = getModelMatrix(); + std::vector sphereModels = getContext().getMeshManager()->getModel("__sphere"); + if (sphereModels.size()) { - PipelineInfo info{}; - std::string shader_name("visualize_overlay"); - info.shader_name = &shader_name; - info.pCamera = ri.camera; - info.point_lights = &ri.point_lights; - info.directional_lights = &ri.directional_lights; - info.spot_lights = &ri.spot_lights; - info.renderPass = ri.renderPass; - info.rasterMode = PipelineInfo::RasterMode::kAdditive; + Matrix4 sphereModelMatrix = getModelMatrix(); + + PipelineInfo info{}; + std::string shader_name("visualize_overlay"); + info.shader_name = &shader_name; + info.pCamera = ri.camera; + info.point_lights = &ri.point_lights; + info.directional_lights = &ri.directional_lights; + info.spot_lights = &ri.spot_lights; + info.renderPass = ri.renderPass; + info.rasterMode = PipelineInfo::RasterMode::kAdditive; + info.modelFormat = sphereModels[0]->getModelFormat(); + info.vertexAttributes = sphereModels[0]->getVertexAttributes(); - KRPipeline *pPipeline = getContext().getPipelineManager()->getPipeline(*ri.surface, info); - pPipeline->bind(*ri.camera, ri.viewport, sphereModelMatrix, &ri.point_lights, &ri.directional_lights, &ri.spot_lights, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero()); + KRPipeline *pPipeline = getContext().getPipelineManager()->getPipeline(*ri.surface, info); + pPipeline->bind(*ri.camera, ri.viewport, sphereModelMatrix, &ri.point_lights, &ri.directional_lights, &ri.spot_lights, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero()); - std::vector sphereModels = getContext().getMeshManager()->getModel("__sphere"); - if(sphereModels.size()) { - for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) { - sphereModels[0]->renderSubmesh(ri.commandBuffer, i, ri.renderPass, getName(), "visualize_overlay", 1.0f); - } - } + sphereModels[0]->renderNoMaterials(ri.commandBuffer, ri.renderPass, getName(), "visualize_overlay", 1.0f); + } // sphereModels.size() } } diff --git a/kraken/KRAudioSource.cpp b/kraken/KRAudioSource.cpp index ef10f40..6d26f41 100755 --- a/kraken/KRAudioSource.cpp +++ b/kraken/KRAudioSource.cpp @@ -194,6 +194,8 @@ void KRAudioSource::render(RenderInfo& ri) bool bVisualize = false; if(ri.renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT && bVisualize) { + std::vector sphereModels = getContext().getMeshManager()->getModel("__sphere"); + if (sphereModels.size()) { Matrix4 sphereModelMatrix = getModelMatrix(); PipelineInfo info{}; @@ -205,16 +207,14 @@ void KRAudioSource::render(RenderInfo& ri) info.spot_lights = &ri.spot_lights; info.renderPass = ri.renderPass; info.rasterMode = PipelineInfo::RasterMode::kAdditive; - - KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); + info.modelFormat = sphereModels[0]->getModelFormat(); + info.vertexAttributes = sphereModels[0]->getVertexAttributes(); + + KRPipeline* pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); pShader->bind(*ri.camera, ri.viewport, sphereModelMatrix, &ri.point_lights, &ri.directional_lights, &ri.spot_lights, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero()); - - std::vector sphereModels = getContext().getMeshManager()->getModel("__sphere"); - if(sphereModels.size()) { - for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) { - sphereModels[0]->renderSubmesh(ri.commandBuffer, i, ri.renderPass, getName(), "visualize_overlay", 1.0f); - } - } + + sphereModels[0]->renderNoMaterials(ri.commandBuffer, ri.renderPass, getName(), "visualize_overlay", 1.0f); + } // sphereModels.size() } } diff --git a/kraken/KRBone.cpp b/kraken/KRBone.cpp index 877c7d8..2c4e021 100755 --- a/kraken/KRBone.cpp +++ b/kraken/KRBone.cpp @@ -78,27 +78,27 @@ void KRBone::render(RenderInfo& ri) bool bVisualize = ri.camera->settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_BONES; if(ri.renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT && bVisualize) { - Matrix4 sphereModelMatrix = getModelMatrix(); + std::vector sphereModels = getContext().getMeshManager()->getModel("__sphere"); + if (sphereModels.size()) { + Matrix4 sphereModelMatrix = getModelMatrix(); - PipelineInfo info{}; - std::string shader_name("visualize_overlay"); - info.shader_name = &shader_name; - info.pCamera = ri.camera; - info.point_lights = &ri.point_lights; - info.directional_lights = &ri.directional_lights; - info.spot_lights = &ri.spot_lights; - info.renderPass = ri.renderPass; - info.rasterMode = PipelineInfo::RasterMode::kAdditiveNoTest; + PipelineInfo info{}; + std::string shader_name("visualize_overlay"); + info.shader_name = &shader_name; + info.pCamera = ri.camera; + info.point_lights = &ri.point_lights; + info.directional_lights = &ri.directional_lights; + info.spot_lights = &ri.spot_lights; + info.renderPass = ri.renderPass; + info.rasterMode = PipelineInfo::RasterMode::kAdditiveNoTest; + info.modelFormat = sphereModels[0]->getModelFormat(); + info.vertexAttributes = sphereModels[0]->getVertexAttributes(); - KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); - pShader->bind(*ri.camera, ri.viewport, sphereModelMatrix, &ri.point_lights, &ri.directional_lights, &ri.spot_lights, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero()); + KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); + pShader->bind(*ri.camera, ri.viewport, sphereModelMatrix, &ri.point_lights, &ri.directional_lights, &ri.spot_lights, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero()); - std::vector sphereModels = getContext().getMeshManager()->getModel("__sphere"); - if(sphereModels.size()) { - for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) { - sphereModels[0]->renderSubmesh(ri.commandBuffer, i, ri.renderPass, getName(), "visualize_overlay", 1.0f); - } - } + sphereModels[0]->renderNoMaterials(ri.commandBuffer, ri.renderPass, getName(), "visualize_overlay", 1.0f); + } // sphereModels.size() } } diff --git a/kraken/KRCamera.cpp b/kraken/KRCamera.cpp index 0412ee1..72e7fac 100755 --- a/kraken/KRCamera.cpp +++ b/kraken/KRCamera.cpp @@ -338,22 +338,26 @@ void KRCamera::renderFrame(VkCommandBuffer& commandBuffer, KRSurface& compositeS GL_PUSH_GROUP_MARKER("Debug Overlays"); - if(settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_OCTREE) { + if(settings.debug_display == KRRenderSettings::KRENGINE_DEBUG_DISPLAY_OCTREE) { + KRMeshManager::KRVBOData& vertices = getContext().getMeshManager()->KRENGINE_VBO_DATA_3D_CUBE_VERTICES; + PipelineInfo info{}; std::string shader_name("visualize_overlay"); info.shader_name = &shader_name; info.pCamera = this; info.renderPass = KRNode::RENDER_PASS_FORWARD_TRANSPARENT; info.rasterMode = PipelineInfo::RasterMode::kAdditive; - KRPipeline *pVisShader = getContext().getPipelineManager()->getPipeline(compositeSurface, info); + info.vertexAttributes = vertices.getVertexAttributes(); + info.modelFormat = KRMesh::model_format_t::KRENGINE_MODEL_FORMAT_STRIP; + KRPipeline *pVisShader = getContext().getPipelineManager()->getPipeline(compositeSurface, info); - m_pContext->getMeshManager()->bindVBO(commandBuffer, &getContext().getMeshManager()->KRENGINE_VBO_DATA_3D_CUBE_VERTICES, 1.0f); + m_pContext->getMeshManager()->bindVBO(commandBuffer, &vertices, 1.0f); for(unordered_map::iterator itr=m_viewport.getVisibleBounds().begin(); itr != m_viewport.getVisibleBounds().end(); itr++) { Matrix4 matModel = Matrix4(); matModel.scale((*itr).first.size() * 0.5f); matModel.translate((*itr).first.center()); pVisShader->bind(*this, m_viewport, matModel, nullptr, nullptr, nullptr, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, Vector3::Zero(), 0.0f, Vector4::Zero()); - GLDEBUG(glDrawArrays(GL_TRIANGLE_STRIP, 0, 14)); + vkCmdDraw(commandBuffer, 14, 1, 0, 0); } } GL_POP_GROUP_MARKER; @@ -557,19 +561,20 @@ void KRCamera::renderPost(VkCommandBuffer& commandBuffer, KRSurface& surface) GLDEBUG(glViewport(0, 0, (GLsizei)m_viewport.getSize().x, (GLsizei)m_viewport.getSize().y)); + KRMeshManager::KRVBOData& vertices = getContext().getMeshManager()->KRENGINE_VBO_DATA_2D_SQUARE_VERTICES; + PipelineInfo info{}; std::string shader_name("PostShader"); info.shader_name = &shader_name; info.pCamera = this; info.renderPass = KRNode::RENDER_PASS_FORWARD_TRANSPARENT; info.rasterMode = PipelineInfo::RasterMode::kOpaqueNoTest; + info.modelFormat = KRMesh::model_format_t::KRENGINE_MODEL_FORMAT_STRIP; + info.vertexAttributes = vertices.getVertexAttributes(); KRPipeline *postShader = m_pContext->getPipelineManager()->getPipeline(surface, info); - Vector3 rim_color; - - - postShader->bind(*this, m_viewport, Matrix4(), nullptr, nullptr, nullptr, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, rim_color, 0.0f, m_fade_color); + postShader->bind(*this, m_viewport, Matrix4(), nullptr, nullptr, nullptr, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, Vector3::Zero(), 0.0f, m_fade_color); m_pContext->getTextureManager()->selectTexture(GL_TEXTURE_2D, 0, compositeDepthTexture); m_pContext->getTextureManager()->selectTexture(GL_TEXTURE_2D, 1, compositeColorTexture); @@ -579,13 +584,10 @@ void KRCamera::renderPost(VkCommandBuffer& commandBuffer, KRSurface& surface) } // Update attribute values. - m_pContext->getMeshManager()->bindVBO(commandBuffer, &getContext().getMeshManager()->KRENGINE_VBO_DATA_2D_SQUARE_VERTICES, 1.0f); + m_pContext->getMeshManager()->bindVBO(commandBuffer, &vertices, 1.0f); - GLDEBUG(glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)); - - m_pContext->getTextureManager()->selectTexture(GL_TEXTURE_2D, 0, 0); - m_pContext->getTextureManager()->selectTexture(GL_TEXTURE_2D, 1, 0); - + vkCmdDraw(commandBuffer, 4, 1, 0, 0); + // if(bShowShadowBuffer) { // KRPipeline *blitShader = m_pContext->getPipelineManager()->getShader("simple_blit", this, false, false, false, 0, false, false, false, false, false, false, false, false, false, false, false, false, false, KRNode::RENDER_PASS_FORWARD_TRANSPARENT); @@ -744,6 +746,8 @@ void KRCamera::renderPost(VkCommandBuffer& commandBuffer, KRSurface& surface) info.renderPass = KRNode::RENDER_PASS_FORWARD_TRANSPARENT; info.rasterMode = PipelineInfo::RasterMode::kAlphaBlendNoTest; info.cullMode = PipelineInfo::CullMode::kCullNone; + info.vertexAttributes = (1 << KRMesh::KRENGINE_ATTRIB_VERTEX) | (1 << KRMesh::KRENGINE_ATTRIB_TEXUVA); + info.modelFormat = KRMesh::model_format_t::KRENGINE_MODEL_FORMAT_TRIANGLES; KRPipeline *fontShader = m_pContext->getPipelineManager()->getPipeline(surface, info); fontShader->bind(*this, m_viewport, Matrix4(), nullptr, nullptr, nullptr, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, Vector3::Zero(), 0.0f, Vector4::Zero()); @@ -757,7 +761,7 @@ void KRCamera::renderPost(VkCommandBuffer& commandBuffer, KRSurface& surface) #endif ); - GLDEBUG(glDrawArrays(GL_TRIANGLES, 0, vertex_count)); + vkCmdDraw(commandBuffer, vertex_count, 1, 0, 0); m_debug_text_vertices.unlock(); diff --git a/kraken/KRCollider.cpp b/kraken/KRCollider.cpp index 059240c..6feb2b9 100755 --- a/kraken/KRCollider.cpp +++ b/kraken/KRCollider.cpp @@ -213,14 +213,14 @@ void KRCollider::render(RenderInfo& ri) info.spot_lights = &ri.spot_lights; info.renderPass = ri.renderPass; info.rasterMode = PipelineInfo::RasterMode::kAdditive; + info.modelFormat = m_models[0]->getModelFormat(); + info.vertexAttributes = m_models[0]->getVertexAttributes(); KRPipeline *pShader = getContext().getPipelineManager()->getPipeline(*ri.surface, info); pShader->bind(*ri.camera, ri.viewport, getModelMatrix(), &ri.point_lights, &ri.directional_lights, &ri.spot_lights, ri.renderPass, Vector3::Zero(), 0.0f, Vector4::Zero()); - for(int i=0; i < m_models[0]->getSubmeshCount(); i++) { - m_models[0]->renderSubmesh(ri.commandBuffer, i, ri.renderPass, getName(), "visualize_overlay", 1.0f); - } + m_models[0]->renderNoMaterials(ri.commandBuffer, ri.renderPass, getName(), "visualize_overlay", 1.0f); GL_POP_GROUP_MARKER; } diff --git a/kraken/KRMesh.cpp b/kraken/KRMesh.cpp index 833996c..446cf29 100755 --- a/kraken/KRMesh.cpp +++ b/kraken/KRMesh.cpp @@ -427,6 +427,14 @@ void KRMesh::createDataBlocks(KRMeshManager::KRVBOData::vbo_type t) } } +void KRMesh::renderNoMaterials(VkCommandBuffer& commandBuffer, KRNode::RenderPass renderPass, const std::string& object_name, const std::string& material_name, float lodCoverage) +{ + int submesh_count = getSubmeshCount(); + for (int i = 0; i < submesh_count; i++) { + renderSubmesh(commandBuffer, i, renderPass, object_name, material_name, lodCoverage); + } +} + void KRMesh::renderSubmesh(VkCommandBuffer& commandBuffer, int iSubmesh, KRNode::RenderPass renderPass, const std::string &object_name, const std::string &material_name, float lodCoverage) { getSubmeshes(); @@ -859,6 +867,13 @@ int KRMesh::getVertexCount(int submesh) const return getSubmesh(submesh)->vertex_count; } +__uint32_t KRMesh::getVertexAttributes() const +{ + pack_header* header = getHeader(); + __uint32_t attributes = header->vertex_attrib_flags; + return attributes; +} + Vector3 KRMesh::getVertexPosition(int index) const { if(has_vertex_attribute(KRENGINE_ATTRIB_VERTEX_SHORT)) {