From da4315334a9c5bbb3de13c34cc5ff2d2e28c0831 Mon Sep 17 00:00:00 2001 From: Edward Shao Date: Wed, 7 Jan 2026 17:30:22 -0800 Subject: [PATCH] Added time as uniform for final shader (cherry picked from commit ac7a71f8913b27fde00b26a90d2dcf582d8693d1) Replaced Get/Set w/ Get/Set macro for time and replaced double w/ float in glsl to handle alignment (cherry picked from commit 3ddce1884457528af101668d362301cac4d8673c) Added testing (cherry picked from commit ef449e1113df200034dc15407c08128377a04731) Added time as uniform for final shader (cherry picked from commit 250d6f6ac4b33778349a7a4e8299078b4bea2fef) Replaced Get/Set w/ Get/Set macro for time and replaced double w/ float in glsl to handle alignment (cherry picked from commit fcfad57c790c22b6d3a3d795c6cf7aea6f91e901) cleanup add baseline --- application/testing/tests.features.cmake | 1 + library/src/interactor_impl.cxx | 1 + testing/baselines/TestFinalShaderTimeUniform.png | 3 +++ vtkext/private/module/vtkF3DRenderer.h | 7 +++++++ vtkext/private/module/vtkF3DUserRenderPass.cxx | 5 +++++ 5 files changed, 17 insertions(+) create mode 100644 testing/baselines/TestFinalShaderTimeUniform.png diff --git a/application/testing/tests.features.cmake b/application/testing/tests.features.cmake index d2b8015665..5ef0451864 100644 --- a/application/testing/tests.features.cmake +++ b/application/testing/tests.features.cmake @@ -421,6 +421,7 @@ f3d_test(NAME TestFinalShaderNegative DATA cow.vtp ARGS --final-shader "vec4 pix f3d_test(NAME TestFinalShaderNegativeFileName DATA cow.vtp ARGS --filename --final-shader "vec4 pixel(vec2 uv){return vec4(vec3(1.0) - texture(source, uv).rgb, 1.0)\\\\\\\;}" UI) f3d_test(NAME TestFinalShaderUndefined DATA cow.vtp ARGS --final-shader "undefined" REGEXP "Final shader must define a function" NO_BASELINE) f3d_test(NAME TestFinalShaderCompilationFailure DATA cow.vtp ARGS --final-shader "vec4 pixel(vec2 uv){}" --verbose REGEXP " build the shader program" NO_BASELINE) ++f3d_test(NAME TestFinalShaderTimeUniform DATA cow.vtp ARGS --final-shader "vec4 pixel(vec2 uv){return vec4(texture(source, uv).rgb * (0.5 + 0.5*cos(time+uv.xyx+vec3(0,2,4))), 1.0)\\\\\\\;}") ## Command Script f3d_test(NAME TestCommandScriptBasic SCRIPT DATA dragon.vtu) # roll_camera 90;toggle ui.scalar_bar;print_scene_info;increase_light_intensity diff --git a/library/src/interactor_impl.cxx b/library/src/interactor_impl.cxx index e830342fdd..d9e91ee33e 100644 --- a/library/src/interactor_impl.cxx +++ b/library/src/interactor_impl.cxx @@ -620,6 +620,7 @@ class interactor_impl::internals vtkRenderWindow* renWin = this->Window.GetRenderWindow(); vtkF3DRenderer* ren = vtkF3DRenderer::SafeDownCast(renWin->GetRenderers()->GetFirstRenderer()); ren->SetUIDeltaTime(deltaTime); + ren->SetTotalTime(ren->GetTotalTime() + deltaTime); // Determine if we need a full render or just a UI render // At the moment, only TAA requires a full render each frame diff --git a/testing/baselines/TestFinalShaderTimeUniform.png b/testing/baselines/TestFinalShaderTimeUniform.png new file mode 100644 index 0000000000..6de6b656c9 --- /dev/null +++ b/testing/baselines/TestFinalShaderTimeUniform.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:03a9800edd7101ca63f3052a73563648f99712ed0d44fb4ac6db411e3ffa6ac7 +size 19607 diff --git a/vtkext/private/module/vtkF3DRenderer.h b/vtkext/private/module/vtkF3DRenderer.h index 53c30e1a20..6f5e6e7e85 100644 --- a/vtkext/private/module/vtkF3DRenderer.h +++ b/vtkext/private/module/vtkF3DRenderer.h @@ -493,6 +493,12 @@ class vtkF3DRenderer : public vtkOpenGLRenderer */ void SetUIDeltaTime(double time); + /** + * Set/Get the total animation time (cumulative time of each frame being rendered) in seconds + */ + vtkSetMacro(TotalTime, double); + vtkGetMacro(TotalTime, double); + /** * Set console badge enabled status */ @@ -632,6 +638,7 @@ class vtkF3DRenderer : public vtkOpenGLRenderer vtkSmartPointer ModernAxisRepresentation; vtkSmartPointer ModernAxisWidgetResizeCallback; double ModernAxisBackdropOpacity = 0.0; + double TotalTime = 0.0; // Does vtk version support GridAxesActor #if VTK_VERSION_NUMBER >= VTK_VERSION_CHECK(9, 4, 20250513) diff --git a/vtkext/private/module/vtkF3DUserRenderPass.cxx b/vtkext/private/module/vtkF3DUserRenderPass.cxx index 52bab9afc6..f1a1ab47ee 100644 --- a/vtkext/private/module/vtkF3DUserRenderPass.cxx +++ b/vtkext/private/module/vtkF3DUserRenderPass.cxx @@ -12,6 +12,8 @@ #include "vtkRenderer.h" #include "vtkShaderProgram.h" #include "vtkTextureObject.h" +#include "vtkF3DRenderer.h" +#include vtkStandardNewMacro(vtkF3DUserRenderPass); @@ -25,6 +27,7 @@ void vtkF3DUserRenderPass::Render(const vtkRenderState* s) vtkRenderer* r = s->GetRenderer(); vtkOpenGLRenderWindow* renWin = static_cast(r->GetRenderWindow()); vtkOpenGLState* ostate = renWin->GetState(); + vtkF3DRenderer* ren = vtkF3DRenderer::SafeDownCast(renWin->GetRenderers()->GetFirstRenderer()); vtkOpenGLState::ScopedglEnableDisable bsaver(ostate, GL_BLEND); vtkOpenGLState::ScopedglEnableDisable dsaver(ostate, GL_DEPTH_TEST); @@ -71,6 +74,7 @@ void vtkF3DUserRenderPass::Render(const vtkRenderState* s) vtkShaderProgram::Substitute(FSSource, "//VTK::FSQ::Decl", "uniform sampler2D source;\n" "uniform ivec2 resolution;\n" + "uniform float time;\n" "//VTK::FSQ::Decl"); vtkShaderProgram::Substitute(FSSource, "//VTK::FSQ::Decl", this->UserShader); @@ -96,6 +100,7 @@ void vtkF3DUserRenderPass::Render(const vtkRenderState* s) this->ColorTexture->Activate(); this->QuadHelper->Program->SetUniformi("source", this->ColorTexture->GetTextureUnit()); this->QuadHelper->Program->SetUniform2i("resolution", size); + this->QuadHelper->Program->SetUniformf("time", ren->GetTotalTime()); ostate->vtkglDisable(GL_BLEND); ostate->vtkglDisable(GL_DEPTH_TEST);