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