Exemplo n.º 1
0
    /// <summary>
    /// Gets the tile at position. This can be used to obtain tile data, etc
    /// -1 = no data or empty tile
    /// </summary>
    public Color GetInterpolatedColorAtPosition(Vector3 position)
    {
        Vector3 localPosition = transform.worldToLocalMatrix.MultiplyPoint(position);
        int     x             = (int)((localPosition.x - data.tileOrigin.x) / data.tileSize.x);
        int     y             = (int)((localPosition.y - data.tileOrigin.y) / data.tileSize.y);

        if (colorChannel == null || colorChannel.IsEmpty)
        {
            return(Color.white);
        }

        if (x < 0 || x >= width ||
            y < 0 || y >= height)
        {
            return(colorChannel.clearColor);
        }

        int        offset;
        ColorChunk colorChunk = colorChannel.FindChunkAndCoordinate(x, y, out offset);

        if (colorChunk.Empty)
        {
            return(colorChannel.clearColor);
        }
        else
        {
            int   colorChunkRowOffset = partitionSizeX + 1;
            Color tileColorx0y0       = colorChunk.colors[offset];
            Color tileColorx1y0       = colorChunk.colors[offset + 1];
            Color tileColorx0y1       = colorChunk.colors[offset + colorChunkRowOffset];
            Color tileColorx1y1       = colorChunk.colors[offset + colorChunkRowOffset + 1];

            float wx = x * data.tileSize.x + data.tileOrigin.x;
            float wy = y * data.tileSize.y + data.tileOrigin.y;

            float ix = (localPosition.x - wx) / data.tileSize.x;
            float iy = (localPosition.y - wy) / data.tileSize.y;

            Color cy0 = Color.Lerp(tileColorx0y0, tileColorx1y0, ix);
            Color cy1 = Color.Lerp(tileColorx0y1, tileColorx1y1, ix);
            return(Color.Lerp(cy0, cy1, iy));
        }
    }