diff --git a/Rendering/WebGPU/Private/vtkWebGPUActorInternals.h b/Rendering/WebGPU/Private/vtkWebGPUActorInternals.h index 3a0a7e3155cda49fc455b77a8cb9503d67baed8b..f3f5c1dd41a1da8f078c34557361d580eebe06aa 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 d0cf936902ccf942e7e61adfad19de4e1ce89bfc..945b7a934034789ce46eb2d98b246c86ffa46566 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 0e30e0b732148c15e243ee03f0d1ce858e9d3d07..397e3e1a573dea5c8fc37a7bda4958bf8b40f0cd 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 a5b5d0e8de3698f7c2ecba1ef73c71cfe253c7f1..60e6b369cb83cb623c147c3c88b912a2e7678625 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 82134cf3d2669f85e693b9a896de94b1ef9ef640..4e73968cc11de7d9f2dc2e1e18584d75afdb8e71 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 f29e73cbe1a271bad78142c7c393300d51f21cd5..2e17120cad89d21dda5280d151cc55e9413b8a65 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 a0773d1693f1354fa46b944c389224b9aa829d06..98da5789efbec6b8dc1aea6bd340bf8c829c5970 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 fdee632b2356ed2df35832556a72ec4902f0669c..8e8ef01cd31e572369a5883377a9487cd2827cfe 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 45c9da664fd70590ecbf92e832636d6fa9e64990..768d917cdb384869579bcf6ea13737e993a3146e 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 b3a759b48d3f147a3df0b29cc23b90d3eab56454..3e30902d864cfda3cf19419d839241b62ac1438e 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 fc4c0ebb1d7939ceb816da8c78cb79834e85437d..2ec283b0b11496fdcb68c19e00ad656659427548 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, } //-------------------------------------------------------------------