Beispiel #1
0
        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);
            }
        }
Beispiel #2
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);
             }
         }
     }
 }
Beispiel #3
0
        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();
        }