2
0
Эх сурвалжийг харах

Merge remote-tracking branch 'pksunkara/dev' into dev

Mr.doob 12 жил өмнө
parent
commit
af5b9786cf
2 өөрчлөгдсөн 139 нэмэгдсэн , 4 устгасан
  1. 117 1
      src/math/Color.js
  2. 22 3
      test/unit/math/Color.js

+ 117 - 1
src/math/Color.js

@@ -52,6 +52,61 @@ THREE.extend( THREE.Color.prototype, {
 
 	},
 
+	setHSL: function ( h, s, l ) {
+
+		// h,s,l ranges are in 0.0 - 1.0
+
+		var f = function ( v1, v2, vh ) {
+			var r;
+
+			if ( vh < 0 ) {
+				vh += 1;
+			}
+
+			if ( vh > 1 ) {
+				vh -= 1;
+			}
+
+			if ( vh < 1.0/6 ) {
+				r = v1 + ( v2 - v1 ) * 6 * vh;
+			} else if ( vh < 1.0/2 ) {
+				r = v2;
+			} else if ( vh < 2.0/3 ) {
+				r = v1 + ( v2 - v1 ) * 6 * ( 2.0/3 - vh );
+			} else {
+				r = v1;
+			}
+
+			return r;
+
+		};
+
+		if ( s === 0 ) {
+
+			this.r = this.g = this.b = l;
+
+		} else {
+
+			var p, q;
+
+			if ( l <= 0.5 ) {
+				p = l * ( 1.0 + s );
+			} else {
+				p = l + s - ( l * s );
+			}
+
+			q = ( 2.0 * l ) - p;
+
+			this.r = f( q, p, h + 1.0/3 );
+			this.g = f( q, p, h );
+			this.b = f( q, p, h - 1.0/3 );
+
+		}
+
+		return this;
+
+	},
+
 	setHSV: function ( h, s, v ) {
 
 		// based on MochiKit implementation by Bob Ippolito
@@ -248,7 +303,68 @@ THREE.extend( THREE.Color.prototype, {
 
 	getStyle: function () {
 
-		return 'rgb(' + ( ( this.r * 255 ) | 0 )  + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';
+		return 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';
+
+	},
+
+	getHSL: function (hsl) {
+
+		// h,s,l ranges are in 0.0 - 1.0
+
+		var r = this.r;
+		var g = this.g;
+		var b = this.b;
+
+		var max = Math.max( Math.max( r, g ), b );
+		var min = Math.min( Math.min( r, g ), b );
+
+		var hue, saturation;
+		var lightness = ( min + max ) / 2.0;
+
+		if ( min === max ) {
+
+			hue = 0;
+			saturation = 0;
+
+		} else {
+
+			var delta = max - min;
+
+			if ( lightness <= 0.5 ) {
+				saturation = delta / ( max + min );
+			} else {
+				saturation = delta / ( 2 - max - min );
+			}
+
+			if ( r == max ) {
+				hue = ( g - b ) / delta;
+			} else if ( g == max ) {
+				hue = 2 + ( ( b - r ) / delta );
+			} else {
+				hue = 4 + ( ( r - g ) / delta );
+			}
+
+			hue /= 6;
+
+			if ( hue < 0 ) {
+				hue += 1;
+			}
+
+			if ( hue > 1 ) {
+				hue -= 1;
+			}
+
+		}
+
+		if ( hsl === undefined ) {
+			hsl = { h: 0, s: 0, l: 0 };
+		}
+
+		hsl.h = hue;
+		hsl.s = saturation;
+		hsl.l = lightness;
+
+		return hsl;
 
 	},
 

+ 22 - 3
test/unit/math/Color.js

@@ -157,13 +157,32 @@ test( "getHexString", function(){
 });
 
 test( "getStyle", function(){
-    var c = new THREE.Color('plum');    
+    var c = new THREE.Color('plum');
     var res = c.getStyle();
     ok( res == 'rgb(221,160,221)', "style: " + res );
 });
 
+test( "getHSL", function () {
+    var c = new THREE.Color( 0x80ffff );
+    var hsl = c.getHSL();
+
+    ok( hsl.h == 0.5, "hue: " + hsl.h );
+    ok( hsl.s == 1.0, "saturation: " + hsl.s );
+    ok( (Math.round(parseFloat(hsl.l)*100)/100) == 0.75, "lightness: " + hsl.l );
+});
+
+test( "setHSL", function () {
+    var c = new THREE.Color();
+    c.setHSL(0.75, 1.0, 0.25);
+    var hsl = c.getHSL();
+
+    ok( hsl.h == 0.75, "hue: " + hsl.h );
+    ok( hsl.s == 1.00, "saturation: " + hsl.s );
+    ok( hsl.l == 0.25, "lightness: " + hsl.l );
+});
+
 test( "getHSV", function(){
-    var c = new THREE.Color('maroon');    
+    var c = new THREE.Color('maroon');
     var hsv = c.getHSV();
 
     ok( hsv.h == 0, "hue: " + hsv.h );
@@ -173,7 +192,7 @@ test( "getHSV", function(){
 });
 
 test( "setHSV", function(){
-    var c = new THREE.Color();    
+    var c = new THREE.Color();
     c.setHSV(0, 1, 1);
     var hsv = c.getHSV();
     ok( hsv.h == 0, "hue: " + hsv.h );