Viewport.js 6.2 KB
Newer Older
M
Mr.doob 已提交
1 2 3 4 5 6 7
var Viewport = function ( signals ) {

	var container = new UI.Panel( 'absolute' );
	container.setBackgroundColor( '#aaa' );

	//

8 9
	var objects = [];

M
Mr.doob 已提交
10 11
	var sceneHelpers = new THREE.Scene();

M
Mr.doob 已提交
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
	var size = 500, step = 25;
	var geometry = new THREE.Geometry();
	var material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors } );
	var color1 = new THREE.Color( 0x444444 ), color2 = new THREE.Color( 0x888888 );

	for ( var i = - size; i <= size; i += step ) {

		geometry.vertices.push( new THREE.Vector3( -size, 0, i ) );
		geometry.vertices.push( new THREE.Vector3(  size, 0, i ) );

		geometry.vertices.push( new THREE.Vector3( i, 0, -size ) );
		geometry.vertices.push( new THREE.Vector3( i, 0,  size ) );

		var color = i === 0 ? color1 : color2;

		geometry.colors.push( color, color, color, color );

	}

	var grid = new THREE.Line( geometry, material, THREE.LinePieces );
	sceneHelpers.add( grid );

34
	var selectionBox = new THREE.Mesh( new THREE.CubeGeometry( 1, 1, 1 ), new THREE.MeshBasicMaterial( { color: 0xffff00, wireframe: true } ) );
35
	selectionBox.geometry.dynamic = true;
M
Mr.doob 已提交
36
	selectionBox.matrixAutoUpdate = false;
37 38 39
	selectionBox.visible = false;
	sceneHelpers.add( selectionBox );

M
Mr.doob 已提交
40
	//
M
Mr.doob 已提交
41 42 43 44 45 46

	var scene = new THREE.Scene();

	var camera = new THREE.PerspectiveCamera( 50, 1, 1, 5000 );
	camera.position.set( 500, 250, 500 );
	camera.lookAt( scene.position );
47
	scene.add( camera );
M
Mr.doob 已提交
48 49 50 51 52 53 54 55 56 57

	var controls = new THREE.TrackballControls( camera, container.dom );
	controls.rotateSpeed = 1.0;
	controls.zoomSpeed = 1.2;
	controls.panSpeed = 0.8;
	controls.noZoom = false;
	controls.noPan = false;
	controls.staticMoving = true;
	controls.dynamicDampingFactor = 0.3;
	controls.addEventListener( 'change', render );
M
Mr.doob 已提交
58

59
	/*
M
Mr.doob 已提交
60 61
	var controls = new THREE.OrbitControls( camera, container.dom );
	controls.addEventListener( 'change', render );
62
	*/
M
Mr.doob 已提交
63

M
Mr.doob 已提交
64 65 66 67 68 69 70 71 72
	var light = new THREE.DirectionalLight( 0xffffff );
	light.position.set( 1, 0.5, 0 ).normalize();
	scene.add( light );

	var light = new THREE.DirectionalLight( 0xffffff, 0.5 );
	light.position.set( - 1, - 0.5, 0 ).normalize();
	scene.add( light );


73 74 75 76 77 78 79 80
	// object picking

	var projector = new THREE.Projector();

	container.dom.addEventListener( 'mousedown', function ( event ) {

		event.preventDefault();

81 82 83 84 85
		var vector = new THREE.Vector3(
			( ( event.clientX - container.dom.offsetLeft ) / container.dom.offsetWidth ) * 2 - 1,
			- ( ( event.clientY - container.dom.offsetTop ) / container.dom.offsetHeight ) * 2 + 1,
			0.5
		);
86 87 88
		projector.unprojectVector( vector, camera );

		var ray = new THREE.Ray( camera.position, vector.subSelf( camera.position ).normalize() );
89
		var intersects = ray.intersectObjects( objects, true );
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108

		if ( intersects.length ) {

			signals.objectSelected.dispatch( intersects[ 0 ].object );

			// controls.enabled = false;

		} else {

			signals.objectSelected.dispatch( null );

		}

	}, false );

	// events

	signals.objectAdded.add( function ( object ) {

109 110 111 112 113 114 115 116
		THREE.SceneUtils.traverseHierarchy( object, function ( child ) {

			objects.push( child );

		} );

		objects.push( object );

117 118 119
		scene.add( object );
		render();

120 121
		signals.sceneChanged.dispatch( scene );

122 123
	} );

M
Mr.doob 已提交
124 125 126 127 128 129
	signals.objectChanged.add( function ( object ) {

		render();

	} );

130
	var selected = null;
131

132
	signals.objectSelected.add( function ( object ) {
133

134
		selectionBox.visible = false;
135

136
		if ( object !== null && object.geometry ) {
137 138 139 140 141 142 143 144 145

			var geometry = object.geometry;

			if ( geometry.boundingBox === null ) {

				geometry.computeBoundingBox();

			}

146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
			selectionBox.geometry.vertices[ 0 ].x = geometry.boundingBox.max.x;
			selectionBox.geometry.vertices[ 0 ].y = geometry.boundingBox.max.y;
			selectionBox.geometry.vertices[ 0 ].z = geometry.boundingBox.max.z;

			selectionBox.geometry.vertices[ 1 ].x = geometry.boundingBox.max.x;
			selectionBox.geometry.vertices[ 1 ].y = geometry.boundingBox.max.y;
			selectionBox.geometry.vertices[ 1 ].z = geometry.boundingBox.min.z;

			selectionBox.geometry.vertices[ 2 ].x = geometry.boundingBox.max.x;
			selectionBox.geometry.vertices[ 2 ].y = geometry.boundingBox.min.y;
			selectionBox.geometry.vertices[ 2 ].z = geometry.boundingBox.max.z;

			selectionBox.geometry.vertices[ 3 ].x = geometry.boundingBox.max.x;
			selectionBox.geometry.vertices[ 3 ].y = geometry.boundingBox.min.y;
			selectionBox.geometry.vertices[ 3 ].z = geometry.boundingBox.min.z;

			selectionBox.geometry.vertices[ 4 ].x = geometry.boundingBox.min.x;
			selectionBox.geometry.vertices[ 4 ].y = geometry.boundingBox.max.y;
			selectionBox.geometry.vertices[ 4 ].z = geometry.boundingBox.min.z;

			selectionBox.geometry.vertices[ 5 ].x = geometry.boundingBox.min.x;
			selectionBox.geometry.vertices[ 5 ].y = geometry.boundingBox.max.y;
			selectionBox.geometry.vertices[ 5 ].z = geometry.boundingBox.max.z;

			selectionBox.geometry.vertices[ 6 ].x = geometry.boundingBox.min.x;
			selectionBox.geometry.vertices[ 6 ].y = geometry.boundingBox.min.y;
			selectionBox.geometry.vertices[ 6 ].z = geometry.boundingBox.min.z;

			selectionBox.geometry.vertices[ 7 ].x = geometry.boundingBox.min.x;
			selectionBox.geometry.vertices[ 7 ].y = geometry.boundingBox.min.y;
			selectionBox.geometry.vertices[ 7 ].z = geometry.boundingBox.max.z;

178 179
			selectionBox.geometry.computeBoundingSphere();

180 181
			selectionBox.geometry.verticesNeedUpdate = true;

M
Mr.doob 已提交
182
			selectionBox.matrixWorld = object.matrixWorld;
183 184 185 186 187 188 189 190 191

			selectionBox.visible = true;

		}

		render();

	} );

M
Mr.doob 已提交
192 193 194 195 196 197
	signals.materialChanged.add( function ( material ) {

		render();

	} );

198 199 200 201 202 203 204 205 206 207 208 209 210
	signals.windowResize.add( function () {

		camera.aspect = container.dom.offsetWidth / container.dom.offsetHeight;
		camera.updateProjectionMatrix();

		renderer.setSize( container.dom.offsetWidth, container.dom.offsetHeight );

		render();

	} );

	//

211
	var renderer = new THREE.WebGLRenderer( { antialias: true, alpha: false, clearColor: 0xaaaaaa, clearAlpha: 1 } );
M
Mr.doob 已提交
212
	renderer.autoClear = false;
213
	renderer.autoUpdateScene = false;
M
Mr.doob 已提交
214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
	container.dom.appendChild( renderer.domElement );

	animate();

	//

	function animate() {

		requestAnimationFrame( animate );
		controls.update();

	}

	function render() {

M
Mr.doob 已提交
229
		sceneHelpers.updateMatrixWorld();
M
Mr.doob 已提交
230
		scene.updateMatrixWorld();
231

M
Mr.doob 已提交
232
		renderer.clear();
M
Mr.doob 已提交
233
		renderer.render( sceneHelpers, camera );
M
Mr.doob 已提交
234
		renderer.render( scene, camera );
M
Mr.doob 已提交
235 236 237 238 239 240

	}

	return container;

}