#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void create_specular_highlights(osg::Node *node) { osg::StateSet *ss = node->getOrCreateStateSet(); // create and setup the texture object osg::TextureCubeMap *tcm = new osg::TextureCubeMap; tcm->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP); tcm->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP); tcm->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP); tcm->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR_MIPMAP_LINEAR); tcm->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR); // generate the six highlight map images (light direction = [1, 1, -1]) osgUtil::HighlightMapGenerator *mapgen = new osgUtil::HighlightMapGenerator( osg::Vec3(1, 1, -1), // light direction osg::Vec4(1, 0.9f, 0.8f, 1), // light color 8); // specular exponent mapgen->generateMap(); // assign the six images to the texture object tcm->setImage(osg::TextureCubeMap::POSITIVE_X, mapgen->getImage(osg::TextureCubeMap::POSITIVE_X)); tcm->setImage(osg::TextureCubeMap::NEGATIVE_X, mapgen->getImage(osg::TextureCubeMap::NEGATIVE_X)); tcm->setImage(osg::TextureCubeMap::POSITIVE_Y, mapgen->getImage(osg::TextureCubeMap::POSITIVE_Y)); tcm->setImage(osg::TextureCubeMap::NEGATIVE_Y, mapgen->getImage(osg::TextureCubeMap::NEGATIVE_Y)); tcm->setImage(osg::TextureCubeMap::POSITIVE_Z, mapgen->getImage(osg::TextureCubeMap::POSITIVE_Z)); tcm->setImage(osg::TextureCubeMap::NEGATIVE_Z, mapgen->getImage(osg::TextureCubeMap::NEGATIVE_Z)); // enable texturing, replacing any textures in the subgraphs ss->setTextureAttributeAndModes(0, tcm, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON); // texture coordinate generation osg::TexGen *tg = new osg::TexGen; tg->setMode(osg::TexGen::REFLECTION_MAP); ss->setTextureAttributeAndModes(0, tg, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON); // use TexEnvCombine to add the highlights to the original lighting osg::TexEnvCombine *te = new osg::TexEnvCombine; te->setCombine_RGB(osg::TexEnvCombine::ADD); te->setSource0_RGB(osg::TexEnvCombine::TEXTURE); te->setOperand0_RGB(osg::TexEnvCombine::SRC_COLOR); te->setSource1_RGB(osg::TexEnvCombine::PRIMARY_COLOR); te->setOperand1_RGB(osg::TexEnvCombine::SRC_COLOR); ss->setTextureAttributeAndModes(0, te, osg::StateAttribute::OVERRIDE | osg::StateAttribute::ON); } int main(int argc, char *argv[]) { // use an ArgumentParser object to manage the program arguments. osg::ArgumentParser arguments(&argc,argv); // construct the viewer. osgViewer::Viewer viewer; // load the nodes from the commandline arguments. osg::Node* rootnode = osgDB::readNodeFiles(arguments); if (!rootnode) { osg::notify(osg::NOTICE)<<"Please specify a model filename on the command line."<getMaxNumberOfGraphicsContexts(); ++contextID) { osg::TextureCubeMap::Extensions* tcmExt = osg::TextureCubeMap::getExtensions(contextID,false); if (tcmExt) { if (!tcmExt->isCubeMapSupported()) { std::cout<<"Warning: texture_cube_map not supported by OpenGL drivers, unable to run application."<