private static int createBVTree(int[] verts, int nverts, int[] polys, int npolys, int nvp, float cs, float ch, BVNode[] nodes) { // Build tree BVItem[] items = new BVItem[npolys]; for (int i = 0; i < npolys; i++) { BVItem it = new BVItem(); items[i] = it; it.i = i; // Calc polygon bounds. int p = i * nvp * 2; it.bmin[0] = it.bmax[0] = verts[polys[p] * 3 + 0]; it.bmin[1] = it.bmax[1] = verts[polys[p] * 3 + 1]; it.bmin[2] = it.bmax[2] = verts[polys[p] * 3 + 2]; for (int j = 1; j < nvp; ++j) { if (polys[p + j] == MESH_NULL_IDX) { break; } int x = verts[polys[p + j] * 3 + 0]; int y = verts[polys[p + j] * 3 + 1]; int z = verts[polys[p + j] * 3 + 2]; if (x < it.bmin[0]) { it.bmin[0] = x; } if (y < it.bmin[1]) { it.bmin[1] = y; } if (z < it.bmin[2]) { it.bmin[2] = z; } if (x > it.bmax[0]) { it.bmax[0] = x; } if (y > it.bmax[1]) { it.bmax[1] = y; } if (z > it.bmax[2]) { it.bmax[2] = z; } } // Remap y it.bmin[1] = (int)Math.Floor(it.bmin[1] * ch / cs); it.bmax[1] = (int)Math.Ceiling(it.bmax[1] * ch / cs); } return(subdivide(items, npolys, 0, npolys, 0, nodes)); }
private static int[][] calcExtends(BVItem[] items, int nitems, int imin, int imax) { int[] bmin = new int[3]; int[] bmax = new int[3]; bmin[0] = items[imin].bmin[0]; bmin[1] = items[imin].bmin[1]; bmin[2] = items[imin].bmin[2]; bmax[0] = items[imin].bmax[0]; bmax[1] = items[imin].bmax[1]; bmax[2] = items[imin].bmax[2]; for (int i = imin + 1; i < imax; ++i) { BVItem it = items[i]; if (it.bmin[0] < bmin[0]) { bmin[0] = it.bmin[0]; } if (it.bmin[1] < bmin[1]) { bmin[1] = it.bmin[1]; } if (it.bmin[2] < bmin[2]) { bmin[2] = it.bmin[2]; } if (it.bmax[0] > bmax[0]) { bmax[0] = it.bmax[0]; } if (it.bmax[1] > bmax[1]) { bmax[1] = it.bmax[1]; } if (it.bmax[2] > bmax[2]) { bmax[2] = it.bmax[2]; } } return(new int[][] { bmin, bmax }); }