diff --git a/KREngine/KREngine.xcodeproj/project.pbxproj b/KREngine/KREngine.xcodeproj/project.pbxproj index ac7526a..1a04337 100644 --- a/KREngine/KREngine.xcodeproj/project.pbxproj +++ b/KREngine/KREngine.xcodeproj/project.pbxproj @@ -57,8 +57,6 @@ E46F4A0E155E003000CCF8B8 /* KRDataBlock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E46F4A0D155E003000CCF8B8 /* KRDataBlock.cpp */; }; E46F4A0F155E003000CCF8B8 /* KRDataBlock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E46F4A0D155E003000CCF8B8 /* KRDataBlock.cpp */; }; E46F4A10155E004100CCF8B8 /* KRDataBlock.cpp in Headers */ = {isa = PBXBuildFile; fileRef = E46F4A0D155E003000CCF8B8 /* KRDataBlock.cpp */; settings = {ATTRIBUTES = (Public, ); }; }; - E4769DED158A78B6004B83AC /* flare.fsh in Sources */ = {isa = PBXBuildFile; fileRef = E4769DEC158A78B6004B83AC /* flare.fsh */; }; - E4769DF0158A78C6004B83AC /* flare.vsh in Sources */ = {isa = PBXBuildFile; fileRef = E4769DEF158A78C6004B83AC /* flare.vsh */; }; E47C25A213F4F65A00FF4370 /* KRShaderManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E47C25A113F4F65A00FF4370 /* KRShaderManager.h */; }; E47C25A513F4F66F00FF4370 /* KRShader.h in Headers */ = {isa = PBXBuildFile; fileRef = E47C25A413F4F66F00FF4370 /* KRShader.h */; }; E47C25A713F4F6AB00FF4370 /* KRShaderManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E47C25A613F4F6AB00FF4370 /* KRShaderManager.cpp */; }; @@ -101,8 +99,6 @@ E497B95D151BF05F00D3DC67 /* CoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E497B95C151BF05F00D3DC67 /* CoreServices.framework */; }; E497B95F151BF09600D3DC67 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E497B95E151BF09600D3DC67 /* SystemConfiguration.framework */; }; E49E79FF1512615F009CF99C /* KRMesh.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E49E79FE1512615F009CF99C /* KRMesh.cpp */; }; - E4A9DEBE154120C4009DF363 /* light_point.fsh in Sources */ = {isa = PBXBuildFile; fileRef = E4A9DEBD154120C4009DF363 /* light_point.fsh */; }; - E4A9DEC1154120E8009DF363 /* light_point.vsh in Sources */ = {isa = PBXBuildFile; fileRef = E4A9DEC0154120E8009DF363 /* light_point.vsh */; }; E4B2A4391523B027004CB0EC /* KRMaterial.h in Headers */ = {isa = PBXBuildFile; fileRef = E491017D13C99BDC0098455B /* KRMaterial.h */; settings = {ATTRIBUTES = (Public, ); }; }; E4B2A43B1523B02E004CB0EC /* KRMaterial.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E491017C13C99BDC0098455B /* KRMaterial.cpp */; }; E4BBBB8A1512A40300F43B5B /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = E4BBBB881512A40300F43B5B /* InfoPlist.strings */; }; @@ -117,8 +113,6 @@ E4D13365153767FF0070068C /* KRShaderManager.h in Headers */ = {isa = PBXBuildFile; fileRef = E47C25A113F4F65A00FF4370 /* KRShaderManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; E4D133661537685A0070068C /* KRShader.h in Headers */ = {isa = PBXBuildFile; fileRef = E47C25A413F4F66F00FF4370 /* KRShader.h */; settings = {ATTRIBUTES = (Public, ); }; }; E4D13367153768610070068C /* KRShader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E47C25A813F4F6DD00FF4370 /* KRShader.cpp */; settings = {ATTRIBUTES = (Public, ); }; }; - E4D133BA1538F7480070068C /* light_directional.fsh in Sources */ = {isa = PBXBuildFile; fileRef = E4D133B91538F7480070068C /* light_directional.fsh */; }; - E4D133BC1538F7560070068C /* light_directional.vsh in Sources */ = {isa = PBXBuildFile; fileRef = E4D133BB1538F7560070068C /* light_directional.vsh */; }; E4F711A51512BB56007EE923 /* libfbxsdk-2012.2-static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E4F711A41512BB56007EE923 /* libfbxsdk-2012.2-static.a */; }; E4F975321536220900FD60B2 /* KRNode.h in Headers */ = {isa = PBXBuildFile; fileRef = E4F975311536220900FD60B2 /* KRNode.h */; }; E4F975331536220900FD60B2 /* KRNode.h in Headers */ = {isa = PBXBuildFile; fileRef = E4F975311536220900FD60B2 /* KRNode.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -637,7 +631,7 @@ E491015813C99B9D0098455B /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0430; + LastUpgradeCheck = 0440; ORGANIZATIONNAME = "Kearwood Software"; }; buildConfigurationList = E491015B13C99B9D0098455B /* Build configuration list for PBXProject "KREngine" */; @@ -701,15 +695,9 @@ E46C214515364BC8009CABF3 /* tinyxml2.cpp in Sources */, E46C214B15364DEC009CABF3 /* KRSceneManager.cpp in Sources */, E48C697215374F7E00232E28 /* KRContext.cpp in Sources */, - E4D133BA1538F7480070068C /* light_directional.fsh in Sources */, - E4D133BC1538F7560070068C /* light_directional.vsh in Sources */, - E4A9DEBE154120C4009DF363 /* light_point.fsh in Sources */, - E4A9DEC1154120E8009DF363 /* light_point.vsh in Sources */, E46F4A04155DF47C00CCF8B8 /* KRWorld.cpp in Sources */, E46F4A0E155E003000CCF8B8 /* KRDataBlock.cpp in Sources */, E42CB1F0158446AB0066E0D8 /* KRQuaternion.cpp in Sources */, - E4769DED158A78B6004B83AC /* flare.fsh in Sources */, - E4769DF0158A78C6004B83AC /* flare.vsh in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -835,6 +823,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -876,6 +865,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DYLIB_COMPATIBILITY_VERSION = 1; diff --git a/KREngine/KREngine/Classes/KRCamera.cpp b/KREngine/KREngine/Classes/KRCamera.cpp index bd9febf..2f41c21 100644 --- a/KREngine/KREngine/Classes/KRCamera.cpp +++ b/KREngine/KREngine/Classes/KRCamera.cpp @@ -29,10 +29,14 @@ // or implied, of Kearwood Gilbert. // +#import #include +#include +#include #import "KRVector2.h" #import "KRCamera.h" +#import "KRBoundingVolume.h" KRCamera::KRCamera() { double const PI = 3.141592653589793f; @@ -78,11 +82,20 @@ KRCamera::KRCamera() { bEnableVignette = false; vignette_radius = 0.4f; vignette_falloff = 1.0f; - + + + m_cShadowBuffers = 0; + + memset(shadowFramebuffer, sizeof(GLuint) * 3, 0); + memset(shadowDepthTexture, sizeof(GLuint) * 3, 0); + + m_postShaderProgram = 0; + m_iFrame = 0; } KRCamera::~KRCamera() { - + invalidatePostShader(); + destroyBuffers(); } KRMat4 KRCamera::getProjectionMatrix() { @@ -102,6 +115,785 @@ void KRCamera::setViewportSize(const KRVector2 &size) { KRVector3 KRCamera::getPosition() const { return m_position; } + void KRCamera::setPosition(const KRVector3 &position) { m_position = position; +} + +void KRCamera::renderFrame(KRContext &context, KRScene &scene, KRMat4 &viewMatrix) +{ + KRMat4 invViewMatrix = viewMatrix; + invViewMatrix.invert(); + + KRVector3 cameraPosition = KRMat4::Dot(invViewMatrix, KRVector3(0.0,0.0,0.0)); + + KRVector3 lightDirection(0.0, 0.0, 1.0); + + // ----- Render Model ----- + KRMat4 shadowvp; + shadowvp.rotate(scene.sun_pitch, X_AXIS); + shadowvp.rotate(scene.sun_yaw, Y_AXIS); + lightDirection = KRMat4::Dot(shadowvp, lightDirection); + shadowvp.invert(); + + + lightDirection.normalize(); + + allocateShadowBuffers(); + int iOffset=m_iFrame % m_cShadowBuffers; + for(int iShadow2=iOffset; iShadow2 < m_cShadowBuffers + iOffset; iShadow2++) { + int iShadow = iShadow2 % m_cShadowBuffers; + + + GLfloat shadowMinDepths[3][3] = {{0.0, 0.0, 0.0},{0.0, 0.0, 0.0},{0.0, 0.05, 0.3}}; + GLfloat shadowMaxDepths[3][3] = {{0.0, 0.0, 1.0},{0.1, 0.0, 0.0},{0.1, 0.3, 1.0}}; + + + KRMat4 newShadowMVP; + if(shadowMaxDepths[m_cShadowBuffers - 1][iShadow] == 0.0) { + KRBoundingVolume ext = KRBoundingVolume(scene.getExtents(&context)); + + newShadowMVP = ext.calcShadowProj(&scene, &context, scene.sun_yaw, scene.sun_pitch); + } else { + KRBoundingVolume frustrumSliceVolume = KRBoundingVolume(viewMatrix, perspective_fov, getViewportSize().x / getViewportSize().y, perspective_nearz + (perspective_farz - perspective_nearz) * shadowMinDepths[m_cShadowBuffers - 1][iShadow], perspective_nearz + (perspective_farz - perspective_nearz) * shadowMaxDepths[m_cShadowBuffers - 1][iShadow]); + newShadowMVP = frustrumSliceVolume.calcShadowProj(&scene, &context, scene.sun_yaw, scene.sun_pitch); + } + + if(!(shadowmvpmatrix[iShadow] == newShadowMVP)) { + shadowValid[iShadow] = false; + } + + if(!shadowValid[iShadow]) { + shadowValid[iShadow] = true; + + shadowmvpmatrix[iShadow] = newShadowMVP; + renderShadowBuffer(context, scene, iShadow); + + break; + } + } + + renderFrame(context, scene, viewMatrix, lightDirection, cameraPosition); + renderPost(context); + + m_iFrame++; +} + +void KRCamera::renderFrame(KRContext &context, KRScene &scene, KRMat4 &viewMatrix, KRVector3 &lightDirection, KRVector3 &cameraPosition) { + setViewportSize(KRVector2(backingWidth, backingHeight)); + + KRBoundingVolume frustrumVolume = KRBoundingVolume(viewMatrix, perspective_fov, getViewportSize().x / getViewportSize().y, perspective_nearz, perspective_farz); + if(bEnableDeferredLighting) { + // ----====---- Opaque Geometry, Deferred rendering Pass 1 ----====---- + + // Set render target + glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // Enable backface culling + glCullFace(GL_BACK); + glEnable(GL_CULL_FACE); + + // Enable z-buffer write + glDepthMask(GL_TRUE); + + // Enable z-buffer test + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + glDepthRangef(0.0, 1.0); + + // Disable alpha blending + glDisable(GL_BLEND); + + // Render the geometry + scene.render(this, &context, frustrumVolume, viewMatrix, cameraPosition, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_DEFERRED_GBUFFER); + + // ----====---- Opaque Geometry, Deferred rendering Pass 2 ----====---- + // Set render target + glBindFramebuffer(GL_FRAMEBUFFER, lightAccumulationBuffer); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClear(GL_COLOR_BUFFER_BIT); + + // Enable additive blending + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE); + + // Disable z-buffer write + glDepthMask(GL_FALSE); + + // Set source to buffers from pass 1 + glActiveTexture(GL_TEXTURE6); + glBindTexture(GL_TEXTURE_2D, compositeColorTexture); + glActiveTexture(GL_TEXTURE7); + glBindTexture(GL_TEXTURE_2D, compositeDepthTexture); + + + // Render the geometry + scene.render(this, &context, frustrumVolume, viewMatrix, cameraPosition, lightDirection, shadowmvpmatrix, shadowDepthTexture, 0, KRNode::RENDER_PASS_DEFERRED_LIGHTS); + + // ----====---- Opaque Geometry, Deferred rendering Pass 3 ----====---- + // Set render target + glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0); + + // Disable alpha blending + glDisable(GL_BLEND); + + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT); + + // Set source to buffers from pass 2 + glActiveTexture(GL_TEXTURE6); + glBindTexture(GL_TEXTURE_2D, lightAccumulationTexture); + + // Enable backface culling + glCullFace(GL_BACK); + glEnable(GL_CULL_FACE); + + // Enable z-buffer test + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + glDepthRangef(0.0, 1.0); + + // Enable z-buffer write + glDepthMask(GL_TRUE); + + // Render the geometry + scene.render(this, &context, frustrumVolume, viewMatrix, cameraPosition, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_DEFERRED_OPAQUE); + + // Deactivate source buffer texture units + glActiveTexture(GL_TEXTURE6); + glBindTexture(GL_TEXTURE_2D, 0); + glActiveTexture(GL_TEXTURE7); + glBindTexture(GL_TEXTURE_2D, 0); + } else { + // ----====---- Opaque Geometry, Forward Rendering ----====---- + + // Set render target + glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0); + + // Disable alpha blending + glDisable(GL_BLEND); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); + + // Enable backface culling + glCullFace(GL_BACK); + glEnable(GL_CULL_FACE); + + // Enable z-buffer write + glDepthMask(GL_TRUE); + + // Enable z-buffer test + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + glDepthRangef(0.0, 1.0); + + + + // Render the geometry + scene.render(this, &context, frustrumVolume, viewMatrix, cameraPosition, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_FORWARD_OPAQUE); + } + + // ----====---- Transparent Geometry, Forward Rendering ----====---- + + // Set render target + glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0); + + // Disable backface culling + glDisable(GL_CULL_FACE); + + // Disable z-buffer write + glDepthMask(GL_FALSE); + + // Enable z-buffer test + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); + glDepthRangef(0.0, 1.0); + + // Enable alpha blending + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + // Render all transparent geometry + scene.render(this, &context, frustrumVolume, viewMatrix, cameraPosition, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_FORWARD_TRANSPARENT); + + // ----====---- Flares ----====---- + + // Set render target + glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0); + + // Disable backface culling + glDisable(GL_CULL_FACE); + + // Disable z-buffer write + glDepthMask(GL_FALSE); + + // Disable z-buffer test + glDisable(GL_DEPTH_TEST); + glDepthRangef(0.0, 1.0); + + // Enable additive blending + glEnable(GL_BLEND); + glBlendFunc(GL_ONE, GL_ONE); + + // Render all transparent geometry + scene.render(this, &context, frustrumVolume, viewMatrix, cameraPosition, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_FLARES); + + // Re-enable z-buffer write + glDepthMask(GL_TRUE); + +} + + +void KRCamera::createBuffers() { + // ===== Create offscreen compositing framebuffer object ===== + glGenFramebuffers(1, &compositeFramebuffer); + glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer); + + // ----- Create texture color buffer for compositeFramebuffer ----- + glGenTextures(1, &compositeColorTexture); + glBindTexture(GL_TEXTURE_2D, compositeColorTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // This is necessary for non-power-of-two textures + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // This is necessary for non-power-of-two textures + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, backingWidth, backingHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, compositeColorTexture, 0); + + // ----- Create Depth Texture for compositeFramebuffer ----- + glGenTextures(1, &compositeDepthTexture); + glBindTexture(GL_TEXTURE_2D, compositeDepthTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // This is necessary for non-power-of-two textures + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // This is necessary for non-power-of-two textures + glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, backingWidth, backingHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); + //glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, backingWidth, backingHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); + //glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24_OES, backingWidth, backingHeight); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0); + + // ===== Create offscreen compositing framebuffer object ===== + glGenFramebuffers(1, &lightAccumulationBuffer); + glBindFramebuffer(GL_FRAMEBUFFER, lightAccumulationBuffer); + + // ----- Create texture color buffer for compositeFramebuffer ----- + glGenTextures(1, &lightAccumulationTexture); + glBindTexture(GL_TEXTURE_2D, lightAccumulationTexture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // This is necessary for non-power-of-two textures + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // This is necessary for non-power-of-two textures + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, backingWidth, backingHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, lightAccumulationTexture, 0); + + allocateShadowBuffers(); +} + +void KRCamera::allocateShadowBuffers() { + // First deallocate buffers no longer needed + for(int iShadow = m_cShadowBuffers; iShadow < KRENGINE_MAX_SHADOW_BUFFERS; iShadow++) { + if (shadowDepthTexture[iShadow]) { + glDeleteTextures(1, shadowDepthTexture + iShadow); + shadowDepthTexture[iShadow] = 0; + } + + if (shadowFramebuffer[iShadow]) { + glDeleteFramebuffers(1, shadowFramebuffer + iShadow); + shadowFramebuffer[iShadow] = 0; + } + } + + // Allocate newly required buffers + for(int iShadow = 0; iShadow < m_cShadowBuffers; iShadow++) { + if(!shadowDepthTexture[iShadow]) { + shadowValid[iShadow] = false; + + glGenFramebuffers(1, shadowFramebuffer + iShadow); + glGenTextures(1, shadowDepthTexture + iShadow); + // ===== Create offscreen shadow framebuffer object ===== + + glBindFramebuffer(GL_FRAMEBUFFER, shadowFramebuffer[iShadow]); + + // ----- Create Depth Texture for shadowFramebuffer ----- + glBindTexture(GL_TEXTURE_2D, shadowDepthTexture[iShadow]); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, KRENGINE_SHADOW_MAP_WIDTH, KRENGINE_SHADOW_MAP_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); + + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, shadowDepthTexture[iShadow], 0); + } + } +} + +void KRCamera::destroyBuffers() +{ + m_cShadowBuffers = 0; + allocateShadowBuffers(); + + if (compositeDepthTexture) { + glDeleteTextures(1, &compositeDepthTexture); + compositeDepthTexture = 0; + } + + if (compositeColorTexture) { + glDeleteTextures(1, &compositeColorTexture); + compositeColorTexture = 0; + } + + if (lightAccumulationTexture) { + glDeleteTextures(1, &lightAccumulationTexture); + lightAccumulationTexture = 0; + } + + if (compositeFramebuffer) { + glDeleteFramebuffers(1, &compositeFramebuffer); + compositeFramebuffer = 0; + } + + if (lightAccumulationBuffer) { + glDeleteFramebuffers(1, &lightAccumulationBuffer); + lightAccumulationBuffer = 0; + } +} + + +void KRCamera::renderShadowBuffer(KRContext &context, KRScene &scene, int iShadow) +{ + + glBindFramebuffer(GL_FRAMEBUFFER, shadowFramebuffer[iShadow]); + glClearDepthf(1.0f); + glClear(GL_DEPTH_BUFFER_BIT); + + //glViewport(1, 1, 2046, 2046); + + glDisable(GL_DITHER); + + glCullFace(GL_BACK); // Enable frontface culling, which eliminates some self-cast shadow artifacts + glEnable(GL_CULL_FACE); + + // Enable z-buffer test + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LESS); + glDepthRangef(0.0, 1.0); + + // Disable alpha blending as we are using alpha channel for packed depth info + glDisable(GL_BLEND); + + // Use shader program + glUseProgram(m_shadowShaderProgram); + + // Sets the diffuseTexture variable to the first texture unit + /* + glUniform1i(glGetUniformLocation(m_shadowShaderProgram, "diffuseTexture"), 0); + */ + + // Validate program before drawing. This is a good check, but only really necessary in a debug build. + // DEBUG macro must be defined in your debug configurations if that's not already the case. +#if defined(DEBUG) + if (!ValidateProgram(m_shadowShaderProgram)) { + fprintf(stderr, "Failed to validate program: %d", m_shadowShaderProgram); + return; + } +#endif + + + + // Bind our modelmatrix variable to be a uniform called mvpmatrix in our shaderprogram + glUniformMatrix4fv(m_shadowUniforms[KRENGINE_UNIFORM_SHADOWMVP1], 1, GL_FALSE, shadowmvpmatrix[iShadow].getPointer()); + + + // Calculate the bounding volume of the light map + KRMat4 matInvShadow = shadowmvpmatrix[iShadow]; + matInvShadow.invert(); + + KRVector3 vertices[8]; + vertices[0] = KRVector3(-1.0, -1.0, 0.0); + vertices[1] = KRVector3(1.0, -1.0, 0.0); + vertices[2] = KRVector3(1.0, 1.0, 0.0); + vertices[3] = KRVector3(-1.0, 1.0, 0.0); + vertices[4] = KRVector3(-1.0, -1.0, 1.0); + vertices[5] = KRVector3(1.0, -1.0, 1.0); + vertices[6] = KRVector3(1.0, 1.0, 1.0); + vertices[7] = KRVector3(-1.0, 1.0, 1.0); + + for(int iVertex=0; iVertex < 8; iVertex++) { + vertices[iVertex] = KRMat4::Dot(matInvShadow, vertices[iVertex]); + } + + KRVector3 cameraPosition; + KRVector3 lightDirection; + KRBoundingVolume shadowVolume = KRBoundingVolume(vertices); + scene.render(this, &context, shadowVolume, shadowmvpmatrix[iShadow], cameraPosition, lightDirection, shadowmvpmatrix, NULL, m_cShadowBuffers, KRNode::RENDER_PASS_SHADOWMAP); + glViewport(0, 0, backingWidth, backingHeight); +} + + +bool KRCamera::ValidateProgram(GLuint prog) +{ + GLint logLength, status; + + glValidateProgram(prog); + glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength); + if (logLength > 0) + { + GLchar *log = (GLchar *)malloc(logLength); + glGetProgramInfoLog(prog, logLength, &logLength, log); + fprintf(stderr, "Program validate log:\n%s", log); + free(log); + } + + glGetProgramiv(prog, GL_VALIDATE_STATUS, &status); + if (status == 0) + return false; + + return true; +} + +void KRCamera::renderPost(KRContext &context) +{ + + glBindFramebuffer(GL_FRAMEBUFFER, 1); // renderFramebuffer + + // Disable alpha blending + glDisable(GL_BLEND); + + static const GLfloat squareVertices[] = { + -1.0f, -1.0f, + 1.0f, -1.0f, + -1.0f, 1.0f, + 1.0f, 1.0f, + }; + + static const GLfloat squareVerticesShadow[3][8] = {{ + -1.0f, -1.0f, + -0.60f, -1.0f, + -1.0f, -0.60f, + -0.60f, -0.60f, + },{ + -0.50f, -1.0f, + -0.10f, -1.0f, + -0.50f, -0.60f, + -0.10f, -0.60f, + },{ + 0.00f, -1.0f, + 0.40f, -1.0f, + 0.00f, -0.60f, + 0.40f, -0.60f, + }}; + + static const GLfloat textureVertices[] = { + 0.0f, 0.0f, + 1.0f, 0.0f, + 0.0f, 1.0f, + 1.0f, 1.0f, + }; + + glDisable(GL_DEPTH_TEST); + bindPostShader(context); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, compositeDepthTexture); + glUniform1i(glGetUniformLocation(m_postShaderProgram, "depthFrame"), 0); + + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, compositeColorTexture); + //glBindTexture(GL_TEXTURE_2D, lightAccumulationTexture); + + glUniform1i(glGetUniformLocation(m_postShaderProgram, "renderFrame"), 1); + + // Update attribute values. + glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices); + glEnableVertexAttribArray(KRShader::KRENGINE_ATTRIB_VERTEX); + glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_TEXUVA, 2, GL_FLOAT, 0, 0, textureVertices); + glEnableVertexAttribArray(KRShader::KRENGINE_ATTRIB_TEXUVA); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, 0); + + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, 0); + + + if(bShowShadowBuffer) { + glDisable(GL_DEPTH_TEST); + glUseProgram(m_postShaderProgram); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, compositeDepthTexture); + glUniform1i(glGetUniformLocation(m_postShaderProgram, "depthFrame"), 0); + + + glUniform1i(glGetUniformLocation(m_postShaderProgram, "renderFrame"), 1); + + // Update attribute values. + + glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_TEXUVA, 2, GL_FLOAT, 0, 0, textureVertices); + glEnableVertexAttribArray(KRShader::KRENGINE_ATTRIB_TEXUVA); + + for(int iShadow=0; iShadow < m_cShadowBuffers; iShadow++) { + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, shadowDepthTexture[iShadow]); + glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVerticesShadow[iShadow]); + glEnableVertexAttribArray(KRShader::KRENGINE_ATTRIB_VERTEX); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + } + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, 0); + + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, 0); + } + + + + const char *szText = m_debug_text.c_str(); + if(*szText) { + KRTexture *pFontTexture = context.getTextureManager()->getTexture("font"); + + glDisable(GL_DEPTH_TEST); + glUseProgram(m_postShaderProgram); + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, compositeDepthTexture); + + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, pFontTexture->getName()); + + glUniform1i(glGetUniformLocation(m_postShaderProgram, "depthFrame"), 0); + glUniform1i(glGetUniformLocation(m_postShaderProgram, "renderFrame"), 1); + + const char *pChar = szText; + int iPos=0; + double dScale = 1.0 / 24.0; + double dTexScale = 1.0 / 16.0; + while(*pChar) { + int iChar = *pChar++ - '\0'; + int iCol = iChar % 16; + int iRow = 15 - (iChar - iCol) / 16; + + GLfloat charVertices[] = { + -1.0f, dScale * iPos - 1.0, + -1.0 + dScale, dScale * iPos - 1.0, + -1.0f, dScale * iPos + dScale - 1.0, + -1.0 + dScale, dScale * iPos + dScale - 1.0, + }; + + GLfloat charTexCoords[] = { + dTexScale * iCol, dTexScale * iRow + dTexScale, + dTexScale * iCol, dTexScale * iRow, + dTexScale * iCol + dTexScale, dTexScale * iRow + dTexScale, + dTexScale * iCol + dTexScale, dTexScale * iRow + }; + + glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_TEXUVA, 2, GL_FLOAT, 0, 0, charTexCoords); + glEnableVertexAttribArray(KRShader::KRENGINE_ATTRIB_TEXUVA); + + glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, charVertices); + glEnableVertexAttribArray(KRShader::KRENGINE_ATTRIB_VERTEX); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + + iPos++; + } + + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, 0); + + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_2D, 0); + } + +} + + +void KRCamera::bindPostShader(KRContext &context) +{ + if(!m_postShaderProgram) { + std::stringstream stream; + stream.precision(std::numeric_limits::digits10); + + stream << "#define DOF_QUALITY " << dof_quality; + stream << "\n#define ENABLE_FLASH " << (bEnableFlash ? "1" : "0"); + stream << "\n#define ENABLE_VIGNETTE " << (bEnableVignette ? "1" : "0"); + stream.setf(std::ios::fixed,std::ios::floatfield); + stream << "\n#define DOF_DEPTH " << dof_depth; + stream << "\n#define DOF_FALLOFF " << dof_falloff; + stream << "\n#define FLASH_DEPTH " << flash_depth; + stream << "\n#define FLASH_FALLOFF " << flash_falloff; + stream << "\n#define FLASH_INTENSITY " << flash_intensity; + stream << "\n#define VIGNETTE_RADIUS " << vignette_radius; + stream << "\n#define VIGNETTE_FALLOFF " << vignette_falloff; + + stream << "\n"; + LoadShader(context, "PostShader", &m_postShaderProgram, stream.str()); + } + glUseProgram(m_postShaderProgram); +} + +void KRCamera::invalidatePostShader() +{ + if(m_postShaderProgram) { + glDeleteProgram(m_postShaderProgram); + m_postShaderProgram = 0; + } +} + +void KRCamera::invalidateShadowBuffers() { + for(int i=0; i < m_cShadowBuffers; i++) { + shadowValid[i] = false; + } +} + + +bool KRCamera::LoadShader(KRContext &context, const std::string &name, GLuint *programPointer, const std::string &options) +{ + GLuint vertexShader, fragShader; + + // Create shader program. + *programPointer = glCreateProgram(); + + // Create and compile vertex shader. + + if(!CompileShader(&vertexShader, GL_VERTEX_SHADER, context.getShaderManager()->getVertShaderSource(name), options)) { + fprintf(stderr, "Failed to compile vertex shader"); + return false; + } + + // Create and compile fragment shader. + if(!CompileShader(&fragShader, GL_FRAGMENT_SHADER, context.getShaderManager()->getFragShaderSource(name), options)) { + fprintf(stderr, "Failed to compile fragment shader"); + return false; + } + + // Attach vertex shader to program. + glAttachShader(*programPointer, vertexShader); + + // Attach fragment shader to program. + glAttachShader(*programPointer, fragShader); + + // Bind attribute locations. + // This needs to be done prior to linking. + glBindAttribLocation(*programPointer, KRShader::KRENGINE_ATTRIB_TEXUVB, "vertex_lightmap_uv"); + glBindAttribLocation(*programPointer, KRShader::KRENGINE_ATTRIB_VERTEX, "vertex_position"); + glBindAttribLocation(*programPointer, KRShader::KRENGINE_ATTRIB_NORMAL, "vertex_normal"); + glBindAttribLocation(*programPointer, KRShader::KRENGINE_ATTRIB_TANGENT, "vertex_tangent"); + glBindAttribLocation(*programPointer, KRShader::KRENGINE_ATTRIB_TEXUVA, "vertex_uv"); + + // Link program. + if(!LinkProgram(*programPointer)) { + fprintf(stderr, "Failed to link program: %d", *programPointer); + + if (vertexShader) { + glDeleteShader(vertexShader); + vertexShader = 0; + } + if (fragShader) { + glDeleteShader(fragShader); + fragShader = 0; + } + if (*programPointer) { + glDeleteProgram(*programPointer); + *programPointer = 0; + } + + return false; + } + + // Release vertex and fragment shaders. + if (vertexShader) + { + glDeleteShader(vertexShader); + } + if (fragShader) + { + glDeleteShader(fragShader); + } + + return true; +} + +bool KRCamera::CompileShader(GLuint *shader, GLenum type, const std::string &shader_source, const std::string &options) +{ + GLint status; + const GLchar *source[2]; + + source[0] = (GLchar *)shader_source.c_str(); + if (!source[0]) + { + fprintf(stderr, "Failed to load vertex shader"); + return false; + } + if(options.length()) { + source[1] = source[0]; + source[0] = options.c_str(); + } + + + *shader = glCreateShader(type); + glShaderSource(*shader, options.length() ? 2 : 1, source, NULL); + glCompileShader(*shader); + +#if defined(DEBUG) + GLint logLength; + glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength); + if (logLength > 0) + { + GLchar *log = (GLchar *)malloc(logLength); + glGetShaderInfoLog(*shader, logLength, &logLength, log); + fprintf(stderr, "Shader compile log:\n%s", log); + free(log); + } +#endif + + glGetShaderiv(*shader, GL_COMPILE_STATUS, &status); + if (status == 0) { + glDeleteShader(*shader); + return false; + } + + return true; +} + +bool KRCamera::LinkProgram(GLuint prog) +{ + GLint status; + + glLinkProgram(prog); + +#if defined(DEBUG) + GLint logLength; + glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength); + if (logLength > 0) + { + GLchar *log = (GLchar *)malloc(logLength); + glGetProgramInfoLog(prog, logLength, &logLength, log); + fprintf(stderr, "Program link log:\n%s", log); + free(log); + } +#endif + + glGetProgramiv(prog, GL_LINK_STATUS, &status); + if (status == 0) + return false; + + return true; +} + + +void KRCamera::loadShaders(KRContext &context) +{ + LoadShader(context, "ShadowShader", &m_shadowShaderProgram, ""); + + m_shadowUniforms[KRENGINE_UNIFORM_SHADOWMVP1] = glGetUniformLocation(m_shadowShaderProgram, "shadow_mvp1"); } \ No newline at end of file diff --git a/KREngine/KREngine/Classes/KRCamera.h b/KREngine/KREngine/Classes/KRCamera.h index 76cc46d..e18d815 100644 --- a/KREngine/KREngine/Classes/KRCamera.h +++ b/KREngine/KREngine/Classes/KRCamera.h @@ -37,11 +37,32 @@ #import "KRMat4.h" #import "KRVector2.h" + +#define KRENGINE_MAX_SHADOW_BUFFERS 3 +#define KRENGINE_SHADOW_MAP_WIDTH 2048 +#define KRENGINE_SHADOW_MAP_HEIGHT 2048 + +class KRInstance; +class KRScene; +class KRContext; + class KRCamera { public: KRCamera(); ~KRCamera(); + GLint backingWidth, backingHeight; + + void renderFrame(KRContext &context, KRScene &scene, KRMat4 &viewMatrix); + void renderFrame(KRContext &context, KRScene &scene, KRMat4 &viewMatrix, KRVector3 &lightDirection, KRVector3 &cameraPosition); + void renderShadowBuffer(KRContext &context, KRScene &scene, int iShadow); + void invalidatePostShader(); + void invalidateShadowBuffers(); + void allocateShadowBuffers(); + void createBuffers(); + + void loadShaders(KRContext &context); + KRVector3 getPosition() const; void setPosition(const KRVector3 &position); @@ -85,9 +106,69 @@ public: double vignette_falloff; KRVector2 m_viewportSize; + + std::vector m_transparentInstances; + int m_cShadowBuffers; + + std::string m_debug_text; private: KRVector3 m_position; + + int m_iFrame; + GLuint compositeFramebuffer, compositeDepthTexture, compositeColorTexture; + GLuint lightAccumulationBuffer, lightAccumulationTexture; + + + GLuint shadowFramebuffer[KRENGINE_MAX_SHADOW_BUFFERS], shadowDepthTexture[KRENGINE_MAX_SHADOW_BUFFERS]; + bool shadowValid[KRENGINE_MAX_SHADOW_BUFFERS]; + KRMat4 shadowmvpmatrix[KRENGINE_MAX_SHADOW_BUFFERS]; /* MVP Matrix for view from light source */ + + + // uniform index + enum { + KRENGINE_UNIFORM_MATERIAL_AMBIENT, + KRENGINE_UNIFORM_MATERIAL_DIFFUSE, + KRENGINE_UNIFORM_MATERIAL_SPECULAR, + KRENGINE_UNIFORM_LIGHT_POSITION, + KRENGINE_UNIFORM_LIGHT_POSITION_VIEW_SPACE, + KRENGINE_UNIFORM_LIGHT_DIRECTION, + KRENGINE_UNIFORM_LIGHT_DIRECTION_VIEW_SPACE, + KRENGINE_UNIFORM_LIGHT_COLOR, + KRENGINE_UNIFORM_LIGHT_DECAY_START, + KRENGINE_UNIFORM_LIGHT_CUTOFF, + KRENGINE_UNIFORM_LIGHT_INTENSITY, + KRENGINE_UNIFORM_FLARE_SIZE, + KRENGINE_UNIFORM_MVP, + KRENGINE_UNIFORM_INVP, + KRENGINE_UNIFORM_MN2V, + KRENGINE_UNIFORM_M2V, + KRENGINE_UNIFORM_V2M, + KRENGINE_UNIFORM_SHADOWMVP1, + KRENGINE_UNIFORM_SHADOWMVP2, + KRENGINE_UNIFORM_SHADOWMVP3, + + KRENGINE_UNIFORM_CAMERAPOS, + KRENGINE_UNIFORM_VIEWPORT, + KRENGINE_NUM_UNIFORMS + }; + GLint m_shadowUniforms[KRENGINE_NUM_UNIFORMS]; + + GLuint m_postShaderProgram; + GLuint m_shadowShaderProgram; + + void renderPost(KRContext &context); + void bindPostShader(KRContext &context); + + void destroyBuffers(); + + + // Code using these shader functions will later be refactored to integrate with KRShaderManager + static bool ValidateProgram(GLuint prog); + static bool LoadShader(KRContext &context, const std::string &name, GLuint *programPointer, const std::string &options); + static bool CompileShader(GLuint *shader, GLenum type, const std::string &shader_source, const std::string &options); + static bool LinkProgram(GLuint prog); + }; #endif diff --git a/KREngine/KREngine/Classes/KREngine-common.h b/KREngine/KREngine/Classes/KREngine-common.h index 968515c..c8ec589 100644 --- a/KREngine/KREngine/Classes/KREngine-common.h +++ b/KREngine/KREngine/Classes/KREngine-common.h @@ -14,6 +14,7 @@ #import #import #import +#import #ifdef __APPLE__ #include "TargetConditionals.h" diff --git a/KREngine/KREngine/Classes/KREngine.h b/KREngine/KREngine/Classes/KREngine.h index 4553e25..d923191 100644 --- a/KREngine/KREngine/Classes/KREngine.h +++ b/KREngine/KREngine/Classes/KREngine.h @@ -42,82 +42,21 @@ typedef enum KREngineParameterType {KRENGINE_PARAMETER_INT, KRENGINE_PARAMETER_FLOAT, KRENGINE_PARAMETER_BOOL} KREngineParameterType; -#define KRENGINE_MAX_SHADOW_BUFFERS 3 -#define KRENGINE_SHADOW_MAP_WIDTH 2048 -#define KRENGINE_SHADOW_MAP_HEIGHT 2048 @interface KREngine : NSObject { @private - GLint backingWidth, backingHeight; - - GLuint compositeFramebuffer, compositeDepthTexture, compositeColorTexture; - GLuint lightAccumulationBuffer, lightAccumulationTexture; - - int m_cShadowBuffers; - GLuint shadowFramebuffer[KRENGINE_MAX_SHADOW_BUFFERS], shadowDepthTexture[KRENGINE_MAX_SHADOW_BUFFERS]; - bool shadowValid[KRENGINE_MAX_SHADOW_BUFFERS]; - KRMat4 shadowmvpmatrix[KRENGINE_MAX_SHADOW_BUFFERS]; /* MVP Matrix for view from light source */ - - // uniform index - enum { - KRENGINE_UNIFORM_MATERIAL_AMBIENT, - KRENGINE_UNIFORM_MATERIAL_DIFFUSE, - KRENGINE_UNIFORM_MATERIAL_SPECULAR, - KRENGINE_UNIFORM_LIGHT_POSITION, - KRENGINE_UNIFORM_LIGHT_POSITION_VIEW_SPACE, - KRENGINE_UNIFORM_LIGHT_DIRECTION, - KRENGINE_UNIFORM_LIGHT_DIRECTION_VIEW_SPACE, - KRENGINE_UNIFORM_LIGHT_COLOR, - KRENGINE_UNIFORM_LIGHT_DECAY_START, - KRENGINE_UNIFORM_LIGHT_CUTOFF, - KRENGINE_UNIFORM_LIGHT_INTENSITY, - KRENGINE_UNIFORM_FLARE_SIZE, - KRENGINE_UNIFORM_MVP, - KRENGINE_UNIFORM_INVP, - KRENGINE_UNIFORM_MN2V, - KRENGINE_UNIFORM_M2V, - KRENGINE_UNIFORM_V2M, - KRENGINE_UNIFORM_SHADOWMVP1, - KRENGINE_UNIFORM_SHADOWMVP2, - KRENGINE_UNIFORM_SHADOWMVP3, - - KRENGINE_UNIFORM_CAMERAPOS, - KRENGINE_UNIFORM_VIEWPORT, - KRENGINE_NUM_UNIFORMS - }; - GLint m_shadowUniforms[KRENGINE_NUM_UNIFORMS]; - - GLuint m_postShaderProgram; - GLuint m_shadowShaderProgram; - - KRContext *m_pContext; - - int m_iFrame; - - double sun_pitch, sun_yaw; - - KRCamera m_camera; - NSString *debug_text; - + KRContext m_context; + KRCamera m_camera; } @property(nonatomic, readonly) KRContext *context; +@property(nonatomic, retain) NSString *debug_text; - (id)initForWidth: (GLuint)width Height: (GLuint)height; - -- (BOOL)loadVertexShader:(NSString *)vertexShaderName fragmentShader:(NSString *)fragmentShaderName forProgram:(GLuint *)programPointer withOptions:(NSString *)options; - (BOOL)loadResource:(NSString *)path; -- (void)renderShadowBufferNumber: (int)iShadow ForScene: (KRScene *)pScene; -- (void)renderScene: (KRScene *)pScene WithViewMatrix: (KRMat4)viewMatrix LightDirection: (KRVector3)lightDirection CameraPosition: (KRVector3)cameraPosition; -- (void)invalidateShadowBuffers; -- (void)allocateShadowBuffers; - -- (void)invalidatePostShader; -- (void)bindPostShader; - // Parameter enumeration interface -(int)getParameterCount; -(NSString *)getParameterNameWithIndex: (int)i; @@ -133,7 +72,6 @@ typedef enum KREngineParameterType {KRENGINE_PARAMETER_INT, KRENGINE_PARAMETER_F - (void)renderScene: (KRScene *)pScene WithPosition: (KRVector3)position Yaw: (GLfloat)yaw Pitch: (GLfloat)pitch Roll: (GLfloat)roll; - (void)setNearZ: (double)dNearZ; - (void)setFarZ: (double)dFarZ; -- (void)setDebugText: (NSString *)text; @end diff --git a/KREngine/KREngine/Classes/KREngine.mm b/KREngine/KREngine/Classes/KREngine.mm index 32d7637..6550d83 100644 --- a/KREngine/KREngine/Classes/KREngine.mm +++ b/KREngine/KREngine/Classes/KREngine.mm @@ -44,168 +44,33 @@ using namespace std; @interface KREngine (PrivateMethods) - (BOOL)loadShaders; -- (BOOL)createBuffers; -- (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file; -- (BOOL)linkProgram:(GLuint)prog; -- (BOOL)validateProgram:(GLuint)prog; -- (void)renderPost; - (BOOL)loadResource:(NSString *)path; @end @implementation KREngine -@synthesize context = m_pContext; +@synthesize debug_text = _debug_text; double const PI = 3.141592653589793f; +-(KRContext *)getContext +{ + return &m_context; +} + - (id)initForWidth: (GLuint)width Height: (GLuint)height { - debug_text = [[NSString alloc] init]; - sun_yaw = 4.333; - sun_pitch = 0.55; - m_iFrame = 0; - m_cShadowBuffers = 0; - backingWidth = width; - backingHeight = height; - memset(shadowFramebuffer, sizeof(GLuint) * 3, 0); - memset(shadowDepthTexture, sizeof(GLuint) * 3, 0); - - - m_postShaderProgram = 0; - - - - if ((self = [super init])) { - - m_pContext = new KRContext(); + [self loadShaders]; + m_camera.backingWidth = width; + m_camera.backingHeight = height; + m_camera.createBuffers(); + m_camera.loadShaders(m_context); - if (![self createBuffers] || ![self loadShaders] ) - { - [self release]; - return nil; - } } return self; } -- (void)allocateShadowBuffers -{ - // First deallocate buffers no longer needed - for(int iShadow = m_cShadowBuffers; iShadow < KRENGINE_MAX_SHADOW_BUFFERS; iShadow++) { - if (shadowDepthTexture[iShadow]) { - glDeleteTextures(1, shadowDepthTexture + iShadow); - shadowDepthTexture[iShadow] = 0; - } - - if (shadowFramebuffer[iShadow]) { - glDeleteFramebuffers(1, shadowFramebuffer + iShadow); - shadowFramebuffer[iShadow] = 0; - } - } - - // Allocate newly required buffers - for(int iShadow = 0; iShadow < m_cShadowBuffers; iShadow++) { - if(!shadowDepthTexture[iShadow]) { - shadowValid[iShadow] = false; - - glGenFramebuffers(1, shadowFramebuffer + iShadow); - glGenTextures(1, shadowDepthTexture + iShadow); - // ===== Create offscreen shadow framebuffer object ===== - - glBindFramebuffer(GL_FRAMEBUFFER, shadowFramebuffer[iShadow]); - - // ----- Create Depth Texture for shadowFramebuffer ----- - glBindTexture(GL_TEXTURE_2D, shadowDepthTexture[iShadow]); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, KRENGINE_SHADOW_MAP_WIDTH, KRENGINE_SHADOW_MAP_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); - - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, shadowDepthTexture[iShadow], 0); - } - } -} - -- (BOOL)createBuffers -{ - // ===== Create offscreen compositing framebuffer object ===== - glGenFramebuffers(1, &compositeFramebuffer); - glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer); - - // ----- Create texture color buffer for compositeFramebuffer ----- - glGenTextures(1, &compositeColorTexture); - glBindTexture(GL_TEXTURE_2D, compositeColorTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // This is necessary for non-power-of-two textures - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // This is necessary for non-power-of-two textures - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, backingWidth, backingHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, compositeColorTexture, 0); - - // ----- Create Depth Texture for compositeFramebuffer ----- - glGenTextures(1, &compositeDepthTexture); - glBindTexture(GL_TEXTURE_2D, compositeDepthTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // This is necessary for non-power-of-two textures - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // This is necessary for non-power-of-two textures - glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, backingWidth, backingHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); - //glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT16, backingWidth, backingHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); - //glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24_OES, backingWidth, backingHeight); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0); - - - // ===== Create offscreen compositing framebuffer object ===== - glGenFramebuffers(1, &lightAccumulationBuffer); - glBindFramebuffer(GL_FRAMEBUFFER, lightAccumulationBuffer); - - // ----- Create texture color buffer for compositeFramebuffer ----- - glGenTextures(1, &lightAccumulationTexture); - glBindTexture(GL_TEXTURE_2D, lightAccumulationTexture); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); // This is necessary for non-power-of-two textures - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); // This is necessary for non-power-of-two textures - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, backingWidth, backingHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, lightAccumulationTexture, 0); - - [self allocateShadowBuffers]; - return TRUE; -} - -- (void)destroyBuffers -{ - m_cShadowBuffers = 0; - [self allocateShadowBuffers]; - - if (compositeDepthTexture) { - glDeleteTextures(1, &compositeDepthTexture); - compositeDepthTexture = 0; - } - - if (compositeColorTexture) { - glDeleteTextures(1, &compositeColorTexture); - compositeColorTexture = 0; - } - - if (lightAccumulationTexture) { - glDeleteTextures(1, &lightAccumulationTexture); - lightAccumulationTexture = 0; - } - - if (compositeFramebuffer) { - glDeleteFramebuffers(1, &compositeFramebuffer); - compositeFramebuffer = 0; - } - - if (lightAccumulationBuffer) { - glDeleteFramebuffers(1, &lightAccumulationBuffer); - lightAccumulationBuffer = 0; - } -} - - (void)renderScene: (KRScene *)pScene WithPosition: (KRVector3)position Yaw: (GLfloat)yaw Pitch: (GLfloat)pitch Roll: (GLfloat)roll { KRMat4 viewMatrix; @@ -220,485 +85,8 @@ double const PI = 3.141592653589793f; - (void)renderScene: (KRScene *)pScene WithViewMatrix: (KRMat4)viewMatrix { viewMatrix.rotate(-90 * 0.0174532925199, Z_AXIS); - - KRMat4 invViewMatrix = viewMatrix; - invViewMatrix.invert(); - - KRVector3 cameraPosition = KRMat4::Dot(invViewMatrix, KRVector3(0.0,0.0,0.0)); + m_camera.renderFrame(m_context, *pScene, viewMatrix); - KRVector3 lightDirection(0.0, 0.0, 1.0); - - // ----- Render Model ----- - KRMat4 shadowvp; - shadowvp.rotate(sun_pitch, X_AXIS); - shadowvp.rotate(sun_yaw, Y_AXIS); - lightDirection = KRMat4::Dot(shadowvp, lightDirection); - shadowvp.invert(); - - - lightDirection.normalize(); - - [self allocateShadowBuffers]; - int iOffset=m_iFrame % m_cShadowBuffers; - for(int iShadow2=iOffset; iShadow2 < m_cShadowBuffers + iOffset; iShadow2++) { - int iShadow = iShadow2 % m_cShadowBuffers; - - - GLfloat shadowMinDepths[3][3] = {{0.0, 0.0, 0.0},{0.0, 0.0, 0.0},{0.0, 0.05, 0.3}}; - GLfloat shadowMaxDepths[3][3] = {{0.0, 0.0, 1.0},{0.1, 0.0, 0.0},{0.1, 0.3, 1.0}}; - - - KRMat4 newShadowMVP; - if(shadowMaxDepths[m_cShadowBuffers - 1][iShadow] == 0.0) { - KRBoundingVolume ext = KRBoundingVolume(pScene->getExtents(m_pContext)); - - newShadowMVP = ext.calcShadowProj(pScene, m_pContext, sun_yaw, sun_pitch); - } else { - KRBoundingVolume frustrumSliceVolume = KRBoundingVolume(viewMatrix, m_camera.perspective_fov, m_camera.getViewportSize().x / m_camera.getViewportSize().y, m_camera.perspective_nearz + (m_camera.perspective_farz - m_camera.perspective_nearz) * shadowMinDepths[m_cShadowBuffers - 1][iShadow], m_camera.perspective_nearz + (m_camera.perspective_farz - m_camera.perspective_nearz) * shadowMaxDepths[m_cShadowBuffers - 1][iShadow]); - newShadowMVP = frustrumSliceVolume.calcShadowProj(pScene, m_pContext, sun_yaw, sun_pitch); - } - - if(!(shadowmvpmatrix[iShadow] == newShadowMVP)) { - shadowValid[iShadow] = false; - } - - if(!shadowValid[iShadow]) { - shadowValid[iShadow] = true; - - shadowmvpmatrix[iShadow] = newShadowMVP; - - [self renderShadowBufferNumber: iShadow ForScene: pScene]; - - break; - } - } - - /* - NSLog(@"LightDirection: (%f, %f, %f)", lightDirection.x, lightDirection.y, lightDirection.z); - NSLog(@"CameraPos: (%f, %f, %f)", cameraPos.x, cameraPos.y, cameraPos.z); - NSLog(@"LightPosObject: (%f, %f, %f)", lightPosObject.x, lightPosObject.y, lightPosObject.z); - NSLog(@"CameraPosObject: (%f, %f, %f)", cameraPosObject.x, cameraPosObject.y, cameraPosObject.z); - */ - - [self renderScene: pScene WithViewMatrix: viewMatrix LightDirection: lightDirection CameraPosition: cameraPosition]; - - [self renderPost]; - - m_iFrame++; -} - -- (void)renderShadowBufferNumber: (int)iShadow ForScene: (KRScene *)pScene; -{ - - - glBindFramebuffer(GL_FRAMEBUFFER, shadowFramebuffer[iShadow]); - glClearDepthf(1.0f); - glClear(GL_DEPTH_BUFFER_BIT); - - //glViewport(1, 1, 2046, 2046); - - glDisable(GL_DITHER); - - glCullFace(GL_BACK); // Enable frontface culling, which eliminates some self-cast shadow artifacts - glEnable(GL_CULL_FACE); - - // Enable z-buffer test - glEnable(GL_DEPTH_TEST); - glDepthFunc(GL_LESS); - glDepthRangef(0.0, 1.0); - - // Disable alpha blending as we are using alpha channel for packed depth info - glDisable(GL_BLEND); - - // Use shader program - glUseProgram(m_shadowShaderProgram); - - // Sets the diffuseTexture variable to the first texture unit - /* - glUniform1i(glGetUniformLocation(m_shadowShaderProgram, "diffuseTexture"), 0); - */ - - // Validate program before drawing. This is a good check, but only really necessary in a debug build. - // DEBUG macro must be defined in your debug configurations if that's not already the case. -#if defined(DEBUG) - if (![self validateProgram:m_shadowShaderProgram]) - { - NSLog(@"Failed to validate program: %d", m_shadowShaderProgram); - return; - } -#endif - - - - // Bind our modelmatrix variable to be a uniform called mvpmatrix in our shaderprogram - glUniformMatrix4fv(m_shadowUniforms[KRENGINE_UNIFORM_SHADOWMVP1], 1, GL_FALSE, shadowmvpmatrix[iShadow].getPointer()); - - - // Calculate the bounding volume of the light map - KRMat4 matInvShadow = shadowmvpmatrix[iShadow]; - matInvShadow.invert(); - - KRVector3 vertices[8]; - vertices[0] = KRVector3(-1.0, -1.0, 0.0); - vertices[1] = KRVector3(1.0, -1.0, 0.0); - vertices[2] = KRVector3(1.0, 1.0, 0.0); - vertices[3] = KRVector3(-1.0, 1.0, 0.0); - vertices[4] = KRVector3(-1.0, -1.0, 1.0); - vertices[5] = KRVector3(1.0, -1.0, 1.0); - vertices[6] = KRVector3(1.0, 1.0, 1.0); - vertices[7] = KRVector3(-1.0, 1.0, 1.0); - - for(int iVertex=0; iVertex < 8; iVertex++) { - vertices[iVertex] = KRMat4::Dot(matInvShadow, vertices[iVertex]); - } - - KRVector3 cameraPosition; - KRVector3 lightDirection; - KRBoundingVolume shadowVolume = KRBoundingVolume(vertices); - pScene->render(&m_camera, m_pContext, shadowVolume, shadowmvpmatrix[iShadow], cameraPosition, lightDirection, shadowmvpmatrix, NULL, m_cShadowBuffers, KRNode::RENDER_PASS_SHADOWMAP); - glViewport(0, 0, backingWidth, backingHeight); -} - -- (void)renderScene: (KRScene *)pScene WithViewMatrix: (KRMat4)viewMatrix LightDirection: (KRVector3)lightDirection CameraPosition: (KRVector3)cameraPosition -{ - m_camera.setViewportSize(KRVector2(backingWidth, backingHeight)); - - - - - KRBoundingVolume frustrumVolume = KRBoundingVolume(viewMatrix, m_camera.perspective_fov, m_camera.getViewportSize().x / m_camera.getViewportSize().y, m_camera.perspective_nearz, m_camera.perspective_farz); - if(m_camera.bEnableDeferredLighting) { - // ----====---- Opaque Geometry, Deferred rendering Pass 1 ----====---- - - // Set render target - glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer); - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - // Enable backface culling - glCullFace(GL_BACK); - glEnable(GL_CULL_FACE); - - // Enable z-buffer write - glDepthMask(GL_TRUE); - - // Enable z-buffer test - glEnable(GL_DEPTH_TEST); - glDepthFunc(GL_LEQUAL); - glDepthRangef(0.0, 1.0); - - // Disable alpha blending - glDisable(GL_BLEND); - - // Render the geometry - pScene->render(&m_camera, m_pContext, frustrumVolume, viewMatrix, cameraPosition, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_DEFERRED_GBUFFER); - - // ----====---- Opaque Geometry, Deferred rendering Pass 2 ----====---- - // Set render target - glBindFramebuffer(GL_FRAMEBUFFER, lightAccumulationBuffer); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0); - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glClear(GL_COLOR_BUFFER_BIT); - - // Enable additive blending - glEnable(GL_BLEND); - glBlendFunc(GL_ONE, GL_ONE); - - // Disable z-buffer write - glDepthMask(GL_FALSE); - - // Set source to buffers from pass 1 - glActiveTexture(GL_TEXTURE6); - glBindTexture(GL_TEXTURE_2D, compositeColorTexture); - glActiveTexture(GL_TEXTURE7); - glBindTexture(GL_TEXTURE_2D, compositeDepthTexture); - - - // Render the geometry - pScene->render(&m_camera, m_pContext, frustrumVolume, viewMatrix, cameraPosition, lightDirection, shadowmvpmatrix, shadowDepthTexture, 0, KRNode::RENDER_PASS_DEFERRED_LIGHTS); - - // ----====---- Opaque Geometry, Deferred rendering Pass 3 ----====---- - // Set render target - glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0); - - // Disable alpha blending - glDisable(GL_BLEND); - - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - glClear(GL_COLOR_BUFFER_BIT); - - // Set source to buffers from pass 2 - glActiveTexture(GL_TEXTURE6); - glBindTexture(GL_TEXTURE_2D, lightAccumulationTexture); - - // Enable backface culling - glCullFace(GL_BACK); - glEnable(GL_CULL_FACE); - - // Enable z-buffer test - glEnable(GL_DEPTH_TEST); - glDepthFunc(GL_LEQUAL); - glDepthRangef(0.0, 1.0); - - // Enable z-buffer write - glDepthMask(GL_TRUE); - - // Render the geometry - pScene->render(&m_camera, m_pContext, frustrumVolume, viewMatrix, cameraPosition, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_DEFERRED_OPAQUE); - - // Deactivate source buffer texture units - glActiveTexture(GL_TEXTURE6); - glBindTexture(GL_TEXTURE_2D, 0); - glActiveTexture(GL_TEXTURE7); - glBindTexture(GL_TEXTURE_2D, 0); - } else { - // ----====---- Opaque Geometry, Forward Rendering ----====---- - - // Set render target - glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0); - - // Disable alpha blending - glDisable(GL_BLEND); - - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glClearColor(0.0f, 0.0f, 0.0f, 1.0f); - - // Enable backface culling - glCullFace(GL_BACK); - glEnable(GL_CULL_FACE); - - // Enable z-buffer write - glDepthMask(GL_TRUE); - - // Enable z-buffer test - glEnable(GL_DEPTH_TEST); - glDepthFunc(GL_LEQUAL); - glDepthRangef(0.0, 1.0); - - - - // Render the geometry - pScene->render(&m_camera, m_pContext, frustrumVolume, viewMatrix, cameraPosition, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_FORWARD_OPAQUE); - } - - // ----====---- Transparent Geometry, Forward Rendering ----====---- - - // Set render target - glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0); - - // Disable backface culling - glDisable(GL_CULL_FACE); - - // Disable z-buffer write - glDepthMask(GL_FALSE); - - // Enable z-buffer test - glEnable(GL_DEPTH_TEST); - glDepthFunc(GL_LEQUAL); - glDepthRangef(0.0, 1.0); - - // Enable alpha blending - glEnable(GL_BLEND); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - // Render all transparent geometry - pScene->render(&m_camera, m_pContext, frustrumVolume, viewMatrix, cameraPosition, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_FORWARD_TRANSPARENT); - - // ----====---- Flares ----====---- - - // Set render target - glBindFramebuffer(GL_FRAMEBUFFER, compositeFramebuffer); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, compositeDepthTexture, 0); - - // Disable backface culling - glDisable(GL_CULL_FACE); - - // Disable z-buffer write - glDepthMask(GL_FALSE); - - // Disable z-buffer test - glDisable(GL_DEPTH_TEST); - glDepthRangef(0.0, 1.0); - - // Enable additive blending - glEnable(GL_BLEND); - glBlendFunc(GL_ONE, GL_ONE); - - // Render all transparent geometry - pScene->render(&m_camera, m_pContext, frustrumVolume, viewMatrix, cameraPosition, lightDirection, shadowmvpmatrix, shadowDepthTexture, m_cShadowBuffers, KRNode::RENDER_PASS_FLARES); - - - // Re-enable z-buffer write - glDepthMask(GL_TRUE); -} - -- (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file withOptions: (NSString *)options -{ - GLint status; - const GLchar *source[2]; - - source[0] = (GLchar *)[[NSString stringWithContentsOfFile:file encoding:NSUTF8StringEncoding error:nil] UTF8String]; - if (!source[0]) - { - NSLog(@"Failed to load vertex shader"); - return FALSE; - } - if(options) { - source[1] = source[0]; - source[0] = [options UTF8String]; - } - - - *shader = glCreateShader(type); - glShaderSource(*shader, options ? 2 : 1, source, NULL); - glCompileShader(*shader); - -#if defined(DEBUG) - GLint logLength; - glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength); - if (logLength > 0) - { - GLchar *log = (GLchar *)malloc(logLength); - glGetShaderInfoLog(*shader, logLength, &logLength, log); - NSLog(@"Shader compile log:\n%s", log); - free(log); - } -#endif - - glGetShaderiv(*shader, GL_COMPILE_STATUS, &status); - if (status == 0) { - glDeleteShader(*shader); - return FALSE; - } - - return TRUE; -} - -- (BOOL)linkProgram:(GLuint)prog -{ - GLint status; - - glLinkProgram(prog); - -#if defined(DEBUG) - GLint logLength; - glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength); - if (logLength > 0) - { - GLchar *log = (GLchar *)malloc(logLength); - glGetProgramInfoLog(prog, logLength, &logLength, log); - NSLog(@"Program link log:\n%s", log); - free(log); - } -#endif - - glGetProgramiv(prog, GL_LINK_STATUS, &status); - if (status == 0) - return FALSE; - - return TRUE; -} - -- (BOOL)validateProgram:(GLuint)prog -{ - GLint logLength, status; - - glValidateProgram(prog); - glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength); - if (logLength > 0) - { - GLchar *log = (GLchar *)malloc(logLength); - glGetProgramInfoLog(prog, logLength, &logLength, log); - NSLog(@"Program validate log:\n%s", log); - free(log); - } - - glGetProgramiv(prog, GL_VALIDATE_STATUS, &status); - if (status == 0) - return FALSE; - - return TRUE; -} - - -- (BOOL)loadVertexShader:(NSString *)vertexShaderName fragmentShader:(NSString *)fragmentShaderName forProgram:(GLuint *)programPointer withOptions:(NSString *)options; -{ - GLuint vertexShader, fragShader; - - NSString *vertShaderPathname, *fragShaderPathname; - - // Create shader program. - *programPointer = glCreateProgram(); - - // Create and compile vertex shader. - - vertShaderPathname = [[NSBundle mainBundle] pathForResource:vertexShaderName ofType:@"vsh"]; - if (![self compileShader:&vertexShader type:GL_VERTEX_SHADER file:vertShaderPathname withOptions: options]) - { - NSLog(@"Failed to compile vertex shader"); - return FALSE; - } - - // Create and compile fragment shader. - fragShaderPathname = [[NSBundle mainBundle] pathForResource:fragmentShaderName ofType:@"fsh"]; - if (![self compileShader:&fragShader type:GL_FRAGMENT_SHADER file:fragShaderPathname withOptions: options]) - { - NSLog(@"Failed to compile fragment shader"); - return FALSE; - } - - // Attach vertex shader to program. - glAttachShader(*programPointer, vertexShader); - - // Attach fragment shader to program. - glAttachShader(*programPointer, fragShader); - - // Bind attribute locations. - // This needs to be done prior to linking. - glBindAttribLocation(*programPointer, KRShader::KRENGINE_ATTRIB_TEXUVB, "vertex_lightmap_uv"); - glBindAttribLocation(*programPointer, KRShader::KRENGINE_ATTRIB_VERTEX, "vertex_position"); - glBindAttribLocation(*programPointer, KRShader::KRENGINE_ATTRIB_NORMAL, "vertex_normal"); - glBindAttribLocation(*programPointer, KRShader::KRENGINE_ATTRIB_TANGENT, "vertex_tangent"); - glBindAttribLocation(*programPointer, KRShader::KRENGINE_ATTRIB_TEXUVA, "vertex_uv"); - - // Link program. - if (![self linkProgram:*programPointer]) - { - NSLog(@"Failed to link program: %d", *programPointer); - - if (vertexShader) - { - glDeleteShader(vertexShader); - vertexShader = 0; - } - if (fragShader) - { - glDeleteShader(fragShader); - fragShader = 0; - } - if (*programPointer) - { - glDeleteProgram(*programPointer); - *programPointer = 0; - } - - return FALSE; - } - - // Release vertex and fragment shaders. - if (vertexShader) - { - glDeleteShader(vertexShader); - } - if (fragShader) - { - glDeleteShader(fragShader); - } - - return TRUE; } - (BOOL)loadShaders @@ -708,242 +96,34 @@ double const PI = 3.141592653589793f; for (NSString* fileName in [fileManager contentsOfDirectoryAtPath: bundle_directory error:nil]) { if([fileName hasSuffix: @".vsh"] || [fileName hasSuffix: @".fsh"]) { NSString* path = [NSString stringWithFormat:@"%@/%@", bundle_directory, fileName]; - m_pContext->loadResource([path UTF8String]); + m_context.loadResource([path UTF8String]); } } - - [self loadVertexShader:@"ShadowShader" fragmentShader:@"ShadowShader" forProgram:&m_shadowShaderProgram withOptions: NULL]; - - m_shadowUniforms[KRENGINE_UNIFORM_SHADOWMVP1] = glGetUniformLocation(m_shadowShaderProgram, "shadow_mvp1"); - return TRUE; } - (BOOL)loadResource:(NSString *)path { - m_pContext->loadResource([path UTF8String]); + m_context.loadResource([path UTF8String]); return TRUE; } - (void)dealloc { - if(m_pContext) { - delete m_pContext; - m_pContext = NULL; - } - - [self invalidatePostShader]; - [self destroyBuffers]; - [debug_text release]; - debug_text = nil; [super dealloc]; } -- (void)invalidatePostShader -{ - if(m_postShaderProgram) { - glDeleteProgram(m_postShaderProgram); - m_postShaderProgram = 0; - } -} - -- (void)bindPostShader -{ - if(!m_postShaderProgram) { - stringstream stream; - stream.precision(std::numeric_limits::digits10); - - stream << "#define DOF_QUALITY " << m_camera.dof_quality; - stream << "\n#define ENABLE_FLASH " << (m_camera.bEnableFlash ? "1" : "0"); - stream << "\n#define ENABLE_VIGNETTE " << (m_camera.bEnableVignette ? "1" : "0"); - stream.setf(ios::fixed,ios::floatfield); - stream << "\n#define DOF_DEPTH " << m_camera.dof_depth; - stream << "\n#define DOF_FALLOFF " << m_camera.dof_falloff; - stream << "\n#define FLASH_DEPTH " << m_camera.flash_depth; - stream << "\n#define FLASH_FALLOFF " << m_camera.flash_falloff; - stream << "\n#define FLASH_INTENSITY " << m_camera.flash_intensity; - stream << "\n#define VIGNETTE_RADIUS " << m_camera.vignette_radius; - stream << "\n#define VIGNETTE_FALLOFF " << m_camera.vignette_falloff; - - stream << "\n"; - NSString *options = [NSString stringWithUTF8String: stream.str().c_str()]; - - [self loadVertexShader:@"PostShader" fragmentShader:@"PostShader" forProgram:&m_postShaderProgram withOptions: options]; - } - glUseProgram(m_postShaderProgram); -} - -- (void)renderPost -{ - - glBindFramebuffer(GL_FRAMEBUFFER, 1); // renderFramebuffer - - // Disable alpha blending - glDisable(GL_BLEND); - - static const GLfloat squareVertices[] = { - -1.0f, -1.0f, - 1.0f, -1.0f, - -1.0f, 1.0f, - 1.0f, 1.0f, - }; - - static const GLfloat squareVerticesShadow[3][8] = {{ - -1.0f, -1.0f, - -0.60f, -1.0f, - -1.0f, -0.60f, - -0.60f, -0.60f, - },{ - -0.50f, -1.0f, - -0.10f, -1.0f, - -0.50f, -0.60f, - -0.10f, -0.60f, - },{ - 0.00f, -1.0f, - 0.40f, -1.0f, - 0.00f, -0.60f, - 0.40f, -0.60f, - }}; - - static const GLfloat textureVertices[] = { - 0.0f, 0.0f, - 1.0f, 0.0f, - 0.0f, 1.0f, - 1.0f, 1.0f, - }; - - glDisable(GL_DEPTH_TEST); - [self bindPostShader]; - - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, compositeDepthTexture); - glUniform1i(glGetUniformLocation(m_postShaderProgram, "depthFrame"), 0); - - glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, compositeColorTexture); - //glBindTexture(GL_TEXTURE_2D, lightAccumulationTexture); - - glUniform1i(glGetUniformLocation(m_postShaderProgram, "renderFrame"), 1); - - // Update attribute values. - glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVertices); - glEnableVertexAttribArray(KRShader::KRENGINE_ATTRIB_VERTEX); - glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_TEXUVA, 2, GL_FLOAT, 0, 0, textureVertices); - glEnableVertexAttribArray(KRShader::KRENGINE_ATTRIB_TEXUVA); - - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, 0); - - glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, 0); - - - if(m_camera.bShowShadowBuffer) { - glDisable(GL_DEPTH_TEST); - glUseProgram(m_postShaderProgram); - - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, compositeDepthTexture); - glUniform1i(glGetUniformLocation(m_postShaderProgram, "depthFrame"), 0); - - - glUniform1i(glGetUniformLocation(m_postShaderProgram, "renderFrame"), 1); - - // Update attribute values. - - glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_TEXUVA, 2, GL_FLOAT, 0, 0, textureVertices); - glEnableVertexAttribArray(KRShader::KRENGINE_ATTRIB_TEXUVA); - - for(int iShadow=0; iShadow < m_cShadowBuffers; iShadow++) { - glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, shadowDepthTexture[iShadow]); - glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, squareVerticesShadow[iShadow]); - glEnableVertexAttribArray(KRShader::KRENGINE_ATTRIB_VERTEX); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - } - - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, 0); - - glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, 0); - } - - - - const char *szText = [debug_text UTF8String]; - if(*szText) { - KRTexture *pFontTexture = m_pContext->getTextureManager()->getTexture("font"); - - glDisable(GL_DEPTH_TEST); - glUseProgram(m_postShaderProgram); - - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, compositeDepthTexture); - - glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, pFontTexture->getName()); - - glUniform1i(glGetUniformLocation(m_postShaderProgram, "depthFrame"), 0); - glUniform1i(glGetUniformLocation(m_postShaderProgram, "renderFrame"), 1); - - const char *pChar = szText; - int iPos=0; - double dScale = 1.0 / 24.0; - double dTexScale = 1.0 / 16.0; - while(*pChar) { - int iChar = *pChar++ - '\0'; - int iCol = iChar % 16; - int iRow = 15 - (iChar - iCol) / 16; - - GLfloat charVertices[] = { - -1.0f, dScale * iPos - 1.0, - -1.0 + dScale, dScale * iPos - 1.0, - -1.0f, dScale * iPos + dScale - 1.0, - -1.0 + dScale, dScale * iPos + dScale - 1.0, - }; - - GLfloat charTexCoords[] = { - dTexScale * iCol, dTexScale * iRow + dTexScale, - dTexScale * iCol, dTexScale * iRow, - dTexScale * iCol + dTexScale, dTexScale * iRow + dTexScale, - dTexScale * iCol + dTexScale, dTexScale * iRow - }; - - glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_TEXUVA, 2, GL_FLOAT, 0, 0, charTexCoords); - glEnableVertexAttribArray(KRShader::KRENGINE_ATTRIB_TEXUVA); - - glVertexAttribPointer(KRShader::KRENGINE_ATTRIB_VERTEX, 2, GL_FLOAT, 0, 0, charVertices); - glEnableVertexAttribArray(KRShader::KRENGINE_ATTRIB_VERTEX); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - - iPos++; - } - - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, 0); - - glActiveTexture(GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, 0); - } - -} - -(int)getParameterCount { - return 33; + return 31; } -(NSString *)getParameterNameWithIndex: (int)i { - NSString *parameter_names[33] = { + NSString *parameter_names[31] = { @"camera_fov", - @"sun_direction", - @"sun_attitude", @"shadow_quality", @"enable_per_pixel", @"enable_diffuse_map", @@ -979,10 +159,8 @@ double const PI = 3.141592653589793f; } -(NSString *)getParameterLabelWithIndex: (int)i { - NSString *parameter_labels[33] = { + NSString *parameter_labels[31] = { @"Camera FOV", - @"Sun Direction", - @"Sun Attitude", @"Shadow Quality (0 - 2)", @"Enable per-pixel lighting", @"Enable diffuse map", @@ -1018,10 +196,8 @@ double const PI = 3.141592653589793f; } -(KREngineParameterType)getParameterTypeWithIndex: (int)i { - KREngineParameterType types[33] = { + KREngineParameterType types[31] = { - KRENGINE_PARAMETER_FLOAT, - KRENGINE_PARAMETER_FLOAT, KRENGINE_PARAMETER_FLOAT, KRENGINE_PARAMETER_INT, KRENGINE_PARAMETER_BOOL, @@ -1058,11 +234,9 @@ double const PI = 3.141592653589793f; } -(double)getParameterValueWithIndex: (int)i { - double values[33] = { + double values[31] = { m_camera.perspective_fov, - sun_yaw, - sun_pitch, - (double)m_cShadowBuffers, + (double)m_camera.m_cShadowBuffers, m_camera.bEnablePerPixel ? 1.0f : 0.0f, m_camera.bEnableDiffuseMap ? 1.0f : 0.0f, m_camera.bEnableNormalMap ? 1.0f : 0.0f, @@ -1103,148 +277,136 @@ double const PI = 3.141592653589793f; case 0: // FOV m_camera.perspective_fov = v; break; - case 1: // sun_yaw - if(sun_yaw != v) { - sun_yaw = v; - [self invalidateShadowBuffers]; - } + case 1: // Shadow Quality + m_camera.m_cShadowBuffers = (int)v; break; - case 2: // sun_pitch - if(sun_pitch != v) { - sun_pitch = v; - [self invalidateShadowBuffers]; - } - break; - case 3: // Shadow Quality - m_cShadowBuffers = (int)v; - break; - case 4: + case 2: m_camera.bEnablePerPixel = bNewBoolVal; break; - case 5: + case 3: m_camera.bEnableDiffuseMap = bNewBoolVal; break; - case 6: + case 4: m_camera.bEnableNormalMap = bNewBoolVal; break; - case 7: + case 5: m_camera.bEnableSpecMap = bNewBoolVal; break; - case 8: + case 6: m_camera.bEnableReflectionMap = bNewBoolVal; break; - case 9: + case 7: m_camera.bEnableLightMap = bNewBoolVal; break; - case 10: + case 8: m_camera.dAmbientR = v; break; - case 11: + case 9: m_camera.dAmbientG = v; break; - case 12: + case 10: m_camera.dAmbientB = v; break; - case 13: + case 11: m_camera.dSunR = v; break; - case 14: + case 12: m_camera.dSunG = v; break; - case 15: + case 13: m_camera.dSunB = v; break; - case 16: + case 14: if(m_camera.dof_quality != (int)v) { m_camera.dof_quality = (int)v; - [self invalidatePostShader]; + m_camera.invalidatePostShader(); + } + break; + case 15: + if(m_camera.dof_depth != v) { + m_camera.dof_depth = v; + m_camera.invalidatePostShader(); + } + break; + case 16: + if(m_camera.dof_falloff != v) { + m_camera.dof_falloff = v; + m_camera.invalidatePostShader(); } break; case 17: - if(m_camera.dof_depth != v) { - m_camera.dof_depth = v; - [self invalidatePostShader]; + if(m_camera.bEnableFlash != bNewBoolVal) { + m_camera.bEnableFlash = bNewBoolVal; + m_camera.invalidatePostShader(); } break; case 18: - if(m_camera.dof_falloff != v) { - m_camera.dof_falloff = v; - [self invalidatePostShader]; + if(m_camera.flash_intensity != v) { + m_camera.flash_intensity = v; + m_camera.invalidatePostShader(); } break; case 19: - if(m_camera.bEnableFlash != bNewBoolVal) { - m_camera.bEnableFlash = bNewBoolVal; - [self invalidatePostShader]; + if(m_camera.flash_depth != v) { + m_camera.flash_depth = v; + m_camera.invalidatePostShader(); } break; case 20: - if(m_camera.flash_intensity != v) { - m_camera.flash_intensity = v; - [self invalidatePostShader]; + if(m_camera.flash_falloff != v) { + m_camera.flash_falloff = v; + m_camera.invalidatePostShader(); } break; case 21: - if(m_camera.flash_depth != v) { - m_camera.flash_depth = v; - [self invalidatePostShader]; + if(m_camera.bEnableVignette != bNewBoolVal) { + m_camera.bEnableVignette = bNewBoolVal; + m_camera.invalidatePostShader(); } break; case 22: - if(m_camera.flash_falloff != v) { - m_camera.flash_falloff = v; - [self invalidatePostShader]; + if(m_camera.vignette_radius != v) { + m_camera.vignette_radius = v; + m_camera.invalidatePostShader(); } break; case 23: - if(m_camera.bEnableVignette != bNewBoolVal) { - m_camera.bEnableVignette = bNewBoolVal; - [self invalidatePostShader]; + if(m_camera.vignette_falloff != v) { + m_camera.vignette_falloff = v; + m_camera.invalidatePostShader(); } break; case 24: - if(m_camera.vignette_radius != v) { - m_camera.vignette_radius = v; - [self invalidatePostShader]; - } - break; - case 25: - if(m_camera.vignette_falloff != v) { - m_camera.vignette_falloff = v; - [self invalidatePostShader]; - } - break; - case 26: if(m_camera.bShowShadowBuffer != bNewBoolVal) { m_camera.bShowShadowBuffer = bNewBoolVal; } break; - case 27: + case 25: if(m_camera.bDebugPSSM != bNewBoolVal) { m_camera.bDebugPSSM = bNewBoolVal; } break; - case 28: + case 26: if(m_camera.bEnableAmbient != bNewBoolVal) { m_camera.bEnableAmbient = bNewBoolVal; } break; - case 29: + case 27: if(m_camera.bEnableDiffuse != bNewBoolVal) { m_camera.bEnableDiffuse = bNewBoolVal; } break; - case 30: + case 28: if(m_camera.bEnableSpecular != bNewBoolVal) { m_camera.bEnableSpecular = bNewBoolVal; } break; - case 31: + case 29: if(m_camera.bDebugSuperShiny != bNewBoolVal) { m_camera.bDebugSuperShiny = bNewBoolVal; } break; - case 32: + case 30: if(m_camera.bEnableDeferredLighting != bNewBoolVal) { m_camera.bEnableDeferredLighting = bNewBoolVal; } @@ -1253,13 +415,13 @@ double const PI = 3.141592653589793f; -(double)getParameterMinWithIndex: (int)i { - double minValues[33] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}; + double minValues[31] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f}; return minValues[i]; } -(double)getParameterMaxWithIndex: (int)i { - double maxValues[33] = {PI, 2.0f * PI, PI, 3.0f, 1.0f, 1.0, 1.0f, 1.0f, 1.0f, 1.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f, 2.0f, 1.0f, 1.0f, 1.0f, 5.0f, 1.0f, 0.5f, 1.0f, 2.0f, 2.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}; + double maxValues[31] = {PI, 3.0f, 1.0f, 1.0, 1.0f, 1.0f, 1.0f, 1.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f, 3.0f, 2.0f, 1.0f, 1.0f, 1.0f, 5.0f, 1.0f, 0.5f, 1.0f, 2.0f, 2.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}; return maxValues[i]; } @@ -1273,32 +435,28 @@ double const PI = 3.141592653589793f; } } -- (void)invalidateShadowBuffers { - for(int i=0; i < m_cShadowBuffers; i++) { - shadowValid[i] = false; - } -} - - (void)setNearZ: (double)dNearZ { if(m_camera.perspective_nearz != dNearZ) { m_camera.perspective_nearz = dNearZ; - [self invalidateShadowBuffers]; + m_camera.invalidateShadowBuffers(); } } - (void)setFarZ: (double)dFarZ { if(m_camera.perspective_farz != dFarZ) { m_camera.perspective_farz = dFarZ; - [self invalidateShadowBuffers]; + m_camera.invalidateShadowBuffers(); } } -- (void)setDebugText: (NSString *)text +- (void)setDebug_text:(NSString *)value { - [debug_text release]; - debug_text = [text retain]; + [_debug_text release]; + _debug_text = value; + [_debug_text retain]; + + m_camera.m_debug_text = value.UTF8String; } - @end diff --git a/KREngine/KREngine/Classes/KRMaterial.cpp b/KREngine/KREngine/Classes/KRMaterial.cpp index b207a42..8988ad5 100644 --- a/KREngine/KREngine/Classes/KRMaterial.cpp +++ b/KREngine/KREngine/Classes/KRMaterial.cpp @@ -106,7 +106,7 @@ bool KRMaterial::save(const std::string& path) { fprintf(f, "map_Reflection %s.pvr -s %f %f -o %f %f\n", m_reflectionMap.c_str(), m_reflectionMapScale.x, m_reflectionMapScale.y, m_reflectionMapOffset.x, m_reflectionMapOffset.y); } if(m_bAlphaTest) { - fprintf(f, "alpha_test true"); + fprintf(f, "alpha_mode test"); } fclose(f); return true; diff --git a/KREngine/KREngine/Classes/KRMaterialManager.cpp b/KREngine/KREngine/Classes/KRMaterialManager.cpp index 9500988..b2cd594 100644 --- a/KREngine/KREngine/Classes/KRMaterialManager.cpp +++ b/KREngine/KREngine/Classes/KRMaterialManager.cpp @@ -116,9 +116,9 @@ bool KRMaterialManager::loadFile(const char *szPath) { m_materials[szSymbol[1]] = pMaterial; } if(pMaterial != NULL) { - if(strcmp(szSymbol[0], "alpha_test") == 0) { + if(strcmp(szSymbol[0], "alpha_mode") == 0) { if(cSymbols == 2) { - pMaterial->setAlphaTest(strcmp(szSymbol[1], "true") == 0); + pMaterial->setAlphaTest(strcmp(szSymbol[1], "test") == 0); } } else if(strcmp(szSymbol[0], "Ka") == 0) { char *pScan2 = szSymbol[1]; diff --git a/KREngine/KREngine/Classes/KRScene.cpp b/KREngine/KREngine/Classes/KRScene.cpp index 1f91aa4..6b843c2 100644 --- a/KREngine/KREngine/Classes/KRScene.cpp +++ b/KREngine/KREngine/Classes/KRScene.cpp @@ -42,8 +42,11 @@ KRScene::KRScene(std::string name) : KRResource(name) { m_pFirstDirectionalLight = NULL; m_pRootNode = new KRNode("scene_root"); + + sun_yaw = 4.333; // TODO - Remove temporary testing code + sun_pitch = 0.55; } -KRScene::~KRScene() { +KRScene::~KRScene() { delete m_pRootNode; m_pRootNode = NULL; } diff --git a/KREngine/KREngine/Classes/KRScene.h b/KREngine/KREngine/Classes/KRScene.h index bed5172..2c6877b 100644 --- a/KREngine/KREngine/Classes/KRScene.h +++ b/KREngine/KREngine/Classes/KRScene.h @@ -68,6 +68,7 @@ public: #endif KRBoundingVolume getExtents(KRContext *pContext); + double sun_pitch, sun_yaw; private: KRDirectionalLight *findFirstDirectionalLight(KRNode &node); diff --git a/KREngine/KREngine/Classes/KRShaderManager.cpp b/KREngine/KREngine/Classes/KRShaderManager.cpp index b079c65..d8297ff 100644 --- a/KREngine/KREngine/Classes/KRShaderManager.cpp +++ b/KREngine/KREngine/Classes/KRShaderManager.cpp @@ -135,3 +135,11 @@ void KRShaderManager::loadVertexShader(const std::string &name, const std::strin m_vertShaderSource[name] = string(&bytes[0], fileSize); } + +const std::string &KRShaderManager::getFragShaderSource(const std::string &name) { + return m_fragShaderSource[name]; +} + +const std::string &KRShaderManager::getVertShaderSource(const std::string &name) { + return m_vertShaderSource[name]; +} diff --git a/KREngine/KREngine/Classes/KRShaderManager.h b/KREngine/KREngine/Classes/KRShaderManager.h index 8dca7a1..8c878d6 100644 --- a/KREngine/KREngine/Classes/KRShaderManager.h +++ b/KREngine/KREngine/Classes/KRShaderManager.h @@ -52,6 +52,8 @@ public: void loadFragmentShader(const std::string &name, const std::string &path); void loadVertexShader(const std::string &name, const std::string &path); + const std::string &getFragShaderSource(const std::string &name); + const std::string &getVertShaderSource(const std::string &name); KRShader *getShader(std::string shader_name, KRCamera *pCamera, bool bDiffuseMap, bool bNormalMap, bool bSpecMap, int iShadowQuality, bool bLightMap, bool bDiffuseMapScale,bool bSpecMapScale, bool bNormalMapScale, bool bDiffuseMapOffset, bool bSpecMapOffset, bool bNormalMapOffset, bool bAlphaTest, KRNode::RenderPass renderPass); diff --git a/KRWorldBuilder/KRWorldBuilder.xcodeproj/xcuserdata/kearwood.xcuserdatad/xcschemes/KRWorldBuilder.xcscheme b/KRWorldBuilder/KRWorldBuilder.xcodeproj/xcuserdata/kearwood.xcuserdatad/xcschemes/KRWorldBuilder.xcscheme index 0c7d542..f8c27cf 100644 --- a/KRWorldBuilder/KRWorldBuilder.xcodeproj/xcuserdata/kearwood.xcuserdatad/xcschemes/KRWorldBuilder.xcscheme +++ b/KRWorldBuilder/KRWorldBuilder.xcodeproj/xcuserdata/kearwood.xcuserdatad/xcschemes/KRWorldBuilder.xcscheme @@ -1,6 +1,6 @@ CFBundleIconFile CFBundleIdentifier - com.kearwood.${PRODUCT_NAME:rfc1034identifier}2 + com.kearwood.${PRODUCT_NAME:rfc1034identifier} CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/objview/KRObjView.xcodeproj/project.pbxproj b/objview/KRObjView.xcodeproj/project.pbxproj index a993013..68e432b 100644 --- a/objview/KRObjView.xcodeproj/project.pbxproj +++ b/objview/KRObjView.xcodeproj/project.pbxproj @@ -32,11 +32,8 @@ E4769DF3158A7915004B83AC /* flare.fsh in Resources */ = {isa = PBXBuildFile; fileRef = E4769DF1158A7915004B83AC /* flare.fsh */; }; E4769DF4158A7915004B83AC /* flare.vsh in Resources */ = {isa = PBXBuildFile; fileRef = E4769DF2158A7915004B83AC /* flare.vsh */; }; E49EB29C13806C5D00A4E727 /* MainWindow-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = E49EB29B13806C5D00A4E727 /* MainWindow-iPad.xib */; }; - E4A9DEC615412906009DF363 /* light_point.vsh in Sources */ = {isa = PBXBuildFile; fileRef = E4A9DEC515412906009DF363 /* light_point.vsh */; }; E4A9DEC715412923009DF363 /* light_point.fsh in Resources */ = {isa = PBXBuildFile; fileRef = E4A9DEC2154128F0009DF363 /* light_point.fsh */; }; E4A9DEC815412923009DF363 /* light_point.vsh in Resources */ = {isa = PBXBuildFile; fileRef = E4A9DEC515412906009DF363 /* light_point.vsh */; }; - E4FF48C21538FBF0002053FC /* light_directional.fsh in Sources */ = {isa = PBXBuildFile; fileRef = E4FF48C01538FBF0002053FC /* light_directional.fsh */; }; - E4FF48C31538FBF0002053FC /* light_directional.vsh in Sources */ = {isa = PBXBuildFile; fileRef = E4FF48C11538FBF0002053FC /* light_directional.vsh */; }; E4FF48C51538FBF8002053FC /* light_directional.fsh in Resources */ = {isa = PBXBuildFile; fileRef = E4FF48C01538FBF0002053FC /* light_directional.fsh */; }; E4FF48C61538FBFC002053FC /* light_directional.vsh in Resources */ = {isa = PBXBuildFile; fileRef = E4FF48C11538FBF0002053FC /* light_directional.vsh */; }; /* End PBXBuildFile section */ @@ -306,9 +303,6 @@ 1D3623260D0F684500981E51 /* KRObjViewAppDelegate.mm in Sources */, 28D7ACF80DDB3853001CB0EB /* KRObjViewViewController.mm in Sources */, 1063FC77136D6A1B00EE555B /* KRObjViewGLView.mm in Sources */, - E4FF48C21538FBF0002053FC /* light_directional.fsh in Sources */, - E4FF48C31538FBF0002053FC /* light_directional.vsh in Sources */, - E4A9DEC615412906009DF363 /* light_point.vsh in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -320,6 +314,7 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; CODE_SIGN_IDENTITY = "iPhone Developer: Kearwood Gilbert (G7RHEU3F3A)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Kearwood Gilbert (G7RHEU3F3A)"; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -328,7 +323,7 @@ HEADER_SEARCH_PATHS = ""; "HEADER_SEARCH_PATHS[arch=*]" = ""; INFOPLIST_FILE = "KRObjView-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)\"", @@ -337,6 +332,7 @@ ); PRODUCT_NAME = KRObjView2; PROVISIONING_PROFILE = "833D5E39-C2AD-4221-9136-B9DCF6FF81A1"; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = "833D5E39-C2AD-4221-9136-B9DCF6FF81A1"; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "/Users/kearwood/Documents/dev/svn/kearwood/krengine/KREngine/KREngine/Classes/**"; }; @@ -347,12 +343,13 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; CODE_SIGN_IDENTITY = "iPhone Developer: Kearwood Gilbert (G7RHEU3F3A)"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer: Kearwood Gilbert (G7RHEU3F3A)"; COPY_PHASE_STRIP = YES; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = KRObjView_Prefix.pch; HEADER_SEARCH_PATHS = ""; INFOPLIST_FILE = "KRObjView-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)\"", @@ -361,6 +358,7 @@ ); PRODUCT_NAME = KRObjView2; PROVISIONING_PROFILE = "833D5E39-C2AD-4221-9136-B9DCF6FF81A1"; + "PROVISIONING_PROFILE[sdk=iphoneos*]" = "833D5E39-C2AD-4221-9136-B9DCF6FF81A1"; TARGETED_DEVICE_FAMILY = "1,2"; USER_HEADER_SEARCH_PATHS = "/Users/kearwood/Documents/dev/svn/kearwood/krengine/KREngine/KREngine/Classes/**"; VALIDATE_PRODUCT = YES; @@ -417,7 +415,7 @@ HEADER_SEARCH_PATHS = ""; "HEADER_SEARCH_PATHS[arch=*]" = ""; INFOPLIST_FILE = "KRObjView-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 4.3; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)\"",