2 * @author mrdoob / http://mrdoob.com/
5 Sidebar.Scene = function ( editor ) {
7 var signals = editor.signals;
9 var container = new UI.Panel();
10 container.setBorderTop( '0' );
11 container.setPaddingTop( '20px' );
15 function buildOption( object, draggable ) {
17 var option = document.createElement( 'div' );
18 option.draggable = draggable;
19 option.innerHTML = buildHTML( object );
20 option.value = object.id;
26 function getMaterialName( material ) {
28 if ( Array.isArray( material ) ) {
32 for ( var i = 0; i < material.length; i ++ ) {
34 array.push( material[ i ].name );
38 return array.join( ',' );
46 function buildHTML( object ) {
48 var html = '<span class="type ' + object.type + '"></span> ' + object.name;
50 if ( object instanceof THREE.Mesh ) {
52 var geometry = object.geometry;
53 var material = object.material;
55 html += ' <span class="type ' + geometry.type + '"></span> ' + geometry.name;
56 html += ' <span class="type ' + material.type + '"></span> ' + getMaterialName( material );
60 html += getScript( object.uuid );
66 function getScript( uuid ) {
68 if ( editor.scripts[ uuid ] !== undefined ) {
70 return ' <span class="type Script"></span>';
78 var ignoreObjectSelectedSignal = false;
80 var outliner = new UI.Outliner( editor );
81 outliner.setId( 'outliner' );
82 outliner.onChange( function () {
84 ignoreObjectSelectedSignal = true;
86 editor.selectById( parseInt( outliner.getValue() ) );
88 ignoreObjectSelectedSignal = false;
91 outliner.onDblClick( function () {
93 editor.focusById( parseInt( outliner.getValue() ) );
96 container.add( outliner );
97 container.add( new UI.Break() );
101 function onBackgroundChanged() {
103 signals.sceneBackgroundChanged.dispatch( backgroundColor.getHexValue() );
107 var backgroundRow = new UI.Row();
109 var backgroundColor = new UI.Color().setValue( '#aaaaaa' ).onChange( onBackgroundChanged );
111 backgroundRow.add( new UI.Text( 'Background' ).setWidth( '90px' ) );
112 backgroundRow.add( backgroundColor );
114 container.add( backgroundRow );
118 function onFogChanged() {
120 signals.sceneFogChanged.dispatch(
122 fogColor.getHexValue(),
125 fogDensity.getValue()
130 var fogTypeRow = new UI.Row();
131 var fogType = new UI.Select().setOptions( {
135 'FogExp2': 'Exponential'
137 } ).setWidth( '150px' );
138 fogType.onChange( function () {
145 fogTypeRow.add( new UI.Text( 'Fog' ).setWidth( '90px' ) );
146 fogTypeRow.add( fogType );
148 container.add( fogTypeRow );
152 var fogPropertiesRow = new UI.Row();
153 fogPropertiesRow.setDisplay( 'none' );
154 fogPropertiesRow.setMarginLeft( '90px' );
155 container.add( fogPropertiesRow );
157 var fogColor = new UI.Color().setValue( '#aaaaaa' );
158 fogColor.onChange( onFogChanged );
159 fogPropertiesRow.add( fogColor );
163 var fogNear = new UI.Number( 0.1 ).setWidth( '40px' ).setRange( 0, Infinity ).onChange( onFogChanged );
164 fogPropertiesRow.add( fogNear );
168 var fogFar = new UI.Number( 50 ).setWidth( '40px' ).setRange( 0, Infinity ).onChange( onFogChanged );
169 fogPropertiesRow.add( fogFar );
173 var fogDensity = new UI.Number( 0.05 ).setWidth( '40px' ).setRange( 0, 0.1 ).setPrecision( 3 ).onChange( onFogChanged );
174 fogPropertiesRow.add( fogDensity );
178 function refreshUI() {
180 var camera = editor.camera;
181 var scene = editor.scene;
185 options.push( buildOption( camera, false ) );
186 options.push( buildOption( scene, false ) );
188 ( function addObjects( objects, pad ) {
190 for ( var i = 0, l = objects.length; i < l; i ++ ) {
192 var object = objects[ i ];
194 var option = buildOption( object, true );
195 option.style.paddingLeft = ( pad * 10 ) + 'px';
196 options.push( option );
198 addObjects( object.children, pad + 1 );
202 } )( scene.children, 1 );
204 outliner.setOptions( options );
206 if ( editor.selected !== null ) {
208 outliner.setValue( editor.selected.id );
212 if ( scene.background ) {
214 backgroundColor.setHexValue( scene.background.getHex() );
220 fogColor.setHexValue( scene.fog.color.getHex() );
222 if ( scene.fog instanceof THREE.Fog ) {
224 fogType.setValue( "Fog" );
225 fogNear.setValue( scene.fog.near );
226 fogFar.setValue( scene.fog.far );
228 } else if ( scene.fog instanceof THREE.FogExp2 ) {
230 fogType.setValue( "FogExp2" );
231 fogDensity.setValue( scene.fog.density );
237 fogType.setValue( "None" );
245 function refreshFogUI() {
247 var type = fogType.getValue();
249 fogPropertiesRow.setDisplay( type === 'None' ? 'none' : '' );
250 fogNear.setDisplay( type === 'Fog' ? '' : 'none' );
251 fogFar.setDisplay( type === 'Fog' ? '' : 'none' );
252 fogDensity.setDisplay( type === 'FogExp2' ? '' : 'none' );
260 signals.editorCleared.add( refreshUI );
262 signals.sceneGraphChanged.add( refreshUI );
264 signals.objectChanged.add( function ( object ) {
266 var options = outliner.options;
268 for ( var i = 0; i < options.length; i ++ ) {
270 var option = options[ i ];
272 if ( option.value === object.id ) {
274 option.innerHTML = buildHTML( object );
283 signals.objectSelected.add( function ( object ) {
285 if ( ignoreObjectSelectedSignal === true ) return;
287 outliner.setValue( object !== null ? object.id : null );