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); }
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); } }
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); }
private static DbvtNode createnode(Dbvt pdbvt, DbvtNode parent, ref DbvtAabbMm volume, object data) { DbvtNode node = createnode(pdbvt, parent, data); node.volume = volume; return (node); }
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); }
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); }
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)); }
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)); }
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)); }
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); }
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]; } }