Skip to content

Conversation

keyboardspecialist
Copy link
Contributor

@keyboardspecialist keyboardspecialist commented Aug 26, 2025

Description

When loaded multiple instances of the same Gaussian Splat model, any subsequent loaded instances would have their tiles transformed incorrectly. The primitive was transforming and modifying the underlying glTF attribute buffers. Any new instances loaded would not know those buffers were modified in any way and proceed to perform their own transforms on them.

This simply makes copies of those buffers into the GaussianSplat3DTileContent class, so they can be transformed and modified locally in the GaussianSplatPrimitive class without affecting other instances. When transforming child tiles into root tile space and when gathering tile data for rendering we read from the local copies rather than from the glTF attributes directly.

Issue number and link

Fixes #12795

Testing plan

Load this Sandcastle. It's essentially a race condition whether or not both tileset instances load correctly. Most of the time one will have tiles incorrectly rendered.

Broken Split Pane Sandcastle

Same demo but on this branch using local buffers for each instance. Each gets transformed correctly.

Fixed Splt Pane Sandcastle

Author checklist

  • I have submitted a Contributor License Agreement
  • I have added my name to CONTRIBUTORS.md
  • I have updated CHANGES.md with a short summary of my change
  • I have added or updated unit tests to ensure consistent code coverage
  • I have updated the inline documentation, and included code examples where relevant
  • I have performed a self-review of my code

… them for rendering. glTF attribute buffer is kept as ground truth
Copy link

Thank you for the pull request, @keyboardspecialist!

✅ We can confirm we have a CLA on file for you.

@keyboardspecialist keyboardspecialist self-assigned this Aug 26, 2025
Copy link
Contributor

@ggetz ggetz left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @keyboardspecialist! Code changes look good over all.

I was able to reproduce the issue in main fairly reliably by disabling my browser cache. In this brain, both tileset appear correctly even without the cache. 👍

As always, would it be possible to add a unit test?

Comment on lines +350 to +366
positions: {
get: function () {
return this._positions;
},
},

rotations: {
get: function () {
return this._rotations;
},
},

scales: {
get: function () {
return this._scales;
},
},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Inline docs?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Gaussian Splat tiles display breaks when using Cesium.SplitDirection Gaussian Splat tiles transformed incorrectly with multiple instances of tileset
2 participants