From 3ebd629b965cf73961af9c1064b88c328bb59857 Mon Sep 17 00:00:00 2001 From: mrdoob Date: Sun, 8 Feb 2026 21:53:43 -0800 Subject: [PATCH 1/3] Editor: Add Animation panel. (#32869) Co-authored-by: Claude Opus 4.5 --- editor/css/main.css | 67 ++- editor/index.html | 31 ++ editor/js/Animation.js | 581 ++++++++++++++++++++ editor/js/AnimationResizer.js | 73 +++ editor/js/Editor.js | 4 +- editor/js/Resizer.js | 7 + editor/js/Sidebar.Object.Animation.js | 102 ---- editor/js/Sidebar.Object.js | 6 - examples/jsm/helpers/AnimationPathHelper.js | 302 ++++++++++ 9 files changed, 1062 insertions(+), 111 deletions(-) create mode 100644 editor/js/Animation.js create mode 100644 editor/js/AnimationResizer.js delete mode 100644 editor/js/Sidebar.Object.Animation.js create mode 100644 examples/jsm/helpers/AnimationPathHelper.js diff --git a/editor/css/main.css b/editor/css/main.css index 623653636ca396..cb22e740c25fa4 100644 --- a/editor/css/main.css +++ b/editor/css/main.css @@ -343,7 +343,7 @@ hr { top: 36px; left: 0; right: 350px; - bottom: 0; + bottom: 36px; } #viewport .Text { @@ -351,6 +351,48 @@ hr { pointer-events: none; } +#animation { + position: absolute; + left: 0; + right: 350px; + bottom: 0; + height: 36px; + background: #eee; + border-top: 1px solid #ccc; + display: none; + flex-direction: row; +} + + #animation .Panel { + color: #888; + } + + #animation input[type="range"] { + accent-color: #08f; + } + +#animation-resizer { + position: absolute; + left: 0; + right: 350px; + bottom: 36px; + height: 5px; + transform: translateY(2.5px); + cursor: row-resize; + z-index: 2; +} + + #animation-resizer:hover { + background-color: #08f8; + transition-property: background-color; + transition-delay: 0.1s; + transition-duration: 0.2s; + } + + #animation-resizer:active { + background-color: #08f; + } + #script { position: absolute; top: 36px; @@ -536,7 +578,7 @@ hr { position: absolute; left: calc(50% - 175px); transform: translateX(-50%); - bottom: 20px; + bottom: 56px; height: 32px; background: #eee; text-align: center; @@ -621,6 +663,10 @@ hr { display: none; } + #animation-resizer { + display: none; + } + #menubar .menu .options { max-height: calc(100% - 80px); } @@ -663,6 +709,10 @@ hr { bottom: 330px; } + #animation { + display: none !important; + } + } /* DARK MODE */ @@ -740,6 +790,19 @@ hr { border: solid 1px #5A5A5A; } + #animation { + background-color: #111; + border-top: 1px solid #222; + } + + #animation .Panel { + border-bottom: 1px solid #222; + } + + #animation .timeline-container { + background: rgba(255, 255, 255, 0.05); + } + #tabs { background-color: #1b1b1b; border-top: 1px solid #222; diff --git a/editor/index.html b/editor/index.html index 9f7db7798dd531..0dd382b50546e1 100644 --- a/editor/index.html +++ b/editor/index.html @@ -69,6 +69,8 @@ import { Sidebar } from './js/Sidebar.js'; import { Menubar } from './js/Menubar.js'; import { Resizer } from './js/Resizer.js'; + import { AnimationResizer } from './js/AnimationResizer.js'; + import { Animation } from './js/Animation.js'; window.URL = window.URL || window.webkitURL; window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder; @@ -101,6 +103,35 @@ const resizer = new Resizer( editor ); document.body.appendChild( resizer.dom ); + const animation = new Animation( editor ); + document.body.appendChild( animation.dom ); + + const animationResizer = new AnimationResizer( editor ); + document.body.appendChild( animationResizer.dom ); + + editor.signals.animationPanelChanged.add( function ( height ) { + + const visible = height !== false; + + viewport.dom.classList.toggle( 'with-animation', visible ); + toolbar.dom.classList.toggle( 'with-animation', visible ); + + if ( visible ) { + + viewport.dom.style.bottom = height + 'px'; + toolbar.dom.style.bottom = ( height + 20 ) + 'px'; + + } else { + + viewport.dom.style.bottom = ''; + toolbar.dom.style.bottom = ''; + + } + + editor.signals.windowResize.dispatch(); + + } ); + // editor.storage.init( function () { diff --git a/editor/js/Animation.js b/editor/js/Animation.js new file mode 100644 index 00000000000000..7be0cb1f04426d --- /dev/null +++ b/editor/js/Animation.js @@ -0,0 +1,581 @@ +import { UIPanel, UIText, UIButton } from './libs/ui.js'; + +import { AnimationPathHelper } from 'three/addons/helpers/AnimationPathHelper.js'; + +function Animation( editor ) { + + const signals = editor.signals; + + const container = new UIPanel(); + container.setId( 'animation' ); + container.dom.style.flexDirection = 'column'; + + let panelHeight = 36; + + // Listen for resizer changes + signals.animationPanelResized.add( function ( height ) { + + panelHeight = height; + container.dom.style.height = height + 'px'; + signals.animationPanelChanged.dispatch( height ); + + } ); + + // Top bar - playback controls + const controlsPanel = new UIPanel(); + controlsPanel.dom.style.padding = '6px 10px'; + controlsPanel.dom.style.borderBottom = '1px solid #ccc'; + controlsPanel.dom.style.display = 'flex'; + controlsPanel.dom.style.alignItems = 'center'; + controlsPanel.dom.style.justifyContent = 'center'; + controlsPanel.dom.style.gap = '6px'; + controlsPanel.dom.style.flexShrink = '0'; + container.add( controlsPanel ); + + // SVG icons + const playIcon = ``; + const pauseIcon = ``; + const stopIcon = ``; + + const playButton = new UIButton(); + playButton.dom.innerHTML = playIcon; + playButton.dom.style.width = '24px'; + playButton.dom.style.height = '24px'; + playButton.dom.style.padding = '0'; + playButton.dom.style.borderRadius = '4px'; + playButton.dom.style.display = 'flex'; + playButton.dom.style.alignItems = 'center'; + playButton.dom.style.justifyContent = 'center'; + playButton.onClick( function () { + + if ( currentAction ) { + + if ( currentAction.paused ) { + + currentAction.paused = false; + + } else if ( ! currentAction.isRunning() ) { + + currentAction.reset(); + currentAction.play(); + + } + + } + + } ); + controlsPanel.add( playButton ); + + const pauseButton = new UIButton(); + pauseButton.dom.innerHTML = pauseIcon; + pauseButton.dom.style.width = '24px'; + pauseButton.dom.style.height = '24px'; + pauseButton.dom.style.padding = '0'; + pauseButton.dom.style.borderRadius = '4px'; + pauseButton.dom.style.display = 'flex'; + pauseButton.dom.style.alignItems = 'center'; + pauseButton.dom.style.justifyContent = 'center'; + pauseButton.onClick( function () { + + if ( currentAction ) { + + currentAction.paused = true; + + } + + } ); + controlsPanel.add( pauseButton ); + + const stopButton = new UIButton(); + stopButton.dom.innerHTML = stopIcon; + stopButton.dom.style.width = '24px'; + stopButton.dom.style.height = '24px'; + stopButton.dom.style.padding = '0'; + stopButton.dom.style.borderRadius = '4px'; + stopButton.dom.style.display = 'flex'; + stopButton.dom.style.alignItems = 'center'; + stopButton.dom.style.justifyContent = 'center'; + stopButton.onClick( function () { + + if ( currentAction ) { + + currentAction.stop(); + + } + + } ); + controlsPanel.add( stopButton ); + + // Time display + const timeDisplay = document.createElement( 'div' ); + timeDisplay.style.display = 'flex'; + timeDisplay.style.alignItems = 'center'; + timeDisplay.style.justifyContent = 'center'; + timeDisplay.style.gap = '4px'; + timeDisplay.style.height = '24px'; + timeDisplay.style.padding = '0 8px'; + timeDisplay.style.background = 'rgba(0,0,0,0.05)'; + timeDisplay.style.borderRadius = '4px'; + timeDisplay.style.fontFamily = 'monospace'; + timeDisplay.style.fontSize = '11px'; + controlsPanel.dom.appendChild( timeDisplay ); + + const timeText = new UIText( '0.00' ).setWidth( '36px' ); + timeText.dom.style.textAlign = 'right'; + timeDisplay.appendChild( timeText.dom ); + + const separator = new UIText( '/' ); + timeDisplay.appendChild( separator.dom ); + + const durationText = new UIText( '0.00' ).setWidth( '36px' ); + timeDisplay.appendChild( durationText.dom ); + + // Timeline area with track rows + const timelineArea = document.createElement( 'div' ); + timelineArea.style.flex = '1'; + timelineArea.style.display = 'flex'; + timelineArea.style.flexDirection = 'column'; + timelineArea.style.overflow = 'hidden'; + timelineArea.style.position = 'relative'; + container.dom.appendChild( timelineArea ); + + // Scrollable track list + const trackListContainer = document.createElement( 'div' ); + trackListContainer.style.flex = '1'; + trackListContainer.style.overflowY = 'auto'; + trackListContainer.style.overflowX = 'hidden'; + timelineArea.appendChild( trackListContainer ); + + // Playhead (spans entire timeline area) + const playhead = document.createElement( 'div' ); + playhead.style.position = 'absolute'; + playhead.style.top = '0'; + playhead.style.bottom = '0'; + playhead.style.width = '2px'; + playhead.style.background = '#f00'; + playhead.style.left = '150px'; // Start at timeline start (after labels) + playhead.style.pointerEvents = 'none'; + playhead.style.zIndex = '10'; + timelineArea.appendChild( playhead ); + + // Timeline scrubbing + let isDragging = false; + const labelWidth = 150; + + function updateTimeFromPosition( clientX ) { + + const rect = timelineArea.getBoundingClientRect(); + const timelineStart = labelWidth; + const timelineWidth = rect.width - labelWidth; + const x = Math.max( 0, Math.min( clientX - rect.left - timelineStart, timelineWidth ) ); + const percent = x / timelineWidth; + + if ( currentAction && currentClip ) { + + const time = percent * currentClip.duration; + currentAction.play(); + currentAction.time = time; + currentAction.paused = true; + editor.mixer.update( 0 ); + + } + + } + + timelineArea.addEventListener( 'mousedown', function ( event ) { + + const rect = timelineArea.getBoundingClientRect(); + if ( event.clientX - rect.left > labelWidth ) { + + event.preventDefault(); + + isDragging = true; + updateTimeFromPosition( event.clientX ); + + } + + } ); + + document.addEventListener( 'mousemove', function ( event ) { + + if ( isDragging ) { + + updateTimeFromPosition( event.clientX ); + + } + + } ); + + document.addEventListener( 'mouseup', function () { + + isDragging = false; + + } ); + + // Track colors by type + const trackColors = { + position: '#4CAF50', + quaternion: '#2196F3', + rotation: '#2196F3', + scale: '#FF9800', + morphTargetInfluences: '#9C27B0', + default: '#607D8B' + }; + + function getTrackColor( trackName ) { + + for ( const type in trackColors ) { + + if ( trackName.endsWith( '.' + type ) ) { + + return trackColors[ type ]; + + } + + } + + return trackColors.default; + + } + + function getTrackType( trackName ) { + + const parts = trackName.split( '.' ); + return parts[ parts.length - 1 ]; + + } + + // Hover path helper + let hoverHelper = null; + let currentAction = null; + let currentClip = null; + let currentRoot = null; + + // Get all clips from scene animations + function getAnimationClips() { + + const scene = editor.scene; + const clips = []; + const seen = new Set(); + + scene.traverse( function ( object ) { + + if ( object.animations && object.animations.length > 0 ) { + + for ( const clip of object.animations ) { + + if ( ! seen.has( clip.uuid ) ) { + + seen.add( clip.uuid ); + clips.push( { clip: clip, root: object } ); + + } + + } + + } + + } ); + + // Also check scene.animations directly + for ( const clip of scene.animations ) { + + if ( ! seen.has( clip.uuid ) ) { + + seen.add( clip.uuid ); + clips.push( { clip: clip, root: scene } ); + + } + + } + + return clips; + + } + + function getObjectName( trackName, root ) { + + // Extract UUID from track name (format: uuid.property) + const dotIndex = trackName.lastIndexOf( '.' ); + if ( dotIndex === - 1 ) return trackName; + + const uuid = trackName.substring( 0, dotIndex ); + const object = root.getObjectByProperty( 'uuid', uuid ); + + return object ? ( object.name || 'Object' ) : uuid.substring( 0, 8 ); + + } + + function update() { + + trackListContainer.innerHTML = ''; + + container.setDisplay( 'flex' ); + container.dom.style.height = panelHeight + 'px'; + signals.animationPanelChanged.dispatch( panelHeight ); + + const clips = getAnimationClips(); + + if ( clips.length === 0 ) { + + return; + + } + + for ( const { clip, root } of clips ) { + + // Clip header row + const clipRow = document.createElement( 'div' ); + clipRow.style.display = 'flex'; + clipRow.style.alignItems = 'center'; + clipRow.style.height = '24px'; + clipRow.style.borderBottom = '1px solid #ccc'; + clipRow.style.cursor = 'pointer'; + clipRow.style.background = currentClip === clip ? 'rgba(0, 136, 255, 0.1)' : ''; + + const clipLabel = document.createElement( 'div' ); + clipLabel.style.width = labelWidth + 'px'; + clipLabel.style.padding = '0 10px'; + clipLabel.style.fontSize = '11px'; + clipLabel.style.fontWeight = 'bold'; + clipLabel.style.overflow = 'hidden'; + clipLabel.style.textOverflow = 'ellipsis'; + clipLabel.style.whiteSpace = 'nowrap'; + clipLabel.style.flexShrink = '0'; + clipLabel.style.boxSizing = 'border-box'; + clipLabel.textContent = clip.name || 'Animation'; + clipRow.appendChild( clipLabel ); + + const clipTimeline = document.createElement( 'div' ); + clipTimeline.style.flex = '1'; + clipTimeline.style.height = '100%'; + clipTimeline.style.background = 'rgba(0,0,0,0.03)'; + clipRow.appendChild( clipTimeline ); + + clipRow.addEventListener( 'click', function () { + + editor.select( root ); + selectClip( clip, root ); + update(); // Refresh to update highlighting + + } ); + + trackListContainer.appendChild( clipRow ); + + // Only show tracks for selected clip + if ( currentClip === clip ) { + + const duration = clip.duration; + + for ( const track of clip.tracks ) { + + const times = track.times; + if ( times.length === 0 ) continue; + + const startTime = times[ 0 ]; + const endTime = times[ times.length - 1 ]; + const startPercent = ( startTime / duration ) * 100; + const widthPercent = ( ( endTime - startTime ) / duration ) * 100; + + const trackRow = document.createElement( 'div' ); + trackRow.style.display = 'flex'; + trackRow.style.alignItems = 'center'; + trackRow.style.height = '20px'; + trackRow.style.borderBottom = '1px solid #eee'; + + // Track label + const trackLabel = document.createElement( 'div' ); + trackLabel.style.width = labelWidth + 'px'; + trackLabel.style.padding = '0 10px 0 20px'; + trackLabel.style.fontSize = '10px'; + trackLabel.style.overflow = 'hidden'; + trackLabel.style.textOverflow = 'ellipsis'; + trackLabel.style.whiteSpace = 'nowrap'; + trackLabel.style.flexShrink = '0'; + trackLabel.style.boxSizing = 'border-box'; + trackLabel.style.color = '#666'; + + const objectName = getObjectName( track.name, root ); + const trackType = getTrackType( track.name ); + trackLabel.textContent = objectName + '.' + trackType; + trackLabel.title = track.name; + trackRow.appendChild( trackLabel ); + + // Track timeline with block + const trackTimeline = document.createElement( 'div' ); + trackTimeline.style.flex = '1'; + trackTimeline.style.height = '100%'; + trackTimeline.style.position = 'relative'; + trackTimeline.style.background = 'rgba(0,0,0,0.02)'; + + const block = document.createElement( 'div' ); + block.style.position = 'absolute'; + block.style.left = startPercent + '%'; + block.style.width = Math.max( 0.5, widthPercent ) + '%'; + block.style.top = '3px'; + block.style.bottom = '3px'; + block.style.background = getTrackColor( track.name ); + block.style.borderRadius = '2px'; + block.style.opacity = '0.6'; + block.title = trackType + ': ' + startTime.toFixed( 2 ) + 's - ' + endTime.toFixed( 2 ) + 's'; + + trackTimeline.appendChild( block ); + + // Add keyframe markers + for ( let i = 0; i < times.length; i ++ ) { + + const keyframePercent = ( times[ i ] / duration ) * 100; + const keyframe = document.createElement( 'div' ); + keyframe.style.position = 'absolute'; + keyframe.style.left = keyframePercent + '%'; + keyframe.style.top = '50%'; + keyframe.style.width = '6px'; + keyframe.style.height = '6px'; + keyframe.style.marginLeft = '-3px'; + keyframe.style.marginTop = '-3px'; + keyframe.style.background = getTrackColor( track.name ); + keyframe.style.borderRadius = '1px'; + keyframe.style.transform = 'rotate(45deg)'; + keyframe.title = times[ i ].toFixed( 3 ) + 's'; + trackTimeline.appendChild( keyframe ); + + } + trackRow.appendChild( trackTimeline ); + + // Hover on position tracks to show path helper + if ( track.name.endsWith( '.position' ) && track.getValueSize() === 3 ) { + + const uuid = track.name.replace( '.position', '' ); + const object = root.getObjectByProperty( 'uuid', uuid ); + + if ( object ) { + + trackRow.addEventListener( 'mouseenter', function () { + + showPath( clip, object ); + + } ); + + trackRow.addEventListener( 'mouseleave', function () { + + hidePath(); + + } ); + + } + + } + + trackListContainer.appendChild( trackRow ); + + } + + } + + } + + } + + function selectClip( clip, root ) { + + // Stop current action + if ( currentAction ) { + + currentAction.stop(); + + } + + // Select clip without playing + currentClip = clip; + currentRoot = root; + currentAction = editor.mixer.clipAction( clip, root ); + + // Update duration display + durationText.setValue( clip.duration.toFixed( 2 ) ); + + } + + function showPath( clip, object ) { + + hidePath(); + + hoverHelper = new AnimationPathHelper( currentRoot, clip, object ); + editor.sceneHelpers.add( hoverHelper ); + signals.sceneGraphChanged.dispatch(); + + } + + function hidePath() { + + if ( hoverHelper ) { + + editor.sceneHelpers.remove( hoverHelper ); + hoverHelper.dispose(); + hoverHelper = null; + signals.sceneGraphChanged.dispatch(); + + } + + } + + function clear() { + + hidePath(); + trackListContainer.innerHTML = ''; + currentAction = null; + currentClip = null; + currentRoot = null; + timeText.setValue( '0.00' ); + durationText.setValue( '0.00' ); + + } + + // Update time display and playhead during playback + function updateTime() { + + if ( currentAction && currentClip ) { + + const time = currentAction.time % currentClip.duration; + timeText.setValue( time.toFixed( 2 ) ); + + // Update playhead position + const rect = timelineArea.getBoundingClientRect(); + const timelineWidth = rect.width - labelWidth; + const playheadX = labelWidth + ( time / currentClip.duration ) * timelineWidth; + playhead.style.left = playheadX + 'px'; + + } + + requestAnimationFrame( updateTime ); + + } + + updateTime(); + + // Auto-select clip when an object with animations is selected + signals.objectSelected.add( function ( object ) { + + if ( object !== null && object.animations && object.animations.length > 0 ) { + + selectClip( object.animations[ 0 ], object ); + update(); + + } + + } ); + + // Update when scene changes + signals.editorCleared.add( clear ); + signals.objectAdded.add( update ); + signals.objectRemoved.add( update ); + + // Show panel on initial load + container.setDisplay( 'flex' ); + container.dom.style.height = panelHeight + 'px'; + signals.animationPanelChanged.dispatch( panelHeight ); + + return container; + +} + +export { Animation }; diff --git a/editor/js/AnimationResizer.js b/editor/js/AnimationResizer.js new file mode 100644 index 00000000000000..a6dd8331a39d59 --- /dev/null +++ b/editor/js/AnimationResizer.js @@ -0,0 +1,73 @@ +import { UIElement } from './libs/ui.js'; + +function AnimationResizer( editor ) { + + const signals = editor.signals; + + const dom = document.createElement( 'div' ); + dom.id = 'animation-resizer'; + + let panelHeight = 36; + let startY = 0; + let startHeight = 0; + + function onPointerDown( event ) { + + if ( event.isPrimary === false ) return; + + startY = event.clientY; + startHeight = panelHeight; + + dom.ownerDocument.addEventListener( 'pointermove', onPointerMove ); + dom.ownerDocument.addEventListener( 'pointerup', onPointerUp ); + + } + + function onPointerUp( event ) { + + if ( event.isPrimary === false ) return; + + dom.ownerDocument.removeEventListener( 'pointermove', onPointerMove ); + dom.ownerDocument.removeEventListener( 'pointerup', onPointerUp ); + + } + + function onPointerMove( event ) { + + if ( event.isPrimary === false ) return; + + const deltaY = startY - event.clientY; + const newHeight = startHeight + deltaY; + const maxHeight = window.innerHeight / 2; + + // Clamp between 36px (top bar only) and half the window height + panelHeight = Math.max( 36, Math.min( maxHeight, newHeight ) ); + + signals.animationPanelResized.dispatch( panelHeight ); + + } + + dom.addEventListener( 'pointerdown', onPointerDown ); + + // Show/hide based on animation panel visibility + signals.animationPanelChanged.add( function ( height ) { + + if ( height === false ) { + + dom.style.display = 'none'; + + } else { + + dom.style.display = 'block'; + dom.style.bottom = height + 'px'; + panelHeight = height; + + } + + } ); + + return new UIElement( dom ); + +} + +export { AnimationResizer }; diff --git a/editor/js/Editor.js b/editor/js/Editor.js index 4185b53616ac68..cfe7dbd01178df 100644 --- a/editor/js/Editor.js +++ b/editor/js/Editor.js @@ -93,8 +93,10 @@ function Editor() { pathTracerUpdated: new Signal(), - morphTargetsUpdated: new Signal() + animationPanelChanged: new Signal(), + animationPanelResized: new Signal(), + morphTargetsUpdated: new Signal() }; diff --git a/editor/js/Resizer.js b/editor/js/Resizer.js index 213d24d9be65f7..c595e0062077eb 100644 --- a/editor/js/Resizer.js +++ b/editor/js/Resizer.js @@ -44,6 +44,13 @@ function Resizer( editor ) { document.getElementById( 'player' ).style.right = x + 'px'; document.getElementById( 'script' ).style.right = x + 'px'; document.getElementById( 'viewport' ).style.right = x + 'px'; + document.getElementById( 'animation' ).style.right = x + 'px'; + document.getElementById( 'animation-resizer' ).style.right = x + 'px'; + + // Center toolbar in viewport area + const toolbar = document.getElementById( 'toolbar' ); + const viewportWidth = offsetWidth - x; + toolbar.style.left = ( viewportWidth / 2 ) + 'px'; signals.windowResize.dispatch(); diff --git a/editor/js/Sidebar.Object.Animation.js b/editor/js/Sidebar.Object.Animation.js deleted file mode 100644 index 94253e6661ac5a..00000000000000 --- a/editor/js/Sidebar.Object.Animation.js +++ /dev/null @@ -1,102 +0,0 @@ -import { UIBreak, UIButton, UIDiv, UIText, UINumber, UIRow } from './libs/ui.js'; - -function SidebarObjectAnimation( editor ) { - - const strings = editor.strings; - const signals = editor.signals; - const mixer = editor.mixer; - - function getButtonText( action ) { - - return action.isRunning() - ? strings.getKey( 'sidebar/animations/stop' ) - : strings.getKey( 'sidebar/animations/play' ); - - } - - function Animation( animation, object ) { - - const action = mixer.clipAction( animation, object ); - - const container = new UIRow(); - - const name = new UIText( animation.name ).setWidth( '200px' ); - container.add( name ); - - const button = new UIButton( getButtonText( action ) ); - button.onClick( function () { - - action.isRunning() ? action.stop() : action.play(); - button.setTextContent( getButtonText( action ) ); - - } ); - - container.add( button ); - - return container; - - } - - signals.objectSelected.add( function ( object ) { - - if ( object !== null && object.animations.length > 0 ) { - - animationsList.clear(); - - const animations = object.animations; - - for ( const animation of animations ) { - - animationsList.add( new Animation( animation, object ) ); - - } - - container.setDisplay( '' ); - - } else { - - container.setDisplay( 'none' ); - - } - - } ); - - signals.objectRemoved.add( function ( object ) { - - if ( object !== null && object.animations.length > 0 ) { - - mixer.uncacheRoot( object ); - - } - - } ); - - const container = new UIDiv(); - container.setMarginTop( '20px' ); - container.setDisplay( 'none' ); - - container.add( new UIText( strings.getKey( 'sidebar/animations' ) ).setTextTransform( 'uppercase' ) ); - container.add( new UIBreak() ); - container.add( new UIBreak() ); - - const animationsList = new UIDiv(); - container.add( animationsList ); - - const mixerTimeScaleRow = new UIRow(); - const mixerTimeScaleNumber = new UINumber( 1 ).setWidth( '60px' ).setRange( - 10, 10 ); - mixerTimeScaleNumber.onChange( function () { - - mixer.timeScale = mixerTimeScaleNumber.getValue(); - - } ); - - mixerTimeScaleRow.add( new UIText( strings.getKey( 'sidebar/animations/timescale' ) ).setClass( 'Label' ) ); - mixerTimeScaleRow.add( mixerTimeScaleNumber ); - - container.add( mixerTimeScaleRow ); - - return container; - -} - -export { SidebarObjectAnimation }; diff --git a/editor/js/Sidebar.Object.js b/editor/js/Sidebar.Object.js index 2edd0cca6fda01..de9fa1daa3662b 100644 --- a/editor/js/Sidebar.Object.js +++ b/editor/js/Sidebar.Object.js @@ -11,8 +11,6 @@ import { SetScaleCommand } from './commands/SetScaleCommand.js'; import { SetColorCommand } from './commands/SetColorCommand.js'; import { SetShadowValueCommand } from './commands/SetShadowValueCommand.js'; -import { SidebarObjectAnimation } from './Sidebar.Object.Animation.js'; - function SidebarObject( editor ) { const strings = editor.strings; @@ -427,10 +425,6 @@ function SidebarObject( editor ) { } ); container.add( exportJson ); - // Animations - - container.add( new SidebarObjectAnimation( editor ) ); - // function update() { diff --git a/examples/jsm/helpers/AnimationPathHelper.js b/examples/jsm/helpers/AnimationPathHelper.js new file mode 100644 index 00000000000000..e169f63444e255 --- /dev/null +++ b/examples/jsm/helpers/AnimationPathHelper.js @@ -0,0 +1,302 @@ +import { + BufferGeometry, + Float32BufferAttribute, + Line, + LineBasicMaterial, + Object3D, + Points, + PointsMaterial +} from 'three'; + +/** + * Visualizes the motion path of an animated object based on position keyframes + * from an AnimationClip. + * + * ```js + * const clip = model.animations[ 0 ]; + * const helper = new AnimationPathHelper( model, clip, object ); + * scene.add( helper ); + * ``` + * + * @augments Object3D + * @three_import import { AnimationPathHelper } from 'three/addons/helpers/AnimationPathHelper.js'; + */ +class AnimationPathHelper extends Object3D { + + /** + * Constructs a new animation path helper. + * + * @param {Object3D} root - The root object containing the animation clips. + * @param {AnimationClip} clip - The animation clip containing position keyframes. + * @param {Object3D} object - The specific object to show the path for. + * @param {Object} [options={}] - Configuration options. + * @param {number|Color|string} [options.color=0x00ff00] - The path line color. + * @param {number|Color|string} [options.markerColor=0xff0000] - The keyframe marker color. + * @param {number} [options.divisions=100] - Number of samples for smooth path interpolation. + * @param {boolean} [options.showMarkers=true] - Whether to show markers at keyframe positions. + * @param {number} [options.markerSize=5] - Size of keyframe markers in pixels. + */ + constructor( root, clip, object, options = {} ) { + + super(); + + const { + color = 0x00ff00, + markerColor = 0xff0000, + divisions = 100, + showMarkers = true, + markerSize = 5 + } = options; + + /** + * This flag can be used for type testing. + * + * @type {boolean} + * @readonly + * @default true + */ + this.isAnimationPathHelper = true; + + this.type = 'AnimationPathHelper'; + + /** + * The root object containing the animation clips. + * + * @type {Object3D} + */ + this.root = root; + + /** + * The animation clip containing position keyframes. + * + * @type {AnimationClip} + */ + this.clip = clip; + + /** + * The object whose path is being visualized. + * + * @type {Object3D} + */ + this.object = object; + + /** + * Number of samples for smooth path interpolation. + * + * @type {number} + * @default 100 + */ + this.divisions = divisions; + + /** + * The position track for the object. + * + * @type {KeyframeTrack|null} + * @private + */ + this._track = this._findTrackForObject( object ); + + if ( this._track === null ) { + + console.warn( 'AnimationPathHelper: No position track found for object', object.name ); + return; + + } + + // Create line for path + const lineGeometry = new BufferGeometry(); + const lineMaterial = new LineBasicMaterial( { + color: color, + toneMapped: false + } ); + + /** + * The line representing the animation path. + * + * @type {Line} + */ + this.line = new Line( lineGeometry, lineMaterial ); + this.add( this.line ); + + // Create points for keyframe markers + if ( showMarkers ) { + + const pointsGeometry = new BufferGeometry(); + const pointsMaterial = new PointsMaterial( { + color: markerColor, + size: markerSize, + sizeAttenuation: false, + toneMapped: false + } ); + + /** + * Points marking keyframe positions. + * + * @type {Points|null} + */ + this.points = new Points( pointsGeometry, pointsMaterial ); + this.add( this.points ); + + } else { + + this.points = null; + + } + + // Sync matrix with object's parent + this.matrixAutoUpdate = false; + + this._updateGeometry(); + + } + + /** + * Finds the position track for the given object. + * + * @private + * @param {Object3D} object - The object to find the track for. + * @returns {KeyframeTrack|null} The position track, or null if not found. + */ + _findTrackForObject( object ) { + + const targetName = object.uuid + '.position'; + + for ( const track of this.clip.tracks ) { + + if ( track.name === targetName && track.getValueSize() === 3 ) { + + return track; + + } + + } + + return null; + + } + + /** + * Samples the track at regular intervals. + * + * @private + * @returns {Float32Array} Array of sampled positions. + */ + _sampleTrack() { + + const track = this._track; + const interpolant = track.createInterpolant(); + const duration = this.clip.duration; + const positions = []; + + for ( let i = 0; i <= this.divisions; i ++ ) { + + const t = ( i / this.divisions ) * duration; + const result = interpolant.evaluate( t ); + positions.push( result[ 0 ], result[ 1 ], result[ 2 ] ); + + } + + return new Float32Array( positions ); + + } + + /** + * Updates the geometry with sampled path data. + * + * @private + */ + _updateGeometry() { + + if ( this._track === null ) return; + + // Update line geometry + const sampledPositions = this._sampleTrack(); + this.line.geometry.setAttribute( 'position', new Float32BufferAttribute( sampledPositions, 3 ) ); + this.line.geometry.computeBoundingSphere(); + + // Update keyframe markers + if ( this.points !== null ) { + + this.points.geometry.setAttribute( 'position', new Float32BufferAttribute( new Float32Array( this._track.values ), 3 ) ); + this.points.geometry.computeBoundingSphere(); + + } + + } + + /** + * Updates the helper's transform to match the object's parent. + * + * @param {boolean} force - Force matrix update. + */ + updateMatrixWorld( force ) { + + // Position the helper at the object's parent so the path appears in correct local space + if ( this.object && this.object.parent ) { + + this.object.parent.updateWorldMatrix( true, false ); + this.matrix.copy( this.object.parent.matrixWorld ); + + } else { + + this.matrix.identity(); + + } + + this.matrixWorld.copy( this.matrix ); + + // Update children + for ( let i = 0; i < this.children.length; i ++ ) { + + this.children[ i ].updateMatrixWorld( force ); + + } + + } + + /** + * Sets the path line color. + * + * @param {number|Color|string} color - The new color. + */ + setColor( color ) { + + if ( this.line ) this.line.material.color.set( color ); + + } + + /** + * Sets the keyframe marker color. + * + * @param {number|Color|string} color - The new color. + */ + setMarkerColor( color ) { + + if ( this.points ) this.points.material.color.set( color ); + + } + + /** + * Frees the GPU-related resources allocated by this instance. + */ + dispose() { + + if ( this.line ) { + + this.line.geometry.dispose(); + this.line.material.dispose(); + + } + + if ( this.points ) { + + this.points.geometry.dispose(); + this.points.material.dispose(); + + } + + } + +} + +export { AnimationPathHelper }; From 0ac50924a12170cdf09968c12ce9901319745ff4 Mon Sep 17 00:00:00 2001 From: mrdoob Date: Sun, 8 Feb 2026 21:54:44 -0800 Subject: [PATCH 2/3] SSRNode: Add distance-aware blur for roughness. (#32834) Co-authored-by: Claude Opus 4.5 --- examples/jsm/tsl/display/SSRNode.js | 48 ++++++++++++------ .../screenshots/webgpu_postprocessing_ssr.jpg | Bin 66196 -> 28207 bytes examples/webgpu_postprocessing_ssr.html | 25 ++++++--- 3 files changed, 52 insertions(+), 21 deletions(-) diff --git a/examples/jsm/tsl/display/SSRNode.js b/examples/jsm/tsl/display/SSRNode.js index 52eb39769492e4..4d734f6c3e5c2e 100644 --- a/examples/jsm/tsl/display/SSRNode.js +++ b/examples/jsm/tsl/display/SSRNode.js @@ -262,6 +262,7 @@ class SSRNode extends TempNode { this._copyMaterial = new NodeMaterial(); this._copyMaterial.name = 'SSRNode.Copy'; + /** * The result of the effect is represented as a separate texture node. * @@ -270,24 +271,13 @@ class SSRNode extends TempNode { */ this._textureNode = passTexture( this, this._ssrRenderTarget.texture ); - let blurredTextureNode = null; - - if ( this.roughnessNode !== null ) { - - const mips = this._blurRenderTarget.texture.mipmaps.length - 1; - const lod = float( this.roughnessNode ).mul( mips ).clamp( 0, mips ); - - blurredTextureNode = passTexture( this, this._blurRenderTarget.texture ).level( lod ); - - } - /** * Holds the blurred SSR reflections. * * @private - * @type {?PassTextureNode} + * @type {?Node} */ - this._blurredTextureNode = blurredTextureNode; + this._blurredTextureNode = null; } @@ -585,9 +575,10 @@ class SSRNode extends TempNode { const fresnelCoe = div( dot( viewIncidentDir, viewReflectDir ).add( 1 ), 2 ); op.mulAssign( fresnelCoe ); - // output + // output: RGB = color * opacity (premultiplied), A = normalized distance const reflectColor = this.colorNode.sample( uvNode ); - output.assign( vec4( reflectColor.rgb, op ) ); + const normalizedDistance = distance.div( this.maxDistance ).clamp( 0, 1 ); + output.assign( vec4( reflectColor.rgb.mul( op ), normalizedDistance ) ); Break(); } ); @@ -616,6 +607,33 @@ class SSRNode extends TempNode { this._copyMaterial.fragmentNode = reflectionBuffer; this._copyMaterial.needsUpdate = true; + // distance-aware blur sampling + + if ( this.roughnessNode !== null ) { + + const blurBuffer = texture( this._blurRenderTarget.texture ); + const mips = this._blurRenderTarget.texture.mipmaps.length - 1; + + // sample distance from unblurred SSR alpha and use roughness² * distance for LOD + // roughness² matches GGX microfacet distribution behavior + const distanceAwareSample = Fn( () => { + + // get distance from the unblurred SSR texture's alpha channel + const reflectionDistance = reflectionBuffer.sample( uvNode ).a; + const r = float( this.roughnessNode ); + // squared roughness for more physically accurate falloff (GGX-like) + const lod = r.mul( r ).mul( reflectionDistance ).mul( mips ).clamp( 0, mips ); + const blurred = blurBuffer.sample( uvNode ).level( lod ); + + // output: RGB is premultiplied color, keep alpha as distance for potential further use + return blurred; + + } ); + + this._blurredTextureNode = distanceAwareSample(); + + } + // return this.getTextureNode(); diff --git a/examples/screenshots/webgpu_postprocessing_ssr.jpg b/examples/screenshots/webgpu_postprocessing_ssr.jpg index dfd678485085912b07f7ac6d0ac4f60602471e3e..14688a8c3f02725bcb6913bf7feb156d04ea7fe6 100644 GIT binary patch literal 28207 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 z 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 z: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 z z955a6*)+-kcf=(U>{v7hUS*KkvjgY@fI*lrw@AxG3P@3wNk-+SnQ2W`HpWmElauZ` zelaq%a~Q~+tVXu3BK2Ew48V4S^(95Z+wX?tu`EnvpGtFC#iCHzLOUtae&;E@!+vS;QLtV zEs46O)qj#WA=)d~KL0*!Nh#fvDiNZ>5c-rnLf=PybVQ6)Uhn9Up+C1LNFWs7QHMOq zP`L_@doFncaEv0~eNE*SlMwtodebS{g>wUdDPxcz%<*0^$`PJKeIi;^dM)&SuH4O= zWeG|i<#5qL-A(t#HIA#D4ek^pckkl6YC^bky165p`T<_$t-ZzdmPhCu;ma zNe+(gYjXZE%VFg2zt1b2K$Nx_P|LV*bD8DYo5$6^7&`_`|Mn`x2xyvhU+g>LJ^d)H z3SB*>9oq>52SacUJa?NPklyDnb}u^ub0y^$KBzI zx9K^aX_p0-LFlwq;FAmdYOCfZXO2vHT(L4Jiw>W6I43eta(*I|+>m|^*jNvZxCBuq zp=|&9lQpV&Q&o*=s_HoogH1y$ly$jF4VW*;45{~Zn*yrCdc7tS#>9%KJ{363$fp_^ X{?(T!q)Y-w)|F}LJI*-#tLOg!#t{dj diff --git a/examples/webgpu_postprocessing_ssr.html b/examples/webgpu_postprocessing_ssr.html index db1c147ac5e788..6ffdd2588e8cba 100644 --- a/examples/webgpu_postprocessing_ssr.html +++ b/examples/webgpu_postprocessing_ssr.html @@ -40,7 +40,7 @@