public CfgEncoder EncodeStroke(PlaytimePainter painter) { var encoder = new CfgEncoder(); var stroke = painter.stroke; if (stroke.mouseDwn) { encoder.Add("brush", GlobalBrush.EncodeStrokeFor(painter)) // Brush is unlikely to change mid stroke .Add_String("trg", parentMeta.TargetIsTexture2D() ? "C" : "G"); } encoder.Add("s", stroke.Encode(parentMeta.TargetIsRenderTexture() && GlobalBrush.IsA3DBrush(painter))); return(encoder); }
public override void OnPaintingDrag(PlaytimePainter painter) { if (!recording) { return; } var stroke = painter.stroke; if (stroke.mouseDwn) { _prevDir = Vector2.zero; _prevPosDir = Vector3.zero; } var canRecord = stroke.mouseDwn || stroke.mouseUp; var worldSpace = GlobalBrush.IsA3DBrush(painter); if (!canRecord) { var size = GlobalBrush.Size(worldSpace); if (worldSpace) { var dir = stroke.posTo - _lastPos; var dot = Vector3.Dot(dir.normalized, _prevPosDir); canRecord |= (_strokeDistance > size * 10) || ((dir.magnitude > size * 0.01f) && (_strokeDistance > size) && (dot < 0.9f)); var fullDist = _strokeDistance + dir.magnitude; _prevPosDir = (_prevPosDir * _strokeDistance + dir).normalized; _strokeDistance = fullDist; } else { size /= parentMeta.width; var dir = stroke.uvTo - _lastUv; var dot = Vector2.Dot(dir.normalized, _prevDir); canRecord |= (_strokeDistance > size * 5) || (_strokeDistance * parentMeta.width > 10) || ((dir.magnitude > size * 0.01f) && (dot < 0.8f)); var fullDist = _strokeDistance + dir.magnitude; _prevDir = (_prevDir * _strokeDistance + dir).normalized; _strokeDistance = fullDist; } } if (canRecord) { var hold = stroke.uvTo; var holdV3 = stroke.posTo; if (!stroke.mouseDwn) { stroke.uvTo = _lastUv; stroke.posTo = _lastPos; } _strokeDistance = 0; var data = EncodeStroke(painter).ToString(); recordedStrokes.Add(data); recordedStrokesForUndoRedo.Add(data); if (!stroke.mouseDwn) { stroke.uvTo = hold; stroke.posTo = holdV3; } } _lastUv = stroke.uvTo; _lastPos = stroke.posTo; }