void setVertexAttrib(osg::Geometry& geom, const AttributeAlias& alias, osg::Array* array, bool normalize, osg::Array::Binding binding = osg::Array::BIND_UNDEFINED) { unsigned int index = alias.first; const std::string& name = alias.second; array->setName(name); if (binding!=osg::Array::BIND_UNDEFINED) array->setBinding(binding); array->setNormalize(normalize); geom.setVertexAttribArray(index, array); osg::notify(osg::NOTICE)<<" vertex attrib("<<name<<", index="<<index<<", normalize="<<normalize<<" binding="<<binding<<")"<<std::endl; }
bool InstancesManagerImpl::_initSkinning(osg::Geometry& geom, const image_data& id ) { osg::Geometry& source = geom; osg::Vec3Array* positionSrc = dynamic_cast<osg::Vec3Array*>(source.getVertexArray()); if (!positionSrc) { OSG_WARN << "InstancedAnimationManager no vertex array in the geometry " << geom.getName() << std::endl; return false; } osg::ref_ptr<osg::Program> cSkinningProg = creators::createProgram("skininst2").program; cSkinningProg->setName("SkinningShader"); const int attribIndex = cAttribSkinningBaseIndex; int nbAttribs = id.bonesWeights.size(); for (int i = 0; i < nbAttribs; i++) { osg::ref_ptr<osg::Vec4Array> array = new osg::Vec4Array(osg::Array::BIND_PER_VERTEX); const image_data::weights_t& w = id.bonesWeights[i]; for (unsigned j = 0; j < w.size(); j+=id.divisor) { array->push_back(osg::Vec4(w.at(j),w.at(j+1),w.at(j+2),w.at(j+3))); } std::stringstream ss; ss << "boneWeight" << i; cSkinningProg->addBindAttribLocation(ss.str(), attribIndex + i); geom.setVertexAttribArray(attribIndex + i, array); OSG_INFO << "set vertex attrib " << ss.str() << std::endl; } osg::ref_ptr<osg::StateSet> ss = geom.getOrCreateStateSet(); ss->addUniform(new osg::Uniform("nbBonesPerVertex", id.bonesPerVertex)); ss->setAttributeAndModes(cSkinningProg.get()); return true; }