コード例 #1
0
        /// <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;
        }
コード例 #2
0
        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();
                }
            }
        }