From a23b39a178e9b121d071c2bb4184a0a92fd27f34 Mon Sep 17 00:00:00 2001 From: Kearwood Gilbert Date: Thu, 21 Mar 2013 19:58:35 -0700 Subject: [PATCH] On-screen Profiler / Debug visualizations in progress Fixed a bug that caused framerate to drop drastically by executing an additional render pass. --- KREngine/kraken/KRAmbientZone.cpp | 2 +- KREngine/kraken/KRAudioSource.cpp | 2 +- KREngine/kraken/KRBone.cpp | 2 +- KREngine/kraken/KRCamera.cpp | 67 +++++++++++++++++++++++++---- KREngine/kraken/KRContext.cpp | 2 + KREngine/kraken/KRContext.h | 2 +- KREngine/kraken/KREngine.mm | 2 +- KREngine/kraken/KRLight.cpp | 2 +- KREngine/kraken/KRMaterial.cpp | 10 +++-- KREngine/kraken/KRMaterial.h | 4 +- KREngine/kraken/KRMesh.cpp | 16 ++++--- KREngine/kraken/KRMesh.h | 4 +- KREngine/kraken/KRMeshManager.cpp | 32 ++++++++++++++ KREngine/kraken/KRMeshManager.h | 16 +++++++ KREngine/kraken/KRModel.cpp | 4 +- KREngine/kraken/KRNode.cpp | 2 +- KREngine/kraken/KRNode.h | 2 +- KREngine/kraken/KRReverbZone.cpp | 2 +- KREngine/kraken/KRShader.cpp | 2 +- KREngine/kraken/KRShaderManager.cpp | 2 +- KREngine/kraken/KRTexture.cpp | 4 ++ KREngine/kraken/KRTexture.h | 3 +- KREngine/kraken/KRTexture2D.cpp | 3 -- KREngine/kraken/KRTexture2D.h | 2 - 24 files changed, 147 insertions(+), 42 deletions(-) diff --git a/KREngine/kraken/KRAmbientZone.cpp b/KREngine/kraken/KRAmbientZone.cpp index 4909cc2..8f9ce5e 100644 --- a/KREngine/kraken/KRAmbientZone.cpp +++ b/KREngine/kraken/KRAmbientZone.cpp @@ -114,7 +114,7 @@ void KRAmbientZone::render(KRCamera *pCamera, std::vector &lights, co std::vector sphereModels = getContext().getModelManager()->getModel("__sphere"); if(sphereModels.size()) { for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) { - sphereModels[0]->renderSubmesh(i); + sphereModels[0]->renderSubmesh(i, renderPass, getName(), "visualize_overlay"); } } diff --git a/KREngine/kraken/KRAudioSource.cpp b/KREngine/kraken/KRAudioSource.cpp index d6ec91e..8a18dd3 100644 --- a/KREngine/kraken/KRAudioSource.cpp +++ b/KREngine/kraken/KRAudioSource.cpp @@ -225,7 +225,7 @@ void KRAudioSource::render(KRCamera *pCamera, std::vector &lights, co std::vector sphereModels = getContext().getModelManager()->getModel("__sphere"); if(sphereModels.size()) { for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) { - sphereModels[0]->renderSubmesh(i); + sphereModels[0]->renderSubmesh(i, renderPass, getName(), "visualize_overlay"); } } diff --git a/KREngine/kraken/KRBone.cpp b/KREngine/kraken/KRBone.cpp index fda3ccd..67bf273 100644 --- a/KREngine/kraken/KRBone.cpp +++ b/KREngine/kraken/KRBone.cpp @@ -64,7 +64,7 @@ void KRBone::render(KRCamera *pCamera, std::vector &lights, const KRV std::vector sphereModels = getContext().getModelManager()->getModel("__sphere"); if(sphereModels.size()) { for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) { - sphereModels[0]->renderSubmesh(i); + sphereModels[0]->renderSubmesh(i, renderPass, getName(), "visualize_overlay"); } } diff --git a/KREngine/kraken/KRCamera.cpp b/KREngine/kraken/KRCamera.cpp index 2a57a95..45c19fd 100644 --- a/KREngine/kraken/KRCamera.cpp +++ b/KREngine/kraken/KRCamera.cpp @@ -179,7 +179,9 @@ void KRCamera::renderFrame(float deltaTime, GLint renderBufferWidth, GLint rende GLDEBUG(glBindTexture(GL_TEXTURE_2D, 0)); } else { // ----====---- Generate Shadowmaps for Lights ----====---- - scene.render(this, m_viewport.getVisibleBounds(), m_viewport, KRNode::RENDER_PASS_GENERATE_SHADOWMAPS, true); + if(settings.m_cShadowBuffers > 0) { + scene.render(this, m_viewport.getVisibleBounds(), m_viewport, KRNode::RENDER_PASS_GENERATE_SHADOWMAPS, true); + } // ----====---- Opaque Geometry, Forward Rendering ----====---- // Set render target @@ -831,11 +833,11 @@ std::string KRCamera::getDebugText() stream << "Textures\t" << texture_count_active << "\t" << texture_count << "\t" << (texture_mem_active / 1024) << " Kb\t" << (texture_mem_used / 1024) << " Kb\t" << (texture_mem_throughput / 1024) << " Kb / frame\n"; stream << "VBO's\t" << vbo_count_active << "\t" << vbo_count_active + vbo_count_pooled << "\t" << (vbo_mem_active / 1024) <<" Kb\t" << (vbo_mem_used / 1024) << " Kb\t" << (vbo_mem_throughput / 1024) << " Kb / frame\n"; - stream << "\nTOTAL\t\t\t" << (total_mem_active / 1024) << " Kb\t" << (total_mem_used / 1024) << " Kb\t" << (total_mem_throughput / 1024) << " Kb / frame"; + stream << "\nGPU Total\t\t\t" << (total_mem_active / 1024) << " Kb\t" << (total_mem_used / 1024) << " Kb\t" << (total_mem_throughput / 1024) << " Kb / frame"; } break; - case 2: // ----====---- Show active textures ----====---- + case 2: // ----====---- List Active Textures ----====---- { bool first = true; int texture_count = 0; @@ -850,21 +852,70 @@ std::string KRCamera::getDebugText() stream << texture->getName(); stream << "\t"; stream << texture->getMemSize() / 1024; - stream << "kB"; + stream << " kB"; stream << "\t"; stream << texture->getMaxMipMap(); - if(texture->getCurrentLodMaxDim() != texture->getMaxMipMap()) { - stream << "px => "; + if(texture->hasMipmaps() && texture->getCurrentLodMaxDim() != texture->getMaxMipMap()) { + stream << " px => "; stream << texture->getCurrentLodMaxDim(); } - stream << "px"; + stream << " px"; texture_count++; } stream << "\n\nTOTAL: "; stream << texture_count; stream << " textures\t"; - stream << (m_pContext->getTextureManager()->getMemActive() / 1024) << " Kb\t" << (m_pContext->getTextureManager()->getMemoryTransferedThisFrame() / 1024) << " Kb / Frame"; + stream << (m_pContext->getTextureManager()->getMemActive() / 1024) << " Kb"; + } + break; + + case 3: // ----====---- List Draw Calls ----====---- + { + std::vector draw_calls = m_pContext->getModelManager()->getDrawCalls(); + + long draw_call_count = 0; + long vertex_count = 0; + stream << "\tVerts\tPass\tObject\tMaterial"; + for(std::vector::iterator itr = draw_calls.begin(); itr != draw_calls.end(); itr++) { + draw_call_count++; + stream << "\n" << draw_call_count << "\t" << (*itr).vertex_count << "\t"; + switch((*itr).pass) { + case KRNode::RENDER_PASS_FORWARD_OPAQUE: + stream << "opaq"; + break; + case KRNode::RENDER_PASS_DEFERRED_GBUFFER: + stream << "d gb"; + break; + case KRNode::RENDER_PASS_DEFERRED_LIGHTS: + stream << "d light"; + break; + case KRNode::RENDER_PASS_DEFERRED_OPAQUE: + stream << "d opaq"; + break; + case KRNode::RENDER_PASS_FORWARD_TRANSPARENT: + stream << "trans"; + break; + case KRNode::RENDER_PASS_PARTICLE_OCCLUSION: + stream << "p occl"; + break; + case KRNode::RENDER_PASS_ADDITIVE_PARTICLES: + stream << "a part"; + break; + case KRNode::RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE: + stream << "vol add"; + break; + case KRNode::RENDER_PASS_GENERATE_SHADOWMAPS: + stream << "g shadow"; + break; + case KRNode::RENDER_PASS_SHADOWMAP: + stream << "shadow"; + break; + } + stream << "\t" << (*itr).object_name << "\t" << (*itr).material_name; + vertex_count += (*itr).vertex_count; + } + stream << "\n\n\t\tTOTAL:\t" << draw_call_count << " draw calls\t" << vertex_count << " vertices"; } break; } diff --git a/KREngine/kraken/KRContext.cpp b/KREngine/kraken/KRContext.cpp index 3820fda..1d1cc7d 100644 --- a/KREngine/kraken/KRContext.cpp +++ b/KREngine/kraken/KRContext.cpp @@ -202,6 +202,7 @@ void KRContext::endFrame(float deltaTime) { m_pTextureManager->endFrame(deltaTime); m_pAnimationManager->endFrame(deltaTime); + m_pModelManager->endFrame(deltaTime); rotateBuffers(true); m_current_frame++; m_absolute_time += deltaTime; @@ -216,3 +217,4 @@ float KRContext::getAbsoluteTime() const { return m_absolute_time; } + diff --git a/KREngine/kraken/KRContext.h b/KREngine/kraken/KRContext.h index ef1ea02..1c45667 100644 --- a/KREngine/kraken/KRContext.h +++ b/KREngine/kraken/KRContext.h @@ -69,6 +69,7 @@ public: long getCurrentFrame() const; float getAbsoluteTime() const; + private: KRBundleManager *m_pBundleManager; KRSceneManager *m_pSceneManager; @@ -87,7 +88,6 @@ private: long m_current_frame; float m_absolute_time; - mach_timebase_info_data_t m_timebase_info; }; diff --git a/KREngine/kraken/KREngine.mm b/KREngine/kraken/KREngine.mm index c7214e4..12e1660 100644 --- a/KREngine/kraken/KREngine.mm +++ b/KREngine/kraken/KREngine.mm @@ -622,7 +622,7 @@ void kraken::set_parameter(const std::string ¶meter_name, float parameter_va 1.0f, 10.0f, 2.0f, 1.0f, 1.0f, 1.0f, 5.0f, 1.0f, 0.5f, 1.0f, 2.0f, 2.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 10.0f, 1000.0f, 1.0f, 5.0f, 1000.0f, 1.0f, 5.0f, 3.0f, - 1000.0f, 1000.0f, 0.01f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 2.0f + 1000.0f, 1000.0f, 0.01f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 3.0f }; return maxValues[i]; diff --git a/KREngine/kraken/KRLight.cpp b/KREngine/kraken/KRLight.cpp index 95d2627..6f5faa7 100644 --- a/KREngine/kraken/KRLight.cpp +++ b/KREngine/kraken/KRLight.cpp @@ -268,7 +268,7 @@ void KRLight::render(KRCamera *pCamera, std::vector &lights, const KR std::vector sphereModels = getContext().getModelManager()->getModel("__sphere"); if(sphereModels.size()) { for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) { - sphereModels[0]->renderSubmesh(i); + sphereModels[0]->renderSubmesh(i, renderPass, getName(), "occlusion_test"); } } diff --git a/KREngine/kraken/KRMaterial.cpp b/KREngine/kraken/KRMaterial.cpp index 8ed5721..3ebe0fd 100644 --- a/KREngine/kraken/KRMaterial.cpp +++ b/KREngine/kraken/KRMaterial.cpp @@ -37,7 +37,7 @@ #include "KRcontext.h" KRMaterial::KRMaterial(KRContext &context, const char *szName) : KRResource(context, szName) { - strcpy(m_szName, szName); + m_name = szName; m_pAmbientMap = NULL; m_pDiffuseMap = NULL; m_pSpecularMap = NULL; @@ -80,7 +80,7 @@ bool KRMaterial::save(KRDataBlock &data) { stream.precision(std::numeric_limits::digits10); stream.setf(std::ios::fixed,std::ios::floatfield); - stream << "newmtl " << m_szName; + stream << "newmtl " << m_name; stream << "\nka " << m_ambientColor.x << " " << m_ambientColor.y << " " << m_ambientColor.z; stream << "\nkd " << m_diffuseColor.x << " " << m_diffuseColor.y << " " << m_diffuseColor.z; stream << "\nks " << m_specularColor.x << " " << m_specularColor.y << " " << m_specularColor.z; @@ -406,6 +406,8 @@ bool KRMaterial::bind(KRMaterial **prevBoundMaterial, char *szPrevShaderKey, KRC return true; } -char *KRMaterial::getName() { - return m_szName; +const std::string &KRMaterial::getName() const +{ + return m_name; } + diff --git a/KREngine/kraken/KRMaterial.h b/KREngine/kraken/KRMaterial.h index 4d6d3fc..6a00fb9 100644 --- a/KREngine/kraken/KRMaterial.h +++ b/KREngine/kraken/KRMaterial.h @@ -81,12 +81,12 @@ public: bool isTransparent(); - char *getName(); + const std::string &getName() const; bool bind(KRMaterial **prevBoundMaterial, char *szPrevShaderKey, KRCamera *pCamera, std::vector &lights, const std::vector &bones, const KRViewport &viewport, const KRMat4 &matModel, KRTexture *pLightMap, KRNode::RenderPass renderPass); private: - char m_szName[256]; + std::string m_name; KRTexture *m_pAmbientMap; // mtl map_Ka value KRTexture *m_pDiffuseMap; // mtl map_Kd value diff --git a/KREngine/kraken/KRMesh.cpp b/KREngine/kraken/KRMesh.cpp index 7194a45..ff9736e 100644 --- a/KREngine/kraken/KRMesh.cpp +++ b/KREngine/kraken/KRMesh.cpp @@ -131,7 +131,7 @@ void KRMesh::loadPack(KRDataBlock *data) { m_maxPoint = KRVector3(pHeader->maxx, pHeader->maxy, pHeader->maxz); } -void KRMesh::render(KRCamera *pCamera, std::vector &lights, const KRViewport &viewport, const KRMat4 &matModel, KRTexture *pLightMap, KRNode::RenderPass renderPass, const std::vector &bones) { +void KRMesh::render(const std::string &object_name, KRCamera *pCamera, std::vector &lights, const KRViewport &viewport, const KRMat4 &matModel, KRTexture *pLightMap, KRNode::RenderPass renderPass, const std::vector &bones) { //fprintf(stderr, "Rendering model: %s\n", m_name.c_str()); if(renderPass != KRNode::RENDER_PASS_ADDITIVE_PARTICLES && renderPass != KRNode::RENDER_PASS_PARTICLE_OCCLUSION && renderPass != KRNode::RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE) { @@ -171,7 +171,7 @@ void KRMesh::render(KRCamera *pCamera, std::vector &lights, const KRV if(!pMaterial->isTransparent()) { // Exclude transparent and semi-transparent meshes from shadow maps - renderSubmesh(iSubmesh); + renderSubmesh(iSubmesh, renderPass, object_name, pMaterial->getName()); } } @@ -189,19 +189,19 @@ void KRMesh::render(KRCamera *pCamera, std::vector &lights, const KRV switch(pMaterial->getAlphaMode()) { case KRMaterial::KRMATERIAL_ALPHA_MODE_OPAQUE: // Non-transparent materials case KRMaterial::KRMATERIAL_ALPHA_MODE_TEST: // Alpha in diffuse texture is interpreted as punch-through when < 0.5 - renderSubmesh(iSubmesh); + renderSubmesh(iSubmesh, renderPass, object_name, pMaterial->getName()); break; case KRMaterial::KRMATERIAL_ALPHA_MODE_BLENDONESIDE: // Blended alpha with backface culling - renderSubmesh(iSubmesh); + renderSubmesh(iSubmesh, renderPass, object_name, pMaterial->getName()); break; case KRMaterial::KRMATERIAL_ALPHA_MODE_BLENDTWOSIDE: // Blended alpha rendered in two passes. First pass renders backfaces; second pass renders frontfaces. // Render back faces first GLDEBUG(glCullFace(GL_BACK)); - renderSubmesh(iSubmesh); + renderSubmesh(iSubmesh, renderPass, object_name, pMaterial->getName()); // Render front faces second GLDEBUG(glCullFace(GL_BACK)); - renderSubmesh(iSubmesh); + renderSubmesh(iSubmesh, renderPass, object_name, pMaterial->getName()); break; } } @@ -249,7 +249,7 @@ vector KRMesh::getSubmeshes() { return m_submeshes; } -void KRMesh::renderSubmesh(int iSubmesh) { +void KRMesh::renderSubmesh(int iSubmesh, KRNode::RenderPass renderPass, const std::string &object_name, const std::string &material_name) { unsigned char *pVertexData = getVertexData(); pack_header *pHeader = getHeader(); @@ -294,6 +294,7 @@ void KRMesh::renderSubmesh(int iSubmesh) { default: break; } + m_pContext->getModelManager()->log_draw_call(renderPass, object_name, material_name, (MAX_VBO_SIZE - iVertex)); cVertexes -= (MAX_VBO_SIZE - iVertex); iVertex = 0; @@ -311,6 +312,7 @@ void KRMesh::renderSubmesh(int iSubmesh) { default: break; } + m_pContext->getModelManager()->log_draw_call(renderPass, object_name, material_name, cVertexes); cVertexes = 0; } diff --git a/KREngine/kraken/KRMesh.h b/KREngine/kraken/KRMesh.h index b1f85b7..23d1ea8 100644 --- a/KREngine/kraken/KRMesh.h +++ b/KREngine/kraken/KRMesh.h @@ -83,7 +83,7 @@ public: } model_format_t; - void render(KRCamera *pCamera, std::vector &lights, const KRViewport &viewport, const KRMat4 &matModel, KRTexture *pLightMap, KRNode::RenderPass renderPass, const std::vector &bones); + void render(const std::string &object_name, KRCamera *pCamera, std::vector &lights, const KRViewport &viewport, const KRMat4 &matModel, KRTexture *pLightMap, KRNode::RenderPass renderPass, const std::vector &bones); std::string m_lodBaseName; @@ -97,7 +97,7 @@ public: void convert(model_format_t model_format); void optimize(); - void renderSubmesh(int iSubmesh); + void renderSubmesh(int iSubmesh, KRNode::RenderPass renderPass, const std::string &object_name, const std::string &material_name); GLfloat getMaxDimension(); diff --git a/KREngine/kraken/KRMeshManager.cpp b/KREngine/kraken/KRMeshManager.cpp index 86a3b67..5b553c9 100644 --- a/KREngine/kraken/KRMeshManager.cpp +++ b/KREngine/kraken/KRMeshManager.cpp @@ -50,6 +50,8 @@ KRMeshManager::KRMeshManager(KRContext &context) : KRContextObject(context) { // addModel(new KRMeshCube(context)); // FINDME - HACK! This needs to be fixed, as it currently segfaults addModel(new KRMeshSphere(context)); + m_draw_call_logging_enabled = false; + m_draw_call_log_used = false; } KRMeshManager::~KRMeshManager() { @@ -403,6 +405,18 @@ KRMeshManager::RandomParticleVertexData *KRMeshManager::getRandomParticles() void KRMeshManager::startFrame(float deltaTime) { m_memoryTransferredThisFrame = 0; + if(m_draw_call_log_used) { + // Only log draw calls on the next frame if the draw call log was used on last frame + m_draw_call_log_used = false; + m_draw_call_logging_enabled = true; + } + m_draw_calls.clear(); + +} + +void KRMeshManager::endFrame(float deltaTime) +{ + } long KRMeshManager::getMemoryTransferedThisFrame() @@ -420,3 +434,21 @@ int KRMeshManager::getPoolVBOCount() { return m_vbosPool.size(); } + +void KRMeshManager::log_draw_call(KRNode::RenderPass pass, const std::string &object_name, const std::string &material_name, int vertex_count) +{ + if(m_draw_call_logging_enabled) { + draw_call_info info; + info.pass = pass; + strncpy(info.object_name, object_name.c_str(), 256); + strncpy(info.material_name, material_name.c_str(), 256); + info.vertex_count = vertex_count; + m_draw_calls.push_back(info); + } +} + +std::vector KRMeshManager::getDrawCalls() +{ + m_draw_call_log_used = true; + return m_draw_calls; +} diff --git a/KREngine/kraken/KRMeshManager.h b/KREngine/kraken/KRMeshManager.h index bb391b1..dbea338 100644 --- a/KREngine/kraken/KRMeshManager.h +++ b/KREngine/kraken/KRMeshManager.h @@ -35,6 +35,7 @@ #include "KREngine-common.h" #include "KRContextObject.h" #include "KRDataBlock.h" +#include "KRNode.h" class KRContext; class KRMesh; @@ -49,6 +50,7 @@ public: void rotateBuffers(bool new_frame); void startFrame(float deltaTime); + void endFrame(float deltaTime); KRMesh *loadModel(const char *szName, KRDataBlock *pData); std::vector getModel(const char *szName); @@ -99,6 +101,16 @@ public: int getActiveVBOCount(); int getPoolVBOCount(); + struct draw_call_info { + KRNode::RenderPass pass; + char object_name[256]; + char material_name[256]; + int vertex_count; + }; + + void log_draw_call(KRNode::RenderPass pass, const std::string &object_name, const std::string &material_name, int vertex_count); + std::vector getDrawCalls(); + private: std::multimap m_models; // Multiple models with the same name/key may be inserted, representing multiple LOD levels of the model @@ -121,6 +133,10 @@ private: VolumetricLightingVertexData *m_volumetricLightingVertexData; long m_memoryTransferredThisFrame; + + std::vector m_draw_calls; + bool m_draw_call_logging_enabled; + bool m_draw_call_log_used; }; diff --git a/KREngine/kraken/KRModel.cpp b/KREngine/kraken/KRModel.cpp index 3cca816..403f891 100644 --- a/KREngine/kraken/KRModel.cpp +++ b/KREngine/kraken/KRModel.cpp @@ -98,7 +98,7 @@ void KRModel::render(KRCamera *pCamera, std::vector &lights, const KR KRNode::render(pCamera, lights, viewport, renderPass); - if(renderPass != KRNode::RENDER_PASS_DEFERRED_LIGHTS && renderPass != KRNode::RENDER_PASS_ADDITIVE_PARTICLES && renderPass != KRNode::RENDER_PASS_PARTICLE_OCCLUSION && renderPass != KRNode::RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE) { + if(renderPass != KRNode::RENDER_PASS_DEFERRED_LIGHTS && renderPass != KRNode::RENDER_PASS_ADDITIVE_PARTICLES && renderPass != KRNode::RENDER_PASS_PARTICLE_OCCLUSION && renderPass != KRNode::RENDER_PASS_VOLUMETRIC_EFFECTS_ADDITIVE && renderPass != KRNode::RENDER_PASS_GENERATE_SHADOWMAPS) { loadModel(); if(m_models.size() > 0) { @@ -136,7 +136,7 @@ void KRModel::render(KRCamera *pCamera, std::vector &lights, const KR matModel = KRQuaternion(KRVector3::Forward(), KRVector3::Normalize(camera_pos - model_center)).rotationMatrix() * matModel; } - pModel->render(pCamera, lights, viewport, matModel, m_pLightMap, renderPass, m_bones[pModel]); + pModel->render(getName(), pCamera, lights, viewport, matModel, m_pLightMap, renderPass, m_bones[pModel]); } } } diff --git a/KREngine/kraken/KRNode.cpp b/KREngine/kraken/KRNode.cpp index 006f8f3..9d90351 100644 --- a/KREngine/kraken/KRNode.cpp +++ b/KREngine/kraken/KRNode.cpp @@ -262,7 +262,7 @@ const std::vector &KRNode::getChildren() { return m_childNodes; } -const std::string &KRNode::getName() { +const std::string &KRNode::getName() const { return m_name; } diff --git a/KREngine/kraken/KRNode.h b/KREngine/kraken/KRNode.h index 4992d38..2c7546d 100644 --- a/KREngine/kraken/KRNode.h +++ b/KREngine/kraken/KRNode.h @@ -50,7 +50,7 @@ public: virtual void loadXML(tinyxml2::XMLElement *e); virtual std::string getElementName(); - const std::string &getName(); + const std::string &getName() const; void addChild(KRNode *child); const std::vector &getChildren(); diff --git a/KREngine/kraken/KRReverbZone.cpp b/KREngine/kraken/KRReverbZone.cpp index 35f3ecb..6f323e0 100644 --- a/KREngine/kraken/KRReverbZone.cpp +++ b/KREngine/kraken/KRReverbZone.cpp @@ -113,7 +113,7 @@ void KRReverbZone::render(KRCamera *pCamera, std::vector &lights, con std::vector sphereModels = getContext().getModelManager()->getModel("__sphere"); if(sphereModels.size()) { for(int i=0; i < sphereModels[0]->getSubmeshCount(); i++) { - sphereModels[0]->renderSubmesh(i); + sphereModels[0]->renderSubmesh(i, renderPass, getName(), "visualize_overlay"); } } diff --git a/KREngine/kraken/KRShader.cpp b/KREngine/kraken/KRShader.cpp index dc47dfd..1637b88 100644 --- a/KREngine/kraken/KRShader.cpp +++ b/KREngine/kraken/KRShader.cpp @@ -238,7 +238,7 @@ bool KRShader::bind(KRCamera &camera, const KRViewport &viewport, const KRMat4 & int light_point_count = 0; int light_spot_count = 0; // TODO - Need to support multiple lights and more light types in forward rendering - if(renderPass != KRNode::RENDER_PASS_DEFERRED_LIGHTS && renderPass != KRNode::RENDER_PASS_DEFERRED_GBUFFER && renderPass != KRNode::RENDER_PASS_DEFERRED_OPAQUE) { + if(renderPass != KRNode::RENDER_PASS_DEFERRED_LIGHTS && renderPass != KRNode::RENDER_PASS_DEFERRED_GBUFFER && renderPass != KRNode::RENDER_PASS_DEFERRED_OPAQUE && renderPass != KRNode::RENDER_PASS_GENERATE_SHADOWMAPS) { for(std::vector::const_iterator light_itr=lights.begin(); light_itr != lights.end(); light_itr++) { KRLight *light = (*light_itr); KRDirectionalLight *directional_light = dynamic_cast(light); diff --git a/KREngine/kraken/KRShaderManager.cpp b/KREngine/kraken/KRShaderManager.cpp index e2afa2e..0bfd5e7 100644 --- a/KREngine/kraken/KRShaderManager.cpp +++ b/KREngine/kraken/KRShaderManager.cpp @@ -63,7 +63,7 @@ KRShader *KRShaderManager::getShader(const std::string &shader_name, KRCamera *p int light_directional_count = 0; int light_point_count = 0; int light_spot_count = 0; - if(renderPass != KRNode::RENDER_PASS_DEFERRED_LIGHTS && renderPass != KRNode::RENDER_PASS_DEFERRED_GBUFFER && renderPass != KRNode::RENDER_PASS_DEFERRED_OPAQUE) { + if(renderPass != KRNode::RENDER_PASS_DEFERRED_LIGHTS && renderPass != KRNode::RENDER_PASS_DEFERRED_GBUFFER && renderPass != KRNode::RENDER_PASS_DEFERRED_OPAQUE && renderPass != KRNode::RENDER_PASS_GENERATE_SHADOWMAPS) { for(std::vector::const_iterator light_itr=lights.begin(); light_itr != lights.end(); light_itr++) { KRLight *light = (*light_itr); KRDirectionalLight *directional_light = dynamic_cast(light); diff --git a/KREngine/kraken/KRTexture.cpp b/KREngine/kraken/KRTexture.cpp index 44adce6..95b30ab 100644 --- a/KREngine/kraken/KRTexture.cpp +++ b/KREngine/kraken/KRTexture.cpp @@ -146,3 +146,7 @@ int KRTexture::getMaxMipMap() { int KRTexture::getMinMipMap() { return m_min_lod_max_dim; } + +bool KRTexture::hasMipmaps() { + return m_max_lod_max_dim != m_min_lod_max_dim; +} diff --git a/KREngine/kraken/KRTexture.h b/KREngine/kraken/KRTexture.h index 27cb575..36b238a 100644 --- a/KREngine/kraken/KRTexture.h +++ b/KREngine/kraken/KRTexture.h @@ -64,7 +64,8 @@ public: int getCurrentLodMaxDim(); int getMaxMipMap(); int getMinMipMap(); - + bool hasMipmaps(); + protected: virtual bool createGLTexture(int lod_max_dim) = 0; GLuint getHandle(); diff --git a/KREngine/kraken/KRTexture2D.cpp b/KREngine/kraken/KRTexture2D.cpp index 427acfc..83ec7eb 100644 --- a/KREngine/kraken/KRTexture2D.cpp +++ b/KREngine/kraken/KRTexture2D.cpp @@ -79,9 +79,6 @@ void KRTexture2D::bind() { } } -bool KRTexture2D::hasMipmaps() { - return m_max_lod_max_dim != m_min_lod_max_dim; -} bool KRTexture2D::save(const std::string& path) { diff --git a/KREngine/kraken/KRTexture2D.h b/KREngine/kraken/KRTexture2D.h index e5707aa..4fcf72f 100644 --- a/KREngine/kraken/KRTexture2D.h +++ b/KREngine/kraken/KRTexture2D.h @@ -46,8 +46,6 @@ public: virtual bool save(const std::string& path); virtual bool save(KRDataBlock &data); - bool hasMipmaps(); - virtual bool uploadTexture(GLenum target, int lod_max_dim, int ¤t_lod_max_dim, long &textureMemUsed) = 0; virtual void bind();