Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions cocos2d/CCGLProgram.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,9 @@ struct _hashUniformEntry;
/** will update the MVP matrix on the MVP uniform if it is different than the previous call for this same shader program. */
-(void) setUniformForModelViewProjectionMatrix;

/** calls glGetUniformLocation only if the shader program has been properly initialized **/
- (GLint)uniformLocationForName:(NSString*)name;

/** returns the vertexShader error log */
- (NSString *)vertexShaderLog;

Expand Down
56 changes: 37 additions & 19 deletions cocos2d/CCGLProgram.m
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,11 @@ - (id)initWithVertexShaderByteArray:(const GLchar *)vShaderByteArray fragmentSha

- (id)initWithVertexShaderFilename:(NSString *)vShaderFilename fragmentShaderFilename:(NSString *)fShaderFilename
{

const GLchar * vertexSource = (GLchar*) [[NSString stringWithContentsOfFile:[[CCFileUtils sharedFileUtils] fullPathFromRelativePath:vShaderFilename] encoding:NSUTF8StringEncoding error:nil] UTF8String];
const GLchar * fragmentSource = (GLchar*) [[NSString stringWithContentsOfFile:[[CCFileUtils sharedFileUtils] fullPathFromRelativePath:fShaderFilename] encoding:NSUTF8StringEncoding error:nil] UTF8String];

NSAssert1( !vShaderFilename || (vShaderFilename && vertexSource), @"vertex shader: %@ - file not found", vShaderFilename );
NSAssert1( !fShaderFilename || (fShaderFilename && fragmentSource), @"fragment shader: %@ - file not found", fShaderFilename );

return [self initWithVertexShaderByteArray:vertexSource fragmentShaderByteArray:fragmentSource];
}
Expand All @@ -131,13 +133,14 @@ - (BOOL)compileShader:(GLuint *)shader type:(GLenum)type byteArray:(const GLchar

glGetShaderiv(*shader, GL_COMPILE_STATUS, &status);

if( ! status ) {
if( ! status )
{
if( type == GL_VERTEX_SHADER )
CCLOG(@"cocos2d: %@", [self vertexShaderLog] );
NSLog(@"cocos2d: %@", [self vertexShaderLog] );
else
CCLOG(@"cocos2d: %@", [self fragmentShaderLog] );

NSLog(@"cocos2d: %@", [self fragmentShaderLog] );
}

return ( status == GL_TRUE );
}

Expand All @@ -150,8 +153,11 @@ - (void)addAttribute:(NSString *)attributeName index:(GLuint)index
[attributeName UTF8String]);
}

-(void) updateUniforms
- (void)updateUniforms
{
// All of the below gl methods will fail if _program is not valid
NSAssert( program_ != 0, @"Cannot update uniforms without a valid shader program" );

// Since sample most probably won't change, set it to 0 now.

uniforms_[kCCUniformMVPMatrix] = glGetUniformLocation(program_, kCCUniformMVPMatrix_s);
Expand All @@ -167,23 +173,28 @@ -(void) updateUniforms

- (BOOL)link
{
NSAssert(program_ != 0, @"Cannot link invalid program");

GLint status = GL_TRUE;

glLinkProgram(program_);

#if DEBUG
GLint status;
glValidateProgram(program_);

glGetProgramiv(program_, GL_LINK_STATUS, &status);
if (status == GL_FALSE) {
CCLOG(@"cocos2d: ERROR: Failed to link program: %i", program_);
if( vertShader_ )
glDeleteShader( vertShader_ );
if( fragShader_ )
glDeleteShader( fragShader_ );

NSString* log = self.programLog;

if (status == GL_FALSE)
NSLog(@"cocos2d: ERROR: Failed to link program: %i - %@", program_, self.programLog);
else if( log != nil )
NSLog(@"cocos2d: Link INFO: %@", log);

if( status == GL_FALSE)
{
ccGLDeleteProgram( program_ );
vertShader_ = fragShader_ = program_ = 0;
return NO;
}
program_ = 0;
}

#endif

if (vertShader_)
Expand All @@ -193,7 +204,7 @@ - (BOOL)link

vertShader_ = fragShader_ = 0;

return YES;
return status == GL_TRUE;
}

- (void)use
Expand Down Expand Up @@ -367,6 +378,13 @@ -(void) setUniformForModelViewProjectionMatrix
[self setUniformLocation:uniforms_[kCCUniformMVPMatrix] withMatrix4fv:matrixMVP.mat count:1];
}

- (GLint)uniformLocationForName:(NSString*)name
{
NSAssert(name != nil, @"Invalid uniform name" );
NSAssert(program_ != 0, @"Invalid operation. Cannot get uniform location when program is not initialized");

return glGetUniformLocation(program_, [name UTF8String]);
}

#pragma mark -

Expand Down
2 changes: 1 addition & 1 deletion cocos2d/CCShaderCache.m
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ -(void) loadDefaultShaders
p = [[CCGLProgram alloc] initWithVertexShaderByteArray:ccPosition_uColor_vert
fragmentShaderByteArray:ccPosition_uColor_frag];

[p addAttribute:@"aVertex" index:kCCVertexAttrib_Position];
[p addAttribute:kCCAttributeNamePosition index:kCCVertexAttrib_Position];

[p link];
[p updateUniforms];
Expand Down