OpenWalnut  1.4.0
WGEShaderAnimationCallback.cpp
00001 //---------------------------------------------------------------------------
00002 //
00003 // Project: OpenWalnut ( http://www.openwalnut.org )
00004 //
00005 // Copyright 2009 OpenWalnut Community, BSV@Uni-Leipzig and CNCF@MPI-CBS
00006 // For more information see http://www.openwalnut.org/copying
00007 //
00008 // This file is part of OpenWalnut.
00009 //
00010 // OpenWalnut is free software: you can redistribute it and/or modify
00011 // it under the terms of the GNU Lesser General Public License as published by
00012 // the Free Software Foundation, either version 3 of the License, or
00013 // (at your option) any later version.
00014 //
00015 // OpenWalnut is distributed in the hope that it will be useful,
00016 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00018 // GNU Lesser General Public License for more details.
00019 //
00020 // You should have received a copy of the GNU Lesser General Public License
00021 // along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
00022 //
00023 //---------------------------------------------------------------------------
00024 
00025 #include <ctime>
00026 #include <iostream>
00027 
00028 #include "boost/date_time/posix_time/posix_time.hpp"
00029 
00030 #include "WGEShaderAnimationCallback.h"
00031 
00032 WGEShaderAnimationCallback::WGEShaderAnimationCallback( int ticksPerSecond ):
00033     osg::Uniform::Callback(),
00034     m_start( boost::posix_time::microsec_clock::local_time() ),
00035     m_ticksPerSec( ticksPerSecond ),
00036     m_tickMillisecRatio( static_cast< double >( ticksPerSecond ) / 1000.0 )
00037 {
00038 }
00039 
00040 WGEShaderAnimationCallback::~WGEShaderAnimationCallback()
00041 {
00042     // cleanup
00043 }
00044 
00045 void WGEShaderAnimationCallback::operator() ( osg::Uniform* uniform, osg::NodeVisitor* /*nv*/ )
00046 {
00047     // according to boost doc, this is available on windows too! From boost doc "Get the local time using a sub second resolution clock. On Unix
00048     // systems this is implemented using GetTimeOfDay. On most Win32 platforms it is implemented using ftime. Win32 systems often do not achieve
00049     // microsecond resolution via this API. If higher resolution is critical to your application test your platform to see the achieved resolution.
00050     // -> fortunately, millisecond resolution is enough here.
00051     boost::posix_time::ptime t = boost::posix_time::microsec_clock::local_time();
00052 
00053     boost::posix_time::time_duration td = t - m_start;
00054     int ticks = static_cast< int >( static_cast< double >( td.total_milliseconds() ) * m_tickMillisecRatio );
00055 
00056     uniform->set( ticks );
00057 }
00058