more on SendViewerTime()

master
UbitUmarov 2020-06-13 15:48:35 +01:00
parent 3bf0f6c407
commit b37141182a
6 changed files with 95 additions and 173 deletions

View File

@ -1286,21 +1286,8 @@ namespace OpenSim.Framework
void SendDialog(string objectname, UUID objectID, UUID ownerID, string ownerFirstName, string ownerLastName, string msg, UUID textureID, int ch,
string[] buttonlabels);
/// <summary>
/// Update the client as to where the sun is currently located.
/// </summary>
/// <param name="sunPos"></param>
/// <param name="sunVel"></param>
/// <param name="CurrentTime">Seconds since Unix Epoch 01/01/1970 00:00:00</param>
/// <param name="SecondsPerSunCycle"></param>
/// <param name="SecondsPerYear"></param>
/// <param name="OrbitalPosition">The orbital position is given in radians, and must be "adjusted" for the linden client, see LLClientView</param>
//void SendSunPos(Vector3 sunPos, Vector3 sunVel, ulong CurrentTime, uint SecondsPerSunCycle, uint SecondsPerYear,
// float OrbitalPosition);
void SendSunPos(Vector3 sunPos, Vector3 sunVel, float sunAngle);
void SendViewerTime(Vector3 sunDir, float sunphase);
void SendViewerEffect(ViewerEffectPacket.EffectBlock[] effectBlocks);
void SendViewerTime(int phase);
void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, Byte[] membershipType, string flAbout,
uint flags, UUID flImageID, UUID imageID, string profileURL, UUID partnerID);

View File

@ -27,6 +27,7 @@
using System;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using OpenMetaverse;
using OpenMetaverse.StructuredData;
@ -1208,46 +1209,40 @@ namespace OpenSim.Framework
return top;
}
public bool getPositions(float altitude, float dayfrac, out Vector3 sundir, out Vector3 moondir,
out Quaternion sunrot, out Quaternion moonrot)
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public List<DayCycle.TrackEntry> FindTrack(float altitude)
{
sundir = Vector3.Zero;
moondir = Vector3.Zero;
sunrot = Quaternion.Identity;
moonrot = Quaternion.Identity;
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;
}
return Cycle.skyTrack0;
while (altindx >= 0)
{
track = Cycle.skyTracks[altindx];
if (track != null && track.Count > 0)
break;
--altindx;
}
int altindx = 1;
for (; altindx < Altitudes.Length; ++altindx)
{
if (Altitudes[altindx] > altitude)
break;
}
if (track == null || track.Count == 0)
return false;
List<DayCycle.TrackEntry> track = null;
while (--altindx >= 0)
{
track = Cycle.skyTracks[altindx];
if (track != null && track.Count > 0)
break;
}
return track;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
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 SkyData sky) || sky == null)
if (!Cycle.skyframes.TryGetValue(track[0].frameName, out sky1) || sky1 == null)
return false;
moonrot = sky.moon_rotation;
moondir = Xrot(moonrot);
sunrot = sky.sun_rotation;
sundir = Xrot(sunrot);
return true;
}
@ -1263,6 +1258,7 @@ namespace OpenSim.Framework
float secondFrac;
string first;
string second;
int ntracks = track.Count;
if (i == 0 || i == ntracks)
{
@ -1281,22 +1277,50 @@ namespace OpenSim.Framework
first = track[i].frameName;
}
if (!Cycle.skyframes.TryGetValue(first, out SkyData sky1) || sky1 == null)
if (!Cycle.skyframes.TryGetValue(first, out sky1) || sky1 == null)
firstFrac = -1;
if (!Cycle.skyframes.TryGetValue(second, out SkyData sky2) || sky2 == null)
if (!Cycle.skyframes.TryGetValue(second, out 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);
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;
}
public bool getPositions(float altitude, float dayfrac, out Vector3 sundir, out Vector3 moondir,
out Quaternion sunrot, out Quaternion moonrot)
{
sundir = Vector3.Zero;
moondir = Vector3.Zero;
sunrot = Quaternion.Identity;
moonrot = Quaternion.Identity;
List<DayCycle.TrackEntry> track = FindTrack(altitude);
if (track == null || track.Count == 0)
return false;
if (!FindSkies(track, dayfrac, out dayfrac, out SkyData sky1, out SkyData sky2))
return false;
if (sky2 == null)
{
moonrot = sky1.moon_rotation;
moondir = Xrot(moonrot);
@ -1305,10 +1329,6 @@ namespace OpenSim.Framework
return true;
}
dayfrac -= firstFrac;
secondFrac -= firstFrac;
dayfrac /= secondFrac;
moonrot = Quaternion.Slerp(sky1.moon_rotation, sky2.moon_rotation, dayfrac);
moondir = Xrot(moonrot);
@ -1321,93 +1341,21 @@ namespace OpenSim.Framework
{
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)
{
track = Cycle.skyTracks[altindx];
if (track != null && track.Count > 0)
break;
--altindx;
}
}
List<DayCycle.TrackEntry> track = track = FindTrack(altitude);
if (track == null || track.Count == 0)
return false;
if (!FindSkies(track, dayfrac, out dayfrac, out SkyData sky1, out SkyData sky2))
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;
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 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)
if (sky2 == null)
{
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;

View File

@ -46,6 +46,8 @@ using Caps = OpenSim.Framework.Capabilities.Caps;
using OSDArray = OpenMetaverse.StructuredData.OSDArray;
using OSDMap = OpenMetaverse.StructuredData.OSDMap;
using MethodImplOptions = System.Runtime.CompilerServices.MethodImplOptions;
namespace OpenSim.Region.CoreModules.World.LightShare
{
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "EnvironmentModule")]
@ -539,7 +541,7 @@ namespace OpenSim.Region.CoreModules.World.LightShare
// Name, agentID, caps.RegionName);
ViewerEnviroment VEnv = GetRegionEnviroment();
OSD d = VEnv.ToWLOSD(UUID.Zero, regionID);
string env = OSDParser.SerializeLLSDXmlString(d);
@ -750,24 +752,27 @@ namespace OpenSim.Region.CoreModules.World.LightShare
private void UpdateClientsSunTime()
{
if(m_scene.GetNumberOfClients() == 0)
return;
ViewerEnviroment env = GetRegionEnviroment();
float dayFrac = GetDayFractionTime(env);
// don't ask me what this mess is, just is
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);
if (wldayFrac <= 0.25f)
wldayFrac += 1.5f;
else if (wldayFrac > 0.75f)
wldayFrac += 0.5f;
else if (wldayFrac >= 0.333333f)
wldayFrac = 3f * wldayFrac - 1f;
else
wldayFrac = 3f * wldayFrac + 1f;
wldayFrac = Utils.Clamp(wldayFrac, 0, 2f);
wldayFrac *= Utils.PI;
dayFrac *= Utils.TWO_PI;
float eepDayFrac = dayFrac * Utils.TWO_PI;
m_scene.ForEachRootScenePresence(delegate (ScenePresence sp)
{
@ -779,12 +784,12 @@ namespace OpenSim.Region.CoreModules.World.LightShare
if ((vflags & 0x8000) != 0)
{
client.SendSunPos(Vector3.Zero, Vector3.Zero, dayFrac);
client.SendViewerTime(Vector3.Zero, eepDayFrac);
return;
}
env.getWLPositions(sp.AbsolutePosition.Z, dayFrac, out Vector3 m_sunDir);
client.SendSunPos(m_sunDir, Vector3.Zero, wldayFrac);
client.SendViewerTime(m_sunDir, wldayFrac);
});
}
@ -848,37 +853,37 @@ namespace OpenSim.Region.CoreModules.World.LightShare
return moonrot;
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
[System.Runtime.CompilerServices.MethodImpl(MethodImplOptions.AggressiveInlining)]
public int GetRegionDayLength()
{
return GetRegionEnviroment().DayLength;
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
[System.Runtime.CompilerServices.MethodImpl(MethodImplOptions.AggressiveInlining)]
public int GetRegionDayOffset()
{
return GetRegionEnviroment().DayOffset;
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
[System.Runtime.CompilerServices.MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector3 GetRegionSunDir(float altitude)
{
return GetSunDir(GetRegionEnviroment(), altitude);
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
[System.Runtime.CompilerServices.MethodImpl(MethodImplOptions.AggressiveInlining)]
public Quaternion GetRegionSunRot(float altitude)
{
return GetSunRot(GetRegionEnviroment(), altitude);
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
[System.Runtime.CompilerServices.MethodImpl(MethodImplOptions.AggressiveInlining)]
public Vector3 GetRegionMoonDir(float altitude)
{
return GetMoonDir(GetRegionEnviroment(), altitude);
}
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.AggressiveInlining)]
[System.Runtime.CompilerServices.MethodImpl(MethodImplOptions.AggressiveInlining)]
public Quaternion GetRegionMoonRot(float altitude)
{
return GetMoonRot(GetRegionEnviroment(), altitude);

View File

@ -1235,8 +1235,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
{
}
//public void SendSunPos(Vector3 sunPos, Vector3 sunVel, ulong CurrentTime, uint SecondsPerSunCycle, uint SecondsPerYear, float OrbitalPosition)
public void SendSunPos(Vector3 sunPos, Vector3 sunVel, float sunAngle)
public void SendViewerTime(Vector3 sunDir, float sunphase)
{
}
@ -1244,11 +1243,6 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
{
}
public void SendViewerTime(int phase)
{
}
public void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, byte[] membershipType, string flAbout, uint flags, UUID flImageID, UUID imageID, string profileURL, UUID partnerID)
{

View File

@ -988,8 +988,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
{
}
//public void SendSunPos(Vector3 sunPos, Vector3 sunVel, ulong time, uint dlen, uint ylen, float phase)
public void SendSunPos(Vector3 sunPos, Vector3 sunVel, float sunAngle)
public void SendViewerTime(Vector3 sunDir, float sunphase)
{
}
@ -997,10 +996,6 @@ namespace OpenSim.Region.OptionalModules.World.NPC
{
}
public void SendViewerTime(int phase)
{
}
public void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, Byte[] membershipType,
string flAbout, uint flags, UUID flImageID, UUID imageID, string profileURL,
UUID partnerID)

View File

@ -981,16 +981,13 @@ namespace OpenSim.Tests.Common
public void SendAdminResponse(UUID Token, uint AdminLevel)
{
}
public void SendGroupMembership(GroupMembershipData[] GroupMembership)
{
}
//public void SendSunPos(Vector3 sunPos, Vector3 sunVel, ulong time, uint dlen, uint ylen, float phase)
public void SendSunPos(Vector3 sunPos, Vector3 sunVel, float sunAngle)
public void SendViewerTime(Vector3 sunDir, float sunphase)
{
}
@ -998,10 +995,6 @@ namespace OpenSim.Tests.Common
{
}
public void SendViewerTime(int phase)
{
}
public void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, Byte[] membershipType,
string flAbout, uint flags, UUID flImageID, UUID imageID, string profileURL,
UUID partnerID)