Пример #1
0
 public static float getGenerationProgress(Vox.VoxelTree editor)
 {
     return(1 - (float)(editor.getJobCount() + Vox.VoxelThread.getJobCount()) / jobCount * 2);
 }
Пример #2
0
        public void setToHeightmap(byte detailLevel, int x, int y, int z, ref float[,] map, byte material, VoxelTree control)
        {
            if (detailLevel <= CHILD_COUNT_POWER)
            {
                for (int xi = 0; xi < CHILD_DIMENSION; ++xi)
                {
                    for (int zi = 0; zi < CHILD_DIMENSION; ++zi)
                    {
                        for (int yi = 0; yi < CHILD_DIMENSION; ++yi)
                        {
                            if (yi + y >= map[x + xi, z + zi])
                            {
                                break;
                            }
                            else if (material == byte.MaxValue)
                            {
                                children[xi, yi, zi] = Voxel.empty;
                            }
                            else
                            {
                                if (yi + y >= map[x + xi, z + zi] - 1)
                                {
                                    byte opacity = (byte)((map[x + xi, z + zi] - yi - y) * byte.MaxValue);
                                    if (opacity > control.isoLevel || children[xi, yi, zi].averageOpacity() <= opacity)
                                    {
                                        children[xi, yi, zi] = new Voxel(material, opacity);
                                    }
                                }
                                else
                                {
                                    children[xi, yi, zi] = new Voxel(material, byte.MaxValue);
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                int multiplier = (1 << (detailLevel - CHILD_COUNT_POWER));
                for (int xi = 0; xi < CHILD_DIMENSION; ++xi)
                {
                    for (int zi = 0; zi < CHILD_DIMENSION; ++zi)
                    {
                        int   xMax = x + (xi + 1) * multiplier;
                        int   zMax = z + (zi + 1) * multiplier;
                        float yMin = float.MaxValue;
                        float yMax = 0;
                        for (int xPos = x + xi * multiplier; xPos < xMax; ++xPos)
                        {
                            for (int zPos = z + zi * multiplier; zPos < zMax; ++zPos)
                            {
                                if (map[xPos, zPos] < yMin)
                                {
                                    yMin = map[xPos, zPos];
                                }
                                if (map[xPos, zPos] > yMax)
                                {
                                    yMax = map[xPos, zPos];
                                }
                            }
                        }

                        int firstUnsolidBlock = Mathf.Min(((int)(yMin - y)) / multiplier, CHILD_DIMENSION);
                        int lastUnsolidBlock  = Mathf.Min(((int)(yMax - y)) / multiplier, CHILD_DIMENSION - 1);
                        int yi = 0;
                        for (; yi < firstUnsolidBlock; ++yi)
                        {
                            if (material == byte.MaxValue)
                            {
                                children[xi, yi, zi] = Voxel.empty;
                            }
                            else
                            {
                                children[xi, yi, zi] = new Voxel(material, byte.MaxValue);
                            }
                        }
                        if (lastUnsolidBlock < 0)
                        {
                            continue;
                        }
                        for (; yi <= lastUnsolidBlock; ++yi)
                        {
                            if (children[xi, yi, zi].GetType() == typeof(Voxel))
                            {
                                children[xi, yi, zi] = new VoxelBlock((Voxel)children[xi, yi, zi]);
                            }
                            ((VoxelBlock)children[xi, yi, zi]).setToHeightmap((byte)(detailLevel - CHILD_COUNT_POWER), x + xi * multiplier, y + yi * multiplier, z + zi * multiplier, ref map, material, control);
                        }
                    }
                }
            }
            control.dirty = true;
        }
Пример #3
0
        public void setToHeightmap(byte detailLevel, int x, int y, int z, ref float[,] map, byte[,] mats, VoxelTree control)
        {
            if (detailLevel <= CHILD_COUNT_POWER)
            {
                for (int xi = 0; xi < CHILD_DIMENSION; ++xi)
                {
                    for (int zi = 0; zi < CHILD_DIMENSION; ++zi)
                    {
                        for (int yi = 0; yi < CHILD_DIMENSION; ++yi)
                        {
                            if (yi + y >= map[x + xi, z + zi])
                            {
                                break;
                            }
                            else if (yi + y >= map[x + xi, z + zi] - 1)
                            {
                                if (mats[x + xi, z + zi] == byte.MaxValue)
                                {
                                    children[xi, yi, zi] = Voxel.empty;
                                }
                                else
                                {
                                    children[xi, yi, zi] = new Voxel(mats[x + xi, z + zi], (byte)((map[x + xi, z + zi] - yi - y) * byte.MaxValue));
                                }
                            }
                            else
                            {
                                if (mats[x + xi, z + zi] == byte.MaxValue)
                                {
                                    children[xi, yi, zi] = Voxel.empty;
                                }
                                else
                                {
                                    children[xi, yi, zi] = new Voxel(mats[x + xi, z + zi], byte.MaxValue);
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                int multiplier = (1 << (detailLevel - CHILD_COUNT_POWER));
                for (int xi = 0; xi < CHILD_DIMENSION; ++xi)
                {
                    for (int zi = 0; zi < CHILD_DIMENSION; ++zi)
                    {
                        int   xMax = x + (xi + 1) * multiplier;
                        int   zMax = z + (zi + 1) * multiplier;
                        float yMin = float.MaxValue;
                        float yMax = 0;
                        bool  multipleMaterials = false;
                        byte  material          = mats[x, z];
                        for (int xPos = x + xi * multiplier; xPos < xMax; ++xPos)
                        {
                            for (int zPos = z + zi * multiplier; zPos < zMax; ++zPos)
                            {
                                if (map[xPos, zPos] < yMin)
                                {
                                    yMin = map[xPos, zPos];
                                }
                                if (map[xPos, zPos] > yMax)
                                {
                                    yMax = map[xPos, zPos];
                                }
                                if (mats[xPos, zPos] != material)
                                {
                                    multipleMaterials = true;
                                }
                            }
                        }

                        if (multipleMaterials)
                        {
                            yMin = 0;
                        }
                        int firstUnsolidBlock = Mathf.Min(((int)(yMin - y)) / multiplier, CHILD_DIMENSION);
                        int lastUnsolidBlock  = Mathf.Min(((int)(yMax - y)) / multiplier, CHILD_DIMENSION - 1);
                        int yi = 0;
                        for (; yi < firstUnsolidBlock; ++yi)
                        {
                            if (mats[x + xi * multiplier, z + zi * multiplier] == byte.MaxValue)
                            {
                                children[xi, yi, zi] = Voxel.empty;
                            }
                            else
                            {
                                children[xi, yi, zi] = new Voxel(mats[x + xi * multiplier, z + zi * multiplier], byte.MaxValue);
                            }
                        }
                        if (lastUnsolidBlock < 0)
                        {
                            continue;
                        }
                        for (; yi <= lastUnsolidBlock; ++yi)
                        {
                            VoxelBlock newChild = new VoxelBlock();
                            newChild.setToHeightmap((byte)(detailLevel - CHILD_COUNT_POWER), x + xi * multiplier, y + yi * multiplier, z + zi * multiplier, ref map, mats, control);
                            children[xi, yi, zi] = newChild;
                        }
                    }
                }
            }
            control.dirty = true;
        }
Пример #4
0
 protected Modifier(VoxelTree control, bool updateMesh)
 {
     this.control    = control;
     this.updateMesh = updateMesh;
 }