private void CalcExtends(BoundsItem[] items, int nitems, int imin, int imax, ref ChunkyTriMeshNode node) { node.bmin[0] = items[imin].bmin[0]; node.bmin[1] = items[imin].bmin[1]; node.bmax[0] = items[imin].bmax[0]; node.bmax[1] = items[imin].bmax[1]; for (int i = imin + 1; i < imax; i++) { BoundsItem it = items[i]; if (it.bmin[0] < node.bmin[0]) { node.bmin[0] = it.bmin[0]; } if (it.bmin[1] < node.bmin[1]) { node.bmin[1] = it.bmin[1]; } if (it.bmax[0] > node.bmax[0]) { node.bmax[0] = it.bmax[0]; } if (it.bmax[1] > node.bmax[1]) { node.bmax[1] = it.bmax[1]; } } }
int IComparer.Compare(object va, object vb) { BoundsItem a = va as BoundsItem; BoundsItem b = vb as BoundsItem; if (a != null && b != null) { if (a.bmin[1] < b.bmin[1]) { return(-1); } if (a.bmin[1] > b.bmin[1]) { return(1); } } return(0); }
public ChunkyTriMesh(RecastVertex[] verts, int[] tris, int ntris, int trisPerChunk) { int nchunks = (ntris + trisPerChunk - 1) / trisPerChunk; Nodes = new ChunkyTriMeshNode[nchunks * 4]; Tris = new int[ntris * 3]; NTris = ntris; BoundsItem[] items = new BoundsItem[ntris]; for (int i = 0; i < ntris; i++) { int t = i * 3; items[i] = new BoundsItem(); BoundsItem it = items[i]; it.i = i; it.bmin[0] = it.bmax[0] = verts[tris[t]].X; it.bmin[1] = it.bmax[1] = verts[tris[t]].Z; for (int j = 1; j < 3; j++) { int v = tris[t + j]; if (verts[v].X < it.bmin[0]) { it.bmin[0] = verts[v].X; } if (verts[v].Z < it.bmin[1]) { it.bmin[1] = verts[v].Z; } if (verts[v].X > it.bmax[0]) { it.bmax[0] = verts[v].X; } if (verts[v].Z > it.bmax[1]) { it.bmax[1] = verts[v].Z; } } } int curTri = 0; int curNode = 0; Subdivide(ref items, ntris, 0, ntris, trisPerChunk, ref curNode, nchunks * 4, ref curTri, tris); NNodes = curNode; MaxTrisPerChunk = 0; for (int i = 0; i < NNodes; i++) { bool isLeaf = Nodes[i].i >= 0; if (!isLeaf) { continue; } if (Nodes[i].n > MaxTrisPerChunk) { MaxTrisPerChunk = Nodes[i].n; } } }