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:
kearwood
2012-08-15 21:26:06 +00:00
parent e8ad725d45
commit 29e2181c7e
16 changed files with 997 additions and 1024 deletions

View File

@@ -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;

View File

@@ -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");
}

View File

@@ -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

View File

@@ -14,6 +14,7 @@
#import <stdint.h>
#import <vector>
#import <string>
#import <set>
#ifdef __APPLE__
#include "TargetConditionals.h"

View File

@@ -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

View File

@@ -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;

View File

@@ -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];

View File

@@ -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;

View File

@@ -68,6 +68,7 @@ public:
#endif
KRBoundingVolume getExtents(KRContext *pContext);
double sun_pitch, sun_yaw;
private:
KRDirectionalLight *findFirstDirectionalLight(KRNode &node);

View File

@@ -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];
}

View File

@@ -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);

View File

@@ -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

View File

@@ -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 = @"";
}

View File

@@ -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>

View File

@@ -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)\"",