Forráskód Böngészése

added UV tests example and move cylinder uv generator to UVsUtils.

i'll shall leave THREE.ExtrudeGeometry.WorldUVGenerator as it is right now until someone have a clearer picture of whats going on. closes #1748
zz85 13 éve
szülő
commit
911c34882f

+ 83 - 1
examples/js/UVsUtils.js

@@ -1,5 +1,87 @@
+/*
+ * @author gyuque / https://github.com/gyuque
+ *
+ * Cylinder Mapping for ExtrudeGeometry
+ *
+ */
+
+THREE.UVsUtils = {
+
+};
+
+THREE.UVsUtils.CylinderUVGenerator = function() {
+    this.uRepeat = 1;
+    this.targetGeometry = null;
+    this.lengthCache = null;
+};
+
+THREE.UVsUtils.CylinderUVGenerator.prototype = {
+    generateTopUV: THREE.ExtrudeGeometry.WorldUVGenerator.generateTopUV,
+    generateBottomUV: THREE.ExtrudeGeometry.WorldUVGenerator.generateBottomUV,
+    
+    generateSideWallUV: function( geometry, extrudedShape, wallContour, extrudeOptions,
+                                  indexA, indexB, indexC, indexD, stepIndex, stepsLength,
+                                  contourIndex1, contourIndex2 ) {
+        // first call
+        if (this.targetGeometry !== geometry) {
+            this.prepare(geometry, wallContour);
+        }
+
+        // generate uv
+        var u_list = this.lengthCache;
+        var v1 = stepIndex / stepsLength;
+        var v2 = ( stepIndex + 1 ) / stepsLength;
+        
+        var u1 = u_list[contourIndex1];
+        var u2 = u_list[contourIndex2];
+        if (u1 < u2) {u1 += 1.0;}
+        
+        u1 *= this.uRepeat;
+        u2 *= this.uRepeat;
+        return [
+            new THREE.UV( u1, v1 ),
+            new THREE.UV( u2, v1 ),
+            new THREE.UV( u2, v2 ),
+            new THREE.UV( u1, v2 )
+        ];
+    },
+    
+    prepare: function(geometry, wallContour) {
+        var p1, p2;
+        var u_list = [];
+        var lengthSum = 0;
+        var len = wallContour.length;
+        for (var i = 0;i < len;i++) {
+            p1 = wallContour[ i ];
+            p2 = wallContour[ (i+1) % len ];
+
+            var dx = p1.x - p2.x;
+            var dy = p1.y - p2.y;
+            var segmentLength = Math.sqrt(dx*dx + dy*dy);
+            
+            u_list.push(lengthSum);
+            lengthSum += segmentLength;
+        }
+        
+        this.normalizeArray(u_list, lengthSum);
+        this.targetGeometry = geometry;
+        this.lengthCache = u_list;
+    },
+    
+    normalizeArray: function(ls, v) {
+        var len = ls.length;
+        for (var i = 0;i < len;i++) {
+            ls[i] /= v;
+        }
+        
+        return ls;
+    }
+};
+
+
+
 /* 
- * @author https://github.com/zz85 | @blurspline
+ * @author zz85 / https://github.com/zz85
  *
  * tool for "unwrapping" and debugging three.js 
  * geometries UV mapping

+ 111 - 0
examples/misc_uv_tests.html

@@ -0,0 +1,111 @@
+<!DOCTYPE html>
+<html>
+<head>
+<meta charset=utf-8 />
+<title>three.js - uv mapping tests</title>
+<style>
+  article, aside, figure, footer, header, hgroup, 
+  menu, nav, section { display: block; }
+</style>
+  <script src="../build/Three.js"></script>
+  <script src="js/UVsUtils.js"></script>
+
+</head>
+<body>
+  <b id="hello">Doing UV wrap tests here!</b>
+  <i>Please wait while it loads</i>
+  <script>
+/* 
+ * This is to help debug UVs problems in geometry, 
+ * as well as allow a new user to visualize what UVs are about. 
+ */
+
+
+function test(name, geometry) {
+  
+  var d = document.createElement('div');
+  d.innerHTML = '<br><br>' + name + '<br>';
+  d.appendChild(THREE.UVsDebug(geometry));
+  document.body.appendChild(d);
+  
+}
+
+
+test('new THREE.PlaneGeometry( 100, 100, 4, 4 )', new THREE.PlaneGeometry( 100, 100, 4, 4 ));
+test('new THREE.SphereGeometry( 75, 12, 6 )', new THREE.SphereGeometry( 75, 12, 6 ));
+
+test('new THREE.IcosahedronGeometry( 30, 1 )', new THREE.IcosahedronGeometry( 30, 1 ));
+test('new THREE.OctahedronGeometry( 30, 2 )', new THREE.OctahedronGeometry( 30, 2 ));
+
+test('new THREE.CylinderGeometry( 25, 75, 100, 10, 5 )', new THREE.CylinderGeometry( 25, 75, 100, 10, 5 ));
+
+test('new THREE.CubeGeometry( 100, 100, 100, 4, 4, 4 )', new THREE.CubeGeometry( 100, 100, 100, 4, 4, 4 ));
+
+var points = [];
+
+for ( var i = 0; i < 10; i ++ ) {
+
+    points.push( new THREE.Vector3( Math.sin( i * 0.2 ) * 15 + 50, 0, ( i - 5 ) * 2 ) );
+
+}
+
+
+test('new THREE.LatheGeometry( points, 8 )', new THREE.LatheGeometry( points, 8 ));
+test('new THREE.TorusGeometry( 50, 20, 8, 8 )', new THREE.TorusGeometry( 50, 20, 8, 8 ));
+test('new THREE.TorusKnotGeometry( 50, 10, 12, 6 )', new THREE.TorusKnotGeometry( 50, 10, 12, 6 ));
+
+/*
+Not sure how UVs for ExtrudeGeometry are done currently...
+*/
+
+var pts = [], starPoints = 5, l;
+for (i=0; i<starPoints*2;i++) {
+  if (i%2==1) {
+    l = 5;
+  } else {
+    l = 10;
+  }
+
+  var a = i / starPoints * Math.PI;
+  pts.push(new THREE.Vector2(Math.cos(a) * l,Math.sin(a) * l ));
+}
+var starShape = new THREE.Shape(pts);
+var extrudeSettings = { amount: 200,  bevelEnabled: true, bevelSegments: 2, steps: 10 }; 
+
+test('new THREE.ExtrudeGeometry(starShape, extrudeSettings);', new THREE.ExtrudeGeometry(starShape, extrudeSettings));
+
+var uvGenerator = new THREE.UVsUtils.CylinderUVGenerator();
+		testShape = setupShape(8, 3);
+		holeShape = setupShape(8, 2);
+		testShape.holes.push(holeShape);
+
+function setupShape(n, r) {
+		// Make shape
+		var sh = new THREE.Shape();
+		for (var i = 0; i < n;i++) {
+			var method = i ? 'lineTo' : 'moveTo';
+			var a = (i/n) * Math.PI * 2;
+			var x = Math.cos(a) * r;
+			var y = Math.sin(a) * r;
+			sh[method](x, y);
+		}
+
+		return sh;
+	}
+
+var exoption = {
+	bevelEnabled: true,
+	bevelSize: 1,
+	amount: 3,
+	extrudeMaterial: 0,
+	material: 1,
+	uvGenerator: uvGenerator
+};
+
+var geom = testShape.extrude(exoption);
+test('new THREE.ExtrudeGeometry with CylinderUVGenerator;', geom);
+
+
+  </script>
+</body>
+</html>

A különbségek nem kerülnek megjelenítésre, a fájl túl nagy
+ 4 - 72
examples/webgl_geometry_extrude_uvs2.html


Nem az összes módosított fájl került megjelenítésre, mert túl sok fájl változott