Skip to content

Fix SPZ v3 quaternion parsing#185

Merged
slimbuck merged 5 commits intoplaycanvas:mainfrom
azadbal:codex/fix-spz-v3-quaternion
Mar 23, 2026
Merged

Fix SPZ v3 quaternion parsing#185
slimbuck merged 5 commits intoplaycanvas:mainfrom
azadbal:codex/fix-spz-v3-quaternion

Conversation

@azadbal
Copy link
Copy Markdown
Contributor

@azadbal azadbal commented Mar 20, 2026

Summary

Fix SPZ v3 import parsing by handling the v3 rotation payload correctly and adding regression coverage.

What changed

  • read 4-byte packed rotations for SPZ v3 instead of treating them like the 3-byte v2 payload
  • decode v3 smallest-three quaternions directly from the packed uint32 value
  • keep the existing v2 quaternion path intact
  • add clearer validation around unsupported SH degrees / malformed payload sizes
  • add an SPZ v3 regression test that verifies quaternion decoding against known expected values

Root cause

The current v3 reader had three issues:

  • it used the v2 rotation payload size for v3
  • it read packed v3 quaternions at the wrong byte stride
  • it then treated decoded v3 quaternion values like raw bytes and normalized them again

That combination made v3 rotation data decode incorrectly.

Validation

  • npm run build
  • npm run lint
  • SPZ v2 import test still passes
  • new SPZ v3 regression test passes
  • local supersplat validation also succeeds when pointed at this patched package and loading a real v3 file

Follow-up

There is a stacked supersplat PR that pins this branch commit temporarily so SPZ v3 support can be reviewed end-to-end before the npm package release. The expectation is to merge this PR first, then replace that temporary git pin with the published package version before merging the consumer PR.

Notes

FYI, I did not include SPZ v4 support here (which we're planning on releasing soon). This change is scoped to making the existing v3 support to work proprely.

Copy link
Copy Markdown
Member

@slimbuck slimbuck left a comment

Choose a reason for hiding this comment

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

Fix confirmed!

Old:
Image

New:
Image

Thank you for this contribution!

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR fixes SPZ v3 import rotation parsing by correctly treating v3 rotations as 4-byte packed “smallest-three” quaternions (instead of the v2 3-byte payload), adds input-size/SH-degree validation, and introduces a regression test to cover the corrected decoding path.

Changes:

  • Correct SPZ v3 rotation payload sizing/stride and decode v3 packed smallest-three quaternions from a uint32.
  • Add validation for unsupported SH degrees and insufficient payload sizes.
  • Add an SPZ v3 regression test fixture asserting decoded quaternion values.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

File Description
src/lib/readers/read-spz.ts Fixes SPZ v3 rotation parsing (4-byte stride + packed quaternion decode) and adds SH/payload-size validation.
test/formats.test.mjs Adds a synthetic SPZ v3 fixture and a regression test asserting correct quaternion decoding.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/lib/readers/read-spz.ts Outdated
Comment thread test/formats.test.mjs Outdated
Comment thread src/lib/readers/read-spz.ts
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/lib/readers/read-spz.ts
@slimbuck slimbuck merged commit 749a466 into playcanvas:main Mar 23, 2026
7 checks passed
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.

3 participants