示例#1
0
    /// <summary>
    /// Delete the specified revealer.
    /// </summary>

    static public void RemoveRevealer(IFOWRevealer rev)
    {
        if (rev != null)
        {
            lock (mRemoved) mRemoved.Add(rev);
        }
    }
示例#2
0
        public override void Dispose()
        {
            Messenger.RemoveListener <int>(MessageName.MN_CHARACTOR_BORN, AddCharactor);

            for (int i = 0; i < m_revealers.Count; i++)
            {
                IFOWRevealer revealer = m_revealers[i];
                if (revealer != null)
                {
                    revealer.Release();
                }
            }
            m_revealers.Clear();

            for (int i = 0; i < m_renders.Count; i++)
            {
                FOWRender render = m_renders[i];
                if (render != null)
                {
                    render.enabled = false;
                    UnityEngine.Object.Destroy(render.gameObject);
                }
            }
            m_renders.Clear();

            m_mapFOWRender = null;
            FOWSystem.instance.DestroySelf();
        }
示例#3
0
    /// <summary>
    /// Create a new fog revealer.
    /// </summary>

    static public void AddRevealer(IFOWRevealer rev)
    {
        if (rev != null)
        {
            lock (mAdded) mAdded.Add(rev);
        }
    }
示例#4
0
        public override void Dispose()
        {
            for (int i = 0; i < m_revealers.Count; i++)
            {
                IFOWRevealer revealer = m_revealers[i];
                if (revealer != null)
                {
                    revealer.Release();
                }
            }
            m_revealers.Clear();

            for (int i = 0; i < m_renders.Count; i++)
            {
                FOWRender render = m_renders[i];
                if (render != null)
                {
                    render.enabled = false;
                    UnityEngine.Object.Destroy(render.gameObject);
                }
            }
            m_renders.Clear();

            m_mapFOWRender = null;
            FOWSystem.instance.DestroySelf();
        }
示例#5
0
 public void DelRevealer(IFOWRevealer revealer)
 {
     if (_fowRevealers.Contains(revealer))
     {
         ReleaseRevealer(revealer);
     }
 }
示例#6
0
 protected void UpdateRevealers(int deltaMS)
 {
     for (int i = m_revealers.Count - 1; i >= 0; i--)
     {
         IFOWRevealer revealer = m_revealers[i];
         revealer.Update(deltaMS);
         if (!revealer.IsValid())
         {
             m_revealers.RemoveAt(i);
             FOWSystem.RemoveRevealer(revealer);
             revealer.Release();
         }
     }
 }
示例#7
0
    /// <summary>
    /// The fastest form of visibility updates -- radius-based, no line of sights checks.
    /// 最快的可见性更新形-基于半径,不进行视线检查。
    /// 向buffer1的r填充可见性
    /// </summary>
    void RevealUsingRadius(IFOWRevealer r, float worldToTex)
    {
        // Position relative to the fog of war
        //相对于战争迷雾的位置
        Vector3 pos    = (r.GetPosition() - mOrigin) * worldToTex;  //纹理上的坐标
        float   radius = r.GetRadius() * worldToTex - radiusOffset; //纹理上的半径

        // Coordinates we'll be dealing with
        //我们将要处理的坐标
        //RoundToInt返回四舍五入到最接近的整数的f
        int xmin = Mathf.RoundToInt(pos.x - radius);
        int ymin = Mathf.RoundToInt(pos.z - radius);
        int xmax = Mathf.RoundToInt(pos.x + radius);
        int ymax = Mathf.RoundToInt(pos.z + radius);

        int cx = Mathf.RoundToInt(pos.x);
        int cy = Mathf.RoundToInt(pos.z);

        cx = Mathf.Clamp(cx, 0, textureSize - 1);
        cy = Mathf.Clamp(cy, 0, textureSize - 1);

        int radiusSqr = Mathf.RoundToInt(radius * radius);

        for (int y = ymin; y < ymax; ++y)
        {
            if (y > -1 && y < textureSize)
            {
                int yw = y * textureSize;

                for (int x = xmin; x < xmax; ++x)
                {
                    if (x > -1 && x < textureSize)
                    {
                        int xd   = x - cx;
                        int yd   = y - cy;
                        int dist = xd * xd + yd * yd;

                        // Reveal this pixel
                        if (dist < radiusSqr)
                        {
                            mBuffer1[x + yw].r = 255;
                        }
                    }
                }
            }
        }
    }
示例#8
0
    /// <summary>
    /// Update the fog of war's visibility.
    /// </summary>

    void UpdateBuffer()
    {
        // Add all items scheduled to be added
        if (mAdded.size > 0)
        {
            lock (mAdded)
            {
                while (mAdded.size > 0)
                {
                    int index = mAdded.size - 1;
                    mRevealers.Add(mAdded.buffer[index]);
                    mAdded.RemoveAt(index);
                }
            }
        }

        // Remove all items scheduled for removal
        if (mRemoved.size > 0)
        {
            lock (mRemoved)
            {
                while (mRemoved.size > 0)
                {
                    int index = mRemoved.size - 1;
                    mRevealers.Remove(mRemoved.buffer[index]);
                    mRemoved.RemoveAt(index);
                }
            }
        }

        // 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.
        //使用纹理混合时间,从而估计此更新将完成的时间
        //这样做有助于避免由于混合结果落后X毫秒而导致混合中的可见变化。
        float factor = (textureBlendTime > 0f) ? Mathf.Clamp01(mBlendFactor + mElapsed / textureBlendTime) : 1f;

        //// Clear the buffer's red channel (channel used for current visibility -- it's updated right after)
        ////清除缓冲区的红色通道(用于当前可见性的通道-此通道将在之后立即更新)
        for (int i = 0, imax = mBuffer0.Length; i < imax; ++i)
        {
            mBuffer0[i]   = Color32.Lerp(mBuffer0[i], mBuffer1[i], factor);
            mBuffer1[i].r = 0;
        }

        // For conversion from world coordinates to texture coordinates
        //用于从世界坐标转换为纹理坐标
        float worldToTex = (float)textureSize / worldSize;

        // Update the visibility buffer, one revealer at a time
        //更新可见性缓冲区,一次显示一个
        for (int i = 0; i < mRevealers.size; ++i)
        {
            IFOWRevealer rev = mRevealers[i];
            if (rev.IsValid())
            {
                RevealUsingRadius(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();
    }
示例#9
0
 private void ReleaseRevealer(IFOWRevealer revealer)
 {
     FOWSystem.RemoveRevealer(revealer);
     revealer.Release();
 }
示例#10
0
    /// <summary>
    /// Update the fog of war's visibility.
    /// </summary>

    void UpdateBuffer()
    {
        // Add all items scheduled to be added
        if (mAdded.Count > 0)
        {
            lock (mAdded)
            {
                while (mAdded.Count > 0)
                {
                    int index = mAdded.Count - 1;
                    mRevealers.Add(mAdded[index]);
                    mAdded.RemoveAt(index);
                }
            }
        }

        // Remove all items scheduled for removal
        if (mRemoved.Count > 0)
        {
            lock (mRemoved)
            {
                while (mRemoved.Count > 0)
                {
                    int index = mRemoved.Count - 1;
                    mRevealers.Remove(mRemoved[index]);
                    mRemoved.RemoveAt(index);
                }
            }
        }

        // 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(mBlendFactor + mElapsed / textureBlendTime) : 1f;

        // Clear the buffer's red channel (channel used for current visibility -- it's updated right after)
        for (int i = 0, imax = mBuffer0.Length; i < imax; ++i)
        {
            mBuffer0[i]   = Color32.Lerp(mBuffer0[i], mBuffer1[i], factor);
            mBuffer1[i].r = 0;
        }

        // For conversion from world coordinates to texture coordinates
        float worldToTex = (float)textureSize / worldSize;

        // Update the visibility buffer, one revealer at a time
        for (int i = 0; i < mRevealers.Count; ++i)
        {
            IFOWRevealer rev = mRevealers[i];
            if (rev.IsValid())
            {
                RevealUsingRadius(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();
    }