/// <summary> /// Update the fog of war's visibility. /// </summary> protected void UpdateBuffer() { // Use the texture blend time, thus estimating the time this update will finish // Doing so helps avoid visible changes in blending caused by the blended result being X milliseconds behind. float factor = (textureBlendTime > 0f) ? Mathf.Clamp01(blendFactor + elapsed / textureBlendTime) : 1f; // Clear the buffer's red channel (channel used for current visibility -- it's updated right after) for (int i = 0, imax = buffer0.Length; i < imax; ++i) { buffer0[i] = Color32.Lerp(buffer0[i], buffer1[i], factor); buffer1[i].r = 0; } // For conversion from world coordinates to texture coordinates float worldToTex = (float)textureSize / chunkSize; // Update the visibility buffer, one revealer at a time for (int i = 0; i < MangoFogInstance.revealers.size; ++i) { IMangoFogRevealer rev = MangoFogInstance.revealers[i]; if (rev.IsValid()) { if (rev.GetRevealerType() == RevealerType.Radius) { RevealUsingRadius(rev, worldToTex); } else { RevealUsingLOS(rev, worldToTex); } } } // Blur the final visibility data for (int i = 0; i < blurIterations; ++i) { BlurVisibility(); } // Reveal the map based on what's currently visible RevealMap(); // Merge two buffer to one MergeBuffer(); //ready to update the texture , multi chunk experimental only changeStates[chunkID] = 2; }
protected void UpdateRevealers(int deltaMS) { // Add all items scheduled to be added if (revealersAdded.size > 0) { lock (revealersAdded) { while (revealersAdded.size > 0) { int index = revealersAdded.size - 1; revealers.Add(revealersAdded.buffer[index]); revealersAdded.RemoveAt(index); } } } // Remove all items scheduled for removal if (revealersRemoved.size > 0) { lock (revealersRemoved) { while (revealersRemoved.size > 0) { int index = revealersRemoved.size - 1; revealers.Remove(revealersRemoved.buffer[index]); revealersRemoved.RemoveAt(index); } } } for (int i = revealers.size - 1; i >= 0; i--) { IMangoFogRevealer revealer = revealers[i]; revealer.Update(deltaMS); if (!revealer.IsValid()) { revealer.Release(); } } }