Bläddra i källkod

bugfix: less indices, fixed ray for bottom point

ncannasse 8 år sedan
förälder
incheckning
d2f3f91f7d
1 ändrade filer med 25 tillägg och 15 borttagningar
  1. 25 15
      h3d/prim/Sphere.hx

+ 25 - 15
h3d/prim/Sphere.hx

@@ -11,32 +11,42 @@ class Sphere extends Polygon {
 		this.ray = ray;
 		this.segsH = segsH;
 		this.segsW = segsW;
-		var t = 0., dt = Math.PI / segsH, dp = Math.PI * 2 / segsW;
+
+		var dp = Math.PI * 2 / segsW;
 		var pts = [], idx = new hxd.IndexBuffer();
 		var dx = 1, dy = segsW + 1;
-		for( y in 0...segsH ) {
-			var p = 0.;
+		for( y in 0...segsH+1 ) {
+			var t = (y / segsH) * Math.PI;
 			var st = Math.sin(t);
 			var pz = Math.cos(t);
-			for( x in 0...segsW + 1 ) {
+			var p = 0.;
+			for( x in 0...segsW+1 ) {
 				var px = st * Math.cos(p);
 				var py = st * Math.sin(p);
 				var i = pts.length;
 				pts.push(new Point(px * ray, py * ray, pz * ray));
 				p += dp;
-				if( x != segsW ) {
-					idx.push(i);
-					idx.push(i + dy);
-					idx.push(i + dx);
-					idx.push(i + dy);
-					idx.push(i + dx + dy);
-					idx.push(i + dx);
-				}
 			}
-			t += dt;
 		}
-		for( x in 0...segsW + 1 )
-			pts.push(new Point(0, 0, -1));
+		for( y in 0...segsH )
+			for( x in 0...segsW ) {
+				inline function vertice(x, y) return x + y * (segsW + 1);
+				var v1 = vertice(x + 1, y);
+				var v2 = vertice(x, y);
+				var v3 = vertice(x, y + 1);
+				var v4 = vertice(x + 1, y + 1);
+				if( y != 0 ) {
+					idx.push(v1);
+					idx.push(v2);
+					idx.push(v4);
+				}
+				if( y != segsH - 1 ) {
+					idx.push(v2);
+					idx.push(v3);
+					idx.push(v4);
+				}
+			}
+
 		super(pts, idx);
 	}