Update svn properties, formatting cleanup.

This commit is contained in:
Jeff Ames
2008-08-28 14:41:54 +00:00
parent 086284da55
commit 3bf8858727
37 changed files with 505 additions and 709 deletions

View File

@@ -1537,7 +1537,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney
{
GetClientFunds(client);
lock(m_KnownClientFunds)
lock (m_KnownClientFunds)
{
if (!m_KnownClientFunds.ContainsKey(client.AgentId))
return 0;
@@ -1570,7 +1570,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney
int funds = m_KnownClientFunds[remoteClient.AgentId];
if(salePrice != 0 && funds < salePrice)
if (salePrice != 0 && funds < salePrice)
{
remoteClient.SendAgentAlertMessage("Unable to buy now. You don't have sufficient funds.", false);
return;
@@ -1584,7 +1584,7 @@ namespace OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney
remoteClient.SendAgentAlertMessage("Unable to buy now. The object was not found.", false);
return;
}
doMoneyTransfer(remoteClient.AgentId, part.OwnerID, salePrice, 5000, "Object buy");
s.PerformObjectBuy(remoteClient, categoryID, localID, saleType);

View File

@@ -83,16 +83,13 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
public bool visible_to_parent;
}
public class OpenGridProtocolModule : IRegionModule
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private List<Scene> m_scene = new List<Scene>();
private Dictionary<string, AgentCircuitData> CapsLoginID = new Dictionary<string, AgentCircuitData>();
private Dictionary<LLUUID, OGPState> m_OGPState = new Dictionary<LLUUID, OGPState>();
#region IRegionModule Members
@@ -134,7 +131,7 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
m_log.Error("[OGP]: Certificate validation handler change not supported. You may get ssl certificate validation errors teleporting from your region to some SSL regions.");
}
}
}
if (!m_scene.Contains(scene))
@@ -217,15 +214,12 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
m_log.WarnFormat("[REQUESTREZAVATAR]: {0}", request.ToString());
LLSDMap requestMap = (LLSDMap)request;
Scene homeScene = GetRootScene();
if (homeScene == null)
return GenerateNoHandlerMessage();
RegionInfo reg = homeScene.RegionInfo;
ulong regionhandle = GetOSCompatibleRegionHandle(reg);
//string RegionURI = reg.ServerURI;
@@ -234,14 +228,13 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
LLUUID RemoteAgentID = requestMap["agent_id"].AsUUID();
// will be used in the future. The client always connects with the aditi agentid currently
LLUUID LocalAgentID = RemoteAgentID;
LLUUID LocalAgentID = RemoteAgentID;
string FirstName = requestMap["first_name"].AsString();
string LastName = requestMap["last_name"].AsString();
OGPState userState = GetOGPState(LocalAgentID);
userState.first_name = requestMap["first_name"].AsString();
userState.last_name = requestMap["last_name"].AsString();
userState.age_verified = requestMap["age_verified"].AsBoolean();
@@ -268,7 +261,7 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
responseMap["region_Y"] = LLSD.FromInteger(reg.RegionLocY * (uint)Constants.RegionSize); // LLY
responseMap["region_id"] = LLSD.FromUUID(reg.originRegionID);
responseMap["sim_access"] = LLSD.FromString((reg.RegionSettings.Maturity == 1) ? "Mature" : "PG");
// Generate a dummy agent for the user so we can get back a CAPS path
AgentCircuitData agentData = new AgentCircuitData();
agentData.AgentID = LocalAgentID;
@@ -299,7 +292,6 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
useragent.SecureSessionID=agentData.SecureSessionID;
useragent.SessionID = agentData.SessionID;
UserProfileData userProfile = new UserProfileData();
userProfile.AboutText = "OGP User";
userProfile.CanDoMask = (uint)0;
@@ -338,15 +330,13 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
// Do caps registration
// get seed cap
// Stick our data in the cache so the region will know something about us
homeScene.CommsManager.UserProfileCacheService.PreloadUserCache(agentData.AgentID, userProfile);
// Call 'new user' event handler
homeScene.NewUserConnection(reg.RegionHandle, agentData);
//string raCap = string.Empty;
LLUUID AvatarRezCapUUID = LLUUID.Random();
@@ -379,16 +369,16 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
public LLSD RezAvatarMethod(string path, LLSD request)
{
m_log.WarnFormat("[REZAVATAR]: {0}", request.ToString());
LLSDMap responseMap = new LLSDMap();
AgentCircuitData userData = null;
// Only people we've issued a cap can go further
if (TryGetAgentCircuitData(path,out userData))
{
LLSDMap requestMap = (LLSDMap)request;
// take these values to start. There's a few more
LLUUID SecureSessionID=requestMap["secure_session_id"].AsUUID();
LLUUID SessionID = requestMap["session_id"].AsUUID();
@@ -419,7 +409,7 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
if (item.ContainsKey("parent_estate_id"))
{
parentEstateID = item["parent_estate_id"].AsInteger();
}
if (item.ContainsKey("region_id"))
{
@@ -437,11 +427,11 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
// Locate a home scene suitable for the user.
Scene homeScene = GetRootScene();
if (homeScene != null)
{
// Get a reference to their Cap object so we can pull out the capobjectroot
OpenSim.Framework.Communications.Capabilities.Caps userCap =
OpenSim.Framework.Communications.Capabilities.Caps userCap =
homeScene.GetCapsHandlerForUser(userData.AgentID);
//Update the circuit data in the region so this user is authorized
@@ -470,7 +460,7 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
userState.region_id = regionID;
userState.src_parent_estate_id = parentEstateID;
userState.visible_to_parent = visibleToParent;
// Save state changes
UpdateOGPState(userData.AgentID, userState);
@@ -481,8 +471,8 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
LLSDArray PositionArray = new LLSDArray();
PositionArray.Add(LLSD.FromInteger(128));
PositionArray.Add(LLSD.FromInteger(128));
PositionArray.Add(LLSD.FromInteger(40));
PositionArray.Add(LLSD.FromInteger(40));
LLSDArray LookAtArray = new LLSDArray();
LookAtArray.Add(LLSD.FromInteger(1));
LookAtArray.Add(LLSD.FromInteger(1));
@@ -503,44 +493,36 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
responseMap["seed_capability"] = LLSD.FromString("http://" + reg.ExternalHostName + ":" + reg.HttpPort + "/CAPS/" + userCap.CapsObjectPath + "0000/");
responseMap["region"] = LLSD.FromUUID(reg.originRegionID);
responseMap["look_at"] = LookAtArray;
responseMap["sim_port"] = LLSD.FromInteger(reg.InternalEndPoint.Port);
responseMap["sim_host"] = LLSD.FromString(Util.GetHostFromDNS(reg.ExternalHostName).ToString());// + ":" + reg.InternalEndPoint.Port.ToString());
responseMap["sim_ip"] = LLSD.FromString(Util.GetHostFromDNS(reg.ExternalHostName).ToString());
responseMap["session_id"] = LLSD.FromUUID(SessionID);
responseMap["secure_session_id"] = LLSD.FromUUID(SecureSessionID);
responseMap["circuit_code"] = LLSD.FromInteger(circuitcode);
responseMap["position"] = PositionArray;
responseMap["region_id"] = LLSD.FromUUID(reg.originRegionID);
responseMap["sim_access"] = LLSD.FromString("Mature");
responseMap["connect"] = LLSD.FromBoolean(true);
m_log.InfoFormat("[OGP]: host: {0}, IP {1}", responseMap["sim_host"].ToString(), responseMap["sim_ip"].ToString());
}
}
return responseMap;
return responseMap;
}
public LLSD DerezAvatarMethod(string path, LLSD request)
{
m_log.ErrorFormat("DerezPath: {0}, Request: {1}", path, request.ToString());
//LLSD llsdResponse = null;
LLSDMap responseMap = new LLSDMap();
string[] PathArray = path.Split('/');
m_log.InfoFormat("[OGP]: prefix {0}, uuid {1}, suffix {2}", PathArray[1], PathArray[2], PathArray[3]);
@@ -549,17 +531,15 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
LLUUID userUUID = LLUUID.Zero;
if (Helpers.TryParse(uuidString, out userUUID))
{
LLUUID RemoteID = uuidString;
LLUUID LocalID = RemoteID;
// FIXME: TODO: Routine to map RemoteUUIDs to LocalUUIds
// would be done already.. but the client connects with the Aditi UUID
// would be done already.. but the client connects with the Aditi UUID
// regardless over the UDP stack
OGPState userState = GetOGPState(LocalID);
if (userState.agent_id != LLUUID.Zero)
{
//LLSDMap outboundRequestMap = new LLSDMap();
LLSDMap inboundRequestMap = (LLSDMap)request;
string rezAvatarString = inboundRequestMap["rez_avatar"].AsString();
@@ -569,12 +549,11 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
LookAtArray.Add(LLSD.FromInteger(1));
LookAtArray.Add(LLSD.FromInteger(1));
LLSDArray PositionArray = new LLSDArray();
PositionArray.Add(LLSD.FromInteger(128));
PositionArray.Add(LLSD.FromInteger(128));
PositionArray.Add(LLSD.FromInteger(40));
LLSDArray lookArray = new LLSDArray();
lookArray.Add(LLSD.FromInteger(128));
lookArray.Add(LLSD.FromInteger(128));
@@ -582,11 +561,11 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
responseMap["connect"] = LLSD.FromBoolean(true);// it's okay to give this user up
responseMap["look_at"] = LookAtArray;
m_log.WarnFormat("[OGP]: Invoking rez_avatar on host:{0} for avatar: {1} {2}", rezAvatarString, userState.first_name, userState.last_name);
LLSDMap rezResponseMap = invokeRezAvatarCap(responseMap, rezAvatarString,userState);
// If invoking it returned an error, parse and end
if (rezResponseMap.ContainsKey("connect"))
{
@@ -599,17 +578,16 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
string rezRespSeedCap = rezResponseMap["seed_capability"].AsString();
string rezRespSim_ip = rezResponseMap["sim_ip"].AsString();
string rezRespSim_host = rezResponseMap["sim_host"].AsString();
int rrPort = rezResponseMap["sim_port"].AsInteger();
int rrX = rezResponseMap["region_x"].AsInteger();
int rrY = rezResponseMap["region_y"].AsInteger();
m_log.ErrorFormat("X:{0}, Y:{1}", rrX, rrY);
LLUUID rrRID = rezResponseMap["region_id"].AsUUID();
string rrAccess = rezResponseMap["sim_access"].AsString();
LLSDArray RezResponsePositionArray = (LLSDArray)rezResponseMap["position"];
responseMap["seed_capability"] = LLSD.FromString(rezRespSeedCap);
responseMap["sim_ip"] = LLSD.FromString(Util.GetHostFromDNS(rezRespSim_ip).ToString());
@@ -619,23 +597,17 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
responseMap["region_y"] = LLSD.FromInteger(rrY );
responseMap["region_id"] = LLSD.FromUUID(rrRID);
responseMap["sim_access"] = LLSD.FromString(rrAccess);
responseMap["position"] = RezResponsePositionArray;
responseMap["look_at"] = lookArray;
responseMap["connect"] = LLSD.FromBoolean(true);
ShutdownConnection(LocalID,this);
m_log.Warn("RESPONSEDEREZ: " + responseMap.ToString());
return responseMap;
}
else
else
{
return GenerateNoHandlerMessage();
}
}
@@ -649,20 +621,18 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
private LLSDMap invokeRezAvatarCap(LLSDMap responseMap, string CapAddress, OGPState userState)
{
Scene reg = GetRootScene();
WebRequest DeRezRequest = WebRequest.Create(CapAddress);
DeRezRequest.Method = "POST";
DeRezRequest.ContentType = "application/xml+llsd";
LLSDMap RAMap = new LLSDMap();
LLSDMap AgentParms = new LLSDMap();
LLSDMap RegionParms = new LLSDMap();
LLSDArray Parameter = new LLSDArray(2);
LLSDMap version = new LLSDMap();
version["version"] = LLSD.FromInteger(userState.src_version);
Parameter.Add((LLSD)version);
@@ -673,7 +643,7 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
SrcData["region_id"] = LLSD.FromUUID(reg.RegionInfo.originRegionID);
SrcData["visible_to_parent"] = LLSD.FromBoolean(userState.visible_to_parent);
Parameter.Add((LLSD)SrcData);
AgentParms["first_name"] = LLSD.FromString(userState.first_name);
AgentParms["last_name"] = LLSD.FromString(userState.last_name);
AgentParms["agent_id"] = LLSD.FromUUID(userState.agent_id);
@@ -689,13 +659,12 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
AgentParms["age_verified"] = LLSD.FromBoolean(userState.age_verified);
AgentParms["limited_to_estate"] = LLSD.FromInteger(userState.limited_to_estate);
AgentParms["inventory_host"] = LLSD.FromString(userState.inventory_host);
// version 1
// version 1
RAMap = AgentParms;
// Planned for version 2
// RAMap["agent_params"] = AgentParms;
RAMap["region_params"] = RegionParms;
RAMap["parameter"] = Parameter;
@@ -770,15 +739,13 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
return responseMap;
}
public LLSD GenerateNoHandlerMessage()
{
LLSDMap map = new LLSDMap();
map["reason"] = LLSD.FromString("LLSDRequest");
map["message"] = LLSD.FromString("No handler registered for LLSD Requests");
map["login"] = LLSD.FromString("false");
return map;
}
@@ -802,7 +769,6 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
CapsLoginID.Remove(path);
}
private Scene GetRootScene()
{
Scene ReturnScene = null;
@@ -815,9 +781,8 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
}
return ReturnScene;
}
private ulong GetOSCompatibleRegionHandle(RegionInfo reg)
{
return Util.UIntsToLong(reg.RegionLocX, reg.RegionLocY);
@@ -849,7 +814,7 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
returnState.src_version = 1;
returnState.src_parent_estate_id = 1;
returnState.visible_to_parent = true;
return returnState;
}
@@ -871,9 +836,10 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
public void DeleteOGPState(LLUUID agentId)
{
lock (m_OGPState)
{
if (m_OGPState.ContainsKey(agentId))
m_OGPState.Remove(agentId);
}
}
private void UpdateOGPState(LLUUID agentId, OGPState state)
@@ -884,12 +850,13 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
{
m_OGPState[agentId] = state;
}
else
else
{
m_OGPState.Add(agentId,state);
}
}
}
public void ShutdownConnection(LLUUID avatarId, OpenGridProtocolModule mod)
{
Scene homeScene = GetRootScene();
@@ -903,22 +870,17 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
ta.Start();
}
}
// Temporary hack to allow teleporting to and from Vaak
private static bool customXertificateValidation(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error)
{
//if (cert.Subject == "E=root@lindenlab.com, CN=*.vaak.lindenlab.com, O=\"Linden Lab, Inc.\", L=San Francisco, S=California, C=US")
//{
return true;
//}
//return false;
}
}
public class KillAUser
@@ -944,7 +906,7 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
avToBeKilled.ControllingClient.SendLogoutPacketWhenClosing = false;
Thread.Sleep(30000);
// test for child agent because they might have come back
if (avToBeKilled.IsChildAgent)
{
@@ -953,12 +915,10 @@ namespace OpenSim.Region.Environment.Modules.InterGrid
}
}
}
}
public class MonoCert : ICertificatePolicy
{
#region ICertificatePolicy Members
public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem)

View File

@@ -59,7 +59,7 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
/// Path for terrains. Technically these may be assets, but I think it's quite nice to split them out.
/// </summary>
public static readonly string TERRAINS_PATH = "terrains/";
/// <summary>
/// The character the separates the uuid from extension information in an archived asset filename
/// </summary>

View File

@@ -212,16 +212,16 @@ namespace OpenSim.Region.Environment.Modules.World.Archiver
// Right now we're nastily obtaining the lluuid from the filename
string filename = assetPath.Remove(0, ArchiveConstants.ASSETS_PATH.Length);
int i = filename.LastIndexOf(ArchiveConstants.ASSET_EXTENSION_SEPARATOR);
if (i == -1)
{
m_log.ErrorFormat(
"[ARCHIVER]: Could not find extension information in asset path {0} since it's missing the separator {1}. Skipping",
assetPath, ArchiveConstants.ASSET_EXTENSION_SEPARATOR);
return false;
}
string extension = filename.Substring(i);
string uuid = filename.Remove(filename.Length - extension.Length);

View File

@@ -315,13 +315,13 @@ namespace OpenSim.Region.Environment.Modules.World.NPC
public event RegionHandleRequest OnRegionHandleRequest;
public event ParcelInfoRequest OnParcelInfoRequest;
public event ActivateGesture OnActivateGesture;
public event ActivateGesture OnActivateGesture;
public event DeactivateGesture OnDeactivateGesture;
#pragma warning restore 67
#endregion
public void ActivateGesture(LLUUID assetId, LLUUID gestureId)
{
}

View File

@@ -103,7 +103,7 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
Bitmap mapbmp = new Bitmap(256, 256);
//long t = System.Environment.TickCount;
//for(int i = 0; i < 10; ++i) {
//for (int i = 0; i < 10; ++i) {
terrainRenderer.TerrainToBitmap(mapbmp);
//}
//t = System.Environment.TickCount - t;

View File

@@ -97,8 +97,6 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
// No, that doesn't scale it:
// heightvalue = low + mid * (heightvalue - low) / mid; => low + (heightvalue - low) * mid / mid = low + (heightvalue - low) * 1 = low + heightvalue - low = heightvalue
if (Single.IsInfinity(heightvalue) || Single.IsNaN(heightvalue))
heightvalue = 0;
else if (heightvalue > 255f)
@@ -136,7 +134,7 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
int hfdiffi = 0;
int hfdiffihighlight = 0;
float highlightfactor = 0.18f;
try
{
// hfdiffi = Math.Abs((int)((hfdiff * 4) + (hfdiff * 0.5))) + 1;
@@ -146,7 +144,7 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
// hfdiffi = hfdiffi + Math.Abs((int)(((hfdiff % 1) * 0.5f) * 10f) - 1);
hfdiffi = hfdiffi + Math.Abs((int)((hfdiff % 1f) * 5f) - 1);
}
hfdiffihighlight = Math.Abs((int)((hfdiff * highlightfactor) * 4.5f)) + 1;
if (hfdiff % 1f != 0)
{
@@ -195,10 +193,9 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
color = Color.FromArgb((r - hfdiffi > 0) ? r - hfdiffi : 0,
(g - hfdiffi > 0) ? g - hfdiffi : 0,
(b - hfdiffi > 0) ? b - hfdiffi : 0);
mapbmp.SetPixel(x-1, yr+1, color);
}
}
}
}
@@ -213,7 +210,6 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
color = Color.Black;
mapbmp.SetPixel(x, yr, color);
}
}
else
{

View File

@@ -82,10 +82,10 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
// (for info about algorithm, see http://en.wikipedia.org/wiki/HSL_and_HSV)
public Color toColor()
{
if(s < 0f) Console.WriteLine("S < 0: " + s);
else if(s > 1f) Console.WriteLine("S > 1: " + s);
if(v < 0f) Console.WriteLine("V < 0: " + v);
else if(v > 1f) Console.WriteLine("V > 1: " + v);
if (s < 0f) Console.WriteLine("S < 0: " + s);
else if (s > 1f) Console.WriteLine("S > 1: " + s);
if (v < 0f) Console.WriteLine("V < 0: " + v);
else if (v > 1f) Console.WriteLine("V > 1: " + v);
float f = h / 60f;
int sector = (int)f % 6;
@@ -95,7 +95,7 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
int ti = (int)(v * (1f - (1f - f) * s) * 255f);
int vi = (int)(v * 255f);
switch(sector)
switch (sector)
{
case 0:
return Color.FromArgb(vi, ti, pi);
@@ -168,7 +168,7 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
{
AssetBase asset = m_scene.AssetCache.GetAsset(id, true);
m_log.DebugFormat("Fetched texture {0}, found: {1}", id, asset != null);
if(asset == null) return null;
if (asset == null) return null;
return new Bitmap(OpenJPEG.DecodeToImage(asset.Data));
}
@@ -179,9 +179,9 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
// color-channel, so 2^24 is the maximum value we can get, adding everything.
// int is be big enough for that.
int r = 0, g = 0, b = 0;
for(int y = 0; y < bmp.Height; ++y)
for (int y = 0; y < bmp.Height; ++y)
{
for(int x = 0; x < bmp.Width; ++x)
for (int x = 0; x < bmp.Width; ++x)
{
Color c = bmp.GetPixel(x, y);
r += (int)c.R & 0xff;
@@ -218,14 +218,14 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
// interpolate two colors in HSV space and return the resulting color
private HSV interpolateHSV(ref HSV c1, ref HSV c2, float ratio) {
if(ratio <= 0f) return c1;
if(ratio >= 1f) return c2;
if (ratio <= 0f) return c1;
if (ratio >= 1f) return c2;
// make sure we are on the same side on the hue-circle for interpolation
// We change the hue of the parameters here, but we don't change the color
// represented by that value
if(c1.h - c2.h > 180f) c1.h -= 360f;
else if(c2.h - c1.h > 180f) c1.h += 360f;
if (c1.h - c2.h > 180f) c1.h -= 360f;
else if (c2.h - c1.h > 180f) c1.h += 360f;
return new HSV(c1.h * (1f - ratio) + c2.h * ratio,
c1.s * (1f - ratio) + c2.s * ratio,
@@ -321,16 +321,16 @@ namespace OpenSim.Region.Environment.Modules.World.WorldMap
}
HSV hsv;
if(hmod <= low) hsv = hsv1; // too low
else if(hmod >= high) hsv = hsv4; // too high
if (hmod <= low) hsv = hsv1; // too low
else if (hmod >= high) hsv = hsv4; // too high
else
{
// HSV-interpolate along the colors
// first, rescale h to 0.0 - 1.0
hmod = (hmod - low) / (high - low);
// now we have to split: 0.00 => color1, 0.33 => color2, 0.67 => color3, 1.00 => color4
if(hmod < 1f/3f) hsv = interpolateHSV(ref hsv1, ref hsv2, hmod * 3f);
else if(hmod < 2f/3f) hsv = interpolateHSV(ref hsv2, ref hsv3, (hmod * 3f) - 1f);
if (hmod < 1f/3f) hsv = interpolateHSV(ref hsv1, ref hsv2, hmod * 3f);
else if (hmod < 2f/3f) hsv = interpolateHSV(ref hsv2, ref hsv3, (hmod * 3f) - 1f);
else hsv = interpolateHSV(ref hsv3, ref hsv4, (hmod * 3f) - 2f);
}