示例#1
0
文件: Dbvt.cs 项目: himapo/ccm
 public DbvtNode insert(ref DbvtAabbMm volume, object data)
 {
     DbvtNode leaf = createnode(this, null,ref volume, data);
     insertleaf(this, m_root, leaf);
     ++m_leaves;
     return (leaf);
 }
示例#2
0
文件: Dbvt.cs 项目: himapo/ccm
 public void collideTV(DbvtNode root, ref DbvtAabbMm vol, ICollide policy)
 {
     if (root != null)
     {
         DbvtAabbMm volume = vol;
         List<DbvtNode> stack = new List<DbvtNode>();
         stack.Add(root);
         do
         {
             DbvtNode n = stack[stack.Count - 1];
             stack.RemoveAt(stack.Count - 1);
             if (Intersect(ref n.volume,ref volume))
             {
                 if (n.isinternal())
                 {
                     stack.Add(n.childs[0]);
                     stack.Add(n.childs[1]);
                 }
                 else
                 {
                     policy.Process(n);
                 }
             }
         } while (stack.Count > 0);
     }
 }
示例#3
0
文件: Dbvt.cs 项目: himapo/ccm
 private static DbvtNode createnode(Dbvt pdbvt,
                                    DbvtNode parent,
                                    ref DbvtAabbMm volume0,
                                    ref DbvtAabbMm volume1,
                                    object data)
 {
     DbvtNode node = createnode(pdbvt, parent, data);
     Merge(ref volume0,ref volume1,ref node.volume);
     return (node);
 }
示例#4
0
文件: Dbvt.cs 项目: himapo/ccm
 private static DbvtNode createnode(Dbvt pdbvt,
                                    DbvtNode parent,
                                    ref DbvtAabbMm volume,
                                    object data)
 {
     DbvtNode node = createnode(pdbvt, parent, data);
     node.volume = volume;
     return (node);
 }
示例#5
0
文件: Dbvt.cs 项目: himapo/ccm
 public void update(DbvtNode leaf, ref DbvtAabbMm volume)
 {
     DbvtNode root = removeleaf(this, leaf);
     if (root != null)
     {
         if (m_lkhd >= 0)
         {
             for (int i = 0; (i < m_lkhd) && root.parent != null; ++i)
             {
                 root = root.parent;
             }
         }
         else root = m_root;
     }
     leaf.volume = volume;
     insertleaf(this, root, leaf);
 }
示例#6
0
文件: Dbvt.cs 项目: himapo/ccm
        public bool	update(DbvtNode leaf,ref DbvtAabbMm volume,ref btVector3 velocity,float margin)
        {
	        if(leaf.volume.Contain(ref volume)) return(false);
            btVector3 temp = new btVector3(margin, margin, margin);
	        volume.Expand(ref temp);
	        volume.SignedExpand(ref velocity);
	        update(leaf,ref volume);
	        return(true);
        }
示例#7
0
文件: Dbvt.cs 项目: himapo/ccm
 static bool NotEqual(ref DbvtAabbMm a, ref DbvtAabbMm b)
 {
     return ((a.mi.X != b.mi.X) ||
         (a.mi.Y != b.mi.Y) ||
         (a.mi.Z != b.mi.Z) ||
         (a.mx.X != b.mx.X) ||
         (a.mx.Y != b.mx.Y) ||
         (a.mx.Z != b.mx.Z));
 }
示例#8
0
文件: Dbvt.cs 项目: himapo/ccm
 public static bool Intersect(ref DbvtAabbMm a,
                           ref DbvtAabbMm b)
 {
     return ((a.mi.X <= b.mx.X) &&
         (a.mx.X >= b.mi.X) &&
         (a.mi.Y <= b.mx.Y) &&
         (a.mx.Y >= b.mi.Y) &&
         (a.mi.Z <= b.mx.Z) &&
         (a.mx.Z >= b.mi.Z));
 }
示例#9
0
文件: Dbvt.cs 项目: himapo/ccm
 static float Proximity(ref DbvtAabbMm a,
                           ref DbvtAabbMm b)
 {
     btVector3 d;// = (a.mi + a.mx) - (b.mi + b.mx);
     {
         btVector3 temp1, temp2;
         btVector3.Add(ref a.mi, ref a.mx, out temp1);
         btVector3.Add(ref b.mi, ref b.mx, out temp2);
         btVector3.Subtract(ref temp1, ref temp2, out d);
     }
     return (Math.Abs(d.X) + Math.Abs(d.Y) + Math.Abs(d.Z));
 }
示例#10
0
文件: Dbvt.cs 项目: himapo/ccm
 static int Select(ref DbvtAabbMm o,
                        ref DbvtAabbMm a,
                        ref DbvtAabbMm b)
 {
     return (Proximity(ref o,ref a) < Proximity(ref o,ref  b) ? 0 : 1);
 }
示例#11
0
文件: Dbvt.cs 项目: himapo/ccm
 static void Merge(ref DbvtAabbMm a,
                      ref DbvtAabbMm b,
                      ref DbvtAabbMm r)
 {
     for (int i = 0; i < 3; ++i)
     {
         if (a.mi[i] < b.mi[i]) r.mi[i] = a.mi[i]; else r.mi[i] = b.mi[i];
         if (a.mx[i] > b.mx[i]) r.mx[i] = a.mx[i]; else r.mx[i] = b.mx[i];
     }
 }