コード例 #1
0
ファイル: QbMatrix.cs プロジェクト: law4x/stonevox3d
        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();
                            }
                        }
                    }

        }
コード例 #2
0
ファイル: QbMatrix.cs プロジェクト: law4x/stonevox3d
        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;
            }
        }
コード例 #3
0
ファイル: QbMatrixSide.cs プロジェクト: law4x/stonevox3d
        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);
        }