Updated for XCode 4.5
Cleanup and removal of redundant shader compiling and validation code --HG-- extra : convert_revision : svn%3A7752d6cf-9f14-4ad2-affc-04f1e67b81a5/trunk%40101
This commit is contained in:
@@ -948,7 +948,7 @@
|
||||
GCC_VERSION = com.apple.compilers.llvmgcc42;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 5.0;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
SDKROOT = iphoneos;
|
||||
SKIP_INSTALL = YES;
|
||||
@@ -963,7 +963,7 @@
|
||||
GCC_VERSION = com.apple.compilers.llvmgcc42;
|
||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 4.3;
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 5.0;
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.7;
|
||||
SDKROOT = iphoneos;
|
||||
SKIP_INSTALL = YES;
|
||||
|
||||
@@ -448,7 +448,6 @@ void KRCamera::createBuffers() {
|
||||
GLDEBUG(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, lightAccumulationTexture, 0));
|
||||
|
||||
allocateShadowBuffers();
|
||||
loadShaders();
|
||||
}
|
||||
|
||||
void KRCamera::allocateShadowBuffers() {
|
||||
@@ -544,26 +543,19 @@ void KRCamera::renderShadowBuffer(KRScene &scene, int iShadow)
|
||||
GLDEBUG(glDisable(GL_BLEND));
|
||||
|
||||
// Use shader program
|
||||
GLDEBUG(glUseProgram(m_shadowShaderProgram));
|
||||
KRShader *shadowShader = m_pContext->getShaderManager()->getShader("ShadowShader", this, false, false, false, 0, false, false, false, false, false, false, false, false, false, KRNode::RENDER_PASS_FORWARD_TRANSPARENT);
|
||||
KRMat4 matIdentity; // Value not used by postshader
|
||||
KRVector3 vec4Temp; // Value not used by postshader
|
||||
shadowShader->bind(this, matIdentity, matIdentity, m_position, vec4Temp, NULL, NULL, 0, KRNode::RENDER_PASS_FORWARD_TRANSPARENT);
|
||||
|
||||
// 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
|
||||
GLDEBUG(glUniformMatrix4fv(m_shadowUniforms[KRENGINE_UNIFORM_SHADOWMVP1], 1, GL_FALSE, shadowmvpmatrix[iShadow].getPointer()));
|
||||
GLDEBUG(glUniformMatrix4fv(shadowShader->m_uniforms[KRShader::KRENGINE_UNIFORM_SHADOWMVP1], 1, GL_FALSE, shadowmvpmatrix[iShadow].getPointer()));
|
||||
|
||||
|
||||
// Calculate the bounding volume of the light map
|
||||
@@ -592,28 +584,6 @@ void KRCamera::renderShadowBuffer(KRScene &scene, int iShadow)
|
||||
GLDEBUG(glViewport(0, 0, backingWidth, backingHeight));
|
||||
}
|
||||
|
||||
|
||||
bool KRCamera::ValidateProgram(GLuint prog)
|
||||
{
|
||||
GLint logLength, status;
|
||||
|
||||
GLDEBUG(glValidateProgram(prog));
|
||||
GLDEBUG(glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength));
|
||||
if (logLength > 0)
|
||||
{
|
||||
GLchar *log = (GLchar *)malloc(logLength);
|
||||
GLDEBUG(glGetProgramInfoLog(prog, logLength, &logLength, log));
|
||||
fprintf(stderr, "Program validate log:\n%s", log);
|
||||
free(log);
|
||||
}
|
||||
|
||||
GLDEBUG(glGetProgramiv(prog, GL_VALIDATE_STATUS, &status));
|
||||
if (status == 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void KRCamera::renderPost()
|
||||
{
|
||||
|
||||
@@ -760,150 +730,6 @@ void KRCamera::invalidateShadowBuffers() {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
bool KRCamera::LoadShader(KRContext &context, const std::string &name, GLuint *programPointer, const std::string &options)
|
||||
{
|
||||
GLuint vertexShader, fragShader;
|
||||
|
||||
// Create shader program.
|
||||
GLDEBUG(*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.
|
||||
GLDEBUG(glAttachShader(*programPointer, vertexShader));
|
||||
|
||||
// Attach fragment shader to program.
|
||||
GLDEBUG(glAttachShader(*programPointer, fragShader));
|
||||
|
||||
// Bind attribute locations.
|
||||
// This needs to be done prior to linking.
|
||||
GLDEBUG(glBindAttribLocation(*programPointer, KRShader::KRENGINE_ATTRIB_TEXUVB, "vertex_lightmap_uv"));
|
||||
GLDEBUG(glBindAttribLocation(*programPointer, KRShader::KRENGINE_ATTRIB_VERTEX, "vertex_position"));
|
||||
GLDEBUG(glBindAttribLocation(*programPointer, KRShader::KRENGINE_ATTRIB_NORMAL, "vertex_normal"));
|
||||
GLDEBUG(glBindAttribLocation(*programPointer, KRShader::KRENGINE_ATTRIB_TANGENT, "vertex_tangent"));
|
||||
GLDEBUG(glBindAttribLocation(*programPointer, KRShader::KRENGINE_ATTRIB_TEXUVA, "vertex_uv"));
|
||||
|
||||
// Link program.
|
||||
if(!LinkProgram(*programPointer)) {
|
||||
fprintf(stderr, "Failed to link program: %d", *programPointer);
|
||||
|
||||
if (vertexShader) {
|
||||
GLDEBUG(glDeleteShader(vertexShader));
|
||||
vertexShader = 0;
|
||||
}
|
||||
if (fragShader) {
|
||||
GLDEBUG(glDeleteShader(fragShader));
|
||||
fragShader = 0;
|
||||
}
|
||||
if (*programPointer) {
|
||||
GLDEBUG(glDeleteProgram(*programPointer));
|
||||
*programPointer = 0;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Release vertex and fragment shaders.
|
||||
if (vertexShader)
|
||||
{
|
||||
GLDEBUG(glDeleteShader(vertexShader));
|
||||
}
|
||||
if (fragShader)
|
||||
{
|
||||
GLDEBUG(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();
|
||||
}
|
||||
|
||||
|
||||
GLDEBUG(*shader = glCreateShader(type));
|
||||
GLDEBUG(glShaderSource(*shader, options.length() ? 2 : 1, source, NULL));
|
||||
GLDEBUG(glCompileShader(*shader));
|
||||
|
||||
#if defined(DEBUG)
|
||||
GLint logLength;
|
||||
GLDEBUG(glGetShaderiv(*shader, GL_INFO_LOG_LENGTH, &logLength));
|
||||
if (logLength > 0)
|
||||
{
|
||||
GLchar *log = (GLchar *)malloc(logLength);
|
||||
GLDEBUG(glGetShaderInfoLog(*shader, logLength, &logLength, log));
|
||||
fprintf(stderr, "Shader compile log:\n%s", log);
|
||||
free(log);
|
||||
}
|
||||
#endif
|
||||
|
||||
GLDEBUG(glGetShaderiv(*shader, GL_COMPILE_STATUS, &status));
|
||||
if (status == 0) {
|
||||
GLDEBUG(glDeleteShader(*shader));
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool KRCamera::LinkProgram(GLuint prog)
|
||||
{
|
||||
GLint status;
|
||||
|
||||
GLDEBUG(glLinkProgram(prog));
|
||||
|
||||
#if defined(DEBUG)
|
||||
GLint logLength;
|
||||
GLDEBUG(glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &logLength));
|
||||
if (logLength > 0)
|
||||
{
|
||||
GLchar *log = (GLchar *)malloc(logLength);
|
||||
GLDEBUG(glGetProgramInfoLog(prog, logLength, &logLength, log));
|
||||
fprintf(stderr, "Program link log:\n%s", log);
|
||||
free(log);
|
||||
}
|
||||
#endif
|
||||
|
||||
GLDEBUG(glGetProgramiv(prog, GL_LINK_STATUS, &status));
|
||||
if (status == 0)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void KRCamera::loadShaders()
|
||||
{
|
||||
LoadShader(*m_pContext, "ShadowShader", &m_shadowShaderProgram, "");
|
||||
|
||||
m_shadowUniforms[KRENGINE_UNIFORM_SHADOWMVP1] = glGetUniformLocation(m_shadowShaderProgram, "shadow_mvp1");
|
||||
}
|
||||
|
||||
|
||||
void KRCamera::notify_sceneGraphCreate(KRNode *pNode)
|
||||
{
|
||||
fprintf(stderr, "KRCamera - notify_sceneGraphCreate");
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#import "KRVector2.h"
|
||||
#import "KRNotified.h"
|
||||
#import "KRAABB.h"
|
||||
#import "KRShader.h"
|
||||
|
||||
|
||||
#define KRENGINE_MAX_SHADOW_BUFFERS 3
|
||||
@@ -127,51 +128,15 @@ private:
|
||||
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_shadowShaderProgram;
|
||||
|
||||
void renderPost();
|
||||
|
||||
void destroyBuffers();
|
||||
|
||||
void renderFrame(KRScene &scene, KRMat4 &viewMatrix, KRVector3 &lightDirection, KRVector3 &cameraPosition);
|
||||
|
||||
void loadShaders();
|
||||
|
||||
// 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);
|
||||
|
||||
|
||||
|
||||
|
||||
class KRInstanceDistance {
|
||||
|
||||
@@ -77,7 +77,7 @@ void KRContext::loadResource(const std::string &file_name, KRDataBlock *data) {
|
||||
std::string name = KRResource::GetFileBase(file_name);
|
||||
std::string extension = KRResource::GetFileExtension(file_name);
|
||||
|
||||
fprintf(stderr, "KRContext::loadResource - Loading: %s\n", file_name.c_str());
|
||||
//fprintf(stderr, "KRContext::loadResource - Loading: %s\n", file_name.c_str());
|
||||
|
||||
if(extension.compare("krbundle") == 0) {
|
||||
m_pBundleManager->loadBundle(name.c_str(), data);
|
||||
|
||||
@@ -107,7 +107,7 @@ vector<KRMesh::Submesh *> KRMesh::getSubmeshes() {
|
||||
return m_submeshes;
|
||||
}
|
||||
|
||||
void KRMesh::renderSubmesh(int iSubmesh, int &iPrevBuffer) {
|
||||
void KRMesh::renderSubmesh(int iSubmesh) {
|
||||
VertexData *pVertexData = getVertexData();
|
||||
|
||||
pack_header *pHeader = (pack_header *)m_pData->getStart();
|
||||
@@ -122,15 +122,14 @@ void KRMesh::renderSubmesh(int iSubmesh, int &iPrevBuffer) {
|
||||
int cVertexes = pSubmesh->vertex_count;
|
||||
while(cVertexes > 0) {
|
||||
GLsizei cBufferVertexes = iBuffer < cBuffers - 1 ? MAX_VBO_SIZE : pHeader->vertex_count % MAX_VBO_SIZE;
|
||||
if(iPrevBuffer != iBuffer) {
|
||||
assert(pVertexData + iBuffer * MAX_VBO_SIZE >= m_pData->getStart());
|
||||
int vertex_size = sizeof(VertexData) ;
|
||||
void *vbo_end = (unsigned char *)pVertexData + iBuffer * MAX_VBO_SIZE + vertex_size * cBufferVertexes;
|
||||
void *buffer_end = m_pData->getEnd();
|
||||
assert(vbo_end <= buffer_end);
|
||||
m_pContext->getModelManager()->bindVBO((unsigned char *)pVertexData + iBuffer * MAX_VBO_SIZE, sizeof(VertexData) * cBufferVertexes, true, true, true, true, true);
|
||||
}
|
||||
iPrevBuffer = iBuffer;
|
||||
|
||||
assert(pVertexData + iBuffer * MAX_VBO_SIZE >= m_pData->getStart());
|
||||
int vertex_size = sizeof(VertexData) ;
|
||||
void *vbo_end = (unsigned char *)pVertexData + iBuffer * MAX_VBO_SIZE + vertex_size * cBufferVertexes;
|
||||
void *buffer_end = m_pData->getEnd();
|
||||
assert(vbo_end <= buffer_end);
|
||||
m_pContext->getModelManager()->bindVBO((unsigned char *)pVertexData + iBuffer * MAX_VBO_SIZE, vertex_size * cBufferVertexes, true, true, true, true, true);
|
||||
|
||||
|
||||
if(iVertex + cVertexes >= MAX_VBO_SIZE) {
|
||||
assert(iVertex + (MAX_VBO_SIZE - iVertex) <= cBufferVertexes);
|
||||
|
||||
@@ -69,7 +69,7 @@ public:
|
||||
void loadPack(KRDataBlock *data);
|
||||
|
||||
|
||||
void renderSubmesh(int iSubmesh, int &iPrevBuffer);
|
||||
void renderSubmesh(int iSubmesh);
|
||||
|
||||
GLfloat getMaxDimension();
|
||||
|
||||
|
||||
@@ -93,7 +93,6 @@ void KRModel::render(KRCamera *pCamera, KRContext *pContext, KRMat4 &matModelToV
|
||||
}
|
||||
|
||||
KRMaterial *pPrevBoundMaterial = NULL;
|
||||
int iPrevBuffer = -1;
|
||||
char szPrevShaderKey[128];
|
||||
szPrevShaderKey[0] = '\0';
|
||||
int cSubmeshes = m_pMesh->getSubmeshes().size();
|
||||
@@ -105,7 +104,7 @@ void KRModel::render(KRCamera *pCamera, KRContext *pContext, KRMat4 &matModelToV
|
||||
|
||||
if(!pMaterial->isTransparent()) {
|
||||
// Exclude transparent and semi-transparent meshes from shadow maps
|
||||
m_pMesh->renderSubmesh(iSubmesh, iPrevBuffer);
|
||||
m_pMesh->renderSubmesh(iSubmesh);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -123,19 +122,19 @@ void KRModel::render(KRCamera *pCamera, KRContext *pContext, KRMat4 &matModelToV
|
||||
switch(pMaterial->getAlphaMode()) {
|
||||
case KRMaterial::KRMATERIAL_ALPHA_MODE_OPAQUE: // Non-transparent materials
|
||||
case KRMaterial::KRMATERIAL_ALPHA_MODE_TEST: // Alpha in diffuse texture is interpreted as punch-through when < 0.5
|
||||
m_pMesh->renderSubmesh(iSubmesh, iPrevBuffer);
|
||||
m_pMesh->renderSubmesh(iSubmesh);
|
||||
break;
|
||||
case KRMaterial::KRMATERIAL_ALPHA_MODE_BLENDONESIDE: // Blended alpha with backface culling
|
||||
m_pMesh->renderSubmesh(iSubmesh, iPrevBuffer);
|
||||
m_pMesh->renderSubmesh(iSubmesh);
|
||||
break;
|
||||
case KRMaterial::KRMATERIAL_ALPHA_MODE_BLENDTWOSIDE: // Blended alpha rendered in two passes. First pass renders backfaces; second pass renders frontfaces.
|
||||
// Render back faces first
|
||||
GLDEBUG(glCullFace(GL_BACK));
|
||||
m_pMesh->renderSubmesh(iSubmesh, iPrevBuffer);
|
||||
m_pMesh->renderSubmesh(iSubmesh);
|
||||
|
||||
// Render front faces second
|
||||
GLDEBUG(glCullFace(GL_BACK));
|
||||
m_pMesh->renderSubmesh(iSubmesh, iPrevBuffer);
|
||||
m_pMesh->renderSubmesh(iSubmesh);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -122,7 +122,7 @@ KRShader *KRShaderManager::getShader(std::string shader_name, KRCamera *pCamera,
|
||||
|
||||
stream << "\n";
|
||||
std::string options = stream.str();
|
||||
fprintf(stderr, "Shader Options:\n%s\n\n", options.c_str());
|
||||
//fprintf(stderr, "Shader Options:\n%s\n\n", options.c_str());
|
||||
|
||||
pShader = new KRShader(szKey, options, m_vertShaderSource[shader_name], m_fragShaderSource[shader_name]);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user