浏览代码

Merge remote-tracking branch 'gyuque/uvoption'

zz85 13 年之前
父节点
当前提交
25245b95e9
共有 3 个文件被更改,包括 353 次插入143 次删除
  1. 137 0
      extest2.html
  2. 103 0
      extest2.js
  3. 113 143
      src/extras/geometries/ExtrudeGeometry.js

+ 137 - 0
extest2.html

@@ -0,0 +1,137 @@
+<!doctype html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8">
+		<title>extrude test</title>
+
+		<script src="./src/Three.js"></script>
+		<script src="./src/core/Clock.js"></script>
+		<script src="./src/core/Color.js"></script>
+		<script src="./src/core/Vector2.js"></script>
+		<script src="./src/core/Vector3.js"></script>
+		<script src="./src/core/Vector4.js"></script>
+		<script src="./src/core/Frustum.js"></script>
+		<script src="./src/core/Ray.js"></script>
+		<script src="./src/core/Rectangle.js"></script>
+		<script src="./src/core/Math.js"></script>
+		<script src="./src/core/Matrix3.js"></script>
+		<script src="./src/core/Matrix4.js"></script>
+		<script src="./src/core/Object3D.js"></script>
+		<script src="./src/core/Projector.js"></script>
+		<script src="./src/core/Quaternion.js"></script>
+		<script src="./src/core/Vertex.js"></script>
+		<script src="./src/core/Face3.js"></script>
+		<script src="./src/core/Face4.js"></script>
+		<script src="./src/core/UV.js"></script>
+		<script src="./src/core/Geometry.js"></script>
+		<script src="./src/core/Spline.js"></script>
+		<script src="./src/cameras/Camera.js"></script>
+		<script src="./src/cameras/OrthographicCamera.js"></script>
+		<script src="./src/cameras/PerspectiveCamera.js"></script>
+		<script src="./src/lights/Light.js"></script>
+		<script src="./src/lights/AmbientLight.js"></script>
+		<script src="./src/lights/DirectionalLight.js"></script>
+		<script src="./src/lights/PointLight.js"></script>
+		<script src="./src/lights/SpotLight.js"></script>
+		<script src="./src/materials/Material.js"></script>
+		<script src="./src/materials/LineBasicMaterial.js"></script>
+		<script src="./src/materials/MeshBasicMaterial.js"></script>
+		<script src="./src/materials/MeshLambertMaterial.js"></script>
+		<script src="./src/materials/MeshPhongMaterial.js"></script>
+		<script src="./src/materials/MeshDepthMaterial.js"></script>
+		<script src="./src/materials/MeshNormalMaterial.js"></script>
+		<script src="./src/materials/MeshFaceMaterial.js"></script>
+		<script src="./src/materials/ParticleBasicMaterial.js"></script>
+		<script src="./src/materials/ParticleCanvasMaterial.js"></script>
+		<script src="./src/materials/ParticleDOMMaterial.js"></script>
+		<script src="./src/materials/ShaderMaterial.js"></script>
+		<script src="./src/textures/Texture.js"></script>
+		<script src="./src/textures/DataTexture.js"></script>
+		<script src="./src/objects/Particle.js"></script>
+		<script src="./src/objects/ParticleSystem.js"></script>
+		<script src="./src/objects/Line.js"></script>
+		<script src="./src/objects/Mesh.js"></script>
+		<script src="./src/objects/Bone.js"></script>
+		<script src="./src/objects/SkinnedMesh.js"></script>
+		<script src="./src/objects/MorphAnimMesh.js"></script>
+		<script src="./src/objects/Ribbon.js"></script>
+		<script src="./src/objects/LOD.js"></script>
+		<script src="./src/objects/Sprite.js"></script>
+		<script src="./src/scenes/Scene.js"></script>
+		<script src="./src/scenes/Fog.js"></script>
+		<script src="./src/scenes/FogExp2.js"></script>
+		<script src="./src/renderers/DOMRenderer.js"></script>
+		<script src="./src/renderers/CanvasRenderer.js"></script>
+		<script src="./src/renderers/SVGRenderer.js"></script>
+		<script src="./src/renderers/WebGLShaders.js"></script>
+		<script src="./src/renderers/WebGLRenderer.js"></script>
+		<script src="./src/renderers/WebGLRenderTarget.js"></script>
+		<script src="./src/renderers/WebGLRenderTargetCube.js"></script>
+		<script src="./src/renderers/renderables/RenderableVertex.js"></script>
+		<script src="./src/renderers/renderables/RenderableFace3.js"></script>
+		<script src="./src/renderers/renderables/RenderableFace4.js"></script>
+		<script src="./src/renderers/renderables/RenderableObject.js"></script>
+		<script src="./src/renderers/renderables/RenderableParticle.js"></script>
+		<script src="./src/renderers/renderables/RenderableLine.js"></script>
+		<script src="./src/extras/ColorUtils.js"></script>
+		<script src="./src/extras/GeometryUtils.js"></script>
+		<script src="./src/extras/ImageUtils.js"></script>
+		<script src="./src/extras/SceneUtils.js"></script>
+		<script src="./src/extras/ShaderUtils.js"></script>
+		<script src="./src/extras/core/BufferGeometry.js"></script>
+		<script src="./src/extras/core/Curve.js"></script>
+		<script src="./src/extras/core/CurvePath.js"></script>
+		<script src="./src/extras/core/EventTarget.js"></script>
+		<script src="./src/extras/core/Gyroscope.js"></script>
+		<script src="./src/extras/core/Path.js"></script>
+		<script src="./src/extras/core/Shape.js"></script>
+		<script src="./src/extras/core/TextPath.js"></script>
+		<script src="./src/extras/animation/AnimationHandler.js"></script>
+		<script src="./src/extras/animation/Animation.js"></script>
+		<script src="./src/extras/animation/KeyFrameAnimation.js"></script>
+		<script src="./src/extras/cameras/CubeCamera.js"></script>
+		<script src="./src/extras/cameras/CombinedCamera.js"></script>
+		<script src="./src/extras/controls/FirstPersonControls.js"></script>
+		<script src="./src/extras/controls/PathControls.js"></script>
+		<script src="./src/extras/controls/FlyControls.js"></script>
+		<script src="./src/extras/controls/RollControls.js"></script>
+		<script src="./src/extras/controls/TrackballControls.js"></script>
+		<script src="./src/extras/geometries/CubeGeometry.js"></script>
+		<script src="./src/extras/geometries/CylinderGeometry.js"></script>
+		<script src="./src/extras/geometries/ExtrudeGeometry.js"></script>
+		<script src="./src/extras/geometries/LatheGeometry.js"></script>
+		<script src="./src/extras/geometries/PlaneGeometry.js"></script>
+		<script src="./src/extras/geometries/SphereGeometry.js"></script>
+		<script src="./src/extras/geometries/TextGeometry.js"></script>
+		<script src="./src/extras/geometries/TorusGeometry.js"></script>
+		<script src="./src/extras/geometries/TorusKnotGeometry.js"></script>
+		<script src="./src/extras/geometries/PolyhedronGeometry.js"></script>
+		<script src="./src/extras/geometries/IcosahedronGeometry.js"></script>
+		<script src="./src/extras/geometries/OctahedronGeometry.js"></script>
+		<script src="./src/extras/geometries/TetrahedronGeometry.js"></script>
+		<script src="./src/extras/helpers/AxisHelper.js"></script>
+		<script src="./src/extras/helpers/CameraHelper.js"></script>
+		<script src="./src/extras/modifiers/SubdivisionModifier.js"></script>
+		<script src="./src/extras/loaders/Loader.js"></script>
+		<script src="./src/extras/loaders/BinaryLoader.js"></script>
+		<script src="./src/extras/loaders/ColladaLoader.js"></script>
+		<script src="./src/extras/loaders/JSONLoader.js"></script>
+		<script src="./src/extras/loaders/SceneLoader.js"></script>
+		<script src="./src/extras/loaders/UTF8Loader.js"></script>
+		<script src="./src/extras/objects/MarchingCubes.js"></script>
+		<script src="./src/extras/objects/LensFlare.js"></script>
+		<script src="./src/extras/renderers/plugins/LensFlarePlugin.js"></script>
+		<script src="./src/extras/renderers/plugins/ShadowMapPlugin.js"></script>
+		<script src="./src/extras/renderers/plugins/SpritePlugin.js"></script>
+		<script src="./src/extras/renderers/AnaglyphWebGLRenderer.js"></script>
+		<script src="./src/extras/renderers/CrosseyedWebGLRenderer.js"></script>
+		<script src="./src/extras/shaders/ShaderFlares.js"></script>
+		<script src="./src/extras/shaders/ShaderSprite.js"></script>
+
+		
+		<script type="text/javascript" src="./extest2.js"></script>
+	</head>
+	<body onload="void launch()">
+		
+	</body>
+</html>

+ 103 - 0
extest2.js

@@ -0,0 +1,103 @@
+(function(aGlobal) {
+	"use strict";
+	var TEXDATA = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAMFB'+
+	              'MVEWcEFqcGGOlIWOlIWulKWutOXOtOXutQnu1SoS6Uo69Y5zMfrHWnMbepc7erdbntd6d+uwA'+
+	              'AAAAo0lEQVR42mNgoAL4jwaIEQDp405gYOBKYLjvwIAssIBhLwM7ssABhtUMXECB3Q0M3nsTG'+
+	              'Lr3fmTwYuABGbqAIf9/AsP6/z8YWBjskQV+A/X2IwTccv4CBfYjBBi4/6MLoKnIWotmxvr/v4'+
+	              'C2+CMLfGPwYOBHFvjAUAUyGW5t5gao02G2sME8BxcoYDgvwAgS2LVqPxCvWr1rFZAiKggJClA'+
+	              'BAAC+WuzCiXr+gwAAAABJRU5ErkJggg==';
+	
+	var renderer, camera, scene, mesh, mesh2;
+	var angle = 0;
+
+	function createMesh(g, texture) {
+		var m = new THREE.Mesh(g, new THREE.MeshFaceMaterial());
+		g.materials = 
+				[
+					new THREE.MeshBasicMaterial( { map: texture } ),
+					new THREE.MeshBasicMaterial( { color: 0xcc4488 } )
+				];
+				
+		return m;
+	}
+	
+	function setupModel() {
+		var img = new Image();
+		img.onload = function() { texture.needsUpdate = true; }
+		img.src = TEXDATA;
+		var texture = new THREE.Texture(img);
+		
+		var s = new THREE.Shape();
+		s.moveTo( 0,0 );
+		s.lineTo( -4, -4 );
+		s.lineTo(  4, -4 );
+		s.lineTo(  5, 0 );
+		s.lineTo(  4, 4 );
+		s.lineTo( -4, 4 );
+		
+		var ho = new THREE.Shape();
+		ho.moveTo( 0,0 );
+		ho.lineTo( 0, 2 );
+		ho.lineTo( 2, 0 );
+		ho.lineTo( -2,-2 );
+		
+		s.holes.push(ho);
+
+		var s2 = new THREE.Shape();
+		s2.moveTo(8+ 0,0 );
+		s2.lineTo(8+ -2, -2 );
+		s2.lineTo(8+  2, -2 );
+		s2.lineTo(8+  2.5, 0 );
+		s2.lineTo(8+  2, 2 );
+		s2.lineTo(8+ -2, 2 );
+		
+		var exoption = {
+			bevelEnabled: false,
+			bevelSize: 1,
+			amount: 6,
+			extrudeMaterial: 0,
+			material: 1
+		};
+		
+		var geom = s.extrude(exoption);
+		mesh = createMesh(geom, texture);
+		mesh.position.set(-7, 0, -45);
+		scene.add(mesh);
+		
+		var geom2 = new THREE.ExtrudeGeometry( [s,s2], exoption );
+		mesh2 = createMesh(geom2, texture);
+		mesh2.position.set(7, 0, -45);
+		scene.add(mesh2);
+	}
+	
+	function tick() {
+		var DPI = Math.PI*2;
+		angle += 0.05;
+		if (angle > DPI) {angle -= DPI;}
+		mesh.rotation.set(-3.2, angle, 0);
+		mesh2.rotation.set(-3.2, angle, 0);
+		
+		renderer.render(scene, camera);
+		setTimeout(tick, 100);
+	}
+	
+	aGlobal.launch = function() {
+		scene = new THREE.Scene();
+		renderer = new THREE.WebGLRenderer();
+		camera = new THREE.PerspectiveCamera();
+		scene.add(camera);
+
+		var light = new THREE.DirectionalLight(0xffffff);
+		light.position.set(0, 1, 2);
+		light.position.normalize();
+		scene.add(light);
+		
+		
+		renderer.setSize(600, 600);
+		document.body.appendChild(renderer.domElement);
+		
+		setupModel();
+		
+		setTimeout(tick, 300);
+	};
+})(window);

+ 113 - 143
src/extras/geometries/ExtrudeGeometry.js

@@ -31,28 +31,17 @@
 THREE.ExtrudeGeometry = function( shapes, options ) {
 THREE.ExtrudeGeometry = function( shapes, options ) {
 
 
 	if ( typeof( shapes ) === "undefined" ) {
 	if ( typeof( shapes ) === "undefined" ) {
-
 		shapes = [];
 		shapes = [];
 		return;
 		return;
-
 	}
 	}
 
 
 	THREE.Geometry.call( this );
 	THREE.Geometry.call( this );
 
 
 	shapes = shapes instanceof Array ? shapes : [ shapes ];
 	shapes = shapes instanceof Array ? shapes : [ shapes ];
 
 
-	var shape, s, sl = shapes.length;
-
-	this.shapebb = shapes[ sl - 1 ].getBoundingBox();
-
-	for ( s = 0; s < sl; s ++ ) {
-
-		shape = shapes[ s ];
-
-		this.addShape( shape, options );
-
-	}
+	this.shapebb = shapes[ shapes.length - 1 ].getBoundingBox();
 
 
+	this.addShapeList( shapes, options );
 
 
 	this.computeCentroids();
 	this.computeCentroids();
 	this.computeFaceNormals();
 	this.computeFaceNormals();
@@ -70,6 +59,14 @@ THREE.ExtrudeGeometry = function( shapes, options ) {
 THREE.ExtrudeGeometry.prototype = new THREE.Geometry();
 THREE.ExtrudeGeometry.prototype = new THREE.Geometry();
 THREE.ExtrudeGeometry.prototype.constructor = THREE.ExtrudeGeometry;
 THREE.ExtrudeGeometry.prototype.constructor = THREE.ExtrudeGeometry;
 
 
+THREE.ExtrudeGeometry.prototype.addShapeList = function(shapes, options) {
+	var sl = shapes.length;
+	
+	for ( var s = 0; s < sl; s ++ ) {
+		var shape = shapes[ s ];
+		this.addShape( shape, options );
+	}
+};
 
 
 THREE.ExtrudeGeometry.prototype.addShape = function( shape, options ) {
 THREE.ExtrudeGeometry.prototype.addShape = function( shape, options ) {
 
 
@@ -517,90 +514,87 @@ THREE.ExtrudeGeometry.prototype.addShape = function( shape, options ) {
 
 
 	}
 	}
 
 
+	// set UV generator
+	var uvgen = THREE.ExtrudeGeometry.WorldUVGenerator;
 
 
 	////
 	////
 	///   Handle Faces
 	///   Handle Faces
 	////
 	////
 
 
-	// Bottom faces
-
-	if ( bevelEnabled ) {
-
-		var layer = 0 ; // steps + 1
-		var offset = vlen * layer;
+	// Top and bottom faces
+	buildLidFaces();
 
 
-		for ( i = 0; i < flen; i ++ ) {
-
-			face = faces[ i ];
-			f3( face[ 2 ]+ offset, face[ 1 ]+ offset, face[ 0 ] + offset );
-
-		}
+	// Sides faces
+	buildSideFaces();
 
 
-		layer = steps + bevelSegments * 2;
-		offset = vlen * layer;
 
 
-		// Top faces
+	/////  Internal functions
 
 
-		for ( i = 0; i < flen; i ++ ) {
+	function buildLidFaces() {
+		if ( bevelEnabled ) {
 
 
-			face = faces[ i ];
-			f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );
+			var layer = 0 ; // steps + 1
+			var offset = vlen * layer;
 
 
-		}
+			// Bottom faces
+			
+			for ( i = 0; i < flen; i ++ ) {
 
 
-	} else {
+				face = faces[ i ];
+				f3( face[ 2 ]+ offset, face[ 1 ]+ offset, face[ 0 ] + offset, true );
 
 
-		for ( i = 0; i < flen; i++ ) {
+			}
 
 
-			face = faces[ i ];
-			f3( face[ 2 ], face[ 1 ], face[ 0 ] );
+			layer = steps + bevelSegments * 2;
+			offset = vlen * layer;
 
 
-		}
+			// Top faces
 
 
-		// Top faces
+			for ( i = 0; i < flen; i ++ ) {
+				face = faces[ i ];
+				f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset, false );
+			}
+		} else {
+		
+			// Bottom faces
 
 
-		for ( i = 0; i < flen; i ++ ) {
+			for ( i = 0; i < flen; i++ ) {
+				face = faces[ i ];
+				f3( face[ 2 ], face[ 1 ], face[ 0 ], true );
+			}
 
 
-			face = faces[ i ];
-			f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );
+			// Top faces
 
 
+			for ( i = 0; i < flen; i ++ ) {
+				face = faces[ i ];
+				f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps, false );
+			}
 		}
 		}
-
 	}
 	}
 
 
-	var tmpPt;
-	var j, k, l, m;
-
-	var layeroffset = 0;
-
-	// Sides faces
-
-	sidewalls( contour );
-	layeroffset += contour.length;
-
-	for ( h = 0, hl = holes.length;  h < hl; h ++ ) {
+	// Create faces for the z-sides of the shape
 
 
-		ahole = holes[ h ];
-		sidewalls( ahole );
+	function buildSideFaces() {
+		var layeroffset = 0;
+		sidewalls( contour, layeroffset );
+		layeroffset += contour.length;
 
 
-		//, true
-		layeroffset += ahole.length;
+		for ( h = 0, hl = holes.length;  h < hl; h ++ ) {
+			ahole = holes[ h ];
+			sidewalls( ahole, layeroffset );
 
 
+			//, true
+			layeroffset += ahole.length;
+		}
 	}
 	}
 
 
-	// Create faces for the z-sides of the shape
-
-	function sidewalls( contour ) {
-
+	function sidewalls( contour, layeroffset ) {
+		var j, k;
 		i = contour.length;
 		i = contour.length;
 
 
 		while ( --i >= 0 ) {
 		while ( --i >= 0 ) {
-
-			tmpPt = contour[ i ];
-
 			j = i;
 			j = i;
 			k = i - 1;
 			k = i - 1;
-
 			if ( k < 0 ) k = contour.length - 1;
 			if ( k < 0 ) k = contour.length - 1;
 
 
 			//console.log('b', i,j, i-1, k,vertices.length);
 			//console.log('b', i,j, i-1, k,vertices.length);
@@ -608,7 +602,6 @@ THREE.ExtrudeGeometry.prototype.addShape = function( shape, options ) {
 			var s = 0, sl = steps  + bevelSegments * 2;
 			var s = 0, sl = steps  + bevelSegments * 2;
 
 
 			for ( s = 0; s < sl; s ++ ) {
 			for ( s = 0; s < sl; s ++ ) {
-
 				var slen1 = vlen * s;
 				var slen1 = vlen * s;
 				var slen2 = vlen * ( s + 1 );
 				var slen2 = vlen * ( s + 1 );
 				var a = layeroffset + j + slen1,
 				var a = layeroffset + j + slen1,
@@ -616,46 +609,17 @@ THREE.ExtrudeGeometry.prototype.addShape = function( shape, options ) {
 					c = layeroffset + k + slen2,
 					c = layeroffset + k + slen2,
 					d = layeroffset + j + slen2;
 					d = layeroffset + j + slen2;
 
 
-				f4( a, b, c, d );
-
-				if ( extrudeMaterial !== undefined ) {
-
-					var v1 = s / sl;
-					var v2 = ( s + 1 ) / sl;
-
-					var ztol = ( amount + bevelThickness * 2 );
-
-					var u1 = ( scope.vertices[ a ].position.z + bevelThickness ) / ztol;
-					var u2 = ( scope.vertices[ d ].position.z + bevelThickness ) / ztol;
-
-					//console.log(vy1, vy2);
-					/*
-					scope.faceVertexUvs[ 0 ].push( [
-						new THREE.UV( u1, v1 ),
-						new THREE.UV( u2, v1 ),
-						new THREE.UV( u2, v2 ),
-						new THREE.UV( u1, v2 )
-					] );
-					*/
-
-				}
-
-
+				f4( a, b, c, d, contour, s, sl );
 			}
 			}
-
 		}
 		}
-
 	}
 	}
 
 
 
 
 	function v( x, y, z ) {
 	function v( x, y, z ) {
-
 		scope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) );
 		scope.vertices.push( new THREE.Vertex( new THREE.Vector3( x, y, z ) ) );
-
 	}
 	}
 
 
-	function f3( a, b, c ) {
-
+	function f3( a, b, c, isBottom ) {
 		a += shapesOffset;
 		a += shapesOffset;
 		b += shapesOffset;
 		b += shapesOffset;
 		c += shapesOffset;
 		c += shapesOffset;
@@ -663,80 +627,86 @@ THREE.ExtrudeGeometry.prototype.addShape = function( shape, options ) {
 												   // normal, color, material
 												   // normal, color, material
 		scope.faces.push( new THREE.Face3( a, b, c, null, null, material ) );
 		scope.faces.push( new THREE.Face3( a, b, c, null, null, material ) );
 
 
-		var ax = scope.vertices[ a ].position.x,
-			ay = scope.vertices[ a ].position.y,
-
-			bx = scope.vertices[ b ].position.x,
-			by = scope.vertices[ b ].position.y,
-
-			cx = scope.vertices[ c ].position.x,
-			cy = scope.vertices[ c ].position.y;
-
-		scope.faceVertexUvs[ 0 ].push( [
-
-			new THREE.UV( ax, 1 - ay ),
-			new THREE.UV( bx, 1 - by ),
-			new THREE.UV( cx, 1 - cy )
-
-		] );
-
+		var uvs = isBottom ? uvgen.generateBottomUV( scope, shape, options, a, b, c)
+		                   : uvgen.generateTopUV( scope, shape, options, a, b, c);
 
 
+ 		scope.faceVertexUvs[ 0 ].push(uvs);
 	}
 	}
 
 
-	function f4( a, b, c, d ) {
-
+	function f4( a, b, c, d, wallContour, stepIndex, stepsLength ) {
 		a += shapesOffset;
 		a += shapesOffset;
 		b += shapesOffset;
 		b += shapesOffset;
 		c += shapesOffset;
 		c += shapesOffset;
 		d += shapesOffset;
 		d += shapesOffset;
 
 
  		scope.faces.push( new THREE.Face4( a, b, c, d, null, null, extrudeMaterial ) );
  		scope.faces.push( new THREE.Face4( a, b, c, d, null, null, extrudeMaterial ) );
+ 
+ 		var uvs = uvgen.generateSideWallUV( scope, shape, wallContour, options, a, b, c, d, stepIndex, stepsLength);
+ 		scope.faceVertexUvs[ 0 ].push(uvs);
+	}
 
 
-		var ax = scope.vertices[ a ].position.x,
-			ay = scope.vertices[ a ].position.y,
-			az = scope.vertices[ a ].position.z,
-
-			bx = scope.vertices[ b ].position.x,
-			by = scope.vertices[ b ].position.y,
-			bz = scope.vertices[ b ].position.z,
+};
 
 
-			cx = scope.vertices[ c ].position.x,
-			cy = scope.vertices[ c ].position.y,
-			cz = scope.vertices[ c ].position.z,
 
 
-			dx = scope.vertices[ d ].position.x,
-			dy = scope.vertices[ d ].position.y,
-			dz = scope.vertices[ d ].position.z;
 
 
-		if ( Math.abs( ay - by ) < 0.01 ) {
+THREE.ExtrudeGeometry.WorldUVGenerator = {
+	generateTopUV: function( geometry, extrudedShape, extrudeOptions, indexA, indexB, indexC) {
+		var ax = geometry.vertices[ indexA ].position.x,
+			ay = geometry.vertices[ indexA ].position.y,
 
 
-			scope.faceVertexUvs[ 0 ].push( [
+			bx = geometry.vertices[ indexB ].position.x,
+			by = geometry.vertices[ indexB ].position.y,
 
 
+			cx = geometry.vertices[ indexC ].position.x,
+			cy = geometry.vertices[ indexC ].position.y;
+			
+		return [
+			new THREE.UV( ax, 1 - ay ),
+			new THREE.UV( bx, 1 - by ),
+			new THREE.UV( cx, 1 - cy )
+		];
+	},
+
+	generateBottomUV: function( geometry, extrudedShape, extrudeOptions, indexA, indexB, indexC) {
+		return this.generateTopUV( geometry, extrudedShape, extrudeOptions, indexA, indexB, indexC );
+	},
+
+	generateSideWallUV: function( geometry, extrudedShape, wallContour, extrudeOptions,
+	                              indexA, indexB, indexC, indexD, stepIndex, stepsLength) {
+		var ax = geometry.vertices[ indexA ].position.x,
+			ay = geometry.vertices[ indexA ].position.y,
+			az = geometry.vertices[ indexA ].position.z,
+
+			bx = geometry.vertices[ indexB ].position.x,
+			by = geometry.vertices[ indexB ].position.y,
+			bz = geometry.vertices[ indexB ].position.z,
+
+			cx = geometry.vertices[ indexC ].position.x,
+			cy = geometry.vertices[ indexC ].position.y,
+			cz = geometry.vertices[ indexC ].position.z,
+
+			dx = geometry.vertices[ indexD ].position.x,
+			dy = geometry.vertices[ indexD ].position.y,
+			dz = geometry.vertices[ indexD ].position.z;
+		
+		if ( Math.abs( ay - by ) < 0.01 ) {
+			return [
 				new THREE.UV( ax, az ),
 				new THREE.UV( ax, az ),
 				new THREE.UV( bx, bz ),
 				new THREE.UV( bx, bz ),
 				new THREE.UV( cx, cz ),
 				new THREE.UV( cx, cz ),
 				new THREE.UV( dx, dz )
 				new THREE.UV( dx, dz )
-
-			] );
-
+			];
 		} else {
 		} else {
-
-			scope.faceVertexUvs[ 0 ].push( [
-
+			return [
 				new THREE.UV( ay, az ),
 				new THREE.UV( ay, az ),
 				new THREE.UV( by, bz ),
 				new THREE.UV( by, bz ),
 				new THREE.UV( cy, cz ),
 				new THREE.UV( cy, cz ),
 				new THREE.UV( dy, dz )
 				new THREE.UV( dy, dz )
-
-			] );
-
+			];
 		}
 		}
-
 	}
 	}
-
 };
 };
 
 
-
 THREE.ExtrudeGeometry.__v1 = new THREE.Vector2();
 THREE.ExtrudeGeometry.__v1 = new THREE.Vector2();
 THREE.ExtrudeGeometry.__v2 = new THREE.Vector2();
 THREE.ExtrudeGeometry.__v2 = new THREE.Vector2();
 THREE.ExtrudeGeometry.__v3 = new THREE.Vector2();
 THREE.ExtrudeGeometry.__v3 = new THREE.Vector2();