public void Add(VoxelVolume volume, VoxelVolume preVolume, ref Colort color) { int colorIndex = GetColorIndex(color.R, color.G, color.B); double hash = 0; // for all inner points in volume... for (int z = volume.minz + 1; z <= volume.maxz - 1; z++) for (int y = volume.miny + 1; y <= volume.maxy - 1; y++) for (int x = volume.minx + 1; x <= volume.maxx - 1; x++) { // if point not inside prevoius volume if (!preVolume.ContainsPoint(x, y, z)) { hash = GetHash(x, y, z); if (!voxels.TryGetValue(hash, out voxel)) { // alphamask = 1 because we know we're this point is inside the voxel volume Voxel voxel = new Voxel(x, y, z, (byte)1, colorIndex); voxels.TryAdd(hash, voxel); // since this is new voxel we don't need to update any visible geometry // (again it is interior voxel) } // we have a voxel here already else { // nuke all visible geometry of voxel voxel.alphamask = 1; UpdateVoxel(); } } } }
public bool Add(int x, int y, int z, Colort color) { if (voxels.TryGetValue(GetHash(x, y, z), out voxel)) { if (voxel.alphamask != 0) return false; else { if (!voxels.TryRemove(GetHash(x, y, z), out voxel)) return false; voxel = new Voxel(x, y, z, GetAlphaMask(x, y, z), GetColorIndex(color.R, color.G, color.B)); if (voxels.TryAdd(GetHash(x, y, z), voxel)) { voxel.dirty = true; UpdateVoxel(); if (voxels.TryGetValue(GetHash(x, y, z + 1), out voxel)) { if ((voxel.alphamask & 64) == 64) { voxel.alphamask -= 64; UpdateVoxel(); } } if (voxels.TryGetValue(GetHash(x, y, z - 1), out voxel)) { if ((voxel.alphamask & 32) == 32) { voxel.alphamask -= 32; UpdateVoxel(); } } if (voxels.TryGetValue(GetHash(x, y + 1, z), out voxel)) { if ((voxel.alphamask & 16) == 16) { voxel.alphamask -= 16; UpdateVoxel(); } } if (voxels.TryGetValue(GetHash(x, y - 1, z), out voxel)) { if ((voxel.alphamask & 8) == 8) { voxel.alphamask -= 8; UpdateVoxel(); } } if (voxels.TryGetValue(GetHash(x + 1, y, z), out voxel)) { if ((voxel.alphamask & 4) == 4) { voxel.alphamask -= 4; UpdateVoxel(); } } if (voxels.TryGetValue(GetHash(x - 1, y, z), out voxel)) { if ((voxel.alphamask & 2) == 2) { voxel.alphamask -= 2; UpdateVoxel(); } } return true; } return false; } } else { voxel = new Voxel(x, y, z, GetAlphaMask(x, y, z), GetColorIndex(color.R, color.G, color.B)); if (voxels.TryAdd(GetHash(x, y, z), voxel)) { voxel.dirty = true; UpdateVoxel(); if (voxels.TryGetValue(GetHash(x, y, z + 1), out voxel)) { if ((voxel.alphamask & 64) == 64) { voxel.alphamask -= 64; UpdateVoxel(); } } if (voxels.TryGetValue(GetHash(x, y, z - 1), out voxel)) { if ((voxel.alphamask & 32) == 32) { voxel.alphamask -= 32; UpdateVoxel(); } } if (voxels.TryGetValue(GetHash(x, y + 1, z), out voxel)) { if ((voxel.alphamask & 16) == 16) { voxel.alphamask -= 16; UpdateVoxel(); } } if (voxels.TryGetValue(GetHash(x, y - 1, z), out voxel)) { if ((voxel.alphamask & 8) == 8) { voxel.alphamask -= 8; UpdateVoxel(); } } if (voxels.TryGetValue(GetHash(x + 1, y, z), out voxel)) { if ((voxel.alphamask & 4) == 4) { voxel.alphamask -= 4; UpdateVoxel(); } } if (voxels.TryGetValue(GetHash(x - 1, y, z), out voxel)) { if ((voxel.alphamask & 2) == 2) { voxel.alphamask -= 2; UpdateVoxel(); } } return true; } return false; } }
public void updatevoxel(Voxel voxel) { int bufferindex = -1; switch (side) { case Side.Front: bufferindex = voxel.front; break; case Side.Back: bufferindex = voxel.back; break; case Side.Top: bufferindex = voxel.top; break; case Side.Bottom: bufferindex = voxel.bottom; break; case Side.Right: bufferindex = voxel.right; break; case Side.Left: bufferindex = voxel.left; break; } fillbuffer(bufferindex, voxel.x, voxel.y, voxel.z, voxel.colorindex); }