Ejemplo n.º 1
0
            public override void PrePaint(PaintCommand.UV paintCommand) //Brush br, Stroke st, PlaytimePainter painter = null)
            {
                Stroke st = paintCommand.Stroke;

                var v4 = new Vector4(st.unRepeatedUv.x, st.unRepeatedUv.y, Mathf.Floor(st.unRepeatedUv.x),
                                     Mathf.Floor(st.unRepeatedUv.y));

                _pointedUvUnTiledProperty.GlobalValue = v4;

                if (!st.firstStroke)
                {
                    return;
                }

                if (method == (ColorSetMethod.MDownColor))
                {
                    var painter = paintCommand.TryGetPainter();

                    if (painter)
                    {
                        painter.SampleTexture(st.uvTo);
                    }
                    else
                    {
                        paintCommand.Brush.Color = paintCommand.TextureData.SampleAt(st.uvTo);
                    }

                    FromColor(paintCommand.Brush, st.unRepeatedUv);
                }
                else if (method == (ColorSetMethod.MDownPosition))
                {
                    FromUv(st.uvTo);
                }

                BRUSH_SAMPLING_DISPLACEMENT.GlobalValue = new Vector4(
                    (currentPixel.x + 0.5f) / Cfg.samplingMaskSize.x,

                    (currentPixel.y + 0.5f) / Cfg.samplingMaskSize.y,

                    Cfg.samplingMaskSize.x, Cfg.samplingMaskSize.y);
            }
Ejemplo n.º 2
0
        public void SHADER_STROKE_SEGMENT_UPDATE(PaintCommand.UV command)
        {
            Brush       bc     = command.Brush;
            TextureMeta id     = command.TextureData;
            Stroke      stroke = command.Stroke;

            var isDoubleBuffer = !id.renderTexture;

            var useSingle = !isDoubleBuffer || bc.IsSingleBufferBrush();

            var blitMode = bc.GetBlitMode(false);

            command.usedAlphaBuffer = !useSingle && bc.useAlphaBuffer && bc.GetBrushType(false).SupportsAlphaBufferPainting&& blitMode.SupportsAlphaBufferPainting;

            var painter = command.TryGetPainter();

            Shader shd = null;

            if (painter)
            {
                foreach (var pl in CameraModuleBase.BrushPlugins)
                {
                    var bs = useSingle ? pl.GetBrushShaderSingleBuffer(painter) : pl.GetBrushShaderDoubleBuffer(painter);
                    if (!bs)
                    {
                        continue;
                    }
                    shd = bs;
                    break;
                }
            }

            if (!shd)
            {
                if (command.usedAlphaBuffer)
                {
                    shd = blitMode.ShaderForAlphaOutput;
                    AlphaBufferSetDirtyBeforeRender(id, blitMode.ShaderForAlphaBufferBlit);
                }
                else
                {
                    shd = useSingle ? blitMode.ShaderForSingleBuffer : blitMode.ShaderForDoubleBuffer;
                }
            }


            if (!useSingle && !RenderTextureBuffersManager.secondBufferUpdated)
            {
                RenderTextureBuffersManager.UpdateBufferTwo();
            }

            SHADER_BRUSH_UPDATE(command);

            TargetTexture = command.usedAlphaBuffer ? AlphaBuffer : id.CurrentRenderTexture();

            if (isDoubleBuffer)
            {
                PainterShaderVariables.DESTINATION_BUFFER.GlobalValue = BackBuffer;
            }

            CurrentShader = shd;
        }
Ejemplo n.º 3
0
            public virtual void PaintPixelsInRam(PaintCommand.UV command)
            {
                Brush  br = command.Brush;
                Stroke st = command.Stroke;

                var deltaUv = st.uvTo - st.uvFrom;

                if (deltaUv.magnitude > (0.2f + st.avgBrushSpeed * 3))
                {
                    deltaUv = Vector2.zero; // This is made to avoid glitch strokes on seams
                }
                else
                {
                    st.avgBrushSpeed = (st.avgBrushSpeed + deltaUv.magnitude) / 2;
                }

                var alpha = Mathf.Clamp01(br.Flow * (Application.isPlaying ? Time.deltaTime : 0.1f));

                var id = command.TextureData;

                var deltaPos = st.DeltaWorldPos;

                float steps = 1;

                if (id.disableContiniousLine)
                {
                    st.uvFrom  = st.uvTo;
                    st.posFrom = st.posTo;
                }
                else
                {
                    var uvDist    = (deltaUv.magnitude * id.width * 8 / br.Size(false));
                    var worldDist = st.DeltaWorldPos.magnitude;

                    steps = (int)Mathf.Max(1, IsAWorldSpaceBrush ? worldDist : uvDist);

                    deltaUv  /= steps;
                    deltaPos /= steps;

                    st.uvFrom  += deltaUv;
                    st.posFrom += deltaPos;
                }

                Action <PaintCommand.UV> blitMethod = null;

                command.strokeAlphaPortion = alpha;

                var painter = command.TryGetPainter();

                foreach (var p in CameraModuleBase.BrushPlugins)
                {
                    if (p.IsEnabledFor(painter, id, br))
                    {
                        p.PaintPixelsInRam(command);//st, alpha, id, br, painter);
                        blitMethod = p.PaintPixelsInRam;
                        break;
                    }
                }

                if (blitMethod == null)
                {
                    blitMethod = BlitFunctions.Paint;
                    blitMethod(command);
                }

                for (float i = 1; i < steps; i++)
                {
                    st.uvFrom  += deltaUv;
                    st.posFrom += deltaPos;
                    blitMethod(command);
                }

                command.OnStrokeComplete();//.AfterStroke(st);
            }
Ejemplo n.º 4
0
        public void SHADER_BRUSH_UPDATE(PaintCommand.UV command)
        {
            Brush brush = command.Brush;

            var id = command.TextureData;

            var rendTex = id.TargetIsRenderTexture();

            var brushType = brush.GetBrushType(!rendTex);

            var is3DBrush = command.Is3DBrush;

            #region Brush

            brush.previewDirty = false;

            PainterShaderVariables.BrushColorProperty.GlobalValue = brush.Color;

            PainterShaderVariables.BrushMaskProperty.GlobalValue = brush.mask.ToVector4();

            brushType.OnShaderBrushUpdate(brush);

            if (rendTex)
            {
                PainterShaderVariables.SourceMaskProperty.GlobalValue = brush.useMask ? Data.masks.TryGet(brush.selectedSourceMask) : null;
            }

            PainterShaderVariables.MaskDynamicsProperty.GlobalValue = new Vector4(
                brush.maskTiling,
                rendTex ? brush.hardness * brush.hardness : 0,     // y - Hardness is 0 to do correct preview for Texture2D brush
                ((brush.flipMaskAlpha && brush.useMask) ? 0 : 1),  // z - flip mask if any
                (brush.maskFromGreyscale && brush.useMask) ? 1 : 0);

            PainterShaderVariables.MaskOffsetProperty.GlobalValue = brush.maskOffset.ToVector4();

            float brushSizeUvSpace = brush.Size(is3DBrush) / (id == null ? 256 : Mathf.Min(id.width, id.height));

            PainterShaderVariables.BrushFormProperty.GlobalValue = new Vector4(
                command.strokeAlphaPortion, // x - transparency
                brush.Size(is3DBrush),      // y - scale for sphere
                brushSizeUvSpace,           // z - scale for uv space
                brush.blurAmount);          // w - blur amount

            #endregion


            if (id == null)
            {
                return;
            }

            var blitMode = brush.GetBlitMode(!rendTex);

            var useAlphaBuffer = (brush.useAlphaBuffer && blitMode.SupportsAlphaBufferPainting && rendTex);

            float useTransparentLayerBackground = 0;

            PainterShaderVariables.OriginalTextureTexelSize.GlobalValue = new Vector4(
                1f / id.width,
                1f / id.height,
                id.width,
                id.height
                );

            var painter = command.TryGetPainter();

            if (id.isATransparentLayer && painter)
            {
                var md  = painter.MatDta;
                var mat = md.material;
                if (md != null && md.usePreviewShader && mat)
                {
                    var mt = mat.mainTexture;
                    PainterShaderVariables.TransparentLayerUnderProperty.GlobalValue = mt;
                    useTransparentLayerBackground = (mt && (id != mt.GetImgDataIfExists())) ? 1 : 0;
                }
            }

            PainterShaderVariables.AlphaBufferConfigProperty.GlobalValue = new Vector4(
                brush.alphaLimitForAlphaBuffer,
                brush.worldSpaceBrushPixelJitter ? 1 : 0,
                useAlphaBuffer ? 1 : 0,
                0);

            PainterShaderVariables.AlphaPaintingBuffer.GlobalValue = AlphaBuffer;

            brushType.SetKeyword(id.useTexCoord2);

            QcUnity.SetShaderKeyword(PainterShaderVariables.BRUSH_TEXCOORD_2, id.useTexCoord2);

            //if (blitMode.SupportsTransparentLayer)
            QcUnity.SetShaderKeyword(PainterShaderVariables.TARGET_TRANSPARENT_LAYER, id.isATransparentLayer);

            blitMode.SetKeyword(id).SetGlobalShaderParameters();

            if (rendTex && blitMode.UsingSourceTexture)
            {
                PainterShaderVariables.SourceTextureProperty.GlobalValue   = Data.sourceTextures.TryGet(brush.selectedSourceTexture);
                PainterShaderVariables.TextureSourceParameters.GlobalValue = new Vector4(
                    (float)brush.srcColorUsage,
                    brush.clampSourceTexture ? 1f : 0f,
                    useTransparentLayerBackground,
                    brush.ignoreSrcTextureTransparency ? 1f : 0f
                    );
            }
        }