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; }
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); } } }
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; } }