예제 #1
0
 private void ProcNeighbour(CombineVoxel cmb, PVSVoxel vx, List <PVSVoxel> procVoxels, int tolerance)
 {
     cmb.Voxels.Add(vx);
     for (Agent.GeoBox.BoxFace i = Agent.GeoBox.BoxFace.StartIndex; i < Agent.GeoBox.BoxFace.Number; i++)
     {
         int index = vx.LinkedVoxels[(int)i];
         if (index < 0)
         {
             continue;
         }
         if (cmb.TryCombine(Voxels[index], tolerance))
         {
             vx.FaceType |= (Graphics.Mesh.CGfxMeshCooker.EBoxFace)(1 << (int)i);
             var oppositeFace = (int)GetOppositeFace(i);
             Voxels[index].FaceType |= (Graphics.Mesh.CGfxMeshCooker.EBoxFace)(1 << oppositeFace);
             if (false == Remove(procVoxels, Voxels[index]))
             {
                 //System.Diagnostics.Debug.Assert(cmb.FindVoxel(Voxels[index]));
             }
             else
             {
                 ProcNeighbour(cmb, Voxels[index], procVoxels, tolerance);
             }
         }
     }
 }
예제 #2
0
 public bool FindVoxel(PVSVoxel vx)
 {
     foreach (var i in Voxels)
     {
         if (i == vx)
         {
             return(true);
         }
     }
     return(false);
 }
예제 #3
0
 private bool Remove(List <PVSVoxel> lst, PVSVoxel vx)
 {
     for (int i = 0; i < lst.Count; i++)
     {
         if (lst[i] == vx)
         {
             lst.RemoveAt(i);
             return(true);
         }
     }
     return(false);
 }
예제 #4
0
        public bool TryCombine(PVSVoxel vx, int tolerance)
        {
            int flagNumber = 0;
            var combine    = Support.BitSet.BitOr(CombineBits, vx.Bits, ref flagNumber);

            if (flagNumber - OriFlagNumber < tolerance)
            {
                CombineBits = combine;
                return(true);
            }

            return(false);
        }
예제 #5
0
        private bool IsCluster(PVSVoxel vx)
        {
            if (vx.BitsHash != BitsHash)
            {
                return(false);
            }

            if (vx.Bits.IsSame(Bits) == false)
            {
                return(false);
            }

            return(true);
        }
예제 #6
0
        private PVSVoxel[,,] FullFill(PVSBuilder builder)
        {
            var result = new PVSVoxel[builder.MaxX, builder.MaxY, builder.MaxZ];

            int xMin = int.MaxValue;
            int yMin = int.MaxValue;
            int zMin = int.MaxValue;
            int xMax = int.MinValue;
            int yMax = int.MinValue;
            int zMax = int.MinValue;

            foreach (var i in Voxels)
            {
                if (i.X <= xMin)
                {
                    xMin = i.X;
                }
                if (i.Y <= yMin)
                {
                    yMin = i.Y;
                }
                if (i.Z <= zMin)
                {
                    zMin = i.Z;
                }
                if (i.X >= xMax)
                {
                    xMax = i.X;
                }
                if (i.Y >= yMax)
                {
                    yMax = i.Y;
                }
                if (i.Z >= zMax)
                {
                    zMax = i.Z;
                }
                result[i.X, i.Y, i.Z] = i;
            }
            return(result);
        }
예제 #7
0
 public CombineVoxel(PVSVoxel vx)
 {
     OriFlagNumber = vx.Bits.FlagNumber;
     CombineBits   = new Support.BitSet();
     CombineBits.Init(vx.Bits.BitCount, vx.Bits.Data);
 }
예제 #8
0
        private int GetExtendNum(PVSVoxel[,,] all, PVSVoxel vx,
                                 ref int xMin,
                                 ref int yMin,
                                 ref int zMin,
                                 ref int xMax,
                                 ref int yMax,
                                 ref int zMax)
        {
            xMin = vx.X;
            yMin = vx.Y;
            zMin = vx.Z;
            xMax = xMin;
            yMax = yMin;
            zMax = zMin;

            bool b_xMin = false;
            bool b_yMin = false;
            bool b_zMin = false;
            bool b_xMax = false;
            bool b_yMax = false;
            bool b_zMax = false;

            while (b_xMin == false ||
                   b_xMax == false ||
                   b_yMin == false ||
                   b_yMax == false ||
                   b_zMin == false ||
                   b_zMax == false)
            {
                if (b_xMin == false)
                {
                    if (xMin == 0)
                    {
                        b_xMin = true;
                    }
                    else
                    {
                        xMin--;
                        bool canExt = true;
                        for (int y = yMin; y <= yMax; y++)
                        {
                            for (int z = zMin; z <= zMax; z++)
                            {
                                if (all[xMin, y, z] == null)
                                {
                                    canExt = false;
                                    break;
                                }
                            }
                        }
                        if (canExt == false)
                        {
                            xMin++;
                            b_xMin = true;
                        }
                    }
                }
                if (b_zMin == false)
                {
                    if (zMin == 0)
                    {
                        b_zMin = true;
                    }
                    else
                    {
                        zMin--;
                        bool canExt = true;
                        for (int x = xMin; x <= xMax; x++)
                        {
                            for (int y = yMin; y <= yMax; y++)
                            {
                                if (all[x, y, zMin] == null)
                                {
                                    canExt = false;
                                    break;
                                }
                            }
                        }
                        if (canExt == false)
                        {
                            zMin++;
                            b_zMin = true;
                        }
                    }
                }
                if (b_xMax == false)
                {
                    if (xMax == all.GetLength(0) - 1)
                    {
                        b_xMax = true;
                    }
                    else
                    {
                        xMax++;
                        bool canExt = true;
                        for (int y = yMin; y <= yMax; y++)
                        {
                            for (int z = zMin; z <= zMax; z++)
                            {
                                if (all[xMax, y, z] == null)
                                {
                                    canExt = false;
                                    break;
                                }
                            }
                        }
                        if (canExt == false)
                        {
                            xMax--;
                            b_xMax = true;
                        }
                    }
                }
                if (b_zMax == false)
                {
                    if (zMax == all.GetLength(2) - 1)
                    {
                        b_zMax = true;
                    }
                    else
                    {
                        zMax++;
                        bool canExt = true;
                        for (int x = xMin; x <= xMax; x++)
                        {
                            for (int y = yMin; y <= yMax; y++)
                            {
                                if (all[x, y, zMax] == null)
                                {
                                    canExt = false;
                                    break;
                                }
                            }
                        }
                        if (canExt == false)
                        {
                            zMax--;
                            b_zMax = true;
                        }
                    }
                }
                if (b_yMin == false)
                {
                    if (yMin == 0)
                    {
                        b_yMin = true;
                    }
                    else
                    {
                        yMin--;
                        bool canExt = true;
                        for (int x = xMin; x <= xMax; x++)
                        {
                            for (int z = zMin; z <= zMax; z++)
                            {
                                if (all[x, yMin, z] == null)
                                {
                                    canExt = false;
                                    break;
                                }
                            }
                        }
                        if (canExt == false)
                        {
                            yMin++;
                            b_yMin = true;
                        }
                    }
                }
                if (b_yMax == false)
                {
                    if (yMax == all.GetLength(1) - 1)
                    {
                        b_yMax = true;
                    }
                    else
                    {
                        yMax++;
                        bool canExt = true;
                        for (int x = xMin; x <= xMax; x++)
                        {
                            for (int z = zMin; z <= zMax; z++)
                            {
                                if (all[x, yMax, z] == null)
                                {
                                    canExt = false;
                                    break;
                                }
                            }
                        }
                        if (canExt == false)
                        {
                            yMax--;
                            b_yMax = true;
                        }
                    }
                }
            }

            return((xMax - xMin + 1) + (yMax - yMin + 1) + (zMax - zMin + 1));
        }