소스 검색

Vector.fromArray and Vector.toColorHSL

trethaller 7 년 전
부모
커밋
d4cbe80fba
1개의 변경된 파일31개의 추가작업 그리고 0개의 파일을 삭제
  1. 31 0
      h3d/Vector.hx

+ 31 - 0
h3d/Vector.hx

@@ -231,9 +231,40 @@ class Vector {
 		return (Std.int(a.clamp() * 255 + 0.499) << 24) | (Std.int(r.clamp() * 255 + 0.499) << 16) | (Std.int(g.clamp() * 255 + 0.499) << 8) | Std.int(b.clamp() * 255 + 0.499);
 	}
 
+	public function toColorHSL() {
+	    var max = hxd.Math.max(hxd.Math.max(r, g), b);
+		var min = hxd.Math.min(hxd.Math.min(r, g), b);
+		var h, s, l = (max + min) / 2.0;
+
+		if(max == min)
+			h = s = 0.0; // achromatic
+		else {
+			var d = max - min;
+			s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
+			if(max == r) 
+				h = (g - b) / d + (g < b ? 6.0 : 0.0);
+			else if(max == g)
+				h = (b - r) / d + 2.0;
+			else
+				h = (r - g) / d + 4.0;
+			h *= Math.PI / 3.0;
+		}
+
+		return new h3d.Vector(h, s, l, a);
+	}
+
 	public static inline function fromColor( c : Int, scale : Float = 1.0 ) {
 		var s = scale / 255;
 		return new Vector(((c>>16)&0xFF)*s,((c>>8)&0xFF)*s,(c&0xFF)*s,(c >>> 24)*s);
 	}
 
+	public static inline function fromArray(a : Array<Float>) {
+		var r = new Vector();
+		if(a.length > 0) r.x = a[0];
+		if(a.length > 1) r.y = a[1];
+		if(a.length > 2) r.z = a[2];
+		if(a.length > 3) r.w = a[3];
+		return r;
+	}
+
 }