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