Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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 });
        }