[osg-users] Converting a Drawable object to a Geometry object

Paul Martz pmartz at skew-matrix.com
Thu Jul 31 06:46:07 PDT 2008


You have the source code for ShapeDrawable; why not simply look at it to see
how it generates the texture coordinates?
   -Paul
 


  _____  

From: osg-users-bounces at lists.openscenegraph.org
[mailto:osg-users-bounces at lists.openscenegraph.org] On Behalf Of Franclin
Foping
Sent: Thursday, July 31, 2008 6:24 AM
To: OpenSceneGraph Users
Subject: Re: [osg-users] Converting a Drawable object to a Geometry object


Hi Matthew,
 Thanks a lot for your reply. Anyway, I have posted another similar issue.
Maybe my algorithm was wrong. The idea behind this thing is to get the
texture coordinates of a loaded model. A loaded model is made up several
Drawable objects and I thought it could be possible to turn them into a
Geometry object to get texture coordinates but I was wrong! 
 Do you have any other algorithm to do it? 
 Find the pseudo-code in the previous post.
 Thanks for your help.
 Franclin.

"Fuesz, Matthew" <matthew.fuesz at lmco.com> a écrit : 

The problem is that you are trying to cast a pointer to a base class to a
pointer to a subclass. This would only work if the actual object being
pointed to is an instance of that subclass (or a further subclass of that
subclass). Geometry is derived from Drawable, not the other way around –
which seems to be the mistake that you are making.

Please refer to the inheritance diagrams for osg::Drawable and
osg::Geometry.

Matthew W. Fuesz
Software Engineer Asc.
Lockheed Martin STS
1210 Massillon Road
Akron, OH 44315
matthew.fuesz at lmco.com


  _____  

From: osg-users-bounces at lists.openscenegraph.org
[mailto:osg-users-bounces at lists.openscenegraph.org] On Behalf Of Franclin
Foping
Sent: Thursday, July 31, 2008 7:17 AM
To: OpenSceneGraph Users
Subject: [osg-users] RE : Re: RE : Re: Converting a Drawable object to a
Geometry object

Hi Ulrich,
 I don't think you get the trick, from what you said, the only thing wrong
is the ShapeDrawable. 
 I will post a new issue in a short while which is not different from this
post and you will see that even without using ShapeDrawable objects, the
same issue still hang around.
 Just bear with me.
 Thanks for your help.
 Franclin.

Ulrich Hertlein <u.hertlein at sandbox.de> a écrit :
Hi Franclin,

> Downcasting from a derived class to a parent class is possible with the 
> dynamic_cast operator. From what you have written in your mail, it looks
like
> the snippet won't compile at all, I can bet something it will as I tried
it a
> couple of hours ago. Try it yourself and let me know.

The code is correct and will compile, it's just that the casts won't work as
you 
expect.

Okay, let's see:
>> osg::Geode myGeode = new osg::Geode;
>> myGeode->addDrawable(new osg::ShapeDrawable(new
osg::Box(osg::Vec3(),1,1,1)));
>> osg::Drawable* myDrawable = myGeode->getDrawable(0);

myDrawable is a Drawable* to a ShapeDrawable
This is fine since Drawable is a base class of ShapeDrawable.
(I assume there aren't any other Drawables in myGeode and the first one is 
actually the ShapeDrawable you added.)

> osg::Geometry* myGeom = myDrawable->asGeometry();

If you take a look at 'osg::Drawable' you'll see that this actually *always*

returns 0 and ShapeDrawable doesn't override it (Geometry is the only class
that 
overrides it).

However, even doing what the comment says (and what you're doing for
'myGeom2'):

osg::Geometry* geom = dynamic_cast(this)

This cannot succeed since the *object* is-a ShapeDrawable (even though the 
pointer is Drawable*).

> Of course, downcasting from shapedrawable to geometry would have not
worked
> and even worse would have not compiled at all.

Agreed. But introducing a Drawable* doesn't help because it doesn't change
the 
type of the object the pointer is pointing to.

ShapeDrawable* shape = new ShapeDrawable(...)
Drawable* drawable = dynamic_cast(shape); // OK, is a base class
Geometry* geom = dynamic_cast(drawable); // is always 0

I'm probably not explaining this as clearly as possible but try to think of
it 
this way: you have a base class 'Vehicle' and two derived classes 'Car' and 
'Plane'. You can create a 'Plane' and have a 'Vehicle' pointer to it but you

can't cast that pointer to a 'Car'.

Hope this helps.

Cheers,
/ulrich

_______________________________________________
osg-users mailing list
osg-users at lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org



  

  _____  

Envoyé avec Yahoo!
<http://us.rd.yahoo.com/mailuk/taglines/isp/control/*http:/us.rd.yahoo.com/e
vt=52423/*http:/fr.docs.yahoo.com/mail/overview/index.html> Mail.
Une boite mail plus intelligente. 
_______________________________________________
osg-users mailing list
osg-users at lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org





  _____  

Envoyé avec Yahoo!
<http://us.rd.yahoo.com/mailuk/taglines/isp/control/*http://us.rd.yahoo.com/
evt=52423/*http://fr.docs.yahoo.com/mail/overview/index.html> Mail.
Une boite mail plus intelligente. 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openscenegraph.org/pipermail/osg-users-openscenegraph.org/attachments/20080731/e425d7af/attachment-0003.htm>


More information about the osg-users mailing list