/** * @author mrdoob / http://mrdoob.com/ */ import { UIPanel, UIBreak, UIRow, UIColor, UISelect, UIText, UINumber } from './libs/ui.js'; import { UIOutliner } from './libs/ui.three.js'; var SidebarScene = function ( editor ) { var signals = editor.signals; var strings = editor.strings; var container = new UIPanel(); container.setBorderTop( '0' ); container.setPaddingTop( '20px' ); // outliner function buildOption( object, draggable ) { var option = document.createElement( 'div' ); option.draggable = draggable; option.innerHTML = buildHTML( object ); option.value = object.id; return option; } function getMaterialName( material ) { if ( Array.isArray( material ) ) { var array = []; for ( var i = 0; i < material.length; i ++ ) { array.push( material[ i ].name ); } return array.join( ',' ); } return material.name; } function escapeHTML( html ) { return html .replace( /&/g, '&' ) .replace( /"/g, '"' ) .replace( /'/g, ''' ) .replace( //g, '>' ); } function buildHTML( object ) { var html = ' ' + escapeHTML( object.name ); if ( object.isMesh ) { var geometry = object.geometry; var material = object.material; html += ' ' + escapeHTML( geometry.name ); html += ' ' + escapeHTML( getMaterialName( material ) ); } html += getScript( object.uuid ); return html; } function getScript( uuid ) { if ( editor.scripts[ uuid ] !== undefined ) { return ' '; } return ''; } var ignoreObjectSelectedSignal = false; var outliner = new UIOutliner( editor ); outliner.setId( 'outliner' ); outliner.onChange( function () { ignoreObjectSelectedSignal = true; editor.selectById( parseInt( outliner.getValue() ) ); ignoreObjectSelectedSignal = false; } ); outliner.onDblClick( function () { editor.focusById( parseInt( outliner.getValue() ) ); } ); container.add( outliner ); container.add( new UIBreak() ); // background function onBackgroundChanged() { signals.sceneBackgroundChanged.dispatch( backgroundColor.getHexValue() ); } var backgroundRow = new UIRow(); var backgroundColor = new UIColor().setValue( '#aaaaaa' ).onChange( onBackgroundChanged ); backgroundRow.add( new UIText( strings.getKey( 'sidebar/scene/background' ) ).setWidth( '90px' ) ); backgroundRow.add( backgroundColor ); container.add( backgroundRow ); // fog function onFogChanged() { signals.sceneFogChanged.dispatch( fogType.getValue(), fogColor.getHexValue(), fogNear.getValue(), fogFar.getValue(), fogDensity.getValue() ); } var fogTypeRow = new UIRow(); var fogType = new UISelect().setOptions( { 'None': 'None', 'Fog': 'Linear', 'FogExp2': 'Exponential' } ).setWidth( '150px' ); fogType.onChange( function () { onFogChanged(); refreshFogUI(); } ); fogTypeRow.add( new UIText( strings.getKey( 'sidebar/scene/fog' ) ).setWidth( '90px' ) ); fogTypeRow.add( fogType ); container.add( fogTypeRow ); // fog color var fogPropertiesRow = new UIRow(); fogPropertiesRow.setDisplay( 'none' ); fogPropertiesRow.setMarginLeft( '90px' ); container.add( fogPropertiesRow ); var fogColor = new UIColor().setValue( '#aaaaaa' ); fogColor.onChange( onFogChanged ); fogPropertiesRow.add( fogColor ); // fog near var fogNear = new UINumber( 0.1 ).setWidth( '40px' ).setRange( 0, Infinity ).onChange( onFogChanged ); fogPropertiesRow.add( fogNear ); // fog far var fogFar = new UINumber( 50 ).setWidth( '40px' ).setRange( 0, Infinity ).onChange( onFogChanged ); fogPropertiesRow.add( fogFar ); // fog density var fogDensity = new UINumber( 0.05 ).setWidth( '40px' ).setRange( 0, 0.1 ).setStep( 0.001 ).setPrecision( 3 ).onChange( onFogChanged ); fogPropertiesRow.add( fogDensity ); // function refreshUI() { var camera = editor.camera; var scene = editor.scene; var options = []; options.push( buildOption( camera, false ) ); options.push( buildOption( scene, false ) ); ( function addObjects( objects, pad ) { for ( var i = 0, l = objects.length; i < l; i ++ ) { var object = objects[ i ]; var option = buildOption( object, true ); option.style.paddingLeft = ( pad * 10 ) + 'px'; options.push( option ); addObjects( object.children, pad + 1 ); } } )( scene.children, 1 ); outliner.setOptions( options ); if ( editor.selected !== null ) { outliner.setValue( editor.selected.id ); } if ( scene.background ) { backgroundColor.setHexValue( scene.background.getHex() ); } if ( scene.fog ) { fogColor.setHexValue( scene.fog.color.getHex() ); if ( scene.fog.isFog ) { fogType.setValue( "Fog" ); fogNear.setValue( scene.fog.near ); fogFar.setValue( scene.fog.far ); } else if ( scene.fog.isFogExp2 ) { fogType.setValue( "FogExp2" ); fogDensity.setValue( scene.fog.density ); } } else { fogType.setValue( "None" ); } refreshFogUI(); } function refreshFogUI() { var type = fogType.getValue(); fogPropertiesRow.setDisplay( type === 'None' ? 'none' : '' ); fogNear.setDisplay( type === 'Fog' ? '' : 'none' ); fogFar.setDisplay( type === 'Fog' ? '' : 'none' ); fogDensity.setDisplay( type === 'FogExp2' ? '' : 'none' ); } refreshUI(); // events signals.editorCleared.add( refreshUI ); signals.sceneGraphChanged.add( refreshUI ); signals.objectChanged.add( function ( object ) { var options = outliner.options; for ( var i = 0; i < options.length; i ++ ) { var option = options[ i ]; if ( option.value === object.id ) { option.innerHTML = buildHTML( object ); return; } } } ); signals.objectSelected.add( function ( object ) { if ( ignoreObjectSelectedSignal === true ) return; outliner.setValue( object !== null ? object.id : null ); } ); return container; }; export { SidebarScene };