Sidebar.Object3D.js 13.0 KB
Newer Older
1 2 3
Sidebar.Object3D = function ( editor ) {

	var signals = editor.signals;
M
Mr.doob 已提交
4 5 6 7

	var container = new UI.Panel();
	container.setDisplay( 'none' );

8
	var objectType = new UI.Text().setTextTransform( 'uppercase' );
M
Mr.doob 已提交
9 10 11
	container.add( objectType );
	container.add( new UI.Break(), new UI.Break() );

12
	// uuid
M
Mr.doob 已提交
13

14 15 16
	var objectUUIDRow = new UI.Panel();
	var objectUUID = new UI.Input().setWidth( '115px' ).setColor( '#444' ).setFontSize( '12px' ).setDisabled( true );
	var objectUUIDRenew = new UI.Button( '' ).setMarginLeft( '7px' ).onClick( function () {
17

18
		objectUUID.setValue( THREE.Math.generateUUID() );
19 20

		editor.selected.uuid = objectUUID.getValue();
21 22

	} );
M
Mr.doob 已提交
23

24
	objectUUIDRow.add( new UI.Text( 'UUID' ).setWidth( '90px' ) );
25 26
	objectUUIDRow.add( objectUUID );
	objectUUIDRow.add( objectUUIDRenew );
M
Mr.doob 已提交
27

28
	container.add( objectUUIDRow );
M
Mr.doob 已提交
29 30 31 32

	// name

	var objectNameRow = new UI.Panel();
33 34 35 36 37
	var objectName = new UI.Input().setWidth( '150px' ).setColor( '#444' ).setFontSize( '12px' ).onChange( function () {

			editor.setObjectName( editor.selected, objectName.getValue() );

	} );
M
Mr.doob 已提交
38

39
	objectNameRow.add( new UI.Text( 'Name' ).setWidth( '90px' ) );
M
Mr.doob 已提交
40 41 42 43
	objectNameRow.add( objectName );

	container.add( objectNameRow );

M
Mr.doob 已提交
44 45 46 47 48
	// parent

	var objectParentRow = new UI.Panel();
	var objectParent = new UI.Select().setWidth( '150px' ).setColor( '#444' ).setFontSize( '12px' ).onChange( update );

49
	objectParentRow.add( new UI.Text( 'Parent' ).setWidth( '90px' ) );
M
Mr.doob 已提交
50 51 52 53
	objectParentRow.add( objectParent );

	container.add( objectParentRow );

M
Mr.doob 已提交
54 55 56 57 58 59 60
	// position

	var objectPositionRow = new UI.Panel();
	var objectPositionX = new UI.Number().setWidth( '50px' ).onChange( update );
	var objectPositionY = new UI.Number().setWidth( '50px' ).onChange( update );
	var objectPositionZ = new UI.Number().setWidth( '50px' ).onChange( update );

61
	objectPositionRow.add( new UI.Text( 'Position' ).setWidth( '90px' ) );
M
Mr.doob 已提交
62 63 64 65 66 67 68 69 70 71 72
	objectPositionRow.add( objectPositionX, objectPositionY, objectPositionZ );

	container.add( objectPositionRow );

	// rotation

	var objectRotationRow = new UI.Panel();
	var objectRotationX = new UI.Number().setWidth( '50px' ).onChange( update );
	var objectRotationY = new UI.Number().setWidth( '50px' ).onChange( update );
	var objectRotationZ = new UI.Number().setWidth( '50px' ).onChange( update );

73
	objectRotationRow.add( new UI.Text( 'Rotation' ).setWidth( '90px' ) );
M
Mr.doob 已提交
74 75 76 77 78 79 80 81 82 83 84 85
	objectRotationRow.add( objectRotationX, objectRotationY, objectRotationZ );

	container.add( objectRotationRow );

	// scale

	var objectScaleRow = new UI.Panel();
	var objectScaleLock = new UI.Checkbox().setPosition( 'absolute' ).setLeft( '75px' );
	var objectScaleX = new UI.Number( 1 ).setWidth( '50px' ).onChange( updateScaleX );
	var objectScaleY = new UI.Number( 1 ).setWidth( '50px' ).onChange( updateScaleY );
	var objectScaleZ = new UI.Number( 1 ).setWidth( '50px' ).onChange( updateScaleZ );

86
	objectScaleRow.add( new UI.Text( 'Scale' ).setWidth( '90px' ) );
M
Mr.doob 已提交
87 88 89 90 91 92 93 94 95 96
	objectScaleRow.add( objectScaleLock );
	objectScaleRow.add( objectScaleX, objectScaleY, objectScaleZ );

	container.add( objectScaleRow );

	// fov

	var objectFovRow = new UI.Panel();
	var objectFov = new UI.Number().onChange( update );

97
	objectFovRow.add( new UI.Text( 'Fov' ).setWidth( '90px' ) );
M
Mr.doob 已提交
98 99 100 101 102 103 104 105 106
	objectFovRow.add( objectFov );

	container.add( objectFovRow );

	// near

	var objectNearRow = new UI.Panel();
	var objectNear = new UI.Number().onChange( update );

107
	objectNearRow.add( new UI.Text( 'Near' ).setWidth( '90px' ) );
M
Mr.doob 已提交
108 109 110 111 112 113 114 115 116
	objectNearRow.add( objectNear );

	container.add( objectNearRow );

	// far

	var objectFarRow = new UI.Panel();
	var objectFar = new UI.Number().onChange( update );

117
	objectFarRow.add( new UI.Text( 'Far' ).setWidth( '90px' ) );
M
Mr.doob 已提交
118 119 120 121 122 123 124 125 126
	objectFarRow.add( objectFar );

	container.add( objectFarRow );

	// intensity

	var objectIntensityRow = new UI.Panel();
	var objectIntensity = new UI.Number().setRange( 0, Infinity ).onChange( update );

127
	objectIntensityRow.add( new UI.Text( 'Intensity' ).setWidth( '90px' ) );
M
Mr.doob 已提交
128 129 130 131 132 133 134 135 136
	objectIntensityRow.add( objectIntensity );

	container.add( objectIntensityRow );

	// color

	var objectColorRow = new UI.Panel();
	var objectColor = new UI.Color().onChange( update );

137
	objectColorRow.add( new UI.Text( 'Color' ).setWidth( '90px' ) );
M
Mr.doob 已提交
138 139 140 141 142 143 144 145 146
	objectColorRow.add( objectColor );

	container.add( objectColorRow );

	// ground color

	var objectGroundColorRow = new UI.Panel();
	var objectGroundColor = new UI.Color().onChange( update );

147
	objectGroundColorRow.add( new UI.Text( 'Ground color' ).setWidth( '90px' ) );
M
Mr.doob 已提交
148 149 150 151 152 153 154 155 156
	objectGroundColorRow.add( objectGroundColor );

	container.add( objectGroundColorRow );

	// distance

	var objectDistanceRow = new UI.Panel();
	var objectDistance = new UI.Number().setRange( 0, Infinity ).onChange( update );

157
	objectDistanceRow.add( new UI.Text( 'Distance' ).setWidth( '90px' ) );
M
Mr.doob 已提交
158 159 160 161 162 163 164 165 166
	objectDistanceRow.add( objectDistance );

	container.add( objectDistanceRow );

	// angle

	var objectAngleRow = new UI.Panel();
	var objectAngle = new UI.Number().setPrecision( 3 ).setRange( 0, Math.PI / 2 ).onChange( update );

167
	objectAngleRow.add( new UI.Text( 'Angle' ).setWidth( '90px' ) );
M
Mr.doob 已提交
168 169 170 171 172 173 174 175 176
	objectAngleRow.add( objectAngle );

	container.add( objectAngleRow );

	// exponent

	var objectExponentRow = new UI.Panel();
	var objectExponent = new UI.Number().setRange( 0, Infinity ).onChange( update );

177
	objectExponentRow.add( new UI.Text( 'Exponent' ).setWidth( '90px' ) );
M
Mr.doob 已提交
178 179 180 181 182 183 184 185 186
	objectExponentRow.add( objectExponent );

	container.add( objectExponentRow );

	// visible

	var objectVisibleRow = new UI.Panel();
	var objectVisible = new UI.Checkbox().onChange( update );

187
	objectVisibleRow.add( new UI.Text( 'Visible' ).setWidth( '90px' ) );
M
Mr.doob 已提交
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212
	objectVisibleRow.add( objectVisible );

	container.add( objectVisibleRow );

	// user data

	var objectUserDataRow = new UI.Panel();
	var objectUserData = new UI.TextArea().setWidth( '150px' ).setHeight( '40px' ).setColor( '#444' ).setFontSize( '12px' ).onChange( update );
	objectUserData.onKeyUp( function () {

		try {

			JSON.parse( objectUserData.getValue() );
			objectUserData.setBorderColor( '#ccc' );
			objectUserData.setBackgroundColor( '' );

		} catch ( error ) {

			objectUserData.setBorderColor( '#f00' );
			objectUserData.setBackgroundColor( 'rgba(255,0,0,0.25)' );

		}

	} );

213
	objectUserDataRow.add( new UI.Text( 'User data' ).setWidth( '90px' ) );
M
Mr.doob 已提交
214 215 216 217 218 219 220 221 222
	objectUserDataRow.add( objectUserData );

	container.add( objectUserDataRow );


	//

	function updateScaleX() {

M
Mr.doob 已提交
223 224
		var object = editor.selected;

M
Mr.doob 已提交
225 226
		if ( objectScaleLock.getValue() === true ) {

M
Mr.doob 已提交
227
			var scale = objectScaleX.getValue() / object.scale.x;
M
Mr.doob 已提交
228 229 230 231 232 233 234 235 236 237 238 239

			objectScaleY.setValue( objectScaleY.getValue() * scale );
			objectScaleZ.setValue( objectScaleZ.getValue() * scale );

		}

		update();

	}

	function updateScaleY() {

M
Mr.doob 已提交
240 241
		var object = editor.selected;

M
Mr.doob 已提交
242 243
		if ( objectScaleLock.getValue() === true ) {

M
Mr.doob 已提交
244
			var scale = objectScaleY.getValue() / object.scale.y;
M
Mr.doob 已提交
245 246 247 248 249 250 251 252 253 254 255 256

			objectScaleX.setValue( objectScaleX.getValue() * scale );
			objectScaleZ.setValue( objectScaleZ.getValue() * scale );

		}

		update();

	}

	function updateScaleZ() {

M
Mr.doob 已提交
257 258
		var object = editor.selected;

M
Mr.doob 已提交
259 260
		if ( objectScaleLock.getValue() === true ) {

M
Mr.doob 已提交
261
			var scale = objectScaleZ.getValue() / object.scale.z;
M
Mr.doob 已提交
262 263 264 265 266 267 268 269 270 271 272 273

			objectScaleX.setValue( objectScaleX.getValue() * scale );
			objectScaleY.setValue( objectScaleY.getValue() * scale );

		}

		update();

	}

	function update() {

M
Mr.doob 已提交
274
		var object = editor.selected;
M
Mr.doob 已提交
275

M
Mr.doob 已提交
276
		if ( object !== null ) {
M
Mr.doob 已提交
277

M
Mr.doob 已提交
278
			if ( object.parent !== undefined ) {
M
Mr.doob 已提交
279

280
				var newParentId = parseInt( objectParent.getValue() );
M
Mr.doob 已提交
281

M
Mr.doob 已提交
282
				if ( object.parent.id !== newParentId && object.id !== newParentId ) {
M
Mr.doob 已提交
283

284
					editor.parent( object, editor.scene.getObjectById( newParentId, true ) );
M
Mr.doob 已提交
285 286 287 288 289

				}

			}

M
Mr.doob 已提交
290 291 292
			object.position.x = objectPositionX.getValue();
			object.position.y = objectPositionY.getValue();
			object.position.z = objectPositionZ.getValue();
M
Mr.doob 已提交
293

M
Mr.doob 已提交
294 295 296
			object.rotation.x = objectRotationX.getValue();
			object.rotation.y = objectRotationY.getValue();
			object.rotation.z = objectRotationZ.getValue();
M
Mr.doob 已提交
297

M
Mr.doob 已提交
298 299 300
			object.scale.x = objectScaleX.getValue();
			object.scale.y = objectScaleY.getValue();
			object.scale.z = objectScaleZ.getValue();
M
Mr.doob 已提交
301

M
Mr.doob 已提交
302
			if ( object.fov !== undefined ) {
M
Mr.doob 已提交
303

M
Mr.doob 已提交
304 305
				object.fov = objectFov.getValue();
				object.updateProjectionMatrix();
M
Mr.doob 已提交
306 307 308

			}

M
Mr.doob 已提交
309
			if ( object.near !== undefined ) {
M
Mr.doob 已提交
310

M
Mr.doob 已提交
311
				object.near = objectNear.getValue();
M
Mr.doob 已提交
312 313 314

			}

M
Mr.doob 已提交
315
			if ( object.far !== undefined ) {
M
Mr.doob 已提交
316

M
Mr.doob 已提交
317
				object.far = objectFar.getValue();
M
Mr.doob 已提交
318 319 320

			}

M
Mr.doob 已提交
321
			if ( object.intensity !== undefined ) {
M
Mr.doob 已提交
322

M
Mr.doob 已提交
323
				object.intensity = objectIntensity.getValue();
M
Mr.doob 已提交
324 325 326

			}

M
Mr.doob 已提交
327
			if ( object.color !== undefined ) {
M
Mr.doob 已提交
328

M
Mr.doob 已提交
329
				object.color.setHex( objectColor.getHexValue() );
M
Mr.doob 已提交
330 331 332

			}

M
Mr.doob 已提交
333
			if ( object.groundColor !== undefined ) {
M
Mr.doob 已提交
334

M
Mr.doob 已提交
335
				object.groundColor.setHex( objectGroundColor.getHexValue() );
M
Mr.doob 已提交
336 337 338

			}

M
Mr.doob 已提交
339
			if ( object.distance !== undefined ) {
M
Mr.doob 已提交
340

M
Mr.doob 已提交
341
				object.distance = objectDistance.getValue();
M
Mr.doob 已提交
342 343 344

			}

M
Mr.doob 已提交
345
			if ( object.angle !== undefined ) {
M
Mr.doob 已提交
346

M
Mr.doob 已提交
347
				object.angle = objectAngle.getValue();
M
Mr.doob 已提交
348 349 350

			}

M
Mr.doob 已提交
351
			if ( object.exponent !== undefined ) {
M
Mr.doob 已提交
352

M
Mr.doob 已提交
353
				object.exponent = objectExponent.getValue();
M
Mr.doob 已提交
354 355 356

			}

M
Mr.doob 已提交
357
			object.visible = objectVisible.getValue();
M
Mr.doob 已提交
358 359 360

			try {

M
Mr.doob 已提交
361
				object.userData = JSON.parse( objectUserData.getValue() );
M
Mr.doob 已提交
362

M
Mr.doob 已提交
363
			} catch ( exception ) {
M
Mr.doob 已提交
364

M
Mr.doob 已提交
365
				console.warn( exception );
M
Mr.doob 已提交
366 367 368

			}

M
Mr.doob 已提交
369
			signals.objectChanged.dispatch( object );
M
Mr.doob 已提交
370 371 372 373 374 375 376

		}

	}

	function updateRows() {

M
Mr.doob 已提交
377 378
		var object = editor.selected;

M
Mr.doob 已提交
379 380 381 382 383 384 385 386 387 388 389 390 391 392 393
		var properties = {
			'parent': objectParentRow,
			'fov': objectFovRow,
			'near': objectNearRow,
			'far': objectFarRow,
			'intensity': objectIntensityRow,
			'color': objectColorRow,
			'groundColor': objectGroundColorRow,
			'distance' : objectDistanceRow,
			'angle' : objectAngleRow,
			'exponent' : objectExponentRow
		};

		for ( var property in properties ) {

M
Mr.doob 已提交
394
			properties[ property ].setDisplay( object[ property ] !== undefined ? '' : 'none' );
M
Mr.doob 已提交
395 396 397 398 399 400 401

		}

	}

	function updateTransformRows() {

M
Mr.doob 已提交
402 403 404 405
		var object = editor.selected;

		if ( object instanceof THREE.Light ||
		   ( object instanceof THREE.Object3D && object.userData.targetInverse ) ) {
M
Mr.doob 已提交
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442

			objectRotationRow.setDisplay( 'none' );
			objectScaleRow.setDisplay( 'none' );

		} else {

			objectRotationRow.setDisplay( '' );
			objectScaleRow.setDisplay( '' );

		}

	}

	function getObjectInstanceName( object ) {

		var objects = {

			'Scene': THREE.Scene,
			'PerspectiveCamera': THREE.PerspectiveCamera,
			'AmbientLight': THREE.AmbientLight,
			'DirectionalLight': THREE.DirectionalLight,
			'HemisphereLight': THREE.HemisphereLight,
			'PointLight': THREE.PointLight,
			'SpotLight': THREE.SpotLight,
			'Mesh': THREE.Mesh,
			'Object3D': THREE.Object3D

		};

		for ( var key in objects ) {

			if ( object instanceof objects[ key ] ) return key;

		}

	}

443 444 445 446 447 448 449 450 451
	// events

	signals.objectSelected.add( function ( object ) {

		updateUI();

	} );

	signals.sceneGraphChanged.add( function () {
M
Mr.doob 已提交
452

453
		var scene = editor.scene;
M
Mr.doob 已提交
454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470

		var options = {};

		options[ scene.id ] = 'Scene';

		( function addObjects( objects ) {

			for ( var i = 0, l = objects.length; i < l; i ++ ) {

				var object = objects[ i ];

				options[ object.id ] = object.name;

				addObjects( object.children );

			}

471
		} )( scene.children );
M
Mr.doob 已提交
472 473 474 475

		objectParent.setOptions( options );

	} );
M
Mr.doob 已提交
476

M
Mr.doob 已提交
477 478
	signals.objectChanged.add( function ( object ) {

M
Mr.doob 已提交
479 480 481
		if ( object !== editor.selected ) return;

		updateUI();
M
Mr.doob 已提交
482 483 484 485 486

	} );

	function updateUI() {

M
Mr.doob 已提交
487
		container.setDisplay( 'none' );
M
Mr.doob 已提交
488

M
Mr.doob 已提交
489
		var object = editor.selected;
M
Mr.doob 已提交
490

M
Mr.doob 已提交
491
		if ( object !== null ) {
M
Mr.doob 已提交
492

M
Mr.doob 已提交
493
			container.setDisplay( 'block' );
M
Mr.doob 已提交
494

M
Mr.doob 已提交
495
			objectType.setValue( getObjectInstanceName( object ) );
M
Mr.doob 已提交
496

M
Mr.doob 已提交
497 498
			objectUUID.setValue( object.uuid );
			objectName.setValue( object.name );
M
Mr.doob 已提交
499

M
Mr.doob 已提交
500 501 502
			if ( object.parent !== undefined ) {

				objectParent.setValue( object.parent.id );
M
Mr.doob 已提交
503

M
Mr.doob 已提交
504
			}
M
Mr.doob 已提交
505

M
Mr.doob 已提交
506 507 508
			objectPositionX.setValue( object.position.x );
			objectPositionY.setValue( object.position.y );
			objectPositionZ.setValue( object.position.z );
M
Mr.doob 已提交
509

M
Mr.doob 已提交
510 511 512
			objectRotationX.setValue( object.rotation.x );
			objectRotationY.setValue( object.rotation.y );
			objectRotationZ.setValue( object.rotation.z );
M
Mr.doob 已提交
513

M
Mr.doob 已提交
514 515 516
			objectScaleX.setValue( object.scale.x );
			objectScaleY.setValue( object.scale.y );
			objectScaleZ.setValue( object.scale.z );
M
Mr.doob 已提交
517

M
Mr.doob 已提交
518
			if ( object.fov !== undefined ) {
M
Mr.doob 已提交
519

M
Mr.doob 已提交
520
				objectFov.setValue( object.fov );
M
Mr.doob 已提交
521

M
Mr.doob 已提交
522
			}
M
Mr.doob 已提交
523

M
Mr.doob 已提交
524
			if ( object.near !== undefined ) {
M
Mr.doob 已提交
525

M
Mr.doob 已提交
526
				objectNear.setValue( object.near );
M
Mr.doob 已提交
527

M
Mr.doob 已提交
528
			}
M
Mr.doob 已提交
529

M
Mr.doob 已提交
530
			if ( object.far !== undefined ) {
M
Mr.doob 已提交
531

M
Mr.doob 已提交
532
				objectFar.setValue( object.far );
M
Mr.doob 已提交
533

M
Mr.doob 已提交
534
			}
M
Mr.doob 已提交
535

M
Mr.doob 已提交
536
			if ( object.intensity !== undefined ) {
M
Mr.doob 已提交
537

M
Mr.doob 已提交
538
				objectIntensity.setValue( object.intensity );
M
Mr.doob 已提交
539

M
Mr.doob 已提交
540
			}
M
Mr.doob 已提交
541

M
Mr.doob 已提交
542
			if ( object.color !== undefined ) {
M
Mr.doob 已提交
543

544
				objectColor.setHexValue( object.color.getHexString() );
M
Mr.doob 已提交
545

M
Mr.doob 已提交
546
			}
M
Mr.doob 已提交
547

M
Mr.doob 已提交
548
			if ( object.groundColor !== undefined ) {
M
Mr.doob 已提交
549

550
				objectGroundColor.setHexValue( object.groundColor.getHexString() );
M
Mr.doob 已提交
551

M
Mr.doob 已提交
552
			}
M
Mr.doob 已提交
553

M
Mr.doob 已提交
554
			if ( object.distance !== undefined ) {
M
Mr.doob 已提交
555

M
Mr.doob 已提交
556
				objectDistance.setValue( object.distance );
M
Mr.doob 已提交
557

M
Mr.doob 已提交
558
			}
M
Mr.doob 已提交
559

M
Mr.doob 已提交
560
			if ( object.angle !== undefined ) {
M
Mr.doob 已提交
561

M
Mr.doob 已提交
562
				objectAngle.setValue( object.angle );
M
Mr.doob 已提交
563

M
Mr.doob 已提交
564
			}
M
Mr.doob 已提交
565

M
Mr.doob 已提交
566
			if ( object.exponent !== undefined ) {
M
Mr.doob 已提交
567

M
Mr.doob 已提交
568
				objectExponent.setValue( object.exponent );
M
Mr.doob 已提交
569

M
Mr.doob 已提交
570
			}
M
Mr.doob 已提交
571

M
Mr.doob 已提交
572
			objectVisible.setValue( object.visible );
M
Mr.doob 已提交
573

M
Mr.doob 已提交
574
			try {
M
Mr.doob 已提交
575

M
Mr.doob 已提交
576
				objectUserData.setValue( JSON.stringify( object.userData, null, '  ' ) );
M
Mr.doob 已提交
577

M
Mr.doob 已提交
578
			} catch ( error ) {
M
Mr.doob 已提交
579

M
Mr.doob 已提交
580
				console.log( error );
M
Mr.doob 已提交
581

M
Mr.doob 已提交
582 583 584 585 586 587 588
			}

			objectUserData.setBorderColor( '#ccc' );
			objectUserData.setBackgroundColor( '' );

			updateRows();
			updateTransformRows();
M
Mr.doob 已提交
589

M
Mr.doob 已提交
590
		}
M
Mr.doob 已提交
591 592 593 594 595 596

	}

	return container;

}