OMKMKMMoveToTaskExtension.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 "OMKMKMMoveToTaskExtension.h"
00022 #include "OMKAvatarVisualObject.h"
00023 #include "OMKParametersAccessor.inl"
00024 #include "OMKMKMMotionTaskExtension.h"
00025 #include "OMKMKMHeadToTaskExtension.h"
00026 #include "OMKTriggerExtension.h"
00027 
00028 using namespace OMK ;
00029 using namespace OMK::Type ;
00030 
00031 REGISTER_EXTENSION_FACTORY( MKMMoveToTaskExtension, "MoveToTask" ) ;
00032 
00033 //-------------------------------------------------------------------------
00034 // constructor
00035 //-------------------------------------------------------------------------
00036 MKMMoveToTaskExtension::MKMMoveToTaskExtension( OMK::ExtensibleSimulatedObject* owner, const Name& id, bool registerExtension ) 
00037 : ExtensionT< MKMHumano >( owner, id, registerExtension ),
00038   _activate( Name( id.getString() + "Activation" ), true ),
00039   _isWaiting( Name( id.getString() + "Reached" ), true ),
00040   _threshold( Name( id.getString() + "Threshold" ), 1.0f ),
00041   _speed( Name( id.getString() + "Speed" ), 1.0f ),
00042   _target( Name( "Target" ), Transform() ),
00043   _moveTask(),
00044   _waitTask(),
00045   _initDone( false ),
00046   _moveMotion(),
00047   _waitMotion(),
00048   _transitionDuration( 1.0f ),
00049   _weight( 1.0f ),
00050   _rank( 2.0f )
00051 {
00052   owner->addAttribute( _activate ) ;
00053   owner->addAttribute( _isWaiting ) ;
00054   owner->addAttribute( _threshold ) ;
00055   owner->addAttribute( _speed ) ;
00056   owner->addAttribute( _target ) ;
00057 }
00058 
00059 //-------------------------------------------------------------------------
00060 // destructor
00061 //-------------------------------------------------------------------------
00062 MKMMoveToTaskExtension::~MKMMoveToTaskExtension()
00063 {
00064   if( _initDone )
00065   { // stop the task
00066     _moveTask.setStoppingDuration( 0.0f ) ;
00067     _moveTask.stop() ;
00068     _waitTask.setStoppingDuration( 0.0f ) ;
00069     _waitTask.stop() ;
00070     // The destructor does the next step to unregister the task from the controller
00071   }
00072 }
00073 bool MKMMoveToTaskExtension::loadExtensionParameters( const ConfigurationParameterDescriptor * node ) 
00074 {
00075   // Retrieve all the parameters
00076   bool ok = true ;
00077   ok = ok && ParametersAccessor::get( node, "MoveMotion", _moveMotion, getOwner() ) ;
00078   ok = ok && ParametersAccessor::get( node, "WaitMotion", _waitMotion, getOwner() ) ;
00079   ParametersAccessor::get( node, "TansitionDuration", _transitionDuration ) ;
00080   ParametersAccessor::get( node, "PriorityWeight", _weight ) ;
00081   ParametersAccessor::get( node, "PriorityRank", _rank ) ;
00082   _threshold.loadParameters( node, "Threshold" ) ;
00083   _target.loadParameters( node, "Target" ) ;
00084   _activate.loadParameters( node, "Activation" ) ;
00085   _isWaiting.loadParameters( node, "Reached" ) ;
00086   _speed.loadParameters( node, "Speed" ) ;
00087 
00088   return ok ;
00089 }
00090 void MKMMoveToTaskExtension::preComputeParameters()
00091 {
00092   // Waiting for the avatar master is intialised
00093   if( !_initDone && getOwner()->_avatarMaster.isInitialized() )
00094   {
00095     // Defines the motion task and starts it
00096     _initDone = true ;
00097     // Wait motion
00098     _waitTask.init( getOwner()->_controlMesh, _waitMotion ) ;
00099     _waitTask.setStartingDuration( _transitionDuration ) ;
00100     _waitTask.setStoppingDuration( _transitionDuration ) ;
00101     _waitTask.setPriorityWeight( _weight ) ;
00102     _waitTask.setPriorityRank( _rank ) ;
00103     // Move motion
00104     _moveTask.init( getOwner()->_controlMesh, _moveMotion ) ;
00105     _moveTask.setStartingDuration( _transitionDuration ) ;
00106     _moveTask.setStoppingDuration( _transitionDuration ) ;
00107     _moveTask.setPriorityWeight( _weight ) ;
00108     _moveTask.setPriorityRank( _rank ) ;
00109     // start waiting
00110     _waitTask.start() ;
00111   }
00112   if( _initDone )
00113   {
00114     if( _activate.isUpdated() )
00115     {
00116       if( !_activate.get() )
00117       {
00118         _waitTask.stop() ;
00119         _moveTask.stop() ;
00120       }
00121       else
00122       {
00123         if( _isWaiting.get() )
00124         {
00125           _waitTask.start() ;
00126           _moveTask.stop() ;
00127         }
00128         else
00129         {
00130           _waitTask.stop() ;
00131           _moveTask.start() ;
00132         }
00133       }
00134     }
00135     if( _activate.get() )
00136     {
00137       Wm4::Vector3f target( _target.get().getTranslate() ) ;  
00138       mkm::CVector3 pos( getOwner()->_controlMesh.getPosition() ) ;
00139       float deltaX = -target.X() - pos[mkm::X] ;
00140       float deltaZ = target.Z() - pos[mkm::Y] ;
00141       float distance = sqrt( deltaX * deltaX + deltaZ * deltaZ ) ;
00142       bool mustWait = distance < _threshold.get() ;
00143       if( mustWait && !_isWaiting.get() )
00144       { // 
00145         _waitTask.start() ;
00146         _moveTask.stop() ;
00147         _isWaiting.set( true ) ;
00148       }
00149       if( !mustWait && _isWaiting.get() )
00150       { // 
00151         _waitTask.stop() ;
00152         _moveTask.start() ;
00153         _isWaiting.set( false ) ;
00154       }
00155       if( !mustWait )
00156       {
00157         getOwner()->_controlMesh.setOrientationToMoveToward( deltaX, deltaZ, _speed.get(), false ) ;
00158       }
00159     }
00160   }
00161 }

logo OpenMask

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

Generated with doxygen by Dimitri van Heesch ,   1997-2007