Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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;
            }
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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;
            }
        }
Beispiel #7
0
        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);
                        }
                    }
                }
            }
        }