diff --git a/examples/materials_cubemap_sky.html b/examples/materials_cubemap_sky.html
index eab258273928e05f26a0b31da2b694e5063a3123..9d057b3c37462308223d9744c275cb485996fe60 100644
--- a/examples/materials_cubemap_sky.html
+++ b/examples/materials_cubemap_sky.html
@@ -36,6 +36,7 @@
+
@@ -76,27 +77,31 @@
scene = new THREE.Scene();
sceneCube = new THREE.Scene();
- var r = "textures/skymap_";
+ var geometry = new THREE.Geometry();
+ var sphere = new THREE.Mesh( new Sphere( 100, 32, 16 ) );
+
+ for ( var i = 0; i < 200; i ++ ) {
+
+ sphere.position.x = Math.random() * 10000 - 5000;
+ sphere.position.y = Math.random() * 10000 - 5000;
+ sphere.position.z = Math.random() * 10000 - 5000;
+ sphere.scale.x = sphere.scale.y = sphere.scale.z = Math.random() * 4 + 1;
+
+ // Merging spheres in a single geometry
+ GeometryUtils.merge( geometry, sphere );
+ }
+ var r = "textures/skymap_";
var urls = [ r + "right1024.jpg", r + "left1024.jpg",
r + "top1024.jpg", r + "bottom1024.jpg",
r + "front1024.jpg", r + "back1024.jpg" ];
var images = loadImageArray( urls );
-
var material = new THREE.MeshBasicMaterial( { color: 0xffffff, env_map: new THREE.TextureCube( images ) } );
- var geometry = new Sphere( 100, 32, 16, true );
-
- for ( var i = 0; i < 200; i ++ ) {
-
- var mesh = new THREE.Mesh( geometry, material );
- mesh.position.x = Math.random() * 10000 - 5000;
- mesh.position.y = Math.random() * 10000 - 5000;
- mesh.position.z = Math.random() * 10000 - 5000;
- mesh.scale.x = mesh.scale.y = mesh.scale.z = Math.random() * 4 + 1;
- scene.addObject( mesh );
- }
+ var mesh = new THREE.Mesh( geometry, material );
+ mesh.position.x = 100;
+ scene.addObject( mesh );
createCube( 100000, images );
diff --git a/src/core/Face3.js b/src/core/Face3.js
index f03147a97c47fddcff07932a0fb2f0b9adc77f79..e8e62cd412228136d6448f3686fd16a0cb022191 100644
--- a/src/core/Face3.js
+++ b/src/core/Face3.js
@@ -10,7 +10,7 @@ THREE.Face3 = function ( a, b, c, normal, material ) {
this.centroid = new THREE.Vector3();
this.normal = normal instanceof THREE.Vector3 ? normal : new THREE.Vector3();
- this.vertexNormals = normal instanceof Array ? normal : [];
+ this.vertexNormals = normal instanceof Array ? normal : [];
this.material = material instanceof Array ? material : [ material ];
diff --git a/src/core/Face4.js b/src/core/Face4.js
index 36847160b163b5d23e0358c59efa6fe7d6adc181..0bab13804c458f8eb4d89f536c7b0730205964f1 100644
--- a/src/core/Face4.js
+++ b/src/core/Face4.js
@@ -11,7 +11,7 @@ THREE.Face4 = function ( a, b, c, d, normal, material ) {
this.centroid = new THREE.Vector3();
this.normal = normal instanceof THREE.Vector3 ? normal : new THREE.Vector3();
- this.vertexNormals = normal instanceof Array ? normal : [];
+ this.vertexNormals = normal instanceof Array ? normal : [];
this.material = material instanceof Array ? material : [ material ];
diff --git a/src/extras/GeometryUtils.js b/src/extras/GeometryUtils.js
new file mode 100644
index 0000000000000000000000000000000000000000..77db23c80ea3fd00bd7ad4ed36ee7b919c797358
--- /dev/null
+++ b/src/extras/GeometryUtils.js
@@ -0,0 +1,76 @@
+var GeometryUtils = {
+
+ merge: function ( object1, object2 ) {
+
+ var isMesh = object2 instanceof THREE.Mesh;
+
+ var geometry1 = object1,
+ vertexPosition = geometry1.vertices.length,
+ facePosition = geometry1.faces.length,
+ uvPosition = geometry1.uvs.length,
+ geometry2 = isMesh ? object2.geometry : object2;
+
+ if ( isMesh ) object2.updateMatrix();
+
+ for ( var i = 0, il = geometry2.vertices.length; i < il; i ++ ) {
+
+ var vertex = geometry2.vertices[ i ];
+
+ var vertexCopy = new THREE.Vertex( vertex.position.clone() );
+
+ if ( isMesh ) object2.matrix.transform( vertexCopy.position );
+
+ geometry1.vertices.push( vertexCopy );
+
+ }
+
+ for ( var i = 0, il = geometry2.faces.length; i < il; i ++ ) {
+
+ var face = geometry2.faces[ i ];
+
+ if ( face instanceof THREE.Face3 ) {
+
+ var faceCopy = new THREE.Face3();
+ faceCopy.a = face.a + vertexPosition;
+ faceCopy.b = face.b + vertexPosition;
+ faceCopy.c = face.c + vertexPosition;
+
+ } else if ( face instanceof THREE.Face4 ) {
+
+ var faceCopy = new THREE.Face4();
+ faceCopy.a = face.a + vertexPosition;
+ faceCopy.b = face.b + vertexPosition;
+ faceCopy.c = face.c + vertexPosition;
+ faceCopy.d = face.d + vertexPosition;
+
+ }
+
+ for ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {
+
+ var normal = face.vertexNormals[ j ];
+ faceCopy.vertexNormals.push( normal.clone() );
+ }
+
+ geometry1.faces.push( faceCopy );
+
+ }
+
+ for ( var i = 0, il = geometry2.uvs.length; i < il; i ++ ) {
+
+ var uv = geometry2.uvs[ i ];
+
+ var uvCopy = [];
+
+ for ( var j = 0, jl = uv.length; j < jl; j ++ ) {
+
+ uvCopy.push( new THREE.UV( uv[ j ].u, uv[ j ].v ) );
+
+ }
+
+ geometry1.uvs.push( uvCopy );
+
+ }
+
+ }
+
+}
diff --git a/src/extras/primitives/Sphere.js b/src/extras/primitives/Sphere.js
index 2df1717960a1e7507029e0a506b4e6309f35bda1..c542839900b34fe5ee965c0b3fd7fdf260b20d84 100644
--- a/src/extras/primitives/Sphere.js
+++ b/src/extras/primitives/Sphere.js
@@ -3,7 +3,7 @@
* based on http://papervision3d.googlecode.com/svn/trunk/as3/trunk/src/org/papervision3d/objects/primitives/Sphere.as
*/
-var Sphere = function ( radius, segments_width, segments_height, smooth ) {
+var Sphere = function ( radius, segments_width, segments_height ) {
THREE.Geometry.call( this );
@@ -78,15 +78,7 @@ var Sphere = function ( radius, segments_width, segments_height, smooth ) {
n2.normalize();
n3.normalize();
- if ( smooth ) {
-
- this.faces.push( new THREE.Face3( aP1, aP2, aP3, [ new THREE.Vector3( n1.x, n1.y, n1.z ), new THREE.Vector3( n2.x, n2.y, n2.z ), new THREE.Vector3( n3.x, n3.y, n3.z ) ] ) );
-
- } else {
-
- this.faces.push( new THREE.Face3( aP1, aP2, aP3 ) );
-
- }
+ this.faces.push( new THREE.Face3( aP1, aP2, aP3, [ new THREE.Vector3( n1.x, n1.y, n1.z ), new THREE.Vector3( n2.x, n2.y, n2.z ), new THREE.Vector3( n3.x, n3.y, n3.z ) ] ) );
this.uvs.push( [ aP1uv, aP2uv, aP3uv ] );
@@ -101,15 +93,7 @@ var Sphere = function ( radius, segments_width, segments_height, smooth ) {
n2.normalize();
n3.normalize();
- if ( smooth ) {
-
- this.faces.push( new THREE.Face3( aP1, aP3, aP4, [ new THREE.Vector3( n1.x, n1.y, n1.z ), new THREE.Vector3( n2.x, n2.y, n2.z ), new THREE.Vector3( n3.x, n3.y, n3.z ) ] ) );
-
- } else {
-
- this.faces.push( new THREE.Face3( aP1, aP3, aP4 ) );
-
- }
+ this.faces.push( new THREE.Face3( aP1, aP3, aP4, [ new THREE.Vector3( n1.x, n1.y, n1.z ), new THREE.Vector3( n2.x, n2.y, n2.z ), new THREE.Vector3( n3.x, n3.y, n3.z ) ] ) );
this.uvs.push( [ aP1uv, aP3uv, aP4uv ] );
diff --git a/src/objects/Mesh.js b/src/objects/Mesh.js
index e2683df64269b1dcd0826fd7c27bd0e44eec505e..a6828f3386b1928b3be5943e82b6c817853604b4 100644
--- a/src/objects/Mesh.js
+++ b/src/objects/Mesh.js
@@ -16,7 +16,7 @@ THREE.Mesh = function ( geometry, material, normUVs ) {
this.materialFaceGroup = {};
this.sortFacesByMaterial();
- if( normUVs ) this.normalizeUVs();
+ if ( normUVs ) this.normalizeUVs();
this.geometry.computeBoundingBox();