summaryrefslogtreecommitdiff
path: root/Thronefall_v1.0/Thronefall/FlatKit/Buoyancy.cs
blob: 9e876ab2c84148792e5aafd63cc4d2b1f2ca3bd5 (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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
using UnityEngine;

namespace FlatKit;

public class Buoyancy : MonoBehaviour
{
	[Tooltip("The object that contains a Water material.")]
	public Transform water;

	[Space]
	[Tooltip("Range of probing wave height for buoyancy rotation.")]
	public float size = 1f;

	[Tooltip("Max height of buoyancy going up and down.")]
	public float amplitude = 1f;

	[Space]
	[Tooltip("Optionally provide a separate material to get the wave parameters.")]
	public Material overrideWaterMaterial;

	private Material _material;

	private float _speed;

	private float _amplitude;

	private float _frequency;

	private float _direction;

	private Vector3 _originalPosition;

	private void Start()
	{
		Renderer component = water.GetComponent<Renderer>();
		_material = ((overrideWaterMaterial != null) ? overrideWaterMaterial : component.sharedMaterial);
		_speed = _material.GetFloat("_WaveSpeed");
		_amplitude = _material.GetFloat("_WaveAmplitude");
		_frequency = _material.GetFloat("_WaveFrequency");
		_direction = _material.GetFloat("_WaveDirection");
		Transform transform = base.transform;
		_originalPosition = transform.position;
	}

	private void Update()
	{
		Vector3 position = base.transform.position;
		Vector3 positionOS = water.InverseTransformPoint(position);
		position.y = GetHeightOS(positionOS) + _originalPosition.y;
		base.transform.position = position;
		base.transform.up = GetNormalWS(positionOS);
	}

	private Vector2 GradientNoiseDir(Vector2 p)
	{
		p = new Vector2(p.x % 289f, p.y % 289f);
		float num = (34f * p.x + 1f) * p.x % 289f + p.y;
		num = (34f * num + 1f) * num % 289f;
		num = num / 41f % 1f * 2f - 1f;
		return new Vector2(num - Mathf.Floor(num + 0.5f), Mathf.Abs(num) - 0.5f).normalized;
	}

	private float GradientNoise(Vector2 p)
	{
		Vector2 vector = new Vector2(Mathf.Floor(p.x), Mathf.Floor(p.y));
		Vector2 vector2 = new Vector2(p.x % 1f, p.y % 1f);
		float a = Vector3.Dot(GradientNoiseDir(vector), vector2);
		float b = Vector3.Dot(GradientNoiseDir(vector + Vector2.up), vector2 - Vector2.up);
		float a2 = Vector3.Dot(GradientNoiseDir(vector + Vector2.right), vector2 - Vector2.right);
		float b2 = Vector3.Dot(GradientNoiseDir(vector + Vector2.one), vector2 - Vector2.one);
		vector2 = vector2 * vector2 * vector2 * (vector2 * (vector2 * 6f - Vector2.one * 15f) + Vector2.one * 10f);
		return Mathf.Lerp(Mathf.Lerp(a, b, vector2.y), Mathf.Lerp(a2, b2, vector2.y), vector2.x);
	}

	private Vector3 GetNormalWS(Vector3 positionOS)
	{
		Vector3 vector = positionOS + Vector3.forward * size;
		vector.y = GetHeightOS(vector);
		Vector3 vector2 = positionOS + Vector3.right * size;
		vector2.y = GetHeightOS(vector);
		Vector3 normalized = Vector3.Cross(vector - positionOS, vector2 - positionOS).normalized;
		return water.TransformDirection(normalized);
	}

	private float SineWave(Vector3 positionOS, float offset)
	{
		float num = Time.timeSinceLevelLoad * 2f;
		float num2 = Mathf.Sin(offset + num * _speed + (positionOS.x * Mathf.Sin(offset + _direction) + positionOS.z * Mathf.Cos(offset + _direction)) * _frequency);
		if (_material.IsKeywordEnabled("_WAVEMODE_POINTY"))
		{
			num2 = 1f - Mathf.Abs(num2);
		}
		return num2 * _amplitude;
	}

	private float GetHeightOS(Vector3 positionOS)
	{
		float num = SineWave(positionOS, 0f);
		if (_material.IsKeywordEnabled("_WAVEMODE_GRID"))
		{
			num *= SineWave(positionOS, 1.57f);
		}
		return num * amplitude;
	}
}