Eliminate race condition where many callers would check SOP.PhysicsActor != null then assume it was still not null in later code.
Another thread could come and turn off physics for a part (null PhysicsActor) at any point. Had to turn off localCopy on warp3D CoreModules section in prebuild.xml since on current nant this copies all DLLs in bin/ which can be a very large number with compiled DLLs No obvious reason for doing that copy - nothing else does it.0.7.4.1
							parent
							
								
									6e7f13a72d
								
							
						
					
					
						commit
						7468299673
					
				| 
						 | 
				
			
			@ -36,6 +36,7 @@ using OpenSim.Framework.Capabilities;
 | 
			
		|||
using OpenSim.Framework.Client;
 | 
			
		||||
using OpenSim.Region.Framework.Interfaces;
 | 
			
		||||
using OpenSim.Region.Framework.Scenes;
 | 
			
		||||
using OpenSim.Region.Physics.Manager;
 | 
			
		||||
using OpenSim.Services.Interfaces;
 | 
			
		||||
 | 
			
		||||
using GridRegion = OpenSim.Services.Interfaces.GridRegion;
 | 
			
		||||
| 
						 | 
				
			
			@ -1803,10 +1804,9 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
 | 
			
		|||
                {
 | 
			
		||||
                    if (!grp.IsDeleted)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (grp.RootPart.PhysActor != null)
 | 
			
		||||
                        {
 | 
			
		||||
                            grp.RootPart.PhysActor.CrossingFailure();
 | 
			
		||||
                        }
 | 
			
		||||
                        PhysicsActor pa = grp.RootPart.PhysActor;
 | 
			
		||||
                        if (pa != null)
 | 
			
		||||
                            pa.CrossingFailure();
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    m_log.ErrorFormat("[ENTITY TRANSFER MODULE]: Prim crossing failed for {0}", grp);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -642,10 +642,6 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
 | 
			
		||||
            #endregion Region Settings
 | 
			
		||||
 | 
			
		||||
            MainConsole.Instance.Commands.AddCommand("Estates", false, "reload estate",
 | 
			
		||||
                                          "reload estate",
 | 
			
		||||
                                          "Reload the estate data", HandleReloadEstate);
 | 
			
		||||
 | 
			
		||||
            //Bind Storage Manager functions to some land manager functions for this scene
 | 
			
		||||
            EventManager.OnLandObjectAdded +=
 | 
			
		||||
                new EventManager.LandObjectAdded(simDataService.StoreLandObject);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -306,7 +306,8 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            if (rot != null)
 | 
			
		||||
                sceneObject.UpdateGroupRotationR((Quaternion)rot);
 | 
			
		||||
 | 
			
		||||
            if (sceneObject.RootPart.PhysActor != null && sceneObject.RootPart.PhysActor.IsPhysical && vel != Vector3.Zero)
 | 
			
		||||
            PhysicsActor pa = sceneObject.RootPart.PhysActor;
 | 
			
		||||
            if (pa != null && pa.IsPhysical && vel != Vector3.Zero)
 | 
			
		||||
            {
 | 
			
		||||
                sceneObject.RootPart.ApplyImpulse((vel * sceneObject.GetMass()), false);
 | 
			
		||||
                sceneObject.Velocity = vel;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -523,16 +523,21 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            {
 | 
			
		||||
                m_isSelected = value;
 | 
			
		||||
                // Tell physics engine that group is selected
 | 
			
		||||
                if (m_rootPart.PhysActor != null)
 | 
			
		||||
 | 
			
		||||
                PhysicsActor pa = m_rootPart.PhysActor;
 | 
			
		||||
                if (pa != null)
 | 
			
		||||
                {
 | 
			
		||||
                    m_rootPart.PhysActor.Selected = value;
 | 
			
		||||
                    pa.Selected = value;
 | 
			
		||||
 | 
			
		||||
                    // Pass it on to the children.
 | 
			
		||||
                    SceneObjectPart[] parts = m_parts.GetArray();
 | 
			
		||||
                    for (int i = 0; i < parts.Length; i++)
 | 
			
		||||
                    {
 | 
			
		||||
                        SceneObjectPart child = parts[i];
 | 
			
		||||
                        if (child.PhysActor != null)
 | 
			
		||||
                            child.PhysActor.Selected = value;
 | 
			
		||||
 | 
			
		||||
                        PhysicsActor childPa = child.PhysActor;
 | 
			
		||||
                        if (childPa != null)
 | 
			
		||||
                            childPa.Selected = value;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -1478,7 +1483,8 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                }
 | 
			
		||||
 | 
			
		||||
                // Need to duplicate the physics actor as well
 | 
			
		||||
                if (part.PhysActor != null && userExposed)
 | 
			
		||||
                PhysicsActor originalPartPa = part.PhysActor;
 | 
			
		||||
                if (originalPartPa != null && userExposed)
 | 
			
		||||
                {
 | 
			
		||||
                    PrimitiveBaseShape pbs = newPart.Shape;
 | 
			
		||||
    
 | 
			
		||||
| 
						 | 
				
			
			@ -1489,10 +1495,10 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                            newPart.AbsolutePosition,
 | 
			
		||||
                            newPart.Scale,
 | 
			
		||||
                            newPart.RotationOffset,
 | 
			
		||||
                            part.PhysActor.IsPhysical,
 | 
			
		||||
                            originalPartPa.IsPhysical,
 | 
			
		||||
                            newPart.LocalId);
 | 
			
		||||
    
 | 
			
		||||
                    newPart.DoPhysicsPropertyUpdate(part.PhysActor.IsPhysical, true);
 | 
			
		||||
                    newPart.DoPhysicsPropertyUpdate(originalPartPa.IsPhysical, true);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
| 
						 | 
				
			
			@ -1564,45 +1570,53 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                if (RootPart.PhysActor != null)
 | 
			
		||||
                PhysicsActor pa = RootPart.PhysActor;
 | 
			
		||||
 | 
			
		||||
                if (pa != null)
 | 
			
		||||
                {
 | 
			
		||||
                    RootPart.PhysActor.AddForce(impulse, true);
 | 
			
		||||
                    m_scene.PhysicsScene.AddPhysicsActorTaint(RootPart.PhysActor);
 | 
			
		||||
                    pa.AddForce(impulse, true);
 | 
			
		||||
                    m_scene.PhysicsScene.AddPhysicsActorTaint(pa);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void applyAngularImpulse(Vector3 impulse)
 | 
			
		||||
        {
 | 
			
		||||
            if (RootPart.PhysActor != null)
 | 
			
		||||
            PhysicsActor pa = RootPart.PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null)
 | 
			
		||||
            {
 | 
			
		||||
                if (!IsAttachment)
 | 
			
		||||
                {
 | 
			
		||||
                    RootPart.PhysActor.AddAngularForce(impulse, true);
 | 
			
		||||
                    m_scene.PhysicsScene.AddPhysicsActorTaint(RootPart.PhysActor);
 | 
			
		||||
                    pa.AddAngularForce(impulse, true);
 | 
			
		||||
                    m_scene.PhysicsScene.AddPhysicsActorTaint(pa);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void setAngularImpulse(Vector3 impulse)
 | 
			
		||||
        {
 | 
			
		||||
            if (RootPart.PhysActor != null)
 | 
			
		||||
            PhysicsActor pa = RootPart.PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null)
 | 
			
		||||
            {
 | 
			
		||||
                if (!IsAttachment)
 | 
			
		||||
                {
 | 
			
		||||
                    RootPart.PhysActor.Torque = impulse;
 | 
			
		||||
                    m_scene.PhysicsScene.AddPhysicsActorTaint(RootPart.PhysActor);
 | 
			
		||||
                    pa.Torque = impulse;
 | 
			
		||||
                    m_scene.PhysicsScene.AddPhysicsActorTaint(pa);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Vector3 GetTorque()
 | 
			
		||||
        {
 | 
			
		||||
            if (RootPart.PhysActor != null)
 | 
			
		||||
            PhysicsActor pa = RootPart.PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null)
 | 
			
		||||
            {
 | 
			
		||||
                if (!IsAttachment)
 | 
			
		||||
                {
 | 
			
		||||
                    Vector3 torque = RootPart.PhysActor.Torque;
 | 
			
		||||
                    Vector3 torque = pa.Torque;
 | 
			
		||||
                    return torque;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -1622,19 +1636,23 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                if (RootPart.PhysActor != null)
 | 
			
		||||
                PhysicsActor pa = RootPart.PhysActor;
 | 
			
		||||
 | 
			
		||||
                if (pa != null)
 | 
			
		||||
                {
 | 
			
		||||
                    RootPart.PhysActor.PIDTarget = target;
 | 
			
		||||
                    RootPart.PhysActor.PIDTau = tau;
 | 
			
		||||
                    RootPart.PhysActor.PIDActive = true;
 | 
			
		||||
                    pa.PIDTarget = target;
 | 
			
		||||
                    pa.PIDTau = tau;
 | 
			
		||||
                    pa.PIDActive = true;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void stopMoveToTarget()
 | 
			
		||||
        {
 | 
			
		||||
            if (RootPart.PhysActor != null)
 | 
			
		||||
                RootPart.PhysActor.PIDActive = false;
 | 
			
		||||
            PhysicsActor pa = RootPart.PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null)
 | 
			
		||||
                pa.PIDActive = false;
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        /// <summary>
 | 
			
		||||
| 
						 | 
				
			
			@ -1645,18 +1663,20 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
        /// <param name="tau">Number of seconds over which to reach target</param>
 | 
			
		||||
        public void SetHoverHeight(float height, PIDHoverType hoverType, float tau)
 | 
			
		||||
        {
 | 
			
		||||
            if (RootPart.PhysActor != null)
 | 
			
		||||
            PhysicsActor pa = RootPart.PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null)
 | 
			
		||||
            {
 | 
			
		||||
                if (height != 0f)
 | 
			
		||||
                {
 | 
			
		||||
                    RootPart.PhysActor.PIDHoverHeight = height;
 | 
			
		||||
                    RootPart.PhysActor.PIDHoverType = hoverType;
 | 
			
		||||
                    RootPart.PhysActor.PIDTau = tau;
 | 
			
		||||
                    RootPart.PhysActor.PIDHoverActive = true;
 | 
			
		||||
                    pa.PIDHoverHeight = height;
 | 
			
		||||
                    pa.PIDHoverType = hoverType;
 | 
			
		||||
                    pa.PIDTau = tau;
 | 
			
		||||
                    pa.PIDHoverActive = true;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    RootPart.PhysActor.PIDHoverActive = false;
 | 
			
		||||
                    pa.PIDHoverActive = false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -2094,10 +2114,10 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            linkPart.ParentID = 0;
 | 
			
		||||
            linkPart.LinkNum = 0;
 | 
			
		||||
 | 
			
		||||
            if (linkPart.PhysActor != null)
 | 
			
		||||
            {
 | 
			
		||||
                m_scene.PhysicsScene.RemovePrim(linkPart.PhysActor);
 | 
			
		||||
            }
 | 
			
		||||
            PhysicsActor linkPartPa = linkPart.PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (linkPartPa != null)
 | 
			
		||||
                m_scene.PhysicsScene.RemovePrim(linkPartPa);
 | 
			
		||||
 | 
			
		||||
            // We need to reset the child part's position
 | 
			
		||||
            // ready for life as a separate object after being a part of another object
 | 
			
		||||
| 
						 | 
				
			
			@ -2188,17 +2208,19 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
        {
 | 
			
		||||
            if (m_scene.EventManager.TriggerGroupMove(UUID, pos))
 | 
			
		||||
            {
 | 
			
		||||
                if (m_rootPart.PhysActor != null)
 | 
			
		||||
                PhysicsActor pa = m_rootPart.PhysActor;
 | 
			
		||||
 | 
			
		||||
                if (pa != null)
 | 
			
		||||
                {
 | 
			
		||||
                    if (m_rootPart.PhysActor.IsPhysical)
 | 
			
		||||
                    if (pa.IsPhysical)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (!m_rootPart.BlockGrab)
 | 
			
		||||
                        {
 | 
			
		||||
                            Vector3 llmoveforce = pos - AbsolutePosition;
 | 
			
		||||
                            Vector3 grabforce = llmoveforce;
 | 
			
		||||
                            grabforce = (grabforce / 10) * m_rootPart.PhysActor.Mass;
 | 
			
		||||
                            m_rootPart.PhysActor.AddForce(grabforce, true);
 | 
			
		||||
                            m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor);
 | 
			
		||||
                            grabforce = (grabforce / 10) * pa.Mass;
 | 
			
		||||
                            pa.AddForce(grabforce, true);
 | 
			
		||||
                            m_scene.PhysicsScene.AddPhysicsActorTaint(pa);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
| 
						 | 
				
			
			@ -2228,9 +2250,11 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
        {
 | 
			
		||||
            if (m_scene.EventManager.TriggerGroupSpinStart(UUID))
 | 
			
		||||
            {
 | 
			
		||||
                if (m_rootPart.PhysActor != null)
 | 
			
		||||
                PhysicsActor pa = m_rootPart.PhysActor;
 | 
			
		||||
 | 
			
		||||
                if (pa != null)
 | 
			
		||||
                {
 | 
			
		||||
                    if (m_rootPart.PhysActor.IsPhysical)
 | 
			
		||||
                    if (pa.IsPhysical)
 | 
			
		||||
                    {
 | 
			
		||||
                        m_rootPart.IsWaitingForFirstSpinUpdatePacket = true;
 | 
			
		||||
                    }
 | 
			
		||||
| 
						 | 
				
			
			@ -2271,12 +2295,13 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            // but it will result in over-shoot or under-shoot of the target orientation.
 | 
			
		||||
            // For the end user, this means that ctrl+shift+drag can be used for relative,
 | 
			
		||||
            // but not absolute, adjustments of orientation for physical prims.
 | 
			
		||||
          
 | 
			
		||||
            if (m_scene.EventManager.TriggerGroupSpin(UUID, newOrientation))
 | 
			
		||||
            {
 | 
			
		||||
                if (m_rootPart.PhysActor != null)
 | 
			
		||||
                PhysicsActor pa = m_rootPart.PhysActor;
 | 
			
		||||
 | 
			
		||||
                if (pa != null)
 | 
			
		||||
                {
 | 
			
		||||
                    if (m_rootPart.PhysActor.IsPhysical)
 | 
			
		||||
                    if (pa.IsPhysical)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (m_rootPart.IsWaitingForFirstSpinUpdatePacket)
 | 
			
		||||
                        {
 | 
			
		||||
| 
						 | 
				
			
			@ -2302,9 +2327,9 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
 | 
			
		||||
                          //m_log.Error("SCENE OBJECT GROUP]: rotation axis is " + rotationAxis);
 | 
			
		||||
                          Vector3 spinforce = new Vector3(rotationAxis.X, rotationAxis.Y, rotationAxis.Z);
 | 
			
		||||
                          spinforce = (spinforce/8) * m_rootPart.PhysActor.Mass; // 8 is an arbitrary torque scaling factor
 | 
			
		||||
                          m_rootPart.PhysActor.AddAngularForce(spinforce,true);
 | 
			
		||||
                          m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor);
 | 
			
		||||
                          spinforce = (spinforce/8) * pa.Mass; // 8 is an arbitrary torque scaling factor
 | 
			
		||||
                          pa.AddAngularForce(spinforce,true);
 | 
			
		||||
                          m_scene.PhysicsScene.AddPhysicsActorTaint(pa);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
| 
						 | 
				
			
			@ -2478,8 +2503,10 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            {
 | 
			
		||||
                part.UpdateShape(shapeBlock);
 | 
			
		||||
 | 
			
		||||
                if (part.PhysActor != null)
 | 
			
		||||
                    m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor);
 | 
			
		||||
                PhysicsActor pa = m_rootPart.PhysActor;
 | 
			
		||||
 | 
			
		||||
                if (pa != null)
 | 
			
		||||
                    m_scene.PhysicsScene.AddPhysicsActorTaint(pa);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2502,7 +2529,9 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            scale.Y = Math.Min(scale.Y, Scene.m_maxNonphys);
 | 
			
		||||
            scale.Z = Math.Min(scale.Z, Scene.m_maxNonphys);
 | 
			
		||||
 | 
			
		||||
            if (RootPart.PhysActor != null && RootPart.PhysActor.IsPhysical)
 | 
			
		||||
            PhysicsActor pa = m_rootPart.PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null && pa.IsPhysical)
 | 
			
		||||
            {
 | 
			
		||||
                scale.X = Math.Min(scale.X, Scene.m_maxPhys);
 | 
			
		||||
                scale.Y = Math.Min(scale.Y, Scene.m_maxPhys);
 | 
			
		||||
| 
						 | 
				
			
			@ -2528,7 +2557,7 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                        float f = 1.0f;
 | 
			
		||||
                        float a = 1.0f;
 | 
			
		||||
 | 
			
		||||
                        if (RootPart.PhysActor != null && RootPart.PhysActor.IsPhysical)
 | 
			
		||||
                        if (pa != null && pa.IsPhysical)
 | 
			
		||||
                        {
 | 
			
		||||
                            if (oldSize.X * x > m_scene.m_maxPhys)
 | 
			
		||||
                            {
 | 
			
		||||
| 
						 | 
				
			
			@ -2893,10 +2922,13 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
 | 
			
		||||
            m_rootPart.StoreUndoState();
 | 
			
		||||
            m_rootPart.UpdateRotation(rot);
 | 
			
		||||
            if (m_rootPart.PhysActor != null)
 | 
			
		||||
 | 
			
		||||
            PhysicsActor pa = m_rootPart.PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null)
 | 
			
		||||
            {
 | 
			
		||||
                m_rootPart.PhysActor.Orientation = m_rootPart.RotationOffset;
 | 
			
		||||
                m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor);
 | 
			
		||||
                pa.Orientation = m_rootPart.RotationOffset;
 | 
			
		||||
                m_scene.PhysicsScene.AddPhysicsActorTaint(pa);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            SceneObjectPart[] parts = m_parts.GetArray();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -151,6 +151,14 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
        public int[] PayPrice = {-2,-2,-2,-2,-2};
 | 
			
		||||
 | 
			
		||||
        [XmlIgnore]
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// The representation of this part in the physics scene.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <remarks>
 | 
			
		||||
        /// If you use this property more than once in a section of code then you must take a reference and use that.
 | 
			
		||||
        /// If another thread is simultaneously turning physics off on this part then this refernece could become
 | 
			
		||||
        /// null at any time.
 | 
			
		||||
        /// </remarks>
 | 
			
		||||
        public PhysicsActor PhysActor
 | 
			
		||||
        {
 | 
			
		||||
            get { return m_physActor; }
 | 
			
		||||
| 
						 | 
				
			
			@ -522,10 +530,11 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            set 
 | 
			
		||||
            { 
 | 
			
		||||
                m_name = value;
 | 
			
		||||
                if (PhysActor != null)
 | 
			
		||||
                {
 | 
			
		||||
                    PhysActor.SOPName = value;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
                if (pa != null)
 | 
			
		||||
                    pa.SOPName = value;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -535,10 +544,11 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            set
 | 
			
		||||
            {
 | 
			
		||||
                m_material = (Material)value;
 | 
			
		||||
                if (PhysActor != null)
 | 
			
		||||
                {
 | 
			
		||||
                    PhysActor.SetMaterial((int)value);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
                if (pa != null)
 | 
			
		||||
                    pa.SetMaterial((int)value);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -669,9 +679,7 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                // If this is a linkset, we don't want the physics engine mucking up our group position here.
 | 
			
		||||
                PhysicsActor actor = PhysActor;
 | 
			
		||||
                if (actor != null && ParentID == 0)
 | 
			
		||||
                {
 | 
			
		||||
                    m_groupPosition = actor.Position;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (ParentGroup.IsAttachment)
 | 
			
		||||
                {
 | 
			
		||||
| 
						 | 
				
			
			@ -979,7 +987,7 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                                if (Shape.SculptEntry)
 | 
			
		||||
                                    CheckSculptAndLoad();
 | 
			
		||||
                                else
 | 
			
		||||
                                    ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
 | 
			
		||||
                                    ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(actor);
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
| 
						 | 
				
			
			@ -1505,12 +1513,14 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                    }
 | 
			
		||||
 | 
			
		||||
                    // Basic Physics can also return null as well as an exception catch.
 | 
			
		||||
                    if (PhysActor != null)
 | 
			
		||||
                    PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
                    if (pa != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        PhysActor.SOPName = this.Name; // save object into the PhysActor so ODE internals know the joint/body info
 | 
			
		||||
                        PhysActor.SetMaterial(Material);
 | 
			
		||||
                        pa.SOPName = this.Name; // save object into the PhysActor so ODE internals know the joint/body info
 | 
			
		||||
                        pa.SetMaterial(Material);
 | 
			
		||||
                        DoPhysicsPropertyUpdate(RigidBody, true);
 | 
			
		||||
                        PhysActor.SetVolumeDetect(VolumeDetectActive ? 1 : 0);
 | 
			
		||||
                        pa.SetVolumeDetect(VolumeDetectActive ? 1 : 0);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -1731,23 +1741,25 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                if (PhysActor != null)
 | 
			
		||||
                PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
                if (pa != null)
 | 
			
		||||
                {
 | 
			
		||||
                    if (UsePhysics != PhysActor.IsPhysical || isNew)
 | 
			
		||||
                    if (UsePhysics != pa.IsPhysical || isNew)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (PhysActor.IsPhysical) // implies UsePhysics==false for this block
 | 
			
		||||
                        if (pa.IsPhysical) // implies UsePhysics==false for this block
 | 
			
		||||
                        {
 | 
			
		||||
                            if (!isNew)
 | 
			
		||||
                                ParentGroup.Scene.RemovePhysicalPrim(1);
 | 
			
		||||
 | 
			
		||||
                            PhysActor.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate;
 | 
			
		||||
                            PhysActor.OnOutOfBounds -= PhysicsOutOfBounds;
 | 
			
		||||
                            PhysActor.delink();
 | 
			
		||||
                            pa.OnRequestTerseUpdate -= PhysicsRequestingTerseUpdate;
 | 
			
		||||
                            pa.OnOutOfBounds -= PhysicsOutOfBounds;
 | 
			
		||||
                            pa.delink();
 | 
			
		||||
 | 
			
		||||
                            if (ParentGroup.Scene.PhysicsScene.SupportsNINJAJoints && (!isNew))
 | 
			
		||||
                            {
 | 
			
		||||
                                // destroy all joints connected to this now deactivated body
 | 
			
		||||
                                ParentGroup.Scene.PhysicsScene.RemoveAllJointsConnectedToActorThreadLocked(PhysActor);
 | 
			
		||||
                                ParentGroup.Scene.PhysicsScene.RemoveAllJointsConnectedToActorThreadLocked(pa);
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
                            // stop client-side interpolation of all joint proxy objects that have just been deleted
 | 
			
		||||
| 
						 | 
				
			
			@ -1766,7 +1778,7 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                            //RotationalVelocity = new Vector3(0, 0, 0);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        PhysActor.IsPhysical = UsePhysics;
 | 
			
		||||
                        pa.IsPhysical = UsePhysics;
 | 
			
		||||
 | 
			
		||||
                        // If we're not what we're supposed to be in the physics scene, recreate ourselves.
 | 
			
		||||
                        //m_parentGroup.Scene.PhysicsScene.RemovePrim(PhysActor);
 | 
			
		||||
| 
						 | 
				
			
			@ -1779,13 +1791,15 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                            {
 | 
			
		||||
                                ParentGroup.Scene.AddPhysicalPrim(1);
 | 
			
		||||
 | 
			
		||||
                                PhysActor.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate;
 | 
			
		||||
                                PhysActor.OnOutOfBounds += PhysicsOutOfBounds;
 | 
			
		||||
                                pa.OnRequestTerseUpdate += PhysicsRequestingTerseUpdate;
 | 
			
		||||
                                pa.OnOutOfBounds += PhysicsOutOfBounds;
 | 
			
		||||
                                if (ParentID != 0 && ParentID != LocalId)
 | 
			
		||||
                                {
 | 
			
		||||
                                    if (ParentGroup.RootPart.PhysActor != null)
 | 
			
		||||
                                    PhysicsActor parentPa = ParentGroup.RootPart.PhysActor;
 | 
			
		||||
 | 
			
		||||
                                    if (parentPa != null)
 | 
			
		||||
                                    {
 | 
			
		||||
                                        PhysActor.link(ParentGroup.RootPart.PhysActor);
 | 
			
		||||
                                        pa.link(parentPa);
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
| 
						 | 
				
			
			@ -1797,7 +1811,7 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                    if (Shape.SculptEntry)
 | 
			
		||||
                        CheckSculptAndLoad();
 | 
			
		||||
                    else
 | 
			
		||||
                        ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
 | 
			
		||||
                        ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -1908,24 +1922,30 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
 | 
			
		||||
        public Vector3 GetGeometricCenter()
 | 
			
		||||
        {
 | 
			
		||||
            if (PhysActor != null)
 | 
			
		||||
                return new Vector3(PhysActor.CenterOfMass.X, PhysActor.CenterOfMass.Y, PhysActor.CenterOfMass.Z);
 | 
			
		||||
            PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null)
 | 
			
		||||
                return new Vector3(pa.CenterOfMass.X, pa.CenterOfMass.Y, pa.CenterOfMass.Z);
 | 
			
		||||
            else
 | 
			
		||||
                return new Vector3(0, 0, 0);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public float GetMass()
 | 
			
		||||
        {
 | 
			
		||||
            if (PhysActor != null)
 | 
			
		||||
                return PhysActor.Mass;
 | 
			
		||||
            PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null)
 | 
			
		||||
                return pa.Mass;
 | 
			
		||||
            else
 | 
			
		||||
                return 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public Vector3 GetForce()
 | 
			
		||||
        {
 | 
			
		||||
            if (PhysActor != null)
 | 
			
		||||
                return PhysActor.Force;
 | 
			
		||||
            PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null)
 | 
			
		||||
                return pa.Force;
 | 
			
		||||
            else
 | 
			
		||||
                return Vector3.Zero;
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			@ -2556,9 +2576,11 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
 | 
			
		||||
        public void PhysicsRequestingTerseUpdate()
 | 
			
		||||
        {
 | 
			
		||||
            if (PhysActor != null)
 | 
			
		||||
            PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null)
 | 
			
		||||
            {
 | 
			
		||||
                Vector3 newpos = new Vector3(PhysActor.Position.GetBytes(), 0);
 | 
			
		||||
                Vector3 newpos = new Vector3(pa.Position.GetBytes(), 0);
 | 
			
		||||
                
 | 
			
		||||
                if (ParentGroup.Scene.TestBorderCross(newpos, Cardinals.N)
 | 
			
		||||
                    | ParentGroup.Scene.TestBorderCross(newpos, Cardinals.S)
 | 
			
		||||
| 
						 | 
				
			
			@ -2570,6 +2592,7 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                }
 | 
			
		||||
                //ParentGroup.RootPart.m_groupPosition = newpos;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ScheduleTerseUpdate();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2660,7 +2683,9 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            scale.Y = Math.Min(scale.Y, ParentGroup.Scene.m_maxNonphys);
 | 
			
		||||
            scale.Z = Math.Min(scale.Z, ParentGroup.Scene.m_maxNonphys);
 | 
			
		||||
 | 
			
		||||
            if (PhysActor != null && PhysActor.IsPhysical)
 | 
			
		||||
            PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null && pa.IsPhysical)
 | 
			
		||||
            {
 | 
			
		||||
                scale.X = Math.Min(scale.X, ParentGroup.Scene.m_maxPhys);
 | 
			
		||||
                scale.Y = Math.Min(scale.Y, ParentGroup.Scene.m_maxPhys);
 | 
			
		||||
| 
						 | 
				
			
			@ -2809,12 +2834,14 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                        m_shape.SculptData = texture.Data;
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    if (PhysActor != null)
 | 
			
		||||
                    PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
                    if (pa != null)
 | 
			
		||||
                    {
 | 
			
		||||
                        // Update the physics actor with the new loaded sculpt data and set the taint signal.
 | 
			
		||||
                        PhysActor.Shape = m_shape;
 | 
			
		||||
                        pa.Shape = m_shape;
 | 
			
		||||
 | 
			
		||||
                        ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
 | 
			
		||||
                        ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -3072,10 +3099,10 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
 | 
			
		||||
        public void SetBuoyancy(float fvalue)
 | 
			
		||||
        {
 | 
			
		||||
            if (PhysActor != null)
 | 
			
		||||
            {
 | 
			
		||||
                PhysActor.Buoyancy = fvalue;
 | 
			
		||||
            }
 | 
			
		||||
            PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null)
 | 
			
		||||
                pa.Buoyancy = fvalue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void SetDieAtEdge(bool p)
 | 
			
		||||
| 
						 | 
				
			
			@ -3088,57 +3115,50 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
 | 
			
		||||
        public void SetFloatOnWater(int floatYN)
 | 
			
		||||
        {
 | 
			
		||||
            if (PhysActor != null)
 | 
			
		||||
            {
 | 
			
		||||
                if (floatYN == 1)
 | 
			
		||||
                {
 | 
			
		||||
                    PhysActor.FloatOnWater = true;
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    PhysActor.FloatOnWater = false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null)
 | 
			
		||||
                pa.FloatOnWater = floatYN == 1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void SetForce(Vector3 force)
 | 
			
		||||
        {
 | 
			
		||||
            if (PhysActor != null)
 | 
			
		||||
            {
 | 
			
		||||
                PhysActor.Force = force;
 | 
			
		||||
            }
 | 
			
		||||
            PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null)
 | 
			
		||||
                pa.Force = force;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void SetVehicleType(int type)
 | 
			
		||||
        {
 | 
			
		||||
            if (PhysActor != null)
 | 
			
		||||
            {
 | 
			
		||||
                PhysActor.VehicleType = type;
 | 
			
		||||
            }
 | 
			
		||||
            PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null)
 | 
			
		||||
                pa.VehicleType = type;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void SetVehicleFloatParam(int param, float value)
 | 
			
		||||
        {
 | 
			
		||||
            if (PhysActor != null)
 | 
			
		||||
            {
 | 
			
		||||
                PhysActor.VehicleFloatParam(param, value);
 | 
			
		||||
            }
 | 
			
		||||
            PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null)
 | 
			
		||||
                pa.VehicleFloatParam(param, value);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void SetVehicleVectorParam(int param, Vector3 value)
 | 
			
		||||
        {
 | 
			
		||||
            if (PhysActor != null)
 | 
			
		||||
            {
 | 
			
		||||
                PhysActor.VehicleVectorParam(param, value);
 | 
			
		||||
            }
 | 
			
		||||
            PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null)
 | 
			
		||||
                pa.VehicleVectorParam(param, value);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public void SetVehicleRotationParam(int param, Quaternion rotation)
 | 
			
		||||
        {
 | 
			
		||||
            if (PhysActor != null)
 | 
			
		||||
            {
 | 
			
		||||
                PhysActor.VehicleRotationParam(param, rotation);
 | 
			
		||||
            }
 | 
			
		||||
            PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null)
 | 
			
		||||
                pa.VehicleRotationParam(param, rotation);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
| 
						 | 
				
			
			@ -4226,6 +4246,8 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            if ((UsePhysics == wasUsingPhysics) && (wasTemporary == SetTemporary) && (wasPhantom == SetPhantom) && (SetVD == wasVD))
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
            // Special cases for VD. VD can only be called from a script 
 | 
			
		||||
            // and can't be combined with changes to other states. So we can rely
 | 
			
		||||
            // that...
 | 
			
		||||
| 
						 | 
				
			
			@ -4241,8 +4263,9 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                {
 | 
			
		||||
                    SetVD = false;               // Switch it of for the course of this routine
 | 
			
		||||
                    VolumeDetectActive = false; // and also permanently
 | 
			
		||||
                    if (PhysActor != null)
 | 
			
		||||
                        PhysActor.SetVolumeDetect(0);   // Let physics know about it too
 | 
			
		||||
 | 
			
		||||
                    if (pa != null)
 | 
			
		||||
                        pa.SetVolumeDetect(0);   // Let physics know about it too
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
| 
						 | 
				
			
			@ -4357,9 +4380,9 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                // Defensive programming calls for a check here.
 | 
			
		||||
                // Better would be throwing an exception that could be catched by a unit test as the internal 
 | 
			
		||||
                // logic should make sure, this Physactor is always here.
 | 
			
		||||
                if (this.PhysActor != null)
 | 
			
		||||
                if (pa != null)
 | 
			
		||||
                {
 | 
			
		||||
                    PhysActor.SetVolumeDetect(1);
 | 
			
		||||
                    pa.SetVolumeDetect(1);
 | 
			
		||||
                    AddFlag(PrimFlags.Phantom); // We set this flag also if VD is active
 | 
			
		||||
                    this.VolumeDetectActive = true;
 | 
			
		||||
                }
 | 
			
		||||
| 
						 | 
				
			
			@ -4368,11 +4391,8 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            {
 | 
			
		||||
                // Remove VolumeDetect in any case. Note, it's safe to call SetVolumeDetect as often as you like
 | 
			
		||||
                // (mumbles, well, at least if you have infinte CPU powers :-))
 | 
			
		||||
                PhysicsActor pa = this.PhysActor;
 | 
			
		||||
                if (pa != null)
 | 
			
		||||
                {
 | 
			
		||||
                    PhysActor.SetVolumeDetect(0);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                this.VolumeDetectActive = false;
 | 
			
		||||
            }
 | 
			
		||||
| 
						 | 
				
			
			@ -4385,6 +4405,7 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            {
 | 
			
		||||
                RemFlag(PrimFlags.TemporaryOnRez);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            //            m_log.Debug("Update:  PHY:" + UsePhysics.ToString() + ", T:" + IsTemporary.ToString() + ", PHA:" + IsPhantom.ToString() + " S:" + CastsShadows.ToString());
 | 
			
		||||
 | 
			
		||||
            if (ParentGroup != null)
 | 
			
		||||
| 
						 | 
				
			
			@ -4453,10 +4474,12 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
            m_shape.PathTwist = shapeBlock.PathTwist;
 | 
			
		||||
            m_shape.PathTwistBegin = shapeBlock.PathTwistBegin;
 | 
			
		||||
 | 
			
		||||
            if (PhysActor != null)
 | 
			
		||||
            PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (pa != null)
 | 
			
		||||
            {
 | 
			
		||||
                PhysActor.Shape = m_shape;
 | 
			
		||||
                ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor);
 | 
			
		||||
                pa.Shape = m_shape;
 | 
			
		||||
                ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(pa);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // This is what makes vehicle trailers work
 | 
			
		||||
| 
						 | 
				
			
			@ -4598,6 +4621,8 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                objectflagupdate |= (uint) PrimFlags.AllowInventoryDrop;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            PhysicsActor pa = PhysActor;
 | 
			
		||||
 | 
			
		||||
            if (
 | 
			
		||||
                ((AggregateScriptEvents & scriptEvents.collision) != 0) ||
 | 
			
		||||
                ((AggregateScriptEvents & scriptEvents.collision_end) != 0) ||
 | 
			
		||||
| 
						 | 
				
			
			@ -4609,18 +4634,18 @@ namespace OpenSim.Region.Framework.Scenes
 | 
			
		|||
                )
 | 
			
		||||
            {
 | 
			
		||||
                // subscribe to physics updates.
 | 
			
		||||
                if (PhysActor != null)
 | 
			
		||||
                if (pa != null)
 | 
			
		||||
                {
 | 
			
		||||
                    PhysActor.OnCollisionUpdate += PhysicsCollision;
 | 
			
		||||
                    PhysActor.SubscribeEvents(1000);
 | 
			
		||||
                    pa.OnCollisionUpdate += PhysicsCollision;
 | 
			
		||||
                    pa.SubscribeEvents(1000);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                if (PhysActor != null)
 | 
			
		||||
                if (pa != null)
 | 
			
		||||
                {
 | 
			
		||||
                    PhysActor.UnSubscribeEvents();
 | 
			
		||||
                    PhysActor.OnCollisionUpdate -= PhysicsCollision;
 | 
			
		||||
                    pa.UnSubscribeEvents();
 | 
			
		||||
                    pa.OnCollisionUpdate -= PhysicsCollision;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1455,7 +1455,7 @@
 | 
			
		|||
      <Reference name="OpenMetaverse.StructuredData" path="../../../bin/"/>
 | 
			
		||||
      <Reference name="OpenMetaverse" path="../../../bin/"/>
 | 
			
		||||
      <Reference name="CSJ2K" path="../../../bin/"/>
 | 
			
		||||
      <Reference name="Warp3D" path="../../../bin/" localCopy="true"/>
 | 
			
		||||
      <Reference name="Warp3D" path="../../../bin/"/>
 | 
			
		||||
      <Reference name="OpenSim.Capabilities"/>
 | 
			
		||||
      <Reference name="OpenSim.Data"/>
 | 
			
		||||
      <Reference name="OpenSim.Framework"/>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue