Fixed ImageFilter timing

This commit is contained in:
Bruno Herbelin
2022-05-07 15:39:06 +02:00
parent 222282dced
commit 82be9326a8
3 changed files with 39 additions and 20 deletions

View File

@@ -112,7 +112,7 @@ void CloneSource::init()
void CloneSource::render() void CloneSource::render()
{ {
if ( renderbuffer_ == nullptr ) if ( renderbuffer_ == nullptr )
init(); init();
else { else {
@@ -157,7 +157,9 @@ void CloneSource::update(float dt)
if (origin_ && !images_.empty()) { if (origin_ && !images_.empty()) {
if (!paused_ && active_) if (!paused_ && active_)
{ {
filter_render_->update(dt);
// Reset elapsed timer on request (init or replay) // Reset elapsed timer on request (init or replay)
if ( timer_reset_ ) { if ( timer_reset_ ) {
g_timer_start(timer_); g_timer_start(timer_);

View File

@@ -182,11 +182,10 @@ class ImageFilteringShader : public ImageShader
std::string shader_code_; std::string shader_code_;
std::string code_; std::string code_;
// for iTime & iFrame // for iTimedelta
GTimer *timer_; GTimer *timer_;
double iTime_; double iTime_;
int iFrame_; uint iFrame_;
public: public:
@@ -196,6 +195,8 @@ public:
ImageFilteringShader(); ImageFilteringShader();
~ImageFilteringShader(); ~ImageFilteringShader();
void update(float dt);
void use() override; void use() override;
void reset() override; void reset() override;
void copy(ImageFilteringShader const& S); void copy(ImageFilteringShader const& S);
@@ -221,6 +222,18 @@ ImageFilteringShader::ImageFilteringShader(): ImageShader()
ImageFilteringShader::~ImageFilteringShader() ImageFilteringShader::~ImageFilteringShader()
{ {
custom_shading_.reset(); 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() void ImageFilteringShader::use()
@@ -231,23 +244,18 @@ void ImageFilteringShader::use()
// Shader input uniforms // 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_) ); program_->setUniform("iTime", float(iTime_) );
// calculate iFrame program_->setUniform("iFrame", int(iFrame_) );
program_->setUniform("iFrame", ++iFrame_);
if (iFrame_ > INT_MAX -2) // Calculate iTimeDelta
iFrame_ = 0; double elapsed = g_timer_elapsed (timer_, NULL);
g_timer_reset(timer_);
program_->setUniform("iTimeDelta", float(elapsed) );
// calculate iDate // calculate iDate
std::time_t now = std::time(0); std::time_t now = std::time(0);
std::tm *local = std::localtime(&now); 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); program_->setUniform("iDate", iDate);
// //
@@ -263,8 +271,8 @@ void ImageFilteringShader::reset()
ImageShader::reset(); ImageShader::reset();
// reset times // reset times
g_timer_start(timer_);
iFrame_ = 0; iFrame_ = 0;
iTime_ = 0.0;
} }
@@ -317,11 +325,18 @@ ImageFilterRenderer::~ImageFilterRenderer()
// NB: shaders_ are removed with surface // 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) void ImageFilterRenderer::setInputTexture(uint t)
{ {
surfaces_.first->setTextureIndex( t ); surfaces_.first->setTextureIndex( t );
shaders_.first->mask_texture = t; shaders_.first->mask_texture = t;
if (surfaces_.second && shaders_.second) if (shaders_.second)
shaders_.second->mask_texture = t; shaders_.second->mask_texture = t;
} }

View File

@@ -78,6 +78,8 @@ public:
inline void setEnabled (bool on) { enabled_ = on; } inline void setEnabled (bool on) { enabled_ = on; }
inline bool enabled () const { return enabled_; } inline bool enabled () const { return enabled_; }
void update (float dt);
// set the texture to draw into the framebuffer // set the texture to draw into the framebuffer
void setInputTexture(uint t); void setInputTexture(uint t);