Started to added new access functions of SOP properties.
parent
3cd1ec8752
commit
1da933041c
|
@ -3851,7 +3851,8 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
m_rootPart = part;
|
||||
if (!IsAttachment)
|
||||
part.ParentID = 0;
|
||||
part.SetProperty("LinkNum", 0);
|
||||
// part.SetProperty("LinkNum", 0);
|
||||
((SceneObjectPartBase)part).LinkNum = 0;
|
||||
|
||||
m_parts.Add(m_rootPart.UUID, m_rootPart);
|
||||
}
|
||||
|
|
|
@ -352,7 +352,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
private bool m_forceMouselook;
|
||||
|
||||
// TODO: Collision sound should have default.
|
||||
private UUID m_collisionSound;
|
||||
protected UUID m_collisionSound;
|
||||
private float m_collisionSoundVolume;
|
||||
|
||||
#endregion Fields
|
||||
|
@ -4938,273 +4938,6 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
set { m_lastUpdateTimeStamp = value; }
|
||||
}
|
||||
|
||||
//The ID the identifies which actor has caused the most recent update to the prim.
|
||||
//We use type "string" for the ID only to make it human-readable.
|
||||
/*
|
||||
private string m_lastUpdateActorID="";
|
||||
public string LastUpdateActorID
|
||||
{
|
||||
get { return m_lastUpdateActorID; }
|
||||
set { m_lastUpdateActorID = value; }
|
||||
}
|
||||
|
||||
public void UpdateTimestamp(long time)
|
||||
{
|
||||
m_lastUpdateTimeStamp = time;
|
||||
}
|
||||
|
||||
public void SetLastUpdateActorID()
|
||||
{
|
||||
if (m_parentGroup != null)
|
||||
{
|
||||
m_lastUpdateActorID = m_parentGroup.Scene.GetSyncActorID();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_log.Error("Prim " + UUID + " is not in a SceneObjectGroup yet");
|
||||
}
|
||||
}
|
||||
|
||||
private Object m_SyncInfoLock = new Object();
|
||||
public void SyncInfoUpdate(long timeStamp, string actorID)
|
||||
{
|
||||
//update timestamp and actorID atomically
|
||||
lock (m_SyncInfoLock)
|
||||
{
|
||||
UpdateTimestamp(timeStamp);
|
||||
m_lastUpdateActorID = actorID;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void SyncInfoUpdate()
|
||||
{
|
||||
//Trick: calling UpdateTimestamp here makes sure that when an object was received and de-serialized, before
|
||||
// its parts are linked together, neither TimeStamp or ActorID will be modified. This is because during de-serialization,
|
||||
// ScheduleFullUpdate() is called when m_parentGroup == null
|
||||
if (m_parentGroup != null && m_parentGroup.Scene != null && m_parentGroup.Scene.ActorSyncModule != null)
|
||||
{
|
||||
SyncInfoUpdate(DateTime.Now.Ticks, m_parentGroup.Scene.GetSyncActorID());
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
//The list of each prim's properties. This is the list of properties that matter in synchronizing prim copies on different actors.
|
||||
//This list is created based on properties included in the serialization/deserialization process (see SceneObjectSerializer()) and the
|
||||
//properties Physics Engine needs to synchronize to other actors.
|
||||
public static List<string> PropertyList = new List<string>()
|
||||
{
|
||||
//Following properties copied from SceneObjectSerializer()
|
||||
"AllowedDrop",
|
||||
"CreatorID",
|
||||
"CreatorData",
|
||||
"FolderID",
|
||||
"InventorySerial",
|
||||
"TaskInventory",
|
||||
"UUID",
|
||||
"LocalId",
|
||||
"Name",
|
||||
"Material",
|
||||
"PassTouches",
|
||||
"RegionHandle",
|
||||
"ScriptAccessPin",
|
||||
"GroupPosition",
|
||||
"OffsetPosition",
|
||||
"RotationOffset",
|
||||
"Velocity",
|
||||
"AngularVelocity",
|
||||
//"Acceleration",
|
||||
"SOP_Acceleration", //SOP and PA read/write their own local copies of acceleration, so we distinguish the copies
|
||||
"Description",
|
||||
"Color",
|
||||
"Text",
|
||||
"SitName",
|
||||
"TouchName",
|
||||
"LinkNum",
|
||||
"ClickAction",
|
||||
"Shape",
|
||||
"Scale",
|
||||
"UpdateFlag",
|
||||
"SitTargetOrientation",
|
||||
"SitTargetPosition",
|
||||
"SitTargetPositionLL",
|
||||
"SitTargetOrientationLL",
|
||||
"ParentID",
|
||||
"CreationDate",
|
||||
"Category",
|
||||
"SalePrice",
|
||||
"ObjectSaleType",
|
||||
"OwnershipCost",
|
||||
"GroupID",
|
||||
"OwnerID",
|
||||
"LastOwnerID",
|
||||
"BaseMask",
|
||||
"OwnerMask",
|
||||
"GroupMask",
|
||||
"EveryoneMask",
|
||||
"NextOwnerMask",
|
||||
"Flags",
|
||||
"CollisionSound",
|
||||
"CollisionSoundVolume",
|
||||
"MediaUrl",
|
||||
"TextureAnimation",
|
||||
"ParticleSystem",
|
||||
//Property names below copied from PhysicsActor, they are necessary in synchronization, but not covered the above properties
|
||||
//Physics properties "Velocity" is covered above
|
||||
"Position",
|
||||
"Size",
|
||||
"Force",
|
||||
"RotationalVelocity",
|
||||
"PA_Acceleration",
|
||||
"Torque",
|
||||
"Orientation",
|
||||
"IsPhysical",
|
||||
"Flying",
|
||||
"Buoyancy",
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
private Object propertyUpdateLock = new Object();
|
||||
|
||||
/*
|
||||
//!!!!!! -- TODO:
|
||||
//!!!!!! -- We should call UpdateXXX functions to update each property, cause some of such updates involves sanity checking.
|
||||
public Scene.ObjectUpdateResult UpdateAllProperties(SceneObjectPart updatedPart)
|
||||
{
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//NOTE!!!: So far this function is written with Script Engine updating local Scene cache in mind.
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
////////////////////Assumptions: ////////////////////
|
||||
//(1) prim's UUID and LocalID shall not change (UUID is the unique identifies, LocalID is used to refer to the prim by, say scripts)
|
||||
//(2) RegionHandle won't be updated -- each copy of Scene is hosted on a region with different region handle
|
||||
//(3) ParentID won't be updated -- if the rootpart of the SceneObjectGroup changed, that will be updated in SceneObjectGroup.UpdateObjectProperties
|
||||
|
||||
////////////////////Furture enhancements:////////////////////
|
||||
//For now, we only update the set of properties that are included in serialization.
|
||||
//See SceneObjectSerializer for the properties that are included in a serialized SceneObjectPart.
|
||||
//Later on, we may implement update functions that allow updating certain properties or certain buckets of properties.
|
||||
|
||||
if (updatedPart == null)
|
||||
return Scene.ObjectUpdateResult.Error;
|
||||
|
||||
if (m_lastUpdateTimeStamp > updatedPart.LastUpdateTimeStamp)
|
||||
{
|
||||
//Our timestamp is more update to date, keep our values of the properties. Do not update anything.
|
||||
return Scene.ObjectUpdateResult.Unchanged;
|
||||
}
|
||||
|
||||
if (m_lastUpdateTimeStamp == updatedPart.LastUpdateTimeStamp)
|
||||
{
|
||||
//if (m_parentGroup.Scene.GetActorID() != updatedPart.LastUpdatedByActorID)
|
||||
if (m_lastUpdateActorID != updatedPart.LastUpdateActorID)
|
||||
{
|
||||
m_log.Warn("Different actors modified SceneObjetPart " + UUID + " with the same TimeStamp, CONFLICT RESOLUTION TO BE IMPLEMENTED!!!!");
|
||||
return Scene.ObjectUpdateResult.Unchanged;
|
||||
}
|
||||
|
||||
//My own update was relayed back. Don't relay it.
|
||||
return Scene.ObjectUpdateResult.Unchanged;
|
||||
}
|
||||
|
||||
//Otherwise, our timestamp is less up to date, update the prim with the received copy
|
||||
|
||||
Scene.ObjectUpdateResult partUpdateResult = Scene.ObjectUpdateResult.Updated;
|
||||
bool collisionSoundUpdated = false;
|
||||
lock (propertyUpdateLock)
|
||||
{
|
||||
|
||||
//See SceneObjectSerializer for the properties that are included in a serialized SceneObjectPart.
|
||||
this.AllowedDrop = updatedPart.AllowedDrop;
|
||||
this.CreatorID = updatedPart.CreatorID;
|
||||
this.CreatorData = updatedPart.CreatorData;
|
||||
this.FolderID = updatedPart.FolderID;
|
||||
this.InventorySerial = updatedPart.InventorySerial;
|
||||
this.TaskInventory = updatedPart.TaskInventory;
|
||||
//Following two properties, UUID and LocalId, shall not be updated.
|
||||
//this.UUID
|
||||
//this.LocalId
|
||||
this.Name = updatedPart.Name;
|
||||
this.Material = updatedPart.Material;
|
||||
this.PassTouches = updatedPart.PassTouches;
|
||||
//RegionHandle shall not be copied, since updatedSog is sent by a different actor, which has a different local region
|
||||
//this.RegionHandle
|
||||
this.ScriptAccessPin = updatedPart.ScriptAccessPin;
|
||||
this.GroupPosition = updatedPart.GroupPosition;
|
||||
this.OffsetPosition = updatedPart.OffsetPosition;
|
||||
this.RotationOffset = updatedPart.RotationOffset;
|
||||
this.Velocity = updatedPart.Velocity;
|
||||
this.AngularVelocity = updatedPart.AngularVelocity;
|
||||
this.Acceleration = updatedPart.Acceleration;
|
||||
this.Description = updatedPart.Description;
|
||||
this.Color = updatedPart.Color;
|
||||
this.Text = updatedPart.Text;
|
||||
this.SitName = updatedPart.SitName;
|
||||
this.TouchName = updatedPart.TouchName;
|
||||
this.LinkNum = updatedPart.LinkNum;
|
||||
this.ClickAction = updatedPart.ClickAction;
|
||||
this.Shape = updatedPart.Shape;
|
||||
this.Scale = updatedPart.Scale;
|
||||
this.UpdateFlag = updatedPart.UpdateFlag;
|
||||
this.SitTargetOrientation = updatedPart.SitTargetOrientation;
|
||||
this.SitTargetPosition = updatedPart.SitTargetPosition;
|
||||
this.SitTargetPositionLL = updatedPart.SitTargetPositionLL;
|
||||
this.SitTargetOrientationLL = updatedPart.SitTargetOrientationLL;
|
||||
//ParentID should still point to the rootpart in the local sog, do not update. If the root part changed, we will update it in SceneObjectGroup.UpdateObjectProperties()
|
||||
//this.ParentID;
|
||||
this.CreationDate = updatedPart.CreationDate;
|
||||
this.Category = updatedPart.Category;
|
||||
this.SalePrice = updatedPart.SalePrice;
|
||||
this.ObjectSaleType = updatedPart.ObjectSaleType;
|
||||
this.OwnershipCost = updatedPart.OwnershipCost;
|
||||
this.GroupID = updatedPart.GroupID;
|
||||
this.OwnerID = updatedPart.OwnerID;
|
||||
this.LastOwnerID = updatedPart.LastOwnerID;
|
||||
this.BaseMask = updatedPart.BaseMask;
|
||||
this.OwnerMask = updatedPart.OwnerMask;
|
||||
this.GroupMask = updatedPart.GroupMask;
|
||||
this.EveryoneMask = updatedPart.EveryoneMask;
|
||||
this.NextOwnerMask = updatedPart.NextOwnerMask;
|
||||
this.Flags = updatedPart.Flags;
|
||||
|
||||
//We will update CollisionSound with special care so that it does not lead to ScheduleFullUpdate of this part, to make the actor think it just made an update and
|
||||
//need to propogate that update to other actors.
|
||||
//this.CollisionSound = updatedPart.CollisionSound;
|
||||
collisionSoundUpdated = UpdateCollisionSound(updatedPart.CollisionSound);
|
||||
|
||||
this.CollisionSoundVolume = updatedPart.CollisionSoundVolume;
|
||||
this.MediaUrl = updatedPart.MediaUrl;
|
||||
this.TextureAnimation = updatedPart.TextureAnimation;
|
||||
this.ParticleSystem = updatedPart.ParticleSystem;
|
||||
|
||||
//Update the timestamp and LastUpdatedByActorID first.
|
||||
this.m_lastUpdateActorID = updatedPart.LastUpdateActorID;
|
||||
this.m_lastUpdateTimeStamp = updatedPart.LastUpdateTimeStamp;
|
||||
}
|
||||
|
||||
if (collisionSoundUpdated)
|
||||
{
|
||||
m_parentGroup.Scene.EventManager.TriggerAggregateScriptEvents(this);
|
||||
}
|
||||
|
||||
//m_log.Debug("SceneObjectPart Name-" +Name+", UUID-"+UUID+" localID-" + m_localId + " updated");
|
||||
|
||||
return partUpdateResult;
|
||||
}
|
||||
* */
|
||||
|
||||
private bool UpdateCollisionSound(UUID updatedCollisionSound)
|
||||
{
|
||||
if (this.CollisionSound != updatedCollisionSound)
|
||||
{
|
||||
m_collisionSound = updatedCollisionSound;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Schedules this prim for a full update, without changing the timestamp or actorID (info on when and who modified any property).
|
||||
|
@ -5342,6 +5075,81 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
//property set functions will be called and might trigger UpdateBucketSyncInfo() if not guarded carefully.
|
||||
private bool m_syncEnabled = false;
|
||||
|
||||
//The list of each prim's properties. This is the list of properties that matter in synchronizing prim copies on different actors.
|
||||
//This list is created based on properties included in the serialization/deserialization process (see SceneObjectSerializer()) and the
|
||||
//properties Physics Engine needs to synchronize to other actors.
|
||||
public static List<string> PropertyList = new List<string>()
|
||||
{
|
||||
//Following properties copied from SceneObjectSerializer()
|
||||
"AllowedDrop",
|
||||
"CreatorID",
|
||||
"CreatorData",
|
||||
"FolderID",
|
||||
"InventorySerial",
|
||||
"TaskInventory",
|
||||
"UUID",
|
||||
"LocalId",
|
||||
"Name",
|
||||
"Material",
|
||||
"PassTouches",
|
||||
"RegionHandle",
|
||||
"ScriptAccessPin",
|
||||
"GroupPosition",
|
||||
"OffsetPosition",
|
||||
"RotationOffset",
|
||||
"Velocity",
|
||||
"AngularVelocity",
|
||||
//"Acceleration",
|
||||
"SOP_Acceleration", //SOP and PA read/write their own local copies of acceleration, so we distinguish the copies
|
||||
"Description",
|
||||
"Color",
|
||||
"Text",
|
||||
"SitName",
|
||||
"TouchName",
|
||||
"LinkNum",
|
||||
"ClickAction",
|
||||
"Shape",
|
||||
"Scale",
|
||||
"UpdateFlag",
|
||||
"SitTargetOrientation",
|
||||
"SitTargetPosition",
|
||||
"SitTargetPositionLL",
|
||||
"SitTargetOrientationLL",
|
||||
"ParentID",
|
||||
"CreationDate",
|
||||
"Category",
|
||||
"SalePrice",
|
||||
"ObjectSaleType",
|
||||
"OwnershipCost",
|
||||
"GroupID",
|
||||
"OwnerID",
|
||||
"LastOwnerID",
|
||||
"BaseMask",
|
||||
"OwnerMask",
|
||||
"GroupMask",
|
||||
"EveryoneMask",
|
||||
"NextOwnerMask",
|
||||
"Flags",
|
||||
"CollisionSound",
|
||||
"CollisionSoundVolume",
|
||||
"MediaUrl",
|
||||
"TextureAnimation",
|
||||
"ParticleSystem",
|
||||
//Property names below copied from PhysicsActor, they are necessary in synchronization, but not covered the above properties
|
||||
//Physics properties "Velocity" is covered above
|
||||
"Position",
|
||||
"Size",
|
||||
"Force",
|
||||
"RotationalVelocity",
|
||||
"PA_Acceleration",
|
||||
"Torque",
|
||||
"Orientation",
|
||||
"IsPhysical",
|
||||
"Flying",
|
||||
"Buoyancy",
|
||||
};
|
||||
|
||||
|
||||
public static void InitializePropertyBucketInfo(Dictionary<string, string> propertyBucketMap, List<string> bucketNames, string actorID)
|
||||
{
|
||||
m_primPropertyBucketMap = propertyBucketMap;
|
||||
|
@ -5524,18 +5332,34 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
}
|
||||
|
||||
public void SetProperty(string pName, object value)
|
||||
#region new property access functions
|
||||
//(only properties relevant for synchronization purpose are implemented here)
|
||||
|
||||
public bool AllowedDrop
|
||||
{
|
||||
switch (pName)
|
||||
get { return base.AllowedDrop; }
|
||||
set
|
||||
{
|
||||
case "LinkNum":
|
||||
base.LinkNum = (int)value;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
base.AllowedDrop = value;
|
||||
UpdateBucketSyncInfo("AllowedDrop");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endregion //new property access functions
|
||||
|
||||
|
||||
private bool UpdateCollisionSound(UUID updatedCollisionSound)
|
||||
{
|
||||
if (this.CollisionSound != updatedCollisionSound)
|
||||
{
|
||||
m_collisionSound = updatedCollisionSound;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//end of SYMMETRIC SYNC
|
||||
|
|
Loading…
Reference in New Issue