OMKTriggerExtension.cpp

Go to the documentation of this file.
00001 /************************************************************************/
00002 /* This file is part of openMask(c) INRIA, CNRS, Universite de Rennes 1 */
00003 /* 1993-2002, thereinafter the Software                                 */
00004 /*                                                                      */
00005 /* The Software has been developped within the Siames Project.          */
00006 /* INRIA, the University of Rennes 1 and CNRS jointly hold intellectual */
00007 /* property rights                                                      */
00008 /*                                                                      */
00009 /* The Software has been registered with the Agence pour la Protection  */
00010 /* des Programmes (APP) under registration number                       */
00011 /* IDDN.FR.001.510008.00.S.P.2001.000.41200                             */
00012 /*                                                                      */
00013 /* This file may be distributed under the terms of the Q Public License */
00014 /* version 1.0 as defined by Trolltech AS of Norway and appearing in    */
00015 /* the file LICENSE.QPL included in the packaging of this file.         */
00016 /*                                                                      */
00017 /* Licensees holding valid specific licenses issued by INRIA, CNRS or   */
00018 /* Universite Rennes 1 for the software may use this file in            */
00019 /* acordance with that specific license                                 */
00020 /************************************************************************/
00021 #include "OMKTriggerExtension.h"
00022 #include "OMKParametersAccessor.inl"
00023 #include "OMKAttribute.inl"
00024 
00025 using namespace OMK ;
00026 using namespace OMK::Type ;
00027 
00028 //=============================================================================
00029 REGISTER_EXTENSION_FACTORY( DistanceToExtension, "DistanceTo" ) ;
00030 //-------------------------------------------------------------------------
00031 DistanceToExtension::DistanceToExtension( OMK::ExtensibleSimulatedObject* owner, const Name& id, bool registerExtension ) 
00032 : ExtensionT< ExtensibleSimulatedObject >( owner, id, registerExtension ),
00033   _target( 0 ),
00034   _distance( Name( id.getString() + "Distance" ), 0.0f ),
00035   _positionAccessor( 0 ),
00036   _deleteTarget( false )
00037 {
00038   const ConfigurationParameterDescriptor* node = 0 ;
00039   ParametersAccessor::get( owner->getObjectDescriptor().getExtensionsParameters(), id.getString(), node ) ;
00040   // First, try to find the attribute id in the configuration
00041   Name targetId ;
00042   if( ParametersAccessor::get( node, "TargetId", targetId ) )
00043   {
00044     _target = _owner->getBaseAttribute< Transform >( targetId ) ;
00045     OMASSERTM( _target, "Cannot find the target attribute \"" << targetId << "\", maybe not yet available" ) ;
00046   }
00047   // Second, try to find the attribute with the id "Target"
00048   if( !_target )
00049   {
00050     _target = _owner->getBaseAttribute< Transform >( "Target" ) ;
00051   }
00052   // Third, create the attribute with the id "Target"
00053   if( !_target )
00054   {
00055     _target = new AttributeT< Transform >( Name( id.getString() + "Target" ), Transform() ),
00056     owner->addAttribute( *_target ) ;
00057     _deleteTarget = true ;
00058   }
00059   owner->addAttribute( _distance ) ;
00060 }
00061 //-------------------------------------------------------------------------
00062 DistanceToExtension::~DistanceToExtension()
00063 {
00064   if( _deleteTarget ) delete _target ;
00065 }
00066 //-------------------------------------------------------------------------
00067 bool DistanceToExtension::loadExtensionParameters( const ConfigurationParameterDescriptor * node ) 
00068 {
00069   // Retrieve all the parameters
00070   Name attributeName( "Position" ) ;
00071   ParametersAccessor::get( node, "PositionId", attributeName ) ;
00072   _positionAccessor = _owner->getBaseAttribute< OMK::Type::Transform >( attributeName ) ;
00073   if( _deleteTarget )
00074   {
00075     _target->loadParameters( node, "Target" ) ;
00076   }
00077   _distance.loadParameters( node, "Distance" ) ;
00078 
00079   return _positionAccessor != 0 ;
00080 }
00081 //-------------------------------------------------------------------------
00082 void DistanceToExtension::preComputeParameters()
00083 {
00084   Wm4::Vector3f target( _target->get().getTranslate() ) ;  
00085   Wm4::Vector3f pos( _positionAccessor->get().getTranslate() ) ;  
00086   float deltaX = target.X() - pos.X() ;
00087   float deltaY = target.Y() - pos.Y() ;
00088   float deltaZ = target.Z() - pos.Z() ;
00089   _distance.set( sqrt( deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ ) ) ;
00090 }
00091 //=============================================================================
00092 
00093 
00094 //=============================================================================
00095 TriggerBaseExtension::TriggerBaseExtension( OMK::ExtensibleSimulatedObject* owner, const Name& id, bool registerExtension ) 
00096 : DistanceToExtension( owner, id, registerExtension ),
00097   _threshold( Name( id.getString() + "Threshold" ), 1.0f ),
00098   _flagAccessor( 0 )
00099 {
00100   owner->addAttribute( _threshold ) ;
00101 }
00102 //-------------------------------------------------------------------------
00103 TriggerBaseExtension::~TriggerBaseExtension()
00104 {
00105 }
00106 //-------------------------------------------------------------------------
00107 bool TriggerBaseExtension::loadExtensionParameters( const ConfigurationParameterDescriptor * node ) 
00108 {
00109   _threshold.loadParameters( node, "Threshold" ) ;
00110 
00111   return DistanceToExtension::loadExtensionParameters( node );
00112 }
00113 //-------------------------------------------------------------------------
00114 void TriggerBaseExtension::preComputeParameters()
00115 {
00116   OMASSERTM( _flagAccessor, "Must be valid !" ) ;
00117   DistanceToExtension::preComputeParameters() ;
00118   bool trigger = _distance.get() <= _threshold.get() ;
00119   _flagAccessor->set( trigger ) ;
00120 }
00121 //=============================================================================
00122 
00123 
00124 //=============================================================================
00125 REGISTER_EXTENSION_FACTORY( TriggerAttributeExtension, "TriggerAttribute" ) ;
00126 //-------------------------------------------------------------------------
00127 TriggerAttributeExtension::TriggerAttributeExtension( OMK::ExtensibleSimulatedObject* owner, const Name& id, bool registerExtension ) 
00128 : TriggerBaseExtension( owner, id, registerExtension )
00129 {
00130 }
00131 //-------------------------------------------------------------------------
00132 TriggerAttributeExtension::~TriggerAttributeExtension()
00133 {
00134 }
00135 //-------------------------------------------------------------------------
00136 bool TriggerAttributeExtension::loadExtensionParameters( const ConfigurationParameterDescriptor * node ) 
00137 {
00138   Name attributeName( "Activation" ) ;
00139   ParametersAccessor::get( node, "AttributeId", attributeName ) ;
00140   _flagAccessor = _owner->getBaseAttribute< bool >( attributeName ) ;
00141 
00142   return _flagAccessor && TriggerBaseExtension::loadExtensionParameters( node );
00143 }
00144 //=============================================================================
00145 
00146 
00147 //=============================================================================
00148 REGISTER_EXTENSION_FACTORY( TriggerExtension, "Trigger" ) ;
00149 //-------------------------------------------------------------------------
00150 TriggerExtension::TriggerExtension( OMK::ExtensibleSimulatedObject* owner, const Name& id, bool registerExtension ) 
00151 : TriggerBaseExtension( owner, id, registerExtension ),
00152   _reached( Name( id.getString() + "Reached" ), false )
00153 {
00154   owner->addAttribute( _reached ) ;
00155 }
00156 //-------------------------------------------------------------------------
00157 TriggerExtension::~TriggerExtension()
00158 {
00159 }
00160 //-------------------------------------------------------------------------
00161 bool TriggerExtension::loadExtensionParameters( const ConfigurationParameterDescriptor * node ) 
00162 {
00163   _flagAccessor = &_reached ;
00164   _reached.loadParameters( node, "Reached" ) ;
00165 
00166   return TriggerBaseExtension::loadExtensionParameters( node );
00167 }
00168 //=============================================================================

logo OpenMask

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

Generated with doxygen by Dimitri van Heesch ,   1997-2007