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); }