-
Notifications
You must be signed in to change notification settings - Fork 0
/
HuygensPrinciple.cs
113 lines (112 loc) · 4.13 KB
/
HuygensPrinciple.cs
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
106
107
108
109
110
111
112
113
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class HuygensPrinciple : MonoBehaviour {
public static HuygensPrinciple instance;
public List<Transform> particles = new List<Transform>();
private List<Transform> huygensParticles = new List<Transform>();
public GameObject particle;
public ParticleSpawner particleSpawner;
public int size;
public float distance, particleSpeed, ior;
public int huygensSize;
public Slider particleSpeedSlider, sizeSlider, distanceSlider, huygensSlider, iorSlider;
public Text particleSpeedText, particleSizeText, distanceText, huygensText, iorText;
public Gradient blueGradient;
[HideInInspector]
public bool linesVisible;
void Awake() {
if(instance==null) {
instance = this;
}
}
void Update() {
if(Input.GetKeyDown(KeyCode.LeftControl)) {
StartHuygens();
}
if(Input.GetKeyDown(KeyCode.Q)) {
DestroyParticles();
}
}
void FixedUpdate() {
foreach(Transform current in particles) {
Particle currentParticle = current.GetComponent<Particle>();
if(!currentParticle.hasHitRefractiveSurface)
currentParticle.velocity = currentParticle.velocity.normalized*particleSpeed;
current.position = new Vector3(current.position.x+currentParticle.velocity.x*Time.deltaTime, current.position.y+currentParticle.velocity.y*Time.deltaTime, 0f);
Debug.DrawLine(current.position, current.position+currentParticle.velocity, Color.green);
}
foreach(Transform current in huygensParticles) {
Particle currentParticle = current.GetComponent<Particle>();
if(!currentParticle.hasHitRefractiveSurface)
currentParticle.velocity = currentParticle.velocity.normalized*particleSpeed;
current.position = new Vector3(current.position.x+currentParticle.velocity.x*Time.deltaTime, current.position.y+currentParticle.velocity.y*Time.deltaTime, 0f);
Debug.DrawLine(current.position, current.position+currentParticle.velocity, Color.green);
}
}
public void StartHuygens() {
if(particles.Count <= 20) {
foreach(Transform current in huygensParticles) {
Destroy(current.gameObject);
}
huygensParticles = new List<Transform>();
foreach(Transform current in particles) {
for(int i=0; i<huygensSize; i++) {
GameObject clone = Instantiate(particle, current.position, Quaternion.identity);
clone.name = "Huygens particle " + (i+1);
clone.GetComponent<Particle>().velocity = Quaternion.AngleAxis(i*360/huygensSize, new Vector3(0f, 0f, 1f))*Vector3.up;
clone.GetComponent<SpriteRenderer>().color = new Color(0f, 0.2f, 0.5f, 1f);
clone.GetComponent<SpriteRenderer>().sortingOrder = 0;
clone.GetComponent<TrailRenderer>().colorGradient = blueGradient;
if(linesVisible)
clone.GetComponent<TrailRenderer>().time = 15f;
else
clone.GetComponent<TrailRenderer>().time = 0f;
huygensParticles.Add(clone.transform);
}
}
}
}
public void DestroyParticles() {
foreach(Transform current in particles) {
Destroy(current.gameObject);
}
foreach(Transform current in huygensParticles) {
Destroy(current.gameObject);
}
particles = new List<Transform>();
huygensParticles = new List<Transform>();
}
public void ChangeParameter(string parameter) {
switch(parameter) {
case "speed":
particleSpeed = particleSpeedSlider.value;
particleSpeedText.text = particleSpeedSlider.value.ToString("0.00") + " m/s";
break;
case "size":
size = (int)sizeSlider.value;
particleSizeText.text = sizeSlider.value.ToString("0");
particleSpawner.spawnSize = size;
particleSpawner.RespawnParticles(true);
break;
case "distance":
distance = distanceSlider.value;
distanceText.text = distanceSlider.value.ToString("0.00") + " m";
particleSpawner.spawnDistance = distance;
particleSpawner.RespawnParticles(true);
break;
case "huygens size":
huygensSize = (int)huygensSlider.value;
huygensText.text = huygensSlider.value.ToString("0");
break;
case "ior":
ior = iorSlider.value;
iorText.text = iorSlider.value.ToString("0.00");
break;
}
}
public void ChangeLinesVisible() {
linesVisible = !linesVisible;
}
}