Browse Source

allow the use of Sky or water from a asset, not just full daycycle. This may need more work

UbitUmarov 3 năm trước cách đây
mục cha
commit
1f822c6077

+ 58 - 3
OpenSim/Framework/ViewerDaycycle.cs

@@ -137,6 +137,59 @@ namespace OpenSim.Framework
                 array[3] = new OSDMap();
         }
 
+        public bool replaceWaterFromOSD(string name, OSDMap map)
+        {
+            WaterData water = new WaterData();
+            if(string.IsNullOrWhiteSpace(name))
+                name = "Water";
+            try
+            {
+                water.FromOSD(name, map);
+            }
+            catch
+            {
+                return false;
+            }
+            waterframes.Clear();
+            waterframes[name] = water;
+            waterTrack.Clear();
+            TrackEntry t = new TrackEntry()
+            {
+                time = -1,
+                frameName = name
+            };
+            waterTrack.Add(t);
+            return true;
+        }
+
+        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 void FromOSD(OSDMap map)
         {
             CompareTrackEntries cte = new CompareTrackEntries();
@@ -188,9 +241,11 @@ namespace OpenSim.Framework
                             {
                                 if (d.TryGetValue("key_name", out OSD dname))
                                 {
-                                    TrackEntry t = new TrackEntry();
-                                    t.time = dtime;
-                                    t.frameName = dname;
+                                    TrackEntry t = new TrackEntry()
+                                    {
+                                        time = dtime,
+                                        frameName = dname
+                                    };
                                     waterTrack.Add(t);
                                 }
                             }

+ 38 - 2
OpenSim/Framework/ViewerEnvironment.cs

@@ -373,16 +373,52 @@ namespace OpenSim.Framework
             OSDMap map = osd as OSDMap;
             if (map == null)
                 return false;
-            if(!map.TryGetValue("type", out OSD tmp))
+            if (!map.TryGetValue("type", out OSD tmp))
                 return false;
             string type = tmp.AsString();
-            if(type != "daycycle")
+            if (type != "daycycle")
                 return false;
             Cycle = new DayCycle();
             Cycle.FromOSD(map);
             return true;
         }
 
+        public bool FromAssetOSD(string name, OSD osd)
+        {
+            OSDMap map = osd as OSDMap;
+            if (map == null)
+                return false;
+            if (!map.TryGetValue("type", out OSD tmp))
+                return false;
+            string type = tmp.AsString();
+
+            bool ok = false;
+            if (type == "water")
+            {
+                if (Cycle == null)
+                    Cycle = new DayCycle();
+                ok = Cycle.replaceWaterFromOSD(name, map);
+            }
+            else
+            {
+                if (type == "daycycle")
+                {
+                    Cycle = new DayCycle();
+                    Cycle.FromOSD(map);
+                    ok = true;
+                }
+                else if(type == "sky")
+                {
+                    if (Cycle == null)
+                        Cycle = new DayCycle();
+                    ok = Cycle.replaceSkyFromOSD(name, map);
+                }
+            }
+            if(ok && !string.IsNullOrWhiteSpace(name))
+                Cycle.Name = name;
+            return ok;
+        }
+
         public OSD ToOSD()
         {
             OSDMap env = new OSDMap();

+ 11 - 5
OpenSim/Region/CoreModules/World/LightShare/EnvironmentModule.cs

@@ -594,16 +594,16 @@ namespace OpenSim.Region.CoreModules.World.LightShare
             try
             {
                 OSD req = OSDParser.Deserialize(httpRequest.InputStream);
-                if(req is OpenMetaverse.StructuredData.OSDMap)
+                if(req is OSDMap)
                 {
-                    OSDMap map = req as OpenMetaverse.StructuredData.OSDMap;
+                    OSDMap map = req as OSDMap;
                     if(map.TryGetValue("environment", out OSD env))
                     {
                         if (VEnv == null)
                             // need a proper clone
                             VEnv = m_DefaultEnv.Clone();
 
-                        OSDMap evmap = (OSDMap)env;
+                        OSDMap evmap = env as OSDMap;
                         if(evmap.TryGetValue("day_asset", out OSD tmp) && !evmap.ContainsKey("day_cycle"))
                         {
                             string id = tmp.AsString();
@@ -616,7 +616,11 @@ namespace OpenSim.Region.CoreModules.World.LightShare
                             try
                             {
                                 OSD oenv = OSDParser.Deserialize(asset.Data);
-                                VEnv.CycleFromOSD(oenv);
+                                evmap.TryGetValue("day_name", out tmp);
+                                if(tmp is OSDString)
+                                    VEnv.FromAssetOSD(tmp.AsString(), oenv);
+                                else
+                                    VEnv.FromAssetOSD(null, oenv);
                             }
                             catch
                             {
@@ -624,7 +628,9 @@ namespace OpenSim.Region.CoreModules.World.LightShare
                                 return;
                             }
                         }
-                        VEnv.FromOSD(env);
+                        else
+                            VEnv.FromOSD(env);
+
                         if(lchannel == null)
                         {
                             StoreOnRegion(VEnv);