Hi hybr! I can feel that I'm getting close.
I've done all what you say.. the project compile sucessfully, but I'm getting a black texture replacing my original static texture. I tried all first 8 texture units, as you say. I know that the imagestream is playing, because I can see the 'resize' messages in console. Did I forget something? (code attached below). Thanks, Almir ------------------ Read this topic online here: http://forum.openscenegraph.org/viewtopic.php?p=36755#36755
/* -*-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> #include <osg/NodeVisitor> 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; } 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 (unsigned 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; }; 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"); GetDrawableByNameVisitor gdbny("Standard_3"); arTransformA->accept(gdbny); if (gdbny.getResult()) { osg::Image* videocomp = osgDB::readImageFile("comp2.mov"); osg::ImageStream* myImageStream = dynamic_cast<osg::ImageStream*>(videocomp); osg::Texture2D* animatedTexture = new osg::Texture2D(myImageStream); if(myImageStream->valid()) { std::cout << "Got movie" << std::endl; myImageStream->play(); //is->pause(); } else { std::cout << "No movie!" << std::endl; exit(1); } gdbny.getResult()->getOrCreateStateSet()->setTextureAttribute(0,animatedTexture,osg::StateAttribute::ON); } 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 [email protected] http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

