public void FromLightShare(RegionLightShareData ls) { WaterData water = new WaterData(); water.waterFogColor = ls.waterColor / 256f; water.waterFogDensity = (float)Math.Pow(2.0f, ls.waterFogDensityExponent); //water.waterFogDensity = ls.waterFogDensityExponent; water.underWaterFogMod = ls.underwaterFogModifier; water.normScale = ls.reflectionWaveletScale; water.fresnelScale = ls.fresnelScale; water.fresnelOffset = ls.fresnelOffset; water.scaleAbove = ls.refractScaleAbove; water.scaleBelow = ls.refractScaleBelow; water.blurMultiplier = ls.blurMultiplier; water.wave1Dir = ls.littleWaveDirection; water.wave2Dir = ls.bigWaveDirection; water.normalMap = ls.normalMapTexture; water.Name = "LightshareWater"; SkyData sky = new SkyData(); convertFromAngles(sky, 2.0f * (float)Math.PI * ls.sunMoonPosition, 2.0f * (float)Math.PI * ls.eastAngle); sky.sunlight_color = ls.sunMoonColor * 3.0f; sky.ambient = new Vector3(ls.ambient.X * 3.0f, ls.ambient.Y * 3.0f, ls.ambient.Z * 3.0f); sky.blue_horizon = new Vector3(ls.horizon.X * 2.0f, ls.horizon.Y * 2.0f, ls.horizon.Z * 2.0f); sky.blue_density = new Vector3(ls.blueDensity.X * 2.0f, ls.blueDensity.Y * 2.0f, ls.blueDensity.Z * 2.0f);; sky.haze_horizon = ls.hazeHorizon; sky.haze_density = ls.hazeDensity; sky.cloud_shadow = ls.cloudCoverage; sky.density_multiplier = ls.densityMultiplier / 1000.0f; sky.distance_multiplier = ls.distanceMultiplier; sky.max_y = ls.maxAltitude; sky.cloud_color = new Vector3(ls.cloudColor.X, ls.cloudColor.Y, ls.cloudColor.Z); sky.cloud_pos_density1 = ls.cloudXYDensity; sky.cloud_pos_density2 = ls.cloudDetailXYDensity; sky.cloud_scale = ls.cloudScale; sky.gamma = ls.sceneGamma; sky.glow = new Vector3((2f - ls.sunGlowSize) * 20f, 0f, -ls.sunGlowFocus * 5f); sky.cloud_scroll_rate = new Vector2(ls.cloudScrollX, ls.cloudScrollY); if (ls.cloudScrollXLock) { sky.cloud_scroll_rate.X = 0; } if (ls.cloudScrollYLock) { sky.cloud_scroll_rate.Y = 0; } sky.star_brightness = ls.starBrightness * 250f; sky.Name = "LightshareSky"; Cycle = new DayCycle(); Cycle.Name = "Lightshare"; Cycle.waterframes.Add(water.Name, water); DayCycle.TrackEntry track = new DayCycle.TrackEntry(-1, water.Name); Cycle.waterTrack.Add(track); Cycle.skyframes.Add(sky.Name, sky); track = new DayCycle.TrackEntry(-1, sky.Name); Cycle.skyTrack0.Add(track); }
public bool replaceSkyFromOSD(string name, OSDMap map) { SkyData sky = new SkyData(); if (string.IsNullOrWhiteSpace(name)) { name = "Sky"; } try { sky.FromOSD(name, map); } catch { return(false); } skyframes.Clear(); skyframes[name] = sky; TrackEntry t = new TrackEntry() { time = -1, frameName = name }; skyTrack0.Clear(); skyTrack0.Add(t); skyTracks = new List <TrackEntry> [3]; return(true); }
public static void convertFromAngles(SkyData sky, float sun_angle, float east_angle) { float az = -east_angle; float al = sun_angle; sky.sun_rotation = AzAlToRot(az, al); sky.moon_rotation = AzAlToRot(az, al + (float)Math.PI); }
public static void convertToAngles(SkyData sky, out float sun_angle, out float east_angle, out Vector4 lightnorm) { Vector3 v = Xrot(sky.sun_rotation); v.Normalize(); if (v.Z >= 0) { lightnorm = new Vector4(v.Y, v.Z, v.X, 1); } else if (v.Z > -0.12) { float m = v.Y * v.Y + v.Z * v.Z; m = 1 / (float)Math.Sqrt(m); lightnorm = new Vector4(v.Y * m, 0, v.X * m, 1); } else { lightnorm = new Vector4(-v.Y, -v.Z, -v.X, 1); } sun_angle = (float)Math.Asin(v.Z); east_angle = -(float)Math.Atan2(v.Y, v.X); if (Math.Abs(east_angle) < 1e-6) { east_angle = 0; } else if (east_angle < 0) { east_angle = Utils.TWO_PI + east_angle; } // this is just a case on one example daycyles, as wrong as any /* * if (Utils.ApproxEqual(east_angle, Utils.PI, 1e-4f)) * { * east_angle = 0; * sun_angle = Utils.PI - sun_angle; * } */ if (Math.Abs(sun_angle) < 1e-6) { sun_angle = 0; } else if (sun_angle < 0) { sun_angle = Utils.TWO_PI + sun_angle; } }
public bool FindSkies(List <DayCycle.TrackEntry> track, float dayfrac, out float skyfrac, out SkyData sky1, out SkyData sky2) { sky1 = null; sky2 = null; skyfrac = dayfrac; if (track.Count == 1 || track[0].time < 0) { if (!Cycle.skyframes.TryGetValue(track[0].frameName, out sky1) || sky1 == null) { return(false); } return(true); } int i = 0; while (i < track.Count) { if (track[i].time > dayfrac) { break; } ++i; } float firstFrac; float secondFrac; string first; string second; int ntracks = track.Count; if (i == 0 || i == ntracks) { --ntracks; firstFrac = track[ntracks].time; first = track[ntracks].frameName; secondFrac = track[0].time + 1f; second = track[0].frameName; } else { secondFrac = track[i].time; second = track[i].frameName; --i; firstFrac = track[i].time; first = track[i].frameName; } if (!Cycle.skyframes.TryGetValue(first, out sky1) || sky1 == null) { firstFrac = -1; } if (!Cycle.skyframes.TryGetValue(second, out sky2) || sky2 == null) { secondFrac = -1; } if (firstFrac < 0) { if (secondFrac < 0) { return(false); } sky1 = sky2; sky2 = null; return(true); } if (secondFrac < 0 || secondFrac == firstFrac) { sky2 = null; return(true); } dayfrac -= firstFrac; secondFrac -= firstFrac; dayfrac /= secondFrac; skyfrac = Utils.Clamp(dayfrac, 0, 1f); return(true); }
public void FromWLOSD(OSDArray array) { CompareTrackEntries cte = new CompareTrackEntries(); TrackEntry track; OSDArray skytracksArray = null; if (array.Count > 1) { skytracksArray = array[1] as OSDArray; } if (skytracksArray != null) { foreach (OSD setting in skytracksArray) { OSDArray innerSetting = setting as OSDArray; if (innerSetting != null) { track = new TrackEntry((float)innerSetting[0].AsReal(), innerSetting[1].AsString()); skyTrack0.Add(track); } } skyTrack0.Sort(cte); } OSDMap skyFramesArray = null; if (array.Count > 2) { skyFramesArray = array[2] as OSDMap; } if (skyFramesArray != null) { foreach (KeyValuePair <string, OSD> kvp in skyFramesArray) { SkyData sky = new SkyData(); sky.FromWLOSD(kvp.Key, kvp.Value); skyframes[kvp.Key] = sky; } } WaterData water = new WaterData(); OSDMap watermap = null; if (array.Count > 3) { watermap = array[3] as OSDMap; } if (watermap != null) { water.FromWLOSD("WLWater", watermap); } waterframes["WLWater"] = water; track = new TrackEntry(-1f, "WLWater"); waterTrack.Add(track); Name = "WLDaycycle"; if (skyTrack0.Count == 1 && skyTrack0[0].time == -1f) { IsStaticDayCycle = true; } }
public void FromOSD(OSDMap map) { CompareTrackEntries cte = new CompareTrackEntries(); OSD otmp; if (map.TryGetValue("frames", out otmp) && otmp is OSDMap) { OSDMap mframes = otmp as OSDMap; foreach (KeyValuePair <string, OSD> kvp in mframes) { OSDMap v = kvp.Value as OSDMap; if (v.TryGetValue("type", out otmp)) { string type = otmp; if (type.Equals("water")) { WaterData water = new WaterData(); water.FromOSD(kvp.Key, v); waterframes[kvp.Key] = water; } else if (type.Equals("sky")) { SkyData sky = new SkyData(); sky.FromOSD(kvp.Key, v); skyframes[kvp.Key] = sky; } } } } if (map.TryGetValue("name", out otmp)) { Name = otmp; } else { Name = "DayCycle"; } OSDArray track; if (map.TryGetValue("tracks", out otmp) && otmp is OSDArray) { OSDArray tracks = otmp as OSDArray; if (tracks.Count > 0) { track = tracks[0] as OSDArray; if (track != null && track.Count > 0) { for (int i = 0; i < track.Count; ++i) { OSDMap d = track[i] as OSDMap; if (d.TryGetValue("key_keyframe", out OSD dtime)) { if (d.TryGetValue("key_name", out OSD dname)) { TrackEntry t = new TrackEntry() { time = dtime, frameName = dname }; waterTrack.Add(t); } } } waterTrack.Sort(cte); } } if (tracks.Count > 1) { track = tracks[1] as OSDArray; if (track != null && track.Count > 0) { for (int i = 0; i < track.Count; ++i) { OSDMap d = track[i] as OSDMap; if (d.TryGetValue("key_keyframe", out OSD dtime)) { if (d.TryGetValue("key_name", out OSD dname)) { TrackEntry t = new TrackEntry(); t.time = dtime; t.frameName = dname; skyTrack0.Add(t); } } } skyTrack0.Sort(cte); } } if (tracks.Count > 2) { for (int st = 2, dt = 0; st < tracks.Count && dt < 3; ++st, ++dt) { track = tracks[st] as OSDArray; if (track != null && track.Count > 0) { skyTracks[dt] = new List <TrackEntry>(); for (int i = 0; i < track.Count; ++i) { OSDMap d = track[i] as OSDMap; if (d.TryGetValue("key_keyframe", out OSD dtime)) { if (d.TryGetValue("key_name", out OSD dname)) { TrackEntry t = new TrackEntry(); t.time = dtime; t.frameName = dname; skyTracks[dt].Add(t); } } } skyTracks[dt].Sort(cte); } } } } }