<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF
	xmlns="http://purl.org/rss/1.0/"
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel rdf:about="http://feeds.garagegames.com/rss/blogs/developer/88388/">
		<title>Blog for Conor O Kane at GarageGames.com</title>
		<description>Blog feeds for Gamers and Developers in the GarageGames community.</description>
		<link>http://www.garagegames.com/</link>
		<image rdf:resource="http://www.garagegames.com/images/GarageGames_logo_small_w.gif" />
		<dc:date>2008-11-19T22:35:50+00:00</dc:date>
		<items>
			<rdf:Seq>
				<rdf:li rdf:resource="http://www.garagegames.com/blogs/88388/14705"/>
			</rdf:Seq>
		</items>
	</channel>
	<item rdf:about="http://www.garagegames.com/blogs/88388/14705">
		<dc:format>text/html</dc:format>
		<dc:date>2008-05-07T12:32:21+00:00</dc:date>
		<dc:creator>Conor O Kane</dc:creator>
		<title>Converting HSV to RGB color space in Torquescript</title>
		<link>http://www.garagegames.com/blogs/88388/14705</link>
		<description>Here are some torquescript functions to convert colors between RGB and HSV color space. This is useful if you want to change the hue of a graphic while retaining its saturation and brightness.&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;function HSVtoRGB(%hsv)&lt;br&gt;{&lt;br&gt;   // *****************************&lt;br&gt;   // Takes a HSV string with values from 0 to 1 and returns RGB string.&lt;br&gt;   // This is not a perfect conversion, it's based on this algorithm - http://www.tecgraf.puc-rio.br/~mgattass/color/HSVtoRGB.htm&lt;br&gt;   // For a more accurate conversion use the algorithm shown here - http://www.mandelbrot-dazibao.com/HSV/HSV.htm&lt;br&gt;   // Conor O'Kane 2008, cokane.com&lt;br&gt;   // *****************************&lt;br&gt;    &lt;br&gt;   %h = getWord(%hsv, 0);&lt;br&gt;   %s = getWord(%hsv, 1);&lt;br&gt;   %v = getWord(%hsv, 2);&lt;br&gt;        &lt;br&gt;   if (%s == 0)&lt;br&gt;   {&lt;br&gt;       %r = %v;&lt;br&gt;       %g = %v;&lt;br&gt;       %b = %v;&lt;br&gt;   }&lt;br&gt;   else&lt;br&gt;   {&lt;br&gt;       %var_h = %h * 6;&lt;br&gt;       %var_i = mFloor(%var_h);&lt;br&gt;       %var_1 = %v * (1 - %s);&lt;br&gt;       %var_2 = %v * (1 - %s * (%var_h - %var_i));&lt;br&gt;       %var_3 = %v * (1 - %s * (1 - (%var_h - %var_i)));&lt;br&gt;        &lt;br&gt;       switch (%var_i)&lt;br&gt;       {&lt;br&gt;           case 0:&lt;br&gt;               %r = %v;&lt;br&gt;               %g = %var_3;&lt;br&gt;               %b = %var_1;&lt;br&gt;           case 1:&lt;br&gt;               %r = %var_2;&lt;br&gt;               %g = %v;&lt;br&gt;               %b = %var_3;&lt;br&gt;           case 2:&lt;br&gt;               %r = %var_1;&lt;br&gt;               %g = %v;&lt;br&gt;               %b = %var_3;&lt;br&gt;           case 3:&lt;br&gt;               %r = %var_1;&lt;br&gt;               %g = %var_2;&lt;br&gt;               %b = %v;&lt;br&gt;           case 4:&lt;br&gt;               %r = %var_3;&lt;br&gt;               %g = %var_1;&lt;br&gt;               %b = %v;&lt;br&gt;           case 5:&lt;br&gt;               %r = %v;&lt;br&gt;               %g = %var_1;&lt;br&gt;               %b = %var_2;&lt;br&gt;       }&lt;br&gt;   }&lt;br&gt;    &lt;br&gt;   return(%r @ &amp;quot; &amp;quot; @ %g @ &amp;quot; &amp;quot; @ %b);&lt;br&gt;}&lt;br&gt;&lt;br&gt;function RGBtoHSV(%rgb)&lt;br&gt;{&lt;br&gt;   // *****************************&lt;br&gt;   // Takes an RGB string with values from 0 to 1 and returns HSV values from 0 to 1 as a space seperated string.&lt;br&gt;   // Based on this code - http://www.mandelbrot-dazibao.com/HSV/HSV.htm&lt;br&gt;   // Conor O'Kane 2008, cokane.com&lt;br&gt;   // *****************************&lt;br&gt;    &lt;br&gt;   %r = getWord(%rgb, 0);&lt;br&gt;   %g = getWord(%rgb, 1);&lt;br&gt;   %b = getWord(%rgb, 2);&lt;br&gt;        &lt;br&gt;   %var_Min = minimum3(%r, %g, %b);&lt;br&gt;   %var_Max = maximum3(%r, %g, %b);&lt;br&gt;   %del_Max = %var_Max - %var_Min;    // Delta RGB Value&lt;br&gt;    &lt;br&gt;   %v = %var_Max;&lt;br&gt;    &lt;br&gt;   if (%del_Max == 0)&lt;br&gt;   {&lt;br&gt;       %h = 0;&lt;br&gt;       %s = 0;&lt;br&gt;   }&lt;br&gt;   else&lt;br&gt;   {&lt;br&gt;       %del_R = (((%var_Max - %r) / 6) + (%del_Max / 2)) / %del_Max;&lt;br&gt;       %del_G = (((%var_Max - %g) / 6) + (%del_Max / 2)) / %del_Max;&lt;br&gt;       %del_B = (((%var_Max - %b) / 6) + (%del_Max / 2)) / %del_Max;&lt;br&gt;        &lt;br&gt;       %s = %del_Max / %var_Max;&lt;br&gt;       &lt;br&gt;       if (%r == %var_Max)&lt;br&gt;           %h = %del_B - %del_G;&lt;br&gt;       else if (%g == %var_Max)&lt;br&gt;           %h = (1 / 3) + %del_R - %del_B;&lt;br&gt;       else if (%b == %var_Max)&lt;br&gt;           %h = (2 / 3) + %del_G - %del_R;&lt;br&gt;            &lt;br&gt;       if (%h &amp;lt; 0)&lt;br&gt;           %h += 1;&lt;br&gt;       else if (%h &amp;gt; 1)&lt;br&gt;           %h -= 1;&lt;br&gt;   }&lt;br&gt;    &lt;br&gt;   return (%h @ &amp;quot; &amp;quot; @ %s @ &amp;quot; &amp;quot; @ %v);&lt;br&gt;}&lt;br&gt;&lt;br&gt;function minimum3(%a, %b, %c)&lt;br&gt;{&lt;br&gt;   // needed by RGBtoHSV&lt;br&gt;   &lt;br&gt;   if (%a &amp;lt; %b)&lt;br&gt;       %min = %a;&lt;br&gt;   else&lt;br&gt;       %min = %b;&lt;br&gt;       &lt;br&gt;   if (%c &amp;lt; %min)&lt;br&gt;       %min = %c;&lt;br&gt;        &lt;br&gt;   return(%min);&lt;br&gt;}&lt;br&gt;&lt;br&gt;function maximum3(%a, %b, %c)&lt;br&gt;{&lt;br&gt;   // needed by RGBtoHSV&lt;br&gt;   &lt;br&gt;   if (%a &amp;gt; %b)&lt;br&gt;       %max = %a;&lt;br&gt;   else&lt;br&gt;       %max = %b;&lt;br&gt;       &lt;br&gt;   if (%c &amp;gt; %max)&lt;br&gt;       %max = %c;&lt;br&gt;        &lt;br&gt;   return(%max);&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;And here's a function that uses the conversions to rotate the hue of an object:&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;div class='codeblock'&gt;&lt;pre&gt;function rotateHue(%object, %angle)&lt;br&gt;{&lt;br&gt;   // *****************************&lt;br&gt;   // Takes an object and rotates its hue by the angle&lt;br&gt;   // Full hue rotation is 360 degrees&lt;br&gt;   // Conor O'Kane 2008, cokane.com&lt;br&gt;   // *****************************&lt;br&gt;&lt;br&gt;   %rgba = %object.getBlendColor();&lt;br&gt;	&lt;br&gt;   %rgb = getWords(%rgba, 0, 2);&lt;br&gt;   %alpha = getWord(%rgba, 3);&lt;br&gt;    &lt;br&gt;   %hsv = RGBtoHSV(%rgb);&lt;br&gt;   %trueAngle = %angle / 360;&lt;br&gt;   %h = getWord(%hsv, 0);&lt;br&gt;   %hueRotated = %h + %trueAngle;&lt;br&gt;    &lt;br&gt;   if (%hueRotated &amp;lt; 0)&lt;br&gt;       %hueRotated += 1;&lt;br&gt;   else if (%hueRotated &amp;gt; 1)&lt;br&gt;       %hueRotated -= 1;&lt;br&gt;        &lt;br&gt;   %hsv = setWord(%hsv, 0, %hueRotated);&lt;br&gt;   %rgb = HSVtoRGB(%hsv);&lt;br&gt;   %rgba = (%rgb @ &amp;quot; &amp;quot; @ %alpha);&lt;br&gt;            &lt;br&gt;   %object.setBlendColor(%rgba);   &lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;Note that the HSVtoRGB function is slightly lossy due to rounding, so errors will accumulate if you repeatedly  switch from RGB to HSV and back in a loop. This will cause the colors to desaturate eventually. To avoid this, store the object's original RGB values and always modify the hue from those base values, rather than its current RGB color.</description>
	</item>
</rdf:RDF>
