00001 00002 // Copyright 2004, SenseGraphics AB 00003 // 00004 // This file is part of H3D API. 00005 // 00006 // H3D API is free software; you can redistribute it and/or modify 00007 // it under the terms of the GNU General Public License as published by 00008 // the Free Software Foundation; either version 2 of the License, or 00009 // (at your option) any later version. 00010 // 00011 // H3D API is distributed in the hope that it will be useful, 00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00014 // GNU General Public License for more details. 00015 // 00016 // You should have received a copy of the GNU General Public License 00017 // along with H3D API; if not, write to the Free Software 00018 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00019 // 00020 // A commercial license is also available. Please contact us at 00021 // www.sensegraphics.com for more information. 00022 // 00023 // 00027 // 00029 #ifndef __PERIODIC_UPDATE_H__ 00030 #define __PERIODIC_UPDATE_H__ 00031 00032 #include "Scene.h" 00033 00034 namespace H3D { 00035 00040 class H3DAPI_API PeriodicUpdateField { 00041 public: 00043 virtual ~PeriodicUpdateField() {} 00044 00048 virtual bool timeToUpdate() = 0; 00049 }; 00050 00051 00072 template< class BaseFieldType > 00073 class PeriodicUpdate: public BaseFieldType, 00074 public PeriodicUpdateField { 00075 public: 00077 typedef enum { 00078 TIME, 00079 COUNT 00080 } PeriodType; 00081 00083 PeriodicUpdate( H3DFloat _period = 0, PeriodType _period_type = COUNT ): 00084 period_type( _period_type ), 00085 period( _period ), 00086 last_up_to_date( TimeStamp() ), 00087 counter( 0 ) { 00088 this->route( Scene::eventSink ); 00089 } 00090 00092 ~PeriodicUpdate( ) { 00093 this->unroute( Scene::eventSink ); 00094 } 00095 00099 virtual bool timeToUpdate() { 00100 if( period_type == TIME ) { 00101 return (TimeStamp() - last_up_to_date ) >= period; 00102 } else { 00103 if( counter >= period ) { 00104 counter = 0; 00105 return true; 00106 } else { 00107 counter++; 00108 return false; 00109 } 00110 } 00111 } 00112 00114 void setPeriodType( PeriodType type ) { 00115 period_type = type; 00116 } 00117 00119 void setPeriod( H3DFloat _period ) { 00120 period = _period; 00121 } 00122 00125 virtual void upToDate() { 00126 BaseFieldType::upToDate(); 00127 last_up_to_date = TimeStamp(); 00128 } 00129 00130 protected: 00131 00133 PeriodType period_type; 00135 H3DFloat period; 00137 TimeStamp last_up_to_date; 00139 unsigned int counter; 00140 }; 00141 } 00142 00143 #endif
1.4.5