// Remove the specified child from the linkset.
        // Safe to call even if the child is not really in the linkset.
        protected override void RemoveChildFromLinkset(BSPrimLinkable child, bool inTaintTime)
        {
            child.ClearDisplacement();

            if (m_children.Remove(child))
            {
                DetailLog("{0},BSLinksetCompound.RemoveChildFromLinkset,call,rID={1},rBody={2},cID={3},cBody={4}",
                          child.LocalID,
                          LinksetRoot.LocalID, LinksetRoot.PhysBody.AddrString,
                          child.LocalID, child.PhysBody.AddrString);

                // Cause the child's body to be rebuilt and thus restored to normal operation
                child.ForceBodyShapeRebuild(inTaintTime);

                if (!HasAnyChildren)
                {
                    // The linkset is now empty. The root needs rebuilding.
                    LinksetRoot.ForceBodyShapeRebuild(inTaintTime);
                }
                else
                {
                    // Rebuild the compound shape with the child removed
                    Refresh(LinksetRoot);
                }
            }
            return;
        }
        // The object is going static (non-physical). Do any setup necessary for a static linkset.
        // Return 'true' if any properties updated on the passed object.
        // This doesn't normally happen -- Universe removes the objects from the physical
        //     world if it is a static linkset.
        // Called at taint-time!
        public override bool MakeStatic(BSPrimLinkable child)
        {
            bool ret = false;

            DetailLog("{0},BSLinksetCompound.MakeStatic,call,IsRoot={1}", child.LocalID, IsRoot(child));
            child.ClearDisplacement();
            if (IsRoot(child))
            {
                Refresh(LinksetRoot);
            }
            return(ret);
        }
示例#3
0
        protected BSLinkset(BSScene scene, BSPrimLinkable parent)
        {
            // A simple linkset of one (no children)
            LinksetID = m_nextLinksetID++;
            // We create LOTS of linksets.
            if (m_nextLinksetID <= 0)
                m_nextLinksetID = 1;
            PhysicsScene = scene;
            LinksetRoot = parent;
            //m_children = new HashSet<BSPrimLinkable>();
            m_children = new Dictionary<BSPrimLinkable, BSLinkInfo>();
            LinksetMass = parent.RawMass;
            Rebuilding = false;
            RebuildScheduled = false;

            parent.ClearDisplacement();
        }
示例#4
0
        protected BSLinkset(BSScene scene, BSPrimLinkable parent)
        {
            // A simple linkset of one (no children)
            LinksetID = m_nextLinksetID++;
            // We create LOTS of linksets.
            if (m_nextLinksetID <= 0)
            {
                m_nextLinksetID = 1;
            }
            PhysicsScene = scene;
            LinksetRoot  = parent;
            //m_children = new HashSet<BSPrimLinkable>();
            m_children       = new Dictionary <BSPrimLinkable, BSLinkInfo>();
            LinksetMass      = parent.RawMass;
            Rebuilding       = false;
            RebuildScheduled = false;

            parent.ClearDisplacement();
        }
        // Remove the specified child from the linkset.
        // Safe to call even if the child is not really in the linkset.
        protected override void RemoveChildFromLinkset(BSPrimLinkable child, bool inTaintTime)
        {
            child.ClearDisplacement();

            if (m_children.Remove(child))
            {
                DetailLog("{0},BSLinksetCompound.RemoveChildFromLinkset,call,rID={1},rBody={2},cID={3},cBody={4}",
                    child.LocalID,
                    LinksetRoot.LocalID, LinksetRoot.PhysBody.AddrString,
                    child.LocalID, child.PhysBody.AddrString);

                // Cause the child's body to be rebuilt and thus restored to normal operation
                child.ForceBodyShapeRebuild(inTaintTime);

                if (!HasAnyChildren)
                {
                    // The linkset is now empty. The root needs rebuilding.
                    LinksetRoot.ForceBodyShapeRebuild(inTaintTime);
                }
                else
                {
                    // Rebuild the compound shape with the child removed
                    Refresh(LinksetRoot);
                }
            }
            return;
        }
 // The object is going static (non-physical). Do any setup necessary for a static linkset.
 // Return 'true' if any properties updated on the passed object.
 // This doesn't normally happen -- Universe removes the objects from the physical
 //     world if it is a static linkset.
 // Called at taint-time!
 public override bool MakeStatic(BSPrimLinkable child)
 {
     bool ret = false;
     DetailLog("{0},BSLinksetCompound.MakeStatic,call,IsRoot={1}", child.LocalID, IsRoot(child));
     child.ClearDisplacement();
     if (IsRoot(child))
     {
         Refresh(LinksetRoot);
     }
     return ret;
 }