Browse Source

CardboardEffect: Simplified using .toNonIndexed()

Mr.doob 9 years ago
parent
commit
868fc7462f
1 changed files with 23 additions and 50 deletions
  1. 23 50
      examples/js/effects/CardboardEffect.js

+ 23 - 50
examples/js/effects/CardboardEffect.js

@@ -21,76 +21,49 @@ THREE.CardboardEffect = function ( renderer ) {
 
 	var distortion = new THREE.Vector2( 0.441, 0.156 );
 
-	var geometry = new THREE.PlaneBufferGeometry( 1, 1, 10, 20 );
+	var geometry = new THREE.PlaneBufferGeometry( 1, 1, 10, 20 ).removeAttribute( 'normal' ).toNonIndexed();
 
-	var indices = geometry.index.array;
 	var positions = geometry.attributes.position.array;
 	var uvs = geometry.attributes.uv.array;
 
-	var vector = new THREE.Vector2();
-
-	function poly( val ) {
-
-		return 1.5 + ( distortion.x + distortion.y * val ) * val;
-
-	}
-
-	for ( var i = 0; i < indices.length; i ++ ) {
+	// duplicate
 
-		vector.x = positions[ i * 3 + 0 ];
-		vector.y = positions[ i * 3 + 1 ];
-
-		var scalar = poly( vector.dot( vector ) );
-
-		positions[ i * 3 + 0 ] = ( vector.x / scalar ) * 1.5 - 0.5;
-		positions[ i * 3 + 1 ] = ( vector.y / scalar ) * 3.0;
-
-		uvs[ i * 2 ] *= 0.5;
-
-	}
-
-	// clone geometry
-
-	function copyArray( array1, array2, offset ) {
-
-		for ( var i = 0, l = array2.length; i < l; i ++ ) {
+	var positions2 = new Float32Array( positions.length * 2 );
+	positions2.set( positions );
+	positions2.set( positions, positions.length );
 
-			array1[ i + offset ] = array2[ i ];
+	var uvs2 = new Float32Array( uvs.length * 2 );
+	uvs2.set( uvs );
+	uvs2.set( uvs, uvs.length );
 
-		}
+	var vector = new THREE.Vector2();
+	var length = positions.length / 3;
 
-	}
+	for ( var i = 0, l = positions2.length / 3; i < l; i ++ ) {
 
-	var indices2 = new Uint16Array( indices.length * 2 );
-	var positions2 = new Float32Array( positions.length * 2 );
-	var uvs2 = new Float32Array( uvs.length * 2 );
+		vector.x = positions2[ i * 3 + 0 ];
+		vector.y = positions2[ i * 3 + 1 ];
 
-	copyArray( indices2, indices, 0 );
-	copyArray( positions2, positions, 0 );
-	copyArray( uvs2, uvs, 0 );
+		var dot = vector.dot( vector );
+		var scalar = 1.5 + ( distortion.x + distortion.y * dot ) * dot;
 
-	var offset = positions.length / 3;
+		var offset = i < length ? 0 : 1;
 
-	for ( i = 0; i < indices.length; i ++ ) {
+		positions2[ i * 3 + 0 ] = ( vector.x / scalar ) * 1.5 - 0.5 + offset;
+		positions2[ i * 3 + 1 ] = ( vector.y / scalar ) * 3.0;
 
-		indices[ i ] += offset;
-		positions[ i * 3 ] += 1.0;
-		uvs[ i * 2 ] += 0.5;
+		uvs2[ i * 2 ] = ( uvs2[ i * 2 ] + offset ) * 0.5;
 
 	}
 
-	copyArray( indices2, indices, indices.length );
-	copyArray( positions2, positions, positions.length );
-	copyArray( uvs2, uvs, uvs.length );
+	geometry.attributes.position.array = positions2;
+	geometry.attributes.uv.array = uvs2;
 
-	var geometry2 = new THREE.BufferGeometry();
-	geometry2.setIndex( new THREE.BufferAttribute( indices2, 1 ) );
-	geometry2.addAttribute( 'position', new THREE.BufferAttribute( positions2, 3 ) );
-	geometry2.addAttribute( 'uv', new THREE.BufferAttribute( uvs2, 2 ) );
+	//
 
 	// var material = new THREE.MeshBasicMaterial( { wireframe: true } );
 	var material = new THREE.MeshBasicMaterial( { map: _renderTarget } );
-	var mesh = new THREE.Mesh( geometry2, material );
+	var mesh = new THREE.Mesh( geometry, material );
 	_scene.add( mesh );
 
 	//