a few more changes on sun position

master
UbitUmarov 2020-06-11 06:08:21 +01:00
parent 13ed40d9f6
commit c6fcc33e49
2 changed files with 225 additions and 41 deletions

View File

@ -1274,7 +1274,7 @@ namespace OpenSim.Framework
if (track == null || track.Count == 0) if (track == null || track.Count == 0)
return false; return false;
if(track.Count == 1) if (track.Count == 1 || track[0].time < 0)
{ {
if (!Cycle.skyframes.TryGetValue(track[0].frameName, out SkyData sky) || sky == null) if (!Cycle.skyframes.TryGetValue(track[0].frameName, out SkyData sky) || sky == null)
return false; return false;
@ -1282,7 +1282,177 @@ namespace OpenSim.Framework
moondir = Xrot(moonrot); moondir = Xrot(moonrot);
sunrot = sky.sun_rotation; sunrot = sky.sun_rotation;
sundir = Xrot(sunrot); sundir = Xrot(sunrot);
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;
secondFrac = track[0].time + 1f;
first = track[ntracks].frameName;
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 SkyData sky1) || sky1 == null)
firstFrac = -1;
if (!Cycle.skyframes.TryGetValue(second, out SkyData sky2) || sky2 == null)
secondFrac = -1;
if (firstFrac < 0)
{
if (secondFrac < 0)
return false;
moonrot = sky2.moon_rotation;
moondir = Xrot(moonrot);
sunrot = sky2.sun_rotation;
sundir = Xrot(sunrot);
return true;
}
if (secondFrac < 0 || secondFrac == firstFrac)
{
moonrot = sky1.moon_rotation;
moondir = Xrot(moonrot);
sunrot = sky1.sun_rotation;
sundir = Xrot(sunrot);
return true;
}
dayfrac -= firstFrac;
secondFrac -= firstFrac;
dayfrac /= secondFrac;
moonrot = Quaternion.Slerp(sky1.moon_rotation, sky2.moon_rotation, dayfrac);
moondir = Xrot(moonrot);
sunrot = Quaternion.Slerp(sky1.sun_rotation, sky2.sun_rotation, dayfrac);
sundir = Xrot(sunrot);
return true;
}
public bool getWLPositions(float altitude, float dayfrac, out Vector3 sundir)
{
sundir = Vector3.Zero;
List<DayCycle.TrackEntry> track = null;
if (altitude < Altitudes[0])
track = Cycle.skyTrack0;
else
{
int altindx = 2;
for (; altindx > 0; --altindx)
{
if (Altitudes[altindx] < altitude)
break;
}
while (altindx >= 0)
{
switch (altindx)
{
case 2:
track = Cycle.skyTrack3;
break;
case 1:
track = Cycle.skyTrack2;
break;
case 0:
track = Cycle.skyTrack1;
break;
}
if (track != null)
break;
--altindx;
}
}
if (track == null || track.Count == 0)
return false;
Quaternion sunrot;
if (track.Count == 1 || track[0].time < 0)
{
if (!Cycle.skyframes.TryGetValue(track[0].frameName, out SkyData sky) || sky == null)
return false;
sunrot = sky.sun_rotation;
sundir = Xrot(sunrot);
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;
secondFrac = track[0].time + 1f;
first = track[ntracks].frameName;
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 SkyData sky1) || sky1 == null)
firstFrac = -1;
if (!Cycle.skyframes.TryGetValue(second, out SkyData sky2) || sky2 == null)
secondFrac = -1;
if (firstFrac < 0)
{
if (secondFrac < 0)
return false;
sunrot = sky2.sun_rotation;
sundir = Xrot(sunrot);
return true;
}
if (secondFrac < 0 || secondFrac == firstFrac)
{
sunrot = sky1.sun_rotation;
sundir = Xrot(sunrot);
return true;
}
dayfrac -= firstFrac;
secondFrac -= firstFrac;
dayfrac /= secondFrac;
sunrot = Quaternion.Slerp(sky1.sun_rotation, sky2.sun_rotation, dayfrac);
sundir = Xrot(sunrot);
return true; return true;
} }
} }

View File

@ -163,6 +163,8 @@ namespace OpenSim.Region.CoreModules.World.LightShare
} }
} }
} }
if (m_DefaultEnv == null)
m_DefaultEnv = new ViewerEnviroment();
string senv = scene.SimulationDataService.LoadRegionEnvironmentSettings(scene.RegionInfo.RegionID); string senv = scene.SimulationDataService.LoadRegionEnvironmentSettings(scene.RegionInfo.RegionID);
if(!string.IsNullOrEmpty(senv)) if(!string.IsNullOrEmpty(senv))
@ -385,7 +387,7 @@ namespace OpenSim.Region.CoreModules.World.LightShare
ViewerEnviroment VEnv = m_scene.RegionEnviroment; ViewerEnviroment VEnv = m_scene.RegionEnviroment;
if (VEnv == null) if (VEnv == null)
VEnv = m_DefaultEnv == null ? new ViewerEnviroment() : m_DefaultEnv; VEnv = m_DefaultEnv;
OSDMap map = new OpenMetaverse.StructuredData.OSDMap(); OSDMap map = new OpenMetaverse.StructuredData.OSDMap();
map["environment"] = VEnv.ToOSD(); map["environment"] = VEnv.ToOSD();
@ -453,7 +455,16 @@ namespace OpenSim.Region.CoreModules.World.LightShare
{ {
ViewerEnviroment VEnv = m_scene.RegionEnviroment; ViewerEnviroment VEnv = m_scene.RegionEnviroment;
if (VEnv == null) if (VEnv == null)
{
VEnv = new ViewerEnviroment(); VEnv = new ViewerEnviroment();
if (m_DefaultEnv != null)
{
OSD otmp = m_DefaultEnv.ToOSD();
byte[] btmp = OSDParser.SerializeLLSDXmlToBytes(otmp);
otmp = OSDParser.DeserializeLLSDXml(btmp);
VEnv.FromOSD(otmp);
}
}
OSDMap evmap = (OSDMap)env; OSDMap evmap = (OSDMap)env;
if(evmap.TryGetValue("day_asset", out OSD tmp) && !evmap.ContainsKey("day_cycle")) if(evmap.TryGetValue("day_asset", out OSD tmp) && !evmap.ContainsKey("day_cycle"))
{ {
@ -539,16 +550,12 @@ namespace OpenSim.Region.CoreModules.World.LightShare
// m_log.DebugFormat("[{0}]: Environment GET handle for agentID {1} in region {2}", // m_log.DebugFormat("[{0}]: Environment GET handle for agentID {1} in region {2}",
// Name, agentID, caps.RegionName); // Name, agentID, caps.RegionName);
string env = String.Empty;
ViewerEnviroment VEnv = m_scene.RegionEnviroment; ViewerEnviroment VEnv = m_scene.RegionEnviroment;
if (VEnv == null) if (VEnv == null)
VEnv = m_DefaultEnv; VEnv = m_DefaultEnv;
if (VEnv != null)
{
OSD d = VEnv.ToWLOSD(UUID.Zero, regionID); OSD d = VEnv.ToWLOSD(UUID.Zero, regionID);
env = OSDParser.SerializeLLSDXmlString(d); string env = OSDParser.SerializeLLSDXmlString(d);
}
if (String.IsNullOrEmpty(env)) if (String.IsNullOrEmpty(env))
{ {
@ -760,16 +767,9 @@ namespace OpenSim.Region.CoreModules.World.LightShare
ViewerEnviroment env = m_scene.RegionEnviroment; ViewerEnviroment env = m_scene.RegionEnviroment;
if(env == null) if(env == null)
env = m_DefaultEnv; env = m_DefaultEnv;
if(env == null)
{
m_dayOffset = 57600f;
m_dayOffset = 14400f;
}
else
{
m_dayOffset = env.DayOffset; m_dayOffset = env.DayOffset;
m_dayLen = env.DayLength; m_dayLen = env.DayLength;
}
m_currentTime = Util.UnixTimeSinceEpoch() + m_dayOffset; m_currentTime = Util.UnixTimeSinceEpoch() + m_dayOffset;
float dayFrac = (m_currentTime % m_dayLen) / m_dayLen; float dayFrac = (m_currentTime % m_dayLen) / m_dayLen;
@ -777,31 +777,45 @@ namespace OpenSim.Region.CoreModules.World.LightShare
m_sunAngle = Utils.TWO_PI * dayFrac; m_sunAngle = Utils.TWO_PI * dayFrac;
bool r = env.getPositions(0, dayFrac, out m_sunDir, out Vector3 moondir, out m_sunVel,
out Quaternion sunrot, out Quaternion moonrot);
++m_frame; ++m_frame;
if(m_frame % 50 == 0) if(m_frame % 50 == 0)
UpdateClientsSunTime(); UpdateClientsSunTime(env, dayFrac);
} }
private void UpdateClientsSunTime() private void UpdateClientsSunTime(ViewerEnviroment env, float dayFrac)
{ {
m_scene.ForEachClient(delegate (IClientAPI client) float wldayFrac = dayFrac;
if (wldayFrac < 0.25f)
wldayFrac += 1.5f;
else if (wldayFrac > 0.75)
wldayFrac += 0.5f;
else if (wldayFrac > 0.33)
wldayFrac = 3 * wldayFrac - 1;
else
wldayFrac = 3 * wldayFrac + 1;
wldayFrac = Utils.Clamp(wldayFrac, 0, 2);
wldayFrac *= Utils.PI;
m_scene.ForEachRootScenePresence(delegate (ScenePresence sp)
{ {
if (!client.IsActive) if(sp.IsDeleted || sp.IsInTransit || sp.IsNPC)
return; return;
/* IClientAPI client = sp.ControllingClient;
uint vflags = client.GetViewerCaps(); uint vflags = client.GetViewerCaps();
if ((vflags & 0x8000) != 0) if ((vflags & 0x8000) != 0)
m_estateModule.HandleRegionInfoRequest(client); {
client.SendSunPos(Vector3.Zero, Vector3.Zero, m_sunAngle);
return;
}
else if ((vflags & 0x4000) != 0) float z = sp.AbsolutePosition.Z;
m_eventQueue.WindlightRefreshEvent(interpolate, client.AgentId); if (z < 0)
*/ z = 0;
client.SendSunPos(m_sunDir, m_sunVel, m_sunAngle); env.getWLPositions(z, dayFrac, out m_sunDir);
client.SendSunPos(m_sunDir, Vector3.Zero, wldayFrac);
}); });
} }
} }