public static float getGenerationProgress(Vox.VoxelTree editor) { return(1 - (float)(editor.getJobCount() + Vox.VoxelThread.getJobCount()) / jobCount * 2); }
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; }
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; }
protected Modifier(VoxelTree control, bool updateMesh) { this.control = control; this.updateMesh = updateMesh; }