From 778e302133283e3c4ea9c26431b46b3abe23dc1a Mon Sep 17 00:00:00 2001 From: MW Date: Wed, 7 Mar 2007 22:25:13 +0000 Subject: [PATCH] Primitives movement and rotation updates are now sent to all clients --- src/OpenSimClient.cs | 34 ++++++++++++++++ src/world/Avatar.cs | 2 - src/world/Primitive.cs | 91 ++++++++++++++++++++++++++++++++++++++++++ src/world/World.cs | 1 - 4 files changed, 125 insertions(+), 3 deletions(-) diff --git a/src/OpenSimClient.cs b/src/OpenSimClient.cs index 5f6880611b..9544e7b359 100644 --- a/src/OpenSimClient.cs +++ b/src/OpenSimClient.cs @@ -35,6 +35,7 @@ using System.IO; using System.Threading; using System.Timers; using OpenSim.GridServers; +using OpenSim.world; namespace OpenSim { @@ -102,6 +103,39 @@ namespace OpenSim case PacketType.ObjectAdd: OpenSim_Main.local_world.AddNewPrim((ObjectAddPacket)Pack, this); break; + case PacketType.MultipleObjectUpdate : + MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)Pack; + + for( int i = 0; i < multipleupdate.ObjectData.Length; i++ ) + { + if( multipleupdate.ObjectData[ i ].Type == 9 ) //change position + { + libsecondlife.LLVector3 pos = new LLVector3(multipleupdate.ObjectData[ i ].Data, 0 ); + foreach (Entity ent in OpenSim_Main.local_world.Entities.Values) + { + if(ent.localid == multipleupdate.ObjectData[ i ].ObjectLocalID) + { + ent.position = pos; + ((OpenSim.world.Primitive)ent).UpdateFlag = true; + } + } + + //should update stored position of the prim + } + else if(multipleupdate.ObjectData[i].Type == 10 )//rotation + { + libsecondlife.LLQuaternion rot = new LLQuaternion(multipleupdate.ObjectData[i].Data, 0, true); + foreach (Entity ent in OpenSim_Main.local_world.Entities.Values) + { + if(ent.localid == multipleupdate.ObjectData[ i ].ObjectLocalID) + { + ent.rotation = new Axiom.MathLib.Quaternion(rot.W, rot.X, rot.Y, rot.W); + ((OpenSim.world.Primitive)ent).UpdateFlag = true; + } + } + } + } + break; case PacketType.TransferRequest: //Console.WriteLine("OpenSimClient.cs:ProcessInPacket() - Got transfer request"); TransferRequestPacket transfer = (TransferRequestPacket)Pack; diff --git a/src/world/Avatar.cs b/src/world/Avatar.cs index 1a53acc039..cf95f768cd 100644 --- a/src/world/Avatar.cs +++ b/src/world/Avatar.cs @@ -104,7 +104,6 @@ namespace OpenSim.world public static void SetupTemplate(string name) { - int i = 0; FileInfo fInfo = new FileInfo(name); long numBytes = fInfo.Length; @@ -127,7 +126,6 @@ namespace OpenSim.world Array.Copy(pb, 0, objdata.ObjectData, 16, pb.Length); Avatar.AvatarTemplate = objdata; - } public void CompleteMovement(World RegionInfo) { diff --git a/src/world/Primitive.cs b/src/world/Primitive.cs index 7b1f69a72f..1fb7142194 100644 --- a/src/world/Primitive.cs +++ b/src/world/Primitive.cs @@ -13,8 +13,21 @@ namespace OpenSim.world protected float mesh_cutend; protected PrimData primData; protected bool newPrimFlag; + protected bool updateFlag; protected ObjectUpdatePacket OurPacket; + public bool UpdateFlag + { + get + { + return updateFlag; + } + set + { + updateFlag = value; + } + } + public Primitive() { mesh_cutbegin = 0.0f; @@ -44,6 +57,18 @@ namespace OpenSim.world } this.newPrimFlag = false; } + else if(this.updateFlag) + { + 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] = this.CreateImprovedBlock(); + foreach(OpenSimClient client in OpenSim_Main.sim.ClientThreads.Values) { + client.OutPacket(terse); + } + this.updateFlag = false; + } } public void CreateFromPacket( ObjectAddPacket addPacket, LLUUID agentID, uint localID) @@ -109,6 +134,72 @@ namespace OpenSim.world this.position = pos1; this.OurPacket = objupdate; } + + public ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateImprovedBlock() + { + uint ID = this.localid; + byte[] bytes = new byte[60]; + + + int i = 0; + ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock(); + dat.TextureEntry = this.OurPacket.ObjectData[0].TextureEntry; + + bytes[i++] = (byte)(ID % 256); + bytes[i++] = (byte)((ID >> 8) % 256); + bytes[i++] = (byte)((ID >> 16) % 256); + bytes[i++] = (byte)((ID >> 24) % 256); + bytes[i++]= 0; + bytes[i++]= 0; + + byte[] pb = this.position.GetBytes(); + Array.Copy(pb, 0, bytes, i, pb.Length); + i += 12; + ushort ac = 32767; + + //vel + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + + //accel + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + + ushort rw, rx,ry,rz; + rw = (ushort)(32768 * (this.rotation.w+1)); + rx = (ushort)(32768 * (this.rotation.x+1)); + ry = (ushort)(32768 * (this.rotation.y+1)); + rz = (ushort)(32768 * (this.rotation.z+1)); + + //rot + bytes[i++] = (byte)(rx % 256); + bytes[i++] = (byte)((rx >> 8) % 256); + bytes[i++] = (byte)(ry % 256); + bytes[i++] = (byte)((ry >> 8) % 256); + bytes[i++] = (byte)(rz % 256); + bytes[i++] = (byte)((rz >> 8) % 256); + bytes[i++] = (byte)(rw % 256); + bytes[i++] = (byte)((rw >> 8) % 256); + + //rotation vel + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + + dat.Data=bytes; + return dat; + } } public class PrimData diff --git a/src/world/World.cs b/src/world/World.cs index 41a7a34ddc..f6f58c7130 100644 --- a/src/world/World.cs +++ b/src/world/World.cs @@ -29,7 +29,6 @@ namespace OpenSim.world ServerConsole.MainConsole.Instance.WriteLine("World.cs - creating LandMap"); TerrainManager = new TerrainManager(new SecondLife()); Avatar.SetupTemplate("avatar-template.dat"); - // ServerConsole.MainConsole.Instance.WriteLine("World.cs - Creating script engine instance"); // Initialise this only after the world has loaded // Scripts = new ScriptEngine(this);