Beispiel #1
0
    public bool IsVisibleFromMask(int maskValue)
    {
        bool ChannelOverlap()
        {
            if (useAdvancedChannelLogic)
            {
                return(maskRenderSolution[maskValue] > 0);
            }
            else
            {
                return(DimensionShaderUtils.ChannelIsOnForMaskValue(channel, maskValue));
            }
        }

        switch (effectiveVisibilityState)
        {
        case VisibilityState.invisible:
            return(false);

        case VisibilityState.partiallyVisible:
            return(ChannelOverlap());

        case VisibilityState.partiallyInvisible:
            return(!ChannelOverlap());

        case VisibilityState.visible:
            return(true);

        default:
            throw new ArgumentOutOfRangeException();
        }
    }
    void OnCompleteReadback(AsyncGPUReadbackRequest request)
    {
        if (request.hasError)
        {
            Debug.LogError("GPU readback error detected");
            return;
        }

        // This happens when the delayed async readback happens as we're exiting play mode
        if (instance == null || visibilityMaskTexture == null)
        {
            return;
        }

        // Read the color of the visibility mask texture to determine which visibility masks are active on cursor
        Texture2D visibilityMaskTex = new Texture2D(
            1,
            1,
            GraphicsFormatUtility.GetTextureFormat(visibilityMaskTexture.graphicsFormat),
            false
            );

        visibilityMaskTex.LoadRawTextureData(request.GetData <Color32>());
        visibilityMaskTex.Apply();

        // Only one pixel so we can sample at 0, 0
        Color sample = visibilityMaskTex.GetPixel(0, 0);

        visibilityMaskValue = DimensionShaderUtils.MaskValueFromSample(sample.linear);
    }