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); } } } }
public bool FindVoxel(PVSVoxel vx) { foreach (var i in Voxels) { if (i == vx) { return(true); } } return(false); }
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); }
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); }
private bool IsCluster(PVSVoxel vx) { if (vx.BitsHash != BitsHash) { return(false); } if (vx.Bits.IsSame(Bits) == false) { return(false); } return(true); }
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); }
public CombineVoxel(PVSVoxel vx) { OriFlagNumber = vx.Bits.FlagNumber; CombineBits = new Support.BitSet(); CombineBits.Init(vx.Bits.BitCount, vx.Bits.Data); }
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)); }