bool vesMaterial::addAttribute(vesSharedPtr<vesMaterialAttribute> attribute) { if (!attribute) { return false; } if (attribute->type() != vesMaterialAttribute::Texture && attribute->binding() == vesMaterialAttribute::BindAll) { // Shader is a special attribute. if (attribute->type() == vesMaterialAttribute::Shader) { return this->setShaderProgram(std::tr1::static_pointer_cast<vesShaderProgram>(attribute)); } // Everything else. return this->m_internal->addAttribute( this->m_internal->m_attributes, attribute); } else if(attribute->type() == vesMaterialAttribute::Texture) { vesSharedPtr<vesTexture> texture = std::tr1::static_pointer_cast<vesTexture>(attribute); // Cache last texture so that we can release graphics resources on it. this->m_internal->m_textureAttributes[texture->textureUnit()] = texture; return true; } else if(attribute->binding() == vesMaterialAttribute::BindMinimal) { return this->m_internal->addAttribute( this->m_internal->m_minimalAttributes, attribute); } return false; }
bool vesMaterial::vesInternal::addAttribute( Attributes &attributes, vesSharedPtr<vesMaterialAttribute> attribute) { if (!attribute) { return false; } vesInternal::Attributes::iterator itr = attributes.find(attribute->type()); if (itr == attributes.end() || ( (itr->second) != attribute )) { attributes[attribute->type()] = attribute; return true; } return false; }
bool vesMaterial::setShaderProgram(vesSharedPtr<vesShaderProgram> shaderProgram) { if (!shaderProgram || shaderProgram == this->m_shaderProgram) { return false; } this->m_shaderProgram = shaderProgram; this->m_internal->m_attributes[shaderProgram->type()] = this->m_shaderProgram; return true; }