2018-12-08 07:44:06 +08:00

678 lines
14 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace THREE
{
public class Color
{
var ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,
'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,
'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,
'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,
'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,
'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,
'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,
'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,
'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,
'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,
'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,
'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,
'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,
'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,
'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,
'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,
'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,
'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,
'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,
'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,
'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,
'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,
'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,
'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };
public Color(r, g, b )
{
if (g === undefined && b === undefined)
{
// r is THREE.Color, hex or string
return this.set(r);
}
return this.setRGB(r, g, b);
}
isColor: true,
r: 1, g: 1, b: 1,
set: function(value )
{
if (value && value.isColor)
{
this.copy(value);
}
else if (typeof value === 'number')
{
this.setHex(value);
}
else if (typeof value === 'string')
{
this.setStyle(value);
}
return this;
},
setScalar: function(scalar )
{
this.r = scalar;
this.g = scalar;
this.b = scalar;
return this;
},
setHex: function(hex )
{
hex = Math.floor(hex);
this.r = (hex >> 16 & 255) / 255;
this.g = (hex >> 8 & 255) / 255;
this.b = (hex & 255) / 255;
return this;
},
setRGB: function(r, g, b )
{
this.r = r;
this.g = g;
this.b = b;
return this;
},
setHSL: function()
{
function hue2rgb(p, q, t )
{
if (t < 0) t += 1;
if (t > 1) t -= 1;
if (t < 1 / 6) return p + (q - p) * 6 * t;
if (t < 1 / 2) return q;
if (t < 2 / 3) return p + (q - p) * 6 * (2 / 3 - t);
return p;
}
return function setHSL(h, s, l) {
// h,s,l ranges are in 0.0 - 1.0
h = _Math.euclideanModulo(h, 1);
s = _Math.clamp(s, 0, 1);
l = _Math.clamp(l, 0, 1);
if (s === 0)
{
this.r = this.g = this.b = l;
}
else
{
var p = l <= 0.5 ? l * (1 + s) : l + s - (l * s);
var q = (2 * l) - p;
this.r = hue2rgb(q, p, h + 1 / 3);
this.g = hue2rgb(q, p, h);
this.b = hue2rgb(q, p, h - 1 / 3);
}
return this;
};
}
(),
setStyle: function(style )
{
function handleAlpha(string )
{
if (string === undefined) return;
if (parseFloat(string) < 1)
{
console.warn('THREE.Color: Alpha component of ' + style + ' will be ignored.');
}
}
var m;
if (m = /^ ((?: rgb | hsl)a ?)\(\s * ([^\)]*)\)/.exec(style) ) {
// rgb / hsl
var color;
var name = m[1];
var components = m[2];
switch (name)
{
case 'rgb':
case 'rgba':
if (color = /^ (\d +)\s *,\s * (\d +)\s *,\s * (\d +)\s * (,\s * ([0 - 9] *\.?[0-9]+)\s*)?$/.exec(components ) ) {
// rgb(255,0,0) rgba(255,0,0,0.5)
this.r = Math.min( 255, parseInt(color[1], 10 ) ) / 255;
this.g = Math.min( 255, parseInt(color[2], 10 ) ) / 255;
this.b = Math.min( 255, parseInt(color[3], 10 ) ) / 255;
handleAlpha(color[5] );
return this;
}
if (color = /^(\d+)\%\s*,\s* (\d+)\%\s*,\s* (\d+)\%\s* (,\s* ([0 - 9]*\.?[0 - 9]+)\s*)?$/.exec(components ) ) {
// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)
this.r = Math.min(100, parseInt(color[1], 10)) / 100;
this.g = Math.min(100, parseInt(color[2], 10)) / 100;
this.b = Math.min(100, parseInt(color[3], 10)) / 100;
handleAlpha(color[5] );
return this;
}
break;
case 'hsl':
case 'hsla':
if (color = /^([0 - 9]*\.?[0 - 9]+)\s*,\s* (\d+)\%\s*,\s* (\d+)\%\s* (,\s* ([0 - 9]*\.?[0 - 9]+)\s*)?$/.exec(components ) ) {
// hsl(120,50%,50%) hsla(120,50%,50%,0.5)
var h = parseFloat(color[1]) / 360;
var s = parseInt(color[2], 10) / 100;
var l = parseInt(color[3], 10) / 100;
handleAlpha(color[5] );
return this.setHSL(h, s, l);
}
break;
}
} else if (m = /^\#([A-Fa-f0-9]+)$/.exec( style ) ) {
// hex color
var hex = m[1];
var size = hex.length;
if (size === 3 ) {
// #ff0
this.r = parseInt(hex.charAt(0) + hex.charAt(0), 16) / 255;
this.g = parseInt(hex.charAt(1) + hex.charAt(1), 16) / 255;
this.b = parseInt(hex.charAt(2) + hex.charAt(2), 16) / 255;
return this;
} else if (size === 6 ) {
// #ff0000
this.r = parseInt(hex.charAt(0) + hex.charAt(1), 16) / 255;
this.g = parseInt(hex.charAt(2) + hex.charAt(3), 16) / 255;
this.b = parseInt(hex.charAt(4) + hex.charAt(5), 16) / 255;
return this;
}
}
if (style && style.length > 0 ) {
// color keywords
var hex = ColorKeywords[style];
if (hex !== undefined ) {
// red
this.setHex(hex );
} else {
// unknown color
console.warn( 'THREE.Color: Unknown color ' + style );
}
}
return this;
},
clone: function()
{
return new this.constructor(this.r, this.g, this.b);
},
copy: function(color )
{
this.r = color.r;
this.g = color.g;
this.b = color.b;
return this;
},
copyGammaToLinear: function(color, gammaFactor )
{
if (gammaFactor === undefined) gammaFactor = 2.0;
this.r = Math.pow(color.r, gammaFactor);
this.g = Math.pow(color.g, gammaFactor);
this.b = Math.pow(color.b, gammaFactor);
return this;
},
copyLinearToGamma: function(color, gammaFactor )
{
if (gammaFactor === undefined) gammaFactor = 2.0;
var safeInverse = (gammaFactor > 0) ? (1.0 / gammaFactor) : 1.0;
this.r = Math.pow(color.r, safeInverse);
this.g = Math.pow(color.g, safeInverse);
this.b = Math.pow(color.b, safeInverse);
return this;
},
convertGammaToLinear: function(gammaFactor )
{
this.copyGammaToLinear(this, gammaFactor);
return this;
},
convertLinearToGamma: function(gammaFactor )
{
this.copyLinearToGamma(this, gammaFactor);
return this;
},
copySRGBToLinear: function()
{
function SRGBToLinear(c )
{
return (c < 0.04045) ? c * 0.0773993808 : Math.pow(c * 0.9478672986 + 0.0521327014, 2.4);
}
return function copySRGBToLinear(color) {
this.r = SRGBToLinear(color.r);
this.g = SRGBToLinear(color.g);
this.b = SRGBToLinear(color.b);
return this;
};
}
(),
copyLinearToSRGB: function()
{
function LinearToSRGB(c )
{
return (c < 0.0031308) ? c * 12.92 : 1.055 * (Math.pow(c, 0.41666)) - 0.055;
}
return function copyLinearToSRGB(color) {
this.r = LinearToSRGB(color.r);
this.g = LinearToSRGB(color.g);
this.b = LinearToSRGB(color.b);
return this;
};
}
(),
convertSRGBToLinear: function()
{
this.copySRGBToLinear(this);
return this;
},
convertLinearToSRGB: function()
{
this.copyLinearToSRGB(this);
return this;
},
getHex: function()
{
return (this.r * 255) << 16 ^ (this.g * 255) << 8 ^ (this.b * 255) << 0;
},
getHexString: function()
{
return ('000000' + this.getHex().toString(16)).slice(-6);
},
getHSL: function(target )
{
// h,s,l ranges are in 0.0 - 1.0
if (target === undefined)
{
console.warn('THREE.Color: .getHSL() target is now required');
target = { h: 0, s: 0, l: 0 };
}
var r = this.r, g = this.g, b = this.b;
var max = Math.max(r, g, b);
var 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;
saturation = lightness <= 0.5 ? delta / (max + min) : delta / (2 - max - min);
switch (max)
{
case r: hue = (g - b) / delta + (g < b ? 6 : 0); break;
case g: hue = (b - r) / delta + 2; break;
case b: hue = (r - g) / delta + 4; break;
}
hue /= 6;
}
target.h = hue;
target.s = saturation;
target.l = lightness;
return target;
},
getStyle: function()
{
return 'rgb(' + ((this.r * 255) | 0) + ',' + ((this.g * 255) | 0) + ',' + ((this.b * 255) | 0) + ')';
},
offsetHSL: function()
{
var hsl = { };
return function(h, s, l) {
this.getHSL(hsl);
hsl.h += h; hsl.s += s; hsl.l += l;
this.setHSL(hsl.h, hsl.s, hsl.l);
return this;
};
}
(),
add: function(color )
{
this.r += color.r;
this.g += color.g;
this.b += color.b;
return this;
},
addColors: function(color1, color2 )
{
this.r = color1.r + color2.r;
this.g = color1.g + color2.g;
this.b = color1.b + color2.b;
return this;
},
addScalar: function(s )
{
this.r += s;
this.g += s;
this.b += s;
return this;
},
sub: function(color )
{
this.r = Math.max(0, this.r - color.r);
this.g = Math.max(0, this.g - color.g);
this.b = Math.max(0, this.b - color.b);
return this;
},
multiply: function(color )
{
this.r *= color.r;
this.g *= color.g;
this.b *= color.b;
return this;
},
multiplyScalar: function(s )
{
this.r *= s;
this.g *= s;
this.b *= s;
return this;
},
lerp: function(color, alpha )
{
this.r += (color.r - this.r) * alpha;
this.g += (color.g - this.g) * alpha;
this.b += (color.b - this.b) * alpha;
return this;
},
lerpHSL: function()
{
var hslA = { h: 0, s: 0, l: 0 };
var hslB = { h: 0, s: 0, l: 0 };
return function lerpHSL(color, alpha )
{
this.getHSL(hslA);
color.getHSL(hslB);
var h = _Math.lerp(hslA.h, hslB.h, alpha);
var s = _Math.lerp(hslA.s, hslB.s, alpha);
var l = _Math.lerp(hslA.l, hslB.l, alpha);
this.setHSL(h, s, l);
return this;
};
}(),
equals: function(c )
{
return (c.r === this.r) && (c.g === this.g) && (c.b === this.b);
},
fromArray: function(array, offset )
{
if (offset === undefined) offset = 0;
this.r = array[offset];
this.g = array[offset + 1];
this.b = array[offset + 2];
return this;
},
toArray: function(array, offset )
{
if (array === undefined) array = [];
if (offset === undefined) offset = 0;
array[offset] = this.r;
array[offset + 1] = this.g;
array[offset + 2] = this.b;
return array;
},
toJSON: function()
{
return this.getHex();
}
}
}