better keep some things sorted

master
UbitUmarov 2020-06-12 10:16:59 +01:00
parent d1ecccfaca
commit e404d671c8
1 changed files with 91 additions and 134 deletions

View File

@ -615,12 +615,18 @@ namespace OpenSim.Framework
} }
} }
public class CompareTrackEntries : IComparer<TrackEntry>
{
public int Compare(TrackEntry x, TrackEntry y)
{
return x.time.CompareTo(y.time);
}
}
public bool IsStaticDayCycle = false; public bool IsStaticDayCycle = false;
public List<TrackEntry> skyTrack0 = new List<TrackEntry>();
public List<TrackEntry> skyTrack1 = new List<TrackEntry>();
public List<TrackEntry> skyTrack2 = new List<TrackEntry>();
public List<TrackEntry> skyTrack3 = new List<TrackEntry>();
public List<TrackEntry> waterTrack = new List<TrackEntry>(); public List<TrackEntry> waterTrack = new List<TrackEntry>();
public List<TrackEntry> skyTrack0 = new List<TrackEntry>();
public List<TrackEntry>[] skyTracks = new List<TrackEntry>[3];
public Dictionary<string, SkyData> skyframes = new Dictionary<string, SkyData>(); public Dictionary<string, SkyData> skyframes = new Dictionary<string, SkyData>();
public Dictionary<string, WaterData> waterframes = new Dictionary<string, WaterData>(); public Dictionary<string, WaterData> waterframes = new Dictionary<string, WaterData>();
@ -629,6 +635,7 @@ namespace OpenSim.Framework
public void FromWLOSD(OSDArray array) public void FromWLOSD(OSDArray array)
{ {
CompareTrackEntries cte = new CompareTrackEntries();
TrackEntry track; TrackEntry track;
OSDArray skytracksArray = null; OSDArray skytracksArray = null;
@ -645,6 +652,7 @@ namespace OpenSim.Framework
skyTrack0.Add(track); skyTrack0.Add(track);
} }
} }
skyTrack0.Sort(cte);
} }
OSDMap skyFramesArray = null; OSDMap skyFramesArray = null;
@ -679,34 +687,29 @@ namespace OpenSim.Framework
{ {
OSDArray track = new OSDArray(); OSDArray track = new OSDArray();
foreach (TrackEntry te in skyTrack0) foreach (TrackEntry te in skyTrack0)
{
track.Add(new OSDArray { te.time, te.frameName }); track.Add(new OSDArray { te.time, te.frameName });
}
array[1] = track; array[1] = track;
OSDMap frames = new OSDMap(); OSDMap frames = new OSDMap();
foreach (KeyValuePair<string, SkyData> kvp in skyframes) foreach (KeyValuePair<string, SkyData> kvp in skyframes)
{
frames[kvp.Key] = kvp.Value.ToWLOSD(); frames[kvp.Key] = kvp.Value.ToWLOSD();
}
array[2] = frames; array[2] = frames;
if(waterTrack.Count > 0) if(waterTrack.Count > 0)
{ {
TrackEntry te = waterTrack[0]; TrackEntry te = waterTrack[0];
if(waterframes.TryGetValue(te.frameName, out WaterData water)) if(waterframes.TryGetValue(te.frameName, out WaterData water))
{
array[3] = water.ToWLOSD(); array[3] = water.ToWLOSD();
} }
}
else else
array[3] = new OSDMap(); array[3] = new OSDMap();
} }
public void FromOSD(OSDMap map) public void FromOSD(OSDMap map)
{ {
CompareTrackEntries cte = new CompareTrackEntries();
OSD otmp; OSD otmp;
if(map.TryGetValue("frames", out otmp) && otmp is OSDMap) if(map.TryGetValue("frames", out otmp) && otmp is OSDMap)
{ {
OSDMap mframes = otmp as OSDMap; OSDMap mframes = otmp as OSDMap;
@ -744,6 +747,8 @@ namespace OpenSim.Framework
if(tracks.Count > 0) if(tracks.Count > 0)
{ {
track = tracks[0] as OSDArray; track = tracks[0] as OSDArray;
if (track != null && track.Count > 0)
{
for (int i = 0; i < track.Count; ++i) for (int i = 0; i < track.Count; ++i)
{ {
OSDMap d = track[i] as OSDMap; OSDMap d = track[i] as OSDMap;
@ -758,10 +763,14 @@ namespace OpenSim.Framework
} }
} }
} }
waterTrack.Sort(cte);
}
} }
if (tracks.Count > 1) if (tracks.Count > 1)
{ {
track = tracks[1] as OSDArray; track = tracks[1] as OSDArray;
if (track != null && track.Count > 0)
{
for (int i = 0; i < track.Count; ++i) for (int i = 0; i < track.Count; ++i)
{ {
OSDMap d = track[i] as OSDMap; OSDMap d = track[i] as OSDMap;
@ -776,10 +785,17 @@ namespace OpenSim.Framework
} }
} }
} }
skyTrack0.Sort(cte);
}
} }
if (tracks.Count > 2) if (tracks.Count > 2)
{ {
track = tracks[2] as OSDArray; 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) for (int i = 0; i < track.Count; ++i)
{ {
OSDMap d = track[i] as OSDMap; OSDMap d = track[i] as OSDMap;
@ -790,44 +806,11 @@ namespace OpenSim.Framework
TrackEntry t = new TrackEntry(); TrackEntry t = new TrackEntry();
t.time = dtime; t.time = dtime;
t.frameName = dname; t.frameName = dname;
skyTrack1.Add(t); skyTracks[dt].Add(t);
} }
} }
} }
} skyTracks[dt].Sort(cte);
if (tracks.Count > 3)
{
track = tracks[3] as OSDArray;
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;
skyTrack2.Add(t);
}
}
}
}
if (tracks.Count > 4)
{
track = tracks[4] as OSDArray;
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;
skyTrack3.Add(t);
}
} }
} }
} }
@ -880,8 +863,12 @@ namespace OpenSim.Framework
} }
tracks.Add(track); tracks.Add(track);
for(int st = 0; st < 3; ++st)
{
track = new OSDArray(); track = new OSDArray();
foreach (TrackEntry te in skyTrack1) if(skyTracks[st] != null)
{
foreach (TrackEntry te in skyTracks[st])
{ {
tmp = new OSDMap(); tmp = new OSDMap();
if (te.time < 0) if (te.time < 0)
@ -891,33 +878,9 @@ namespace OpenSim.Framework
tmp["key_name"] = te.frameName; tmp["key_name"] = te.frameName;
track.Add(tmp); track.Add(tmp);
} }
tracks.Add(track);
track = new OSDArray();
foreach (TrackEntry te in skyTrack2)
{
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); tracks.Add(track);
track = new OSDArray();
foreach (TrackEntry te in skyTrack3)
{
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["tracks"] = tracks;
cycle["type"] = "daycycle"; cycle["type"] = "daycycle";
@ -1171,8 +1134,23 @@ namespace OpenSim.Framework
OSDArray alt = otmp as OSDArray; OSDArray alt = otmp as OSDArray;
for(int i = 0; i < alt.Count && i < 3; ++i) for(int i = 0; i < alt.Count && i < 3; ++i)
{
Altitudes[i] = alt[i]; Altitudes[i] = alt[i];
for(int i = 0; i < 2; ++i)
{
float h = Altitudes[i];
for(int j = i + 1; j < 3; ++j)
{
if(h > Altitudes[j])
{
Altitudes[i] = Altitudes[j];
Altitudes[j] = h;
List<DayCycle.TrackEntry> tet = Cycle.skyTracks[i];
Cycle.skyTracks[i] = Cycle.skyTracks[j];
Cycle.skyTracks[j] = tet;
h = Altitudes[i];
}
}
} }
} }
@ -1252,19 +1230,8 @@ namespace OpenSim.Framework
while (altindx >= 0) while (altindx >= 0)
{ {
switch (altindx) track = Cycle.skyTracks[altindx];
{ if (track != null && track.Count > 0)
case 2:
track = Cycle.skyTrack3;
break;
case 1:
track = Cycle.skyTrack2;
break;
case 0:
track = Cycle.skyTrack1;
break;
}
if (track != null)
break; break;
--altindx; --altindx;
} }
@ -1283,6 +1250,7 @@ namespace OpenSim.Framework
sundir = Xrot(sunrot); sundir = Xrot(sunrot);
return true; return true;
} }
int i = 0; int i = 0;
while (i < track.Count) while (i < track.Count)
{ {
@ -1367,18 +1335,7 @@ namespace OpenSim.Framework
while (altindx >= 0) while (altindx >= 0)
{ {
switch (altindx) track = Cycle.skyTracks[altindx];
{
case 2:
track = Cycle.skyTrack3;
break;
case 1:
track = Cycle.skyTrack2;
break;
case 0:
track = Cycle.skyTrack1;
break;
}
if (track != null && track.Count > 0) if (track != null && track.Count > 0)
break; break;
--altindx; --altindx;