// Create the correct type of linkset for this child public static BSLinkset Factory(BSScene physScene, BSPrimLinkable parent) { BSLinkset ret = null; switch (parent.LinksetType) { case LinksetImplementation.Constraint: ret = new BSLinksetConstraints(physScene, parent); break; case LinksetImplementation.Compound: ret = new BSLinksetCompound(physScene, parent); break; case LinksetImplementation.Manual: // ret = new BSLinksetManual(physScene, parent); break; default: ret = new BSLinksetCompound(physScene, parent); break; } if (ret == null) { physScene.Logger.ErrorFormat("[BULLETSIM LINKSET] Factory could not create linkset. Parent name={1}, ID={2}", parent.Name, parent.LocalID); } return(ret); }
public BSPrimLinkable(uint localID, String primName, BSScene parent_scene, OMV.Vector3 pos, OMV.Vector3 size, OMV.Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical) : base(localID, primName, parent_scene, pos, size, rotation, pbs, pisPhysical) { // Default linkset implementation for this prim LinksetType = (BSLinkset.LinksetImplementation)BSParam.LinksetImplementation; Linkset = BSLinkset.Factory(PhysScene, this); Linkset.Refresh(this); }
// Remove a child from a linkset. // Returns a new linkset for the child which is a linkset of one (just the // orphened child). // Called at runtime. public BSLinkset RemoveMeFromLinkset(BSPrimLinkable child, bool inTaintTime) { lock (m_linksetActivityLock) { if (IsRoot(child)) { // Cannot remove the root from a linkset. return(this); } RemoveChildFromLinkset(child, inTaintTime); LinksetMass = ComputeLinksetMass(); } // The child is down to a linkset of just itself return(BSLinkset.Factory(m_physicsScene, child)); }
// Convert the existing linkset of this prim into a new type. public bool ConvertLinkset(BSLinkset.LinksetImplementation newType) { bool ret = false; if (LinksetType != newType) { DetailLog("{0},BSPrimLinkable.ConvertLinkset,oldT={1},newT={2}", LocalID, LinksetType, newType); // Set the implementation type first so the call to BSLinkset.Factory gets the new type. this.LinksetType = newType; BSLinkset oldLinkset = this.Linkset; BSLinkset newLinkset = BSLinkset.Factory(PhysScene, this); this.Linkset = newLinkset; // Pick up any physical dependencies this linkset might have in the physics engine. oldLinkset.RemoveDependencies(this); // Create a list of the children (mainly because can't interate through a list that's changing) List <BSPrimLinkable> children = new List <BSPrimLinkable>(); oldLinkset.ForEachMember((child) => { if (!oldLinkset.IsRoot(child)) { children.Add(child); } return(false); // 'false' says to continue to next member }); // Remove the children from the old linkset and add to the new (will be a new instance from the factory) foreach (BSPrimLinkable child in children) { oldLinkset.RemoveMeFromLinkset(child, true /*inTaintTime*/); } foreach (BSPrimLinkable child in children) { newLinkset.AddMeToLinkset(child); child.Linkset = newLinkset; } // Force the shape and linkset to get reconstructed newLinkset.Refresh(this); this.ForceBodyShapeRebuild(true /* inTaintTime */); } return(ret); }
// Convert the existing linkset of this prim into a new type. public bool ConvertLinkset(BSLinkset.LinksetImplementation newType) { bool ret = false; if (LinksetType != newType) { DetailLog("{0},BSPrimLinkable.ConvertLinkset,oldT={1},newT={2}", LocalID, LinksetType, newType); // Set the implementation type first so the call to BSLinkset.Factory gets the new type. this.LinksetType = newType; BSLinkset oldLinkset = this.Linkset; BSLinkset newLinkset = BSLinkset.Factory(PhysScene, this); this.Linkset = newLinkset; // Pick up any physical dependencies this linkset might have in the physics engine. oldLinkset.RemoveDependencies(this); // Create a list of the children (mainly because can't interate through a list that's changing) List<BSPrimLinkable> children = new List<BSPrimLinkable>(); oldLinkset.ForEachMember((child) => { if (!oldLinkset.IsRoot(child)) children.Add(child); return false; // 'false' says to continue to next member }); // Remove the children from the old linkset and add to the new (will be a new instance from the factory) foreach (BSPrimLinkable child in children) { oldLinkset.RemoveMeFromLinkset(child, true /*inTaintTime*/); } foreach (BSPrimLinkable child in children) { newLinkset.AddMeToLinkset(child); child.Linkset = newLinkset; } // Force the shape and linkset to get reconstructed newLinkset.Refresh(this); this.ForceBodyShapeRebuild(true /* inTaintTime */); } return ret; }