void OBJWriterNodeVisitor::apply(osg::Geometry& geometry) { osg::Matrix m = osg::computeLocalToWorld(getNodePath()); pushStateSet(geometry.getStateSet()); processGeometry(&geometry,m); popStateSet(geometry.getStateSet()); }
void RigGeometry::copyFrom(osg::Geometry& from) { bool copyToSelf = (this==&from); osg::Geometry& target = *this; if (!copyToSelf) target.setStateSet(from.getStateSet()); // copy over primitive sets. if (!copyToSelf) target.getPrimitiveSetList() = from.getPrimitiveSetList(); if (from.getVertexArray()) { if (!copyToSelf) target.setVertexArray(from.getVertexArray()); } if (from.getNormalArray()) { if (!copyToSelf) target.setNormalArray(from.getNormalArray()); } if (from.getColorArray()) { if (!copyToSelf) target.setColorArray(from.getColorArray()); } if (from.getSecondaryColorArray()) { if (!copyToSelf) target.setSecondaryColorArray(from.getSecondaryColorArray()); } if (from.getFogCoordArray()) { if (!copyToSelf) target.setFogCoordArray(from.getFogCoordArray()); } for(unsigned int ti=0;ti<from.getNumTexCoordArrays();++ti) { if (from.getTexCoordArray(ti)) { if (!copyToSelf) target.setTexCoordArray(ti,from.getTexCoordArray(ti)); } } osg::Geometry::ArrayList& arrayList = from.getVertexAttribArrayList(); for(unsigned int vi=0;vi< arrayList.size();++vi) { osg::Array* array = arrayList[vi].get(); if (array) { if (!copyToSelf) target.setVertexAttribArray(vi,array); } } }
void ShaderVisitor::apply(osg::Geometry& geometry) { bool needPop = (geometry.getStateSet() != NULL); if (geometry.getStateSet()) { pushRequirements(); applyStateSet(geometry.getStateSet(), geometry); } if (!mRequirements.empty()) { const ShaderRequirements& reqs = mRequirements.back(); if (mAllowedToModifyStateSets) { // make sure that all UV sets are there for (std::map<int, std::string>::const_iterator it = reqs.mTextures.begin(); it != reqs.mTextures.end(); ++it) { if (geometry.getTexCoordArray(it->first) == NULL) geometry.setTexCoordArray(it->first, geometry.getTexCoordArray(0)); } } if (reqs.mTexStageRequiringTangents != -1 && mAllowedToModifyStateSets) { osg::ref_ptr<osgUtil::TangentSpaceGenerator> generator (new osgUtil::TangentSpaceGenerator); generator->generate(&geometry, reqs.mTexStageRequiringTangents); geometry.setTexCoordArray(7, generator->getTangentArray(), osg::Array::BIND_PER_VERTEX); } // TODO: find a better place for the stateset if (reqs.mShaderRequired || mForceShaders) createProgram(reqs, geometry); } if (needPop) popRequirements(); }