Exemple #1
0
        // I'm the parent
        // prim is the child
        public void ParentPrim(AuroraODEPrim prim)
            {
            //Console.WriteLine("ParentPrim  " + m_primName);
            if (this.m_localID != prim.m_localID)
                {
                lock (childrenPrim)
                    {
                    if (!childrenPrim.Contains(prim)) // must allow full reconstruction
                        childrenPrim.Add(prim);
                    }
                prim.childPrim = true;
                prim._parent = this;

                if (prim.Body != IntPtr.Zero && prim.Body != Body)
                    {
                    prim.DestroyBody(); // don't loose bodies around
                    prim.Body = IntPtr.Zero;
                    }
                if (m_isphysical)
                    MakeBody(); // full nasty reconstruction
                }
            }       
 ///<summary>
 ///  This is called from within simulate but outside the locked portion
 ///  We need to do our own locking here
 ///  Essentially, we need to remove the prim from our space segment, whatever segment it's in.
 ///
 ///  If there are no more prim in the segment, we need to empty (spacedestroy)the segment and reclaim memory
 ///  that the space was using.
 ///</summary>
 ///<param name = "prim"></param>
 public void RemovePrimThreadLocked(AuroraODEPrim prim)
 {
     //Console.WriteLine("RemovePrimThreadLocked " +  prim.m_primName);
     lock (prim)
     {
         remCollisionEventReporting(prim);
         remActivePrim(prim);
         prim.m_frozen = true;
         if (prim.prim_geom != IntPtr.Zero)
         {
             prim.DestroyBody();
             prim.IsPhysical = false;
             prim.m_targetSpace = IntPtr.Zero;
             try
             {
                 if (prim.prim_geom != IntPtr.Zero)
                 {
                     d.GeomDestroy(prim.prim_geom);
                     prim.prim_geom = IntPtr.Zero;
                 }
                 else
                 {
                     MainConsole.Instance.Warn("[PHYSICS]: Unable to remove prim from physics scene");
                 }
             }
             catch (AccessViolationException)
             {
                 MainConsole.Instance.Info("[PHYSICS]: Couldn't remove prim from physics scene, it was already be removed.");
             }
         }
         if (!prim.childPrim)
         {
             lock (prim.childrenPrim)
             {
                 foreach (AuroraODEPrim prm in prim.childrenPrim)
                 {
                     RemovePrimThreadLocked(prm);
                 }
             }
         }
         lock (_prims)
             _prims.Remove(prim);
     }
 }
        /// <summary>
        /// This is called from within simulate but outside the locked portion
        /// We need to do our own locking here
        /// Essentially, we need to remove the prim from our space segment, whatever segment it's in.
        ///
        /// If there are no more prim in the segment, we need to empty (spacedestroy)the segment and reclaim memory
        /// that the space was using.
        /// </summary>
        /// <param name="prim"></param>
        public void RemovePrimThreadLocked(AuroraODEPrim prim)
        {
            //Console.WriteLine("RemovePrimThreadLocked " +  prim.m_primName);
            lock (prim)
            {
                remCollisionEventReporting(prim);
                remActivePrim(prim);
                lock (ode)
                {
                    prim.m_frozen = true;
                    if (prim.prim_geom != IntPtr.Zero)
                    {
                        prim.DestroyBody();
                        prim.IsPhysical = false;

                        // we don't want to remove the main space

                        // If the geometry is in the targetspace, remove it from the target space
                        //m_log.Warn(prim.m_targetSpace);

                        //if (prim.m_targetSpace != IntPtr.Zero)
                        //{
                        //if (d.SpaceQuery(prim.m_targetSpace, prim.prim_geom))
                        //{

                        //if (d.GeomIsSpace(prim.m_targetSpace))
                        //{
                        //waitForSpaceUnlock(prim.m_targetSpace);
                        //d.SpaceRemove(prim.m_targetSpace, prim.prim_geom);
                        prim.m_targetSpace = IntPtr.Zero;
                        //}
                        //else
                        //{
                        // m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" +
                        //((OdePrim)prim).m_targetSpace.ToString());
                        //}

                        //}
                        //}
                        //m_log.Warn(prim.prim_geom);
                        try
                        {
                            if (prim.prim_geom != IntPtr.Zero)
                            {
                                d.GeomDestroy(prim.prim_geom);
                                prim.prim_geom = IntPtr.Zero;
                            }
                            else
                            {
                                m_log.Warn("[PHYSICS]: Unable to remove prim from physics scene");
                            }
                        }
                        catch (AccessViolationException)
                        {
                            m_log.Info("[PHYSICS]: Couldn't remove prim from physics scene, it was already be removed.");
                        }
                        lock (_prims)
                            _prims.Remove(prim);

                        //If there are no more geometries in the sub-space, we don't need it in the main space anymore
                        //if (d.SpaceGetNumGeoms(prim.m_targetSpace) == 0)
                        //{
                        //if (prim.m_targetSpace != null)
                        //{
                        //if (d.GeomIsSpace(prim.m_targetSpace))
                        //{
                        //waitForSpaceUnlock(prim.m_targetSpace);
                        //d.SpaceRemove(space, prim.m_targetSpace);
                        // free up memory used by the space.
                        //d.SpaceDestroy(prim.m_targetSpace);
                        //int[] xyspace = calculateSpaceArrayItemFromPos(prim.Position);
                        //resetSpaceArrayItemToZero(xyspace[0], xyspace[1]);
                        //}
                        //else
                        //{
                        //m_log.Info("[Physics]: Invalid Scene passed to 'removeprim from scene':" +
                        //((OdePrim) prim).m_targetSpace.ToString());
                        //}
                        //}
                        //}

                        if (SupportsNINJAJoints)
                        {
                            RemoveAllJointsConnectedToActorThreadLocked(prim);
                        }
                    }
                }
            }
        }
Exemple #4
0
        // I'm the parent
        // prim is the child
        public void ParentPrim(AuroraODEPrim prim)
        {
            //Console.WriteLine("ParentPrim  " + m_primName);
            if (this.m_localID != prim.m_localID)
            {
                DestroyBody();

                lock (childrenPrim)
                {
                    foreach (AuroraODEPrim prm in prim.childrenPrim.Where(prm => !childrenPrim.Contains(prm)))
                    {
                        childrenPrim.Add(prm);
                    }

                    if (!childrenPrim.Contains(prim)) // must allow full reconstruction
                        childrenPrim.Add(prim);
                }
                //Remove old children
                prim.childrenPrim.Clear();
                prim.childPrim = true;
                prim._parent = this;

                if (prim.Body != IntPtr.Zero)
                {
                    prim.DestroyBody(); // don't loose bodies around
                    prim.Body = IntPtr.Zero;
                }
                MakeBody(); // full nasty reconstruction
            }
        }
 ///<summary>
 ///  This is called from within simulate but outside the locked portion
 ///  We need to do our own locking here
 ///  Essentially, we need to remove the prim from our space segment, whatever segment it's in.
 ///
 ///  If there are no more prim in the segment, we need to empty (spacedestroy)the segment and reclaim memory
 ///  that the space was using.
 ///</summary>
 ///<param name = "prim"></param>
 internal void RemovePrimThreadLocked(AuroraODEPrim prim)
 {
     remCollisionEventReporting(prim);
     remActivePrim(prim);
     prim.m_frozen = true;
     if (prim.prim_geom != IntPtr.Zero)
     {
         prim.DestroyBody();
         prim.IsPhysical = false;
         prim.m_targetSpace = IntPtr.Zero;
         try
         {
             if (prim.prim_geom != IntPtr.Zero)
             {
                 d.GeomDestroy(prim.prim_geom);
                 prim.prim_geom = IntPtr.Zero;
             }
             else
             {
                 MainConsole.Instance.Warn("[PHYSICS]: Unable to remove prim from physics scene");
             }
         }
         catch (AccessViolationException)
         {
             MainConsole.Instance.Info("[PHYSICS]: Couldn't remove prim from physics scene, it was already be removed.");
         }
     }
     if (!prim.childPrim)
     {
         lock (prim.childrenPrim)
             foreach (AuroraODEPrim prm in prim.childrenPrim)
                 RemovePrimThreadLocked(prm);
     }
     if (prim.ParentEntity != null)
         prim.ParentEntity.PhysActor = null; //Delete it
     lock (_prims)
         _prims.Remove(prim);
 }