Sidebar.Properties.Object3D.js 8.4 KB
Newer Older
M
Mr.doob 已提交
1 2
Sidebar.Properties.Object3D = function ( signals ) {

3 4 5 6 7 8 9 10 11 12
	var objects = {

		'PerspectiveCamera': THREE.PerspectiveCamera,
		'PointLight': THREE.PointLight,
		'DirectionalLight': THREE.DirectionalLight,
		'Mesh': THREE.Mesh,
		'Object3D': THREE.Object3D

	};

M
Mr.doob 已提交
13
	var container = new UI.Panel();
14
	container.setBorderTop( '1px solid #ccc' );
M
Mr.doob 已提交
15
	container.setDisplay( 'none' );
16
	container.setPadding( '10px' );
M
Mr.doob 已提交
17

18 19
	var objectType = new UI.Text().setColor( '#666' );
	container.add( objectType );
M
Mr.doob 已提交
20 21
	container.add( new UI.Break(), new UI.Break() );

22 23 24
	// name

	var objectNameRow = new UI.Panel();
M
Mr.doob 已提交
25
	var objectName = new UI.Input( 'absolute' ).setLeft( '100px' ).setWidth( '150px' ).setColor( '#444' ).setFontSize( '12px' ).onChange( update );
26 27 28 29 30 31 32 33 34

	objectNameRow.add( new UI.Text().setValue( 'Name' ).setColor( '#666' ) );
	objectNameRow.add( objectName );

	container.add( objectNameRow );

	// position

	var objectPositionRow = new UI.Panel();
M
Mr.doob 已提交
35 36 37
	var objectPositionX = new UI.Number( 'absolute' ).setLeft( '100px' ).setWidth( '50px' ).onChange( update );
	var objectPositionY = new UI.Number( 'absolute' ).setLeft( '160px' ).setWidth( '50px' ).onChange( update );
	var objectPositionZ = new UI.Number( 'absolute' ).setLeft( '220px' ).setWidth( '50px' ).onChange( update );
38

M
Mr.doob 已提交
39
	objectPositionRow.add( new UI.Text().setValue( 'Position' ).setColor( '#666' ) );
40 41 42 43 44 45 46
	objectPositionRow.add( objectPositionX, objectPositionY, objectPositionZ );

	container.add( objectPositionRow );

	// rotation

	var objectRotationRow = new UI.Panel();
M
Mr.doob 已提交
47 48 49
	var objectRotationX = new UI.Number( 'absolute' ).setLeft( '100px' ).setWidth( '50px' ).onChange( update );
	var objectRotationY = new UI.Number( 'absolute' ).setLeft( '160px' ).setWidth( '50px' ).onChange( update );
	var objectRotationZ = new UI.Number( 'absolute' ).setLeft( '220px' ).setWidth( '50px' ).onChange( update );
50

M
Mr.doob 已提交
51
	objectRotationRow.add( new UI.Text().setValue( 'Rotation' ).setColor( '#666' ) );
52 53 54 55 56 57 58
	objectRotationRow.add( objectRotationX, objectRotationY, objectRotationZ );

	container.add( objectRotationRow );

	// scale

	var objectScaleRow = new UI.Panel();
A
alteredq 已提交
59 60 61
	var objectScaleX = new UI.Number( 'absolute' ).setValue( 1 ).setLeft( '100px' ).setWidth( '50px' ).onChange( updateScaleX );
	var objectScaleY = new UI.Number( 'absolute' ).setValue( 1 ).setLeft( '160px' ).setWidth( '50px' ).onChange( updateScaleY );
	var objectScaleZ = new UI.Number( 'absolute' ).setValue( 1 ).setLeft( '220px' ).setWidth( '50px' ).onChange( updateScaleZ );
62

M
Mr.doob 已提交
63
	objectScaleRow.add( new UI.Text().setValue( 'Scale' ).setColor( '#666' ) );
64 65 66 67
	objectScaleRow.add( objectScaleX, objectScaleY, objectScaleZ );

	container.add( objectScaleRow );

A
alteredq 已提交
68 69 70
	// uniform scale lock

	var objectScaleLockRow = new UI.Panel();
71
	var objectScaleLock = new UI.Checkbox( 'absolute' ).setLeft( '100px' ).onChange( updateScaleLock );
A
alteredq 已提交
72 73 74 75 76 77

	objectScaleLockRow.add( new UI.Text().setValue( 'Uniform scale' ).setColor( '#666' ) );
	objectScaleLockRow.add( objectScaleLock );

	container.add( objectScaleLockRow );

78 79 80
	// visible

	var objectVisibleRow = new UI.Panel();
M
Mr.doob 已提交
81
	var objectVisible = new UI.Checkbox( 'absolute' ).setLeft( '100px' ).onChange( update );
82

M
Mr.doob 已提交
83
	objectVisibleRow.add( new UI.Text().setValue( 'Visible' ).setColor( '#666' ) );
84 85 86 87
	objectVisibleRow.add( objectVisible );

	container.add( objectVisibleRow );

88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
	// fov

	var objectFovRow = new UI.Panel();
	var objectFov = new UI.Number( 'absolute' ).setLeft( '100px' ).onChange( update );

	objectFovRow.add( new UI.Text().setValue( 'Fov' ).setColor( '#666' ) );
	objectFovRow.add( objectFov );

	container.add( objectFovRow );

	// near

	var objectNearRow = new UI.Panel();
	var objectNear = new UI.Number( 'absolute' ).setLeft( '100px' ).onChange( update );

	objectNearRow.add( new UI.Text().setValue( 'Near' ).setColor( '#666' ) );
	objectNearRow.add( objectNear );

	container.add( objectNearRow );

	// far

	var objectFarRow = new UI.Panel();
	var objectFar = new UI.Number( 'absolute' ).setLeft( '100px' ).onChange( update );

	objectFarRow.add( new UI.Text().setValue( 'Far' ).setColor( '#666' ) );
	objectFarRow.add( objectFar );

	container.add( objectFarRow );


M
Mr.doob 已提交
119 120
	//

M
Mr.doob 已提交
121 122
	var selected = null;

A
alteredq 已提交
123 124
	var uniformScale = 1;

125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
	var scaleRatioX = 1;
	var scaleRatioY = 1;
	var scaleRatioZ = 1;

	var scaleLock = false;

	function updateScaleLock() {

		scaleLock = objectScaleLock.getValue();

		if ( scaleLock ) {

			scaleRatioX = objectScaleX.getValue() / uniformScale;
			scaleRatioY = objectScaleY.getValue() / uniformScale;
			scaleRatioZ = objectScaleZ.getValue() / uniformScale;

		}

	}

A
alteredq 已提交
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
	function updateScaleX() {

		uniformScale = objectScaleX.getValue();
		update();

	}

	function updateScaleY() {

		uniformScale = objectScaleY.getValue();
		update();

	}

	function updateScaleZ() {

		uniformScale = objectScaleZ.getValue();
		update();

	}

M
Mr.doob 已提交
166 167 168 169
	function update() {

		if ( selected ) {

M
Mr.doob 已提交
170 171
			selected.name = objectName.getValue();

172 173 174
			selected.position.x = objectPositionX.getValue();
			selected.position.y = objectPositionY.getValue();
			selected.position.z = objectPositionZ.getValue();
M
Mr.doob 已提交
175

176 177 178
			selected.rotation.x = objectRotationX.getValue();
			selected.rotation.y = objectRotationY.getValue();
			selected.rotation.z = objectRotationZ.getValue();
M
Mr.doob 已提交
179

180
			if ( scaleLock ) {
A
alteredq 已提交
181

182 183 184
				objectScaleX.setValue( uniformScale * scaleRatioX );
				objectScaleY.setValue( uniformScale * scaleRatioY );
				objectScaleZ.setValue( uniformScale * scaleRatioZ );
A
alteredq 已提交
185 186 187

			}

188 189 190 191 192
			selected.scale.x = objectScaleX.getValue();
			selected.scale.y = objectScaleY.getValue();
			selected.scale.z = objectScaleZ.getValue();

			selected.visible = objectVisible.getValue();
M
Mr.doob 已提交
193

194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211
			if ( selected.fov !== undefined ) {

				selected.fov = objectFov.getValue();

			}

			if ( selected.near !== undefined ) {

				selected.near = objectNear.getValue();

			}

			if ( selected.far !== undefined ) {

				selected.far = objectFar.getValue();

			}

M
Mr.doob 已提交
212 213 214 215 216 217
			signals.objectChanged.dispatch( selected );

		}

	}

218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
	function updateRows() {

		var properties = {
			'fov': objectFovRow,
			'near': objectNearRow,
			'far': objectFarRow
		};

		for ( var property in properties ) {

			properties[ property ].setDisplay( selected[ property ] !== undefined ? '' : 'none' );

		}

	}

234 235 236 237 238 239 240 241 242 243
	function getObjectInstanceName( object ) {

		for ( var key in objects ) {

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

		}

	}

244 245
	// events

M
Mr.doob 已提交
246 247 248 249 250 251 252 253
	signals.objectSelected.add( function ( object ) {

		selected = object;

		if ( object ) {

			container.setDisplay( 'block' );

254 255
			objectType.setValue( getObjectInstanceName( object ).toUpperCase() );

256
			objectName.setValue( object.name );
M
Mr.doob 已提交
257

258 259 260 261 262 263 264
			objectPositionX.setValue( object.position.x );
			objectPositionY.setValue( object.position.y );
			objectPositionZ.setValue( object.position.z );

			objectRotationX.setValue( object.rotation.x );
			objectRotationY.setValue( object.rotation.y );
			objectRotationZ.setValue( object.rotation.z );
M
Mr.doob 已提交
265

266 267 268
			objectScaleX.setValue( object.scale.x );
			objectScaleY.setValue( object.scale.y );
			objectScaleZ.setValue( object.scale.z );
M
Mr.doob 已提交
269

270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287
			if ( object.fov !== undefined ) {

				objectFov.setValue( object.fov );

			}

			if ( object.near !== undefined ) {

				objectNear.setValue( object.near );

			}

			if ( object.far !== undefined ) {

				objectFar.setValue( object.far );

			}

288
			objectVisible.setValue( object.visible );
M
Mr.doob 已提交
289

290 291
			updateRows();

M
Mr.doob 已提交
292 293 294 295 296 297 298 299
		} else {

			container.setDisplay( 'none' );

		}

	} );

M
Mr.doob 已提交
300

301 302 303 304 305 306 307 308 309 310
	signals.cameraChanged.add( function ( camera ) {

		if ( camera && camera === selected ) {

			refreshObjectUI( camera );

		}

	} );

M
Mr.doob 已提交
311 312 313 314
	signals.objectChanged.add( function ( object ) {

		if ( object ) {

315
			refreshObjectUI( object );
M
Mr.doob 已提交
316

317
		}
M
Mr.doob 已提交
318

319
	} );
M
Mr.doob 已提交
320

321
	function refreshObjectUI( object ) {
M
Mr.doob 已提交
322

323
		container.setDisplay( 'block' );
M
Mr.doob 已提交
324

325
		objectType.setValue( getObjectInstanceName( object ).toUpperCase() );
M
Mr.doob 已提交
326

327
		objectName.setValue( object.name );
M
Mr.doob 已提交
328

329 330 331
		objectPositionX.setValue( object.position.x );
		objectPositionY.setValue( object.position.y );
		objectPositionZ.setValue( object.position.z );
M
Mr.doob 已提交
332

333 334 335
		objectRotationX.setValue( object.rotation.x );
		objectRotationY.setValue( object.rotation.y );
		objectRotationZ.setValue( object.rotation.z );
M
Mr.doob 已提交
336

337 338 339
		objectScaleX.setValue( object.scale.x );
		objectScaleY.setValue( object.scale.y );
		objectScaleZ.setValue( object.scale.z );
M
Mr.doob 已提交
340

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

343
			objectFov.setValue( object.fov );
M
Mr.doob 已提交
344

345
		}
M
Mr.doob 已提交
346

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

349
			objectNear.setValue( object.near );
M
Mr.doob 已提交
350

351 352 353 354 355
		}

		if ( object.far !== undefined ) {

			objectFar.setValue( object.far );
M
Mr.doob 已提交
356 357 358

		}

359 360 361
		objectVisible.setValue( object.visible );

	}
M
Mr.doob 已提交
362

M
Mr.doob 已提交
363 364 365
	return container;

}