diff --git a/KREngine/Kraken.xcodeproj/project.pbxproj b/KREngine/Kraken.xcodeproj/project.pbxproj index cc753f5..3d6d1e1 100644 --- a/KREngine/Kraken.xcodeproj/project.pbxproj +++ b/KREngine/Kraken.xcodeproj/project.pbxproj @@ -199,7 +199,7 @@ E4AE635D1704FB0A00B460CD /* KRLODGroup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4AE635B1704FB0A00B460CD /* KRLODGroup.cpp */; }; E4AE635E1704FB0A00B460CD /* KRLODGroup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4AE635B1704FB0A00B460CD /* KRLODGroup.cpp */; }; E4AE635F1704FB0A00B460CD /* KRLODGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = E4AE635C1704FB0A00B460CD /* KRLODGroup.h */; }; - E4AE63601704FB0A00B460CD /* KRLODGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = E4AE635C1704FB0A00B460CD /* KRLODGroup.h */; }; + E4AE63601704FB0A00B460CD /* KRLODGroup.h in Headers */ = {isa = PBXBuildFile; fileRef = E4AE635C1704FB0A00B460CD /* KRLODGroup.h */; settings = {ATTRIBUTES = (Public, ); }; }; E4AFC6B615F7C46800DDB4C8 /* KRAABB.cpp in Headers */ = {isa = PBXBuildFile; fileRef = E40BA45215EFF79500D7C3DD /* KRAABB.cpp */; settings = {ATTRIBUTES = (Public, ); }; }; E4AFC6B915F7C7B200DDB4C8 /* KROctree.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4924C2415EE95E700B965C6 /* KROctree.cpp */; settings = {ATTRIBUTES = (Public, ); }; }; E4AFC6BB15F7C7D600DDB4C8 /* KROctreeNode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4924C2915EE96AA00B965C6 /* KROctreeNode.cpp */; }; @@ -314,6 +314,7 @@ E4E6F6BE16BA5E0A00E410F8 /* volumetric_fog_downsampled_osx.vsh in Resources */ = {isa = PBXBuildFile; fileRef = E4E6F62816BA5D8300E410F8 /* volumetric_fog_downsampled_osx.vsh */; }; E4E6F6BF16BA5E0A00E410F8 /* volumetric_fog_osx.fsh in Resources */ = {isa = PBXBuildFile; fileRef = E4E6F62916BA5D8300E410F8 /* volumetric_fog_osx.fsh */; }; E4E6F6C016BA5E0A00E410F8 /* volumetric_fog_osx.vsh in Resources */ = {isa = PBXBuildFile; fileRef = E4E6F62A16BA5D8300E410F8 /* volumetric_fog_osx.vsh */; }; + E4EC73B8171F32780065299F /* forsyth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4FE6AAA16B21D7E0058B8CE /* forsyth.cpp */; }; E4F027C716979CCD00D4427D /* KRAudioManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4F027C516979CCD00D4427D /* KRAudioManager.cpp */; }; E4F027C816979CCD00D4427D /* KRAudioManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4F027C516979CCD00D4427D /* KRAudioManager.cpp */; }; E4F027C916979CCD00D4427D /* KRAudioManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E4F027C616979CCD00D4427D /* KRAudioManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -1292,9 +1293,9 @@ E450273C16E0491D00FDEC5C /* KRReverbZone.h in Headers */, E44F38251683B23000399B5D /* KRRenderSettings.h in Headers */, E499BF1D16AE74FF007FCDBE /* KRTextureAnimated.h in Headers */, + E4AE63601704FB0A00B460CD /* KRLODGroup.h in Headers */, E499BF1F16AE753E007FCDBE /* KRCollider.h in Headers */, E499BF2316AE7636007FCDBE /* kraken-prefix.pch in Headers */, - E4AE63601704FB0A00B460CD /* KRLODGroup.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1564,6 +1565,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + E4EC73B8171F32780065299F /* forsyth.cpp in Sources */, E499BF2516AE8C20007FCDBE /* KREngine.mm in Sources */, 10CC33A5168534F000BB9846 /* KRCamera.cpp in Sources */, E460292C166834AB00261BB9 /* KRTextureAnimated.cpp in Sources */, @@ -1668,7 +1670,7 @@ CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = DEBUG; + GCC_PREPROCESSOR_DEFINITIONS = "DEBUG=1"; GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_VERSION = com.apple.compilers.llvmgcc42; GCC_WARN_ABOUT_RETURN_TYPE = YES; @@ -1773,10 +1775,6 @@ GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "kraken_osx/kraken-prefix.pch"; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; diff --git a/KREngine/kraken/KRCamera.cpp b/KREngine/kraken/KRCamera.cpp index 031a394..ea34cab 100644 --- a/KREngine/kraken/KRCamera.cpp +++ b/KREngine/kraken/KRCamera.cpp @@ -75,8 +75,6 @@ void KRCamera::renderFrame(float deltaTime, GLint renderBufferWidth, GLint rende } m_last_frame_start = current_time; - - GLint defaultFBO; GLDEBUG(glGetIntegerv(GL_FRAMEBUFFER_BINDING, &defaultFBO)); @@ -99,9 +97,21 @@ void KRCamera::renderFrame(float deltaTime, GLint renderBufferWidth, GLint rende scene.updateOctree(m_viewport); + // ----====---- Generate Shadowmaps for Lights ----====---- + if(settings.m_cShadowBuffers > 0) { + GL_PUSH_GROUP_MARKER("Generate Shadowmaps"); + + scene.render(this, m_viewport.getVisibleBounds(), m_viewport, KRNode::RENDER_PASS_GENERATE_SHADOWMAPS, settings.bEnableDeferredLighting); + GLDEBUG(glViewport(0, 0, m_viewport.getSize().x, m_viewport.getSize().y)); + GL_POP_GROUP_MARKER; + } + if(settings.bEnableDeferredLighting) { + // ----====---- Opaque Geometry, Deferred rendering Pass 1 ----====---- + GL_PUSH_GROUP_MARKER("Deferred Lighting - Pass 1 (Opaque)"); + // Set render target GLDEBUG(glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer)); GLDEBUG(glClearColor(0.0f, 0.0f, 0.0f, 0.0f)); @@ -125,11 +135,15 @@ void KRCamera::renderFrame(float deltaTime, GLint renderBufferWidth, GLint rende // Render the geometry scene.render(this, m_viewport.getVisibleBounds(), m_viewport, KRNode::RENDER_PASS_DEFERRED_GBUFFER, true); - // ----====---- Generate Shadowmaps for Lights ----====---- - scene.render(this, m_viewport.getVisibleBounds(), m_viewport, KRNode::RENDER_PASS_GENERATE_SHADOWMAPS, false); - GLDEBUG(glViewport(0, 0, m_viewport.getSize().x, m_viewport.getSize().y)); + + GL_POP_GROUP_MARKER; + + // ----====---- Opaque Geometry, Deferred rendering Pass 2 ----====---- + + GL_PUSH_GROUP_MARKER("Deferred Lighting - Pass 2 (Opaque)"); + // Set render target GLDEBUG(glBindFramebuffer(GL_FRAMEBUFFER, lightAccumulationBuffer)); GLDEBUG(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0)); @@ -155,7 +169,12 @@ void KRCamera::renderFrame(float deltaTime, GLint renderBufferWidth, GLint rende // Render the geometry scene.render(this, m_viewport.getVisibleBounds(), m_viewport, KRNode::RENDER_PASS_DEFERRED_LIGHTS, false); + GL_POP_GROUP_MARKER; + // ----====---- Opaque Geometry, Deferred rendering Pass 3 ----====---- + + GL_PUSH_GROUP_MARKER("Deferred Lighting - Pass 3 (Opaque)"); + // Set render target GLDEBUG(glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer)); GLDEBUG(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0)); @@ -194,13 +213,13 @@ void KRCamera::renderFrame(float deltaTime, GLint renderBufferWidth, GLint rende m_pContext->getTextureManager()->selectTexture(7, NULL); GLDEBUG(glActiveTexture(GL_TEXTURE7)); GLDEBUG(glBindTexture(GL_TEXTURE_2D, 0)); + + GL_POP_GROUP_MARKER; } else { - // ----====---- Generate Shadowmaps for Lights ----====---- - if(settings.m_cShadowBuffers > 0) { - scene.render(this, m_viewport.getVisibleBounds(), m_viewport, KRNode::RENDER_PASS_GENERATE_SHADOWMAPS, true); - } // ----====---- Opaque Geometry, Forward Rendering ----====---- + GL_PUSH_GROUP_MARKER("Forward Rendering - Opaque"); + // Set render target GLDEBUG(glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer)); GLDEBUG(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0)); @@ -229,10 +248,15 @@ void KRCamera::renderFrame(float deltaTime, GLint renderBufferWidth, GLint rende // Render the geometry scene.render(this, m_viewport.getVisibleBounds(), m_viewport, KRNode::RENDER_PASS_FORWARD_OPAQUE, true); + + GL_POP_GROUP_MARKER; } // ----====---- Sky Box ----====---- + + GL_PUSH_GROUP_MARKER("Sky Box"); + // Set render target GLDEBUG(glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer)); GLDEBUG(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0)); @@ -262,8 +286,12 @@ void KRCamera::renderFrame(float deltaTime, GLint renderBufferWidth, GLint rende GLDEBUG(glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)); } + GL_POP_GROUP_MARKER; + // ----====---- Transparent Geometry, Forward Rendering ----====---- + + GL_PUSH_GROUP_MARKER("Forward Rendering - Transparent"); // Note: These parameters have already been set up by the skybox render above // @@ -289,8 +317,12 @@ void KRCamera::renderFrame(float deltaTime, GLint renderBufferWidth, GLint rende // Render all transparent geometry scene.render(this, m_viewport.getVisibleBounds(), m_viewport, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, false); + GL_POP_GROUP_MARKER; + // ----====---- Particle Occlusion Tests ----====---- + GL_PUSH_GROUP_MARKER("Particle Occlusion Tests"); + // Set render target GLDEBUG(glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer)); GLDEBUG(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0)); @@ -313,8 +345,12 @@ void KRCamera::renderFrame(float deltaTime, GLint renderBufferWidth, GLint rende // ----====---- Perform Occlusion Tests ----====---- scene.render(this, m_viewport.getVisibleBounds(), m_viewport, RENDER_PASS_PARTICLE_OCCLUSION, false); + GL_POP_GROUP_MARKER; + // ----====---- Flares ----====---- + GL_PUSH_GROUP_MARKER("Additive Particles"); + // Set render target GLDEBUG(glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer)); GLDEBUG(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0)); @@ -336,9 +372,14 @@ void KRCamera::renderFrame(float deltaTime, GLint renderBufferWidth, GLint rende // Render all flares scene.render(this, m_viewport.getVisibleBounds(), m_viewport, KRNode::RENDER_PASS_ADDITIVE_PARTICLES, false); + GL_POP_GROUP_MARKER; + // ----====---- Volumetric Lighting ----====---- if(settings.volumetric_environment_enable) { + + GL_PUSH_GROUP_MARKER("Volumetric Lighting"); + KRViewport volumetricLightingViewport = KRViewport(KRVector2(volumetricBufferWidth, volumetricBufferHeight), m_viewport.getViewMatrix(), m_viewport.getProjectionMatrix()); if(settings.volumetric_environment_downsample != 0) { @@ -371,12 +412,16 @@ void KRCamera::renderFrame(float deltaTime, GLint renderBufferWidth, GLint rende GLDEBUG(glViewport(0, 0, m_viewport.getSize().x, m_viewport.getSize().y)); } + + GL_POP_GROUP_MARKER; } // ----====---- Debug Overlay ----====---- + GL_PUSH_GROUP_MARKER("Debug Overlays"); + if(settings.bShowOctree) { // Enable z-buffer test GLDEBUG(glEnable(GL_DEPTH_TEST)); @@ -409,12 +454,17 @@ void KRCamera::renderFrame(float deltaTime, GLint renderBufferWidth, GLint rende // Re-enable z-buffer write GLDEBUG(glDepthMask(GL_TRUE)); + GL_POP_GROUP_MARKER; + // fprintf(stderr, "VBO Mem: %i Kbyte Texture Mem: %i/%i Kbyte (active/total) Shader Handles: %i Visible Bounds: %i Max Texture LOD: %i\n", (int)m_pContext->getModelManager()->getMemUsed() / 1024, (int)m_pContext->getTextureManager()->getActiveMemUsed() / 1024, (int)m_pContext->getTextureManager()->getMemUsed() / 1024, (int)m_pContext->getShaderManager()->getShaderHandlesUsed(), (int)m_visibleBounds.size(), m_pContext->getTextureManager()->getLODDimCap()); + GL_PUSH_GROUP_MARKER("Post Processing"); GLDEBUG(glBindFramebuffer(GL_FRAMEBUFFER, defaultFBO)); renderPost(); m_pContext->getModelManager()->unbindVBO(); + + GL_POP_GROUP_MARKER; } diff --git a/KREngine/kraken/KRDirectionalLight.cpp b/KREngine/kraken/KRDirectionalLight.cpp index 960a131..98f26cc 100644 --- a/KREngine/kraken/KRDirectionalLight.cpp +++ b/KREngine/kraken/KRDirectionalLight.cpp @@ -33,13 +33,14 @@ KRVector3 KRDirectionalLight::getWorldLightDirection() { const GLfloat PI = 3.14159265; const GLfloat d2r = PI * 2 / 360; - KRVector3 world_rotation = getLocalRotation(); - KRVector3 light_rotation = KRVector3(0.0, 0.0, -1.0); + KRVector3 world_rotation = getWorldRotation(); + KRVector3 light_rotation = KRVector3(0.0, 0.0, 1.0); + KRMat4 m; m.rotate(world_rotation.x, X_AXIS); m.rotate(world_rotation.y, Y_AXIS); - m.rotate(world_rotation.z, X_AXIS); - m.rotate(-90.0 * d2r, Y_AXIS); + m.rotate(world_rotation.z, Z_AXIS); +// m.rotate(-90.0 * d2r, Y_AXIS); KRVector3 light_direction = KRMat4::Dot(m, light_rotation); return light_direction; } @@ -87,7 +88,7 @@ int KRDirectionalLight::configureShadowBufferViewports(const KRViewport &viewpor KRAABB prevShadowBounds = KRAABB(-KRVector3::One(), KRVector3::One(), KRMat4::Invert(m_shadowViewports[iShadow].getViewProjectionMatrix())); KRAABB minimumShadowBounds = KRAABB(-KRVector3::One(), KRVector3::One(), KRMat4::Invert(newShadowViewport.getViewProjectionMatrix())); minimumShadowBounds.scale(1.0f / KRENGINE_SHADOW_BOUNDS_EXTRA_SCALE); - if(!prevShadowBounds.contains(minimumShadowBounds) || !shadowValid[iShadow]) { + if(!prevShadowBounds.contains(minimumShadowBounds) || !shadowValid[iShadow] || true) { // FINDME, HACK - Re-generating the shadow map every frame. This should only be needed if the shadow contains non-static geometry m_shadowViewports[iShadow] = newShadowViewport; shadowValid[iShadow] = false; fprintf(stderr, "Kraken - Generate shadow maps...\n"); diff --git a/KREngine/kraken/KREngine-common.h b/KREngine/kraken/KREngine-common.h index 6f83506..6c43c66 100644 --- a/KREngine/kraken/KREngine-common.h +++ b/KREngine/kraken/KREngine-common.h @@ -101,6 +101,8 @@ using std::queue; #endif + +#if DEBUG #define GLDEBUG(x) \ x; \ { \ @@ -110,7 +112,12 @@ while( (e=glGetError()) != GL_NO_ERROR) \ fprintf(stderr, "Error at line number %d, in file %s. glGetError() returned %i for call %s\n",__LINE__, __FILE__, e, #x ); \ } \ } +#else +#define GLDEBUG(x) x; +#endif + +#if DEBUG #define ALDEBUG(x) \ x; \ { \ @@ -120,7 +127,11 @@ while( (e=alGetError()) != AL_NO_ERROR) \ fprintf(stderr, "Error at line number %d, in file %s. alGetError() returned %i for call %s\n",__LINE__, __FILE__, e, #x ); \ } \ } +#else +#define ALDEBUG(x) x; +#endif +#if DEBUG #define OSDEBUG(x) \ { \ OSStatus e = x; \ @@ -129,6 +140,22 @@ if( e != noErr) \ fprintf(stderr, "Error at line number %d, in file %s. Returned %d for call %s\n",__LINE__, __FILE__, e, #x ); \ } \ } +#else +#define OSDEBUG(x) x; +#endif + + +#if GL_EXT_debug_marker && DEBUG + +#define GL_PUSH_GROUP_MARKER(x) glPushGroupMarkerEXT(0, x) +#define GL_POP_GROUP_MARKER glPopGroupMarkerEXT() + +#else + +#define GL_PUSH_GROUP_MARKER(x) +#define GL_POP_GROUP_MARKER + +#endif #define KRMIN(x,y) ((x) < (y) ? (x) : (y)) #define KRMAX(x,y) ((x) > (y) ? (x) : (y)) diff --git a/KREngine/kraken/KRLight.cpp b/KREngine/kraken/KRLight.cpp index ee70707..f2d3678 100644 --- a/KREngine/kraken/KRLight.cpp +++ b/KREngine/kraken/KRLight.cpp @@ -184,7 +184,7 @@ void KRLight::render(KRCamera *pCamera, std::vector &lights, const KR // Render brownian particles for dust floating in air if(m_cShadowBuffers >= 1 && shadowValid[0] && m_dust_particle_density > 0.0f && m_dust_particle_size > 0.0f && m_dust_particle_intensity > 0.0f) { float lod_coverage = getBounds().coverage(viewport.getViewProjectionMatrix(), viewport.getSize()); // This also checks the view frustrum culling - if(lod_coverage > 0.0f || true) { + if(lod_coverage > 0.0f || true) { // FINDME, HACK need to remove "|| true"? float particle_range = 600.0f; @@ -413,8 +413,9 @@ void KRLight::renderShadowBuffers(KRCamera *pCamera) GLDEBUG(glDisable(GL_DITHER)); - GLDEBUG(glCullFace(GL_BACK)); // Enable frontface culling, which eliminates some self-cast shadow artifacts - GLDEBUG(glEnable(GL_CULL_FACE)); + //GLDEBUG(glCullFace(GL_BACK)); // Enable frontface culling, which eliminates some self-cast shadow artifacts + //GLDEBUG(glEnable(GL_CULL_FACE)); + GLDEBUG(glDisable(GL_CULL_FACE)); // Enable z-buffer test GLDEBUG(glEnable(GL_DEPTH_TEST)); @@ -431,6 +432,8 @@ void KRLight::renderShadowBuffers(KRCamera *pCamera) getScene().render(pCamera, m_shadowViewports[iShadow].getVisibleBounds(), m_shadowViewports[iShadow], KRNode::RENDER_PASS_SHADOWMAP, true); + + GLDEBUG(glEnable(GL_CULL_FACE)); } } }