示例#1
0
 public override bool Equals(object obj)
 {
     LODUpdateCmd cmd = (LODUpdateCmd)obj;
     //if(vec != null)
     {
         return(this.posToRead == cmd.posToRead && this.posToWrite == cmd.posToWrite &&
                this.chunk.ChunkPosLod.Equals(cmd.chunk.ChunkPosLod));
     }
     //return false;
 }
示例#2
0
    public void GenUpdateCmd(IntVector3 chunkPos, IntVector3 localPos, List <LODUpdateCmd> updateCmdList)
    {
        //int dim = 0;
        IntVector3 modPos = null;

        localPos.x += 1;
        localPos.y += 1;
        localPos.z += 1;

        IntVector3 runningPos = new IntVector3(localPos);

        for (int i = 0; i < LODOctreeMan.MaxLod; i++)
        {
            //dim = 32 * (1 << i);

            IntVector3 lodChunkPos = new IntVector3(chunkPos);

            lodChunkPos.x = lodChunkPos.x >> i << i;
            lodChunkPos.y = lodChunkPos.y >> i << i;
            lodChunkPos.z = lodChunkPos.z >> i << i;

            // attach a dummy octreenode
            VFVoxelChunkData cd = ForgeChunk(lodChunkPos, i);
            if (modPos == null)
            {
                modPos = cd.ChunkPosLod.XYZ;
            }

            LODUpdateCmd cmd = new LODUpdateCmd(cd);
            if (i > 0)
            {
                if (runningPos.x < 0 || runningPos.y < 0 || runningPos.z < 0)
                {
                    break;
                }
                cmd.posToWrite = new IntVector3(runningPos);
            }

//			LODUpdateCmd.PreReadOps(runningPos);

            cmd.posToRead = new IntVector3(runningPos);
            //LODUpdateCmd.PostReadOps(runningPos, modPos);

            runningPos.x += (modPos.x % 2) * 35;
            runningPos.y += (modPos.y % 2) * 35;
            runningPos.z += (modPos.z % 2) * 35;

            int xIdx = voxelIndexInverted[runningPos.x];
            int yIdx = voxelIndexInverted[runningPos.y];
            int zIdx = voxelIndexInverted[runningPos.z];

            runningPos.x = xIdx;
            runningPos.y = yIdx;
            runningPos.z = zIdx;

            modPos.x = modPos.x >> 1;
            modPos.y = modPos.y >> 1;
            modPos.z = modPos.z >> 1;

            IntVector4   cmdVec = new IntVector4(cmd.posToRead.x, cmd.posToRead.y, cmd.posToRead.z, i);
            LODUpdateCmd outCmd;
            if (cmdCollision.TryGetValue(cmdVec, out outCmd) == true)
            {
                if (!outCmd.Equals(cmd))
                {
                    updateCmdList.Add(cmd);
                }
            }
            else
            {
                cmdCollision.Add(cmdVec, cmd);
                updateCmdList.Add(cmd);
            }
        }
    }
示例#3
0
    public void threadProc()
    {
        //long lastTime;
        //long diffTime = -1;
#if !DEBUG_LDUSingleThread
        _bThreadOn = true;
        while (_bThreadOn)
#endif
        {
#if !DEBUG_LDUSingleThread
            if (UpdateChunkCoordList == null || UpdateChunkCoordList.Count == 0)
            {
                Thread.Sleep(100);
                continue;
            }
            List <IntVector3> tmpChunkCoordList = null;
            List <IntVector3> tmpLocalCoordList = null;

            lock (this)
            {
//				if(chunkDataMutex.WaitOne(200) == false)
//					continue;
#else
            if (UpdateChunkCoordList == null || UpdateChunkCoordList.Count == 0)
            {
                return;
            }
#endif

                //lastTime = Environment.TickCount;
                tmpChunkCoordList    = UpdateChunkCoordList;
                UpdateChunkCoordList = null;

                tmpLocalCoordList    = UpdateLocalCoordList;
                UpdateLocalCoordList = null;
            }
                        #if !DEBUG_LDUSingleThread
//			chunkDataMutex.ReleaseMutex();
                        #endif
            cmdCollision.Clear();
            List <LODUpdateCmd> updateCmdList = new List <LODUpdateCmd>();

            for (int i = 0; i < tmpChunkCoordList.Count; i++)
            {
                GenUpdateCmd(tmpChunkCoordList[i], tmpLocalCoordList[i], updateCmdList);
            }

            VFVoxel prevLODVoxel = new VFVoxel(0, 0);

            for (int list_i = 0; list_i < updateCmdList.Count; list_i++)
            {
                LODUpdateCmd thisCmd = updateCmdList[list_i];

                thisCmd.chunk = PrepareChunkData(thisCmd.chunk);

                if (thisCmd.chunk.LOD > 0)
                {
                    thisCmd.chunk.WriteVoxelAtIdx4LodUpdate(thisCmd.posToWrite.x, thisCmd.posToWrite.y, thisCmd.posToWrite.z, prevLODVoxel);
                    VFVoxelTerrain.self.SaveLoad.SaveChunkToTmpFile(thisCmd.chunk);
                }

                prevLODVoxel = ReadVoxel(thisCmd.chunk, thisCmd.posToRead);
            }
            //diffTime = Environment.TickCount - lastTime;
        }
    }