diff --git a/CloneSource.cpp b/CloneSource.cpp index b747cc7..29833b6 100644 --- a/CloneSource.cpp +++ b/CloneSource.cpp @@ -112,7 +112,7 @@ void CloneSource::init() void CloneSource::render() { - if ( renderbuffer_ == nullptr ) + if ( renderbuffer_ == nullptr ) init(); else { @@ -157,7 +157,9 @@ void CloneSource::update(float dt) if (origin_ && !images_.empty()) { if (!paused_ && active_) - { + { + filter_render_->update(dt); + // Reset elapsed timer on request (init or replay) if ( timer_reset_ ) { g_timer_start(timer_); diff --git a/ImageFilter.cpp b/ImageFilter.cpp index e144520..8afe6c9 100644 --- a/ImageFilter.cpp +++ b/ImageFilter.cpp @@ -182,11 +182,10 @@ class ImageFilteringShader : public ImageShader std::string shader_code_; std::string code_; - // for iTime & iFrame + // for iTimedelta GTimer *timer_; double iTime_; - int iFrame_; - + uint iFrame_; public: @@ -196,6 +195,8 @@ public: ImageFilteringShader(); ~ImageFilteringShader(); + void update(float dt); + void use() override; void reset() override; void copy(ImageFilteringShader const& S); @@ -221,6 +222,18 @@ ImageFilteringShader::ImageFilteringShader(): ImageShader() ImageFilteringShader::~ImageFilteringShader() { custom_shading_.reset(); + g_timer_destroy(timer_); +} + +void ImageFilteringShader::update(float dt) +{ + iTime_ += dt; + if (iTime_ > FLT_MAX) + iTime_ = 0.0; + + iFrame_++; + if (iFrame_ > INT_MAX) + iFrame_ = 0; } void ImageFilteringShader::use() @@ -231,23 +244,18 @@ void ImageFilteringShader::use() // Shader input uniforms // - // Calculate iTime and iTimeDelta - double elapsed = g_timer_elapsed (timer_, NULL); - program_->setUniform("iTimeDelta", float(elapsed - iTime_) ); - iTime_ = elapsed; - if (iTime_ > FLT_MAX) { - g_timer_start(timer_); - iTime_ = 0.f; - } program_->setUniform("iTime", float(iTime_) ); - // calculate iFrame - program_->setUniform("iFrame", ++iFrame_); - if (iFrame_ > INT_MAX -2) - iFrame_ = 0; + program_->setUniform("iFrame", int(iFrame_) ); + + // Calculate iTimeDelta + double elapsed = g_timer_elapsed (timer_, NULL); + g_timer_reset(timer_); + program_->setUniform("iTimeDelta", float(elapsed) ); + // calculate iDate std::time_t now = std::time(0); std::tm *local = std::localtime(&now); - glm::vec4 iDate(local->tm_year, local->tm_mon, local->tm_mday, local->tm_hour*3600.0+local->tm_min*60.0+local->tm_sec); + glm::vec4 iDate(local->tm_year+1900, local->tm_mon, local->tm_mday, local->tm_hour*3600+local->tm_min*60+local->tm_sec); program_->setUniform("iDate", iDate); // @@ -263,8 +271,8 @@ void ImageFilteringShader::reset() ImageShader::reset(); // reset times - g_timer_start(timer_); iFrame_ = 0; + iTime_ = 0.0; } @@ -317,11 +325,18 @@ ImageFilterRenderer::~ImageFilterRenderer() // NB: shaders_ are removed with surface } +void ImageFilterRenderer::update(float dt) +{ + shaders_.first->update(dt); + if (shaders_.second) + shaders_.second->update(dt); +} + void ImageFilterRenderer::setInputTexture(uint t) { surfaces_.first->setTextureIndex( t ); shaders_.first->mask_texture = t; - if (surfaces_.second && shaders_.second) + if (shaders_.second) shaders_.second->mask_texture = t; } diff --git a/ImageFilter.h b/ImageFilter.h index 3f5706b..2c2debf 100644 --- a/ImageFilter.h +++ b/ImageFilter.h @@ -78,6 +78,8 @@ public: inline void setEnabled (bool on) { enabled_ = on; } inline bool enabled () const { return enabled_; } + void update (float dt); + // set the texture to draw into the framebuffer void setInputTexture(uint t);