summaryrefslogtreecommitdiff
path: root/Assets/ThirdParty/MaterializeFX/Scripts/MfxController.cs
blob: 35aaa3e7e1d4563b3d6ed9cceb0061937b074fb9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
using UnityEngine;

namespace Assets.MaterializeFX.Scripts
{
    internal sealed class MfxController : MonoBehaviour
    {
        private const string MfxMaskOffsetProperty = "_MaskOffset";
        private const string MfxMaskPositionProperty = "_MaskWorldPosition";

        public AnimationCurve MaskOffsetCurve = AnimationCurve.Linear(0f, 0f, 1f, 1f);
        public float ScaleTimeFactor = 1;
        public float ScaleOffsetFactor = 1;
        public bool ModifyChildren = true;
        public GameObject TargetObject;

        public bool ByDistance;
        public GameObject DistanceBasedObject;

        public bool ReplaceMaterial;
        public bool ReplaceMaterialMode; //Runtime, Editor
        public Material MfxMaterial;

        private float _startTime;
        private bool _isEnabled;
        private MfxObjectMaterialUpdater _mfxObjectMaterialUpdater;
        private Transform _targetTransform;

        public GameObject Target
        {
            get
            {
                return TargetObject != null ? TargetObject : gameObject;
            }
        }

        public void ReplaceMaterials()
        {
            _mfxObjectMaterialUpdater.Replace(MfxMaterial);
        }

        public void RevertMaterials()
        {
            _mfxObjectMaterialUpdater.Revert();
        }

        private void Start()
        {
            _mfxObjectMaterialUpdater = new MfxObjectMaterialUpdater(Target, ModifyChildren, ReplaceMaterial, MfxMaterial);

            _targetTransform = Target.transform;
            _startTime = Time.time;
        }

        private void Update()
        {
            if (!_isEnabled || _targetTransform == null)
                return;

            if (ByDistance)
            {
                if (DistanceBasedObject == null)
                {
                    Debug.LogError("By distance property was set, but object was not set");
                    return;
                }

                _mfxObjectMaterialUpdater.SetVector(MfxMaskPositionProperty, DistanceBasedObject.transform.position);

                return;
            }

            var time = Time.time - _startTime;
            var maskOffset = MaskOffsetCurve.Evaluate(time / ScaleTimeFactor) * ScaleOffsetFactor;
            _mfxObjectMaterialUpdater.SetFloat(MfxMaskOffsetProperty, maskOffset);
        }

        private void OnEnable()
        {
            _isEnabled = true;
        }

        private void OnDisable()
        {
            _isEnabled = false;
        }
    }
}