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 Cc3dSubMesh::onDraw(const Mat4& modelMat, uint32_t flags){ assert(m_subMeshData&&m_texture&&m_indexVBO &&m_program); if(m_indexVBO->getIndexArrayLen()==0)return; //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 Cc3dProgram*program=(Cc3dProgram*)getShaderProgram(); program->use(); program->mySetUniformsForBuiltins(Cc3dMatrix4(modelMat.m), Cc3dDirector::sharedDirector()->getCamera()->calculateViewMat(), Cc3dDirector::sharedDirector()->getCamera()->calculateProjectionMat()); //pass values for my own uniforms m_passUnifoCallback(this, program,Cc3dMatrix4(modelMat.m));//m_program //attach texture to texture attach point ccGLBindTexture2DN(0, this->m_texture->getID()); //draw m_indexVBO->setPointers(); m_indexVBO->draw(GL_TRIANGLES); //recover array attribute state Cc3dIndexVBO3d::enableAttribArray_position(isPostionAttribEnabled); Cc3dIndexVBO3d::enableAttribArray_texCoord(isTexCoordAttribEnabled); Cc3dIndexVBO3d::enableAttribArray_normal(isNormalAttribEnabled); Cc3dIndexVBO3d::enableAttribArray_color(isColorAttribEnabled); }
// overriding draw method void CCParticleSystemQuad::draw() { if (NULL == m_pTexture) { return; } CCAssert(!m_pBatchNode,"draw should not be called when added to a particleBatchNode"); CC_NODE_DRAW_SETUP(); ccGLBindTexture2D( m_pTexture->getName() ); #ifdef AND_ETC_SEP ccGLBindTexture2DN(1, m_pTexture->getNameAlpha()); #endif ccGLBlendFunc( m_tBlendFunc.src, m_tBlendFunc.dst ); CCAssert( m_uParticleIdx == m_uParticleCount, "Abnormal error in particle quad"); #if CC_TEXTURE_ATLAS_USE_VAO // // Using VBO and VAO // ccGLBindVAO(m_uVAOname); #if CC_REBIND_INDICES_BUFFER glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_pBuffersVBO[1]); #endif glDrawElements(GL_TRIANGLES, (GLsizei) m_uParticleIdx*6, GL_UNSIGNED_SHORT, 0); #if CC_REBIND_INDICES_BUFFER glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); #endif #else // // Using VBO without VAO // #define kQuadSize sizeof(m_pQuads[0].bl) ccGLEnableVertexAttribs( kCCVertexAttribFlag_PosColorTex ); glBindBuffer(GL_ARRAY_BUFFER, m_pBuffersVBO[0]); // vertices glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (GLvoid*) offsetof( ccV3F_C4B_T2F, vertices)); // colors glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (GLvoid*) offsetof( ccV3F_C4B_T2F, colors)); // tex coords glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (GLvoid*) offsetof( ccV3F_C4B_T2F, texCoords)); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_pBuffersVBO[1]); glDrawElements(GL_TRIANGLES, (GLsizei) m_uParticleIdx*6, GL_UNSIGNED_SHORT, 0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); #endif CC_INCREMENT_GL_DRAWS(1); CHECK_GL_ERROR_DEBUG(); }
void ccGLBindTexture2D(GLuint textureId) { ccGLBindTexture2DN(0, textureId); }
void Cc3dIndexVBO3d::bindTexture(GLuint textureUnit, GLuint textureId){ ccGLBindTexture2DN(textureUnit,textureId); glActiveTexture(GL_TEXTURE0);//back to GL_TEXTURE0 }
void CCSquirmAnimNode::draw() { CCAssert(m_pobTexture != 0 && m_maskTexture != 0, "CCSquirmAnimNode::draw(), textures mustn't be null!"); CC_PROFILER_START_CATEGORY(kCCProfilerCategorySprite, "CCSprite - draw"); // 如果顶点数据需要刷新,就刷新之 if(m_vertices_dirty) { rebuildVertices(); } CC_NODE_DRAW_SETUP(); ccGLBlendFunc( m_sBlendFunc.src, m_sBlendFunc.dst ); ccGLBindTexture2DN(0, m_pobTexture->getName()); ccGLBindTexture2DN(1, m_maskTexture->getName()); // // Attributes // ccGLEnableVertexAttribs( kCCVertexAttribFlag_PosColorTexTex ); #define kQuadSize sizeof(m_sQuad.bl) long offset = (long)&m_sQuad; // vertex int diff = offsetof( ccV3F_C4B_T2Fx2, vertices); glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset + diff)); // texCoods diff = offsetof( ccV3F_C4B_T2Fx2, texCoords); glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff)); diff = offsetof(ccV3F_C4B_T2Fx2, texCoords1); glVertexAttribPointer(kCCVertexAttrib_TexCoords1, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff)); // color diff = offsetof( ccV3F_C4B_T2Fx2, 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_SPRITE_DEBUG_DRAW == 1 // draw bounding box CCPoint vertices[4]={ ccp(m_sQuad.tl.vertices.x,m_sQuad.tl.vertices.y), ccp(m_sQuad.bl.vertices.x,m_sQuad.bl.vertices.y), ccp(m_sQuad.br.vertices.x,m_sQuad.br.vertices.y), ccp(m_sQuad.tr.vertices.x,m_sQuad.tr.vertices.y), }; ccDrawPoly(vertices, 4, true); #elif CC_SPRITE_DEBUG_DRAW == 2 // draw texture box CCSize s = this->getTextureRect().size; CCPoint offsetPix = this->getOffsetPosition(); CCPoint vertices[4] = { ccp(offsetPix.x,offsetPix.y), ccp(offsetPix.x+s.width,offsetPix.y), ccp(offsetPix.x+s.width,offsetPix.y+s.height), ccp(offsetPix.x,offsetPix.y+s.height) }; ccDrawPoly(vertices, 4, true); #endif // CC_SPRITE_DEBUG_DRAW CC_INCREMENT_GL_DRAWS(1); CC_PROFILER_STOP_CATEGORY(kCCProfilerCategorySprite, "CCSquirmAnimNode - draw"); }