Esempio n. 1
0
        public override void OnPaintingDrag(PlaytimePainter painter)
        {
            if (!recording)
            {
                return;
            }

            var stroke = painter.stroke;

            if (stroke.MouseDownEvent)
            {
                _prevDir    = Vector2.zero;
                _prevPosDir = Vector3.zero;
            }

            var canRecord = stroke.MouseDownEvent || stroke.MouseUpEvent;

            var worldSpace = painter.Is3DBrush();

            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.MouseDownEvent)
                {
                    stroke.uvTo  = _lastUv;
                    stroke.posTo = _lastPos;
                }

                _strokeDistance = 0;

                var data = EncodeStroke(painter).ToString();
                recordedStrokes.Add(data);
                recordedStrokesForUndoRedo.Add(data);

                if (!stroke.MouseDownEvent)
                {
                    stroke.uvTo  = hold;
                    stroke.posTo = holdV3;
                }
            }

            _lastUv  = stroke.uvTo;
            _lastPos = stroke.posTo;
        }