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;
}
}
|