OMKOffsetExtension.cpp

Go to the documentation of this file.
00001 #include "OMKOffsetExtension.h"
00002 #include "OMKExtensibleSimulatedObject.inl"
00003 #include "OMKParametersAccessor.inl"
00004 //-------------------------------------------------------------------------
00005 using namespace OMK ;
00006 using namespace OMK::Type ;
00007 
00008 //=========================================================================
00009 // PreOffsetExtension
00010 //=========================================================================
00011 REGISTER_EXTENSION_FACTORY( PreOffsetExtension, "PreOffset" ) ;
00012 //-------------------------------------------------------------------------
00013 PreOffsetExtension::PreOffsetExtension( ExtensibleSimulatedObject* owner,
00014                                   const Name& id,
00015                                   bool registerExtension )
00016 : ExtensionT< ExtensibleSimulatedObject >( owner, id, registerExtension ),
00017   _attributeAccessor( 0 ),
00018   _offset( id, OMK::Type::Transform::sk_identity ),
00019   _ignoreRotate( false ),
00020   _ignoreScale( false )
00021 {
00022   // add the attribute Offset to the object
00023   _owner->addAttribute( _offset ) ;
00024 }
00025 //-------------------------------------------------------------------------
00026 PreOffsetExtension::~PreOffsetExtension()
00027 {
00028 }
00029 //-------------------------------------------------------------------------
00030 bool PreOffsetExtension::loadExtensionParameters(
00031   const ConfigurationParameterDescriptor * node )
00032 {
00033   // Retrieve the visual objects
00034   bool ok = true ;
00035   // Offset value
00036   _offset.loadParameters( node, "Offset" ) ;
00037   // Attribute to offset
00038   Name attributeName ;
00039   ok = ok && ParametersAccessor::get( node, "Attribute", attributeName, _owner ) ;
00040   _attributeAccessor =
00041     ok ? _owner->getBaseAttribute< OMK::Type::Transform >( attributeName ) : 0 ;
00042   ok = ok && _attributeAccessor != 0 ;
00043   ParametersAccessor::get( node, "IgnoreRotate", _ignoreRotate ) ;
00044   ParametersAccessor::get( node, "IgnoreScale", _ignoreScale ) ;
00045 
00046   return ok ;
00047 }
00048 //-------------------------------------------------------------------------
00049 void PreOffsetExtension::preComputeParameters()
00050 {
00051   OMASSERTM( _attributeAccessor,
00052              debugMsg( this, _owner ) << "Must be initalised !" ) ;
00053 
00054   Transform result( _attributeAccessor->get() ) ;
00055   Transform offset( _offset.get() ) ;
00056   Transform value( _attributeAccessor->get() ) ;
00057   if( offset.isIdentity() )
00058   {
00059     result = value ;
00060   }
00061   else if( value.isIdentity() )
00062   {
00063     result = offset ;
00064   }
00065   else
00066   {
00067     Wm4::Matrix3f rotate( Wm4::Matrix3f::IDENTITY ) ;
00068     if( !_ignoreRotate ) 
00069     {
00070       result.setRotate( offset.getRotate() * value.getRotate() ) ;
00071       rotate = offset.getRotate() ;
00072     }
00073 
00074     if( _ignoreScale )
00075     {
00076       result.setTranslate( rotate * value.getTranslate() +
00077                            offset.getTranslate() ) ;
00078     }
00079     else
00080     {
00081       if( offset.isUniformScale() )
00082       {
00083         result.setTranslate( offset.getUniformScale() *
00084                              ( rotate * value.getTranslate() ) +
00085                              offset.getTranslate() ) ;
00086 
00087         if ( value.isUniformScale() )
00088         {
00089           result.setUniformScale( offset.getUniformScale() *
00090                                   value.getUniformScale() ) ;
00091         }
00092         else
00093         {
00094           result.setScale( offset.getUniformScale() * value.getScale() ) ;
00095         }
00096       }
00097       else
00098       {
00099         Wm4::Vector3f v0_translate( rotate * value.getTranslate() ) ;
00100         Wm4::Vector3f v1_translate( offset.getScale()[0] * v0_translate[0],
00101                                     offset.getScale()[1] * v0_translate[1],
00102                                     offset.getScale()[2] * v0_translate[2] ) ;
00103         result.setTranslate( v1_translate + offset.getTranslate() ) ;
00104 
00105         if ( value.isUniformScale() )
00106         {
00107           result.setScale( offset.getScale() * value.getUniformScale() ) ;
00108         }
00109         else
00110         {
00111           Wm4::Vector3f v0_scale( rotate * value.getScale() ) ;
00112           Wm4::Vector3f v1_scale( offset.getScale()[0] * v0_scale[0],
00113                                   offset.getScale()[1] * v0_scale[1],
00114                                   offset.getScale()[2] * v0_scale[2] ) ;
00115           result.setScale( v1_scale ) ;
00116         }
00117       }
00118     }
00119   }
00120 
00121   _attributeAccessor->set( result ) ;
00122 }
00123 //-------------------------------------------------------------------------
00124 
00125 //=========================================================================
00126 // PostOffsetExtension
00127 //=========================================================================
00128 REGISTER_EXTENSION_FACTORY( PostOffsetExtension, "PostOffset" ) ;
00129 //-------------------------------------------------------------------------
00130 PostOffsetExtension::PostOffsetExtension( ExtensibleSimulatedObject* owner,
00131                                   const Name& id,
00132                                   bool registerExtension )
00133 : PreOffsetExtension( owner, id, registerExtension )
00134 {
00135 }
00136 //-------------------------------------------------------------------------
00137 PostOffsetExtension::~PostOffsetExtension()
00138 {
00139 }
00140 //-------------------------------------------------------------------------

logo OpenMask

Documentation generated on Mon Jun 9 11:45:57 2008

Generated with doxygen by Dimitri van Heesch ,   1997-2007