From: <ju...@us...> - 2007-09-30 05:47:26
|
Revision: 16001 http://bzflag.svn.sourceforge.net/bzflag/?rev=16001&view=rev Author: judecn Date: 2007-09-29 22:47:27 -0700 (Sat, 29 Sep 2007) Log Message: ----------- Group objects now encapsulate BZW1-conformant objects inside separate transformation containers that will eventually apply an inverse transformation present in the top-level group container for cosmetic reasons-- BZW1 objects in BZFlag's scenegraph aren't affected by BZW2 transformations within groups, it seems. Modified Paths: -------------- trunk/bzworkbench/Debug/makefile trunk/bzworkbench/include/objects/group.h trunk/bzworkbench/include/render/Renderable.h trunk/bzworkbench/share/test.bzw trunk/bzworkbench/src/objects/bz2object.cpp trunk/bzworkbench/src/objects/group.cpp Modified: trunk/bzworkbench/Debug/makefile =================================================================== --- trunk/bzworkbench/Debug/makefile 2007-09-29 19:26:16 UTC (rev 16000) +++ trunk/bzworkbench/Debug/makefile 2007-09-30 05:47:27 UTC (rev 16001) @@ -56,7 +56,7 @@ bzworkbench: $(OBJS) $(USER_OBJS) @echo 'Building target: $@' @echo 'Invoking: GCC C++ Linker' - g++ -L/usr/lib -L/usr/local/lib/ -o "bzworkbench" $(OBJS) $(USER_OBJS) $(LIBS) + g++ -L/usr/lib -L/usr/local/lib/ -o"bzworkbench" $(OBJS) $(USER_OBJS) $(LIBS) @echo 'Finished building target: $@' @echo ' ' Modified: trunk/bzworkbench/include/objects/group.h =================================================================== --- trunk/bzworkbench/include/objects/group.h 2007-09-29 19:26:16 UTC (rev 16000) +++ trunk/bzworkbench/include/objects/group.h 2007-09-30 05:47:27 UTC (rev 16001) @@ -22,6 +22,10 @@ #include <osg/Vec3> +// use this node name to identify transformation nodes containing bz2objects that do NOT support +// BZW2 features, such as spin, shift, etc. +#define BZW1_CONTAINER_NAME "bzw1_CONTAINER_name" + using namespace std; class define; // pre-declare define class @@ -66,6 +70,12 @@ // the actual object group container osg::ref_ptr< Renderable > container; + // map objects in the group definition that do NOT support BZW2 features to transformation nodes + // that will "undo" transformations applied to the container. Essentially, these nodes will + // exist between the container and the actual objects; we need to ref them to quickly distinguish + // between BZW1 and BZW2 objects. + map< osg::ref_ptr< bz2object >, osg::ref_ptr< Renderable > > bzw1_containers; + // reference to the definition define* def; Modified: trunk/bzworkbench/include/render/Renderable.h =================================================================== --- trunk/bzworkbench/include/render/Renderable.h 2007-09-29 19:26:16 UTC (rev 16000) +++ trunk/bzworkbench/include/render/Renderable.h 2007-09-30 05:47:27 UTC (rev 16001) @@ -62,28 +62,28 @@ // angular rotators (easier than building quaterions and setting the attitude // angles is in degrees, not radians virtual void setRotationX( float r ) { - this->rotation.set( r, rotation.y(), rotation.z() ); - this->setAttitude( osg::Quat( osg::DegreesToRadians( rotation.x() ), osg::Vec3( 1.0, 0.0, 0.0 ), - osg::DegreesToRadians( rotation.y() ), osg::Vec3( 0.0, 1.0, 0.0 ), - osg::DegreesToRadians( rotation.z() ), osg::Vec3( 0.0, 0.0, 1.0 ) ) ); + this->rotation.set( r, this->rotation.y(), this->rotation.z() ); + this->setAttitude( osg::Quat( osg::DegreesToRadians( this->rotation.x() ), osg::Vec3( 1.0, 0.0, 0.0 ), + osg::DegreesToRadians( this->rotation.y() ), osg::Vec3( 0.0, 1.0, 0.0 ), + osg::DegreesToRadians( this->rotation.z() ), osg::Vec3( 0.0, 0.0, 1.0 ) ) ); } virtual void setRotationY( float r ) { - this->rotation.set( rotation.x(), r, rotation.z() ); - this->setAttitude( osg::Quat( osg::DegreesToRadians( rotation.x() ), osg::Vec3( 1.0, 0.0, 0.0 ), - osg::DegreesToRadians( rotation.y() ), osg::Vec3( 0.0, 1.0, 0.0 ), - osg::DegreesToRadians( rotation.z() ), osg::Vec3( 0.0, 0.0, 1.0 ) ) ); + this->rotation.set( this->rotation.x(), r, this->rotation.z() ); + this->setAttitude( osg::Quat( osg::DegreesToRadians( this->rotation.x() ), osg::Vec3( 1.0, 0.0, 0.0 ), + osg::DegreesToRadians( this->rotation.y() ), osg::Vec3( 0.0, 1.0, 0.0 ), + osg::DegreesToRadians( this->rotation.z() ), osg::Vec3( 0.0, 0.0, 1.0 ) ) ); } virtual void setRotationZ( float r ) { - this->rotation.set( rotation.x(), rotation.y(), r ); - this->setAttitude( osg::Quat( osg::DegreesToRadians( rotation.x() ), osg::Vec3( 1.0, 0.0, 0.0 ), - osg::DegreesToRadians( rotation.y() ), osg::Vec3( 0.0, 1.0, 0.0 ), - osg::DegreesToRadians( rotation.z() ), osg::Vec3( 0.0, 0.0, 1.0 ) ) ); + this->rotation.set( this->rotation.x(), this->rotation.y(), r ); + this->setAttitude( osg::Quat( osg::DegreesToRadians( this->rotation.x() ), osg::Vec3( 1.0, 0.0, 0.0 ), + osg::DegreesToRadians( this->rotation.y() ), osg::Vec3( 0.0, 1.0, 0.0 ), + osg::DegreesToRadians( this->rotation.z() ), osg::Vec3( 0.0, 0.0, 1.0 ) ) ); } virtual void setRotation( float x, float y, float z ) { this->rotation.set( x, y, z); - this->setAttitude( osg::Quat( osg::DegreesToRadians( rotation.x() ), osg::Vec3( 1.0, 0.0, 0.0 ), - osg::DegreesToRadians( rotation.y() ), osg::Vec3( 0.0, 1.0, 0.0 ), - osg::DegreesToRadians( rotation.z() ), osg::Vec3( 0.0, 0.0, 1.0 ) ) ); + this->setAttitude( osg::Quat( osg::DegreesToRadians( this->rotation.x() ), osg::Vec3( 1.0, 0.0, 0.0 ), + osg::DegreesToRadians( this->rotation.y() ), osg::Vec3( 0.0, 1.0, 0.0 ), + osg::DegreesToRadians( this->rotation.z() ), osg::Vec3( 0.0, 0.0, 1.0 ) ) ); } virtual void setRotation( const osg::Vec3d& rot ) { this->setRotation( rot.x(), rot.y(), rot.z() ); } Modified: trunk/bzworkbench/share/test.bzw =================================================================== --- trunk/bzworkbench/share/test.bzw 2007-09-29 19:26:16 UTC (rev 16000) +++ trunk/bzworkbench/share/test.bzw 2007-09-30 05:47:27 UTC (rev 16001) @@ -0,0 +1,27 @@ +world + name test + size 400 + flagHeight 10 +end + +define group_1 + box + position 10 10 0 + size 10 10 10 + end + + pyramid + position -10 10 0 + size 10 10 10 + end +enddef + +group group_1 + position 100 100 0 +end + +group group_1 + position -100 100 0 + scale 2 2 2 +end + Modified: trunk/bzworkbench/src/objects/bz2object.cpp =================================================================== --- trunk/bzworkbench/src/objects/bz2object.cpp 2007-09-29 19:26:16 UTC (rev 16000) +++ trunk/bzworkbench/src/objects/bz2object.cpp 2007-09-30 05:47:27 UTC (rev 16001) @@ -676,3 +676,6 @@ material* mat = material::computeFinalMaterial( materials ); SceneBuilder::assignBZMaterial( mat, this ); } + + +// add a transformation Modified: trunk/bzworkbench/src/objects/group.cpp =================================================================== --- trunk/bzworkbench/src/objects/group.cpp 2007-09-29 19:26:16 UTC (rev 16000) +++ trunk/bzworkbench/src/objects/group.cpp 2007-09-30 05:47:27 UTC (rev 16001) @@ -24,6 +24,7 @@ this->setPos( osg::Vec3( 0.0, 0.0, 0.0 ) ); this->container = new Renderable(); + this->bzw1_containers = map< osg::ref_ptr< bz2object >, osg::ref_ptr< Renderable > >(); this->geoRing = NULL; } @@ -124,7 +125,7 @@ // make sure we keep the Euler "spin" transformations 0 in the group // and forward any existing ones to the container node osg::Vec3 rot = this->getRotation(); - if( this->container.get() != NULL ) + if( this->container.get() != NULL && rot.x() != 0 && rot.y() != 0 && rot.z() != 0 ) this->container->setRotation( rot ); this->setRotation( osg::Vec3( 0, 0, 0 ) ); @@ -150,8 +151,7 @@ break; case UpdateMessage::SET_ROTATION_FACTOR: // handle an angular translation - this->container->setRotation( *(message.getAsRotationFactor()) + this->container->getRotation() ); - + this->container->setRotation( this->container->getRotation() + *(message.getAsRotationFactor()) ); break; case UpdateMessage::SET_SCALE: // handle a new scale @@ -214,8 +214,11 @@ for( unsigned int i = 0; i < this->container->getNumChildren(); i++ ) { osg::Node* child = this->container->getChild( i ); bz2object* obj = dynamic_cast< bz2object* >(child); + + // this cast will only work, literally, for BZW2 objects (BZW1 objects are contained within separate + // transformation containers of type Renderable.) if( obj ) { - // only count bz2object instances + // get position and size osg::Vec3 p = obj->getPos(); osg::Vec3 size = obj->getSize(); @@ -231,6 +234,32 @@ maxRadius2 = len2; } } + // see if this is a BZW1 object + else { + Renderable* r = dynamic_cast< Renderable* >(child); + // if this is a container node, then it should have a child that is a bz2object. + if( r && r->getName() == BZW1_CONTAINER_NAME ) { + bz2object* obj = dynamic_cast< bz2object* >( r->getChild(0) ); + // if this cast worked, then try to get its position and size + if( obj ) { + // get position and size + osg::Vec3 p = obj->getPos(); + osg::Vec3 size = obj->getSize(); + + // compute the largest dimension + float maxSizeDim = max( size.x(), max( size.y(), size.z() ) ); + maxDim = max( maxSizeDim, maxDim ); + + // the group's position relative to the objects is (0,0,0), so just square the position and take the length + float len2 = p.x()*p.x() + p.y()*p.y() + p.z()*p.z(); + + // see if it's bigger than the maximum radius + if( len2 > maxRadius2 ) { + maxRadius2 = len2; + } + } + } + } } } @@ -320,6 +349,17 @@ // remove all current objects if( this->container->getNumChildren() > 0 ) this->container->removeChildren(0, this->container->getNumChildren()); + + // remove all bzw1 objects (and de-alloc them) + if( this->bzw1_containers.size() > 0 ) { + for( map< osg::ref_ptr< bz2object >, osg::ref_ptr< Renderable > >::iterator i = this->bzw1_containers.begin(); i != this->bzw1_containers.end(); ++i) { + if( i->second != NULL ) + i->second->removeChildren( 0, i->second->getNumChildren()); + } + + // clear the map + this->bzw1_containers.clear(); + } // if the def is valid, add the objects if( def != NULL ) { @@ -348,14 +388,31 @@ // add the children to the container node, but offset their positions by the group's position // (i.e. apply a SHIFT transformation for( vector< osg::ref_ptr< bz2object > >::iterator i = objects.begin(); i != objects.end(); i++ ) { + // if this is a bzw2 object, then just add it to the container + if( (*i)->isKey("spin") || (*i)->isKey("shift") || (*i)->isKey("scale") || (*i)->isKey("shear") ) + // add the object to the container + this->container->addChild( i->get() ); + + // otherwise, create a bzw1 container (i.e. a transformation node that has the inverse + // transformation of the container, because bzw1 objects do NOT share all of the group's transformations. + // This is for cosmetic purposes only. + else { + // make a new node + Renderable* r = new Renderable( i->get() ); + // name it as such + r->setName( BZW1_CONTAINER_NAME ); + + // add the current node as a child + r->addChild( i->get() ); + + // map the child to this node + this->bzw1_containers[ i->get() ] = r; + + // add the bzw1 container to the main container. + this->container->addChild( r ); + } - // get the transformation list - // vector< osg::ref_ptr< BZTransform > > transforms = (*i)->getTransformations(); - - - // add the object to the container - this->container->addChild( i->get() ); - + // set the position of this object relative to the center of the group i->get()->setPos( i->get()->getPos() - position ); printf(" added %s\n", (*i)->getName().c_str() ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |