void Effect3DOutline::setTarget(EffectSprite3D *sprite) { CCASSERT(nullptr != sprite && nullptr != sprite->getMesh(),"Error: Setting a null pointer or a null mesh EffectSprite3D to Effect3D"); if(sprite != _sprite) { GLProgram* glprogram; if(!sprite->getMesh()->getSkin()) glprogram = GLProgram::createWithFilenames(_vertShaderFile, _fragShaderFile); else glprogram = GLProgram::createWithFilenames(_vertSkinnedShaderFile, _fragSkinnedShaderFile); _glProgramState = GLProgramState::create(glprogram); _glProgramState->retain(); _glProgramState->setUniformVec3("OutLineColor", _outlineColor); _glProgramState->setUniformFloat("OutlineWidth", _outlineWidth); _sprite = sprite; auto mesh = sprite->getMesh(); long offset = 0; for (auto i = 0; i < mesh->getMeshVertexAttribCount(); i++) { auto meshvertexattrib = mesh->getMeshVertexAttribute(i); _glProgramState->setVertexAttribPointer(s_attributeNames[meshvertexattrib.vertexAttrib], meshvertexattrib.size, meshvertexattrib.type, GL_FALSE, mesh->getVertexSizeInBytes(), (void*)offset); offset += meshvertexattrib.attribSizeBytes; } Color4F color(_sprite->getDisplayedColor()); color.a = _sprite->getDisplayedOpacity() / 255.0f; _glProgramState->setUniformVec4("u_color", Vec4(color.r, color.g, color.b, color.a)); } }
void Effect3DOutline::drawWithSprite(EffectSprite3D* sprite, const Mat4 &transform) { auto mesh = sprite->getMesh(); long offset = 0; for (auto i = 0; i < mesh->getMeshVertexAttribCount(); i++) { auto meshvertexattrib = mesh->getMeshVertexAttribute(i); _glProgramState->setVertexAttribPointer(s_attributeNames[meshvertexattrib.vertexAttrib], meshvertexattrib.size, meshvertexattrib.type, GL_FALSE, mesh->getVertexSizeInBytes(), (void*)offset); offset += meshvertexattrib.attribSizeBytes; } //draw { glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); glEnable(GL_DEPTH_TEST); Color4F color(sprite->getDisplayedColor()); color.a = sprite->getDisplayedOpacity() / 255.0f; _glProgramState->setUniformVec4("u_color", Vec4(color.r, color.g, color.b, color.a)); auto mesh = sprite->getMesh(); glBindBuffer(GL_ARRAY_BUFFER, mesh->getVertexBuffer()); _glProgramState->apply(transform); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mesh->getIndexBuffer()); glDrawElements((GLenum)mesh->getPrimitiveType(), (GLsizei)mesh->getIndexCount(), (GLenum)mesh->getIndexFormat(), 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0); glDisable(GL_DEPTH_TEST); glCullFace(GL_BACK); glDisable(GL_CULL_FACE); CC_INCREMENT_GL_DRAWN_BATCHES_AND_VERTICES(1, mesh->getIndexCount()); } }
bool VertexAttribBinding::init(MeshIndexData* meshIndexData, GLProgramState* glProgramState) { CCASSERT(meshIndexData && glProgramState, "Invalid arguments"); // One-time initialization. if (__maxVertexAttribs == 0) { GLint temp; glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &temp); __maxVertexAttribs = temp; if (__maxVertexAttribs <= 0) { CCLOGERROR("The maximum number of vertex attributes supported by OpenGL on the current device is 0 or less."); return false; } } _meshIndexData = meshIndexData; _meshIndexData->retain(); _glProgramState = glProgramState; _glProgramState->retain(); auto meshVertexData = meshIndexData->getMeshVertexData(); auto attributeCount = meshVertexData->getMeshVertexAttribCount(); // Parse and set attributes parseAttributes(); long offset = 0; for (auto k = 0; k < attributeCount; k++) { auto meshattribute = meshVertexData->getMeshVertexAttrib(k); setVertexAttribPointer( s_attributeNames[meshattribute.vertexAttrib], meshattribute.size, meshattribute.type, GL_FALSE, meshVertexData->getVertexBuffer()->getSizePerVertex(), (GLvoid*)offset); offset += meshattribute.attribSizeBytes; } // VAO hardware if (Configuration::getInstance()->supportsShareableVAO()) { glGenVertexArrays(1, &_handle); GL::bindVAO(_handle); glBindBuffer(GL_ARRAY_BUFFER, meshVertexData->getVertexBuffer()->getVBO()); auto flags = _vertexAttribsFlags; for (int i = 0; flags > 0; i++) { int flag = 1 << i; if (flag & flags) glEnableVertexAttribArray(i); flags &= ~flag; } glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, meshIndexData->getIndexBuffer()->getVBO()); for(auto &attribute : _attributes) { attribute.second.apply(); } GL::bindVAO(0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); } return true; }