示例#1
0
        internal void _PreUpdateMask(UpdateContext context, uint maskId)
        {
            //_maskFlag: 0-new mask, 1-active mask, 2-mask complete
            if (_maskFlag == 0)
            {
                if (_stencilEraser == null)
                {
                    _stencilEraser = new StencilEraser(gameObject.transform);
                    _stencilEraser.meshFilter.mesh = mesh;
                }
                else
                {
                    _stencilEraser.enabled = true;
                }
            }

            _maskFlag = 1;

            if (_manager != null)
            {
                //这里使用maskId而不是clipInfo.clipId,是因为遮罩有两个用途,一个是写入遮罩,一个是擦除,两个不能用同一个材质
                Material mat = _manager.GetMaterial((int)MaterialFlags.AlphaMask + _materialFlags, BlendMode.Normal, maskId);
                if (!Material.ReferenceEquals(mat, _stencilEraser.meshRenderer.sharedMaterial))
                {
                    _stencilEraser.meshRenderer.sharedMaterial = mat;
                }

                context.ApplyAlphaMaskProperties(mat, true);
            }
        }
示例#2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="context"></param>
        /// <param name="alpha"></param>
        /// <param name="grayed"></param>
        public void Update(UpdateContext context, float alpha, bool grayed)
        {
            Stats.GraphicsCount++;

            if (_meshDirty)
            {
                _alpha = alpha;
                UpdateMeshNow();
            }
            else if (_alpha != alpha)
            {
                ChangeAlpha(alpha);
            }

            if (_propertyBlock != null && _blockUpdated)
            {
                meshRenderer.SetPropertyBlock(_propertyBlock);
                _blockUpdated = false;
            }

            if (_customMatarial != 0)
            {
                if ((_customMatarial & 2) != 0 && _material != null)
                {
                    context.ApplyClippingProperties(_material, false);
                }
            }
            else
            {
                if (_manager != null)
                {
                    if (_maskFlag == 1)
                    {
                        _material = _manager.GetMaterial((int)MaterialFlags.AlphaMask + _materialFlags, BlendMode.Normal, context.clipInfo.clipId);
                        context.ApplyAlphaMaskProperties(_material, false);
                    }
                    else
                    {
                        int matFlags = _materialFlags;
                        if (grayed)
                        {
                            matFlags |= (int)MaterialFlags.Grayed;
                        }

                        if (context.clipped)
                        {
                            if (context.stencilReferenceValue > 0)
                            {
                                matFlags |= (int)MaterialFlags.StencilTest;
                            }
                            if (context.rectMaskDepth > 0)
                            {
                                if (context.clipInfo.soft)
                                {
                                    matFlags |= (int)MaterialFlags.SoftClipped;
                                }
                                else
                                {
                                    matFlags |= (int)MaterialFlags.Clipped;
                                }
                            }

                            _material = _manager.GetMaterial(matFlags, blendMode, context.clipInfo.clipId);
                            if (_manager.firstMaterialInFrame)
                            {
                                context.ApplyClippingProperties(_material, true);
                            }
                        }
                        else
                        {
                            _material = _manager.GetMaterial(matFlags, blendMode, 0);
                        }
                    }
                }
                else
                {
                    _material = null;
                }

                if (!Material.ReferenceEquals(_material, meshRenderer.sharedMaterial))
                {
                    meshRenderer.sharedMaterial = _material;
                }
            }

            if (_maskFlag != 0)
            {
                if (_maskFlag == 1)
                {
                    _maskFlag = 2;
                }
                else
                {
                    if (_stencilEraser != null)
                    {
                        _stencilEraser.enabled = false;
                    }

                    _maskFlag = 0;
                }
            }
        }