bool CCEngine::setupRenderer() { if( renderer->setup() ) { DEBUG_OPENGL(); if( textureManager == NULL ) { textureManager = new CCTextureManager(); // Load in a 1x1 white texture to use for untextured draws textureManager->assignTextureIndex( "transparent.png", Resource_Packaged, false, true, true ); textureManager->assignTextureIndex( "white.png", Resource_Packaged, false, true, true ); DEBUGLOG( "CCEngine::setupRenderer\n" ); textureManager->setTextureIndex( 1 ); } else { textureManager->invalidateAllTextureHandles(); } DEBUG_OPENGL(); renderer->setupOpenGL(); DEBUG_OPENGL(); return true; } return false; }
void CCEngine::setupEngineThread() { engineThreadRunning = true; renderer = new CCDeviceRenderer(); renderer->setup( true ); DEBUG_OPENGL(); textureManager = new CCTextureManager(); textureManager->load(); DEBUG_OPENGL(); textureManager->loadFont( "HelveticaNeueLight" ); textureManager->loadFont( "HelveticaNeueBold" ); DEBUG_OPENGL(); controls = new CCDeviceControls(); CCOctreeSetRenderSortCallback( &zCompare ); renderer->setupOpenGL(); DEBUG_OPENGL(); // Start Game start(); }
static bool compileShader(GLuint *shader, GLenum type, const char *path) { GLint status; char *data; const int fileSize = CCFileManager::GetPackagedFile( path, &data ); const int offset = 41; char code[fileSize + offset]; if( type == GL_VERTEX_SHADER ) { sprintf( code, "%s%s", "#define VERTEX_SHADER\r\n", data ); } else if( type == GL_FRAGMENT_SHADER ) { sprintf( code, "%s%s", "#define PIXEL_SHADER\r\n", data ); } // For safety code[fileSize + offset - 1] = '0'; const char* appendedCode = (const char*)&code[0]; *shader = glCreateShader( type ); DEBUG_OPENGL(); glShaderSource( *shader, 1, &appendedCode, NULL ); DEBUG_OPENGL(); glCompileShader( *shader ); DEBUG_OPENGL(); #ifdef DEBUGON GLint logLength = 0; glGetShaderiv( *shader, GL_INFO_LOG_LENGTH, &logLength ); if( logLength > 0 ) { char *log = (char*)malloc( logLength ); glGetShaderInfoLog( *shader, logLength, &logLength, log ); DEBUGLOG( "Shader compile log:\n%s", log ); free( log ); } #endif glGetShaderiv( *shader, GL_COMPILE_STATUS, &status ); if( status == 0 ) { glDeleteShader( *shader ); return false; } return true; }
static bool compileShader(GLuint *shader, GLenum type, const char *path) { GLint status; CCText fileData; const int fileSize = CCFileManager::GetFile( path, fileData, Resource_Packaged ); CCText shaderCode; if( type == GL_VERTEX_SHADER ) { shaderCode = "#define VERTEX_SHADER\r\n"; } else if( type == GL_FRAGMENT_SHADER ) { shaderCode = "#define PIXEL_SHADER\r\n"; } shaderCode += fileData.buffer; *shader = glCreateShader( type ); DEBUG_OPENGL(); const char* constSourceCode = shaderCode.buffer; glShaderSource( *shader, 1, &constSourceCode, NULL ); DEBUG_OPENGL(); glCompileShader( *shader ); DEBUG_OPENGL(); #ifdef DEBUGON GLint logLength = 0; glGetShaderiv( *shader, GL_INFO_LOG_LENGTH, &logLength ); if( logLength > 0 ) { char *log = (char*)malloc( logLength ); glGetShaderInfoLog( *shader, logLength, &logLength, log ); DEBUGLOG( "Shader compile log:\n%s", log ); free( log ); } #endif glGetShaderiv( *shader, GL_COMPILE_STATUS, &status ); if( status == 0 ) { glDeleteShader( *shader ); return false; } return true; }
void CCRenderer::setupOpenGL() { if( usingOpenGL2 ) { // Use shader program currentShader = shaders.list[0]; currentShader->use(); currentShader->enableAttributeArray( ATTRIB_VERTEX ); currentShader->enableAttributeArray( ATTRIB_TEXCOORD ); DEBUG_OPENGL(); } else { #ifdef IOS // GL_TEXTURE_2D is not a valid argument to glEnable in OpenGL ES 2.0 glEnable( GL_TEXTURE_2D ); glEnableClientState( GL_VERTEX_ARRAY ); glEnableClientState( GL_TEXTURE_COORD_ARRAY ); glDisableClientState( GL_COLOR_ARRAY ); DEBUG_OPENGL(); CCSetColour( CCColour() ); #endif } #ifndef DXRENDERER glClearColor( 0.0f, 0.0f, 0.0f, 1.0f ); DEBUG_OPENGL(); #endif CCSetDepthRead( true ); CCSetDepthWrite( true ); #ifndef DXRENDERER glDepthFunc( GL_LEQUAL ); DEBUG_OPENGL(); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glEnable( GL_SCISSOR_TEST ); DEBUG_OPENGL(); #endif GLEnable( GL_BLEND ); DEBUG_OPENGL(); #ifndef DXRENDERER #ifndef Q_OS_SYMBIAN glClearDepthf( 1.0f ); DEBUG_OPENGL(); #endif glLineWidth( LINE_WIDTH ); DEBUG_OPENGL(); #endif // Enable back face culling CCSetCulling( true ); CCSetBackCulling(); }
bool CCEngine::setupRenderer() { if( renderer->setup() ) { DEBUG_OPENGL(); if( textureManager == NULL ) { textureManager = new CCTextureManager(); } textureManager->invalidateAllTextureHandles(); DEBUG_OPENGL(); renderer->setupOpenGL(); DEBUG_OPENGL(); return true; } return false; }
bool CCRenderer::setup() { viewportX = viewportY = viewportWidth = viewportHeight = 0.0f; scissorX = scissorY = scissorWidth = scissorHeight = 0.0f; usingOpenGL2 = true; renderFlags = render_all; if( !createContext() || !loadShaders() ) { return false; } DEBUG_OPENGL(); // All current iPhoneOS devices support BGRA via an extension. BGRASupport = CCTextureBase::ExtensionSupported( "GL_IMG_texture_format_BGRA8888" ); frameBufferManager.setup(); DEBUG_OPENGL(); // Screen dimensions setupScreenSizeParams(); return true; }
void CCShader::use() { #if defined PROFILEON CCProfiler profile( "CCShader::use()" ); #endif #ifdef QT program->bind(); #else glUseProgram( program ); #endif DEBUG_OPENGL(); CCRefreshRenderAttributes(); }
void CCRenderer::setupOpenGL() { // Use shader program currentShader = shaders.list[0]; currentShader->use(); #ifdef QT currentShader->program->enableAttributeArray( ATTRIB_VERTEX ); //currentShader->program->enableAttributeArray( ATTRIB_COLOR ); currentShader->program->enableAttributeArray( ATTRIB_TEXCOORD ); //currentShader->program->enableAttributeArray( ATTRIB_NORMAL ); #else glEnableVertexAttribArray( ATTRIB_VERTEX ); //glEnableVertexAttribArray( ATTRIB_COLOR ); glEnableVertexAttribArray( ATTRIB_TEXCOORD ); //glEnableVertexAttribArray( ATTRIB_NORMAL ); #endif DEBUG_OPENGL(); //glClearColor( 0.85f, 0.85f, 0.875f, 1.0f ); glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); DEBUG_OPENGL(); glEnable( GL_DEPTH_TEST ); glDepthMask( GL_TRUE ); glDepthFunc( GL_LEQUAL ); DEBUG_OPENGL(); // GL_TEXTURE_2D is not a valid argument to glEnable in OpenGL ES 2.0 //glEnable( GL_TEXTURE_2D ); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glEnable( GL_BLEND ); DEBUG_OPENGL(); #ifndef Q_OS_SYMBIAN glClearDepthf( 1.0f ); DEBUG_OPENGL(); #endif glLineWidth( LINE_WIDTH ); DEBUG_OPENGL(); // Enable back face culling glEnable( GL_CULL_FACE ); glCullFace( GL_BACK ); }
bool CCDeviceRenderer::loadShader(CCShader *shader) { GLuint vertShader, fragShader; CCText shaderPath = shader->name; shaderPath += ".fx"; // Create shader program shader->program = glCreateProgram(); if( !compileShader( &vertShader, GL_VERTEX_SHADER, shaderPath.buffer ) ) { DEBUGLOG( "Failed to compile vertex shader." ); glDeleteProgram( shader->program ); shader->program = 0; return false; } if( !compileShader( &fragShader, GL_FRAGMENT_SHADER, shaderPath.buffer ) ) { DEBUGLOG( "Failed to compile fragment shader." ); glDeleteProgram( shader->program ); shader->program = 0; return false; } DEBUG_OPENGL(); // Attach shaders to program glAttachShader( shader->program, vertShader ); DEBUG_OPENGL(); glAttachShader( shader->program, fragShader ); DEBUG_OPENGL(); // Bind attribute locations - this needs to be done prior to linking glBindAttribLocation( shader->program, ATTRIB_VERTEX, "vs_position" ); glBindAttribLocation( shader->program, ATTRIB_TEXCOORD, "vs_texCoord" ); glBindAttribLocation( shader->program, ATTRIB_COLOUR, "vs_colour" ); glBindAttribLocation( shader->program, ATTRIB_NORMAL, "vs_normal" ); DEBUG_OPENGL(); if( !linkProgram( shader->program ) ) { DEBUGLOG( "Failed to link program." ); if( vertShader ) { glDeleteShader( vertShader ); vertShader = 0; } if( fragShader ) { glDeleteShader( fragShader ); fragShader = 0; } if( shader->program ) { glDeleteProgram( shader->program ); shader->program = 0; } return false; } // Release vertex and fragment shaders if( vertShader ) { glDeleteShader( vertShader ); } if( fragShader ) { glDeleteShader( fragShader ); } return true; }