Hi,
As mentioned in other post i've struggling myself trying to get OSG 3.0.1
working on my iMac. I've have simplified the problem a lot, so here it is. This
is a simple pick handler (base on the one that you can see in OSG cookbook):
Code:
class PickHandler: public osgGA::GUIEventHandler
{
public:
PickHandler(osg::ref_ptr<osg::Group> rootNode,
osg::ref_ptr<osg::Camera> camera);
virtual bool handle(const osgGA::GUIEventAdapter &ea,
osgGA::GUIActionAdapter &aa);
private:
osg::MatrixTransform *getOrCreateSelectionBox();
protected:
osg::ref_ptr<osg::Group> _rootNode;
osg::ref_ptr<osg::Camera> _camera;
osg::ref_ptr<osg::MatrixTransform> _selectionBox;
bool withFirstPoint;
double x1, y1, z1;
osg::ref_ptr<osg::Geode> _temporayDecoration;
};
PickHandler::PickHandler(osg::ref_ptr<osg::Group> rootNode,
osg::ref_ptr<osg::Camera> camera)
{
_rootNode = rootNode;
_camera = camera;
_selectionBox = NULL;
withFirstPoint = false;
x1 = 0.;
y1 = 0.;
z1 = 0.;
_temporayDecoration = NULL;
}
osg::MatrixTransform *PickHandler::getOrCreateSelectionBox()
{
if (_selectionBox == NULL)
{
osg::ref_ptr<osg::Geode> geode;
osg::StateSet *ss;
geode = new osg::Geode;
geode->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(),
1.0f)));
_selectionBox = new osg::MatrixTransform;
_selectionBox->setNodeMask(0x1);
_selectionBox->addChild(geode.get());
ss = _selectionBox->getOrCreateStateSet();
ss->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
ss->setAttributeAndModes(new
osg::PolygonMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE));
}
return _selectionBox.get();
}
bool PickHandler::handle(const osgGA::GUIEventAdapter &ea,
osgGA::GUIActionAdapter &aa)
{
osgViewer::Viewer *viewer;
viewer = dynamic_cast<osgViewer::Viewer *>(&aa);
if (ea.getEventType() == osgGA::GUIEventAdapter::RELEASE)
{
if (ea.getButton() == osgGA::GUIEventAdapter::LEFT_MOUSE_BUTTON)
{
osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector;
osgUtil::IntersectionVisitor *iv;
intersector = new
osgUtil::LineSegmentIntersector(osgUtil::Intersector::WINDOW, ea.getX(),
ea.getY());
iv = new osgUtil::IntersectionVisitor(intersector.get());
iv->setTraversalMask(~0x1);
viewer->getCamera()->accept(*iv);
if (intersector->containsIntersections() == true)
{
const osgUtil::LineSegmentIntersector::Intersection &result =
*(intersector->getIntersections().begin());
osg::BoundingBox bb;
osg::Vec3 worldCenter;
bb = result.drawable->getBound();
worldCenter = bb.center() *
osg::computeLocalToWorld(result.nodePath);
if (_selectionBox == NULL)
_selectionBox = getOrCreateSelectionBox();
_selectionBox->setMatrix(
osg::Matrix::scale(bb.xMax() - bb.xMin(), bb.yMax()
- bb.yMin(), bb.zMax() - bb.zMin())
*
osg::Matrix::translate(worldCenter));
_rootNode->addChild(_selectionBox.get());
}
else
{
if (_selectionBox != NULL)
{
_rootNode->removeChild(_selectionBox.get());
_selectionBox = NULL;
}
}
}
else if (ea.getButton() == osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON)
{
if (_selectionBox != NULL)
{
_rootNode->removeChild(_selectionBox.get());
_selectionBox = NULL;
}
withFirstPoint = false;
}
}
return false; // Event not maganed, false to continue to be processing by
another event handlers
}
Well, this is the rest of the code:
Code:
static osg::ref_ptr<osg::Group> i_create_scenegraph5(void)
{
osg::ref_ptr<osg::Group> root;
osg::ref_ptr<osg::Geode> geometry;
osg::ref_ptr<osg::ShapeDrawable> shape1, shape2, shape3;
shape1 = new osg::ShapeDrawable();
shape1->setShape(new osg::Box(osg::Vec3(-3, 0., 0.), 2., 2., 1.));
shape1->setColor(osg::Vec4(0., 0., 1., 1.));
shape2 = new osg::ShapeDrawable();
shape2->setShape(new osg::Sphere(osg::Vec3(3., 0., 0.), 1.f));
shape3 = new osg::ShapeDrawable();
shape3->setShape(new osg::Cone(osg::Vec3(0., 0., 0.), 1., 1.));
geometry = new osg::Geode();
geometry->addDrawable(shape1.get());
geometry->addDrawable(shape2.get());
geometry->addDrawable(shape3.get());
root = new osg::Group;
root->addChild(geometry.get());
return root.get();
}
int main(int argc, char **argv)
{
osg::ref_ptr<osg::Group> root;
osg::ref_ptr<PickHandler> pickHandler;
osgViewer::Viewer viewer;
root = i_create_scenegraph5();
pickHandler = new PickHandler(root.get(), viewer.getCamera());
viewer.setSceneData(root.get());
viewer.addEventHandler(pickHandler.get());
viewer.setUpViewInWindow(100, 100, 400, 350);
return viewer.run();
}
When i click over one of the figures it works and the bounding box appears.
After that, if i click in another figure, then i get the following error (with
backtrace):
Code:
osgtest(30288,0x7fff7c4a7960) malloc: *** error for object 0x10ac534e0: pointer
being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
* thread #1: tid = 0x2703, 0x00007fff90cf96bc
libsystem_c.dylib`malloc_error_break, stop reason = breakpoint 2.1
frame #0: 0x00007fff90cf96bc libsystem_c.dylib`malloc_error_break
frame #1: 0x00007fff90cf9805 libsystem_c.dylib`free + 318
frame #2: 0x00007fff959ca702
libstdc++.6.dylib`std::string::_Rep::_M_dispose(std::allocator<char> const&) +
60
frame #3: 0x00007fff959ca740 libstdc++.6.dylib`std::basic_string<char,
std::char_traits<char>, std::allocator<char> >::~basic_string() + 44
frame #4: 0x0000000107f35fc4 libosgd.80.dylib`osg::Object::~Object() + 116
at Object.cpp:45
frame #5: 0x0000000107f930c5 libosgd.80.dylib`osg::Shape::~Shape() + 21 at
Shape.cpp:20
frame #6: 0x0000000107f93325 libosgd.80.dylib`osg::Box::~Box() + 21 at
Shape.cpp:36
frame #7: 0x0000000107f93305 libosgd.80.dylib`osg::Box::~Box() + 21 at
Shape.cpp:35
frame #8: 0x0000000107f932a8 libosgd.80.dylib`osg::Box::~Box() + 24 at
Shape.cpp:35
frame #9: 0x0000000107f742da
libosgd.80.dylib`osg::Referenced::signalObserversAndDelete(bool, bool) const +
298 at Referenced.cpp:323
frame #10: 0x0000000107ac5734
libosgAnimationd.80.dylib`osg::Referenced::unref() const + 84 at Referenced:198
frame #11: 0x0000000107e35b10
libosgd.80.dylib`osg::ref_ptr<osg::Shape>::~ref_ptr() + 48 at ref_ptr:35
frame #12: 0x0000000107e2e525
libosgd.80.dylib`osg::ref_ptr<osg::Shape>::~ref_ptr() + 21 at ref_ptr:35
frame #13: 0x0000000107e294da libosgd.80.dylib`osg::Drawable::~Drawable() +
186 at Drawable.cpp:273
frame #14: 0x0000000107fa4dfa
libosgd.80.dylib`osg::ShapeDrawable::~ShapeDrawable() + 58 at
ShapeDrawable.cpp:1938
frame #15: 0x0000000107fa4db5
libosgd.80.dylib`osg::ShapeDrawable::~ShapeDrawable() + 21 at
ShapeDrawable.cpp:1937
frame #16: 0x0000000107fa4d58
libosgd.80.dylib`osg::ShapeDrawable::~ShapeDrawable() + 24 at
ShapeDrawable.cpp:1937
frame #17: 0x0000000107f742da
libosgd.80.dylib`osg::Referenced::signalObserversAndDelete(bool, bool) const +
298 at Referenced.cpp:323
frame #18: 0x0000000107ac5734
libosgAnimationd.80.dylib`osg::Referenced::unref() const + 84 at Referenced:198
frame #19: 0x0000000107e5954d
libosgd.80.dylib`osg::ref_ptr<osg::Drawable>::operator=(osg::Drawable*) + 125
at ref_ptr:58
frame #20: 0x0000000109bfe3a7
libosgUtild.80.dylib`osgUtil::RenderLeaf::reset() + 55 at RenderLeaf:65
frame #21: 0x0000000109bf97e4
libosgUtild.80.dylib`osgUtil::CullVisitor::reset() + 436 at CullVisitor.cpp:127
frame #22: 0x0000000109d9be70
libosgUtild.80.dylib`osgUtil::SceneView::cullStage(osg::Matrixd const&,
osg::Matrixd const&, osgUtil::CullVisitor*, osgUtil::StateGraph*,
osgUtil::RenderStage*, osg::Viewport*) + 2096 at SceneView.cpp:910
frame #23: 0x0000000109d9b545
libosgUtild.80.dylib`osgUtil::SceneView::cull() + 5557 at SceneView.cpp:845
frame #24: 0x000000010a65a2ad
libosgViewerd.80.dylib`osgViewer::Renderer::cull() + 685 at Renderer.cpp:615
frame #25: 0x000000010a6d2000
libosgViewerd.80.dylib`osgViewer::ViewerBase::renderingTraversals() + 8960 at
ViewerBase.cpp:793
frame #26: 0x000000010a6cfcf2
libosgViewerd.80.dylib`osgViewer::ViewerBase::frame(double) + 178 at
ViewerBase.cpp:645
frame #27: 0x000000010a6cfbbe
libosgViewerd.80.dylib`osgViewer::ViewerBase::run() + 430 at ViewerBase.cpp:612
frame #28: 0x000000010a6c153c
libosgViewerd.80.dylib`osgViewer::Viewer::run() + 220 at Viewer.cpp:375
frame #29: 0x0000000107a1b94a osgtest`main + 522 at main2.cpp:171
frame #30: 0x0000000107a103c4 osgtest`start + 52
System: Apple iMac 21.5 Core i5 with Mac Os Lion 10.7.3 and Xcode 4.3.3.
Compiler: Apple LLVM 3.1 (Clang, Clang++).
I have tried:
- Read OSGQSG for memory management
- Read OSG Beginner' s guide
- Read OSG Cookbook 3.0
- Search through the forums (this is why a read a lot)
- Building after executing: sudo make uninstall.
- Building using GCC 4.2 (same result)
- Reinstalling Command Line Tools (February'12 version) (same result)
- Reinstalling XCode (i was becoming mad, same result)
I've a mbp with the same OS, XCode and Command Line tools version. Everything
works fine, but I suspect that simply the error doesn't appears on it because
who knows why.
I figure that the problem may have two causes:
- Some obscure build issue.
- I don't understand how to manage the scene graph memory.
Remember that I want to delete the node from de scene, I don't want to hide it.
I have made a simplified version of what I'm trying to do in order to get some
guidance from the community.
Yes, it's a long post, but I'm fighting with this problem since two weeks and I
don't know how to solve it.
Thank you in advance, Manuel.[/code]
------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=48819#48819
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org