Skip to content

feat: sdk | scene name tag - #9829

Draft
popuz wants to merge 24 commits into
devfrom
feat/sdk/scene-name-tag
Draft

feat: sdk | scene name tag#9829
popuz wants to merge 24 commits into
devfrom
feat/sdk/scene-name-tag

Conversation

@popuz

@popuz popuz commented Aug 21, 2026

Copy link
Copy Markdown
Collaborator

Pull Request Description

What does this PR change?

Test Instructions

Steps (standard run):

metaforge explorer run XXXX  # ← replace with this PR number

Expected result:

Steps (fresh account):

metaforge account create --clear
metaforge explorer run XXXX  # ← replace with this PR number

Expected result:

Automation (if applicable):

metaforge explorer test XXXX

Prerequisites

  • List any required setup steps
  • Include environment/configuration requirements

Test Steps

  1. First step
  2. Second step
  3. Expected result after step 2
  4. ...

Additional Testing Notes

  • Note any edge cases to verify
  • Mention specific areas that need careful testing
  • List known limitations or potential issues

Quality Checklist

  • Changes have been tested locally
  • Documentation has been updated (if required)
  • Performance impact has been considered
  • For SDK features: Test scene is included

Code Review Reference

Please review our Branch & PR Standards before submitting. It explains the automated review flow, QA/DEV approval requirements, and what each label does — especially useful for first-time contributors.

popuz added 3 commits August 18, 2026 17:51
# Conflicts:
#	Explorer/Assets/DCL/AvatarRendering/AvatarShape/Tests/PerformanceTests.meta
#	Explorer/Assets/DCL/AvatarRendering/AvatarShape/Tests/PerformanceTests/AvatarOutlineFrustumHoistPerformanceTest.cs.meta
#	Explorer/Assets/DCL/AvatarRendering/AvatarShape/Tests/PlayMode/BoneMatrixCalculationJobPerformanceTest.cs.meta
#	Explorer/Assets/DCL/Infrastructure/ECS/Unity/Transforms/Tests/PerformanceTests.meta
#	Explorer/Assets/DCL/Infrastructure/ECS/Unity/Transforms/Tests/PerformanceTests/SetWorldTransformCachePerformanceTest.cs.meta
#	Explorer/Assets/DCL/Landscape/Tests.meta
#	Explorer/Assets/DCL/Landscape/Tests/PerformanceTests.meta
#	Explorer/Assets/DCL/Landscape/Tests/PerformanceTests/GroundContainerReuse.meta
#	Explorer/Assets/DCL/Landscape/Tests/PerformanceTests/GroundContainerReuse/RenderGroundContainerReusePerformanceTest.cs.meta
#	Explorer/Assets/DCL/Tests/PlayMode/PerformanceTests/EventsStateServiceLookupPerformanceTest.cs.meta
#	Explorer/Assets/DCL/Tests/PlayMode/PerformanceTests/PlacesStateServiceLookupPerformanceTest.cs.meta
Scenes can now put a short line of text above a player's native nametag. The
immediate use case is player ranks, which scenes fake today with a billboarded
TextShape on the NAME_TAG anchor that matches nothing about the real nametag.

Protocol: PBAvatarNametag, component id 1221 (decentraland/protocol#467). The
component is written on the player entity itself - engine.PlayerEntity for the
local player, getPlayer({ userId }).entity for anyone else - so there is no
target field to resolve, and comms cannot relay it because entity ids below 512
are dropped. The plate is therefore local to the client that renders it, and a
scene that wants everyone to see the same plate distributes it through its own
state.

PropagateSceneAvatarTagSystem bridges the scene world into the global world:

- target resolution is O(1) and stays clear of FindAvatarUtils - CRDT id 1 maps
  to the injected global player entity, anything else reads SDKProfile.UserId
  off the same scene entity and goes through EntityParticipantTable;
- an unresolved target leaves IsDirty set, so the write replays once the avatar
  exists, and SceneAvatarTagApplied records where a plate landed so a recycled
  remote entity id drops the old plate before claiming a new one;
- removal always goes through IsRemoving, never World.Remove - the placement
  system hides the plate first and removes the component afterwards;
- an absent label or background color inherits the native nametag color.

Gating: portable experiences never get the system injected at all; plates are
dropped when the scene stops being current and replayed on return
(ISceneIsCurrentListener), and dropped on scene unload (IFinalizeWorldSystem).

V1 covers player entities only. A scene-spawned AvatarShape resolves to nothing
by construction, since its text over the head already comes from
PBAvatarShape.name and a second channel would mean two sources of truth.

scripts/package.json pins the protocol PR tarball - repin to
@dcl/protocol@experimental once #467 is merged and synced.
@popuz popuz self-assigned this Aug 21, 2026
@popuz popuz added the force-build Used to trigger a build on draft PR label Aug 21, 2026
@popuz popuz changed the title Feat/sdk/scene name tag feat: sdk | scene name tag Aug 21, 2026
@popuz popuz added force-build Used to trigger a build on draft PR and removed force-build Used to trigger a build on draft PR labels Aug 21, 2026
@popuz
popuz marked this pull request as ready for review August 21, 2026 13:58
@popuz
popuz requested review from a team as code owners August 21, 2026 13:58
@popuz
popuz marked this pull request as draft August 21, 2026 13:58
@popuz
popuz removed request for a team August 21, 2026 13:58
popuz added 2 commits August 21, 2026 17:49
# Conflicts:
#	Explorer/Assets/DCL/Infrastructure/Global/ComponentsContainer.cs
#	Explorer/Assets/Protocol/DecentralandProtocol/ComponentID.gen.cs
#	Explorer/Assets/Protocol/DecentralandProtocol/ExplorerUi.gen.cs.meta
#	Explorer/Assets/Protocol/DecentralandProtocol/ExplorerUiEventsResult.gen.cs.meta
@github-actions

github-actions Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

@decentraland-bot

This comment has been minimized.

popuz and others added 3 commits August 21, 2026 21:37
Mirror the chat TMP setup in the nametag UITK panel: emojis32_uitk goes into
PanelTextSettings emoji fallback, so plate labels, names and chat bubbles render
emoji from the already-shipped emojis32 atlas instead of missing-glyph squares.
No new build content: the sprite asset and its texture were already referenced.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Aug 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
unity-explorer Error Error Aug 24, 2026 6:22pm

Request Review

@decentraland-bot

This comment has been minimized.

# Conflicts:
#	scripts/package-lock.json
#	scripts/package.json
popuz and others added 3 commits August 28, 2026 19:51
The previous pin predated main's Pulse/EngineInfo protocol bump; the refreshed
protocol PR branch now carries both, so a build-protocol run no longer rolls
main's codegen back. AvatarNametag docstrings catch up with the implemented
NPC support and nametags-toggle behavior.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Figma node 13712-3846: capsule radius, 1px/6px padding, 1.5px border at
20% white. Font (Inter 600 14px) and the default colors (#161518 bkg,
#FCFCFC label) already matched and stay untouched.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@decentraland-bot

This comment has been minimized.

@decentraland-bot

This comment has been minimized.

An unset border_color took a translucent white rim derived from the
background, which every scene got whether it asked for one or not. It
now takes the background color itself, so the rim is opt-in and the
plate reads as a flat capsule by default; the 1.5px width stays either
way, so the plate never changes size.

The USS border color only ever shows in the UI Builder preview - the
runtime paints all four sides before the plate is displayed - so it
follows the same default. NATIVE_BORDER_COLOR had no callers left.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@decentraland-bot

This comment has been minimized.

Comment thread scripts/package.json
Comment on lines -19 to 20
"@dcl/protocol": "^1.0.0-32905037810.commit-4ed8d74",
"@dcl/protocol": "https://sdk-team-cdn.decentraland.org/@dcl/protocol/branch//dcl-protocol-1.0.0-33210268884.commit-41ca04b.tgz",
"@protobuf-ts/protoc": "^2.11.0",

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

replace after protocol merge

@decentraland-bot

This comment has been minimized.

@decentraland-bot

Copy link
Copy Markdown
Contributor

PR #9829, run #33549490595

Overall: ✅ no significant changes

Builds: Windows change, Windows baseline, macOS change, macOS baseline

How to read this table
  • Each build is measured 3 times, interleaved with the other build (change, baseline, change, baseline, ...) in the same session, so both see the same world content and machine state. The values are the median, and (min–max) is the lowest and highest of those runs.
  • Δ is Change minus Baseline (a negative Δ means Change is faster).
  • 🟢 faster / 🔴 slower — a difference that passed every check: the runs are fully separated (every run of one build faster than every run of the other), and the median difference is at least 3% and at least 0.5 ms.
  • ⚪ within noise — the builds' runs overlap, or the difference is tiny; it cannot be told apart from random variation. Treat it as no change.
  • — informational — the 0.1% worst metrics average only the few worst frames of a run, so a single OS hiccup swings them by a lot; they are shown for context and never earn a verdict.
  • ⚠️ no verdict — the two builds' sessions were not comparable (very different sample counts, or too few usable runs), so no conclusion is drawn from them.
  • Exceptions per run — the average number of exceptions in a run's log, not counting teardown ones logged while the app quits. Flagged only on a difference of at least 2 per run and 1.5× the other build; exception kinds the baseline never threw are called out under the table. The Exception breakdown groups all of them by the explorer's report category and exception type (as totals across the runs).
  • A run that logged unusually many exceptions (at least 10 and 5× the median of its build's runs — e.g. a service was down during it) is excluded from all numbers and called out under the table.
  • The Overall line at the top only reacts to a metric that moved on two or more machines, or by 10% or more on one — a single modest 🟢/🔴 cell can still be a statistical fluke.

Intel Core i5

Metric Baseline Change Δ Result
Samples 4292 (×3) 4558 (×3)
CPU average 20.8 ms (17.3–21.6) 19.7 ms (16.8–22.0) -1.1 ms ⚪ within noise
CPU 1% worst 409.2 ms (231.2–469.3) 370.2 ms (256.4–452.8) -39.0 ms ⚪ within noise
CPU 0.1% worst 458.5 ms (404.2–492.6) 425.9 ms (305.5–497.8) -32.6 ms — informational
GPU average 13.4 ms (11.2–13.5) 12.2 ms (10.6–14.5) -1.2 ms ⚪ within noise
GPU 1% worst 231.2 ms (150.3–279.8) 191.6 ms (164.2–335.3) -39.6 ms ⚪ within noise
GPU 0.1% worst 454.4 ms (402.4–492.0) 422.5 ms (306.3–491.3) -31.9 ms — informational
Exceptions per run 0 0 0 ⚪ no significant change

Apple M1

Metric Baseline Change Δ Result
Samples 4087 (×3) 3950 (×3)
CPU average 21.8 ms (21.2–22.3) 22.7 ms (21.5–22.7) 0.9 ms ⚪ within noise
CPU 1% worst 229.3 ms (177.3–229.5) 229.8 ms (227.2–229.9) 0.5 ms ⚪ within noise
CPU 0.1% worst 235.0 ms (233.8–235.1) 234.7 ms (230.6–237.9) -0.3 ms — informational
GPU average 38.6 ms (38.0–38.8) 39.2 ms (37.2–39.8) 0.5 ms ⚪ within noise
GPU 1% worst 47.2 ms (46.2–48.0) 48.1 ms (46.2–48.2) 0.9 ms ⚪ within noise
GPU 0.1% worst 49.3 ms (47.5–52.6) 50.4 ms (48.8–50.9) 1.1 ms — informational
Exceptions per run 0 0 0 ⚪ no significant change

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

force-build Used to trigger a build on draft PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants