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