hybr wrote:
> Hi, Almir
>
> there are visitor that find drawable by name for you
>
> class GetDrawableByNameVisitor:public osg::NodeVisitor
> {
> public:
> GetDrawableByNameVisitor(const std::string
> &name):osg::NodeVisitor(osg::NodeVisitor::TRAVERSE_ALL_CHILDREN):
> m_name(name), result(0)
> {
> setNodeMaskOverride(0xffffffff);
> setTraversalMask(0xffffffff);
> }
> using osg::NodeVisitor::apply;
> void apply(osg::Geode& geode)
> {
> for (int i = 0; i< geode.getNumDrawables(); i++)
> {
> osg::Drawable* dr = geode.getDrawable(i);
> if (dr->getName()==m_name)
> result = dr;
> }
> }
> osg::Drawable* getResult(){return result;}
> private:
> std::string m_name;
> osg::Drawable* result;
> };
>
> so in your example you need something like
>
> GetDrawableByNameVisitor gdbnv("name of your material in 3dsmax with texture
> you wanna change")
> arTransformA->accept(gdbny);
> if (gdbny.getResult())
> {
> osg::ImageStream* is = ...;//load your movie or whatever you got
> osg::Texture2D* animatedTexture = new osg::Texture2D(is);
>
> gdbny.getResult()->getOrCreateStateSet()->setTextureAttribute(0,animatedTexture,osg::StateAttribute::ON);
> }
>
>
> there can be case when your texture is not on 0 texture unit so you may need
> to go through like first 8 texture units with stateset
> getTextureAttribute(tex_unit_number, osg::StateAttribute::TEXTURE) and check
> which one texture unit have texture, then set your new texture created with
> imagestream to that texture unit with setTextureAttribute on stateset.
>
> Cheers,
> Sergey.
>
> 16.02.2011, 05:15, "Almir Brazil" <>:
>
> > hybr wrote:
> >
> >
> > > Hi, Almir
> > >
> > > Try following thing:
> > > Look at material name which uses this texture in 3ds max, in osg this
> > > will be the name of drawable with stateset that uses this texture. You
> > > can find this drawable with some visitor, get stateset there, then set
> > > your animated texture to texture unit where old texture is (if there are
> > > one texture in material it's 0 by default).
> > >
> > > Cheers,
> > > Sergey.
> > >
> > > 15.02.2011, 04:24, "Almir Brazil" <>:
> > >
> > > > Hi,
> > > >
> > > > I'm new to OpenSceneGraph, and I have the following scenario:
> > > >
> > > > A OSG file exported from 3DS Max, using OSGExp0.9.8....
> > > > That file has 3 textures... 2 should be static, and 1 should be
> > > > animated. When playing the exported OSG file, all 3 textures still
> > > > static.
> > > >
> > > > I read few things about osg imagesequence, that can read a lot of
> > > > sequential images to produce a animated texture effect. And that's what
> > > > I'm looking for!!
> > > >
> > > > My dificultie is to change (in code) the static texture exported from
> > > > 3DSMax to a imagesequence texture.
> > > >
> > > > Can anyone say me how to do that?
> > > >
> > > > ...
> > > >
> > > > Thank you!
> > > >
> > > > Cheers,
> > > > Almir
> > > >
> > > > ------------------
> > > > Read this topic online here:
> > > > http://forum.openscenegraph.org/viewtopic.php?p=36665#36665
> > > >
> > > > _______________________________________________
> > > > osg-users mailing list
> > > >
> > > > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
> > > >
> > > _______________________________________________
> > > osg-users mailing list
> > >
> > > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
> > >
> > > ------------------
> > > Post generated by Mail2Forum
> > >
> >
> > Ok, here is the code... It's a modified version of osgartsimple.cpp:
> >
> > (see attachment)
> >
> > The OSG file - karsten.osg - (generated with 3ds Max) has 3 main textures.
> > I want to change one of them with a imagesequence or movie file (quicktime
> > .mov)
> > (I have both of them).
> >
> > I haven't a Geode object, only a VideoGeode... how can I create a stateset
> > to change the texture?
> >
> > Thanks!
> >
> > ------------------
> > Read this topic online here:
> > http://forum.openscenegraph.org/viewtopic.php?p=36711#36711
> >
> > /* -*-c++-*-
> > *
> > * osgART - ARToolKit for OpenSceneGraph
> > * Copyright (C) 2005-2008 Human Interface Technology Laboratory New Zealand
> > *
> > * This file is part of osgART 2.0
> > *
> > * osgART 2.0 is free software: you can redistribute it and/or modify
> > * it under the terms of the GNU General Public License as published by
> > * the Free Software Foundation, either version 3 of the License, or
> > * (at your option) any later version.
> > *
> > * osgART 2.0 is distributed in the hope that it will be useful,
> > * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> > * GNU General Public License for more details.
> > *
> > * You should have received a copy of the GNU General Public License
> > * along with osgART 2.0. If not, see <http://www.gnu.org/licenses/>.
> > *
> > */
> >
> > #include <osgART/Foundation>
> > #include <osgART/VideoLayer>
> > #include <osgART/PluginManager>
> > #include <osgART/VideoGeode>
> > #include <osgART/Utils>
> > #include <osgART/GeometryUtils>
> > #include <osgART/MarkerCallback>
> > #include <osgART/TransformFilterCallback>
> >
> > #include <osgViewer/Viewer>
> > #include <osgViewer/ViewerEventHandlers>
> >
> > #include <osgDB/FileUtils>
> >
> > #include <osgDB/WriteFile>
> > #include <osgDB/ReadFile>
> > #include <osgDB/FileNameUtils>
> > #include <osgDB/Registry>
> >
> > osg::Group* createImageBackground(osg::Image* video) {
> > osgART::VideoLayer* _layer = new osgART::VideoLayer();
> > _layer->setSize(*video);
> > osgART::VideoGeode* _geode = new
> > osgART::VideoGeode(osgART::VideoGeode::USE_TEXTURE_2D, video);
> > addTexturedQuad(*_geode,video->s(),video->t());
> > _layer->addChild(_geode);
> > return _layer;
> > }
> >
> > int main(int argc, char* argv[]) {
> >
> > // create a root node
> > osg::ref_ptr<osg::Group> root = new osg::Group;
> >
> > osgViewer::Viewer viewer;
> >
> > // attach root node to the viewer
> > viewer.setSceneData(root.get());
> >
> > // add relevant handlers to the viewer
> > viewer.addEventHandler(new osgViewer::StatsHandler);
> > viewer.addEventHandler(new osgViewer::WindowSizeHandler);
> > viewer.addEventHandler(new osgViewer::ThreadingHandler);
> > viewer.addEventHandler(new osgViewer::HelpHandler);
> >
> > // preload the video and tracker
> > int _video_id =
> > osgART::PluginManager::instance()->load("osgart_video_artoolkit2");
> > int _tracker_id =
> > osgART::PluginManager::instance()->load("osgart_tracker_artoolkit2");
> >
> > // Load a video plugin.
> > osg::ref_ptr<osgART::Video> video =
> > dynamic_cast<osgART::Video*>(osgART::PluginManager::instance()->get(_video_id));
> >
> > // check if an instance of the video stream could be started
> > if (!video.valid())
> > {
> > // Without video an AR application can not work. Quit if
> > none found.
> > osg::notify(osg::FATAL) << "Could not initialize video
> > plugin!" << std::endl;
> > exit(-1);
> > }
> >
> > // Open the video. This will not yet start the video stream but will
> > // get information about the format of the video which is essential
> > // for the connected tracker
> > video->open();
> >
> > osg::ref_ptr<osgART::Tracker> tracker =
> > dynamic_cast<osgART::Tracker*>(osgART::PluginManager::instance()->get(_tracker_id));
> >
> > if (!tracker.valid())
> > {
> > // Without tracker an AR application can not work. Quit if
> > none found.
> > osg::notify(osg::FATAL) << "Could not initialize tracker
> > plugin!" << std::endl;
> > exit(-1);
> > }
> >
> > // get the tracker calibration object
> > osg::ref_ptr<osgART::Calibration> calibration =
> > tracker->getOrCreateCalibration();
> >
> > // load a calibration file
> > if (!calibration->load(std::string("data/camera_para.dat")))
> > {
> >
> > // the calibration file was non-existing or couldnt be
> > loaded
> > osg::notify(osg::FATAL) << "Non existing or incompatible
> > calibration file" << std::endl;
> > exit(-1);
> > }
> >
> > // set the image source for the tracker
> > tracker->setImage(video.get());
> >
> > osgART::TrackerCallback::addOrSet(root.get(), tracker.get());
> >
> > osg::ref_ptr<osgART::Marker> markerA =
> > tracker->addMarker("single;karsten_a.patt;70;0;0");
> >
> > if (!markerA.valid())
> > {
> > // Without marker an AR application can not work. Quit if
> > none found.
> > osg::notify(osg::FATAL) << "Could not add marker!" <<
> > std::endl;
> > exit(-1);
> > }
> >
> > markerA->setActive(true);
> >
> > osg::ref_ptr<osg::MatrixTransform> arTransformA = new
> > osg::MatrixTransform();
> > osgART::attachDefaultEventCallbacks(arTransformA.get(),
> > markerA.get());
> > arTransformA->addChild(osgDB::readNodeFile("karsten.osg"));
> > arTransformA->getOrCreateStateSet()->setRenderBinDetails(100,
> > "RenderBin");
> >
> > osg::ref_ptr<osg::Group> videoBackground =
> > createImageBackground(video.get());
> > videoBackground->getOrCreateStateSet()->setRenderBinDetails(0,
> > "RenderBin");
> >
> > osg::ref_ptr<osg::Camera> cam = calibration->createCamera();
> >
> > cam->addChild(arTransformA.get());
> >
> > cam->addChild(videoBackground.get());
> >
> > root->addChild(cam.get());
> >
> > video->start();
> > return viewer.run();
> > }
> >
> > _______________________________________________
> > osg-users mailing list
> >
> > http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
> >
> _______________________________________________
> osg-users mailing list
>
> http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org
>
> ------------------
> Post generated by Mail2Forum
Hi hybr !
I'll try that tonight! :D
Thanks in advance!
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=36732#36732
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org