diff --git a/OpenSim/Framework/ViewerDaycycle.cs b/OpenSim/Framework/ViewerDaycycle.cs new file mode 100644 index 0000000000..44ebbda54d --- /dev/null +++ b/OpenSim/Framework/ViewerDaycycle.cs @@ -0,0 +1,335 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System.Collections.Generic; +using OpenMetaverse; +using OpenMetaverse.StructuredData; + +namespace OpenSim.Framework +{ + public class DayCycle + { + public struct TrackEntry + { + public float time; + public string frameName; + + public TrackEntry(float t, string f) + { + time = t; + frameName = f; + } + } + + public class CompareTrackEntries : IComparer + { + public int Compare(TrackEntry x, TrackEntry y) + { + return x.time.CompareTo(y.time); + } + } + + public bool IsStaticDayCycle = false; + public List waterTrack = new List(); + public List skyTrack0 = new List(); + public List[] skyTracks = new List[3]; + + public Dictionary skyframes = new Dictionary(); + public Dictionary waterframes = new Dictionary(); + + public string Name; + + 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 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 ToWLOSD(ref OSDArray array) + { + OSDArray track = new OSDArray(); + foreach (TrackEntry te in skyTrack0) + track.Add(new OSDArray { te.time, te.frameName }); + array[1] = track; + + OSDMap frames = new OSDMap(); + foreach (KeyValuePair kvp in skyframes) + frames[kvp.Key] = kvp.Value.ToWLOSD(); + array[2] = frames; + + if(waterTrack.Count > 0) + { + TrackEntry te = waterTrack[0]; + if(waterframes.TryGetValue(te.frameName, out WaterData water)) + array[3] = water.ToWLOSD(); + } + else + array[3] = new OSDMap(); + } + + 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 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(); + t.time = dtime; + t.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(); + 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); + } + } + } + } + } + + public OSDMap ToOSD() + { + OSDMap cycle = new OSDMap(); + + OSDMap frames = new OSDMap(); + foreach (KeyValuePair kvp in waterframes) + { + frames[kvp.Key] = kvp.Value.ToOSD(); + } + foreach (KeyValuePair kvp in skyframes) + { + frames[kvp.Key] = kvp.Value.ToOSD(); + } + cycle["frames"] = frames; + + cycle["name"] = Name; + + OSDArray tracks = new OSDArray(); + + OSDArray track = new OSDArray(); + OSDMap tmp; + foreach (TrackEntry te in waterTrack) + { + tmp = new OSDMap(); + if (te.time < 0) + tmp["key_keyframe"] = 0f; + else + tmp["key_keyframe"] = te.time; + tmp["key_name"] = te.frameName; + track.Add(tmp); + } + tracks.Add(track); + + track = new OSDArray(); + foreach (TrackEntry te in skyTrack0) + { + tmp = new OSDMap(); + if (te.time < 0) + tmp["key_keyframe"] = 0f; + else + tmp["key_keyframe"] = te.time; + tmp["key_name"] = te.frameName; + track.Add(tmp); + } + tracks.Add(track); + + for(int st = 0; st < 3; ++st) + { + track = new OSDArray(); + if(skyTracks[st] != null) + { + foreach (TrackEntry te in skyTracks[st]) + { + tmp = new OSDMap(); + if (te.time < 0) + tmp["key_keyframe"] = 0f; + else + tmp["key_keyframe"] = te.time; + tmp["key_name"] = te.frameName; + track.Add(tmp); + } + } + tracks.Add(track); + } + + cycle["tracks"] = tracks; + cycle["type"] = "daycycle"; + + return cycle; + } + + public void GatherAssets(Dictionary uuids) + { + foreach (WaterData wd in waterframes.Values) + { + wd.GatherAssets(uuids); + } + foreach (SkyData sd in skyframes.Values) + { + sd.GatherAssets(uuids); + } + } + } +} diff --git a/OpenSim/Framework/ViewerEnvironment.cs b/OpenSim/Framework/ViewerEnvironment.cs index 23246c2fb4..980ecfe4c8 100644 --- a/OpenSim/Framework/ViewerEnvironment.cs +++ b/OpenSim/Framework/ViewerEnvironment.cs @@ -75,861 +75,6 @@ namespace OpenSim.Framework public bool drawClassicClouds = true; } - public class SkyData - { - public struct AbsCoefData - { - public float constant_term; - public float exp_scale; - public float exp_term; - public float linear_term; - public float width; - - public AbsCoefData(float w, float expt, float exps, float lin, float cons) - { - constant_term = cons; - exp_scale = exps; - exp_term = expt; - linear_term = lin; - width = w; - } - - public OSDMap ToOSD() - { - OSDMap map = new OSDMap(); - map["constant_term"] = constant_term; - map["exp_scale"] = exp_scale; - map["exp_term"] = exp_term; - map["linear_term"] = linear_term; - map["width"] = width; - return map; - } - - public void FromOSD(OSDMap map) - { - constant_term = map["constant_term"]; - exp_scale = map["exp_scale"]; - exp_term = map["exp_term"]; - linear_term = map["linear_term"]; - width = map["width"]; - } - } - - public struct mCoefData - { - public float anisotropy; - public float constant_term; - public float exp_scale; - public float exp_term; - public float linear_term; - public float width; - - public mCoefData(float w, float expt, float exps, float lin, float cons, float ani) - { - anisotropy = ani; - constant_term = cons; - exp_scale = exps; - exp_term = expt; - linear_term = lin; - width = w; - } - - public OSDMap ToOSD() - { - OSDMap map = new OSDMap(); - map["anisotropy"] = anisotropy; - map["constant_term"] = constant_term; - map["exp_scale"] = exp_scale; - map["exp_term"] = exp_term; - map["linear_term"] = linear_term; - map["width"] = width; - return map; - } - - public void FromOSD(OSDMap map) - { - anisotropy = map["anisotropy"]; - constant_term = map["constant_term"]; - exp_scale = map["exp_scale"]; - exp_term = map["exp_term"]; - linear_term = map["linear_term"]; - width = map["width"]; - } - } - //AbsCoefData(float w, float expt, float exps, float lin, float cons) - public AbsCoefData abscoefA = new AbsCoefData(25000f, 0, 0, 0, 0); - public AbsCoefData abscoefB = new AbsCoefData(0, 0, 0, -6.6666667e-5f, 1f); - public AbsCoefData rayleigh_config = new AbsCoefData(0, 1, -1.25e-4f, 0, 0); - - //mCoefData(float w, float expt, float exps, float lin, float cons, float ani) - public mCoefData mieconf = new mCoefData(0, 1f, -8.333333e-4f, 0, 0, 0.8f); - - UUID bloom_id = new UUID("3c59f7fe-9dc8-47f9-8aaf-a9dd1fbc3bef"); - UUID cloud_id = new UUID("1dc1368f-e8fe-f02d-a08d-9d9f11c1af6b"); - UUID halo_id = new UUID("12149143-f599-91a7-77ac-b52a3c0f59cd"); - UUID moon_id = new UUID("ec4b9f0b-d008-45c6-96a4-01dd947ac621"); - UUID rainbow_id = new UUID("11b4c57c-56b3-04ed-1f82-2004363882e4"); - UUID sun_id = UUID.Zero; - - public Vector3 ambient = new Vector3(0.25f, 0.25f, 0.25f); //? - public Vector3 blue_density = new Vector3(0.2447f, 0.4487f, 0.76f); - public Vector3 blue_horizon = new Vector3(0.4954f, 0.4954f, 0.64f); - public Vector3 cloud_color = new Vector3(0.41f, 0.41f, 0.41f); - public Vector3 cloud_pos_density1 = new Vector3(1, 0.5260f, 1); - public Vector3 cloud_pos_density2 = new Vector3(1, 0.5260f, 1); - public float cloud_scale = 0.42f; - public Vector2 cloud_scroll_rate = new Vector2(0.2f, 0.011f); - public float cloud_shadow = 0.27f; - public float density_multiplier = 0.00018f; - public float distance_multiplier = 0.8f; - public float gamma = 1; - public Vector3 glow = new Vector3(5, 0.0010f, -0.48f); - public float haze_density = 0.7f; - public float haze_horizon = 0.19f; - public float max_y = 1605; - public float star_brightness = 0f; - - //this is a vector3 now, but all viewers expect a vector4, so keeping like this for now - public Vector4 sunlight_color = new Vector4(0.7342f, 0.7815f, 0.9f, 0.3f); - public string Name = "Default"; - - public float cloud_variance = 0; - public float dome_offset = 0.96f; - public float dome_radius = 15000f; - public float droplet_radius = 800.0f; - public float ice_level = 0; - - public float moisture_level = 0; - public float sky_bottom_radius = 6360; - public float sky_top_radius = 6420; - - public float sun_arc_radians = 0.00045f; - public Quaternion sun_rotation = new Quaternion(0, -0.3824995f, 0, 0.9239557f); - public float sun_scale = 1; - - public float moon_brightness = 0.5f; - public Quaternion moon_rotation = new Quaternion(0, 0.9239557f, 0, 0.3824995f); - public float moon_scale = 1; - public float planet_radius = 6360f; - - public void FromWLOSD(string name, OSD osd) - { - Vector4 v4tmp; - OSDMap map = osd as OSDMap; - - v4tmp = map["ambient"]; - ambient = new Vector3(v4tmp.X, v4tmp.Y, v4tmp.Z); - v4tmp = map["blue_density"]; - blue_density = new Vector3(v4tmp.X, v4tmp.Y, v4tmp.Z); - v4tmp = map["blue_horizon"]; - blue_horizon = new Vector3(v4tmp.X, v4tmp.Y, v4tmp.Z); - v4tmp = map["cloud_color"]; - cloud_color = new Vector3(v4tmp.X, v4tmp.Y, v4tmp.Z); - v4tmp = map["cloud_pos_density1"]; - cloud_pos_density1 = new Vector3(v4tmp.X, v4tmp.Y, v4tmp.Z); - v4tmp = map["cloud_pos_density2"]; - cloud_pos_density2 = new Vector3(v4tmp.X, v4tmp.Y, v4tmp.Z); - v4tmp = map["cloud_scale"]; - cloud_scale = v4tmp.X; - cloud_scroll_rate = map["cloud_scroll_rate"]; - cloud_scroll_rate.X -= 10f; - cloud_scroll_rate.Y -= 10f; - v4tmp = map["cloud_shadow"]; - cloud_shadow = v4tmp.X; - v4tmp = map["density_multiplier"]; - density_multiplier = v4tmp.X; - v4tmp = map["distance_multiplier"]; - distance_multiplier = v4tmp.X; - - Vector2 v2tmp = map["enable_cloud_scroll"]; - if (v2tmp.X == 0) - cloud_scroll_rate.X = 0; - if (v2tmp.Y == 0) - cloud_scroll_rate.Y = 0; - v4tmp = map["gamma"]; - gamma = v4tmp.X; - v4tmp = map["glow"]; - glow = new Vector3(v4tmp.X, v4tmp.Y, v4tmp.Z); - v4tmp = map["haze_density"]; - haze_density = v4tmp.X; - v4tmp = map["haze_horizon"]; - haze_horizon = v4tmp.X; - //lightnorm = map["lightnorm"]; - v4tmp = map["max_y"]; - max_y = v4tmp.X; - star_brightness = map["star_brightness"] * 250.0f; - - sunlight_color = map["sunlight_color"]; - - ViewerEnvironment.convertFromAngles(this, map["sun_angle"], map["east_angle"]); - Name = name; - } - - public OSD ToWLOSD() - { - OSDMap map = new OSDMap(); - - float sun_angle; - float east_angle; - Vector4 lightnorm; - ViewerEnvironment.convertToAngles(this, out sun_angle, out east_angle, out lightnorm); - map["ambient"] = new Vector4(ambient.X, ambient.Y, ambient.Z, 1); - map["blue_density"] = new Vector4(blue_density.X, blue_density.Y, blue_density.Z, 1); - map["blue_horizon"] = new Vector4(blue_horizon.X, blue_horizon.Y, blue_horizon.Z, 1); - map["cloud_color"] = new Vector4(cloud_color.X, cloud_color.Y, cloud_color.Z, 1);; - map["cloud_pos_density1"] = new Vector4(cloud_pos_density1.X, cloud_pos_density1.Y, cloud_pos_density1.Z, 1); - map["cloud_pos_density2"] = new Vector4(cloud_pos_density2.X, cloud_pos_density2.Y, cloud_pos_density2.Z, 1); - map["cloud_scale"] = new Vector4(cloud_scale, 0, 0, 1); - map["cloud_scroll_rate"] = new Vector2(cloud_scroll_rate.X + 10f, cloud_scroll_rate.Y + 10f); - map["cloud_shadow"] = new Vector4(cloud_shadow, 0, 0, 1); - map["density_multiplier"] = new Vector4(density_multiplier, 0, 0, 1); - map["distance_multiplier"] = new Vector4(distance_multiplier, 0, 0, 1); - map["east_angle"] = east_angle; - map["enable_cloud_scroll"] = new OSDArray { cloud_scroll_rate.X != 0, cloud_scroll_rate.Y != 0 }; - map["gamma"] = new Vector4(gamma, 0, 0, 1); - map["glow"] = new Vector4(glow.X, glow.Y, glow.Z, 1); - map["haze_density"] = new Vector4(haze_density, 0, 0, 1); - map["haze_horizon"] = new Vector4(haze_horizon, 0, 0, 1); - map["lightnorm"] = lightnorm; - map["max_y"] = new Vector4(max_y, 0, 0, 1); - map["name"] = Name; - map["star_brightness"] = star_brightness / 250.0f; - map["sun_angle"] = sun_angle; - map["sunlight_color"] = sunlight_color; - - return map; - } - - public OSD ToOSD() - { - OSDMap map = new OSDMap(64); - - OSDArray abscfg = new OSDArray(2); - abscfg.Add(abscoefA.ToOSD()); - abscfg.Add(abscoefB.ToOSD()); - map["absorption_config"] = abscfg; - - map["bloom_id"] = bloom_id; - map["cloud_color"] = cloud_color; - map["cloud_id"] = cloud_id; - map["cloud_pos_density1"] = cloud_pos_density1; - map["cloud_pos_density2"] = cloud_pos_density2; - map["cloud_scale"] = cloud_scale; - map["cloud_scroll_rate"] = cloud_scroll_rate; - map["cloud_shadow"] = cloud_shadow; - map["cloud_variance"] = cloud_variance; - map["dome_offset"] = dome_offset; - map["dome_radius"] = dome_radius; - map["droplet_radius"] = droplet_radius; - map["gamma"] = gamma; - map["glow"] = glow; - map["halo_id"] = halo_id; - map["ice_level"] = ice_level; - - OSDMap lhaze = new OSDMap(); - lhaze["ambient"] = ambient; - lhaze["blue_density"] = blue_density; - lhaze["blue_horizon"] = blue_horizon; - lhaze["density_multiplier"] = density_multiplier; - lhaze["distance_multiplier"] = distance_multiplier; - lhaze["haze_density"] = haze_density; - lhaze["haze_horizon"] = haze_horizon; - map["legacy_haze"] = lhaze; - - map["max_y"] = max_y; - - OSDArray miecfg = new OSDArray(); - miecfg.Add(mieconf.ToOSD()); - map["mie_config"] = miecfg; - - map["moisture_level"] = moisture_level; - map["moon_brightness"] = moon_brightness; - map["moon_id"] = moon_id; - map["moon_rotation"] = moon_rotation; - map["moon_scale"] = moon_scale; - map["planet_radius"] = planet_radius; - map["rainbow_id"] = rainbow_id; - - OSDArray rayl = new OSDArray(); - rayl.Add(rayleigh_config.ToOSD()); - map["rayleigh_config"] = rayl; - - map["sky_bottom_radius"] = sky_bottom_radius; - map["sky_top_radius"] = sky_top_radius; - map["star_brightness"] = star_brightness; - - map["sun_arc_radians"] = sun_arc_radians; - map["sun_id"] = sun_id; - map["sun_rotation"] = sun_rotation; - map["sun_scale"] = sun_scale; - map["sunlight_color"] = sunlight_color; - - map["type"] = "sky"; - return map; - } - - public void FromOSD(string name, OSDMap map) - { - OSDArray tmpArray; - OSD otmp; - if (map.TryGetValue("absorption_config",out otmp) && otmp is OSDArray) - { - tmpArray = otmp as OSDArray; - if (tmpArray.Count > 0) - { - abscoefA.FromOSD(tmpArray[0] as OSDMap); - if (tmpArray.Count > 1) - abscoefA.FromOSD(tmpArray[1] as OSDMap); - } - } - if (map.TryGetValue("bloom_id", out otmp)) - bloom_id = otmp; - if (map.TryGetValue("cloud_color", out otmp)) - cloud_color = otmp; - if (map.TryGetValue("cloud_id", out otmp)) - cloud_id = otmp; - if (map.TryGetValue("cloud_pos_density1", out otmp)) - cloud_pos_density1 = otmp; - if (map.TryGetValue("cloud_pos_density2", out otmp)) - cloud_pos_density2 = otmp; - if (map.TryGetValue("cloud_scale", out otmp)) - cloud_scale = otmp; - if (map.TryGetValue("cloud_scroll_rate", out otmp)) - cloud_scroll_rate = otmp; - if (map.TryGetValue("cloud_shadow", out otmp)) - cloud_shadow = otmp; - if (map.TryGetValue("cloud_variance", out otmp)) - cloud_variance = otmp; - if (map.TryGetValue("dome_offset", out otmp)) - dome_offset = otmp; - if (map.TryGetValue("dome_radius", out otmp)) - dome_radius = otmp; - if (map.TryGetValue("droplet_radius", out otmp)) - droplet_radius = otmp; - if (map.TryGetValue("gamma", out otmp)) - gamma = otmp; - if (map.TryGetValue("glow", out otmp)) - glow = otmp; - if (map.TryGetValue("halo_id", out otmp)) - halo_id = otmp; - if (map.TryGetValue("ice_level", out otmp)) - halo_id = otmp; - - if (map.TryGetValue("legacy_haze", out OSD tmp) && tmp is OSDMap) - { - OSDMap lHaze = tmp as OSDMap; - if (lHaze.TryGetValue("ambient", out otmp)) - ambient = otmp; - if (lHaze.TryGetValue("blue_density", out otmp)) - blue_density = otmp; - if (lHaze.TryGetValue("blue_horizon", out otmp)) - blue_horizon = otmp; - if (lHaze.TryGetValue("density_multiplier", out otmp)) - density_multiplier = otmp; - if (lHaze.TryGetValue("distance_multiplier", out otmp)) - distance_multiplier = otmp; - if (lHaze.TryGetValue("haze_density", out otmp)) - haze_density = otmp; - if (lHaze.TryGetValue("haze_horizon", out otmp)) - haze_horizon = otmp; - } - - if (map.TryGetValue("max_y", out otmp)) - max_y = otmp; - - if (map.TryGetValue("mie_config", out otmp) && otmp is OSDArray) - { - tmpArray = otmp as OSDArray; - if (tmpArray.Count > 0) - mieconf.FromOSD(tmpArray[0] as OSDMap); - } - - if (map.TryGetValue("moisture_level", out otmp)) - moisture_level = otmp; - if (map.TryGetValue("moon_brightness", out otmp)) - moon_brightness = otmp; - if (map.TryGetValue("moon_id", out otmp)) - moon_id = otmp; - if (map.TryGetValue("moon_rotation", out otmp)) - moon_rotation = otmp; - if (map.TryGetValue("moon_scale", out otmp)) - moon_scale = otmp; - if (map.TryGetValue("planet_radius", out otmp)) - planet_radius = otmp; - if (map.TryGetValue("rainbow_id", out otmp)) - rainbow_id = otmp; - - if (map.TryGetValue("rayleigh_config", out otmp) && otmp is OSDArray) - { - tmpArray = otmp as OSDArray; - if (tmpArray.Count > 0) - rayleigh_config.FromOSD(tmpArray[0] as OSDMap); - } - - if (map.TryGetValue("sky_bottom_radius", out otmp)) - sky_bottom_radius = otmp; - if (map.TryGetValue("sky_top_radius", out otmp)) - sky_top_radius = otmp; - if (map.TryGetValue("star_brightness", out otmp)) - star_brightness = otmp; - - if (map.TryGetValue("sun_arc_radians", out otmp)) - sun_arc_radians = otmp; - if (map.TryGetValue("sun_id", out otmp)) - sun_id = otmp; - if (map.TryGetValue("sun_rotation", out otmp)) - sun_rotation = otmp; - if (map.TryGetValue("sun_scale", out otmp)) - sun_scale = otmp; - - if (map.TryGetValue("sunlight_color", out otmp) && otmp is OSDArray) - { - tmpArray = otmp as OSDArray; - if(tmpArray.Count == 4) - sunlight_color = otmp; - else - { - Vector3 tv = otmp; - sunlight_color = new Vector4(tv.X, tv.Y, tv.Z, 0); - } - } - Name = name; - } - - public void GatherAssets(Dictionary uuids) - { - Util.AddToGatheredIds(uuids, bloom_id, (sbyte)AssetType.Texture); - Util.AddToGatheredIds(uuids, cloud_id, (sbyte)AssetType.Texture); - Util.AddToGatheredIds(uuids, halo_id, (sbyte)AssetType.Texture); - Util.AddToGatheredIds(uuids, moon_id, (sbyte)AssetType.Texture); - Util.AddToGatheredIds(uuids, rainbow_id, (sbyte)AssetType.Texture); - Util.AddToGatheredIds(uuids, sun_id, (sbyte)AssetType.Texture); - } - } - - public class WaterData - { - public UUID normalMap = new UUID("822ded49-9a6c-f61c-cb89-6df54f42cdf4"); - public UUID transpTexture = new UUID("2bfd3884-7e27-69b9-ba3a-3e673f680004"); - - public float blurMultiplier = 0.04f; - public float fresnelOffset = 0.5f; - public float fresnelScale = 0.4f; - public Vector3 normScale = new Vector3(2f, 2f, 2f); - public float scaleAbove = 0.03f; - public float scaleBelow = 0.2f; - public float underWaterFogMod = 0.25f; - public Vector3 waterFogColor = new Vector3(0.0156f, 0.149f, 0.2509f); - public float waterFogDensity = 10; - public Vector2 wave1Dir = new Vector2(1.05f, -0.42f); - public Vector2 wave2Dir = new Vector2(1.11f, -1.16f); - public string Name; - - public void FromWLOSD(string name, OSD osd) - { - Vector4 v4tmp; - OSDMap map = osd as OSDMap; - blurMultiplier = map["blurMultiplier"]; - fresnelOffset = map["fresnelOffset"]; - fresnelScale = map["fresnelScale"]; - normScale = map["normScale"]; - normalMap = map["normalMap"]; - scaleAbove = map["scaleAbove"]; - scaleBelow = map["scaleBelow"]; - underWaterFogMod = map["underWaterFogMod"]; - v4tmp = map["waterFogColor"]; - waterFogColor = new Vector3(v4tmp.X, v4tmp.Y, v4tmp.Z); - waterFogDensity = map["waterFogDensity"]; - wave1Dir = map["wave1Dir"]; - wave2Dir = map["wave2Dir"]; - Name = name; - } - - public OSDMap ToWLOSD() - { - OSDMap map = new OSDMap(); - - map["blurMultiplier"] = blurMultiplier; - map["fresnelOffset"] = fresnelOffset; - map["fresnelScale"] = fresnelScale; - map["normScale"] = normScale; - map["normalMap"] = normalMap; - map["scaleAbove"] = scaleAbove; - map["scaleBelow"] = scaleBelow; - map["underWaterFogMod"] = underWaterFogMod; - map["waterFogColor"] = new Vector4(waterFogColor.X, waterFogColor.Y, waterFogColor.Z, 1); - map["waterFogDensity"] = waterFogDensity; - //map["waterFogDensity"] = (float)Math.Pow(2.0f, waterFogDensity); - map["wave1Dir"] = wave1Dir; - map["wave2Dir"] = wave2Dir; - - return map; - } - - public void FromOSD(string name, OSDMap map) - { - OSD otmp; - if (map.TryGetValue("blur_multiplier", out otmp)) - blurMultiplier = otmp; - if (map.TryGetValue("fresnel_offset", out otmp)) - fresnelOffset = otmp; - if (map.TryGetValue("fresnel_scale", out otmp)) - fresnelScale = otmp; - if (map.TryGetValue("normal_scale", out otmp)) - normScale = otmp; - if (map.TryGetValue("normal_map", out otmp)) - normalMap = otmp; - if (map.TryGetValue("scale_above", out otmp)) - scaleAbove = otmp; - if (map.TryGetValue("scale_below", out otmp)) - scaleBelow = otmp; - if (map.TryGetValue("underwater_fog_mod", out otmp)) - underWaterFogMod = otmp; - if (map.TryGetValue("water_fog_color", out otmp)) - waterFogColor = otmp; - if (map.TryGetValue("water_fog_density", out otmp)) - waterFogDensity = otmp; - if (map.TryGetValue("wave1_direction", out otmp)) - wave1Dir = otmp; - if (map.TryGetValue("wave2_direction", out otmp)) - wave2Dir = otmp; - if (map.TryGetValue("transparent_texture", out otmp)) - transpTexture = otmp; - - Name = name; - } - - public OSDMap ToOSD() - { - OSDMap map = new OSDMap(); - - map["blur_multiplier"] = blurMultiplier; - map["fresnel_offset"] = fresnelOffset; - map["fresnel_scale"] = fresnelScale; - map["normal_scale"] = normScale; - map["normal_map"] = normalMap; - map["scale_above"] = scaleAbove; - map["scale_below"] = scaleBelow; - map["underwater_fog_mod"] = underWaterFogMod; - map["water_fog_color"] = waterFogColor; - map["water_fog_density"] = waterFogDensity; - map["wave1_direction"] = wave1Dir; - map["wave2_direction"] = wave2Dir; - map["transparent_texture"] = transpTexture; - map["type"] ="water"; - - return map; - } - - public void GatherAssets(Dictionary uuids) - { - Util.AddToGatheredIds(uuids, normalMap, (sbyte)AssetType.Texture); - Util.AddToGatheredIds(uuids, transpTexture, (sbyte)AssetType.Texture); - } - } - - public class DayCycle - { - public struct TrackEntry - { - public float time; - public string frameName; - - public TrackEntry(float t, string f) - { - time = t; - frameName = f; - } - } - - public class CompareTrackEntries : IComparer - { - public int Compare(TrackEntry x, TrackEntry y) - { - return x.time.CompareTo(y.time); - } - } - - public bool IsStaticDayCycle = false; - public List waterTrack = new List(); - public List skyTrack0 = new List(); - public List[] skyTracks = new List[3]; - - public Dictionary skyframes = new Dictionary(); - public Dictionary waterframes = new Dictionary(); - - public string Name; - - 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 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 ToWLOSD(ref OSDArray array) - { - OSDArray track = new OSDArray(); - foreach (TrackEntry te in skyTrack0) - track.Add(new OSDArray { te.time, te.frameName }); - array[1] = track; - - OSDMap frames = new OSDMap(); - foreach (KeyValuePair kvp in skyframes) - frames[kvp.Key] = kvp.Value.ToWLOSD(); - array[2] = frames; - - if(waterTrack.Count > 0) - { - TrackEntry te = waterTrack[0]; - if(waterframes.TryGetValue(te.frameName, out WaterData water)) - array[3] = water.ToWLOSD(); - } - else - array[3] = new OSDMap(); - } - - 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 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(); - t.time = dtime; - t.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(); - 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); - } - } - } - } - } - - public OSDMap ToOSD() - { - OSDMap cycle = new OSDMap(); - - OSDMap frames = new OSDMap(); - foreach (KeyValuePair kvp in waterframes) - { - frames[kvp.Key] = kvp.Value.ToOSD(); - } - foreach (KeyValuePair kvp in skyframes) - { - frames[kvp.Key] = kvp.Value.ToOSD(); - } - cycle["frames"] = frames; - - cycle["name"] = Name; - - OSDArray tracks = new OSDArray(); - - OSDArray track = new OSDArray(); - OSDMap tmp; - foreach (TrackEntry te in waterTrack) - { - tmp = new OSDMap(); - if (te.time < 0) - tmp["key_keyframe"] = 0f; - else - tmp["key_keyframe"] = te.time; - tmp["key_name"] = te.frameName; - track.Add(tmp); - } - tracks.Add(track); - - track = new OSDArray(); - foreach (TrackEntry te in skyTrack0) - { - tmp = new OSDMap(); - if (te.time < 0) - tmp["key_keyframe"] = 0f; - else - tmp["key_keyframe"] = te.time; - tmp["key_name"] = te.frameName; - track.Add(tmp); - } - tracks.Add(track); - - for(int st = 0; st < 3; ++st) - { - track = new OSDArray(); - if(skyTracks[st] != null) - { - foreach (TrackEntry te in skyTracks[st]) - { - tmp = new OSDMap(); - if (te.time < 0) - tmp["key_keyframe"] = 0f; - else - tmp["key_keyframe"] = te.time; - tmp["key_name"] = te.frameName; - track.Add(tmp); - } - } - tracks.Add(track); - } - - cycle["tracks"] = tracks; - cycle["type"] = "daycycle"; - - return cycle; - } - - public void GatherAssets(Dictionary uuids) - { - foreach (WaterData wd in waterframes.Values) - { - wd.GatherAssets(uuids); - } - foreach (SkyData sd in skyframes.Values) - { - sd.GatherAssets(uuids); - } - } - } - public class ViewerEnvironment { DayCycle Cycle = new DayCycle(); diff --git a/OpenSim/Framework/ViewerSky.cs b/OpenSim/Framework/ViewerSky.cs new file mode 100644 index 0000000000..d87dacf42d --- /dev/null +++ b/OpenSim/Framework/ViewerSky.cs @@ -0,0 +1,465 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System.Collections.Generic; +using OpenMetaverse; +using OpenMetaverse.StructuredData; + +namespace OpenSim.Framework +{ + public class SkyData + { + public struct AbsCoefData + { + public float constant_term; + public float exp_scale; + public float exp_term; + public float linear_term; + public float width; + + public AbsCoefData(float w, float expt, float exps, float lin, float cons) + { + constant_term = cons; + exp_scale = exps; + exp_term = expt; + linear_term = lin; + width = w; + } + + public OSDMap ToOSD() + { + OSDMap map = new OSDMap(); + map["constant_term"] = constant_term; + map["exp_scale"] = exp_scale; + map["exp_term"] = exp_term; + map["linear_term"] = linear_term; + map["width"] = width; + return map; + } + + public void FromOSD(OSDMap map) + { + constant_term = map["constant_term"]; + exp_scale = map["exp_scale"]; + exp_term = map["exp_term"]; + linear_term = map["linear_term"]; + width = map["width"]; + } + } + + public struct mCoefData + { + public float anisotropy; + public float constant_term; + public float exp_scale; + public float exp_term; + public float linear_term; + public float width; + + public mCoefData(float w, float expt, float exps, float lin, float cons, float ani) + { + anisotropy = ani; + constant_term = cons; + exp_scale = exps; + exp_term = expt; + linear_term = lin; + width = w; + } + + public OSDMap ToOSD() + { + OSDMap map = new OSDMap(); + map["anisotropy"] = anisotropy; + map["constant_term"] = constant_term; + map["exp_scale"] = exp_scale; + map["exp_term"] = exp_term; + map["linear_term"] = linear_term; + map["width"] = width; + return map; + } + + public void FromOSD(OSDMap map) + { + anisotropy = map["anisotropy"]; + constant_term = map["constant_term"]; + exp_scale = map["exp_scale"]; + exp_term = map["exp_term"]; + linear_term = map["linear_term"]; + width = map["width"]; + } + } + //AbsCoefData(float w, float expt, float exps, float lin, float cons) + public AbsCoefData abscoefA = new AbsCoefData(25000f, 0, 0, 0, 0); + public AbsCoefData abscoefB = new AbsCoefData(0, 0, 0, -6.6666667e-5f, 1f); + public AbsCoefData rayleigh_config = new AbsCoefData(0, 1, -1.25e-4f, 0, 0); + + //mCoefData(float w, float expt, float exps, float lin, float cons, float ani) + public mCoefData mieconf = new mCoefData(0, 1f, -8.333333e-4f, 0, 0, 0.8f); + + UUID bloom_id = new UUID("3c59f7fe-9dc8-47f9-8aaf-a9dd1fbc3bef"); + UUID cloud_id = new UUID("1dc1368f-e8fe-f02d-a08d-9d9f11c1af6b"); + UUID halo_id = new UUID("12149143-f599-91a7-77ac-b52a3c0f59cd"); + UUID moon_id = new UUID("ec4b9f0b-d008-45c6-96a4-01dd947ac621"); + UUID rainbow_id = new UUID("11b4c57c-56b3-04ed-1f82-2004363882e4"); + UUID sun_id = UUID.Zero; + + public Vector3 ambient = new Vector3(0.25f, 0.25f, 0.25f); //? + public Vector3 blue_density = new Vector3(0.2447f, 0.4487f, 0.76f); + public Vector3 blue_horizon = new Vector3(0.4954f, 0.4954f, 0.64f); + public Vector3 cloud_color = new Vector3(0.41f, 0.41f, 0.41f); + public Vector3 cloud_pos_density1 = new Vector3(1, 0.5260f, 1); + public Vector3 cloud_pos_density2 = new Vector3(1, 0.5260f, 1); + public float cloud_scale = 0.42f; + public Vector2 cloud_scroll_rate = new Vector2(0.2f, 0.011f); + public float cloud_shadow = 0.27f; + public float density_multiplier = 0.00018f; + public float distance_multiplier = 0.8f; + public float gamma = 1; + public Vector3 glow = new Vector3(5, 0.0010f, -0.48f); + public float haze_density = 0.7f; + public float haze_horizon = 0.19f; + public float max_y = 1605; + public float star_brightness = 0f; + + //this is a vector3 now, but all viewers expect a vector4, so keeping like this for now + public Vector4 sunlight_color = new Vector4(0.7342f, 0.7815f, 0.9f, 0.3f); + public string Name = "Default"; + + public float cloud_variance = 0; + public float dome_offset = 0.96f; + public float dome_radius = 15000f; + public float droplet_radius = 800.0f; + public float ice_level = 0; + + public float moisture_level = 0; + public float sky_bottom_radius = 6360; + public float sky_top_radius = 6420; + + public float sun_arc_radians = 0.00045f; + public Quaternion sun_rotation = new Quaternion(0, -0.3824995f, 0, 0.9239557f); + public float sun_scale = 1; + + public float moon_brightness = 0.5f; + public Quaternion moon_rotation = new Quaternion(0, 0.9239557f, 0, 0.3824995f); + public float moon_scale = 1; + public float planet_radius = 6360f; + + public void FromWLOSD(string name, OSD osd) + { + Vector4 v4tmp; + OSDMap map = osd as OSDMap; + + v4tmp = map["ambient"]; + ambient = new Vector3(v4tmp.X, v4tmp.Y, v4tmp.Z); + v4tmp = map["blue_density"]; + blue_density = new Vector3(v4tmp.X, v4tmp.Y, v4tmp.Z); + v4tmp = map["blue_horizon"]; + blue_horizon = new Vector3(v4tmp.X, v4tmp.Y, v4tmp.Z); + v4tmp = map["cloud_color"]; + cloud_color = new Vector3(v4tmp.X, v4tmp.Y, v4tmp.Z); + v4tmp = map["cloud_pos_density1"]; + cloud_pos_density1 = new Vector3(v4tmp.X, v4tmp.Y, v4tmp.Z); + v4tmp = map["cloud_pos_density2"]; + cloud_pos_density2 = new Vector3(v4tmp.X, v4tmp.Y, v4tmp.Z); + v4tmp = map["cloud_scale"]; + cloud_scale = v4tmp.X; + cloud_scroll_rate = map["cloud_scroll_rate"]; + cloud_scroll_rate.X -= 10f; + cloud_scroll_rate.Y -= 10f; + v4tmp = map["cloud_shadow"]; + cloud_shadow = v4tmp.X; + v4tmp = map["density_multiplier"]; + density_multiplier = v4tmp.X; + v4tmp = map["distance_multiplier"]; + distance_multiplier = v4tmp.X; + + Vector2 v2tmp = map["enable_cloud_scroll"]; + if (v2tmp.X == 0) + cloud_scroll_rate.X = 0; + if (v2tmp.Y == 0) + cloud_scroll_rate.Y = 0; + v4tmp = map["gamma"]; + gamma = v4tmp.X; + v4tmp = map["glow"]; + glow = new Vector3(v4tmp.X, v4tmp.Y, v4tmp.Z); + v4tmp = map["haze_density"]; + haze_density = v4tmp.X; + v4tmp = map["haze_horizon"]; + haze_horizon = v4tmp.X; + //lightnorm = map["lightnorm"]; + v4tmp = map["max_y"]; + max_y = v4tmp.X; + star_brightness = map["star_brightness"] * 250.0f; + + sunlight_color = map["sunlight_color"]; + + ViewerEnvironment.convertFromAngles(this, map["sun_angle"], map["east_angle"]); + Name = name; + } + + public OSD ToWLOSD() + { + OSDMap map = new OSDMap(); + + float sun_angle; + float east_angle; + Vector4 lightnorm; + ViewerEnvironment.convertToAngles(this, out sun_angle, out east_angle, out lightnorm); + map["ambient"] = new Vector4(ambient.X, ambient.Y, ambient.Z, 1); + map["blue_density"] = new Vector4(blue_density.X, blue_density.Y, blue_density.Z, 1); + map["blue_horizon"] = new Vector4(blue_horizon.X, blue_horizon.Y, blue_horizon.Z, 1); + map["cloud_color"] = new Vector4(cloud_color.X, cloud_color.Y, cloud_color.Z, 1);; + map["cloud_pos_density1"] = new Vector4(cloud_pos_density1.X, cloud_pos_density1.Y, cloud_pos_density1.Z, 1); + map["cloud_pos_density2"] = new Vector4(cloud_pos_density2.X, cloud_pos_density2.Y, cloud_pos_density2.Z, 1); + map["cloud_scale"] = new Vector4(cloud_scale, 0, 0, 1); + map["cloud_scroll_rate"] = new Vector2(cloud_scroll_rate.X + 10f, cloud_scroll_rate.Y + 10f); + map["cloud_shadow"] = new Vector4(cloud_shadow, 0, 0, 1); + map["density_multiplier"] = new Vector4(density_multiplier, 0, 0, 1); + map["distance_multiplier"] = new Vector4(distance_multiplier, 0, 0, 1); + map["east_angle"] = east_angle; + map["enable_cloud_scroll"] = new OSDArray { cloud_scroll_rate.X != 0, cloud_scroll_rate.Y != 0 }; + map["gamma"] = new Vector4(gamma, 0, 0, 1); + map["glow"] = new Vector4(glow.X, glow.Y, glow.Z, 1); + map["haze_density"] = new Vector4(haze_density, 0, 0, 1); + map["haze_horizon"] = new Vector4(haze_horizon, 0, 0, 1); + map["lightnorm"] = lightnorm; + map["max_y"] = new Vector4(max_y, 0, 0, 1); + map["name"] = Name; + map["star_brightness"] = star_brightness / 250.0f; + map["sun_angle"] = sun_angle; + map["sunlight_color"] = sunlight_color; + + return map; + } + + public OSD ToOSD() + { + OSDMap map = new OSDMap(64); + + OSDArray abscfg = new OSDArray(2); + abscfg.Add(abscoefA.ToOSD()); + abscfg.Add(abscoefB.ToOSD()); + map["absorption_config"] = abscfg; + + map["bloom_id"] = bloom_id; + map["cloud_color"] = cloud_color; + map["cloud_id"] = cloud_id; + map["cloud_pos_density1"] = cloud_pos_density1; + map["cloud_pos_density2"] = cloud_pos_density2; + map["cloud_scale"] = cloud_scale; + map["cloud_scroll_rate"] = cloud_scroll_rate; + map["cloud_shadow"] = cloud_shadow; + map["cloud_variance"] = cloud_variance; + map["dome_offset"] = dome_offset; + map["dome_radius"] = dome_radius; + map["droplet_radius"] = droplet_radius; + map["gamma"] = gamma; + map["glow"] = glow; + map["halo_id"] = halo_id; + map["ice_level"] = ice_level; + + OSDMap lhaze = new OSDMap(); + lhaze["ambient"] = ambient; + lhaze["blue_density"] = blue_density; + lhaze["blue_horizon"] = blue_horizon; + lhaze["density_multiplier"] = density_multiplier; + lhaze["distance_multiplier"] = distance_multiplier; + lhaze["haze_density"] = haze_density; + lhaze["haze_horizon"] = haze_horizon; + map["legacy_haze"] = lhaze; + + map["max_y"] = max_y; + + OSDArray miecfg = new OSDArray(); + miecfg.Add(mieconf.ToOSD()); + map["mie_config"] = miecfg; + + map["moisture_level"] = moisture_level; + map["moon_brightness"] = moon_brightness; + map["moon_id"] = moon_id; + map["moon_rotation"] = moon_rotation; + map["moon_scale"] = moon_scale; + map["planet_radius"] = planet_radius; + map["rainbow_id"] = rainbow_id; + + OSDArray rayl = new OSDArray(); + rayl.Add(rayleigh_config.ToOSD()); + map["rayleigh_config"] = rayl; + + map["sky_bottom_radius"] = sky_bottom_radius; + map["sky_top_radius"] = sky_top_radius; + map["star_brightness"] = star_brightness; + + map["sun_arc_radians"] = sun_arc_radians; + map["sun_id"] = sun_id; + map["sun_rotation"] = sun_rotation; + map["sun_scale"] = sun_scale; + map["sunlight_color"] = sunlight_color; + + map["type"] = "sky"; + return map; + } + + public void FromOSD(string name, OSDMap map) + { + OSDArray tmpArray; + OSD otmp; + if (map.TryGetValue("absorption_config",out otmp) && otmp is OSDArray) + { + tmpArray = otmp as OSDArray; + if (tmpArray.Count > 0) + { + abscoefA.FromOSD(tmpArray[0] as OSDMap); + if (tmpArray.Count > 1) + abscoefA.FromOSD(tmpArray[1] as OSDMap); + } + } + if (map.TryGetValue("bloom_id", out otmp)) + bloom_id = otmp; + if (map.TryGetValue("cloud_color", out otmp)) + cloud_color = otmp; + if (map.TryGetValue("cloud_id", out otmp)) + cloud_id = otmp; + if (map.TryGetValue("cloud_pos_density1", out otmp)) + cloud_pos_density1 = otmp; + if (map.TryGetValue("cloud_pos_density2", out otmp)) + cloud_pos_density2 = otmp; + if (map.TryGetValue("cloud_scale", out otmp)) + cloud_scale = otmp; + if (map.TryGetValue("cloud_scroll_rate", out otmp)) + cloud_scroll_rate = otmp; + if (map.TryGetValue("cloud_shadow", out otmp)) + cloud_shadow = otmp; + if (map.TryGetValue("cloud_variance", out otmp)) + cloud_variance = otmp; + if (map.TryGetValue("dome_offset", out otmp)) + dome_offset = otmp; + if (map.TryGetValue("dome_radius", out otmp)) + dome_radius = otmp; + if (map.TryGetValue("droplet_radius", out otmp)) + droplet_radius = otmp; + if (map.TryGetValue("gamma", out otmp)) + gamma = otmp; + if (map.TryGetValue("glow", out otmp)) + glow = otmp; + if (map.TryGetValue("halo_id", out otmp)) + halo_id = otmp; + if (map.TryGetValue("ice_level", out otmp)) + halo_id = otmp; + + if (map.TryGetValue("legacy_haze", out OSD tmp) && tmp is OSDMap) + { + OSDMap lHaze = tmp as OSDMap; + if (lHaze.TryGetValue("ambient", out otmp)) + ambient = otmp; + if (lHaze.TryGetValue("blue_density", out otmp)) + blue_density = otmp; + if (lHaze.TryGetValue("blue_horizon", out otmp)) + blue_horizon = otmp; + if (lHaze.TryGetValue("density_multiplier", out otmp)) + density_multiplier = otmp; + if (lHaze.TryGetValue("distance_multiplier", out otmp)) + distance_multiplier = otmp; + if (lHaze.TryGetValue("haze_density", out otmp)) + haze_density = otmp; + if (lHaze.TryGetValue("haze_horizon", out otmp)) + haze_horizon = otmp; + } + + if (map.TryGetValue("max_y", out otmp)) + max_y = otmp; + + if (map.TryGetValue("mie_config", out otmp) && otmp is OSDArray) + { + tmpArray = otmp as OSDArray; + if (tmpArray.Count > 0) + mieconf.FromOSD(tmpArray[0] as OSDMap); + } + + if (map.TryGetValue("moisture_level", out otmp)) + moisture_level = otmp; + if (map.TryGetValue("moon_brightness", out otmp)) + moon_brightness = otmp; + if (map.TryGetValue("moon_id", out otmp)) + moon_id = otmp; + if (map.TryGetValue("moon_rotation", out otmp)) + moon_rotation = otmp; + if (map.TryGetValue("moon_scale", out otmp)) + moon_scale = otmp; + if (map.TryGetValue("planet_radius", out otmp)) + planet_radius = otmp; + if (map.TryGetValue("rainbow_id", out otmp)) + rainbow_id = otmp; + + if (map.TryGetValue("rayleigh_config", out otmp) && otmp is OSDArray) + { + tmpArray = otmp as OSDArray; + if (tmpArray.Count > 0) + rayleigh_config.FromOSD(tmpArray[0] as OSDMap); + } + + if (map.TryGetValue("sky_bottom_radius", out otmp)) + sky_bottom_radius = otmp; + if (map.TryGetValue("sky_top_radius", out otmp)) + sky_top_radius = otmp; + if (map.TryGetValue("star_brightness", out otmp)) + star_brightness = otmp; + + if (map.TryGetValue("sun_arc_radians", out otmp)) + sun_arc_radians = otmp; + if (map.TryGetValue("sun_id", out otmp)) + sun_id = otmp; + if (map.TryGetValue("sun_rotation", out otmp)) + sun_rotation = otmp; + if (map.TryGetValue("sun_scale", out otmp)) + sun_scale = otmp; + + if (map.TryGetValue("sunlight_color", out otmp) && otmp is OSDArray) + { + tmpArray = otmp as OSDArray; + if(tmpArray.Count == 4) + sunlight_color = otmp; + else + { + Vector3 tv = otmp; + sunlight_color = new Vector4(tv.X, tv.Y, tv.Z, 0); + } + } + Name = name; + } + + public void GatherAssets(Dictionary uuids) + { + Util.AddToGatheredIds(uuids, bloom_id, (sbyte)AssetType.Texture); + Util.AddToGatheredIds(uuids, cloud_id, (sbyte)AssetType.Texture); + Util.AddToGatheredIds(uuids, halo_id, (sbyte)AssetType.Texture); + Util.AddToGatheredIds(uuids, moon_id, (sbyte)AssetType.Texture); + Util.AddToGatheredIds(uuids, rainbow_id, (sbyte)AssetType.Texture); + Util.AddToGatheredIds(uuids, sun_id, (sbyte)AssetType.Texture); + } + } +} diff --git a/OpenSim/Framework/ViewerWater.cs b/OpenSim/Framework/ViewerWater.cs new file mode 100644 index 0000000000..41383d2a05 --- /dev/null +++ b/OpenSim/Framework/ViewerWater.cs @@ -0,0 +1,154 @@ +/* + * Copyright (c) Contributors, http://opensimulator.org/ + * See CONTRIBUTORS.TXT for a full list of copyright holders. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of the OpenSimulator Project nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +using System.Collections.Generic; +using OpenMetaverse; +using OpenMetaverse.StructuredData; + +namespace OpenSim.Framework +{ + public class WaterData + { + public UUID normalMap = new UUID("822ded49-9a6c-f61c-cb89-6df54f42cdf4"); + public UUID transpTexture = new UUID("2bfd3884-7e27-69b9-ba3a-3e673f680004"); + + public float blurMultiplier = 0.04f; + public float fresnelOffset = 0.5f; + public float fresnelScale = 0.4f; + public Vector3 normScale = new Vector3(2f, 2f, 2f); + public float scaleAbove = 0.03f; + public float scaleBelow = 0.2f; + public float underWaterFogMod = 0.25f; + public Vector3 waterFogColor = new Vector3(0.0156f, 0.149f, 0.2509f); + public float waterFogDensity = 10; + public Vector2 wave1Dir = new Vector2(1.05f, -0.42f); + public Vector2 wave2Dir = new Vector2(1.11f, -1.16f); + public string Name; + + public void FromWLOSD(string name, OSD osd) + { + Vector4 v4tmp; + OSDMap map = osd as OSDMap; + blurMultiplier = map["blurMultiplier"]; + fresnelOffset = map["fresnelOffset"]; + fresnelScale = map["fresnelScale"]; + normScale = map["normScale"]; + normalMap = map["normalMap"]; + scaleAbove = map["scaleAbove"]; + scaleBelow = map["scaleBelow"]; + underWaterFogMod = map["underWaterFogMod"]; + v4tmp = map["waterFogColor"]; + waterFogColor = new Vector3(v4tmp.X, v4tmp.Y, v4tmp.Z); + waterFogDensity = map["waterFogDensity"]; + wave1Dir = map["wave1Dir"]; + wave2Dir = map["wave2Dir"]; + Name = name; + } + + public OSDMap ToWLOSD() + { + OSDMap map = new OSDMap(); + + map["blurMultiplier"] = blurMultiplier; + map["fresnelOffset"] = fresnelOffset; + map["fresnelScale"] = fresnelScale; + map["normScale"] = normScale; + map["normalMap"] = normalMap; + map["scaleAbove"] = scaleAbove; + map["scaleBelow"] = scaleBelow; + map["underWaterFogMod"] = underWaterFogMod; + map["waterFogColor"] = new Vector4(waterFogColor.X, waterFogColor.Y, waterFogColor.Z, 1); + map["waterFogDensity"] = waterFogDensity; + //map["waterFogDensity"] = (float)Math.Pow(2.0f, waterFogDensity); + map["wave1Dir"] = wave1Dir; + map["wave2Dir"] = wave2Dir; + + return map; + } + + public void FromOSD(string name, OSDMap map) + { + OSD otmp; + if (map.TryGetValue("blur_multiplier", out otmp)) + blurMultiplier = otmp; + if (map.TryGetValue("fresnel_offset", out otmp)) + fresnelOffset = otmp; + if (map.TryGetValue("fresnel_scale", out otmp)) + fresnelScale = otmp; + if (map.TryGetValue("normal_scale", out otmp)) + normScale = otmp; + if (map.TryGetValue("normal_map", out otmp)) + normalMap = otmp; + if (map.TryGetValue("scale_above", out otmp)) + scaleAbove = otmp; + if (map.TryGetValue("scale_below", out otmp)) + scaleBelow = otmp; + if (map.TryGetValue("underwater_fog_mod", out otmp)) + underWaterFogMod = otmp; + if (map.TryGetValue("water_fog_color", out otmp)) + waterFogColor = otmp; + if (map.TryGetValue("water_fog_density", out otmp)) + waterFogDensity = otmp; + if (map.TryGetValue("wave1_direction", out otmp)) + wave1Dir = otmp; + if (map.TryGetValue("wave2_direction", out otmp)) + wave2Dir = otmp; + if (map.TryGetValue("transparent_texture", out otmp)) + transpTexture = otmp; + + Name = name; + } + + public OSDMap ToOSD() + { + OSDMap map = new OSDMap(); + + map["blur_multiplier"] = blurMultiplier; + map["fresnel_offset"] = fresnelOffset; + map["fresnel_scale"] = fresnelScale; + map["normal_scale"] = normScale; + map["normal_map"] = normalMap; + map["scale_above"] = scaleAbove; + map["scale_below"] = scaleBelow; + map["underwater_fog_mod"] = underWaterFogMod; + map["water_fog_color"] = waterFogColor; + map["water_fog_density"] = waterFogDensity; + map["wave1_direction"] = wave1Dir; + map["wave2_direction"] = wave2Dir; + map["transparent_texture"] = transpTexture; + map["type"] ="water"; + + return map; + } + + public void GatherAssets(Dictionary uuids) + { + Util.AddToGatheredIds(uuids, normalMap, (sbyte)AssetType.Texture); + Util.AddToGatheredIds(uuids, transpTexture, (sbyte)AssetType.Texture); + } + } +}