Refactored many functions out of KREngine.mm into KRCamera.cpp in preparation for alpha transparent polygon sorting structures which will be owned by KRCamera
--HG-- extra : convert_revision : svn%3A7752d6cf-9f14-4ad2-affc-04f1e67b81a5/trunk%4065
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -29,10 +29,14 @@
|
||||
// or implied, of Kearwood Gilbert.
|
||||
//
|
||||
|
||||
#import <string>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <fstream>
|
||||
|
||||
#import "KRVector2.h"
|
||||
#import "KRCamera.h"
|
||||
#import "KRBoundingVolume.h"
|
||||
|
||||
KRCamera::KRCamera() {
|
||||
double const PI = 3.141592653589793f;
|
||||
@@ -79,10 +83,19 @@ KRCamera::KRCamera() {
|
||||
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<long double>::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");
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -86,8 +107,68 @@ public:
|
||||
|
||||
KRVector2 m_viewportSize;
|
||||
|
||||
std::vector<KRInstance *> 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
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#import <stdint.h>
|
||||
#import <vector>
|
||||
#import <string>
|
||||
#import <set>
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include "TargetConditionals.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;
|
||||
|
||||
KRContext m_context;
|
||||
KRCamera m_camera;
|
||||
NSString *debug_text;
|
||||
|
||||
}
|
||||
|
||||
@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
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -42,6 +42,9 @@
|
||||
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() {
|
||||
delete m_pRootNode;
|
||||
|
||||
@@ -68,6 +68,7 @@ public:
|
||||
#endif
|
||||
|
||||
KRBoundingVolume getExtents(KRContext *pContext);
|
||||
double sun_pitch, sun_yaw;
|
||||
private:
|
||||
KRDirectionalLight *findFirstDirectionalLight(KRNode &node);
|
||||
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0430"
|
||||
LastUpgradeVersion = "0440"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
@@ -47,6 +47,7 @@
|
||||
buildConfiguration = "Debug"
|
||||
ignoresPersistentStateOnLaunch = "NO"
|
||||
debugDocumentVersioning = "YES"
|
||||
enableOpenGLFrameCaptureMode = "0"
|
||||
allowLocationSimulation = "YES">
|
||||
<BuildableProductRunnable>
|
||||
<BuildableReference
|
||||
|
||||
@@ -219,10 +219,10 @@
|
||||
break;
|
||||
}
|
||||
NSString *debug_text = [[NSString alloc] initWithUTF8String:szText];
|
||||
[engine setDebugText: debug_text];
|
||||
engine.debug_text = debug_text;
|
||||
[debug_text release];
|
||||
} else {
|
||||
[engine setDebugText: @""];
|
||||
engine.debug_text = @"";
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<key>CFBundleIconFile</key>
|
||||
<string></string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>com.kearwood.${PRODUCT_NAME:rfc1034identifier}2</string>
|
||||
<string>com.kearwood.${PRODUCT_NAME:rfc1034identifier}</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
|
||||
@@ -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)\"",
|
||||
|
||||
Reference in New Issue
Block a user