public bool PaintRenderTexture(BrushStrokePainterImage cfg) { var stroke = cfg.stroke; var image = cfg.image; var painter = cfg.painter; var bc = cfg.brush; var vt = painter.GetVolumeTexture(); stroke.posFrom = stroke.posTo; BrushTypeSphere.Inst.BeforeStroke(painter, bc, stroke); VOLUME_POSITION_N_SIZE_BRUSH.GlobalValue = vt.PosSize4Shader; VOLUME_H_SLICES_BRUSH.GlobalValue = vt.Slices4Shader; VOLUME_BRUSH_DIRECTION.GlobalValue = stroke.collisionNormal.ToVector4(0); image.useTexCoord2 = false; bool alphaBuffer; TexMGMT.SHADER_STROKE_SEGMENT_UPDATE(bc, bc.Speed * 0.05f, image, stroke, painter, out alphaBuffer); stroke.SetWorldPosInShader(); RenderTextureBuffersManager.Blit(null, image.CurrentRenderTexture(), TexMGMT.brushRenderer.meshRenderer.sharedMaterial.shader); BrushTypeSphere.Inst.AfterStroke_Painter(painter, bc, stroke, alphaBuffer, image); return(true); }
public bool PaintRenderTextureInternal(PaintCommand.UV cfg) { var stroke = cfg.Stroke; var image = cfg.TextureData; var bc = cfg.Brush; var vt = cfg.TextureData.GetVolumeTextureData(); //painter.GetVolumeTexture(); stroke.posFrom = stroke.posTo; BrushTypes.Sphere.Inst.BeforeStroke(cfg); //bc, stroke, painter); VOLUME_POSITION_N_SIZE_BRUSH.GlobalValue = vt.PosSize4Shader; VOLUME_H_SLICES_BRUSH.GlobalValue = vt.Slices4Shader; VOLUME_BRUSH_DIRECTION.GlobalValue = stroke.collisionNormal.ToVector4(smoothing); UseSmoothing.Enabled = smoothing > 0; image.useTexCoord2 = false; cfg.strokeAlphaPortion = Mathf.Clamp01(bc.Flow * 0.05f); TexMGMT.SHADER_STROKE_SEGMENT_UPDATE(cfg); stroke.SetWorldPosInShader(); RenderTextureBuffersManager.Blit(null, image.CurrentRenderTexture(), TexMGMT.brushRenderer.GetMaterial().shader); BrushTypes.Sphere.Inst.AfterStroke(cfg); return(true); }
public override void PaintRenderTexture(PlaytimePainter painter, BrushConfig br, StrokeVector st) { BeforeStroke(br, st, painter); if (st.CrossedASeam()) { st.uvFrom = st.uvTo; } TextureMeta id = painter.TexMeta; bool alphaBuffer; TexMGMT.SHADER_STROKE_SEGMENT_UPDATE(br, br.Speed * 0.05f, id, st, out alphaBuffer, painter); RtBrush.localScale = Vector3.one * br.StrokeWidth(id.width, false); BrushMesh = PainterCamera.BrushMeshGenerator.GetQuad(); RtBrush.localRotation = Quaternion.identity; RtBrush.localPosition = st.BrushWorldPosition; TexMGMT.Render(); AfterStroke_Painter(painter, br, st, alphaBuffer, id); }
public static void Paint(Vector2 uv, BrushConfig br, RenderTexture rt) { var stroke = new StrokeVector(uv) { firstStroke = false }; var id = rt.GetTextureMeta(); bool alphaBuffer; TexMGMT.SHADER_STROKE_SEGMENT_UPDATE(br, br.Speed * 0.05f, id, stroke, out alphaBuffer); float width = br.StrokeWidth(id.width, false); RtBrush.localScale = Vector3.one; BrushMesh = PainterCamera.BrushMeshGenerator.GetLongMesh(0, width); RtBrush.localRotation = Quaternion.Euler(new Vector3(0, 0, Vector2.Angle(Vector2.up, Vector2.zero))); RtBrush.localPosition = StrokeVector.BrushWorldPositionFrom(stroke.uvTo); TexMGMT.Render(); AfterStroke_NoPainter(br, alphaBuffer, rt); }
public virtual void PaintRenderTexture(PlaytimePainter painter, BrushConfig br, StrokeVector st) { BeforeStroke(painter, br, st); if (st.CrossedASeam()) { st.uvFrom = st.uvTo; } var id = painter.TexMeta; bool alphaBuffer; TexMGMT.SHADER_STROKE_SEGMENT_UPDATE(br, br.Speed * 0.05f, id, st, painter, out alphaBuffer); var rb = RtBrush; rb.localScale = Vector3.one; var direction = st.DeltaUv; var length = direction.magnitude; BrushMesh = PainterCamera.BrushMeshGenerator.GetLongMesh(length * 256, br.StrokeWidth(id.width, false)); rb.localRotation = Quaternion.Euler(new Vector3(0, 0, (direction.x > 0 ? -1 : 1) * Vector2.Angle(Vector2.up, direction))); rb.localPosition = StrokeVector.BrushWorldPositionFrom((st.uvFrom + st.uvTo) * 0.5f); TexMGMT.Render(); AfterStroke_Painter(painter, br, st, alphaBuffer, id); }
public static void Paint(Vector2 uv, Brush br, RenderTexture rt) { var command = new PaintCommand.UV(new Stroke(uv) { firstStroke = false }, rt.GetTextureMeta(), br) { strokeAlphaPortion = Mathf.Clamp01(br.Flow * 0.05f) }; TexMGMT.SHADER_STROKE_SEGMENT_UPDATE(command); // br, br.Speed * 0.05f, id, stroke, out alphaBuffer); float width = br.StrokeWidth(command.TextureData.width, false); RtBrush.localScale = Vector3.one; BrushMesh = PainterCamera.BrushMeshGenerator.GetLongMesh(0, width); RtBrush.localRotation = Quaternion.Euler(new Vector3(0, 0, Vector2.Angle(Vector2.up, Vector2.zero))); RtBrush.localPosition = Stroke.BrushWorldPositionFrom(command.Stroke.uvTo); TexMGMT.Render(); br.GetBrushType(false).AfterStroke(command); }
public override void PaintRenderTextureUvSpace(PaintCommand.UV command) { Brush br = command.Brush; Stroke st = command.Stroke; TextureMeta id = command.TextureData; BeforeStroke(command); if (st.CrossedASeam()) { st.uvFrom = st.uvTo; } command.strokeAlphaPortion = Mathf.Clamp01(br.Flow * 0.05f); TexMGMT.SHADER_STROKE_SEGMENT_UPDATE(command);// br, br.Speed * 0.05f, id, st, out alphaBuffer, painter); RtBrush.localScale = Vector3.one * br.StrokeWidth(id.width, false); BrushMesh = PainterCamera.BrushMeshGenerator.GetQuad(); RtBrush.localRotation = Quaternion.identity; RtBrush.localPosition = st.BrushWorldPosition; TexMGMT.Render(); AfterStroke(command);//painter, br, st, alphaBuffer, id); }
public virtual void PaintRenderTextureUvSpace(PaintCommand.UV command) { TextureMeta textureMeta = command.TextureData; Brush br = command.Brush; Stroke st = command.Stroke; BeforeStroke(command); if (st.CrossedASeam()) { st.uvFrom = st.uvTo; } command.strokeAlphaPortion = Mathf.Clamp01(br.Flow * 0.05f); TexMGMT.SHADER_STROKE_SEGMENT_UPDATE(command); var rb = RtBrush; rb.localScale = Vector3.one; var direction = st.DeltaUv; var length = direction.magnitude; BrushMesh = PainterCamera.BrushMeshGenerator.GetLongMesh(length * 256, br.StrokeWidth(textureMeta.width, false)); rb.localRotation = Quaternion.Euler(new Vector3(0, 0, (direction.x > 0 ? -1 : 1) * Vector2.Angle(Vector2.up, direction))); rb.localPosition = Stroke.BrushWorldPositionFrom((st.uvFrom + st.uvTo) * 0.5f); TexMGMT.Render(); AfterStroke(command); }
private static void PrepareSphereBrush(TextureMeta id, BrushConfig br, StrokeVector stroke, out bool alphaBuffer, PlaytimePainter painter = null) { // if (stroke.mouseDwn) // stroke.posFrom = stroke.posTo; TexMGMT.SHADER_STROKE_SEGMENT_UPDATE(br, br.Speed * 0.05f, id, stroke, out alphaBuffer, painter); var offset = id.offset - stroke.unRepeatedUv.Floor(); stroke.SetWorldPosInShader(); PainterShaderVariables.BRUSH_EDITED_UV_OFFSET.GlobalValue = new Vector4(id.tiling.x, id.tiling.y, offset.x, offset.y); PainterShaderVariables.BRUSH_ATLAS_SECTION_AND_ROWS.GlobalValue = new Vector4(0, 0, 1, 0); }
private static void PrepareSphereBrush(PaintCommand.WorldSpace command) { Brush br = command.Brush; var td = command.TextureData; // if (stroke.mouseDwn) // stroke.posFrom = stroke.posTo; command.strokeAlphaPortion = Mathf.Clamp01(br.Flow * 0.05f); TexMGMT.SHADER_STROKE_SEGMENT_UPDATE(command); // br, br.Speed * 0.05f, id, stroke, out alphaBuffer, painter); var offset = command.TextureData.offset - command.Stroke.unRepeatedUv.Floor(); command.Stroke.SetWorldPosInShader(); PainterShaderVariables.BRUSH_EDITED_UV_OFFSET.GlobalValue = new Vector4(td.tiling.x, td.tiling.y, offset.x, offset.y); PainterShaderVariables.BRUSH_ATLAS_SECTION_AND_ROWS.GlobalValue = new Vector4(0, 0, 1, 0); }
public override void PaintRenderTexture(PlaytimePainter painter, BrushConfig br, StrokeVector st) { BeforeStroke(br, st, painter); var id = painter.TexMeta; if (st.firstStroke || br.decalContentious) { if (br.rotationMethod == RotationMethod.FaceStrokeDirection) { var delta = st.uvTo - _previousUv; var portion = Mathf.Clamp01(delta.magnitude * id.width * 4 / br.Size(false)); var newAngle = Vector2.SignedAngle(Vector2.up, delta) + br.decalAngleModifier; br.decalAngle = Mathf.LerpAngle(br.decalAngle, newAngle, portion); _previousUv = st.uvTo; } bool alphaBuffer; TexMGMT.SHADER_STROKE_SEGMENT_UPDATE(br, 1, id, st, out alphaBuffer, painter); var tf = RtBrush; tf.localScale = Vector3.one * br.Size(false); tf.localRotation = Quaternion.Euler(new Vector3(0, 0, br.decalAngle)); BrushMesh = PainterCamera.BrushMeshGenerator.GetQuad(); st.uvTo = st.uvTo.To01Space(); var deltaUv = st.DeltaUv; var uv = st.uvTo; if (br.rotationMethod == RotationMethod.FaceStrokeDirection && !st.firstStroke) { var length = Mathf.Max(deltaUv.magnitude * 2 * id.width / br.Size(false), 1); var scale = tf.localScale; if ((Mathf.Abs(Mathf.Abs(br.decalAngleModifier) - 90)) < 40) { scale.x *= length; } else { scale.y *= length; } tf.localScale = scale; uv -= deltaUv * ((length - 1) * 0.5f / length); } tf.localPosition = StrokeVector.BrushWorldPositionFrom(uv); TexMGMT.Render(); AfterStroke_Painter(painter, br, st, alphaBuffer, id); } else { painter.AfterStroke(st); } }