public void UpdateTransMesh()
 {
     if (bTransVoxelEnabled)
     {
         if (curStatus == ETransBuildStatus.Status_FinBuild)
         {
             if (0 == surfExtractorTrans.OnFin())
             {
                 curStatus = ETransBuildStatus.Status_Idle;
             }
         }
     }
 }
    public void ThreadBuildTransExec()
    {
        surfExtractorTrans.Init();

        List <IntVector4>       locTransPosList   = new List <IntVector4>();
        List <VFVoxelChunkData> locTransChunkList = new List <VFVoxelChunkData>();

        while (bTransVoxelEnabled)
        {
            if (curStatus == ETransBuildStatus.Status_ToBuild)
            {
                locTransPosList   = transRebuildList.Keys.ToList();
                locTransChunkList = transRebuildList.Values.ToList();
                for (int i = 0; i < locTransChunkList.Count; i++)
                {
                    VFVoxelChunkData cdata = locTransChunkList[i];
                    //if(cdata.LOD != 0)	continue;
                    if (cdata.LOD == LODOctreeMan._maxLod || null == (System.Object)cdata.ChunkGo)
                    {
                        continue;
                    }
                    int oldFaceMask = null == (System.Object)cdata.ChunkGo.TransvoxelGo ? 0 : cdata.ChunkGo.TransvoxelGo._faceMask;
                    int faceMask    = 0;
                    int curLod      = cdata.LOD;
                    int posMask     = (-1) << (curLod + 1);
                    for (int dirIdx = 0; dirIdx < Transvoxel.Lengyel.Tables.TransitionFaceDir.Length; dirIdx++)
                    {
                        IntVector3 unitOfs = Transvoxel.Lengyel.Tables.TransitionFaceDir[dirIdx];
                        IntVector4 nearLow = new IntVector4((cdata.ChunkPosLod.x + (unitOfs.x << curLod)) & posMask,
                                                            (cdata.ChunkPosLod.y + (unitOfs.y << curLod)) & posMask,
                                                            (cdata.ChunkPosLod.z + (unitOfs.z << curLod)) & posMask,
                                                            curLod + 1);
                        if (locTransPosList.Contains(nearLow))
                        {
                            faceMask |= 1 << dirIdx;
                        }
                    }
                    if (faceMask == oldFaceMask)
                    {
                        continue;
                    }
                    surfExtractorTrans.AddSurfExtractReq(new SurfExtractReqTrans(faceMask, cdata));
                }
                surfExtractorTrans.Exec();
                curStatus = ETransBuildStatus.Status_FinBuild;
            }

            System.Threading.Thread.Sleep(16);
        }
        curStatus = ETransBuildStatus.Status_Idle;
    }
 public bool PrepChunkList()
 {
     if (curStatus == ETransBuildStatus.Status_Idle)
     {
         transRebuildList.Clear();
         Transform parTrans = VFVoxelTerrain.self.transform;
         foreach (Transform trans in parTrans)
         {
             if (trans.gameObject.activeSelf)
             {
                 try{
                     VFVoxelChunkGo   chunkGo = trans.GetComponent <VFVoxelChunkGo>();
                     VFVoxelChunkData cdata   = chunkGo.Data;
                     transRebuildList.Add(cdata.ChunkPosLod, cdata);
                 }
                 catch {}                    // Delayed Destroy will cause Dictionary.Add's exception
             }
         }
         curStatus = ETransBuildStatus.Status_ToBuild;
         return(true);
     }
     return(false);
 }