Skip to content

feat: avatar masks#7462

Merged
Maurizio-dcl merged 46 commits intodevfrom
feat/avatar-masks
Apr 14, 2026
Merged

feat: avatar masks#7462
Maurizio-dcl merged 46 commits intodevfrom
feat/avatar-masks

Conversation

@Maurizio-dcl
Copy link
Copy Markdown
Contributor

@Maurizio-dcl Maurizio-dcl commented Mar 10, 2026

Pull Request Description

protocol PR
js-sdk-toolchain PR
sdk7-test-scenes PR

What does this PR change?

Implements avatar masks for the emote system, enabling partial-body (upper body) emote animations alongside full-body movement. This allows scenes to trigger emotes that only affect specific avatar parts while preserving locomotion on the rest of the body.

Test Instructions

These instructions are meant to be used in the 88,-13-avatar-masks-test-scene from this PR.

  1. Green box triggers a masked emote on the upper body only
  2. Yellow box triggers a full body emote
  3. Red box stops any emote
  4. Crate can be pickup up with E and dropped in front of the avatar with F

⚠️ NOTE: The crate uses the avatar attach component to demonstrate how masked emotes can be used with this component to achieve natural interactions with scene props, any bug related to the crate behavior should not be considered as part of this PR

Test Steps

  1. Trigger the masked upper body emote interacting with the green box
  2. Verify the upper body plays the emote animation while legs continue locomotion
  3. Walk/run/jump during the masked emote — verify lower body movement is unaffected
  4. Exit the scene and re-enter — verify masked emote pauses on exit and resumes on re-enter
  5. Trigger a full-body emote while a masked emote is active (using the emote wheel or interacting with the yellow box) — verify masked emote stops and resumes on end
  6. Start gliding while a masked emote is playing — verify masked emote stops and resumes on end
  7. Test with another player in the same scene — verify remote player's masked emote renders correctly on upper body layer
  8. Reload the scene and verify all state is reset — no masked emote should be playing
  9. Trigger stopEmote() from scene — verify both local and remote masked emotes stop cleanly

Additional Testing Notes

  • Edge case: quick entering / exiting should not leave stuck masked emote state
  • Verify prop animations and head/hands IK are correctly disabled during masked emote playback
  • Verify full-body emotes on remote players still work as before (no regression)

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 Code Review Standards before submitting.

@Maurizio-dcl Maurizio-dcl self-assigned this Mar 10, 2026
@Maurizio-dcl Maurizio-dcl requested review from a team as code owners March 10, 2026 11:26
@Maurizio-dcl Maurizio-dcl added the shape-up It has been shaped and is awaiting the cycle. label Mar 19, 2026
…erent CharacterMaskedEmoteComponent

- minor fixes
# Conflicts:
#	Explorer/Assets/DCL/AvatarRendering/AvatarShape/Assets/Animator/CharacterAnimator.controller
#	Explorer/Assets/DCL/AvatarRendering/AvatarShape/Assets/AvatarBase.prefab
#	Explorer/Assets/DCL/AvatarRendering/AvatarShape/UnityInterface/AvatarBase.cs
#	Explorer/Assets/DCL/AvatarRendering/Emotes/Systems/Play/CharacterEmoteSystem.cs
#	Explorer/Assets/DCL/AvatarRendering/Emotes/Tests/UpdateEmoteInputSystemShould.cs
#	Explorer/Assets/DCL/Infrastructure/SceneRunner/SceneInstanceDeps.cs
#	Explorer/Assets/DCL/Infrastructure/Utility/Animations/AnimationHashes.cs
#	Explorer/Assets/Protocol/DecentralandProtocol/Comms.gen.cs
#	Explorer/Packages/packages-lock.json
#	scripts/package-lock.json
#	scripts/package.json
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Mar 26, 2026

@Maurizio-dcl Maurizio-dcl changed the title shape: avatar masks feat: avatar masks for partial-body emotes Mar 26, 2026
…hrough new exposed APIs

- Modified glTFast import settings to explicitly request CPU readable textures
- Replaced draco dependency as per glTFast recommendation
@Maurizio-dcl Maurizio-dcl changed the title feat: avatar masks for partial-body emotes feat: avatar masks Mar 27, 2026
@Maurizio-dcl Maurizio-dcl added the clean-build Used to trigger clean build on PR label Mar 27, 2026
@AnsisMalins
Copy link
Copy Markdown
Contributor

PR 7462

PR number: 7462
Windows change build
Windows baseline build
macOS change build
macOS baseline build

Intel Core i3

Change samples: 2672
Baseline samples: 2672

Metric Change Baseline Delta Improvement
CPU average 33.6 ms 33.6 ms -0.0 ms 0.0%
CPU 1% worst 53.3 ms 57.9 ms -4.7 ms 8.1% 🟢
CPU 0.1% worst 115.6 ms 147.5 ms -31.9 ms 21.6% 🟢
GPU average 16.2 ms 16.4 ms -0.2 ms 1.2%
GPU 1% worst 22.5 ms 22.0 ms 0.6 ms -2.6%
GPU 0.1% worst 27.0 ms 25.8 ms 1.3 ms -4.9% 🔴

Copy link
Copy Markdown
Contributor

@Ludmilafantaniella Ludmilafantaniella left a comment

Choose a reason for hiding this comment

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

QA Result: ✅ Approved
Tested on Windows and Mac using the world provided by the dev (nebi.dcl.eth).

What was tested:

  • Upper body masked emote triggers correctly via green box — legs continue locomotion unaffected
  • Walk, run and jump during masked emote — lower body movement unaffected
  • Exit and re-enter scene — masked emote pauses and resumes correctly
  • Full body emote triggered while masked emote is active — masked emote stops and resumes on end
  • Gliding while masked emote is playing — masked emote stops and resumes on end
  • Remote player's masked emote renders correctly on upper body layer
  • Scene reload — all state resets correctly, no stuck masked emote
  • stopEmote() — both local and remote masked emotes stop cleanly
  • Quick enter/exit edge case — no stuck state
  • Full body emotes on remote players — no regression

Notes:

  • Some issues were found during testing and have been fixed. Thread for context here.
  • One sync issue remains but is unrelated to this branch — it also occurs in prod in scenes like Genesis Plaza.
7562-evi.1.mp4

✅Smoke Test performed:

  • ✔️ Backpack and wearables in world
  • ✔️ Emotes in world and in backpack
  • Scene Emotes on Genesis Plaza
  • Scene with auto emote: The Inn & Goerli
  • ✔️ Teleport with map/coordinates/Jump In
  • ✔️ Chat and multiplayer
  • ✔️ Profile card
  • ✔️ Camera
  • ✔️ Skybox

Copy link
Copy Markdown
Contributor

@alejandro-jimenez-dcl alejandro-jimenez-dcl left a comment

Choose a reason for hiding this comment

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

Left some comments. Great work!

Comment thread Explorer/Assets/DCL/AvatarRendering/Emotes/Systems/Play/CharacterEmoteSystem.cs Outdated
Comment thread Explorer/Assets/DCL/AvatarRendering/Emotes/Systems/Play/EmotePlayer.cs Outdated
Comment thread Explorer/Assets/DCL/AvatarRendering/Emotes/Systems/Play/SceneMaskedEmoteSystem.cs Outdated
…pan only when needed

- Refactored TryCancelMaskedEmote to return a bool as expected (removed StopAndResetMaskedEmote too)
- Only left messageBus.Send() wrapped in the try/catch
- Removed callback from TriggerSceneEmoteAsync and refactored using correct async flow
# Conflicts:
#	Explorer/Assets/DCL/Multiplayer/Emotes/MultiplayerEmotesMessageBus.cs
# Conflicts:
#	Explorer/Assets/DCL/Infrastructure/Global/Dynamic/DynamicWorldContainer.cs
#	Explorer/Assets/DCL/Infrastructure/Utility/Utility.asmdef
#	Explorer/Assets/DCL/PluginSystem/Global/EmotePlugin.cs
@Maurizio-dcl Maurizio-dcl enabled auto-merge (squash) April 14, 2026 19:05
@Maurizio-dcl Maurizio-dcl merged commit 8267afb into dev Apr 14, 2026
14 of 18 checks passed
@Maurizio-dcl Maurizio-dcl deleted the feat/avatar-masks branch April 14, 2026 19:50
@pravusjif pravusjif restored the feat/avatar-masks branch April 21, 2026 19:10
@pravusjif pravusjif deleted the feat/avatar-masks branch April 21, 2026 19:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

shape-up It has been shaped and is awaiting the cycle.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants