void Cc3dSprite::draw(){ assert(m_mesh&&m_texture&&m_indexVBO &&m_program&&m_uniformPassor&&m_lightSource&&m_camera); //store isDoDepthTest GLboolean isDoDepthTestOld; glGetBooleanv(GL_DEPTH_TEST,&isDoDepthTestOld); //set depthTest if(m_isDoDepthTest!=isDoDepthTestOld){ CCDirector::sharedDirector()->setDepthTest(m_isDoDepthTest); } //enable server state (i don't know what this means :( ) ccGLEnable(m_eGLServerState); //pass values for cocos2d-x build-in uniforms m_pShaderProgram->use(); m_pShaderProgram->setUniformsForBuiltins(); //pass values for my own uniforms m_uniformPassor->excuteCallback(this, m_program); //attach texture to texture attach point Cc3dIndexVBO3d::bindTexture(0, m_texture->getName()); //draw m_indexVBO->setPointers(); m_indexVBO->draw(GL_TRIANGLES); Cc3dIndexVBO3d::bindTexture(0, 0); //restore isDoDepthTest CCDirector::sharedDirector()->setDepthTest(isDoDepthTestOld); }
void XSpriteBatchNode::draw() { XFUNC_START(); CC_PROFILER_START("XSpriteBatchNode - draw"); if (m_pobTextureAtlas->getTotalQuads() == 0) { return; } do { ccGLEnable(m_eGLServerState); if (m_pShaderKTX) { CCGLProgram* pProg = m_pShaderKTX->GetProgram(); if (pProg) { pProg->use(); pProg->setUniformsForBuiltins(); } } else { if (getShaderProgram()) { getShaderProgram()->use(); getShaderProgram()->setUniformsForBuiltins(); } } if(m_pShaderOnce) { m_pShaderOnce->use(); m_pShaderOnce->setUniformsForBuiltins(); if(m_pShaderOnce->m_pShader) m_pShaderOnce->m_pShader->RunBeforeDraw(); m_pShaderOnce = NULL; } //else if(m_pobTextureAtlas->getTexture()) //{ // static XShaderBloom stShaderBloom; // stShaderBloom.UseShader(); // stShaderBloom.SetTexSize(SCRPIX_W, SCRPIX_H); //} } while (0); arrayMakeObjectsPerformSelector(m_pChildren, updateTransform, CCSprite*); ccGLBlendFunc(m_blendFunc.src, m_blendFunc.dst); if (m_pTexKtxAlpha) { ccGLBindTexture2DN(1, m_pTexKtxAlpha->getName()); if (m_pShaderKTX) { m_pShaderKTX->RunBeforeDraw(); } } m_pobTextureAtlas->drawQuads(); CC_PROFILER_STOP("XSpriteBatchNode - draw"); XFUNC_END(); }
void HueSprite::draw() { CC_PROFILER_START_CATEGORY(kCCProfilerCategorySprite, "CCSprite - draw"); CCAssert(!m_pobBatchNode, "If CCSprite is being rendered by CCSpriteBatchNode, CCSprite#draw SHOULD NOT be called"); //CC_NODE_DRAW_SETUP(); ccGLEnable( m_eGLServerState ); ccGLBlendFunc( m_sBlendFunc.src, m_sBlendFunc.dst ); m_shader->use(); m_shader->setUniformsForBuiltins(); if (m_pobTexture != NULL) { //ccGLBindTexture2D( m_texure1->getName()); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, m_pobTexture->getName()); } else { ccGLBindTexture2D(0); } glUniformMatrix3fv(m_loc_hue, 1, GL_FALSE, (GLfloat*)&m_mat); // // Attributes // ccGLEnableVertexAttribs( kCCVertexAttribFlag_PosColorTex ); #define kQuadSize sizeof(m_sQuad.bl) long offset = (long)&m_sQuad; // vertex int diff = offsetof( ccV3F_C4B_T2F, vertices); glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset + diff)); // texCoods diff = offsetof( ccV3F_C4B_T2F, texCoords); glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff)); // color diff = offsetof( ccV3F_C4B_T2F, colors); glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset + diff)); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); CHECK_GL_ERROR_DEBUG(); CC_INCREMENT_GL_DRAWS(1); CC_PROFILER_STOP_CATEGORY(kCCProfilerCategorySprite, "CCSprite - draw"); }
void Cocos2dRenderManager::doRender(IVertexBuffer* _buffer, ITexture* _texture, size_t _count) { Cocos2dVertexBuffer* buffer = static_cast<Cocos2dVertexBuffer*>(_buffer); unsigned int buffer_id = buffer->getBufferID(); unsigned int texture_id = 0; Cocos2dTexture* texture = static_cast<Cocos2dTexture*>(_texture); texture_id = texture->getGLTexture(); //MYGUI_PLATFORM_ASSERT(buffer_id, "Texture is not created"); //MYGUI_PLATFORM_ASSERT(texture_id, "Texture is not created"); if (!buffer_id) return; if (!texture_id) return; ccGLEnable(m_eGLServerState); CCGLProgram* shaderProgram = NULL; cocos2d::ccBlendFunc blendFunc; shaderProgram = CCShaderCache::sharedShaderCache()->programForKey(kCCShader_PositionTextureColor_MyGUI); // 对于 if (texture->getCocos2dTexture()->hasPremultipliedAlpha()) { blendFunc.src = CC_BLEND_SRC; blendFunc.dst = CC_BLEND_DST; } else { blendFunc.src = GL_SRC_ALPHA; blendFunc.dst = GL_ONE_MINUS_SRC_ALPHA; } shaderProgram->use(); shaderProgram->setUniformsForBuiltins(); ccGLBlendFunc(blendFunc.src, blendFunc.dst); ccGLEnableVertexAttribs( kCCVertexAttribFlag_PosColorTex ); ccGLBindTexture2D(texture_id); glBindBuffer(GL_ARRAY_BUFFER, buffer_id); glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, x)); glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Vertex), (void*)offsetof(Vertex, colour)); glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, u)); glDrawArrays(GL_TRIANGLES, 0, _count); vbo_count++; vertex_count += _count; glBindBuffer(GL_ARRAY_BUFFER, 0); }
void CtinyWingsTerrainSprite::draw(){ //----change shader ccGLBlendFunc( m_sBlendFunc.src, m_sBlendFunc.dst ); ccGLEnable(m_eGLServerState); //pass values for cocos2d-x build-in uniforms this->setShaderProgram(m_program); CGLProgramWithUnifos*program=(CGLProgramWithUnifos*)this->getShaderProgram(); program->use(); program->setUniformsForBuiltins(); //pass values for my own uniforms float colorList_tmp[4*3]={m_colorList[0].r,m_colorList[0].g,m_colorList[0].b,m_colorList[0].a, m_colorList[1].r,m_colorList[1].g,m_colorList[1].b,m_colorList[1].a, m_colorList[2].r,m_colorList[2].g,m_colorList[2].b,m_colorList[2].a}; program->passUnifoValue1f("u_texNonlinearFactor", m_texNonlinearFactor); program->passUnifoValueNfvN("u_colors", colorList_tmp, 4, 3); program->passUnifoValue1f("u_cosA", cosf(m_ribbonRotation*M_PI/180)); program->passUnifoValue1f("u_sinA", sinf(m_ribbonRotation*M_PI/180)); program->passUnifoValue1f("u_ribbonRepeat", m_ribbonRepeat); //enable attributes bool isAttribPositionOn=CindexVBO::isEnabledAttribArray_position(); bool isAttribColorOn=CindexVBO::isEnabledAttribArray_color(); bool isAttribTexCoordOn=CindexVBO::isEnabledAttribArray_texCoord(); CindexVBO::enableAttribArray_position(true); CindexVBO::enableAttribArray_color(true); CindexVBO::enableAttribArray_texCoord(true); //bind texture ccGLBindTexture2D( this->getTexture()->getName()); //draw m_indexVBO m_indexVBO->setPointer_position(); m_indexVBO->setPointer_texCoord(); m_indexVBO->setPointer_color(); m_indexVBO->draw(GL_TRIANGLES); //unbind texture ccGLBindTexture2D(0); //disable attributes CindexVBO::enableAttribArray_position(isAttribPositionOn); CindexVBO::enableAttribArray_color(isAttribColorOn); CindexVBO::enableAttribArray_texCoord(isAttribTexCoordOn); //draw wire if(m_isDrawDebug){ drawWire(); } }
void Cc3dSubMesh::draw(){ assert(m_subMeshData&&m_texture&&m_indexVBO &&m_program&&m_lightSource&&m_camera); //enable array attribute bool isPostionAttribEnabled=Cc3dIndexVBO3d::isEnabledAttribArray_position(); bool isTexCoordAttribEnabled=Cc3dIndexVBO3d::isEnabledAttribArray_texCoord(); bool isNormalAttribEnabled=Cc3dIndexVBO3d::isEnabledAttribArray_normal(); bool isColorAttribEnabled=Cc3dIndexVBO3d::isEnabledAttribArray_color(); Cc3dIndexVBO3d::enableAttribArray_position(true); Cc3dIndexVBO3d::enableAttribArray_texCoord(true); Cc3dIndexVBO3d::enableAttribArray_normal(true); Cc3dIndexVBO3d::enableAttribArray_color(true); //apply state //for performance sake, we only apply state, not restore { //set depthTest CCDirector::sharedDirector()->setDepthTest(m_isDoDepthTest); //set blend function ccGLBlendFunc(m_blendFunc.src, m_blendFunc.dst); } //enable server state (i don't know what this means :( ) ccGLEnable(m_eGLServerState); //pass values for cocos2d-x build-in uniforms m_pShaderProgram->use(); m_pShaderProgram->setUniformsForBuiltins(); //pass values for my own uniforms m_passUnifoCallback(this, m_program); //attach texture to texture attach point Cc3dIndexVBO3d::bindTexture(0, m_texture->getName()); //draw m_indexVBO->setPointers(); m_indexVBO->draw(GL_TRIANGLES); Cc3dIndexVBO3d::bindTexture(0, 0); //recover array attribute state Cc3dIndexVBO3d::enableAttribArray_position(isPostionAttribEnabled); Cc3dIndexVBO3d::enableAttribArray_texCoord(isTexCoordAttribEnabled); Cc3dIndexVBO3d::enableAttribArray_normal(isNormalAttribEnabled); Cc3dIndexVBO3d::enableAttribArray_color(isColorAttribEnabled); }
void BlurSprite::draw() { CC_PROFILER_START_CATEGORY(kCCProfilerCategorySprite, "CCSprite - draw"); CCAssert(!m_pobBatchNode, "If CCSprite is being rendered by CCSpriteBatchNode, CCSprite#draw SHOULD NOT be called"); //CC_NODE_DRAW_SETUP(); ccGLEnable( m_eGLServerState ); ccGLBlendFunc( m_sBlendFunc.src, m_sBlendFunc.dst ); // 水平方向blur m_frameTexture->clear(0.f, 0.f, 0.f, 0.f); m_frameTexture->begin(); { m_shader->use(); m_shader->setUniformsForBuiltins(); glUniform2f(m_location_pix_size, 1.f/m_tex_size.width, 0); if (m_pobTexture != NULL) { ccGLBindTexture2D(m_pobTexture->getName()); } else { ccGLBindTexture2D(0); } // // Attributes // ccGLEnableVertexAttribs( kCCVertexAttribFlag_PosColorTex ); #define kQuadSize sizeof(m_sQuad.bl) long offset = (long)&m_sQuad; // vertex int diff = offsetof( ccV3F_C4B_T2F, vertices); glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset + diff)); // texCoods diff = offsetof( ccV3F_C4B_T2F, texCoords); glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff)); // color diff = offsetof( ccV3F_C4B_T2F, colors); glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset + diff)); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); CHECK_GL_ERROR_DEBUG(); } m_frameTexture->end(); // 垂直方向blur CCTexture2D* rt = m_frameTexture->getSprite()->getTexture(); #if CC_DEBUG m_frameTexture2->clear(0.f, 0.f, 0.f, 0.f); m_frameTexture2->begin(); #endif { m_shader->use(); m_shader->setUniformsForBuiltins(); glUniform2f(m_location_pix_size, 0, 1.f/m_tex_size.height); if ( rt != NULL) { ccGLBindTexture2D(rt->getName()); } else { ccGLBindTexture2D(0); } // // Attributes // ccGLEnableVertexAttribs( kCCVertexAttribFlag_PosColorTex ); #define kQuadSize sizeof(m_sQuad.bl) long offset = (long)&m_sQuad; // vertex int diff = offsetof( ccV3F_C4B_T2F, vertices); glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset + diff)); // texCoods diff = offsetof( ccV3F_C4B_T2F, texCoords); glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff)); // color diff = offsetof( ccV3F_C4B_T2F, colors); glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset + diff)); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); CHECK_GL_ERROR_DEBUG(); } #if CC_DEBUG m_frameTexture2->end(); m_frameTexture2->saveToFile("blur_complete.png"); #endif CC_INCREMENT_GL_DRAWS(1); CC_PROFILER_STOP_CATEGORY(kCCProfilerCategorySprite, "CCSprite - draw"); }