diff --git a/KREngine/KREngine/Classes/KRAABB.cpp b/KREngine/KREngine/Classes/KRAABB.cpp index 639ad34..fc9e2d8 100644 --- a/KREngine/KREngine/Classes/KRAABB.cpp +++ b/KREngine/KREngine/Classes/KRAABB.cpp @@ -138,37 +138,6 @@ bool KRAABB::visible(const KRMat4 &matViewProjection) const } } -// for(int iCorner=0; iCorner<8; iCorner++) { -// KRVector3 sourceCornerVertex = KRVector3( -// (iCorner & 1) == 0 ? min.x : max.x, -// (iCorner & 2) == 0 ? min.y : max.y, -// (iCorner & 4) == 0 ? min.z : max.z); -// -// KRVector3 cornerVertex = KRMat4::Dot(matViewProjection, sourceCornerVertex); -// float cornerVertexW = KRMat4::DotW(matViewProjection, sourceCornerVertex); -// cornerVertex /= cornerVertexW; -// -// -// if(cornerVertex.x < -1.0) { -// outside_count[0]++; -// } -// if(cornerVertex.y < -1.0) { -// outside_count[1]++; -// } -// if(cornerVertex.z < -1.0) { -// outside_count[2]++; -// } -// if(cornerVertex.x > 1.0) { -// outside_count[3]++; -// } -// if(cornerVertex.y > 1.0) { -// outside_count[4]++; -// } -// if(cornerVertex.z > 1.0) { -// outside_count[5]++; -// } -// } - bool is_visible = true; for(int iFace=0; iFace < 6; iFace++) { if(outside_count[iFace] == 8) { diff --git a/KREngine/KREngine/Classes/KRCamera.cpp b/KREngine/KREngine/Classes/KRCamera.cpp index 1c95fc1..89a74a4 100644 --- a/KREngine/KREngine/Classes/KRCamera.cpp +++ b/KREngine/KREngine/Classes/KRCamera.cpp @@ -29,8 +29,6 @@ // or implied, of Kearwood Gilbert. // -#define KRENGINE_SWAP_INT(x,y) {int t;t=x;x=y;y=t;} - #import #include #include @@ -206,46 +204,7 @@ void KRCamera::renderFrame(KRScene &scene, KRMat4 &viewMatrix) void KRCamera::renderFrame(KRScene &scene, KRVector3 &lightDirection) { - - 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)); - - - int frontToBackOrder[8]; - int backToFrontOrder[8]; - for(int i=0; i<8; i++) { - frontToBackOrder[i] = i; - } - - if(vecCameraDirection.x > 0.0) { - KRENGINE_SWAP_INT(frontToBackOrder[0], frontToBackOrder[1]); - KRENGINE_SWAP_INT(frontToBackOrder[2], frontToBackOrder[3]); - KRENGINE_SWAP_INT(frontToBackOrder[4], frontToBackOrder[5]); - KRENGINE_SWAP_INT(frontToBackOrder[6], frontToBackOrder[7]); - } - - if(vecCameraDirection.y > 0.0) { - KRENGINE_SWAP_INT(frontToBackOrder[0], frontToBackOrder[2]); - KRENGINE_SWAP_INT(frontToBackOrder[1], frontToBackOrder[3]); - KRENGINE_SWAP_INT(frontToBackOrder[4], frontToBackOrder[6]); - KRENGINE_SWAP_INT(frontToBackOrder[5], frontToBackOrder[7]); - } - - if(vecCameraDirection.z > 0.0) { - KRENGINE_SWAP_INT(frontToBackOrder[0], frontToBackOrder[4]); - KRENGINE_SWAP_INT(frontToBackOrder[1], frontToBackOrder[5]); - KRENGINE_SWAP_INT(frontToBackOrder[2], frontToBackOrder[6]); - KRENGINE_SWAP_INT(frontToBackOrder[3], frontToBackOrder[7]); - } - - - for(int i=0; i<8; i++) { - backToFrontOrder[i] = frontToBackOrder[7-i]; - } - - //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]); + KRVector3 vecCameraDirection = m_viewport.getCameraDirection(); std::set newVisibleBounds; @@ -273,7 +232,7 @@ void KRCamera::renderFrame(KRScene &scene, KRVector3 &lightDirection) { GLDEBUG(glDisable(GL_BLEND)); // Render the geometry - scene.render(this, frontToBackOrder, m_visibleBounds, m_pContext, m_viewport, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_DEFERRED_GBUFFER, newVisibleBounds); + scene.render(this, 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 @@ -299,7 +258,7 @@ void KRCamera::renderFrame(KRScene &scene, KRVector3 &lightDirection) { // Render the geometry - scene.render(this, frontToBackOrder, m_visibleBounds, m_pContext, m_viewport, lightDirection, shadowmvpmatrix, shadowDepthTexture, 0, KRNode::RENDER_PASS_DEFERRED_LIGHTS, newVisibleBounds); + scene.render(this, 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 @@ -331,7 +290,7 @@ void KRCamera::renderFrame(KRScene &scene, KRVector3 &lightDirection) { // 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, m_viewport, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_DEFERRED_OPAQUE, newVisibleBounds); + scene.render(this, 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); @@ -369,7 +328,7 @@ void KRCamera::renderFrame(KRScene &scene, KRVector3 &lightDirection) { // Render the geometry - scene.render(this, frontToBackOrder, m_visibleBounds, m_pContext, m_viewport, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_FORWARD_OPAQUE, newVisibleBounds); + scene.render(this, m_visibleBounds, m_pContext, m_viewport, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_FORWARD_OPAQUE, newVisibleBounds); } // ----====---- Sky Box ----====---- @@ -429,7 +388,7 @@ void KRCamera::renderFrame(KRScene &scene, KRVector3 &lightDirection) { GLDEBUG(glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)); // Render all transparent geometry - scene.render(this, backToFrontOrder, m_visibleBounds, m_pContext, m_viewport, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, newVisibleBounds); + scene.render(this, m_visibleBounds, m_pContext, m_viewport, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_FORWARD_TRANSPARENT, newVisibleBounds); // ----====---- Flares ----====---- @@ -453,7 +412,7 @@ void KRCamera::renderFrame(KRScene &scene, KRVector3 &lightDirection) { GLDEBUG(glBlendFunc(GL_ONE, GL_ONE)); // Render all flares - scene.render(this, backToFrontOrder, m_visibleBounds, m_pContext, m_viewport, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_FLARES, newVisibleBounds); + scene.render(this, m_visibleBounds, m_pContext, m_viewport, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_FLARES, newVisibleBounds); // ----====---- Debug Overlay ----====---- @@ -670,16 +629,9 @@ void KRCamera::renderShadowBuffer(KRScene &scene, int iShadow) KRVector3 lightDirection; KRBoundingVolume shadowVolume = KRBoundingVolume(vertices); - int frontToBackOrder[8]; - int backToFrontOrder[8]; - for(int i=0; i<8; i++) { - frontToBackOrder[i] = i; - } - - std::set 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); + scene.render(this, 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)); diff --git a/KREngine/KREngine/Classes/KRInstance.cpp b/KREngine/KREngine/Classes/KRInstance.cpp index b938ad6..49533ce 100644 --- a/KREngine/KREngine/Classes/KRInstance.cpp +++ b/KREngine/KREngine/Classes/KRInstance.cpp @@ -95,7 +95,7 @@ void KRInstance::render(KRCamera *pCamera, KRContext *pContext, const KRViewport if(renderPass != KRNode::RENDER_PASS_SHADOWMAP) { projectionMatrix = pCamera->getProjectionMatrix(); } - KRMat4 matMVP = m_modelMatrix * viewport.getViewMatrix() * viewport.getProjectionMatrix(); + KRMat4 matMVP = m_modelMatrix * viewport.getViewProjectionMatrix(); float lod_coverage = getBounds().coverage(matMVP, pCamera->getViewportSize()); // This also checks the view frustrum culling if(lod_coverage > m_min_lod_coverage) { diff --git a/KREngine/KREngine/Classes/KRScene.cpp b/KREngine/KREngine/Classes/KRScene.cpp index c486111..ac13fc1 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, const KRViewport &viewport, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass, std::set &newVisibleBounds) { +void KRScene::render(KRCamera *pCamera, 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, viewport, forward_render_light_direction, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass, newRemainingOctrees, newRemainingOctreesTestResults, remainingOctreesTestResultsOnly, newVisibleBounds, false, false); + render(*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, viewport, forward_render_light_direction, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass, newRemainingOctrees, newRemainingOctreesTestResults, remainingOctreesTestResultsOnly, newVisibleBounds, true, false); + render(*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,7 +130,7 @@ 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, viewport, forward_render_light_direction, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass, newRemainingOctrees, newRemainingOctreesTestResults, remainingOctreesTestResultsOnly, newVisibleBounds, true, true); + render(*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. @@ -139,7 +139,7 @@ void KRScene::render(KRCamera *pCamera, int childOrder[], std::set &visi } } -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) +void KRScene::render(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,11 +170,10 @@ void KRScene::render(int childOrder[], KROctreeNode *pOctreeNode, std::setgetProjectionMatrix(); } - 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 - float lod_coverage = pOctreeNode->getBounds().coverage(matVP, pCamera->getViewportSize()); // This also checks the view frustrum culling + float lod_coverage = pOctreeNode->getBounds().coverage(viewport.getViewProjectionMatrix(), pCamera->getViewportSize()); // This also checks the view frustrum culling if(lod_coverage > min_coverage) { // ----====---- Rendering and occlusion test pass ----====---- @@ -184,10 +183,7 @@ void KRScene::render(int childOrder[], KROctreeNode *pOctreeNode, std::setgetPerspectiveNearZ()), cameraPos + KRVector3(pCamera->getPerspectiveNearZ())); + KRAABB cameraExtents = KRAABB(viewport.getCameraPosition() - KRVector3(pCamera->getPerspectiveNearZ()), viewport.getCameraPosition() + KRVector3(pCamera->getPerspectiveNearZ())); bVisible = octreeBounds.intersects(cameraExtents); if(bVisible) { newVisibleBounds.insert(octreeBounds); // Record the actual tests that succeeded during this frame @@ -233,7 +229,7 @@ void KRScene::render(int childOrder[], KROctreeNode *pOctreeNode, std::setrender(pCamera, pContext, viewport, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass); } + const int *childOctreeOrder = renderPass == KRNode::RENDER_PASS_FORWARD_TRANSPARENT || renderPass == KRNode::RENDER_PASS_FLARES ? viewport.getBackToFrontOrder() : viewport.getFrontToBackOrder(); + for(int i=0; i<8; i++) { - render(childOrder, pOctreeNode->getChildren()[childOrder[i]], visibleBounds, pCamera, pContext, viewport, lightDirection, pShadowMatrices, shadowDepthTextures, cShadowBuffers, renderPass, remainingOctrees, remainingOctreesTestResults, remainingOctreesTestResultsOnly, newVisibleBounds, false, false); + render(pOctreeNode->getChildren()[childOctreeOrder[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 a1613f8..fbf1804 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, const KRViewport &viewport, KRVector3 &lightDirection, KRMat4 *pShadowMatrices, GLuint *shadowDepthTextures, int cShadowBuffers, KRNode::RenderPass renderPass, std::set &newVisibleBounds); + void render(KRCamera *pCamera, 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, 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); + void render(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 91b23b0..44d5f15 100644 --- a/KREngine/KREngine/Classes/KRShader.cpp +++ b/KREngine/KREngine/Classes/KRShader.cpp @@ -219,23 +219,18 @@ bool KRShader::bind(const KRViewport &viewport, const KRMat4 &matModel, const KR if(m_uniforms[KRENGINE_UNIFORM_CAMERAPOS_MODEL_SPACE] != -1) { // Transform location of camera to object space for calculation of specular halfVec - KRMat4 inverseViewMatrix = viewport.getViewMatrix(); - inverseViewMatrix.invert(); - KRVector3 cameraPosition = KRMat4::Dot(inverseViewMatrix, KRVector3::Zero()); - KRVector3 cameraPosObject = KRMat4::Dot(inverseModelMatrix, cameraPosition); + KRVector3 cameraPosObject = KRMat4::Dot(inverseModelMatrix, viewport.getCameraPosition()); cameraPosObject.setUniform(m_uniforms[KRENGINE_UNIFORM_CAMERAPOS_MODEL_SPACE]); } } 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(); + KRMat4 mvpMatrix = matModel * viewport.getViewProjectionMatrix(); 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]); + KRMat4::Invert(mvpMatrix).setUniform(m_uniforms[KRShader::KRENGINE_UNIFORM_INVMVP]); } } @@ -265,9 +260,7 @@ bool KRShader::bind(const KRViewport &viewport, const KRMat4 &matModel, const KR } if(m_uniforms[KRShader::KRENGINE_UNIFORM_INVP] != -1) { - KRMat4 matInvProjection = viewport.getProjectionMatrix(); - matInvProjection.invert(); - matInvProjection.setUniform(m_uniforms[KRShader::KRENGINE_UNIFORM_INVP]); + viewport.getInverseProjectionMatrix().setUniform(m_uniforms[KRShader::KRENGINE_UNIFORM_INVP]); } if(m_uniforms[KRShader::KRENGINE_UNIFORM_INVMVP_NO_TRANSLATE] != -1) { diff --git a/KREngine/KREngine/Classes/KRViewport.cpp b/KREngine/KREngine/Classes/KRViewport.cpp index 40bfa04..f64a489 100644 --- a/KREngine/KREngine/Classes/KRViewport.cpp +++ b/KREngine/KREngine/Classes/KRViewport.cpp @@ -6,6 +6,8 @@ // Copyright (c) 2012 Kearwood Software. All rights reserved. // +#define KRENGINE_SWAP_INT(x,y) {int t;t=x;x=y;y=t;} + #include "KRVector2.h" #include "KRMat4.h" #include "KRViewport.h" @@ -16,6 +18,7 @@ KRViewport::KRViewport() m_size = KRVector2::One(); m_matProjection = KRMat4(); m_matView = KRMat4(); + calculateDerivedValues(); } KRViewport::KRViewport(const KRVector2 &size, const KRMat4 &matView, const KRMat4 &matProjection) @@ -23,6 +26,7 @@ KRViewport::KRViewport(const KRVector2 &size, const KRMat4 &matView, const KRMat m_size = size; m_matView = matView; m_matProjection = matProjection; + calculateDerivedValues(); } @@ -31,6 +35,8 @@ KRViewport& KRViewport::operator=(const KRViewport &v) { m_size = v.m_size; m_matProjection = v.m_matProjection; m_matView = v.m_matView; + + calculateDerivedValues(); } return *this; } @@ -64,9 +70,84 @@ void KRViewport::setSize(const KRVector2 &size) void KRViewport::setViewMatrix(const KRMat4 &matView) { m_matView = matView; + calculateDerivedValues(); } void KRViewport::setProjectionMatrix(const KRMat4 &matProjection) { m_matProjection = matProjection; + calculateDerivedValues(); +} + +const KRMat4 &KRViewport::KRViewport::getViewProjectionMatrix() const +{ + return m_matViewProjection; +} + +const KRMat4 &KRViewport::getInverseViewMatrix() const +{ + return m_matInverseView; +} + +const KRMat4 &KRViewport::getInverseProjectionMatrix() const +{ + return m_matInverseProjection; +} + +const KRVector3 &KRViewport::getCameraDirection() const +{ + return m_cameraDirection; +} + +const KRVector3 &KRViewport::getCameraPosition() const +{ + return m_cameraPosition; +} + +const int *KRViewport::getFrontToBackOrder() const +{ + return &m_frontToBackOrder[0]; +} + +const int *KRViewport::getBackToFrontOrder() const +{ + return &m_backToFrontOrder[0]; +} + +void KRViewport::calculateDerivedValues() +{ + m_matViewProjection = m_matView * m_matProjection; + m_matInverseView = KRMat4::Invert(m_matView); + m_matInverseProjection = KRMat4::Invert(m_matProjection); + m_cameraPosition = KRMat4::Dot(m_matInverseView, KRVector3::Zero()); + m_cameraDirection = KRMat4::Dot(m_matInverseView, KRVector3(0.0, 0.0, 1.0)) - KRMat4::Dot(m_matInverseView, KRVector3(0.0, 0.0, 0.0)); + + for(int i=0; i<8; i++) { + m_frontToBackOrder[i] = i; + } + + if(m_cameraDirection.x > 0.0) { + KRENGINE_SWAP_INT(m_frontToBackOrder[0], m_frontToBackOrder[1]); + KRENGINE_SWAP_INT(m_frontToBackOrder[2], m_frontToBackOrder[3]); + KRENGINE_SWAP_INT(m_frontToBackOrder[4], m_frontToBackOrder[5]); + KRENGINE_SWAP_INT(m_frontToBackOrder[6], m_frontToBackOrder[7]); + } + + if(m_cameraDirection.y > 0.0) { + KRENGINE_SWAP_INT(m_frontToBackOrder[0], m_frontToBackOrder[2]); + KRENGINE_SWAP_INT(m_frontToBackOrder[1], m_frontToBackOrder[3]); + KRENGINE_SWAP_INT(m_frontToBackOrder[4], m_frontToBackOrder[6]); + KRENGINE_SWAP_INT(m_frontToBackOrder[5], m_frontToBackOrder[7]); + } + + if(m_cameraDirection.z > 0.0) { + KRENGINE_SWAP_INT(m_frontToBackOrder[0], m_frontToBackOrder[4]); + KRENGINE_SWAP_INT(m_frontToBackOrder[1], m_frontToBackOrder[5]); + KRENGINE_SWAP_INT(m_frontToBackOrder[2], m_frontToBackOrder[6]); + KRENGINE_SWAP_INT(m_frontToBackOrder[3], m_frontToBackOrder[7]); + } + + for(int i=0; i<8; i++) { + m_backToFrontOrder[i] = m_frontToBackOrder[7-i]; + } } diff --git a/KREngine/KREngine/Classes/KRViewport.h b/KREngine/KREngine/Classes/KRViewport.h index fb2be5f..1b130bc 100644 --- a/KREngine/KREngine/Classes/KRViewport.h +++ b/KREngine/KREngine/Classes/KRViewport.h @@ -21,6 +21,13 @@ public: const KRVector2 &getSize() const; const KRMat4 &getViewMatrix() const; const KRMat4 &getProjectionMatrix() const; + const KRMat4 &getViewProjectionMatrix() const; + const KRMat4 &getInverseViewMatrix() const; + const KRMat4 &getInverseProjectionMatrix() const; + const KRVector3 &getCameraDirection() const; + const KRVector3 &getCameraPosition() const; + const int *getFrontToBackOrder() const; + const int *getBackToFrontOrder() const; void setSize(const KRVector2 &size); void setViewMatrix(const KRMat4 &matView); void setProjectionMatrix(const KRMat4 &matProjection); @@ -32,6 +39,19 @@ private: KRVector2 m_size; KRMat4 m_matView; KRMat4 m_matProjection; + + + // Derived values + KRMat4 m_matViewProjection; + KRMat4 m_matInverseView; + KRMat4 m_matInverseProjection; + KRVector3 m_cameraDirection; + KRVector3 m_cameraPosition; + + int m_frontToBackOrder[8]; + int m_backToFrontOrder[8]; + + void calculateDerivedValues(); }; #endif