diff --git a/KREngine/KREngine.xcodeproj/project.pbxproj b/KREngine/KREngine.xcodeproj/project.pbxproj index 5d3ffb4..c72c346 100644 --- a/KREngine/KREngine.xcodeproj/project.pbxproj +++ b/KREngine/KREngine.xcodeproj/project.pbxproj @@ -19,14 +19,10 @@ E414BAE91435585A00A668C4 /* KRScene.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E414BAE81435585A00A668C4 /* KRScene.cpp */; }; E414BAEB14355E5500A668C4 /* KRBoundingVolume.h in Headers */ = {isa = PBXBuildFile; fileRef = E414BAEA14355E5500A668C4 /* KRBoundingVolume.h */; }; E414BAED14355EFF00A668C4 /* KRBoundingVolume.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E414BAEC14355EFF00A668C4 /* KRBoundingVolume.cpp */; }; - E41B841E16260C5600C7A771 /* sky_box.fsh in Sources */ = {isa = PBXBuildFile; fileRef = E41B841D16260C5600C7A771 /* sky_box.fsh */; }; - E41B842116260C6500C7A771 /* sky_box.vsh in Sources */ = {isa = PBXBuildFile; fileRef = E41B842016260C6500C7A771 /* sky_box.vsh */; }; E42CB1EC158446940066E0D8 /* KRQuaternion.h in Headers */ = {isa = PBXBuildFile; fileRef = E42CB1EB158446940066E0D8 /* KRQuaternion.h */; }; E42CB1ED158446940066E0D8 /* KRQuaternion.h in Headers */ = {isa = PBXBuildFile; fileRef = E42CB1EB158446940066E0D8 /* KRQuaternion.h */; }; E42CB1F0158446AB0066E0D8 /* KRQuaternion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E42CB1EF158446AB0066E0D8 /* KRQuaternion.cpp */; }; E42CB1F1158446AB0066E0D8 /* KRQuaternion.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E42CB1EF158446AB0066E0D8 /* KRQuaternion.cpp */; }; - E430D08115F8882F0010558D /* occlusion_test.fsh in Sources */ = {isa = PBXBuildFile; fileRef = E430D08015F8882F0010558D /* occlusion_test.fsh */; }; - E430D08915F88AD10010558D /* occlusion_test.vsh in Sources */ = {isa = PBXBuildFile; fileRef = E430D08815F88AD10010558D /* occlusion_test.vsh */; }; E43B0AD615DDCA0F00A5CB9F /* KRContextObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43B0AD415DDCA0C00A5CB9F /* KRContextObject.cpp */; }; E43B0AD715DDCA0F00A5CB9F /* KRContextObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E43B0AD415DDCA0C00A5CB9F /* KRContextObject.cpp */; }; E43B0AD815DDCA0F00A5CB9F /* KRContextObject.h in Headers */ = {isa = PBXBuildFile; fileRef = E43B0AD515DDCA0D00A5CB9F /* KRContextObject.h */; }; @@ -81,7 +77,6 @@ E488399D15F92BE000BD66D5 /* KRBundleManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E488399A15F92BE000BD66D5 /* KRBundleManager.cpp */; }; E488399E15F92BE000BD66D5 /* KRBundleManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E488399B15F92BE000BD66D5 /* KRBundleManager.h */; }; E488399F15F92BE000BD66D5 /* KRBundleManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E488399B15F92BE000BD66D5 /* KRBundleManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E48839A115F92C2800BD66D5 /* visualize_overlay.fsh in Sources */ = {isa = PBXBuildFile; fileRef = E48839A015F92C2800BD66D5 /* visualize_overlay.fsh */; }; E48B3CBD14393DF5000C50E2 /* KRCamera.h in Headers */ = {isa = PBXBuildFile; fileRef = E48B3CBC14393DF5000C50E2 /* KRCamera.h */; }; E48B3CC014393E30000C50E2 /* KRCamera.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E48B3CBF14393E2F000C50E2 /* KRCamera.cpp */; }; E48C696F15374F5B00232E28 /* KRContext.h in Headers */ = {isa = PBXBuildFile; fileRef = E48C696E15374F5A00232E28 /* KRContext.h */; }; @@ -156,8 +151,10 @@ E4CA10F01637BD58005D9400 /* KRTextureTGA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4CA10EE1637BD58005D9400 /* KRTextureTGA.cpp */; }; E4CA10F61638BCAF005D9400 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4CA10F51638BCAE005D9400 /* Accelerate.framework */; }; E4CA10F81638BCBB005D9400 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E4CA10F71638BCBB005D9400 /* Accelerate.framework */; }; - E4CE184D15FF124600F80870 /* light_point_inside.fsh in Sources */ = {isa = PBXBuildFile; fileRef = E4CE184C15FF124600F80870 /* light_point_inside.fsh */; }; - E4CE184F15FF125700F80870 /* light_point_inside.vsh in Sources */ = {isa = PBXBuildFile; fileRef = E4CE184E15FF125700F80870 /* light_point_inside.vsh */; }; + E4CA11741639CBD6005D9400 /* KRViewport.h in Headers */ = {isa = PBXBuildFile; fileRef = E4CA11731639CBD1005D9400 /* KRViewport.h */; }; + E4CA11751639CBD6005D9400 /* KRViewport.h in Headers */ = {isa = PBXBuildFile; fileRef = E4CA11731639CBD1005D9400 /* KRViewport.h */; }; + E4CA11781639CC90005D9400 /* KRViewport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4CA11771639CC8E005D9400 /* KRViewport.cpp */; }; + E4CA11791639CC90005D9400 /* KRViewport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4CA11771639CC8E005D9400 /* KRViewport.cpp */; }; E4D0683F1512A790005FFBEB /* KRVector3.h in Headers */ = {isa = PBXBuildFile; fileRef = E491017E13C99BDC0098455B /* KRVector3.h */; settings = {ATTRIBUTES = (Public, ); }; }; E4D13364153767ED0070068C /* KRShaderManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E47C25A613F4F6AB00FF4370 /* KRShaderManager.cpp */; settings = {ATTRIBUTES = (Public, ); }; }; E4D13365153767FF0070068C /* KRShaderManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E47C25A113F4F65A00FF4370 /* KRShaderManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -317,6 +314,8 @@ E4CA10EE1637BD58005D9400 /* KRTextureTGA.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = KRTextureTGA.cpp; path = Classes/KRTextureTGA.cpp; sourceTree = ""; }; E4CA10F51638BCAE005D9400 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; }; E4CA10F71638BCBB005D9400 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; }; + E4CA11731639CBD1005D9400 /* KRViewport.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = KRViewport.h; path = Classes/KRViewport.h; sourceTree = ""; }; + E4CA11771639CC8E005D9400 /* KRViewport.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = KRViewport.cpp; path = Classes/KRViewport.cpp; sourceTree = ""; }; E4CE184815FEEDA200F80870 /* font.pvr */ = {isa = PBXFileReference; lastKnownFileType = file; name = font.pvr; path = Shaders/font.pvr; sourceTree = ""; }; E4CE184C15FF124600F80870 /* light_point_inside.fsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; lineEnding = 0; name = light_point_inside.fsh; path = Shaders/light_point_inside.fsh; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.glsl; }; E4CE184E15FF125700F80870 /* light_point_inside.vsh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.glsl; name = light_point_inside.vsh; path = Shaders/light_point_inside.vsh; sourceTree = ""; }; @@ -614,6 +613,8 @@ E461A173152E59DF00F2044A /* Math */, E461A170152E598200F2044A /* Resources */, E4030E4B160A3CF000592648 /* KRStockGeometry.h */, + E4CA11731639CBD1005D9400 /* KRViewport.h */, + E4CA11771639CC8E005D9400 /* KRViewport.cpp */, ); name = Classes; sourceTree = ""; @@ -715,6 +716,7 @@ E4B175B4161F5FAF00B8FB80 /* KRTextureCube.h in Headers */, E4CA10E51637BD0A005D9400 /* KRTexturePVR.h in Headers */, E4CA10EC1637BD47005D9400 /* KRTextureTGA.h in Headers */, + E4CA11741639CBD6005D9400 /* KRViewport.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -766,6 +768,7 @@ E4B175B5161F5FAF00B8FB80 /* KRTextureCube.h in Headers */, E4CA10E61637BD0A005D9400 /* KRTexturePVR.h in Headers */, E4CA10ED1637BD47005D9400 /* KRTextureTGA.h in Headers */, + E4CA11751639CBD6005D9400 /* KRViewport.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -884,19 +887,13 @@ E4924C2615EE95E800B965C6 /* KROctree.cpp in Sources */, E4924C2B15EE96AB00B965C6 /* KROctreeNode.cpp in Sources */, E40BA45415EFF79500D7C3DD /* KRAABB.cpp in Sources */, - E430D08115F8882F0010558D /* occlusion_test.fsh in Sources */, - E430D08915F88AD10010558D /* occlusion_test.vsh in Sources */, E488399415F928CA00BD66D5 /* KRBundle.cpp in Sources */, E488399C15F92BE000BD66D5 /* KRBundleManager.cpp in Sources */, - E48839A115F92C2800BD66D5 /* visualize_overlay.fsh in Sources */, - E4CE184D15FF124600F80870 /* light_point_inside.fsh in Sources */, - E4CE184F15FF125700F80870 /* light_point_inside.vsh in Sources */, E4B175AC161F5A1000B8FB80 /* KRTexture.cpp in Sources */, E4B175B2161F5FAF00B8FB80 /* KRTextureCube.cpp in Sources */, - E41B841E16260C5600C7A771 /* sky_box.fsh in Sources */, - E41B842116260C6500C7A771 /* sky_box.vsh in Sources */, E4CA10E91637BD2B005D9400 /* KRTexturePVR.cpp in Sources */, E4CA10EF1637BD58005D9400 /* KRTextureTGA.cpp in Sources */, + E4CA11781639CC90005D9400 /* KRViewport.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -944,6 +941,7 @@ E4B175B3161F5FAF00B8FB80 /* KRTextureCube.cpp in Sources */, E4CA10EA1637BD2B005D9400 /* KRTexturePVR.cpp in Sources */, E4CA10F01637BD58005D9400 /* KRTextureTGA.cpp in Sources */, + E4CA11791639CC90005D9400 /* KRViewport.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/KREngine/KREngine/Classes/KRAABB.cpp b/KREngine/KREngine/Classes/KRAABB.cpp index f35f321..639ad34 100644 --- a/KREngine/KREngine/Classes/KRAABB.cpp +++ b/KREngine/KREngine/Classes/KRAABB.cpp @@ -66,6 +66,7 @@ bool KRAABB::operator >(const KRAABB& b) const bool KRAABB::operator <(const KRAABB& b) const { // Comparison operators are implemented to allow insertion into sorted containers such as std::set + if(min < b.min) { return true; } else if(min > b.min) { diff --git a/KREngine/KREngine/Classes/KRCamera.cpp b/KREngine/KREngine/Classes/KRCamera.cpp index a34599e..1c95fc1 100644 --- a/KREngine/KREngine/Classes/KRCamera.cpp +++ b/KREngine/KREngine/Classes/KRCamera.cpp @@ -145,6 +145,9 @@ void KRCamera::renderFrame(KRScene &scene, KRMat4 &viewMatrix) createBuffers(); + setViewportSize(KRVector2(backingWidth, backingHeight)); + m_viewport = KRViewport(getViewportSize(), viewMatrix, getProjectionMatrix()); + m_pContext->rotateBuffers(true); KRVector3 lightDirection(0.0, 0.0, 1.0); @@ -154,10 +157,8 @@ void KRCamera::renderFrame(KRScene &scene, KRMat4 &viewMatrix) shadowvp.rotate(scene.sun_pitch, X_AXIS); shadowvp.rotate(scene.sun_yaw, Y_AXIS); lightDirection = KRMat4::Dot(shadowvp, lightDirection); - shadowvp.invert(); - - lightDirection.normalize(); + shadowvp.invert(); allocateShadowBuffers(m_cShadowBuffers); int iOffset=m_iFrame % m_cShadowBuffers; @@ -193,7 +194,7 @@ void KRCamera::renderFrame(KRScene &scene, KRMat4 &viewMatrix) } } - renderFrame(scene, viewMatrix, lightDirection); + renderFrame(scene, lightDirection); GLDEBUG(glBindFramebuffer(GL_FRAMEBUFFER, defaultFBO)); renderPost(); @@ -203,12 +204,10 @@ void KRCamera::renderFrame(KRScene &scene, KRMat4 &viewMatrix) -void KRCamera::renderFrame(KRScene &scene, KRMat4 &viewMatrix, KRVector3 &lightDirection) { - - setViewportSize(KRVector2(backingWidth, backingHeight)); +void KRCamera::renderFrame(KRScene &scene, KRVector3 &lightDirection) { - KRMat4 invViewMatrix = viewMatrix; + KRMat4 invViewMatrix = m_viewport.getViewMatrix(); invViewMatrix.invert(); KRVector3 vecCameraDirection = KRMat4::Dot(invViewMatrix, KRVector3(0.0, 0.0, 1.0)) - KRMat4::Dot(invViewMatrix, KRVector3(0.0, 0.0, 0.0)); @@ -248,8 +247,6 @@ void KRCamera::renderFrame(KRScene &scene, KRMat4 &viewMatrix, KRVector3 &lightD //fprintf(stderr, "Draw Order: %i%i%i%i%i%i%i%i ", frontToBackOrder[0], frontToBackOrder[1], frontToBackOrder[2], frontToBackOrder[3], frontToBackOrder[4], frontToBackOrder[5], frontToBackOrder[6], frontToBackOrder[7]); - KRBoundingVolume frustrumVolume = KRBoundingVolume(viewMatrix, perspective_fov, getViewportSize().x / getViewportSize().y, perspective_nearz, perspective_farz); - std::set newVisibleBounds; if(bEnableDeferredLighting) { @@ -276,7 +273,7 @@ void KRCamera::renderFrame(KRScene &scene, KRMat4 &viewMatrix, KRVector3 &lightD GLDEBUG(glDisable(GL_BLEND)); // Render the geometry - scene.render(this, frontToBackOrder, m_visibleBounds, m_pContext, viewMatrix, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_DEFERRED_GBUFFER, newVisibleBounds); + scene.render(this, frontToBackOrder, m_visibleBounds, m_pContext, m_viewport, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_DEFERRED_GBUFFER, newVisibleBounds); // ----====---- Opaque Geometry, Deferred rendering Pass 2 ----====---- // Set render target @@ -302,7 +299,7 @@ void KRCamera::renderFrame(KRScene &scene, KRMat4 &viewMatrix, KRVector3 &lightD // Render the geometry - scene.render(this, frontToBackOrder, m_visibleBounds, m_pContext, viewMatrix, lightDirection, shadowmvpmatrix, shadowDepthTexture, 0, KRNode::RENDER_PASS_DEFERRED_LIGHTS, newVisibleBounds); + scene.render(this, frontToBackOrder, m_visibleBounds, m_pContext, m_viewport, lightDirection, shadowmvpmatrix, shadowDepthTexture, 0, KRNode::RENDER_PASS_DEFERRED_LIGHTS, newVisibleBounds); // ----====---- Opaque Geometry, Deferred rendering Pass 3 ----====---- // Set render target @@ -334,7 +331,7 @@ void KRCamera::renderFrame(KRScene &scene, KRMat4 &viewMatrix, KRVector3 &lightD // Render the geometry std::set emptyBoundsSet; // At this point, we only render octree nodes that produced fragments during the 1st pass into the GBuffer - scene.render(this, frontToBackOrder, emptyBoundsSet, m_pContext, viewMatrix, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_DEFERRED_OPAQUE, newVisibleBounds); + scene.render(this, frontToBackOrder, emptyBoundsSet, m_pContext, m_viewport, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_DEFERRED_OPAQUE, newVisibleBounds); // Deactivate source buffer texture units m_pContext->getTextureManager()->selectTexture(6, NULL, 0); @@ -372,7 +369,7 @@ void KRCamera::renderFrame(KRScene &scene, KRMat4 &viewMatrix, KRVector3 &lightD // Render the geometry - scene.render(this, frontToBackOrder, m_visibleBounds, m_pContext, viewMatrix, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_FORWARD_OPAQUE, newVisibleBounds); + scene.render(this, frontToBackOrder, m_visibleBounds, m_pContext, m_viewport, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_FORWARD_OPAQUE, newVisibleBounds); } // ----====---- Sky Box ----====---- @@ -397,10 +394,8 @@ void KRCamera::renderFrame(KRScene &scene, KRMat4 &viewMatrix, KRVector3 &lightD } if(m_pSkyBoxTexture) { - KRMat4 mvpMatrix = viewMatrix * getProjectionMatrix(); - KRMat4 matModel; KRShader *pShader = getContext().getShaderManager()->getShader("sky_box", this, false, false, false, 0, false, false, false, false, false, false, false, false, false, false, false, false, false, KRNode::RENDER_PASS_FORWARD_OPAQUE); - pShader->bind(this, matModel, viewMatrix, mvpMatrix, lightDirection, NULL, NULL, 0, KRNode::RENDER_PASS_FORWARD_OPAQUE); + pShader->bind(m_viewport, KRMat4(), lightDirection, NULL, NULL, 0, KRNode::RENDER_PASS_FORWARD_OPAQUE); getContext().getTextureManager()->selectTexture(0, m_pSkyBoxTexture, 2048); @@ -434,7 +429,7 @@ void KRCamera::renderFrame(KRScene &scene, KRMat4 &viewMatrix, KRVector3 &lightD GLDEBUG(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); // Render all transparent geometry - scene.render(this, backToFrontOrder, m_visibleBounds, m_pContext, viewMatrix, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, newVisibleBounds); + scene.render(this, backToFrontOrder, m_visibleBounds, m_pContext, m_viewport, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, newVisibleBounds); // ----====---- Flares ----====---- @@ -458,7 +453,7 @@ void KRCamera::renderFrame(KRScene &scene, KRMat4 &viewMatrix, KRVector3 &lightD GLDEBUG(glBlendFunc(GL_ONE, GL_ONE)); // Render all flares - scene.render(this, backToFrontOrder, m_visibleBounds, m_pContext, viewMatrix, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_FLARES, newVisibleBounds); + scene.render(this, backToFrontOrder, m_visibleBounds, m_pContext, m_viewport, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_FLARES, newVisibleBounds); // ----====---- Debug Overlay ----====---- @@ -482,8 +477,7 @@ void KRCamera::renderFrame(KRScene &scene, KRMat4 &viewMatrix, KRVector3 &lightD KRMat4 matModel = KRMat4(); matModel.scale((*itr).size() / 2.0f); matModel.translate((*itr).center()); - KRMat4 mvpmatrix = matModel * viewMatrix * projectionMatrix; - if(pVisShader->bind(this, matModel, viewMatrix, mvpmatrix, lightDirection, shadowmvpmatrix, shadowDepthTexture, 0, KRNode::RENDER_PASS_FORWARD_TRANSPARENT)) { + if(pVisShader->bind(m_viewport, matModel, lightDirection, shadowmvpmatrix, shadowDepthTexture, 0, KRNode::RENDER_PASS_FORWARD_TRANSPARENT)) { GLDEBUG(glDrawArrays(GL_TRIANGLE_STRIP, 0, 14)); } } @@ -647,10 +641,9 @@ void KRCamera::renderShadowBuffer(KRScene &scene, int iShadow) // Use shader program KRShader *shadowShader = m_pContext->getShaderManager()->getShader("ShadowShader", this, false, false, false, 0, false, false, false, false, false, false, false, false, false, false, false, false, false, KRNode::RENDER_PASS_FORWARD_TRANSPARENT); - KRMat4 matIdentity; // Value not used by postshader - KRVector3 vec4Temp; // Value not used by postshader - KRMat4 matModel; - shadowShader->bind(this, matModel, matIdentity, matIdentity, vec4Temp, NULL, NULL, 0, KRNode::RENDER_PASS_FORWARD_TRANSPARENT); + + KRViewport viewport = KRViewport(getViewportSize(), KRMat4(), KRMat4()); + shadowShader->bind(viewport, KRMat4(), KRVector3(), NULL, NULL, 0, KRNode::RENDER_PASS_FORWARD_TRANSPARENT); // Bind our modelmatrix variable to be a uniform called mvpmatrix in our shaderprogram shadowmvpmatrix[iShadow].setUniform(shadowShader->m_uniforms[KRShader::KRENGINE_UNIFORM_SHADOWMVP1]); @@ -685,7 +678,9 @@ void KRCamera::renderShadowBuffer(KRScene &scene, int iShadow) std::set newVisibleBounds; - scene.render(this, frontToBackOrder, m_shadowVisibleBounds[iShadow], m_pContext, shadowmvpmatrix[iShadow], lightDirection, shadowmvpmatrix, NULL, m_cShadowBuffers, KRNode::RENDER_PASS_SHADOWMAP, newVisibleBounds); + viewport = KRViewport(m_viewport.getSize(), KRMat4(), shadowmvpmatrix[iShadow]); + scene.render(this, frontToBackOrder, m_shadowVisibleBounds[iShadow], m_pContext, viewport, lightDirection, shadowmvpmatrix, NULL, m_cShadowBuffers, KRNode::RENDER_PASS_SHADOWMAP, newVisibleBounds); + m_shadowVisibleBounds[iShadow] = newVisibleBounds; GLDEBUG(glViewport(0, 0, backingWidth, backingHeight)); } @@ -718,10 +713,7 @@ void KRCamera::renderPost() GLDEBUG(glDisable(GL_DEPTH_TEST)); KRShader *postShader = m_pContext->getShaderManager()->getShader("PostShader", this, false, false, false, 0, false, false, false, false, false, false, false, false, false, false, false, false, false, KRNode::RENDER_PASS_FORWARD_TRANSPARENT); - KRMat4 matIdentity; // Value not used by postshader - KRVector3 vec4Temp; // Value not used by postshader - KRMat4 matModel; - postShader->bind(this, matModel, matIdentity, matIdentity, vec4Temp, NULL, NULL, 0, KRNode::RENDER_PASS_FORWARD_TRANSPARENT); + postShader->bind(KRViewport(getViewportSize(), KRMat4(), KRMat4()), KRMat4(), KRVector3(), NULL, NULL, 0, KRNode::RENDER_PASS_FORWARD_TRANSPARENT); m_pContext->getTextureManager()->selectTexture(0, NULL, 0); GLDEBUG(glActiveTexture(GL_TEXTURE0)); diff --git a/KREngine/KREngine/Classes/KRCamera.h b/KREngine/KREngine/Classes/KRCamera.h index 4104a34..3a34783 100644 --- a/KREngine/KREngine/Classes/KRCamera.h +++ b/KREngine/KREngine/Classes/KRCamera.h @@ -41,6 +41,7 @@ #import "KRContextObject.h" #import "KRTexture.h" #import "KRContext.h" +#import "KRViewport.h" #define KRENGINE_MAX_SHADOW_BUFFERS 3 #define KRENGINE_SHADOW_MAP_WIDTH 2048 @@ -48,6 +49,7 @@ class KRInstance; class KRScene; +class KRViewport; class KRCamera : public KRContextObject { public: @@ -137,11 +139,13 @@ private: bool shadowValid[KRENGINE_MAX_SHADOW_BUFFERS]; KRMat4 shadowmvpmatrix[KRENGINE_MAX_SHADOW_BUFFERS]; /* MVP Matrix for view from light source */ + KRViewport m_shadowViewports[KRENGINE_MAX_SHADOW_BUFFERS]; + void renderPost(); void destroyBuffers(); - void renderFrame(KRScene &scene, KRMat4 &viewMatrix, KRVector3 &lightDirection); + void renderFrame(KRScene &scene, KRVector3 &lightDirection); @@ -174,6 +178,8 @@ private: std::string m_skyBoxName; KRTexture *m_pSkyBoxTexture; + + KRViewport m_viewport; }; #endif diff --git a/KREngine/KREngine/Classes/KRDirectionalLight.cpp b/KREngine/KREngine/Classes/KRDirectionalLight.cpp index 7e2bb5d..e5e9547 100644 --- a/KREngine/KREngine/Classes/KRDirectionalLight.cpp +++ b/KREngine/KREngine/Classes/KRDirectionalLight.cpp @@ -50,17 +50,14 @@ KRVector3 KRDirectionalLight::getLocalLightDirection() { #if TARGET_OS_IPHONE -void KRDirectionalLight::render(KRCamera *pCamera, KRContext *pContext, KRMat4 &viewMatrix, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass) { +void KRDirectionalLight::render(KRCamera *pCamera, KRContext *pContext, const KRViewport &viewport, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass) { - KRLight::render(pCamera, pContext, viewMatrix, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); + KRLight::render(pCamera, pContext, viewport, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); if(renderPass == KRNode::RENDER_PASS_DEFERRED_LIGHTS) { // Lights are rendered on the second pass of the deferred renderer - - KRMat4 projectionMatrix = pCamera->getProjectionMatrix(); - KRMat4 mvpmatrix = m_modelMatrix * viewMatrix * projectionMatrix; - KRMat4 matModelViewInverseTranspose = viewMatrix * m_modelMatrix; + KRMat4 matModelViewInverseTranspose = viewport.getViewMatrix() * m_modelMatrix; matModelViewInverseTranspose.transpose(); matModelViewInverseTranspose.invert(); @@ -69,7 +66,7 @@ void KRDirectionalLight::render(KRCamera *pCamera, KRContext *pContext, KRMat4 & light_direction_view_space.normalize(); KRShader *pShader = pContext->getShaderManager()->getShader("light_directional", pCamera, false, false, false, 0, false, false, false, false, false, false, false, false, false, false, false, false, false, renderPass); - if(pShader->bind(pCamera, m_modelMatrix, viewMatrix, mvpmatrix, lightDirection, pShadowMatrices, shadowDepthTextures, 0, renderPass)) { + if(pShader->bind(viewport, m_modelMatrix, lightDirection, pShadowMatrices, shadowDepthTextures, 0, renderPass)) { light_direction_view_space.setUniform(pShader->m_uniforms[KRShader::KRENGINE_UNIFORM_LIGHT_DIRECTION_VIEW_SPACE]); m_color.setUniform(pShader->m_uniforms[KRShader::KRENGINE_UNIFORM_LIGHT_COLOR]); diff --git a/KREngine/KREngine/Classes/KRDirectionalLight.h b/KREngine/KREngine/Classes/KRDirectionalLight.h index 613c1e7..b2a4b50 100644 --- a/KREngine/KREngine/Classes/KRDirectionalLight.h +++ b/KREngine/KREngine/Classes/KRDirectionalLight.h @@ -25,7 +25,7 @@ public: #if TARGET_OS_IPHONE - virtual void render(KRCamera *pCamera, KRContext *pContext, KRMat4 &viewMatrix, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass); + virtual void render(KRCamera *pCamera, KRContext *pContext, const KRViewport &viewport, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass); #endif private: diff --git a/KREngine/KREngine/Classes/KRInstance.cpp b/KREngine/KREngine/Classes/KRInstance.cpp index f2ed140..b938ad6 100644 --- a/KREngine/KREngine/Classes/KRInstance.cpp +++ b/KREngine/KREngine/Classes/KRInstance.cpp @@ -79,11 +79,11 @@ void KRInstance::loadModel() { #if TARGET_OS_IPHONE -void KRInstance::render(KRCamera *pCamera, KRContext *pContext, KRMat4 &viewMatrix, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass) { +void KRInstance::render(KRCamera *pCamera, KRContext *pContext, const KRViewport &viewport, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass) { calcModelMatrix(); - KRNode::render(pCamera, pContext, viewMatrix, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); + KRNode::render(pCamera, pContext, viewport, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); if(renderPass != KRNode::RENDER_PASS_DEFERRED_LIGHTS && (renderPass != KRNode::RENDER_PASS_FORWARD_TRANSPARENT || this->hasTransparency()) && renderPass != KRNode::RENDER_PASS_FLARES) { // Don't render meshes on second pass of the deferred lighting renderer, as only lights will be applied @@ -95,7 +95,7 @@ void KRInstance::render(KRCamera *pCamera, KRContext *pContext, KRMat4 &viewMatr if(renderPass != KRNode::RENDER_PASS_SHADOWMAP) { projectionMatrix = pCamera->getProjectionMatrix(); } - KRMat4 matMVP = m_modelMatrix * viewMatrix * projectionMatrix; + KRMat4 matMVP = m_modelMatrix * viewport.getViewMatrix() * viewport.getProjectionMatrix(); float lod_coverage = getBounds().coverage(matMVP, pCamera->getViewportSize()); // This also checks the view frustrum culling if(lod_coverage > m_min_lod_coverage) { @@ -120,7 +120,7 @@ void KRInstance::render(KRCamera *pCamera, KRContext *pContext, KRMat4 &viewMatr m_pContext->getTextureManager()->selectTexture(3, m_pLightMap, 0); } - pModel->render(pCamera, pContext, m_modelMatrix, viewMatrix, matMVP, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, m_pLightMap, renderPass); + pModel->render(pCamera, pContext, viewport, m_modelMatrix, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, m_pLightMap, renderPass); } } } diff --git a/KREngine/KREngine/Classes/KRInstance.h b/KREngine/KREngine/Classes/KRInstance.h index 64fdc55..072524a 100644 --- a/KREngine/KREngine/Classes/KRInstance.h +++ b/KREngine/KREngine/Classes/KRInstance.h @@ -58,7 +58,7 @@ public: #if TARGET_OS_IPHONE - virtual void render(KRCamera *pCamera, KRContext *pContext, KRMat4 &viewMatrix, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, RenderPass renderPass); + virtual void render(KRCamera *pCamera, KRContext *pContext, const KRViewport &viewport, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass); #endif KRMat4 &getModelMatrix(); diff --git a/KREngine/KREngine/Classes/KRLight.cpp b/KREngine/KREngine/Classes/KRLight.cpp index 48f5056..9e95a29 100644 --- a/KREngine/KREngine/Classes/KRLight.cpp +++ b/KREngine/KREngine/Classes/KRLight.cpp @@ -118,9 +118,9 @@ float KRLight::getDecayStart() { #if TARGET_OS_IPHONE -void KRLight::render(KRCamera *pCamera, KRContext *pContext, KRMat4 &viewMatrix, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass) { +void KRLight::render(KRCamera *pCamera, KRContext *pContext, const KRViewport &viewport, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass) { - KRNode::render(pCamera, pContext, viewMatrix, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); + KRNode::render(pCamera, pContext, viewport, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); if(renderPass == KRNode::RENDER_PASS_FLARES) { if(m_flareTexture.size() && m_flareSize > 0.0f) { @@ -136,15 +136,9 @@ void KRLight::render(KRCamera *pCamera, KRContext *pContext, KRMat4 &viewMatrix, KRMat4 m_modelMatrix = KRMat4(); m_modelMatrix.translate(light_position.x, light_position.y, light_position.z); - - KRMat4 mvpmatrix = m_modelMatrix * viewMatrix * projectionMatrix; - KRMat4 matModelToView = viewMatrix * m_modelMatrix; - matModelToView.transpose(); - matModelToView.invert(); - // Render light flare on transparency pass KRShader *pShader = pContext->getShaderManager()->getShader("flare", pCamera, false, false, false, 0, false, false, false, false, false, false, false, false, false, false, false, false, false, renderPass); - if(pShader->bind(pCamera, m_modelMatrix, matModelToView, mvpmatrix, lightDirection, pShadowMatrices, shadowDepthTextures, 0, renderPass)) { + if(pShader->bind(viewport, m_modelMatrix, lightDirection, pShadowMatrices, shadowDepthTextures, 0, renderPass)) { GLDEBUG(glUniform1f( pShader->m_uniforms[KRShader::KRENGINE_UNIFORM_FLARE_SIZE], m_flareSize diff --git a/KREngine/KREngine/Classes/KRLight.h b/KREngine/KREngine/Classes/KRLight.h index be9e6a8..2b05a86 100644 --- a/KREngine/KREngine/Classes/KRLight.h +++ b/KREngine/KREngine/Classes/KRLight.h @@ -36,7 +36,7 @@ public: #if TARGET_OS_IPHONE - virtual void render(KRCamera *pCamera, KRContext *pContext, KRMat4 &viewMatrix, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass); + virtual void render(KRCamera *pCamera, KRContext *pContext, const KRViewport &viewport, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass); #endif diff --git a/KREngine/KREngine/Classes/KRMat4.cpp b/KREngine/KREngine/Classes/KRMat4.cpp index a87c3c0..d98bd40 100644 --- a/KREngine/KREngine/Classes/KRMat4.cpp +++ b/KREngine/KREngine/Classes/KRMat4.cpp @@ -107,7 +107,7 @@ KRMat4& KRMat4::operator*=(const KRMat4 &m) { } // Overload multiply operator -KRMat4 KRMat4::operator*(const KRMat4 &m) { +KRMat4 KRMat4::operator*(const KRMat4 &m) const { KRMat4 ret = *this; ret *= m; return ret; diff --git a/KREngine/KREngine/Classes/KRMat4.h b/KREngine/KREngine/Classes/KRMat4.h index c938c7f..2a53064 100644 --- a/KREngine/KREngine/Classes/KRMat4.h +++ b/KREngine/KREngine/Classes/KRMat4.h @@ -87,7 +87,7 @@ public: // Overload multiply operator //KRMat4& operator*(const KRMat4 &m); - KRMat4 operator*(const KRMat4 &m); + KRMat4 operator*(const KRMat4 &m) const; GLfloat *getPointer(); diff --git a/KREngine/KREngine/Classes/KRMaterial.cpp b/KREngine/KREngine/Classes/KRMaterial.cpp index 2ed9f60..96dfd7b 100644 --- a/KREngine/KREngine/Classes/KRMaterial.cpp +++ b/KREngine/KREngine/Classes/KRMaterial.cpp @@ -201,7 +201,7 @@ bool KRMaterial::isTransparent() { } #if TARGET_OS_IPHONE -bool KRMaterial::bind(KRMaterial **prevBoundMaterial, char *szPrevShaderKey, KRCamera *pCamera, KRMat4 &matModel, KRMat4 &matView, KRMat4 &mvpMatrix, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRContext *pContext, KRTexture *pLightMap, KRNode::RenderPass renderPass) { +bool KRMaterial::bind(KRMaterial **prevBoundMaterial, char *szPrevShaderKey, KRCamera *pCamera, const KRViewport &viewport, KRMat4 &matModel, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRContext *pContext, KRTexture *pLightMap, KRNode::RenderPass renderPass) { bool bSameMaterial = *prevBoundMaterial == this; bool bLightMap = pLightMap && pCamera->bEnableLightMap; @@ -242,7 +242,7 @@ bool KRMaterial::bind(KRMaterial **prevBoundMaterial, char *szPrevShaderKey, KRC bool bSameShader = strcmp(pShader->getKey(), szPrevShaderKey) == 0; if(!bSameShader) { - if(!pShader->bind(pCamera, matModel, matView, mvpMatrix, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass)) { + if(!pShader->bind(viewport, matModel, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass)) { return false; } diff --git a/KREngine/KREngine/Classes/KRMaterial.h b/KREngine/KREngine/Classes/KRMaterial.h index 0b43c64..d4688e2 100644 --- a/KREngine/KREngine/Classes/KRMaterial.h +++ b/KREngine/KREngine/Classes/KRMaterial.h @@ -89,7 +89,7 @@ public: char *getName(); #if TARGET_OS_IPHONE - bool bind(KRMaterial **prevBoundMaterial, char *szPrevShaderKey, KRCamera *pCamera, KRMat4 &matModel, KRMat4 &matView, KRMat4 &mvpMatrix, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRContext *pContext, KRTexture *pLightMap, KRNode::RenderPass renderPass); + bool bind(KRMaterial **prevBoundMaterial, char *szPrevShaderKey, KRCamera *pCamera, const KRViewport &viewport, KRMat4 &matModel, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRContext *pContext, KRTexture *pLightMap, KRNode::RenderPass renderPass); #endif diff --git a/KREngine/KREngine/Classes/KRModel.cpp b/KREngine/KREngine/Classes/KRModel.cpp index 997a457..51c82ac 100644 --- a/KREngine/KREngine/Classes/KRModel.cpp +++ b/KREngine/KREngine/Classes/KRModel.cpp @@ -105,7 +105,7 @@ void KRModel::loadPack(KRDataBlock *data) { #if TARGET_OS_IPHONE -void KRModel::render(KRCamera *pCamera, KRContext *pContext, KRMat4 &matModel, KRMat4 &matView, KRMat4 &matMVP, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRTexture *pLightMap, KRNode::RenderPass renderPass) { +void KRModel::render(KRCamera *pCamera, KRContext *pContext, const KRViewport &viewport, KRMat4 &matModel, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRTexture *pLightMap, KRNode::RenderPass renderPass) { //fprintf(stderr, "Rendering model: %s\n", m_name.c_str()); if(renderPass != KRNode::RENDER_PASS_FLARES) { @@ -159,7 +159,7 @@ void KRModel::render(KRCamera *pCamera, KRContext *pContext, KRMat4 &matModel, K if(pMaterial != NULL && pMaterial == (*mat_itr)) { if((!pMaterial->isTransparent() && renderPass != KRNode::RENDER_PASS_FORWARD_TRANSPARENT) || (pMaterial->isTransparent() && renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT)) { KRMat4 matModel; // FINDME - HACK - Model matrices are all currently identity matrices - if(pMaterial->bind(&pPrevBoundMaterial, szPrevShaderKey, pCamera, matModel, matView, matMVP, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, pContext, pLightMap, renderPass)) { + if(pMaterial->bind(&pPrevBoundMaterial, szPrevShaderKey, pCamera, viewport, matModel, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, pContext, pLightMap, renderPass)) { switch(pMaterial->getAlphaMode()) { case KRMaterial::KRMATERIAL_ALPHA_MODE_OPAQUE: // Non-transparent materials diff --git a/KREngine/KREngine/Classes/KRModel.h b/KREngine/KREngine/Classes/KRModel.h index 431481c..67d91e7 100644 --- a/KREngine/KREngine/Classes/KRModel.h +++ b/KREngine/KREngine/Classes/KRModel.h @@ -52,6 +52,7 @@ using std::list; #import "KRMaterialManager.h" #import "KRCamera.h" +#import "KRViewport.h" class KRMaterial; class KRNode; @@ -68,7 +69,7 @@ public: #if TARGET_OS_IPHONE - void render(KRCamera *pCamera, KRContext *pContext, KRMat4 &matModel, KRMat4 &matView, KRMat4 &matMVP, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRTexture *pLightMap, KRNode::RenderPass renderPass); + void render(KRCamera *pCamera, KRContext *pContext, const KRViewport &viewport, KRMat4 &matModel, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRTexture *pLightMap, KRNode::RenderPass renderPass); #endif diff --git a/KREngine/KREngine/Classes/KRNode.cpp b/KREngine/KREngine/Classes/KRNode.cpp index a347c30..f44f6fe 100644 --- a/KREngine/KREngine/Classes/KRNode.cpp +++ b/KREngine/KREngine/Classes/KRNode.cpp @@ -153,7 +153,7 @@ KRNode *KRNode::LoadXML(KRScene &scene, tinyxml2::XMLElement *e) { #if TARGET_OS_IPHONE -void KRNode::render(KRCamera *pCamera, KRContext *pContext, KRMat4 &viewMatrix, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass) { +void KRNode::render(KRCamera *pCamera, KRContext *pContext, const KRViewport &viewport, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, RenderPass renderPass) { } #endif diff --git a/KREngine/KREngine/Classes/KRNode.h b/KREngine/KREngine/Classes/KRNode.h index 9049350..a378740 100644 --- a/KREngine/KREngine/Classes/KRNode.h +++ b/KREngine/KREngine/Classes/KRNode.h @@ -11,6 +11,7 @@ #import "KRResource.h" #import "KRVector3.h" +#import "KRViewport.h" #import "tinyxml2.h" class KRCamera; @@ -66,7 +67,7 @@ public: KRScene &getScene(); #if TARGET_OS_IPHONE - virtual void render(KRCamera *pCamera, KRContext *pContext, KRMat4 &viewMatrix, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, RenderPass renderPass); + virtual void render(KRCamera *pCamera, KRContext *pContext, const KRViewport &viewport, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, RenderPass renderPass); #endif diff --git a/KREngine/KREngine/Classes/KRPointLight.cpp b/KREngine/KREngine/Classes/KRPointLight.cpp index 3ca0499..6fb3907 100644 --- a/KREngine/KREngine/Classes/KRPointLight.cpp +++ b/KREngine/KREngine/Classes/KRPointLight.cpp @@ -38,9 +38,9 @@ std::string KRPointLight::getElementName() { #if TARGET_OS_IPHONE -void KRPointLight::render(KRCamera *pCamera, KRContext *pContext, KRMat4 &viewMatrix, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass) { +void KRPointLight::render(KRCamera *pCamera, KRContext *pContext, const KRViewport &viewport, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass) { - KRLight::render(pCamera, pContext, viewMatrix, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); + KRLight::render(pCamera, pContext, viewport, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); bool bVisualize = renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT && pCamera->bShowDeferred; @@ -56,22 +56,19 @@ void KRPointLight::render(KRCamera *pCamera, KRContext *pContext, KRMat4 &viewMa m_modelMatrix.scale(influence_radius); m_modelMatrix.translate(light_position.x, light_position.y, light_position.z); - - KRMat4 mvpmatrix = m_modelMatrix * viewMatrix * projectionMatrix; - KRBoundingVolume influence_extents = KRBoundingVolume(KRVector3(-1.0), KRVector3(1.0), m_modelMatrix); - KRBoundingVolume frustrumVolumeNoNearClip = KRBoundingVolume(viewMatrix, pCamera->perspective_fov, pCamera->m_viewportSize.x / pCamera->m_viewportSize.y, 0.0, pCamera->getPerspectiveFarZ()); + KRBoundingVolume frustrumVolumeNoNearClip = KRBoundingVolume(viewport.getViewMatrix(), pCamera->perspective_fov, viewport.getSize().x / viewport.getSize().y, 0.0, pCamera->getPerspectiveFarZ()); if(influence_extents.test_intersect(frustrumVolumeNoNearClip)) { // Cull out any lights not within the view frustrum - KRVector3 view_light_position = KRMat4::Dot(viewMatrix, light_position); + KRVector3 view_light_position = KRMat4::Dot(viewport.getViewMatrix(), light_position); bool bInsideLight = view_light_position.sqrMagnitude() <= (influence_radius + pCamera->getPerspectiveNearZ()) * (influence_radius + pCamera->getPerspectiveNearZ()); KRShader *pShader = pContext->getShaderManager()->getShader(bVisualize ? "visualize_overlay" : (bInsideLight ? "light_point_inside" : "light_point"), pCamera, false, false, false, 0, false, false, false, false, false, false, false, false, false, false, false, false, false, renderPass); - if(pShader->bind(pCamera, m_modelMatrix, viewMatrix, mvpmatrix, lightDirection, pShadowMatrices, shadowDepthTextures, 0, renderPass)) { + if(pShader->bind(viewport, m_modelMatrix, lightDirection, pShadowMatrices, shadowDepthTextures, 0, renderPass)) { diff --git a/KREngine/KREngine/Classes/KRPointLight.h b/KREngine/KREngine/Classes/KRPointLight.h index cf247e8..f5373d8 100644 --- a/KREngine/KREngine/Classes/KRPointLight.h +++ b/KREngine/KREngine/Classes/KRPointLight.h @@ -23,7 +23,7 @@ public: #if TARGET_OS_IPHONE - virtual void render(KRCamera *pCamera, KRContext *pContext, KRMat4 &viewMatrix, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass); + virtual void render(KRCamera *pCamera, KRContext *pContext, const KRViewport &viewport, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass); #endif private: diff --git a/KREngine/KREngine/Classes/KRScene.cpp b/KREngine/KREngine/Classes/KRScene.cpp index b000a2b..c486111 100644 --- a/KREngine/KREngine/Classes/KRScene.cpp +++ b/KREngine/KREngine/Classes/KRScene.cpp @@ -57,7 +57,7 @@ KRScene::~KRScene() { #if TARGET_OS_IPHONE -void KRScene::render(KRCamera *pCamera, int childOrder[], std::set &visibleBounds, KRContext *pContext, KRMat4 &viewMatrix, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass, std::set &newVisibleBounds) { +void KRScene::render(KRCamera *pCamera, int childOrder[], std::set &visibleBounds, KRContext *pContext, const KRViewport &viewport, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass, std::set &newVisibleBounds) { updateOctree(); pCamera->setSkyBox(m_skyBoxName); // This is temporary until the camera is moved into the scene graph @@ -118,10 +118,10 @@ void KRScene::render(KRCamera *pCamera, int childOrder[], std::set &visi newRemainingOctrees.clear(); newRemainingOctreesTestResults.clear(); for(std::vector::iterator octree_itr = remainingOctrees.begin(); octree_itr != remainingOctrees.end(); octree_itr++) { - render(childOrder, *octree_itr, visibleBounds, pCamera, pContext, viewMatrix, forward_render_light_direction, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass, newRemainingOctrees, newRemainingOctreesTestResults, remainingOctreesTestResultsOnly, newVisibleBounds, false, false); + render(childOrder, *octree_itr, visibleBounds, pCamera, pContext, viewport, forward_render_light_direction, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass, newRemainingOctrees, newRemainingOctreesTestResults, remainingOctreesTestResultsOnly, newVisibleBounds, false, false); } for(std::vector::iterator octree_itr = remainingOctreesTestResults.begin(); octree_itr != remainingOctreesTestResults.end(); octree_itr++) { - render(childOrder, *octree_itr, visibleBounds, pCamera, pContext, viewMatrix, forward_render_light_direction, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass, newRemainingOctrees, newRemainingOctreesTestResults, remainingOctreesTestResultsOnly, newVisibleBounds, true, false); + render(childOrder, *octree_itr, visibleBounds, pCamera, pContext, viewport, forward_render_light_direction, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass, newRemainingOctrees, newRemainingOctreesTestResults, remainingOctreesTestResultsOnly, newVisibleBounds, true, false); } remainingOctrees = newRemainingOctrees; remainingOctreesTestResults = newRemainingOctreesTestResults; @@ -130,16 +130,16 @@ void KRScene::render(KRCamera *pCamera, int childOrder[], std::set &visi newRemainingOctrees.clear(); newRemainingOctreesTestResults.clear(); for(std::vector::iterator octree_itr = remainingOctreesTestResultsOnly.begin(); octree_itr != remainingOctreesTestResultsOnly.end(); octree_itr++) { - render(childOrder, *octree_itr, visibleBounds, pCamera, pContext, viewMatrix, forward_render_light_direction, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass, newRemainingOctrees, newRemainingOctreesTestResults, remainingOctreesTestResultsOnly, newVisibleBounds, true, true); + render(childOrder, *octree_itr, visibleBounds, pCamera, pContext, viewport, forward_render_light_direction, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass, newRemainingOctrees, newRemainingOctreesTestResults, remainingOctreesTestResultsOnly, newVisibleBounds, true, true); } std::set outerNodes = std::set(m_nodeTree.getOuterSceneNodes()); // HACK - Copying the std::set as it is potentially modified as KRNode's update their bounds during the iteration. This is very expensive and will be eliminated in the future. for(std::set::iterator itr=outerNodes.begin(); itr != outerNodes.end(); itr++) { - (*itr)->render(pCamera, pContext, viewMatrix, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); + (*itr)->render(pCamera, pContext, viewport, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); } } -void KRScene::render(int childOrder[], KROctreeNode *pOctreeNode, std::set &visibleBounds, KRCamera *pCamera, KRContext *pContext, KRMat4 &viewMatrix, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass, std::vector &remainingOctrees, std::vector &remainingOctreesTestResults, std::vector &remainingOctreesTestResultsOnly, std::set &newVisibleBounds, bool bOcclusionResultsPass, bool bOcclusionTestResultsOnly) +void KRScene::render(int childOrder[], KROctreeNode *pOctreeNode, std::set &visibleBounds, KRCamera *pCamera, KRContext *pContext, const KRViewport &viewport, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass, std::vector &remainingOctrees, std::vector &remainingOctreesTestResults, std::vector &remainingOctreesTestResultsOnly, std::set &newVisibleBounds, bool bOcclusionResultsPass, bool bOcclusionTestResultsOnly) { if(pOctreeNode) { @@ -170,7 +170,7 @@ void KRScene::render(int childOrder[], KROctreeNode *pOctreeNode, std::setgetProjectionMatrix(); } - KRMat4 matVP = viewMatrix * projectionMatrix; + KRMat4 matVP = viewport.getViewMatrix() * viewport.getProjectionMatrix(); float min_coverage = 0.0f; // 1.0f / 1024.0f / 768.0f; // FINDME - HACK - Need to dynamically select the absolute minimum based on the render buffer size @@ -184,7 +184,7 @@ void KRScene::render(int childOrder[], KROctreeNode *pOctreeNode, std::setgetPerspectiveNearZ()), cameraPos + KRVector3(pCamera->getPerspectiveNearZ())); @@ -233,7 +233,7 @@ void KRScene::render(int childOrder[], KROctreeNode *pOctreeNode, std::setbind(pCamera, matModel, viewMatrix, mvpmatrix, lightDirection, pShadowMatrices, shadowDepthTextures, 0, KRNode::RENDER_PASS_FORWARD_TRANSPARENT)) { + if(pVisShader->bind(viewport, matModel, lightDirection, pShadowMatrices, shadowDepthTextures, 0, KRNode::RENDER_PASS_FORWARD_TRANSPARENT)) { GLDEBUG(glDrawArrays(GL_TRIANGLE_STRIP, 0, 14)); } @@ -286,11 +286,11 @@ void KRScene::render(int childOrder[], KROctreeNode *pOctreeNode, std::set::iterator itr=pOctreeNode->getSceneNodes().begin(); itr != pOctreeNode->getSceneNodes().end(); itr++) { //assert(pOctreeNode->getBounds().contains((*itr)->getBounds())); // Sanity check - (*itr)->render(pCamera, pContext, viewMatrix, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); + (*itr)->render(pCamera, pContext, viewport, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); } for(int i=0; i<8; i++) { - render(childOrder, pOctreeNode->getChildren()[childOrder[i]], visibleBounds, pCamera, pContext, viewMatrix, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass, remainingOctrees, remainingOctreesTestResults, remainingOctreesTestResultsOnly, newVisibleBounds, false, false); + render(childOrder, pOctreeNode->getChildren()[childOrder[i]], visibleBounds, pCamera, pContext, viewport, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass, remainingOctrees, remainingOctreesTestResults, remainingOctreesTestResultsOnly, newVisibleBounds, false, false); } } } diff --git a/KREngine/KREngine/Classes/KRScene.h b/KREngine/KREngine/Classes/KRScene.h index e1178da..a1613f8 100644 --- a/KREngine/KREngine/Classes/KRScene.h +++ b/KREngine/KREngine/Classes/KRScene.h @@ -62,9 +62,9 @@ public: #if TARGET_OS_IPHONE - void render(KRCamera *pCamera, int childOrder[], std::set &visibleBounds, KRContext *pContext, KRMat4 &viewMatrix, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass, std::set &newVisibleBounds); + void render(KRCamera *pCamera, int childOrder[], std::set &visibleBounds, KRContext *pContext, const KRViewport &viewport, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass, std::set &newVisibleBounds); - void render(int childOrder[], KROctreeNode *pOctreeNode, std::set &visibleBounds, KRCamera *pCamera, KRContext *pContext, KRMat4 &viewMatrix, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass, std::vector &remainingOctrees, std::vector &remainingOctreesTestResults, std::vector &remainingOctreesTestResultsOnly, std::set &newVisibleBounds, bool bOcclusionResultsPass, bool bOcclusionTestResultsOnly); + void render(int childOrder[], KROctreeNode *pOctreeNode, std::set &visibleBounds, KRCamera *pCamera, KRContext *pContext, const KRViewport &viewport, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass, std::vector &remainingOctrees, std::vector &remainingOctreesTestResults, std::vector &remainingOctreesTestResultsOnly, std::set &newVisibleBounds, bool bOcclusionResultsPass, bool bOcclusionTestResultsOnly); #endif diff --git a/KREngine/KREngine/Classes/KRShader.cpp b/KREngine/KREngine/Classes/KRShader.cpp index 997138e..91b23b0 100644 --- a/KREngine/KREngine/Classes/KRShader.cpp +++ b/KREngine/KREngine/Classes/KRShader.cpp @@ -200,7 +200,7 @@ KRShader::~KRShader() { #if TARGET_OS_IPHONE -bool KRShader::bind(KRCamera *pCamera, KRMat4 &matModel, KRMat4 &matView, KRMat4 &mvpMatrix, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass) { +bool KRShader::bind(const KRViewport &viewport, const KRMat4 &matModel, const KRVector3 &lightDirection, const KRMat4 *pShadowMatrices, const GLuint *shadowDepthTextures, const int &cShadowBuffers, const KRNode::RenderPass &renderPass) { if(m_iProgram == 0) { return false; } @@ -219,7 +219,7 @@ bool KRShader::bind(KRCamera *pCamera, KRMat4 &matModel, KRMat4 &matView, KRMat4 if(m_uniforms[KRENGINE_UNIFORM_CAMERAPOS_MODEL_SPACE] != -1) { // Transform location of camera to object space for calculation of specular halfVec - KRMat4 inverseViewMatrix = matView; + KRMat4 inverseViewMatrix = viewport.getViewMatrix(); inverseViewMatrix.invert(); KRVector3 cameraPosition = KRMat4::Dot(inverseViewMatrix, KRVector3::Zero()); KRVector3 cameraPosObject = KRMat4::Dot(inverseModelMatrix, cameraPosition); @@ -227,11 +227,20 @@ bool KRShader::bind(KRCamera *pCamera, KRMat4 &matModel, KRMat4 &matView, KRMat4 } } - // Bind our modelmatrix variable to be a uniform called mvpmatrix in our shaderprogram - mvpMatrix.setUniform(m_uniforms[KRENGINE_UNIFORM_MVP]); + if(m_uniforms[KRENGINE_UNIFORM_MVP] != -1 || m_uniforms[KRShader::KRENGINE_UNIFORM_INVMVP] != -1) { + // Bind our modelmatrix variable to be a uniform called mvpmatrix in our shaderprogram + KRMat4 mvpMatrix = matModel * viewport.getViewMatrix() * viewport.getProjectionMatrix(); + mvpMatrix.setUniform(m_uniforms[KRENGINE_UNIFORM_MVP]); + + if(m_uniforms[KRShader::KRENGINE_UNIFORM_INVMVP] != -1) { + KRMat4 matInvMVP = mvpMatrix; + matInvMVP.invert(); + matInvMVP.setUniform(m_uniforms[KRShader::KRENGINE_UNIFORM_INVMVP]); + } + } if(m_uniforms[KRShader::KRENGINE_UNIFORM_LIGHT_POSITION_VIEW_SPACE] != -1 || m_uniforms[KRENGINE_UNIFORM_MODEL_VIEW_INVERSE_TRANSPOSE] != -1) { - KRMat4 matModelView = matModel * matView; + KRMat4 matModelView = matModel * viewport.getViewMatrix(); matModelView.setUniform(m_uniforms[KRShader::KRENGINE_UNIFORM_MODEL_VIEW]); @@ -256,19 +265,13 @@ bool KRShader::bind(KRCamera *pCamera, KRMat4 &matModel, KRMat4 &matView, KRMat4 } if(m_uniforms[KRShader::KRENGINE_UNIFORM_INVP] != -1) { - KRMat4 matInvProjection = pCamera->getProjectionMatrix(); + KRMat4 matInvProjection = viewport.getProjectionMatrix(); matInvProjection.invert(); matInvProjection.setUniform(m_uniforms[KRShader::KRENGINE_UNIFORM_INVP]); } - if(m_uniforms[KRShader::KRENGINE_UNIFORM_INVMVP] != -1) { - KRMat4 matInvMVP = mvpMatrix; - matInvMVP.invert(); - matInvMVP.setUniform(m_uniforms[KRShader::KRENGINE_UNIFORM_INVMVP]); - } - if(m_uniforms[KRShader::KRENGINE_UNIFORM_INVMVP_NO_TRANSLATE] != -1) { - KRMat4 matInvMVPNoTranslate = matModel * matView; + KRMat4 matInvMVPNoTranslate = matModel * viewport.getViewMatrix();; // Remove the translation matInvMVPNoTranslate.getPointer()[3] = 0; matInvMVPNoTranslate.getPointer()[7] = 0; @@ -277,7 +280,7 @@ bool KRShader::bind(KRCamera *pCamera, KRMat4 &matModel, KRMat4 &matView, KRMat4 matInvMVPNoTranslate.getPointer()[13] = 0; matInvMVPNoTranslate.getPointer()[14] = 0; matInvMVPNoTranslate.getPointer()[15] = 1.0; - matInvMVPNoTranslate = matInvMVPNoTranslate * pCamera->getProjectionMatrix(); + matInvMVPNoTranslate = matInvMVPNoTranslate * viewport.getProjectionMatrix(); matInvMVPNoTranslate.invert(); matInvMVPNoTranslate.setUniform(m_uniforms[KRShader::KRENGINE_UNIFORM_INVMVP_NO_TRANSLATE]); } @@ -289,8 +292,8 @@ bool KRShader::bind(KRCamera *pCamera, KRMat4 &matModel, KRMat4 &matView, KRMat4 m_uniforms[KRENGINE_UNIFORM_VIEWPORT], (GLfloat)0.0, (GLfloat)0.0, - (GLfloat)pCamera->getViewportSize().x, - (GLfloat)pCamera->getViewportSize().y + (GLfloat)viewport.getSize().x, + (GLfloat)viewport.getSize().y )); } diff --git a/KREngine/KREngine/Classes/KRShader.h b/KREngine/KREngine/Classes/KRShader.h index 0eecfbf..640fee6 100644 --- a/KREngine/KREngine/Classes/KRShader.h +++ b/KREngine/KREngine/Classes/KRShader.h @@ -35,6 +35,7 @@ #import "KREngine-common.h" + using std::vector; #ifndef KRSHADER_H @@ -44,6 +45,7 @@ using std::vector; #import "KRMat4.h" #import "KRCamera.h" #import "KRNode.h" +#import "KRViewport.h" class KRShader { public: @@ -54,7 +56,7 @@ public: #if TARGET_OS_IPHONE - bool bind(KRCamera *pCamera, KRMat4 &matModel, KRMat4 &matView, KRMat4 &mvpMatrix, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass); + bool bind(const KRViewport &viewport, const KRMat4 &matModel, const KRVector3 &lightDirection, const KRMat4 *pShadowMatrices, const GLuint *shadowDepthTextures, const int &cShadowBuffers, const KRNode::RenderPass &renderPass); #endif diff --git a/KREngine/KREngine/Classes/KRViewport.cpp b/KREngine/KREngine/Classes/KRViewport.cpp new file mode 100644 index 0000000..40bfa04 --- /dev/null +++ b/KREngine/KREngine/Classes/KRViewport.cpp @@ -0,0 +1,72 @@ +// +// KRViewport.cpp +// KREngine +// +// Created by Kearwood Gilbert on 2012-10-25. +// Copyright (c) 2012 Kearwood Software. All rights reserved. +// + +#include "KRVector2.h" +#include "KRMat4.h" +#include "KRViewport.h" + + +KRViewport::KRViewport() +{ + m_size = KRVector2::One(); + m_matProjection = KRMat4(); + m_matView = KRMat4(); +} + +KRViewport::KRViewport(const KRVector2 &size, const KRMat4 &matView, const KRMat4 &matProjection) +{ + m_size = size; + m_matView = matView; + m_matProjection = matProjection; +} + + +KRViewport& KRViewport::operator=(const KRViewport &v) { + if(this != &v) { // Prevent self-assignment. + m_size = v.m_size; + m_matProjection = v.m_matProjection; + m_matView = v.m_matView; + } + return *this; +} + + +KRViewport::~KRViewport() +{ + +} + +const KRVector2 &KRViewport::getSize() const +{ + return m_size; +} + +const KRMat4 &KRViewport::getViewMatrix() const +{ + return m_matView; +} + +const KRMat4 &KRViewport::getProjectionMatrix() const +{ + return m_matProjection; +} + +void KRViewport::setSize(const KRVector2 &size) +{ + m_size = size; +} + +void KRViewport::setViewMatrix(const KRMat4 &matView) +{ + m_matView = matView; +} + +void KRViewport::setProjectionMatrix(const KRMat4 &matProjection) +{ + m_matProjection = matProjection; +} diff --git a/KREngine/KREngine/Classes/KRViewport.h b/KREngine/KREngine/Classes/KRViewport.h new file mode 100644 index 0000000..fb2be5f --- /dev/null +++ b/KREngine/KREngine/Classes/KRViewport.h @@ -0,0 +1,37 @@ +// +// KRViewport.h +// KREngine +// +// Created by Kearwood Gilbert on 2012-10-25. +// Copyright (c) 2012 Kearwood Software. All rights reserved. +// + +#ifndef KRENGINE_KRVIEWPORT_H +#define KRENGINE_KRVIEWPORT_H + +#include "KRVector2.h" +#include "KRMat4.h" + +class KRViewport { +public: + KRViewport(); + KRViewport(const KRVector2 &size, const KRMat4 &matView, const KRMat4 &matProjection); + ~KRViewport(); + + const KRVector2 &getSize() const; + const KRMat4 &getViewMatrix() const; + const KRMat4 &getProjectionMatrix() const; + void setSize(const KRVector2 &size); + void setViewMatrix(const KRMat4 &matView); + void setProjectionMatrix(const KRMat4 &matProjection); + + // Overload assignment operator + KRViewport& operator=(const KRViewport &v); + +private: + KRVector2 m_size; + KRMat4 m_matView; + KRMat4 m_matProjection; +}; + +#endif