replace sun module
parent
9ce70be5ce
commit
13ed40d9f6
|
@ -539,3 +539,8 @@ BEGIN;
|
|||
ALTER TABLE `prims` ADD COLUMN `pseudocrc` int DEFAULT '0';
|
||||
ALTER TABLE `regionsettings` ADD COLUMN `cacheID` char(36) DEFAULT NULL;
|
||||
COMMIT;
|
||||
|
||||
:VERSION 62 #----- increase size of enviroment settings
|
||||
BEGIN;
|
||||
ALTER TABLE `regionenvironment` MODIFY `llsd_settings` MEDIUMTEXT;
|
||||
COMMIT;
|
||||
|
|
|
@ -1295,8 +1295,9 @@ namespace OpenSim.Framework
|
|||
/// <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, ulong CurrentTime, uint SecondsPerSunCycle, uint SecondsPerYear,
|
||||
// float OrbitalPosition);
|
||||
void SendSunPos(Vector3 sunPos, Vector3 sunVel, float sunAngle);
|
||||
|
||||
void SendViewerEffect(ViewerEffectPacket.EffectBlock[] effectBlocks);
|
||||
void SendViewerTime(int phase);
|
||||
|
|
|
@ -1058,7 +1058,14 @@ namespace OpenSim.Framework
|
|||
|
||||
public static int UnixTimeSinceEpoch()
|
||||
{
|
||||
return ToUnixTime(DateTime.UtcNow);
|
||||
TimeSpan t = DateTime.UtcNow - UnixEpoch;
|
||||
return (int)t.TotalSeconds;
|
||||
}
|
||||
|
||||
public static ulong UnixTimeSinceEpoch_uS()
|
||||
{
|
||||
TimeSpan t = DateTime.UtcNow - UnixEpoch;
|
||||
return (uint)(t.TotalMilliseconds * 1000);
|
||||
}
|
||||
|
||||
public static int ToUnixTime(DateTime stamp)
|
||||
|
|
|
@ -1229,5 +1229,61 @@ namespace OpenSim.Framework
|
|||
top["success"] = true;
|
||||
return top;
|
||||
}
|
||||
|
||||
public bool getPositions(float altitude, float dayfrac, out Vector3 sundir, out Vector3 moondir, out Vector3 sunvel,
|
||||
out Quaternion sunrot, out Quaternion moonrot)
|
||||
{
|
||||
sundir = Vector3.Zero;
|
||||
moondir = Vector3.Zero;
|
||||
sunvel = 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;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
if(track.Count == 1)
|
||||
{
|
||||
if(!Cycle.skyframes.TryGetValue(track[0].frameName, out SkyData sky) || sky == null)
|
||||
return false;
|
||||
moonrot = sky.moon_rotation;
|
||||
moondir = Xrot(moonrot);
|
||||
sunrot = sky.sun_rotation;
|
||||
sundir = Xrot(sunrot);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3227,29 +3227,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
|||
OutPacket(sound, ThrottleOutPacketType.Task);
|
||||
}
|
||||
|
||||
public void SendSunPos(Vector3 Position, Vector3 Velocity, ulong CurrentTime, uint SecondsPerSunCycle, uint SecondsPerYear, float OrbitalPosition)
|
||||
public void SendSunPos(Vector3 Position, Vector3 Velocity, float sunphase)
|
||||
{
|
||||
// Viewers based on the Linden viwer code, do wacky things for oribital positions from Midnight to Sunrise
|
||||
// So adjust for that
|
||||
// Contributed by: Godfrey
|
||||
|
||||
if (OrbitalPosition > m_sunPainDaHalfOrbitalCutoff) // things get weird from midnight to sunrise
|
||||
{
|
||||
OrbitalPosition = (OrbitalPosition - m_sunPainDaHalfOrbitalCutoff) * 0.6666666667f + m_sunPainDaHalfOrbitalCutoff;
|
||||
}
|
||||
|
||||
SimulatorViewerTimeMessagePacket viewertime = (SimulatorViewerTimeMessagePacket)PacketPool.Instance.GetPacket(PacketType.SimulatorViewerTimeMessage);
|
||||
viewertime.TimeInfo.SunDirection = Position;
|
||||
viewertime.TimeInfo.SunAngVelocity = Velocity;
|
||||
|
||||
// Sun module used to add 6 hours to adjust for linden sun hour, adding here
|
||||
// to prevent existing code from breaking if it assumed that 6 hours were included.
|
||||
// 21600 == 6 hours * 60 minutes * 60 Seconds
|
||||
viewertime.TimeInfo.UsecSinceStart = CurrentTime + 21600;
|
||||
viewertime.TimeInfo.UsecSinceStart = Util.UnixTimeSinceEpoch_uS();
|
||||
|
||||
viewertime.TimeInfo.SecPerDay = SecondsPerSunCycle;
|
||||
viewertime.TimeInfo.SecPerYear = SecondsPerYear;
|
||||
viewertime.TimeInfo.SunPhase = OrbitalPosition;
|
||||
viewertime.TimeInfo.SecPerDay = 14400; // legacy
|
||||
viewertime.TimeInfo.SecPerYear = 158400; // legacy
|
||||
viewertime.TimeInfo.SunPhase = sunphase;
|
||||
viewertime.Header.Reliable = false;
|
||||
viewertime.Header.Zerocoded = true;
|
||||
OutPacket(viewertime, ThrottleOutPacketType.Task);
|
||||
|
|
|
@ -66,6 +66,14 @@ namespace OpenSim.Region.CoreModules.World.LightShare
|
|||
|
||||
private int m_regionEnvVersion = -1;
|
||||
|
||||
private int m_frame;
|
||||
private float m_currentTime;
|
||||
private float m_dayLen;
|
||||
private float m_dayOffset;
|
||||
private float m_sunAngle;
|
||||
private Vector3 m_sunVel = new Vector3();
|
||||
private Vector3 m_sunDir = new Vector3();
|
||||
|
||||
#region INonSharedRegionModule
|
||||
public void Initialise(IConfigSource source)
|
||||
{
|
||||
|
@ -170,20 +178,25 @@ namespace OpenSim.Region.CoreModules.World.LightShare
|
|||
scene.RegionEnviroment = VEnv;
|
||||
m_regionEnvVersion = VEnv.version;
|
||||
}
|
||||
catch(Exception e)
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.ErrorFormat("[Enviroment {0}] failed to load initial enviroment {1}", m_scene.Name, e.Message);
|
||||
scene.RegionEnviroment = null;
|
||||
m_regionEnvVersion = -1;
|
||||
}
|
||||
m_frame = -1;
|
||||
UpdateEnvTime();
|
||||
}
|
||||
else
|
||||
{
|
||||
scene.RegionEnviroment = null;
|
||||
m_regionEnvVersion = -1;
|
||||
m_frame = -1;
|
||||
UpdateEnvTime();
|
||||
}
|
||||
|
||||
scene.EventManager.OnRegisterCaps += OnRegisterCaps;
|
||||
scene.EventManager.OnFrame += UpdateEnvTime;
|
||||
}
|
||||
|
||||
public void RemoveRegion(Scene scene)
|
||||
|
@ -571,6 +584,8 @@ namespace OpenSim.Region.CoreModules.World.LightShare
|
|||
m_scene.SimulationDataService.StoreRegionEnvironmentSettings(regionID, OSDParser.SerializeLLSDXmlString(env));
|
||||
m_scene.RegionEnviroment = VEnv;
|
||||
}
|
||||
m_frame = -1;
|
||||
UpdateEnvTime();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
@ -729,6 +744,66 @@ namespace OpenSim.Region.CoreModules.World.LightShare
|
|||
else
|
||||
client.SendGenericMessage("Windlight", UUID.Random(), param);
|
||||
}
|
||||
|
||||
public int DayLength
|
||||
{
|
||||
get { return (int)m_dayLen; }
|
||||
}
|
||||
|
||||
public int DayOffset
|
||||
{
|
||||
get { return (int)m_dayOffset; }
|
||||
}
|
||||
|
||||
private void UpdateEnvTime()
|
||||
{
|
||||
ViewerEnviroment env = m_scene.RegionEnviroment;
|
||||
if(env == null)
|
||||
env = m_DefaultEnv;
|
||||
if(env == null)
|
||||
{
|
||||
m_dayOffset = 57600f;
|
||||
m_dayOffset = 14400f;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_dayOffset = env.DayOffset;
|
||||
m_dayLen = env.DayLength;
|
||||
}
|
||||
|
||||
m_currentTime = Util.UnixTimeSinceEpoch() + m_dayOffset;
|
||||
float dayFrac = (m_currentTime % m_dayLen) / m_dayLen;
|
||||
dayFrac = Utils.Clamp(dayFrac, 0f, 1f);
|
||||
|
||||
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;
|
||||
if(m_frame % 50 == 0)
|
||||
UpdateClientsSunTime();
|
||||
}
|
||||
|
||||
private void UpdateClientsSunTime()
|
||||
{
|
||||
m_scene.ForEachClient(delegate (IClientAPI client)
|
||||
{
|
||||
if (!client.IsActive)
|
||||
return;
|
||||
|
||||
/*
|
||||
uint vflags = client.GetViewerCaps();
|
||||
|
||||
if ((vflags & 0x8000) != 0)
|
||||
m_estateModule.HandleRegionInfoRequest(client);
|
||||
|
||||
else if ((vflags & 0x4000) != 0)
|
||||
m_eventQueue.WindlightRefreshEvent(interpolate, client.AgentId);
|
||||
*/
|
||||
client.SendSunPos(m_sunDir, m_sunVel, m_sunAngle);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,665 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) Contributors, http://opensimulator.org/
|
||||
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* * Neither the name of the OpenSimulator Project nor the
|
||||
* names of its contributors may be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Reflection;
|
||||
using log4net;
|
||||
using Mono.Addins;
|
||||
using Nini.Config;
|
||||
using OpenMetaverse;
|
||||
using OpenSim.Framework;
|
||||
using OpenSim.Region.Framework.Interfaces;
|
||||
using OpenSim.Region.Framework.Scenes;
|
||||
|
||||
namespace OpenSim.Region.CoreModules
|
||||
{
|
||||
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "SunModule")]
|
||||
public class SunModule : ISunModule
|
||||
{
|
||||
/// <summary>
|
||||
/// Note: Sun Hour can be a little deceaving. Although it's based on a 24 hour clock
|
||||
/// it is not based on ~06:00 == Sun Rise. Rather it is based on 00:00 being sun-rise.
|
||||
/// </summary>
|
||||
|
||||
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||
|
||||
//
|
||||
// Global Constants used to determine where in the sky the sun is
|
||||
//
|
||||
private const double m_SeasonalTilt = 0.03 * Math.PI; // A daily shift of approximately 1.7188 degrees
|
||||
private const double m_AverageTilt = -0.25 * Math.PI; // A 45 degree tilt
|
||||
private const double m_SunCycle = 2.0D * Math.PI; // A perfect circle measured in radians
|
||||
private const double m_SeasonalCycle = 2.0D * Math.PI; // Ditto
|
||||
|
||||
//
|
||||
// Per Region Values
|
||||
//
|
||||
|
||||
private bool ready = false;
|
||||
|
||||
// This solves a chick before the egg problem
|
||||
// the local SunFixedHour and SunFixed variables MUST be updated
|
||||
// at least once with the proper Region Settings before we start
|
||||
// updating those region settings in GenSunPos()
|
||||
private bool receivedEstateToolsSunUpdate = false;
|
||||
|
||||
// Sun's position information is updated and sent to clients every m_UpdateInterval frames
|
||||
private int m_UpdateInterval = 0;
|
||||
|
||||
// Number of real time hours per virtual day
|
||||
private double m_DayLengthHours = 0;
|
||||
|
||||
// Number of virtual days to a virtual year
|
||||
private int m_YearLengthDays = 0;
|
||||
|
||||
// Ratio of Daylight hours to Night time hours. This is accomplished by shifting the
|
||||
// sun's orbit above the horizon
|
||||
private double m_HorizonShift = 0;
|
||||
|
||||
// Used to scale current and positional time to adjust length of an hour during day vs night.
|
||||
private double m_DayTimeSunHourScale;
|
||||
|
||||
// private double m_longitude = 0;
|
||||
// private double m_latitude = 0;
|
||||
// Configurable defaults Defaults close to SL
|
||||
private int d_frame_mod = 100; // Every 10 seconds (actually less)
|
||||
private double d_day_length = 4; // A VW day is 4 RW hours long
|
||||
private int d_year_length = 60; // There are 60 VW days in a VW year
|
||||
private double d_day_night = 0.5; // axis offset: Default Hoizon shift to try and closely match the sun model in LL Viewer
|
||||
private double d_DayTimeSunHourScale = 0.5; // Day/Night hours are equal
|
||||
|
||||
|
||||
// private double d_longitude = -73.53;
|
||||
// private double d_latitude = 41.29;
|
||||
|
||||
// Frame counter
|
||||
private uint m_frame = 0;
|
||||
|
||||
// Cached Scene reference
|
||||
private Scene m_scene = null;
|
||||
|
||||
// Calculated Once in the lifetime of a region
|
||||
private long TicksToEpoch; // Elapsed time for 1/1/1970
|
||||
private uint SecondsPerSunCycle; // Length of a virtual day in RW seconds
|
||||
private uint SecondsPerYear; // Length of a virtual year in RW seconds
|
||||
private double SunSpeed; // Rate of passage in radians/second
|
||||
private double SeasonSpeed; // Rate of change for seasonal effects
|
||||
// private double HoursToRadians; // Rate of change for seasonal effects
|
||||
private long TicksUTCOffset = 0; // seconds offset from UTC
|
||||
// Calculated every update
|
||||
private float OrbitalPosition; // Orbital placement at a point in time
|
||||
private double HorizonShift; // Axis offset to skew day and night
|
||||
private double TotalDistanceTravelled; // Distance since beginning of time (in radians)
|
||||
private double SeasonalOffset; // Seaonal variation of tilt
|
||||
private float Magnitude; // Normal tilt
|
||||
// private double VWTimeRatio; // VW time as a ratio of real time
|
||||
|
||||
// Working values
|
||||
private Vector3 Position = Vector3.Zero;
|
||||
private Vector3 Velocity = Vector3.Zero;
|
||||
private Quaternion Tilt = new Quaternion(1.0f, 0.0f, 0.0f, 0.0f);
|
||||
|
||||
// Used to fix the sun in the sky so it doesn't move based on current time
|
||||
private bool m_SunFixed = false;
|
||||
private float m_SunFixedHour = 0f;
|
||||
|
||||
private const int TICKS_PER_SECOND = 10000000;
|
||||
|
||||
private ulong m_CurrentTimeOffset = 0;
|
||||
|
||||
// Current time in elapsed seconds since Jan 1st 1970
|
||||
private ulong CurrentTime
|
||||
{
|
||||
get
|
||||
{
|
||||
ulong ctime = (ulong)(((DateTime.Now.Ticks) - TicksToEpoch + TicksUTCOffset) / TICKS_PER_SECOND);
|
||||
return ctime + m_CurrentTimeOffset;
|
||||
}
|
||||
}
|
||||
|
||||
// Time in seconds since UTC to use to calculate sun position.
|
||||
ulong PosTime = 0;
|
||||
|
||||
/// <summary>
|
||||
/// Calculate the sun's orbital position and its velocity.
|
||||
/// </summary>
|
||||
private void GenSunPos()
|
||||
{
|
||||
// Time in seconds since UTC to use to calculate sun position.
|
||||
PosTime = CurrentTime;
|
||||
|
||||
if (m_SunFixed)
|
||||
{
|
||||
// SunFixedHour represents the "hour of day" we would like
|
||||
// It's represented in 24hr time, with 0 hour being sun-rise
|
||||
// Because our day length is probably not 24hrs {LL is 6} we need to do a bit of math
|
||||
|
||||
// Determine the current "day" from current time, so we can use "today"
|
||||
// to determine Seasonal Tilt and what'not
|
||||
|
||||
// Integer math rounded is on purpose to drop fractional day, determines number
|
||||
// of virtual days since Epoch
|
||||
PosTime = CurrentTime / SecondsPerSunCycle;
|
||||
|
||||
// Since we want number of seconds since Epoch, multiply back up
|
||||
PosTime *= SecondsPerSunCycle;
|
||||
|
||||
// Then offset by the current Fixed Sun Hour
|
||||
// Fixed Sun Hour needs to be scaled to reflect the user configured Seconds Per Sun Cycle
|
||||
PosTime += (ulong)((m_SunFixedHour / 24.0) * (ulong)SecondsPerSunCycle);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (m_DayTimeSunHourScale != 0.5f)
|
||||
{
|
||||
ulong CurDaySeconds = CurrentTime % SecondsPerSunCycle;
|
||||
double CurDayPercentage = (double)CurDaySeconds / SecondsPerSunCycle;
|
||||
|
||||
ulong DayLightSeconds = (ulong)(m_DayTimeSunHourScale * SecondsPerSunCycle);
|
||||
ulong NightSeconds = SecondsPerSunCycle - DayLightSeconds;
|
||||
|
||||
PosTime = CurrentTime / SecondsPerSunCycle;
|
||||
PosTime *= SecondsPerSunCycle;
|
||||
|
||||
if (CurDayPercentage < 0.5)
|
||||
{
|
||||
PosTime += (ulong)((CurDayPercentage / .5) * DayLightSeconds);
|
||||
}
|
||||
else
|
||||
{
|
||||
PosTime += DayLightSeconds;
|
||||
PosTime += (ulong)(((CurDayPercentage - 0.5) / .5) * NightSeconds);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
TotalDistanceTravelled = SunSpeed * PosTime; // distance measured in radians
|
||||
|
||||
OrbitalPosition = (float)(TotalDistanceTravelled % m_SunCycle); // position measured in radians
|
||||
|
||||
// TotalDistanceTravelled += HoursToRadians-(0.25*Math.PI)*Math.Cos(HoursToRadians)-OrbitalPosition;
|
||||
// OrbitalPosition = (float) (TotalDistanceTravelled%SunCycle);
|
||||
|
||||
SeasonalOffset = SeasonSpeed * PosTime; // Present season determined as total radians travelled around season cycle
|
||||
Tilt.W = (float)(m_AverageTilt + (m_SeasonalTilt * Math.Sin(SeasonalOffset))); // Calculate seasonal orbital N/S tilt
|
||||
|
||||
// m_log.Debug("[SUN] Total distance travelled = "+TotalDistanceTravelled+", present position = "+OrbitalPosition+".");
|
||||
// m_log.Debug("[SUN] Total seasonal progress = "+SeasonalOffset+", present tilt = "+Tilt.W+".");
|
||||
|
||||
// The sun rotates about the Z axis
|
||||
|
||||
Position.X = (float)Math.Cos(-TotalDistanceTravelled);
|
||||
Position.Y = (float)Math.Sin(-TotalDistanceTravelled);
|
||||
Position.Z = 0;
|
||||
|
||||
// For interest we rotate it slightly about the X access.
|
||||
// Celestial tilt is a value that ranges .025
|
||||
|
||||
Position *= Tilt;
|
||||
|
||||
// Finally we shift the axis so that more of the
|
||||
// circle is above the horizon than below. This
|
||||
// makes the nights shorter than the days.
|
||||
|
||||
Position = Vector3.Normalize(Position);
|
||||
Position.Z = Position.Z + (float)HorizonShift;
|
||||
Position = Vector3.Normalize(Position);
|
||||
|
||||
// m_log.Debug("[SUN] Position("+Position.X+","+Position.Y+","+Position.Z+")");
|
||||
|
||||
Velocity.X = 0;
|
||||
Velocity.Y = 0;
|
||||
Velocity.Z = (float)SunSpeed;
|
||||
|
||||
// Correct angular velocity to reflect the seasonal rotation
|
||||
|
||||
Magnitude = Position.Length();
|
||||
if (m_SunFixed)
|
||||
{
|
||||
Velocity.X = 0;
|
||||
Velocity.Y = 0;
|
||||
Velocity.Z = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
Velocity = (Velocity * Tilt) * (1.0f / Magnitude);
|
||||
}
|
||||
|
||||
// TODO: Decouple this, so we can get rid of Linden Hour info
|
||||
// Update Region with new Sun Vector
|
||||
// set estate settings for region access to sun position
|
||||
if (receivedEstateToolsSunUpdate)
|
||||
{
|
||||
m_scene.RegionInfo.RegionSettings.SunVector = Position;
|
||||
}
|
||||
}
|
||||
|
||||
private float GetCurrentTimeAsLindenSunHour()
|
||||
{
|
||||
float curtime = m_SunFixed ? m_SunFixedHour : GetCurrentSunHour();
|
||||
return (curtime + 6.0f) % 24.0f;
|
||||
}
|
||||
|
||||
#region INonSharedRegion Methods
|
||||
|
||||
// Called immediately after the module is loaded for a given region
|
||||
// i.e. Immediately after instance creation.
|
||||
public void Initialise(IConfigSource config)
|
||||
{
|
||||
m_frame = 0;
|
||||
|
||||
// This one puts an entry in the main help screen
|
||||
// m_scene.AddCommand("Regions", this, "sun", "sun", "Usage: sun [param] [value] - Get or Update Sun module paramater", null);
|
||||
|
||||
TimeZone local = TimeZone.CurrentTimeZone;
|
||||
TicksUTCOffset = local.GetUtcOffset(local.ToLocalTime(DateTime.Now)).Ticks;
|
||||
m_log.DebugFormat("[SUN]: localtime offset is {0}", TicksUTCOffset);
|
||||
|
||||
// Align ticks with Second Life
|
||||
|
||||
TicksToEpoch = new DateTime(1970, 1, 1).Ticks;
|
||||
|
||||
// Just in case they don't have the stanzas
|
||||
try
|
||||
{
|
||||
// Mode: determines how the sun is handled
|
||||
// m_latitude = config.Configs["Sun"].GetDouble("latitude", d_latitude);
|
||||
// Mode: determines how the sun is handled
|
||||
// m_longitude = config.Configs["Sun"].GetDouble("longitude", d_longitude);
|
||||
// Year length in days
|
||||
m_YearLengthDays = config.Configs["Sun"].GetInt("year_length", d_year_length);
|
||||
// Day length in decimal hours
|
||||
m_DayLengthHours = config.Configs["Sun"].GetDouble("day_length", d_day_length);
|
||||
|
||||
// Horizon shift, this is used to shift the sun's orbit, this affects the day / night ratio
|
||||
// must hard code to ~.5 to match sun position in LL based viewers
|
||||
m_HorizonShift = config.Configs["Sun"].GetDouble("day_night_offset", d_day_night);
|
||||
|
||||
// Scales the sun hours 0...12 vs 12...24, essentially makes daylight hours longer/shorter vs nighttime hours
|
||||
m_DayTimeSunHourScale = config.Configs["Sun"].GetDouble("day_time_sun_hour_scale", d_DayTimeSunHourScale);
|
||||
|
||||
// Update frequency in frames
|
||||
m_UpdateInterval = config.Configs["Sun"].GetInt("update_interval", d_frame_mod);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
m_log.Debug("[SUN]: Configuration access failed, using defaults. Reason: " + e.Message);
|
||||
m_YearLengthDays = d_year_length;
|
||||
m_DayLengthHours = d_day_length;
|
||||
m_HorizonShift = d_day_night;
|
||||
m_UpdateInterval = d_frame_mod;
|
||||
m_DayTimeSunHourScale = d_DayTimeSunHourScale;
|
||||
|
||||
// m_latitude = d_latitude;
|
||||
// m_longitude = d_longitude;
|
||||
}
|
||||
|
||||
SecondsPerSunCycle = (uint) (m_DayLengthHours * 60 * 60);
|
||||
SecondsPerYear = (uint) (SecondsPerSunCycle*m_YearLengthDays);
|
||||
|
||||
// Ration of real-to-virtual time
|
||||
|
||||
// VWTimeRatio = 24/m_day_length;
|
||||
|
||||
// Speed of rotation needed to complete a cycle in the
|
||||
// designated period (day and season)
|
||||
|
||||
SunSpeed = m_SunCycle/SecondsPerSunCycle;
|
||||
SeasonSpeed = m_SeasonalCycle/SecondsPerYear;
|
||||
|
||||
// Horizon translation
|
||||
|
||||
HorizonShift = m_HorizonShift; // Z axis translation
|
||||
// HoursToRadians = (SunCycle/24)*VWTimeRatio;
|
||||
|
||||
m_log.Debug("[SUN]: Initialization completed. Day is " + SecondsPerSunCycle + " seconds, and year is " + m_YearLengthDays + " days");
|
||||
m_log.Debug("[SUN]: Axis offset is " + m_HorizonShift);
|
||||
m_log.Debug("[SUN]: Percentage of time for daylight " + m_DayTimeSunHourScale);
|
||||
m_log.Debug("[SUN]: Positional data updated every " + m_UpdateInterval + " frames");
|
||||
}
|
||||
|
||||
public Type ReplaceableInterface
|
||||
{
|
||||
get { return null; }
|
||||
}
|
||||
|
||||
public void AddRegion(Scene scene)
|
||||
{
|
||||
m_scene = scene;
|
||||
// Insert our event handling hooks
|
||||
|
||||
scene.EventManager.OnFrame += SunUpdate;
|
||||
scene.EventManager.OnAvatarEnteringNewParcel += AvatarEnteringParcel;
|
||||
scene.EventManager.OnEstateToolsSunUpdate += EstateToolsSunUpdate;
|
||||
scene.EventManager.OnGetCurrentTimeAsLindenSunHour += GetCurrentTimeAsLindenSunHour;
|
||||
|
||||
scene.RegisterModuleInterface<ISunModule>(this);
|
||||
|
||||
// This one enables the ability to type just "sun" without any parameters
|
||||
// m_scene.AddCommand("Regions", this, "sun", "", "", HandleSunConsoleCommand);
|
||||
foreach (KeyValuePair<string, string> kvp in GetParamList())
|
||||
{
|
||||
string sunCommand = string.Format("sun {0}", kvp.Key);
|
||||
m_scene.AddCommand("Regions", this, sunCommand, string.Format("{0} [<value>]", sunCommand), kvp.Value, "", HandleSunConsoleCommand);
|
||||
}
|
||||
m_scene.AddCommand("Regions", this, "sun help", "sun help", "list parameters that can be changed", "", HandleSunConsoleCommand);
|
||||
m_scene.AddCommand("Regions", this, "sun list", "sun list", "list parameters that can be changed", "", HandleSunConsoleCommand);
|
||||
ready = true;
|
||||
}
|
||||
|
||||
public void RemoveRegion(Scene scene)
|
||||
{
|
||||
ready = false;
|
||||
|
||||
// Remove our hooks
|
||||
m_scene.EventManager.OnFrame -= SunUpdate;
|
||||
m_scene.EventManager.OnAvatarEnteringNewParcel -= AvatarEnteringParcel;
|
||||
m_scene.EventManager.OnEstateToolsSunUpdate -= EstateToolsSunUpdate;
|
||||
m_scene.EventManager.OnGetCurrentTimeAsLindenSunHour -= GetCurrentTimeAsLindenSunHour;
|
||||
}
|
||||
|
||||
public void RegionLoaded(Scene scene)
|
||||
{
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
}
|
||||
|
||||
public string Name
|
||||
{
|
||||
get { return "SunModule"; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region EventManager Events
|
||||
|
||||
public void SunToClient(IClientAPI client)
|
||||
{
|
||||
if (ready)
|
||||
{
|
||||
if (m_SunFixed)
|
||||
{
|
||||
// m_log.DebugFormat("[SUN]: Fixed SunHour {0}, Position {1}, PosTime {2}, OrbitalPosition : {3} ",
|
||||
// m_SunFixedHour, Position.ToString(), PosTime.ToString(), OrbitalPosition.ToString());
|
||||
client.SendSunPos(Position, Velocity, PosTime, SecondsPerSunCycle, SecondsPerYear, OrbitalPosition);
|
||||
}
|
||||
else
|
||||
{
|
||||
// m_log.DebugFormat("[SUN]: SunHour {0}, Position {1}, PosTime {2}, OrbitalPosition : {3} ",
|
||||
// m_SunFixedHour, Position.ToString(), PosTime.ToString(), OrbitalPosition.ToString());
|
||||
client.SendSunPos(Position, Velocity, CurrentTime, SecondsPerSunCycle, SecondsPerYear, OrbitalPosition);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void SunUpdate()
|
||||
{
|
||||
if (((m_frame++ % m_UpdateInterval) != 0) || !ready || m_SunFixed || !receivedEstateToolsSunUpdate)
|
||||
return;
|
||||
|
||||
GenSunPos(); // Generate shared values once
|
||||
|
||||
SunUpdateToAllClients();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// When an avatar enters the region, it's probably a good idea to send them the current sun info
|
||||
/// </summary>
|
||||
/// <param name="avatar"></param>
|
||||
/// <param name="localLandID"></param>
|
||||
/// <param name="regionID"></param>
|
||||
private void AvatarEnteringParcel(ScenePresence avatar, int localLandID, UUID regionID)
|
||||
{
|
||||
SunToClient(avatar.ControllingClient);
|
||||
}
|
||||
|
||||
public void EstateToolsSunUpdate(ulong regionHandle)
|
||||
{
|
||||
if (m_scene.RegionInfo.RegionHandle == regionHandle)
|
||||
{
|
||||
float sunFixedHour;
|
||||
bool fixedSun;
|
||||
|
||||
if (m_scene.RegionInfo.RegionSettings.UseEstateSun)
|
||||
{
|
||||
sunFixedHour = (float)m_scene.RegionInfo.EstateSettings.SunPosition;
|
||||
fixedSun = m_scene.RegionInfo.EstateSettings.FixedSun;
|
||||
}
|
||||
else
|
||||
{
|
||||
sunFixedHour = (float)m_scene.RegionInfo.RegionSettings.SunPosition - 6.0f;
|
||||
fixedSun = m_scene.RegionInfo.RegionSettings.FixedSun;
|
||||
}
|
||||
|
||||
// Must limit the Sun Hour to 0 ... 24
|
||||
while (sunFixedHour > 24.0f)
|
||||
sunFixedHour -= 24;
|
||||
|
||||
while (sunFixedHour < 0)
|
||||
sunFixedHour += 24;
|
||||
|
||||
m_SunFixedHour = sunFixedHour;
|
||||
m_SunFixed = fixedSun;
|
||||
|
||||
// m_log.DebugFormat("[SUN]: Sun Settings Update: Fixed Sun? : {0}", m_SunFixed.ToString());
|
||||
// m_log.DebugFormat("[SUN]: Sun Settings Update: Sun Hour : {0}", m_SunFixedHour.ToString());
|
||||
|
||||
receivedEstateToolsSunUpdate = true;
|
||||
|
||||
// Generate shared values
|
||||
GenSunPos();
|
||||
|
||||
// When sun settings are updated, we should update all clients with new settings.
|
||||
SunUpdateToAllClients();
|
||||
|
||||
// m_log.DebugFormat("[SUN]: PosTime : {0}", PosTime.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private void SunUpdateToAllClients()
|
||||
{
|
||||
m_scene.ForEachRootClient(delegate(IClientAPI client)
|
||||
{
|
||||
SunToClient(client);
|
||||
});
|
||||
}
|
||||
|
||||
#region ISunModule Members
|
||||
|
||||
public double GetSunParameter(string param)
|
||||
{
|
||||
switch (param.ToLower())
|
||||
{
|
||||
case "year_length":
|
||||
return m_YearLengthDays;
|
||||
|
||||
case "day_length":
|
||||
return m_DayLengthHours;
|
||||
|
||||
case "day_night_offset":
|
||||
return m_HorizonShift;
|
||||
|
||||
case "day_time_sun_hour_scale":
|
||||
return m_DayTimeSunHourScale;
|
||||
|
||||
case "update_interval":
|
||||
return m_UpdateInterval;
|
||||
|
||||
case "current_time":
|
||||
return GetCurrentTimeAsLindenSunHour();
|
||||
|
||||
default:
|
||||
throw new Exception("Unknown sun parameter.");
|
||||
}
|
||||
}
|
||||
|
||||
public void SetSunParameter(string param, double value)
|
||||
{
|
||||
switch (param)
|
||||
{
|
||||
case "year_length":
|
||||
m_YearLengthDays = (int)value;
|
||||
SecondsPerYear = (uint) (SecondsPerSunCycle*m_YearLengthDays);
|
||||
SeasonSpeed = m_SeasonalCycle/SecondsPerYear;
|
||||
break;
|
||||
|
||||
case "day_length":
|
||||
m_DayLengthHours = value;
|
||||
SecondsPerSunCycle = (uint) (m_DayLengthHours * 60 * 60);
|
||||
SecondsPerYear = (uint) (SecondsPerSunCycle*m_YearLengthDays);
|
||||
SunSpeed = m_SunCycle/SecondsPerSunCycle;
|
||||
SeasonSpeed = m_SeasonalCycle/SecondsPerYear;
|
||||
break;
|
||||
|
||||
case "day_night_offset":
|
||||
m_HorizonShift = value;
|
||||
HorizonShift = m_HorizonShift;
|
||||
break;
|
||||
|
||||
case "day_time_sun_hour_scale":
|
||||
m_DayTimeSunHourScale = value;
|
||||
break;
|
||||
|
||||
case "update_interval":
|
||||
m_UpdateInterval = (int)value;
|
||||
break;
|
||||
|
||||
case "current_time":
|
||||
value = (value + 18.0) % 24.0;
|
||||
// set the current offset so that the effective sun time is the parameter
|
||||
m_CurrentTimeOffset = 0; // clear this first so we use raw time
|
||||
m_CurrentTimeOffset = (ulong)(SecondsPerSunCycle * value/ 24.0) - (CurrentTime % SecondsPerSunCycle);
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new Exception("Unknown sun parameter.");
|
||||
}
|
||||
|
||||
// Generate shared values
|
||||
GenSunPos();
|
||||
|
||||
// When sun settings are updated, we should update all clients with new settings.
|
||||
SunUpdateToAllClients();
|
||||
}
|
||||
|
||||
public float GetCurrentSunHour()
|
||||
{
|
||||
float ticksleftover = CurrentTime % SecondsPerSunCycle;
|
||||
|
||||
return (24.0f * (ticksleftover / SecondsPerSunCycle));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public void HandleSunConsoleCommand(string module, string[] cmdparams)
|
||||
{
|
||||
if (m_scene.ConsoleScene() == null)
|
||||
{
|
||||
// FIXME: If console region is root then this will be printed by every module. Currently, there is no
|
||||
// way to prevent this, short of making the entire module shared (which is complete overkill).
|
||||
// One possibility is to return a bool to signal whether the module has completely handled the command
|
||||
m_log.InfoFormat("[Sun]: Please change to a specific region in order to set Sun parameters.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_scene.ConsoleScene() != m_scene)
|
||||
{
|
||||
m_log.InfoFormat("[Sun]: Console Scene is not my scene.");
|
||||
return;
|
||||
}
|
||||
|
||||
m_log.InfoFormat("[Sun]: Processing command.");
|
||||
|
||||
foreach (string output in ParseCmdParams(cmdparams))
|
||||
{
|
||||
MainConsole.Instance.Output(output);
|
||||
}
|
||||
}
|
||||
|
||||
private Dictionary<string, string> GetParamList()
|
||||
{
|
||||
Dictionary<string, string> Params = new Dictionary<string, string>();
|
||||
|
||||
Params.Add("year_length", "number of days to a year");
|
||||
Params.Add("day_length", "number of hours to a day");
|
||||
Params.Add("day_night_offset", "induces a horizon shift");
|
||||
Params.Add("update_interval", "how often to update the sun's position in frames");
|
||||
Params.Add("day_time_sun_hour_scale", "scales day light vs nite hours to change day/night ratio");
|
||||
Params.Add("current_time", "time in seconds of the simulator");
|
||||
|
||||
return Params;
|
||||
}
|
||||
|
||||
private List<string> ParseCmdParams(string[] args)
|
||||
{
|
||||
List<string> Output = new List<string>();
|
||||
|
||||
if ((args.Length == 1) || (args[1].ToLower() == "help") || (args[1].ToLower() == "list"))
|
||||
{
|
||||
Output.Add("The following parameters can be changed or viewed:");
|
||||
foreach (KeyValuePair<string, string> kvp in GetParamList())
|
||||
{
|
||||
Output.Add(String.Format("{0} - {1}",kvp.Key, kvp.Value));
|
||||
}
|
||||
return Output;
|
||||
}
|
||||
|
||||
if (args.Length == 2)
|
||||
{
|
||||
try
|
||||
{
|
||||
double value = GetSunParameter(args[1]);
|
||||
Output.Add(String.Format("Parameter {0} is {1}.", args[1], value.ToString()));
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
Output.Add(String.Format("Unknown parameter {0}.", args[1]));
|
||||
}
|
||||
|
||||
}
|
||||
else if (args.Length == 3)
|
||||
{
|
||||
double value = 0.0;
|
||||
if (! double.TryParse(args[2], out value))
|
||||
{
|
||||
Output.Add(String.Format("The parameter value {0} is not a valid number.", args[2]));
|
||||
return Output;
|
||||
}
|
||||
|
||||
SetSunParameter(args[1].ToLower(), value);
|
||||
Output.Add(String.Format("Parameter {0} set to {1}.", args[1], value.ToString()));
|
||||
}
|
||||
|
||||
return Output;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1233,17 +1233,15 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server
|
|||
|
||||
public void SendDialog(string objectname, UUID objectID, UUID ownerID, string ownerFirstName, string ownerLastName, string msg, UUID textureID, int ch, string[] buttonlabels)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void SendSunPos(Vector3 sunPos, Vector3 sunVel, ulong CurrentTime, uint SecondsPerSunCycle, uint SecondsPerYear, float OrbitalPosition)
|
||||
//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 SendViewerEffect(ViewerEffectPacket.EffectBlock[] effectBlocks)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void SendViewerTime(int phase)
|
||||
|
|
|
@ -982,14 +982,14 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
|||
|
||||
public void SendObjectPropertiesFamilyData(ISceneEntity Entity, uint RequestFlags)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void SendObjectPropertiesReply(ISceneEntity entity)
|
||||
{
|
||||
}
|
||||
|
||||
public void SendSunPos(Vector3 sunPos, Vector3 sunVel, ulong time, uint dlen, uint ylen, float phase)
|
||||
//public void SendSunPos(Vector3 sunPos, Vector3 sunVel, ulong time, uint dlen, uint ylen, float phase)
|
||||
public void SendSunPos(Vector3 sunPos, Vector3 sunVel, float sunAngle)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -989,7 +989,8 @@ namespace OpenSim.Tests.Common
|
|||
|
||||
}
|
||||
|
||||
public void SendSunPos(Vector3 sunPos, Vector3 sunVel, ulong time, uint dlen, uint ylen, float phase)
|
||||
//public void SendSunPos(Vector3 sunPos, Vector3 sunVel, ulong time, uint dlen, uint ylen, float phase)
|
||||
public void SendSunPos(Vector3 sunPos, Vector3 sunVel, float sunAngle)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue