More testing some ideas, to find best method for SceneObject Primitive classes.
parent
e78a0ac886
commit
643a02ec60
|
@ -180,8 +180,6 @@ namespace OpenSim.Framework.Interfaces
|
|||
void SendAvatarTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position, LLVector3 velocity);
|
||||
|
||||
void AttachObject(uint localID, LLQuaternion rotation, byte attachPoint);
|
||||
void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimData primData, LLVector3 pos, LLQuaternion rotation, LLUUID textureID , uint flags);
|
||||
void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimData primData, LLVector3 pos, LLUUID textureID, uint flags);
|
||||
void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, LLVector3 pos, LLQuaternion rotation, uint flags, LLUUID objectID, LLUUID ownerID, string text, uint parentID);
|
||||
void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, LLVector3 pos, uint flags, LLUUID objectID, LLUUID ownerID, string text, uint parentID);
|
||||
void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position, LLQuaternion rotation);
|
||||
|
|
|
@ -1,129 +0,0 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Net;
|
||||
using OpenSim.Framework.Interfaces;
|
||||
using OpenSim.Framework.Types;
|
||||
using OpenSim.Framework.Data;
|
||||
using libsecondlife;
|
||||
using libsecondlife.Packets;
|
||||
|
||||
|
||||
namespace OpenSim.Framework
|
||||
{
|
||||
public class NpcClientBase : IClientAPI
|
||||
{
|
||||
#pragma warning disable 67
|
||||
public event ImprovedInstantMessage OnInstantMessage;
|
||||
public event ChatFromViewer OnChatFromViewer;
|
||||
public event RezObject OnRezObject;
|
||||
public event ModifyTerrain OnModifyTerrain;
|
||||
public event SetAppearance OnSetAppearance;
|
||||
public event StartAnim OnStartAnim;
|
||||
public event LinkObjects OnLinkObjects;
|
||||
public event RequestMapBlocks OnRequestMapBlocks;
|
||||
public event TeleportLocationRequest OnTeleportLocationRequest;
|
||||
|
||||
public event GenericCall4 OnDeRezObject;
|
||||
public event GenericCall OnRegionHandShakeReply;
|
||||
public event GenericCall OnRequestWearables;
|
||||
public event GenericCall2 OnCompleteMovementToRegion;
|
||||
public event UpdateAgent OnAgentUpdate;
|
||||
public event GenericCall OnRequestAvatarsData;
|
||||
public event AddNewPrim OnAddPrim;
|
||||
public event ObjectDuplicate OnObjectDuplicate;
|
||||
public event UpdateVector OnGrapObject;
|
||||
public event ObjectSelect OnDeGrapObject;
|
||||
public event MoveObject OnGrapUpdate;
|
||||
|
||||
public event UpdateShape OnUpdatePrimShape;
|
||||
public event ObjectSelect OnObjectSelect;
|
||||
public event GenericCall7 OnObjectDescription;
|
||||
public event GenericCall7 OnObjectName;
|
||||
public event UpdatePrimFlags OnUpdatePrimFlags;
|
||||
public event UpdatePrimTexture OnUpdatePrimTexture;
|
||||
public event UpdateVector OnUpdatePrimGroupPosition;
|
||||
public event UpdateVector OnUpdatePrimSinglePosition;
|
||||
public event UpdatePrimRotation OnUpdatePrimGroupRotation;
|
||||
public event UpdatePrimSingleRotation OnUpdatePrimSingleRotation;
|
||||
public event UpdatePrimGroupRotation OnUpdatePrimGroupMouseRotation;
|
||||
public event UpdateVector OnUpdatePrimScale;
|
||||
public event StatusChange OnChildAgentStatus;
|
||||
public event GenericCall2 OnStopMovement;
|
||||
public event NewAvatar OnNewAvatar;
|
||||
public event GenericCall6 OnRemoveAvatar;
|
||||
|
||||
public event UUIDNameRequest OnNameFromUUIDRequest;
|
||||
|
||||
public event ParcelPropertiesRequest OnParcelPropertiesRequest;
|
||||
public event ParcelDivideRequest OnParcelDivideRequest;
|
||||
public event ParcelJoinRequest OnParcelJoinRequest;
|
||||
public event ParcelPropertiesUpdateRequest OnParcelPropertiesUpdateRequest;
|
||||
public event ParcelSelectObjects OnParcelSelectObjects;
|
||||
public event ParcelObjectOwnerRequest OnParcelObjectOwnerRequest;
|
||||
public event ObjectDeselect OnObjectDeselect;
|
||||
|
||||
|
||||
public event EstateOwnerMessageRequest OnEstateOwnerMessage;
|
||||
#pragma warning restore 67
|
||||
|
||||
public virtual LLVector3 StartPos
|
||||
{
|
||||
get { return new LLVector3(); }
|
||||
set { }
|
||||
}
|
||||
|
||||
public virtual LLUUID AgentId
|
||||
{
|
||||
get { return LLUUID.Random(); }
|
||||
}
|
||||
|
||||
public virtual string FirstName
|
||||
{
|
||||
get { return ""; }
|
||||
}
|
||||
|
||||
public virtual string LastName
|
||||
{
|
||||
get { return ""; }
|
||||
}
|
||||
|
||||
public NpcClientBase()
|
||||
{
|
||||
}
|
||||
|
||||
public virtual void OutPacket(Packet newPack){}
|
||||
public virtual void SendWearables(AvatarWearable[] wearables){}
|
||||
public virtual void SendStartPingCheck(byte seq){}
|
||||
public virtual void SendKillObject(ulong regionHandle, uint avatarLocalID){}
|
||||
public virtual void SendAnimation(LLUUID animID, int seq, LLUUID sourceAgentId){}
|
||||
public virtual void SendRegionHandshake(RegionInfo regionInfo){}
|
||||
public virtual void SendChatMessage(string message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID){}
|
||||
public virtual void SendChatMessage(byte[] message, byte type, LLVector3 fromPos, string fromName, LLUUID fromAgentID){}
|
||||
public virtual void SendInstantMessage(string message, LLUUID target, string fromName){}
|
||||
public virtual void SendLayerData(float[] map){}
|
||||
public virtual void SendLayerData(int px, int py, float[] map){}
|
||||
public virtual void MoveAgentIntoRegion(RegionInfo regInfo, LLVector3 pos, LLVector3 look){}
|
||||
public virtual void InformClientOfNeighbour(ulong neighbourHandle, IPEndPoint neighbourExternalEndPoint){}
|
||||
public virtual AgentCircuitData RequestClientInfo() { return new AgentCircuitData(); }
|
||||
public virtual void CrossRegion(ulong newRegionHandle, LLVector3 pos, LLVector3 lookAt, IPEndPoint newRegionExternalEndPoint){}
|
||||
public virtual void SendMapBlock(List<MapBlockData> mapBlocks){}
|
||||
public virtual void SendLocalTeleport(LLVector3 position, LLVector3 lookAt, uint flags){}
|
||||
public virtual void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint regionExternalEndPoint, uint locationID, uint flags){}
|
||||
public virtual void SendTeleportCancel(){}
|
||||
public virtual void SendTeleportLocationStart(){}
|
||||
public virtual void SendMoneyBalance(LLUUID transaction, bool success, byte[] description, int balance){}
|
||||
|
||||
public virtual void SendAvatarData(ulong regionHandle, string firstName, string lastName, LLUUID avatarID, uint avatarLocalID, LLVector3 Pos, byte[] textureEntry){}
|
||||
public virtual void SendAvatarTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position, LLVector3 velocity){}
|
||||
|
||||
public virtual void AttachObject(uint localID, LLQuaternion rotation, byte attachPoint){}
|
||||
public virtual void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimData primData, LLVector3 pos, LLQuaternion rotation, LLUUID textureID, uint flags){}
|
||||
public virtual void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimData primData, LLVector3 pos, LLUUID textureID, uint flags){}
|
||||
public virtual void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, LLVector3 pos, LLQuaternion rotation, uint flags, LLUUID objectID, LLUUID ownerID, string text, uint parentID){}
|
||||
public virtual void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, LLVector3 pos, uint flags, LLUUID objectID, LLUUID ownerID, string text, uint parentID){}
|
||||
public virtual void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, LLVector3 position, LLQuaternion rotation){}
|
||||
|
||||
public virtual void SendInventoryFolderDetails(LLUUID ownerID, LLUUID folderID, List<InventoryItemBase> items){}
|
||||
public virtual void SendInventoryItemDetails(LLUUID ownerID, LLUUID folderID, InventoryItemBase item){}
|
||||
public virtual void SendNameReply(LLUUID profileId, string firstname, string lastname){}
|
||||
}
|
||||
}
|
|
@ -65,7 +65,7 @@ namespace OpenSim.Framework.Types
|
|||
}
|
||||
|
||||
//void returns need to change of course
|
||||
public void GetMesh()
|
||||
public virtual void GetMesh()
|
||||
{
|
||||
|
||||
}
|
||||
|
|
|
@ -719,55 +719,6 @@ namespace OpenSim.Region.ClientStack
|
|||
this.OutPacket(attach);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sends a full ObjectUpdatePacket to a client to inform it of a new primitive
|
||||
/// or big changes to a existing primitive.
|
||||
/// </summary>
|
||||
/// <param name="regionHandle"></param>
|
||||
/// <param name="timeDilation"></param>
|
||||
/// <param name="localID"></param>
|
||||
/// <param name="primData"></param>
|
||||
/// <param name="pos"></param>
|
||||
/// <param name="rotation"></param>
|
||||
/// <param name="textureID"></param>
|
||||
public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimData primData, LLVector3 pos, LLQuaternion rotation, LLUUID textureID, uint flags)
|
||||
{
|
||||
ObjectUpdatePacket outPacket = new ObjectUpdatePacket();
|
||||
outPacket.RegionData.RegionHandle = regionHandle;
|
||||
outPacket.RegionData.TimeDilation = timeDilation;
|
||||
outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
|
||||
outPacket.ObjectData[0] = this.CreatePrimUpdateBlock(primData, textureID, flags);
|
||||
outPacket.ObjectData[0].ID = localID;
|
||||
outPacket.ObjectData[0].FullID = primData.FullID;
|
||||
byte[] pb = pos.GetBytes();
|
||||
Array.Copy(pb, 0, outPacket.ObjectData[0].ObjectData, 0, pb.Length);
|
||||
byte[] rot = rotation.GetBytes();
|
||||
Array.Copy(rot, 0, outPacket.ObjectData[0].ObjectData, 48, rot.Length);
|
||||
OutPacket(outPacket);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sends a full ObjectUpdatePacket to a client to inform it of a new primitive
|
||||
/// or big changes to a existing primitive.
|
||||
/// Uses default rotation
|
||||
/// </summary>
|
||||
/// <param name="primData"></param>
|
||||
/// <param name="pos"></param>
|
||||
public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimData primData, LLVector3 pos, LLUUID textureID, uint flags)
|
||||
{
|
||||
ObjectUpdatePacket outPacket = new ObjectUpdatePacket();
|
||||
outPacket.RegionData.RegionHandle = regionHandle;
|
||||
outPacket.RegionData.TimeDilation = timeDilation;
|
||||
outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
|
||||
outPacket.ObjectData[0] = this.CreatePrimUpdateBlock(primData, textureID, flags);
|
||||
outPacket.ObjectData[0].ID = localID;
|
||||
outPacket.ObjectData[0].FullID = primData.FullID;
|
||||
byte[] pb = pos.GetBytes();
|
||||
Array.Copy(pb, 0, outPacket.ObjectData[0].ObjectData, 0, pb.Length);
|
||||
|
||||
OutPacket(outPacket);
|
||||
}
|
||||
|
||||
|
||||
public void SendPrimitiveToClient(ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape, LLVector3 pos, LLQuaternion rotation, uint flags, LLUUID objectID, LLUUID ownerID, string text, uint parentID)
|
||||
{
|
||||
|
@ -978,22 +929,6 @@ namespace OpenSim.Region.ClientStack
|
|||
return dat;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Create the ObjectDataBlock for a ObjectUpdatePacket (for a Primitive)
|
||||
/// </summary>
|
||||
/// <param name="primData"></param>
|
||||
/// <returns></returns>
|
||||
protected ObjectUpdatePacket.ObjectDataBlock CreatePrimUpdateBlock(PrimData primData, LLUUID textureID, uint flags)
|
||||
{
|
||||
ObjectUpdatePacket.ObjectDataBlock objupdate = new ObjectUpdatePacket.ObjectDataBlock();
|
||||
this.SetDefaultPrimPacketValues(objupdate);
|
||||
objupdate.UpdateFlags = flags;
|
||||
this.SetPrimPacketShapeData(objupdate, primData, textureID);
|
||||
|
||||
return objupdate;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Create the ObjectDataBlock for a ObjectUpdatePacket (for a Primitive)
|
||||
/// </summary>
|
||||
|
@ -1009,40 +944,6 @@ namespace OpenSim.Region.ClientStack
|
|||
return objupdate;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Copy the data from a PrimData object to a ObjectUpdatePacket
|
||||
/// </summary>
|
||||
/// <param name="objectData"></param>
|
||||
/// <param name="primData"></param>
|
||||
protected void SetPrimPacketShapeData(ObjectUpdatePacket.ObjectDataBlock objectData, PrimData primData, LLUUID textureID)
|
||||
{
|
||||
LLObject.TextureEntry ntex = new LLObject.TextureEntry(textureID);
|
||||
objectData.TextureEntry = ntex.ToBytes();
|
||||
objectData.OwnerID = primData.OwnerID;
|
||||
objectData.ParentID = primData.ParentID;
|
||||
objectData.PCode = primData.PCode;
|
||||
objectData.PathBegin = primData.PathBegin;
|
||||
objectData.PathEnd = primData.PathEnd;
|
||||
objectData.PathScaleX = primData.PathScaleX;
|
||||
objectData.PathScaleY = primData.PathScaleY;
|
||||
objectData.PathShearX = primData.PathShearX;
|
||||
objectData.PathShearY = primData.PathShearY;
|
||||
objectData.PathSkew = primData.PathSkew;
|
||||
objectData.ProfileBegin = primData.ProfileBegin;
|
||||
objectData.ProfileEnd = primData.ProfileEnd;
|
||||
objectData.Scale = primData.Scale;
|
||||
objectData.PathCurve = primData.PathCurve;
|
||||
objectData.ProfileCurve = primData.ProfileCurve;
|
||||
objectData.ProfileHollow = primData.ProfileHollow;
|
||||
objectData.PathRadiusOffset = primData.PathRadiusOffset;
|
||||
objectData.PathRevolutions = primData.PathRevolutions;
|
||||
objectData.PathTaperX = primData.PathTaperX;
|
||||
objectData.PathTaperY = primData.PathTaperY;
|
||||
objectData.PathTwist = primData.PathTwist;
|
||||
objectData.PathTwistBegin = primData.PathTwistBegin;
|
||||
}
|
||||
|
||||
protected void SetPrimPacketShapeData(ObjectUpdatePacket.ObjectDataBlock objectData, PrimitiveBaseShape primData)
|
||||
{
|
||||
|
||||
|
|
|
@ -218,6 +218,7 @@ namespace OpenSim.Region.ClientStack
|
|||
if (OnAddPrim != null)
|
||||
{
|
||||
ObjectAddPacket addPacket = (ObjectAddPacket) Pack ;
|
||||
Console.WriteLine(addPacket.ToString());
|
||||
|
||||
PrimitiveBaseShape shape = new PrimitiveBaseShape();
|
||||
|
||||
|
|
|
@ -0,0 +1,299 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using Axiom.Math;
|
||||
using libsecondlife;
|
||||
using libsecondlife.Packets;
|
||||
using OpenSim.Framework.Interfaces;
|
||||
using OpenSim.Framework.Types;
|
||||
using OpenSim.Physics.Manager;
|
||||
|
||||
namespace OpenSim.Region.Environment.Scenes
|
||||
{
|
||||
// public delegate void PrimCountTaintedDelegate();
|
||||
|
||||
public class AllNewSceneObjectGroup2 : EntityBase
|
||||
{
|
||||
private Encoding enc = Encoding.ASCII;
|
||||
|
||||
protected AllNewSceneObjectPart2 m_rootPart;
|
||||
protected Dictionary<LLUUID, AllNewSceneObjectPart2> m_parts = new Dictionary<LLUUID, AllNewSceneObjectPart2>();
|
||||
|
||||
public event PrimCountTaintedDelegate OnPrimCountTainted;
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public int primCount
|
||||
{
|
||||
get
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public LLVector3 GroupCentrePoint
|
||||
{
|
||||
get
|
||||
{
|
||||
return new LLVector3(0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public AllNewSceneObjectGroup2()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public void FlagGroupForFullUpdate()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public void FlagGroupForTerseUpdate()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="objectGroup"></param>
|
||||
public void LinkToGroup(AllNewSceneObjectGroup2 objectGroup)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="primID"></param>
|
||||
/// <returns></returns>
|
||||
private AllNewSceneObjectPart2 GetChildPrim(LLUUID primID)
|
||||
{
|
||||
AllNewSceneObjectPart2 childPart = null;
|
||||
if (this.m_parts.ContainsKey(primID))
|
||||
{
|
||||
childPart = this.m_parts[primID];
|
||||
}
|
||||
return childPart;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="localID"></param>
|
||||
/// <returns></returns>
|
||||
private AllNewSceneObjectPart2 GetChildPrim(uint localID)
|
||||
{
|
||||
foreach (AllNewSceneObjectPart2 part in this.m_parts.Values)
|
||||
{
|
||||
if (part.m_localID == localID)
|
||||
{
|
||||
return part;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void TriggerTainted()
|
||||
{
|
||||
if (OnPrimCountTainted != null)
|
||||
{
|
||||
this.OnPrimCountTainted();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="offset"></param>
|
||||
/// <param name="pos"></param>
|
||||
/// <param name="remoteClient"></param>
|
||||
public void GrapMovement(LLVector3 offset, LLVector3 pos, IClientAPI remoteClient)
|
||||
{
|
||||
this.Pos = pos;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="client"></param>
|
||||
public void GetProperites(IClientAPI client)
|
||||
{
|
||||
ObjectPropertiesPacket proper = new ObjectPropertiesPacket();
|
||||
proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1];
|
||||
proper.ObjectData[0] = new ObjectPropertiesPacket.ObjectDataBlock();
|
||||
proper.ObjectData[0].ItemID = LLUUID.Zero;
|
||||
proper.ObjectData[0].CreationDate = (ulong)this.m_rootPart.CreationDate;
|
||||
proper.ObjectData[0].CreatorID = this.m_rootPart.CreatorID;
|
||||
proper.ObjectData[0].FolderID = LLUUID.Zero;
|
||||
proper.ObjectData[0].FromTaskID = LLUUID.Zero;
|
||||
proper.ObjectData[0].GroupID = LLUUID.Zero;
|
||||
proper.ObjectData[0].InventorySerial = 0;
|
||||
proper.ObjectData[0].LastOwnerID = this.m_rootPart.LastOwnerID;
|
||||
proper.ObjectData[0].ObjectID = this.m_uuid;
|
||||
proper.ObjectData[0].OwnerID = this.m_rootPart.OwnerID;
|
||||
proper.ObjectData[0].TouchName = enc.GetBytes(this.m_rootPart.TouchName + "\0");
|
||||
proper.ObjectData[0].TextureID = new byte[0];
|
||||
proper.ObjectData[0].SitName = enc.GetBytes(this.m_rootPart.SitName + "\0");
|
||||
proper.ObjectData[0].Name = enc.GetBytes(this.m_rootPart.Name + "\0");
|
||||
proper.ObjectData[0].Description = enc.GetBytes(this.m_rootPart.Description + "\0");
|
||||
proper.ObjectData[0].OwnerMask = this.m_rootPart.OwnerMask;
|
||||
proper.ObjectData[0].NextOwnerMask = this.m_rootPart.NextOwnerMask;
|
||||
proper.ObjectData[0].GroupMask = this.m_rootPart.GroupMask;
|
||||
proper.ObjectData[0].EveryoneMask = this.m_rootPart.EveryoneMask;
|
||||
proper.ObjectData[0].BaseMask = this.m_rootPart.BaseMask;
|
||||
|
||||
client.OutPacket(proper);
|
||||
}
|
||||
|
||||
#region Shape
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="shapeBlock"></param>
|
||||
public void UpdateShape(ObjectShapePacket.ObjectDataBlock shapeBlock, uint localID)
|
||||
{
|
||||
AllNewSceneObjectPart2 part = this.GetChildPrim(localID);
|
||||
if (part != null)
|
||||
{
|
||||
part.UpdateShape(shapeBlock);
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Position
|
||||
public void UpdateGroupPosition(LLVector3 pos)
|
||||
{
|
||||
this.m_pos = pos;
|
||||
}
|
||||
|
||||
public void UpdateSinglePosition(LLVector3 pos, uint localID)
|
||||
{
|
||||
AllNewSceneObjectPart2 part = this.GetChildPrim(localID);
|
||||
if (part != null)
|
||||
{
|
||||
if (part.uuid == this.m_rootPart.uuid)
|
||||
{
|
||||
this.UpdateRootPosition(pos);
|
||||
}
|
||||
else
|
||||
{
|
||||
part.UpdateOffSet(pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void UpdateRootPosition(LLVector3 pos)
|
||||
{
|
||||
LLVector3 newPos = new LLVector3(pos.X, pos.Y, pos.Z);
|
||||
LLVector3 oldPos = new LLVector3(this.Pos.X + this.m_rootPart.OffsetPosition.X, this.Pos.Y + this.m_rootPart.OffsetPosition.Y, this.Pos.Z + this.m_rootPart.OffsetPosition.Z);
|
||||
LLVector3 diff = oldPos - newPos;
|
||||
Axiom.Math.Vector3 axDiff = new Vector3(diff.X, diff.Y, diff.Z);
|
||||
Axiom.Math.Quaternion partRotation = new Quaternion(this.m_rootPart.RotationOffset.W, this.m_rootPart.RotationOffset.X, this.m_rootPart.RotationOffset.Y, this.m_rootPart.RotationOffset.Z);
|
||||
axDiff = partRotation.Inverse() * axDiff;
|
||||
diff.X = axDiff.x;
|
||||
diff.Y = axDiff.y;
|
||||
diff.Z = axDiff.z;
|
||||
|
||||
foreach (AllNewSceneObjectPart2 obPart in this.m_parts.Values)
|
||||
{
|
||||
if (obPart.uuid != this.m_rootPart.uuid)
|
||||
{
|
||||
obPart.OffsetPosition = obPart.OffsetPosition + diff;
|
||||
}
|
||||
}
|
||||
this.Pos = newPos;
|
||||
pos.X = newPos.X;
|
||||
pos.Y = newPos.Y;
|
||||
pos.Z = newPos.Z;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Roation
|
||||
public void UpdateGroupRotation(LLQuaternion rot)
|
||||
{
|
||||
this.m_rootPart.RotationOffset = new LLQuaternion(rot.X, rot.Y, rot.Z, rot.W);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="pos"></param>
|
||||
/// <param name="rot"></param>
|
||||
public void UpdateGroupMouseRotation(LLVector3 pos, LLQuaternion rot)
|
||||
{
|
||||
this.m_rootPart.RotationOffset = new LLQuaternion(rot.X, rot.Y, rot.Z, rot.W);
|
||||
this.m_pos = pos;
|
||||
}
|
||||
|
||||
public void UpdateSingleRotation(LLQuaternion rot, uint localID)
|
||||
{
|
||||
AllNewSceneObjectPart2 part = this.GetChildPrim(localID);
|
||||
if (part != null)
|
||||
{
|
||||
if (part.uuid == this.m_rootPart.uuid)
|
||||
{
|
||||
this.UpdateRootRotation(rot);
|
||||
}
|
||||
else
|
||||
{
|
||||
part.UpdateRotation(rot);
|
||||
}
|
||||
}
|
||||
}
|
||||
private void UpdateRootRotation(LLQuaternion rot)
|
||||
{
|
||||
this.m_rootPart.UpdateRotation(rot);
|
||||
Axiom.Math.Quaternion axRot = new Quaternion(rot.W, rot.X, rot.Y, rot.Z);
|
||||
Axiom.Math.Quaternion oldParentRot = new Quaternion(this.m_rootPart.RotationOffset.W, this.m_rootPart.RotationOffset.X, this.m_rootPart.RotationOffset.Y, this.m_rootPart.RotationOffset.Z);
|
||||
|
||||
foreach (AllNewSceneObjectPart2 prim in this.m_parts.Values)
|
||||
{
|
||||
if (prim.uuid != this.m_rootPart.uuid)
|
||||
{
|
||||
Vector3 axPos = new Vector3(prim.OffsetPosition.X, prim.OffsetPosition.Y, prim.OffsetPosition.Z);
|
||||
axPos = oldParentRot * axPos;
|
||||
axPos = axRot.Inverse() * axPos;
|
||||
prim.OffsetPosition = new LLVector3(axPos.x, axPos.y, axPos.z);
|
||||
Axiom.Math.Quaternion primsRot = new Quaternion(prim.RotationOffset.W, prim.RotationOffset.X, prim.RotationOffset.Y, prim.RotationOffset.Z);
|
||||
Axiom.Math.Quaternion newRot = oldParentRot * primsRot;
|
||||
newRot = axRot.Inverse() * newRot;
|
||||
prim.RotationOffset = new LLQuaternion(newRot.w, newRot.x, newRot.y, newRot.z);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="part"></param>
|
||||
private void SetPartAsRoot(AllNewSceneObjectPart2 part)
|
||||
{
|
||||
this.m_rootPart = part;
|
||||
this.m_uuid = part.uuid;
|
||||
this.m_localId = part.m_localID;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="part"></param>
|
||||
private void SetPartAsNonRoot(AllNewSceneObjectPart2 part)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,211 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System;
|
||||
using Axiom.Math;
|
||||
using libsecondlife;
|
||||
using libsecondlife.Packets;
|
||||
using OpenSim.Framework.Interfaces;
|
||||
using OpenSim.Framework.Types;
|
||||
|
||||
namespace OpenSim.Region.Environment.Scenes
|
||||
{
|
||||
|
||||
public class AllNewSceneObjectPart2
|
||||
{
|
||||
private const uint FULL_MASK_PERMISSIONS = 2147483647;
|
||||
|
||||
private ulong m_regionHandle;
|
||||
private uint m_flags = 32 + 65536 + 131072 + 256 + 4 + 8 + 2048 + 524288 + 268435456 + 128;
|
||||
//private Dictionary<LLUUID, InventoryItem> inventoryItems;
|
||||
|
||||
public string SitName = "";
|
||||
public string TouchName = "";
|
||||
public string Text = "";
|
||||
|
||||
public LLUUID CreatorID;
|
||||
public LLUUID OwnerID;
|
||||
public LLUUID LastOwnerID;
|
||||
public Int32 CreationDate;
|
||||
|
||||
public LLUUID uuid;
|
||||
public uint m_localID;
|
||||
|
||||
public uint ParentID = 0;
|
||||
|
||||
public uint OwnerMask = FULL_MASK_PERMISSIONS;
|
||||
public uint NextOwnerMask = FULL_MASK_PERMISSIONS;
|
||||
public uint GroupMask = FULL_MASK_PERMISSIONS;
|
||||
public uint EveryoneMask = FULL_MASK_PERMISSIONS;
|
||||
public uint BaseMask = FULL_MASK_PERMISSIONS;
|
||||
|
||||
protected PrimitiveBaseShape m_Shape;
|
||||
|
||||
protected AllNewSceneObjectGroup2 m_parentGroup;
|
||||
|
||||
|
||||
#region Properties
|
||||
protected string m_name;
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public virtual string Name
|
||||
{
|
||||
get { return m_name; }
|
||||
set { m_name = value; }
|
||||
}
|
||||
|
||||
protected LLVector3 m_offset;
|
||||
public LLVector3 OffsetPosition
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_offset;
|
||||
}
|
||||
set
|
||||
{
|
||||
m_offset = value;
|
||||
}
|
||||
}
|
||||
|
||||
protected LLQuaternion m_rotationOffset;
|
||||
public LLQuaternion RotationOffset
|
||||
{
|
||||
get
|
||||
{
|
||||
return m_rotationOffset;
|
||||
}
|
||||
set
|
||||
{
|
||||
m_rotationOffset = value;
|
||||
}
|
||||
}
|
||||
|
||||
private string m_description = "";
|
||||
public string Description
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.m_description;
|
||||
}
|
||||
set
|
||||
{
|
||||
this.m_description = value;
|
||||
}
|
||||
}
|
||||
|
||||
public PrimitiveBaseShape Shape
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.m_Shape;
|
||||
}
|
||||
}
|
||||
|
||||
public LLVector3 Scale
|
||||
{
|
||||
set
|
||||
{
|
||||
this.m_Shape.Scale = value;
|
||||
}
|
||||
get
|
||||
{
|
||||
return this.m_Shape.Scale;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Constructors
|
||||
public AllNewSceneObjectPart2(ulong regionHandle, AllNewSceneObjectGroup2 parent, LLUUID ownerID, uint localID, PrimitiveBaseShape shape, LLVector3 position)
|
||||
{
|
||||
this.m_regionHandle = regionHandle;
|
||||
this.m_parentGroup = parent;
|
||||
|
||||
this.CreationDate = (Int32)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
|
||||
this.OwnerID = ownerID;
|
||||
this.CreatorID = this.OwnerID;
|
||||
this.LastOwnerID = LLUUID.Zero;
|
||||
this.uuid = LLUUID.Random();
|
||||
this.m_localID = (uint)(localID);
|
||||
this.m_Shape = shape;
|
||||
|
||||
this.OffsetPosition = position;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Shape
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="shapeBlock"></param>
|
||||
public void UpdateShape(ObjectShapePacket.ObjectDataBlock shapeBlock)
|
||||
{
|
||||
this.m_Shape.PathBegin = shapeBlock.PathBegin;
|
||||
this.m_Shape.PathEnd = shapeBlock.PathEnd;
|
||||
this.m_Shape.PathScaleX = shapeBlock.PathScaleX;
|
||||
this.m_Shape.PathScaleY = shapeBlock.PathScaleY;
|
||||
this.m_Shape.PathShearX = shapeBlock.PathShearX;
|
||||
this.m_Shape.PathShearY = shapeBlock.PathShearY;
|
||||
this.m_Shape.PathSkew = shapeBlock.PathSkew;
|
||||
this.m_Shape.ProfileBegin = shapeBlock.ProfileBegin;
|
||||
this.m_Shape.ProfileEnd = shapeBlock.ProfileEnd;
|
||||
this.m_Shape.PathCurve = shapeBlock.PathCurve;
|
||||
this.m_Shape.ProfileCurve = shapeBlock.ProfileCurve;
|
||||
this.m_Shape.ProfileHollow = shapeBlock.ProfileHollow;
|
||||
this.m_Shape.PathRadiusOffset = shapeBlock.PathRadiusOffset;
|
||||
this.m_Shape.PathRevolutions = shapeBlock.PathRevolutions;
|
||||
this.m_Shape.PathTaperX = shapeBlock.PathTaperX;
|
||||
this.m_Shape.PathTaperY = shapeBlock.PathTaperY;
|
||||
this.m_Shape.PathTwist = shapeBlock.PathTwist;
|
||||
this.m_Shape.PathTwistBegin = shapeBlock.PathTwistBegin;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Texture
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="textureEntry"></param>
|
||||
public void UpdateTextureEntry(byte[] textureEntry)
|
||||
{
|
||||
this.m_Shape.TextureEntry = textureEntry;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Position
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="pos"></param>
|
||||
public void UpdateOffSet(LLVector3 pos)
|
||||
{
|
||||
LLVector3 newPos = new LLVector3(pos.X, pos.Y, pos.Z);
|
||||
this.OffsetPosition = newPos;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region rotation
|
||||
public void UpdateRotation(LLQuaternion rot)
|
||||
{
|
||||
this.RotationOffset = new LLQuaternion(rot.X, rot.Y, rot.Z, rot.W);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Resizing/Scale
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="scale"></param>
|
||||
public void Resize(LLVector3 scale)
|
||||
{
|
||||
LLVector3 offset = (scale - this.m_Shape.Scale);
|
||||
offset.X /= 2;
|
||||
offset.Y /= 2;
|
||||
offset.Z /= 2;
|
||||
|
||||
this.OffsetPosition += offset;
|
||||
this.m_Shape.Scale = scale;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue