Ejemplo n.º 1
0
    private void CalculateCircular(FOWPlayerData playerData, FOWMapData mapData)
    {
        Vector3 playerPositionLS = m_FOWData.WorldToLocal(playerData.position);

        int rx = (int)(playerData.radius * invDeltaX);
        int rz = (int)(playerData.radius * invDeltaZ);
        int rs = rx * rx;
        int x  = Mathf.FloorToInt((playerPositionLS.x) * invDeltaX);
        int z  = Mathf.FloorToInt((playerPositionLS.z) * invDeltaZ);

        int beginx = Mathf.Max(0, x - rx);
        int beginy = Mathf.Max(0, z - rz);
        int endx   = Mathf.Min(texWidth, x + rx);
        int endy   = Mathf.Min(texHeight, z + rz);

        for (int j = beginy; j < endy; j++)
        {
            for (int i = beginx; i < endx; i++)
            {
                int dx   = i - x;
                int dy   = j - z;
                int rads = dx * dx + dy * dy;
                if (rads <= rs && !mapData[i, j])
                {
                    SetVisible(i, j);
                }
            }
        }
    }
Ejemplo n.º 2
0
    public void Init(FOWData data)
    {
        m_FOWData = data;

        int length = m_FOWData.m_TexWidth * m_FOWData.m_TexHeight;

        if (m_Fowtexture == null)
        {
            m_Fowtexture            = new RenderTexture(texWidth, texHeight, 0, RenderTextureFormat.ARGB32);
            m_Fowtexture.wrapMode   = TextureWrapMode.Clamp;
            m_Fowtexture.filterMode = FilterMode.Bilinear;
            m_Fowtexture.Create();
        }

        if (m_SDFMaterial == null)
        {
            m_SDFMaterial = new Material(Shader.Find("Hidden/FOWJumpFloodSDF"));
        }

        if (m_ShadowSDFMaterial == null)
        {
            m_ShadowSDFMaterial = new Material(Shader.Find("Hidden/FOWShadowSDF"));
        }

        if (m_BlurMaterial == null)
        {
            m_BlurMaterial = new Material(Shader.Find("Hidden/FOWBlurSDF"));
        }

        if (m_MapData == null)
        {
            m_MapData = new FOWMapData();
            m_MapData.Init(data);
        }

        if (m_SDFBuffer == null)
        {
            m_SDFBuffer = new Color[length];
        }

        if (m_SDFTexture == null)
        {
            m_SDFTexture            = new Texture2D(texWidth, texHeight, TextureFormat.ARGB32, false);
            m_SDFTexture.wrapMode   = TextureWrapMode.Clamp;
            m_SDFTexture.filterMode = FilterMode.Bilinear;
        }

        if (texWidth > texHeight)
        {
            m_TextureSizeScale = new Vector2(1.0f, (float)texHeight / texWidth);
        }
        else
        {
            m_TextureSizeScale = new Vector2((float)texWidth / texHeight, 1.0f);
        }

        m_TextureTexelSize = new Vector2(1.0f / texWidth, 1.0f / texHeight);
    }
Ejemplo n.º 3
0
    private void CalculateFOVMask(FOWPlayerData playerData, FOWMapData mapData)
    {
        Vector3 playerLocalPosition = m_FOWData.WorldToLocal(playerData.position);
        float   radiusSq            = playerData.radiusSqr;

        int x = Mathf.FloorToInt((playerLocalPosition.x) * invDeltaX);
        int z = Mathf.FloorToInt((playerLocalPosition.z) * invDeltaZ);

        if (x < 0 || x >= texWidth)
        {
            return;
        }
        if (z < 0 || z >= texHeight)
        {
            return;
        }

        if (mapData[x, z])
        {
            return;
        }

        m_RootPixelQueue.Clear();
        m_ArrivedPixels.Clear();

        m_RootPixelQueue.Enqueue(new Vector2Int(x, z));
        m_ArrivedPixels.Add(z * texWidth + x);
        SetVisible(x, z);

        while (m_RootPixelQueue.Count > 0)
        {
            var root = m_RootPixelQueue.Dequeue();
            if (mapData[root.x, root.y])
            {
                if (PreRayCast(root, x, z))
                {
                    int index = root.y * texWidth + root.x;
                    if (!m_ArrivedPixels.Contains(index))
                    {
                        m_ArrivedPixels.Add(index);
                    }
                    SetVisible(root.x, root.y);
                }
                else
                {
                    RayCast(root, x, z, playerData);
                }

                continue;
            }

            // spread the visible area around root position in four direction
            SetVisibleAtPosition(root.x - 1, root.y, x, z, radiusSq);
            SetVisibleAtPosition(root.x, root.y - 1, x, z, radiusSq);
            SetVisibleAtPosition(root.x + 1, root.y, x, z, radiusSq);
            SetVisibleAtPosition(root.x, root.y + 1, x, z, radiusSq);
        }
    }
Ejemplo n.º 4
0
    public void Calculate(FOWPlayerData playerData, FOWMapData mapData)
    {
        switch (m_MaskType)
        {
        case MaskType.Circular:
            CalculateCircular(playerData, mapData);
            break;

        case MaskType.AccurateFOV:
        case MaskType.BasicFOV:
            CalculateFOVMask(playerData, mapData);
            break;

        default:
            CalculateCircular(playerData, mapData);
            break;
        }
    }
Ejemplo n.º 5
0
    public void Destroy()
    {
        if (m_Fowtexture != null)
        {
            m_Fowtexture.Release();
            m_Fowtexture = null;
        }

        if (m_MapData != null)
        {
            m_MapData.DeInit();
            m_MapData = null;
        }

        if (m_SDFTexture != null)
        {
            Object.DestroyImmediate(m_SDFTexture);
        }
    }