private static Agent.GeoBox.BoxFace GetOppositeFace(Agent.GeoBox.BoxFace face) { switch (face) { case Agent.GeoBox.BoxFace.Front: return(Agent.GeoBox.BoxFace.Back); case Agent.GeoBox.BoxFace.Back: return(Agent.GeoBox.BoxFace.Front); case Agent.GeoBox.BoxFace.Left: return(Agent.GeoBox.BoxFace.Right); case Agent.GeoBox.BoxFace.Right: return(Agent.GeoBox.BoxFace.Left); case Agent.GeoBox.BoxFace.Top: return(Agent.GeoBox.BoxFace.Bottom); case Agent.GeoBox.BoxFace.Bottom: return(Agent.GeoBox.BoxFace.Top); default: return(Agent.GeoBox.BoxFace.Number); } }
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 void SaveXND(string name) { if (AgentDatas == null || AgentDatas.Count == 0) { return; } var xnd = EngineNS.IO.XndHolder.NewXNDHolder(); var attr = xnd.Node.AddAttrib("GeomSceneData"); attr.BeginWrite(); attr.Write(AgentDatas.Count); foreach (AgentBoxs data in AgentDatas) { attr.Write(data.BVSize); attr.Write(data.Mat); attr.Write(data.AgentData.Count); foreach (var geobox in data.AgentData) { attr.WriteMetaObject(geobox); for (Agent.GeoBox.BoxFace i = Agent.GeoBox.BoxFace.StartIndex; i < Agent.GeoBox.BoxFace.Number; i++) { int index = geobox.Neighbors[(int)i]; attr.Write(index); } } } attr.EndWrite(); EngineNS.IO.XndHolder.SaveXND(name, xnd); xnd.Node.TryReleaseHolder(); }