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 //-------------------------------------------------------------------------
Documentation generated on Mon Jun 9 11:45:57 2008 |
Generated with doxygen by Dimitri van Heesch , 1997-2007 |