diff --git a/src/Config/SimConfig/Db4SimConfig.cs b/src/Config/SimConfig/Db4SimConfig.cs index 6197848a9f..ebd93113e5 100644 --- a/src/Config/SimConfig/Db4SimConfig.cs +++ b/src/Config/SimConfig/Db4SimConfig.cs @@ -117,9 +117,13 @@ namespace Db40SimConfig blank.LandMap=(float[])world_result.Next(); } else { ServerConsole.MainConsole.Instance.WriteLine("Config.cs:LoadWorld() - No heightmap found, generating new one"); - for(int i =0; i < 65536; i++) { - blank.LandMap[i] = 21.4989f; - } + HeightmapGenHills hills = new HeightmapGenHills(); + blank.LandMap = hills.GenerateHeightmap(200, 4.0f, 80.0f, false); + /* blank.LandMap = new float[65536]; + for(int i = 0 ; i <65536; i++) + { + blank.LandMap[i] = 20.49f; + }*/ ServerConsole.MainConsole.Instance.WriteLine("Config.cs:LoadWorld() - Saving heightmap to local database"); db.Set(blank.LandMap); db.Commit(); diff --git a/src/GridInterfaces/GridInterfaces.csproj b/src/GridInterfaces/GridInterfaces.csproj index a1e56b6679..489ed972c6 100644 --- a/src/GridInterfaces/GridInterfaces.csproj +++ b/src/GridInterfaces/GridInterfaces.csproj @@ -27,7 +27,7 @@ - ..\..\Libsecond-dailys\libsl-03-03\trunk\libsecondlife-cs\obj\Debug\libsecondlife.dll + ..\..\Libsecond-dailys\libsl07-03\trunk\libsecondlife-cs\obj\Debug\libsecondlife.dll False diff --git a/src/GridInterfaces/IGridServer.cs b/src/GridInterfaces/IGridServer.cs index 48f92896c1..fef4c3e538 100644 --- a/src/GridInterfaces/IGridServer.cs +++ b/src/GridInterfaces/IGridServer.cs @@ -49,6 +49,7 @@ namespace OpenSim.GridServers UUIDBlock RequestUUIDBlock(); void RequestNeighbours(); //should return a array of neighbouring regions AuthenticateResponse AuthenticateSession(LLUUID sessionID, LLUUID agentID, uint circuitCode); + bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode); void SetServerInfo(string ServerUrl, string ServerKey); void AddNewSession(Login session); // only used by local version of grid server // and didn't use to be part of this interface until we put this in a dll diff --git a/src/HeightMapGenHills.cs b/src/HeightMapGenHills.cs new file mode 100644 index 0000000000..e7589aff00 --- /dev/null +++ b/src/HeightMapGenHills.cs @@ -0,0 +1,149 @@ +/* +* Copyright (c) OpenSim project, http://sim.opensecondlife.org/ +* +* 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 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 ``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 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; + +namespace OpenSim +{ + public class HeightmapGenHills + { + private Random Rand = new Random(); + private int NumHills; + private float HillMin; + private float HillMax; + private bool Island; + private float[] heightmap; + + public float[] GenerateHeightmap(int numHills, float hillMin, float hillMax, bool island) + { + NumHills = numHills; + HillMin = hillMin; + HillMax = hillMax; + Island = island; + + heightmap = new float[256 * 256]; + + for (int i = 0; i < numHills; i++) + { + AddHill(); + } + + Normalize(); + + return heightmap; + } + + private void AddHill() + { + float x, y; + float radius = RandomRange(HillMin, HillMax); + + if (Island) + { + // Which direction from the center of the map the hill is placed + float theta = RandomRange(0, 6.28f); + + // How far from the center of the map to place the hill. The radius + // is subtracted from the range to prevent any part of the hill from + // reaching the edge of the map + float distance = RandomRange(radius / 2.0f, 128.0f - radius); + + x = 128.0f + (float)Math.Cos(theta) * distance; + y = 128.0f + (float)Math.Sin(theta) * distance; + } + else + { + x = RandomRange(-radius, 256.0f + radius); + y = RandomRange(-radius, 256.0f + radius); + } + + float radiusSq = radius * radius; + float distSq; + float height; + + int xMin = (int)(x - radius) - 1; + int xMax = (int)(x + radius) + 1; + if (xMin < 0) xMin = 0; + if (xMax > 255) xMax = 255; + + int yMin = (int)(y - radius) - 1; + int yMax = (int)(y + radius) + 1; + if (yMin < 0) yMin = 0; + if (yMax > 255) yMax = 255; + + // Loop through each affected cell and determine the height at that point + for (int v = yMin; v <= yMax; ++v) + { + float fv = (float)v; + + for (int h = xMin; h <= xMax; ++h) + { + float fh = (float)h; + + // Determine how far from the center of this hill this point is + distSq = (x - fh) * (x - fh) + (y - fv) * (y - fv); + height = radiusSq - distSq; + + // Don't add negative hill values + if (height > 0.0f) heightmap[h + v * 256] += height; + } + } + } + + private void Normalize() + { + float min = heightmap[0]; + float max = heightmap[0]; + + for (int x = 0; x < 256; x++) + { + for (int y = 0; y < 256; y++) + { + if (heightmap[x + y * 256] < min) min = heightmap[x + y * 256]; + if (heightmap[x + y * 256] > max) max = heightmap[x + y * 256]; + } + } + + // Avoid a rare divide by zero + if (min != max) + { + for (int x = 0; x < 256; x++) + { + for (int y = 0; y < 256; y++) + { + heightmap[x + y * 256] = ((heightmap[x + y * 256] - min) / (max - min)) * (HillMax - HillMin); + } + } + } + } + + private float RandomRange(float min, float max) + { + return (float)Rand.NextDouble() * (max - min) + min; + } + } +} diff --git a/src/LocalServers/LocalGridServers/LocalGrid.cs b/src/LocalServers/LocalGridServers/LocalGrid.cs index 76304a4bef..5adce27a9a 100644 --- a/src/LocalServers/LocalGridServers/LocalGrid.cs +++ b/src/LocalServers/LocalGridServers/LocalGrid.cs @@ -144,6 +144,11 @@ namespace LocalGridServers return(user); } + public bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode) + { + return(true); + } + public UUIDBlock RequestUUIDBlock() { UUIDBlock uuidBlock = new UUIDBlock(); diff --git a/src/LocalServers/LocalGridServers/LocalGridServers.csproj b/src/LocalServers/LocalGridServers/LocalGridServers.csproj index 6ab0d8a323..63f41c0d56 100644 --- a/src/LocalServers/LocalGridServers/LocalGridServers.csproj +++ b/src/LocalServers/LocalGridServers/LocalGridServers.csproj @@ -27,7 +27,7 @@ - ..\..\..\Libsecond-dailys\libsl-03-03\trunk\libsecondlife-cs\obj\Debug\libsecondlife.dll + ..\..\..\Libsecond-dailys\libsl07-03\trunk\libsecondlife-cs\obj\Debug\libsecondlife.dll False diff --git a/src/Main.cs b/src/Main.cs index 0179d50664..f76a7a9a4e 100644 --- a/src/Main.cs +++ b/src/Main.cs @@ -77,7 +77,7 @@ namespace OpenSim [STAThread] public static void Main( string[] args ) { - //Console.WriteLine("OpenSim " + VersionInfo.Version + "\n"); + Console.WriteLine("OpenSim " + VersionInfo.Version + "\n"); Console.WriteLine("Starting...\n"); ServerConsole.MainConsole.Instance = new MServerConsole(ServerConsole.ConsoleBase.ConsoleType.Local,"",0); @@ -136,7 +136,7 @@ namespace OpenSim // We check our local database first, then the grid for config options ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Loading configuration"); - cfg = this.LoadConfigDll(); + cfg = this.LoadConfigDll(this.ConfigDll); cfg.InitConfig(); ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Contacting gridserver"); cfg.LoadFromGrid(); @@ -149,16 +149,17 @@ namespace OpenSim this.physManager.LoadPlugins(); ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Starting up messaging system"); local_world.PhysScene = this.physManager.GetPhysicsScene("PhysX"); //should be reading from the config file what physics engine to use - OpenSim_Main.gridServers.AssetServer.SetServerInfo(OpenSim_Main.cfg.AssetURL, OpenSim_Main.cfg.AssetSendKey); + local_world.PhysScene.SetTerrain(local_world.LandMap); + OpenSim_Main.gridServers.AssetServer.SetServerInfo(OpenSim_Main.cfg.AssetURL, OpenSim_Main.cfg.AssetSendKey); OpenSim_Main.gridServers.GridServer.SetServerInfo(OpenSim_Main.cfg.GridURL, OpenSim_Main.cfg.GridSendKey); MainServerListener(); } - private SimConfig LoadConfigDll() + private SimConfig LoadConfigDll(string dllName) { - Assembly pluginAssembly = Assembly.LoadFrom(this.ConfigDll); + Assembly pluginAssembly = Assembly.LoadFrom(dllName); SimConfig config = null; foreach (Type pluginType in pluginAssembly.GetTypes()) @@ -191,7 +192,7 @@ namespace OpenSim int numBytes = Server.EndReceiveFrom(result, ref epSender); int packetEnd = numBytes - 1; packet = Packet.BuildPacket(RecvBuffer, ref packetEnd, ZeroBuffer); - Console.Error.WriteLine(packet.ToString()); + //Console.Error.WriteLine(packet.ToString()); // This is either a new client or a packet to send to an old one if(ClientThreads.ContainsKey(epSender)) { @@ -253,13 +254,13 @@ namespace OpenSim public void LoadPlugins() { - this.AssetServer =(IAssetServer) this.LoadAssetDll(); - this.GridServer =(IGridServer) this.LoadGridDll(); + this.AssetServer = this.LoadAssetDll(this.AssetDll); + this.GridServer = this.LoadGridDll(this.GridDll); } - private IAssetServer LoadAssetDll() + private IAssetServer LoadAssetDll(string dllName) { - Assembly pluginAssembly = Assembly.LoadFrom(this.AssetDll); + Assembly pluginAssembly = Assembly.LoadFrom(dllName); IAssetServer server = null; foreach (Type pluginType in pluginAssembly.GetTypes()) @@ -285,9 +286,9 @@ namespace OpenSim return server; } - private IGridServer LoadGridDll() + private IGridServer LoadGridDll(string dllName) { - Assembly pluginAssembly = Assembly.LoadFrom(this.GridDll); + Assembly pluginAssembly = Assembly.LoadFrom(dllName); IGridServer server = null; foreach (Type pluginType in pluginAssembly.GetTypes()) diff --git a/src/OpenSimClient.cs b/src/OpenSimClient.cs index 632c1fd534..e05681ff55 100644 --- a/src/OpenSimClient.cs +++ b/src/OpenSimClient.cs @@ -99,6 +99,15 @@ namespace OpenSim case PacketType.AgentUpdate: ClientAvatar.HandleUpdate((AgentUpdatePacket)Pack); break; + case PacketType.LogoutRequest: + ServerConsole.MainConsole.Instance.WriteLine("OpenSimClient.cs:ProcessInPacket() - Got a logout request"); + lock(OpenSim_Main.local_world.Entities) { + OpenSim_Main.local_world.Entities.Remove(this.AgentID); + } + //need to do other cleaning up here too + OpenSim_Main.gridServers.GridServer.LogoutSession(cirpack.CircuitCode.SessionID, cirpack.CircuitCode.ID, cirpack.CircuitCode.Code); + this.ClientThread.Abort(); + break; case PacketType.ChatFromViewer: ChatFromViewerPacket inchatpack = (ChatFromViewerPacket)Pack; if(Helpers.FieldToString(inchatpack.ChatData.Message)=="") break; diff --git a/src/RemoteServers/RemoteGridServers/RemoteGrid.cs b/src/RemoteServers/RemoteGridServers/RemoteGrid.cs index 46f82a4581..f7c33e82d4 100644 --- a/src/RemoteServers/RemoteGridServers/RemoteGrid.cs +++ b/src/RemoteServers/RemoteGridServers/RemoteGrid.cs @@ -109,6 +109,18 @@ namespace RemoteGridServers return(user); } + public bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode) + { + WebRequest DeleteSession = WebRequest.Create(GridServerUrl + "/usersessions/" + GridSendKey + "/" + agentID.ToString() + circuitCode.ToString() + "/delete"); + WebResponse GridResponse = DeleteSession.GetResponse(); + StreamReader sr = new StreamReader(GridResponse.GetResponseStream()); + String grTest = sr.ReadLine(); + sr.Close(); + GridResponse.Close(); + ServerConsole.MainConsole.Instance.WriteLine("DEBUG: " + grTest); + return(true); + } + public UUIDBlock RequestUUIDBlock() { UUIDBlock uuidBlock = new UUIDBlock(); diff --git a/src/RemoteServers/RemoteGridServers/RemoteGridServers.csproj b/src/RemoteServers/RemoteGridServers/RemoteGridServers.csproj index be35e5d2f4..cb081846bc 100644 --- a/src/RemoteServers/RemoteGridServers/RemoteGridServers.csproj +++ b/src/RemoteServers/RemoteGridServers/RemoteGridServers.csproj @@ -27,7 +27,7 @@ - ..\..\..\Libsecond-dailys\libsl-03-03\trunk\libsecondlife-cs\obj\Debug\libsecondlife.dll + ..\..\..\Libsecond-dailys\libsl07-03\trunk\libsecondlife-cs\obj\Debug\libsecondlife.dll False diff --git a/src/Second-server.csproj b/src/Second-server.csproj index 07ab5f4489..5b9c76400c 100644 --- a/src/Second-server.csproj +++ b/src/Second-server.csproj @@ -48,7 +48,7 @@ False - ..\Version0_2_myserver\OpenSim\bin\Debug\libsecondlife.dll + ..\Libsecond-dailys\libsl07-03\trunk\libsecondlife-cs\obj\Debug\libsecondlife.dll False @@ -65,11 +65,12 @@ - + + diff --git a/src/VersionInfo.cs b/src/VersionInfo.cs new file mode 100644 index 0000000000..d443e516eb --- /dev/null +++ b/src/VersionInfo.cs @@ -0,0 +1,37 @@ +/* +Copyright (c) OpenSim project, http://osgrid.org/ +* +* 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 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 ``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 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; + +namespace OpenSim +{ + /// + /// + public class VersionInfo + { + public static string Version = "0.0.1-*"; + } +} diff --git a/src/physics/plugins/PhysXplugin.cs b/src/physics/plugins/PhysXplugin.cs index 6d6eca92de..8f0d043ca4 100644 --- a/src/physics/plugins/PhysXplugin.cs +++ b/src/physics/plugins/PhysXplugin.cs @@ -70,6 +70,7 @@ namespace PhysXplugin public class PhysXScene :PhysicsScene { private List _actors = new List(); + private float[] _heightMap; public PhysXScene() { @@ -91,7 +92,8 @@ namespace PhysXplugin actor.Position.X = actor.Position.X + actor.Velocity.X * timeStep; actor.Position.Y = actor.Position.Y + actor.Velocity.Y * timeStep; actor.Position.Z = actor.Position.Z + actor.Velocity.Z * timeStep; - if(actor.Position.X<0) + actor.Position.Z = _heightMap[(int)actor.Position.Y * 256 + (int)actor.Position.X]+1; + if(actor.Position.X<0) { actor.Position.X = 0; actor.Velocity.X = 0; @@ -129,7 +131,7 @@ namespace PhysXplugin public override void SetTerrain(float[] heightMap) { - + this._heightMap = heightMap; } } diff --git a/src/types/BitPack.cs b/src/types/BitPack.cs deleted file mode 100644 index 1abbcf012e..0000000000 --- a/src/types/BitPack.cs +++ /dev/null @@ -1,138 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; - -namespace OpenSim.types -{ - /* New Method - * - * 1. Get all the individual bytes and their bitlength, put them in a dictionary - * 2. Mash together when wanted. - * - * */ - public class Bits { - public byte[] data; - public int len; - } - - public class InverseBitPack - { - private List bits; - - public InverseBitPack() - { - bits = new List(); - } - } - - public class BitPack - { - private const int MAX_BITS = 8; - - private byte[] Data; - private int bytePos; - private int bitPos; - - public BitPack(byte[] data, int pos) // For libsl compatibility - { - Data = data; - bytePos = pos; - } - - public BitPack() // Encoding version - { - - } - - public void LoadData(byte[] data, int pos) { - Data = data; - bytePos = pos; - bitPos = 0; - } - - private void PackBitsArray(byte[] bits, int bitLen) - { - int offset = bitPos % MAX_BITS; - int i; - byte temp1; - byte temp2; - - for (i = 0; i < bits.Length; i++) - { - int Byte = bits[i]; - Byte <<= offset; - temp1 = (byte)(Byte & 0xFF); - temp2 = (byte)((Byte >> 8) & 0xFF); - - Data[Data.Length - 1] |= temp1; -// Data - - bitPos += bitLen; - } - } - - public float UnpackFloat() - { - byte[] output = UnpackBitsArray(32); - - if (!BitConverter.IsLittleEndian) Array.Reverse(output); - return BitConverter.ToSingle(output, 0); - } - - public int UnpackBits(int totalCount) - { - byte[] output = UnpackBitsArray(totalCount); - - if (!BitConverter.IsLittleEndian) Array.Reverse(output); - return BitConverter.ToInt32(output, 0); - } - - private byte[] UnpackBitsArray(int totalCount) - { - int count = 0; - byte[] output = new byte[4]; - int curBytePos = 0; - int curBitPos = 0; - - while (totalCount > 0) - { - if (totalCount > MAX_BITS) - { - count = MAX_BITS; - totalCount -= MAX_BITS; - } - else - { - count = totalCount; - totalCount = 0; - } - - while (count > 0) - { - // Shift the previous bits - output[curBytePos] <<= 1; - - // Grab one bit - if ((Data[bytePos] & (0x80 >> bitPos++)) != 0) - ++output[curBytePos]; - - --count; - ++curBitPos; - - if (bitPos >= MAX_BITS) - { - bitPos = 0; - ++bytePos; - } - if (curBitPos >= MAX_BITS) - { - curBitPos = 0; - ++curBytePos; - } - } - } - - return output; - } - } -} diff --git a/src/world/Avatar.cs b/src/world/Avatar.cs index 7b3ad03375..054fc816ae 100644 --- a/src/world/Avatar.cs +++ b/src/world/Avatar.cs @@ -19,6 +19,7 @@ namespace OpenSim.world private bool updateflag; private bool walking; private List forcesList = new List(); + private short _updateCount; public Avatar(OpenSimClient TheClient) { ServerConsole.MainConsole.Instance.WriteLine("Avatar.cs - Loading details from grid (DUMMY)"); @@ -36,16 +37,23 @@ namespace OpenSim.world } public override void addFroces() { - if(this.forcesList.Count>0) + lock(this.forcesList) { - for(int i=0 ; i < this.forcesList.Count; i++) + if(this.forcesList.Count>0) { - NewForce force = this.forcesList[i]; - PhysicsVector phyVector = new PhysicsVector(force.X, force.Y, force.Z); - this._physActor.Velocity = phyVector; - this.updateflag = true; - this.velocity = new LLVector3(force.X, force.Y, force.Z); //shouldn't really be doing this - // but as we are setting the velocity (rather than using real forces) at the moment it is okay. + for(int i=0 ; i < this.forcesList.Count; i++) + { + NewForce force = this.forcesList[i]; + PhysicsVector phyVector = new PhysicsVector(force.X, force.Y, force.Z); + this._physActor.Velocity = phyVector; + this.updateflag = true; + this.velocity = new LLVector3(force.X, force.Y, force.Z); //shouldn't really be doing this + // but as we are setting the velocity (rather than using real forces) at the moment it is okay. + } + for(int i=0 ; i < this.forcesList.Count; i++) + { + this.forcesList.RemoveAt(0); + } } } } @@ -60,7 +68,7 @@ namespace OpenSim.world ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateTerseBlock(); ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket(); terse.RegionData.RegionHandle = OpenSim_Main.cfg.RegionHandle; // FIXME - terse.RegionData.TimeDilation = 0; + terse.RegionData.TimeDilation = 64096; terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; terse.ObjectData[0] = terseBlock; foreach(OpenSimClient client in OpenSim_Main.sim.ClientThreads.Values) { @@ -68,6 +76,25 @@ namespace OpenSim.world } updateflag =false; + this._updateCount = 0; + } + else + { + _updateCount++; + if(_updateCount>5) + { + //It has been a while since last update was sent so lets send one. + ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateTerseBlock(); + ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket(); + terse.RegionData.RegionHandle = OpenSim_Main.cfg.RegionHandle; // FIXME + terse.RegionData.TimeDilation = 64096; + terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; + terse.ObjectData[0] = terseBlock; + foreach(OpenSimClient client in OpenSim_Main.sim.ClientThreads.Values) { + client.OutPacket(terse); + } + _updateCount = 0; + } } } @@ -110,13 +137,12 @@ namespace OpenSim.world mov.Data.Position = new LLVector3(100f, 100f, 23f); mov.Data.LookAt = new LLVector3(0.99f, 0.042f, 0); - ServerConsole.MainConsole.Instance.WriteLine("Sending AgentMovementComplete packet"); ControllingClient.OutPacket(mov); } public void SendInitialPosition() { + System.Text.Encoding _enc = System.Text.Encoding.ASCII; - //send a objectupdate packet with information about the clients avatar ObjectUpdatePacket objupdate = new ObjectUpdatePacket(); objupdate.RegionData.RegionHandle = OpenSim_Main.cfg.RegionHandle; @@ -243,6 +269,7 @@ namespace OpenSim.world libsecondlife.LLVector3 pos2 = new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z); uint ID = this.localid; + bytes[i++] = (byte)(ID % 256); bytes[i++] = (byte)((ID >> 8) % 256); bytes[i++] = (byte)((ID >> 16) % 256); @@ -259,6 +286,7 @@ namespace OpenSim.world ushort InternVelocityX; ushort InternVelocityY; ushort InternVelocityZ; + Axiom.MathLib.Vector3 internDirec = new Axiom.MathLib.Vector3(this._physActor.Velocity.X, this._physActor.Velocity.Y, this._physActor.Velocity.Z); internDirec = internDirec /128.0f; internDirec.x += 1; @@ -269,7 +297,6 @@ namespace OpenSim.world InternVelocityY = (ushort)(32768 * internDirec.y); InternVelocityZ = (ushort)(32768 * internDirec.z); - ushort ac = 32767; bytes[i++] = (byte)(InternVelocityX % 256); bytes[i++] = (byte)((InternVelocityX >> 8) % 256); diff --git a/src/world/TerrainDecoder.cs b/src/world/TerrainDecoder.cs deleted file mode 100644 index 1a3482611f..0000000000 --- a/src/world/TerrainDecoder.cs +++ /dev/null @@ -1,683 +0,0 @@ -/* -* Copyright (c) OpenSim project, http://sim.opensecondlife.org/ -* -* 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 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 ``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 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 libsecondlife; -using libsecondlife.Packets; - -namespace OpenSim -{ - /// - /// Description of TerrainDecoder. - /// - public class TerrainDecode - { - - public enum LayerType : byte - { - Land = 0x4C, - Water = 0x57, - Wind = 0x37, - Cloud = 0x38 - } - - public struct GroupHeader - { - public int Stride; - public int PatchSize; - public LayerType Type; - } - - public struct PatchHeader - { - public float DCOffset; - public int Range; - public int QuantWBits; - public int PatchIDs; - public uint WordBits; - } - - public class Patch - { - public float[] Heightmap; - } - - - /// - /// - /// - /// - /// - /// - /// - /// - // public delegate void LandPatchCallback(Simulator simulator, int x, int y, int width, float[] data); - - - /// - /// - /// - //public event LandPatchCallback OnLandPatch; - - private Random RandomClass = new Random(); - - private const byte END_OF_PATCHES = 97; - private const int PATCHES_PER_EDGE = 16; - private const float OO_SQRT2 = 0.7071067811865475244008443621049f; - - //private SecondLife Client; - private Dictionary SimPatches = new Dictionary(); - private float[] DequantizeTable16 = new float[16 * 16]; - private float[] DequantizeTable32 = new float[32 * 32]; - private float[] ICosineTable16 = new float[16 * 16]; - private float[] ICosineTable32 = new float[32 * 32]; - private int[] DeCopyMatrix16 = new int[16 * 16]; - private int[] DeCopyMatrix32 = new int[32 * 32]; - - - /// - /// - /// - /// - public TerrainDecode() - { - - // Initialize the decompression tables - BuildDequantizeTable16(); - BuildDequantizeTable32(); - SetupICosines16(); - SetupICosines32(); - BuildDecopyMatrix16(); - BuildDecopyMatrix32(); - - } - - - private void BuildDequantizeTable16() - { - for (int j = 0; j < 16; j++) - { - for (int i = 0; i < 16; i++) - { - DequantizeTable16[j * 16 + i] = 1.0f + 2.0f * (float)(i + j); - } - } - } - - private void BuildDequantizeTable32() - { - for (int j = 0; j < 32; j++) - { - for (int i = 0; i < 32; i++) - { - DequantizeTable32[j * 32 + i] = 1.0f + 2.0f * (float)(i + j); - } - } - } - - private void SetupICosines16() - { - const float hposz = (float)Math.PI * 0.5f / 16.0f; - - for (int u = 0; u < 16; u++) - { - for (int n = 0; n < 16; n++) - { - ICosineTable16[u * 16 + n] = (float)Math.Cos((2.0f * (float)n + 1.0f) * (float)u * hposz); - } - } - } - - private void SetupICosines32() - { - const float hposz = (float)Math.PI * 0.5f / 32.0f; - - for (int u = 0; u < 32; u++) - { - for (int n = 0; n < 32; n++) - { - ICosineTable32[u * 32 + n] = (float)Math.Cos((2.0f * (float)n + 1.0f) * (float)u * hposz); - } - } - } - - private void BuildDecopyMatrix16() - { - bool diag = false; - bool right = true; - int i = 0; - int j = 0; - int count = 0; - - while (i < 16 && j < 16) - { - DeCopyMatrix16[j * 16 + i] = count++; - - if (!diag) - { - if (right) - { - if (i < 16 - 1) i++; - else j++; - - right = false; - diag = true; - } - else - { - if (j < 16 - 1) j++; - else i++; - - right = true; - diag = true; - } - } - else - { - if (right) - { - i++; - j--; - if (i == 16 - 1 || j == 0) diag = false; - } - else - { - i--; - j++; - if (j == 16 - 1 || i == 0) diag = false; - } - } - } - } - - private void BuildDecopyMatrix32() - { - bool diag = false; - bool right = true; - int i = 0; - int j = 0; - int count = 0; - - while (i < 32 && j < 32) - { - DeCopyMatrix32[j * 32 + i] = count++; - - if (!diag) - { - if (right) - { - if (i < 32 - 1) i++; - else j++; - - right = false; - diag = true; - } - else - { - if (j < 32 - 1) j++; - else i++; - - right = true; - diag = true; - } - } - else - { - if (right) - { - i++; - j--; - if (i == 32 - 1 || j == 0) diag = false; - } - else - { - i--; - j++; - if (j == 32 - 1 || i == 0) diag = false; - } - } - } - } - - private void EncodePatchHeader(BitPacker bitpack, PatchHeader header) - { - bitpack.PackBits(header.QuantWBits,8); - - if (header.QuantWBits == END_OF_PATCHES) - return; - - bitpack.PackFloat(header.DCOffset); - bitpack.PackBits(header.Range,16); - bitpack.PackBits(header.PatchIDs,10); - - } - - public void DCTLine16(float[] In, float[] Out, int line) - { - int N =16; - int lineSize = line * 16; - - for(int k = 0; k < N;k++) - { - float sum = 0.0f; - for(int n = 0; n < N; n++) - { - float num = (float)(Math.PI*k*(2.0f*n+1)/(2*N)); - float cosine = (float)Math.Cos(num); - float product = In[lineSize +n] * cosine; - sum += product; - } - - float alpha; - if(k == 0) - { - alpha = (float)(1.0f/Math.Sqrt(2)); - } - else - { - alpha = 1; - } - Out[lineSize + k] =(float)( sum * alpha ); - - } - } - public void DCTColumn16(float[] In, float[] Out, int Column) - { - int N =16; - int uSize; - - for(int k = 0; k < N; k++){ - float sum = 0.0f; - for(int n = 0; n < N; n++) - { - uSize = n * 16; - float num = (float)(Math.PI*k*(2.0f*n+1)/(2*N)); - float cosine = (float)Math.Cos(num); - float product = In[uSize + Column] * cosine; - sum += product; - } - - float alpha; - if(k == 0) - { - alpha = (float)(1.0f/Math.Sqrt(2)); - } - else - { - alpha = 1; - } - Out[16 * k + Column] = (float)( sum * alpha * (2.0f /N)); - - } - } - - private void EncodePatch(int[] patches, BitPacker bitpack, int size) - { - int lastnum =0; - for(int n = 0; n < size * size; n++) - { - if(patches[n]!=0) - lastnum=n; - } - for (int n = 0; n < lastnum+1; n++) - { - if(patches[n] != 0) - { - bitpack.PackBits(1,1); //value or EOB - bitpack.PackBits(1,1); //value - if(patches[n] > 0) - { - - bitpack.PackBits(0,1); // positive - bitpack.PackBits(patches[n],13); - - } - else - { - bitpack.PackBits(1,1); // negative - - int temp = patches[n] * -1; - bitpack.PackBits(temp,13); - - } - } - else - { - bitpack.PackBits(0,1); // no value - } - } - - bitpack.PackBits(1,1); //value or EOB - bitpack.PackBits(0,1); // EOB - } - - public int[] CompressPatch(float[] patches) - { - int size = 16; - float[] block = new float[size * size]; - int[] output = new int[size * size]; - int prequant = (139 >> 4) + 2; - int quantize = 1 << prequant; - float ooq = 1.0f / (float)quantize; - float mult = ooq * (float)1; - float addval = mult * (float)(1 << (prequant - 1)) + 20.4989f; - - if (size == 16) - { - for (int n = 0; n < 16 * 16; n++) - { - block[n] = (float)((patches[n] - addval)/ mult); - } - - float[] ftemp = new float[32 * 32]; - - for (int o = 0; o < 16; o++) - this.DCTColumn16(block, ftemp, o); - for (int o = 0; o < 16; o++) - this.DCTLine16(ftemp, block, o); - } - - for (int j = 0; j < block.Length; j++) - { - output[DeCopyMatrix16[j]] = (int)(block[j] / DequantizeTable16[j]); - } - - return output; - } - - public Packet CreateLayerPacket(float[] heightmap, int minX, int minY, int maxX, int maxY) - { - //int minX = 0, maxX = 2, minY = 0, maxY = 1; //these should be passed to this function - LayerDataPacket layer = new LayerDataPacket(); - byte[] Encoded = new byte[2048]; - layer.LayerID.Type = 76; - GroupHeader header = new GroupHeader(); - header.Stride = 264; - header.PatchSize = 16; - header.Type = LayerType.Land; - BitPacker newpack = new BitPacker(Encoded,0); - newpack.PackBits(header.Stride,16); - newpack.PackBits(header.PatchSize,8); - newpack.PackBits((int)header.Type,8); - - - float[] height; - for(int y = minY; y< maxY; y++) - { - for(int x = minX ; x < maxX ; x++) - { - height = new float[256]; - Array.Copy(heightmap, (4096 *y) +(x *256), height, 0, 256); - - this.CreatePatch(height, newpack, x, y); - } - } - - PatchHeader headers = new PatchHeader(); - headers.QuantWBits = END_OF_PATCHES; - this.EncodePatchHeader(newpack, headers); - - int lastused=0; - for(int i = 0; i < 2048 ; i++) - { - if(Encoded[i] !=0) - lastused = i; - } - - byte[] data = new byte[lastused+1]; - Array.Copy(Encoded, data, lastused+1); - layer.LayerData.Data =data; - - return(layer); - } - public void CreatePatch(float[] heightmap, BitPacker newpack, int x, int y) - { - PatchHeader header = new PatchHeader(); - header.DCOffset = 20.4989f; - header.QuantWBits = 139; - header.Range = 1; - header.PatchIDs = (y & 0x1F); - header.PatchIDs += x <<5 ; - - this.EncodePatchHeader(newpack, header); - - int[] newpatch = this.CompressPatch(heightmap); - this.EncodePatch(newpatch, newpack, 16); - - } - } - - //*************************************************** - public class BitPacker - { - private const int MAX_BITS = 8; - - private byte[] Data; - public int bytePos; - public int bitPos; - - /// - /// Default constructor, initialize the bit packer / bit unpacker - /// with a byte array and starting position - /// - /// Byte array to pack bits in to or unpack from - /// Starting position in the byte array - public BitPacker(byte[] data, int pos) - { - Data = data; - bytePos = pos; - } - - /// - /// Pack a floating point value in to the data - /// - /// Floating point value to pack - public void PackFloat(float data) - { - byte[] input = BitConverter.GetBytes(data); - PackBitArray(input, 32); - } - - /// - /// Pack part or all of an integer in to the data - /// - /// Integer containing the data to pack - /// Number of bits of the integer to pack - public void PackBits(int data, int totalCount) - { - byte[] input = BitConverter.GetBytes(data); - PackBitArray(input, totalCount); - } - - /// - /// Unpacking a floating point value from the data - /// - /// Unpacked floating point value - public float UnpackFloat() - { - byte[] output = UnpackBitsArray(32); - - if (!BitConverter.IsLittleEndian) Array.Reverse(output); - return BitConverter.ToSingle(output, 0); - } - - /// - /// Unpack a variable number of bits from the data in to integer format - /// - /// Number of bits to unpack - /// An integer containing the unpacked bits - /// This function is only useful up to 32 bits - public int UnpackBits(int totalCount) - { - byte[] output = UnpackBitsArray(totalCount); - - if (!BitConverter.IsLittleEndian) Array.Reverse(output); - return BitConverter.ToInt32(output, 0); - } - - private void PackBitArray(byte[] data, int totalCount) - { - int count = 0; - int curBytePos = 0; - int curBitPos = 0; - - while (totalCount > 0) - { - if (totalCount > (MAX_BITS )) - { - count = MAX_BITS ; - totalCount -= MAX_BITS ; - } - else - { - count = totalCount; - totalCount = 0; - } - - while (count > 0) - { - switch(count) - { - case 1: - if ((data[curBytePos] & (0x01)) != 0) - { - Data[bytePos] |= (byte)(0x80 >> bitPos); - } - break; - case 2: - if ((data[curBytePos] & (0x02)) != 0) - { - Data[bytePos] |= (byte)(0x80 >> bitPos); - } - break; - case 3: - if ((data[curBytePos] & (0x04)) != 0) - { - Data[bytePos] |= (byte)(0x80 >> bitPos); - } - break; - case 4: - if ((data[curBytePos] & (0x08)) != 0) - { - Data[bytePos] |= (byte)(0x80 >> bitPos); - } - break; - case 5: - if ((data[curBytePos] & (0x10)) != 0) - { - Data[bytePos] |= (byte)(0x80 >> bitPos); - } - break; - case 6: - if ((data[curBytePos] & (0x20)) != 0) - { - Data[bytePos] |= (byte)(0x80 >> bitPos); - } - break; - case 7: - if ((data[curBytePos] & (0x40)) != 0) - { - Data[bytePos] |= (byte)(0x80 >> bitPos); - } - break; - case 8: - if ((data[curBytePos] & (0x80)) != 0) - { - Data[bytePos] |= (byte)(0x80 >> bitPos); - } - break; - } - - bitPos++; - --count; - ++curBitPos; - - if (bitPos >= MAX_BITS) - { - bitPos = 0; - ++bytePos; - } - if (curBitPos >= MAX_BITS) - { - curBitPos = 0; - ++curBytePos; - } - } - } - } - - - private byte[] UnpackBitsArray(int totalCount) - { - int count = 0; - byte[] output = new byte[4]; - int curBytePos = 0; - int curBitPos = 0; - - while (totalCount > 0) - { - if (totalCount > MAX_BITS) - { - count = MAX_BITS; - totalCount -= MAX_BITS; - } - else - { - count = totalCount; - totalCount = 0; - } - - while (count > 0) - { - // Shift the previous bits - output[curBytePos] <<= 1; - - // Grab one bit - if ((Data[bytePos] & (0x80 >> bitPos++)) != 0) - ++output[curBytePos]; - - --count; - ++curBitPos; - - if (bitPos >= MAX_BITS) - { - bitPos = 0; - ++bytePos; - } - if (curBitPos >= MAX_BITS) - { - curBitPos = 0; - ++curBytePos; - } - } - } - - return output; - } - } -} diff --git a/src/world/World.cs b/src/world/World.cs index a87352409a..57b698d944 100644 --- a/src/world/World.cs +++ b/src/world/World.cs @@ -12,10 +12,10 @@ namespace OpenSim.world public Dictionary Entities; public float[] LandMap; public ScriptEngine Scripts; - public TerrainDecode terrainengine = new TerrainDecode(); public uint _localNumber=0; private PhysicsScene phyScene; private float timeStep= 0.1f; + private libsecondlife.TerrainManager TerrainManager; private Random Rand = new Random(); @@ -25,13 +25,11 @@ namespace OpenSim.world Entities = new Dictionary(); ServerConsole.MainConsole.Instance.WriteLine("World.cs - creating LandMap"); - terrainengine = new TerrainDecode(); - LandMap = new float[65536]; - - - ServerConsole.MainConsole.Instance.WriteLine("World.cs - Creating script engine instance"); + TerrainManager = new TerrainManager(new SecondLife()); + + // ServerConsole.MainConsole.Instance.WriteLine("World.cs - Creating script engine instance"); // Initialise this only after the world has loaded - Scripts = new ScriptEngine(this); + // Scripts = new ScriptEngine(this); } public PhysicsScene PhysScene @@ -40,6 +38,10 @@ namespace OpenSim.world { this.phyScene = value; } + get + { + return(this.phyScene); + } } public void Update() @@ -64,10 +66,21 @@ namespace OpenSim.world } public void SendLayerData(OpenSimClient RemoteClient) { - for(int x=0; x<16; x=x+4) for(int y=0; y<16; y++){ - Packet layerpack=this.terrainengine.CreateLayerPacket(LandMap, x,y,x+4,y+1); - RemoteClient.OutPacket(layerpack); - } + int[] patches = new int[4]; + + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x = x + 4) + { + patches[0] = x + 0 + y * 16; + patches[1] = x + 1 + y * 16; + patches[2] = x + 2 + y * 16; + patches[3] = x + 3 + y * 16; + + Packet layerpack = TerrainManager.CreateLandPacket(LandMap, patches); + RemoteClient.OutPacket(layerpack); + } + } } public void AddViewerAgent(OpenSimClient AgentClient) {