Discriminate over different types of DzNode

mattiascibienmattiascibien Posts: 105
edited December 1969 in DAZ SDK Developer Discussion

Hello,
work on my thesis finally produced some... wrong results unfortunately.

I have actually worked with DzSkeleton in my Bullet world (I cannot explain much more since the library I am working on is not available to the public now) but I actually need to work with all the other subclasses of DzNode, in particular everything that has a geometry.

How can I discriminate towards these classes? Since if I use DzNode class i get, other than DzSkeleton's geometry, even the geometry of every child (DzBone).

So checking if DzNode has geometry is not an option.

I have read of QtObject metatype system but I am not sure on how to use it.

Comments

  • Richard HaseltineRichard Haseltine Posts: 19,332
    edited December 1969

    You should check the inheritance and className of the node - but I think you are asking about the C++ SDK, not scripting, in which case this needs to be moved.

  • mattiascibienmattiascibien Posts: 105
    edited December 1969

    Yes. I was asking about the C++ SDK. Sorry for the wrong post. So should I use the ->className() in qt? does it return DzSkeleton if i pass a DzNode to it?

  • Richard HaseltineRichard Haseltine Posts: 19,332
    edited December 1969

    Moved to the SDK forum.

    I know only scripting, but if the item is a DzSkeleton then classFactory().className() will return that - as long as it's supported (check it inherits DzBase) - if I understand the DS3 docs I just looked at. (In script classname is directly available in the base class).

  • mattiascibienmattiascibien Posts: 105
    edited December 1969

    I am going to try something... Thank for your help. I will post something when I discover it.

  • edited December 1969

    If you want to know if a node inherits DzSkeleton, you can do this:

    if(node->inherits("DzSkeleton")) {}

    But, I wouldn't do this for the 4.5 SDK. I would instead check for DzFigure:

    if(node->inherits("DzFigure")) {}


    As the figure contains the skeleton, this is what you probably want to use.

    I don't think skeletons can exist without a figure in the 4.5 SDK.
    The SDK does it best to prevent you from allocating an instance of some classes.

    I was able to do it with the 3.x SDK, but not anymore.

  • Richard HaseltineRichard Haseltine Posts: 19,332
    edited December 1969

    There are now two types of figure and they are both sub-classes of DzSkeleton - DzFigure is a TriAx figure, DzLegacyFigure is what would have been a DzSkeleton in DS3.

  • mattiascibienmattiascibien Posts: 105
    edited December 1969

    But whi can't it work using DzSkeleton? Isn't it a class which is inherited by DzFigure and DzLegacyFigure?

  • edited December 1969

    gravity0 said:
    But whi can't it work using DzSkeleton? Isn't it a class which is inherited by DzFigure and DzLegacyFigure?

    You can search for DzSkeleton in nodes if you want. What I'm saying is you can also search for DzFigure instead,
    and cast that to a skeleton. This is because skeletons don't seem to exist by themselves.
    DzFigure also contains access to other useful data, like the skin and bone binding, weights, etc...

  • mattiascibienmattiascibien Posts: 105
    edited December 1969

    For what I need right now (retrieving node's geometry) checking for !DzBone (to prevent from adding both skeleton geometry and bones geometry twice) seems to be my case. Testing ASAP. ;)

  • Richard HaseltineRichard Haseltine Posts: 19,332
    edited December 1969

    coredevel said:
    gravity0 said:
    But whi can't it work using DzSkeleton? Isn't it a class which is inherited by DzFigure and DzLegacyFigure?

    You can search for DzSkeleton in nodes if you want. What I'm saying is you can also search for DzFigure instead,
    and cast that to a skeleton. This is because skeletons don't seem to exist by themselves.
    DzFigure also contains access to other useful data, like the skin and bone binding, weights, etc...

    At the (considerable) risk of misusing terminology I thin DzSkeleton is a virtual class - you can't create members, but you can create members of it's derivatives (DzFigure and DzLegacyFigure). You should, however, use DzSkeleton as an inheritance check if you are in a situation where either derivative type would be relevant.

  • rbtwhizrbtwhiz Posts: 436
    edited December 1969

    I haven't compiled this... but if it doesn't, it should be pretty close...

    // Get the primary selectionDzNode *node = dzScene->getPrimarySelection();// If we've got a node selectedif( node ){ // If the node can be cast to a DzBone if( qobject_cast(node) ) {  // We want the skeleton node  node = node->getSkeleton(); } // Get the object DzObject *object = node->getObject(); // If we've got an object if( object ) {  // Get the current shape  DzShape *shape = object->getCurrentShape();  // If we've got a shape  if( shape )  {   // Get the geometry   DzGeometry *geometry = shape->getGeometry();  } } // Else if we don't have an object else {  // Provide feedback  QMessageBox::warning(dzApp->getDialogParent(),   tr("Resource Error"), tr("The selected item has no object."), QMessageBox::Ok ); }}// Else if a node is not selectedelse{ // Provide feedback QMessageBox::warning(dzApp->getDialogParent(),   tr("Selection Error"), tr("You must have a node in the scene selected."), QMessageBox::Ok );}

    If you want to limit which DzNode subclasses you get the object from, you can use something like...

     // Declare and initialize a DzObject pointer that we'll check for later DzObject *object = NULL;  // If the node can be cast to a [weight mapped] DzFigure if( DzFigure *figure = qobject_cast(node) ) {  // Get the object  object = figure->getObject(); } // Else if the node can be cast to a [parametric] DzLegacyFigure else if( DzLegacyFigure *legacyFigure = qobject_cast(node) ) {  // Get the object  object = legacyFigure->getObject(); } // Else if the node can be cast to a DzSkeleton else if( DzSkeleton *skeleton = qobject_cast(node) ) {  // Get the object  object = skeleton->getObject(); }

    ... in place of...

     // Get the object DzObject *object = node->getObject();

    -Rob

Sign In or Register to comment.
Rocket Fuel