From 91afc9aebac1fd9b97b139b679f147e004de7263 Mon Sep 17 00:00:00 2001
From: Jaswant Panchumarti <jaswant.panchumarti@kitware.com>
Date: Fri, 21 Feb 2025 14:17:19 -0500
Subject: [PATCH] Pass actor Id to webgpu shaders

- This index will be written out into the ids attachment of the render window. It serves to identify which prop was picked.
---
 .../WebGPU/Private/vtkWebGPUActorInternals.h  |  3 +++
 Rendering/WebGPU/vtkWebGPUActor.cxx           | 19 +++++++++++++++++++
 Rendering/WebGPU/vtkWebGPUActor.h             |  2 ++
 Rendering/WebGPU/vtkWebGPURenderer.cxx        |  8 ++++++++
 Rendering/WebGPU/wgsl/LineGlyphShader.wgsl    |  3 ++-
 .../wgsl/LineMiterJoinVertexShader.wgsl       |  3 ++-
 .../wgsl/LineRoundJoinVertexShader.wgsl       |  3 ++-
 Rendering/WebGPU/wgsl/PointGlyphShader.wgsl   |  3 ++-
 Rendering/WebGPU/wgsl/PointShader.wgsl        |  3 ++-
 .../WebGPU/wgsl/SurfaceMeshGlyphShader.wgsl   |  3 ++-
 Rendering/WebGPU/wgsl/SurfaceMeshShader.wgsl  |  3 ++-
 11 files changed, 46 insertions(+), 7 deletions(-)

diff --git a/Rendering/WebGPU/Private/vtkWebGPUActorInternals.h b/Rendering/WebGPU/Private/vtkWebGPUActorInternals.h
index 3a0a7e3155c..f3f5c1dd41a 100644
--- a/Rendering/WebGPU/Private/vtkWebGPUActorInternals.h
+++ b/Rendering/WebGPU/Private/vtkWebGPUActorInternals.h
@@ -71,6 +71,7 @@ public:
       // Interpolation type
       vtkTypeUInt32 InterpolationType = VTK_FLAT;
     } ShadeOpts;
+    vtkTypeUInt32 Id = 0;
   };
 
   class MapperBooleanCache
@@ -116,6 +117,8 @@ public:
   wgpu::BindGroup ActorBindGroup;
   wgpu::Buffer ActorBuffer;
 
+  vtkTypeUInt32 Id = 0;
+
   inline void PopulateBindgroupLayouts(std::vector<wgpu::BindGroupLayout>& layouts)
   {
     layouts.emplace_back(this->ActorBindGroupLayout);
diff --git a/Rendering/WebGPU/vtkWebGPUActor.cxx b/Rendering/WebGPU/vtkWebGPUActor.cxx
index d0cf936902c..945b7a93403 100644
--- a/Rendering/WebGPU/vtkWebGPUActor.cxx
+++ b/Rendering/WebGPU/vtkWebGPUActor.cxx
@@ -109,6 +109,7 @@ void vtkWebGPUActor::Render(vtkRenderer* renderer, vtkMapper* mapper)
         bool updateBuffers = this->CacheActorRenderOptions();
         updateBuffers |= this->CacheActorShadeOptions();
         updateBuffers |= this->CacheActorTransforms();
+        updateBuffers |= this->CacheActorId();
         if (updateBuffers)
         {
           wgpuConfiguration->WriteBuffer(internals.ActorBuffer, 0,
@@ -158,6 +159,12 @@ bool vtkWebGPUActor::SupportRenderBundles()
   return true;
 }
 
+//------------------------------------------------------------------------------
+void vtkWebGPUActor::SetId(vtkTypeUInt32 id)
+{
+  this->Internals->Id = id;
+}
+
 //------------------------------------------------------------------------------
 vtkTypeBool vtkWebGPUActor::HasOpaqueGeometry()
 {
@@ -350,6 +357,18 @@ bool vtkWebGPUActor::CacheActorShadeOptions()
   return false;
 }
 
+//------------------------------------------------------------------------------
+bool vtkWebGPUActor::CacheActorId()
+{
+  auto& internals = (*this->Internals);
+  if (internals.CachedActorInfo.Id != internals.Id)
+  {
+    internals.CachedActorInfo.Id = internals.Id;
+    return true;
+  }
+  return false;
+}
+
 //------------------------------------------------------------------------------
 void vtkWebGPUActor::AllocateResources(vtkWebGPUConfiguration* wgpuConfiguration)
 {
diff --git a/Rendering/WebGPU/vtkWebGPUActor.h b/Rendering/WebGPU/vtkWebGPUActor.h
index 0e30e0b7321..397e3e1a573 100644
--- a/Rendering/WebGPU/vtkWebGPUActor.h
+++ b/Rendering/WebGPU/vtkWebGPUActor.h
@@ -72,6 +72,7 @@ private:
    * pipeline for the rendering and thus doesn't support render bundles.
    */
   bool SupportRenderBundles();
+  void SetId(vtkTypeUInt32 id);
 
   bool UpdateKeyMatrices();
 
@@ -81,6 +82,7 @@ private:
   bool CacheActorTransforms();
   bool CacheActorRenderOptions();
   bool CacheActorShadeOptions();
+  bool CacheActorId();
 
   void AllocateResources(vtkWebGPUConfiguration* renderer);
 };
diff --git a/Rendering/WebGPU/vtkWebGPURenderer.cxx b/Rendering/WebGPU/vtkWebGPURenderer.cxx
index a5b5d0e8de3..60e6b369cb8 100644
--- a/Rendering/WebGPU/vtkWebGPURenderer.cxx
+++ b/Rendering/WebGPU/vtkWebGPURenderer.cxx
@@ -416,6 +416,10 @@ int vtkWebGPURenderer::UpdateOpaquePolygonalGeometry()
     {
       for (int i = 0; i < this->PropArrayCount; i++)
       {
+        if (auto* wgpuActor = vtkWebGPUActor::SafeDownCast(this->PropArray[i]))
+        {
+          wgpuActor->SetId(i);
+        }
         this->PropArray[i]->RenderOpaqueGeometry(this);
       }
       result += this->PropArrayCount;
@@ -452,6 +456,10 @@ int vtkWebGPURenderer::UpdateTranslucentPolygonalGeometry()
     {
       for (int i = 0; i < this->PropArrayCount; i++)
       {
+        if (auto* wgpuActor = vtkWebGPUActor::SafeDownCast(this->PropArray[i]))
+        {
+          wgpuActor->SetId(i);
+        }
         this->PropArray[i]->RenderTranslucentPolygonalGeometry(this);
       }
       result += this->PropArrayCount;
diff --git a/Rendering/WebGPU/wgsl/LineGlyphShader.wgsl b/Rendering/WebGPU/wgsl/LineGlyphShader.wgsl
index 82134cf3d26..4e73968cc11 100644
--- a/Rendering/WebGPU/wgsl/LineGlyphShader.wgsl
+++ b/Rendering/WebGPU/wgsl/LineGlyphShader.wgsl
@@ -33,7 +33,8 @@ const TRIANGLE_VERTS = array(
 struct ActorBlock {
   transform: ActorTransform,
   render_options: ActorRenderOptions,
-  color_options: ActorColorOptions
+  color_options: ActorColorOptions,
+  id: u32,
 }
 
 //-------------------------------------------------------------------
diff --git a/Rendering/WebGPU/wgsl/LineMiterJoinVertexShader.wgsl b/Rendering/WebGPU/wgsl/LineMiterJoinVertexShader.wgsl
index f29e73cbe1a..2e17120cad8 100644
--- a/Rendering/WebGPU/wgsl/LineMiterJoinVertexShader.wgsl
+++ b/Rendering/WebGPU/wgsl/LineMiterJoinVertexShader.wgsl
@@ -28,7 +28,8 @@ const TRIANGLE_VERTS = array(
 struct ActorBlock {
   transform: ActorTransform,
   render_options: ActorRenderOptions,
-  color_options: ActorColorOptions
+  color_options: ActorColorOptions,
+  id: u32,
 }
 
 //-------------------------------------------------------------------
diff --git a/Rendering/WebGPU/wgsl/LineRoundJoinVertexShader.wgsl b/Rendering/WebGPU/wgsl/LineRoundJoinVertexShader.wgsl
index a0773d1693f..98da5789efb 100644
--- a/Rendering/WebGPU/wgsl/LineRoundJoinVertexShader.wgsl
+++ b/Rendering/WebGPU/wgsl/LineRoundJoinVertexShader.wgsl
@@ -81,7 +81,8 @@ const TRIANGLE_VERTS = array(
 struct ActorBlock {
   transform: ActorTransform,
   render_options: ActorRenderOptions,
-  color_options: ActorColorOptions
+  color_options: ActorColorOptions,
+  id: u32,
 }
 
 //-------------------------------------------------------------------
diff --git a/Rendering/WebGPU/wgsl/PointGlyphShader.wgsl b/Rendering/WebGPU/wgsl/PointGlyphShader.wgsl
index fdee632b235..8e8ef01cd31 100644
--- a/Rendering/WebGPU/wgsl/PointGlyphShader.wgsl
+++ b/Rendering/WebGPU/wgsl/PointGlyphShader.wgsl
@@ -34,7 +34,8 @@ const TRIANGLE_VERTS = array(
 struct ActorBlock {
   transform: ActorTransform,
   render_options: ActorRenderOptions,
-  color_options: ActorColorOptions
+  color_options: ActorColorOptions,
+  id: u32,
 }
 
 //-------------------------------------------------------------------
diff --git a/Rendering/WebGPU/wgsl/PointShader.wgsl b/Rendering/WebGPU/wgsl/PointShader.wgsl
index 45c9da664fd..768d917cdb3 100644
--- a/Rendering/WebGPU/wgsl/PointShader.wgsl
+++ b/Rendering/WebGPU/wgsl/PointShader.wgsl
@@ -32,7 +32,8 @@ const TRIANGLE_VERTS = array(
 struct ActorBlock {
   transform: ActorTransform,
   render_options: ActorRenderOptions,
-  color_options: ActorColorOptions
+  color_options: ActorColorOptions,
+  id: u32,
 }
 
 //-------------------------------------------------------------------
diff --git a/Rendering/WebGPU/wgsl/SurfaceMeshGlyphShader.wgsl b/Rendering/WebGPU/wgsl/SurfaceMeshGlyphShader.wgsl
index b3a759b48d3..3e30902d864 100644
--- a/Rendering/WebGPU/wgsl/SurfaceMeshGlyphShader.wgsl
+++ b/Rendering/WebGPU/wgsl/SurfaceMeshGlyphShader.wgsl
@@ -14,7 +14,8 @@
 struct ActorBlock {
   transform: ActorTransform,
   render_options: ActorRenderOptions,
-  color_options: ActorColorOptions
+  color_options: ActorColorOptions,
+  id: u32,
 }
 
 //-------------------------------------------------------------------
diff --git a/Rendering/WebGPU/wgsl/SurfaceMeshShader.wgsl b/Rendering/WebGPU/wgsl/SurfaceMeshShader.wgsl
index fc4c0ebb1d7..2ec283b0b11 100644
--- a/Rendering/WebGPU/wgsl/SurfaceMeshShader.wgsl
+++ b/Rendering/WebGPU/wgsl/SurfaceMeshShader.wgsl
@@ -13,7 +13,8 @@
 struct ActorBlock {
   transform: ActorTransform,
   render_options: ActorRenderOptions,
-  color_options: ActorColorOptions
+  color_options: ActorColorOptions,
+  id: u32,
 }
 
 //-------------------------------------------------------------------
-- 
GitLab