PeriodicUpdate.h

Go to the documentation of this file.
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

Generated on Thu Aug 24 12:38:33 2006 for H3D API by  doxygen 1.4.5