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