summaryrefslogtreecommitdiff
path: root/Runtime/Graphs/UnityEngine.Graphs/LogicNodeLibrary/NodeLibraryForTesting.txt
blob: 7a69517cef2d4f576c05c06eec41e0d03840485d (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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
		[Logic]
		public static void ExplosionForce (float force, Vector3 position, float radius, float upwardsModifier, float occlusion)
		{
			// Get all colliders in radius
			Collider[] colliders = Physics.OverlapSphere(position, radius);
			
			// Get all of those that have rigidbodies
			List<Rigidbody> rigids = new List<Rigidbody> ();
			foreach (Collider col in colliders)
			{
				Rigidbody rigid = col.rigidbody;
				if (rigid != null)
					rigids.Add(rigid);
			}
			
			if (occlusion <= 0)
			{
				// Apply the explosion force
				for (int i=0; i<rigids.Count; i++)
				{
					rigids[i].AddExplosionForce(force, position, radius, upwardsModifier, ForceMode.Impulse);
				}
			}
			else
			{
				// Save original layers of all the rigidbodies
				// Then but them into Ignore Raycast layer
				int[] origLayers = new int[rigids.Count];
				for (int i=0; i<rigids.Count; i++)
				{
					origLayers[i] = rigids[i].gameObject.layer;
					rigids[i].gameObject.layer = 2; // Ignore Raycast
				}
				
				// Find out which of the rigidbodies are occuded
				bool[] occluded = new bool[rigids.Count];
				for (int i=0; i<rigids.Count; i++)
				{
					Vector3 pos = rigids[i].transform.position;
					if (Physics.Raycast(pos, position - pos, (position - pos).magnitude))
						occluded[i] = true;
				}
				
				// Set layers back to the original values
				for (int i=0; i<rigids.Count; i++)
				{
					rigids[i].gameObject.layer = origLayers[i];
				}
				
				// Finally apply the explosion force
				float mult = Mathf.Clamp01(1-occlusion);
				for (int i=0; i<rigids.Count; i++)
				{
					float thisForce = force;
					if (occluded[i])
						thisForce *= mult;
					rigids[i].AddExplosionForce(thisForce, position, radius, upwardsModifier, ForceMode.Impulse);
				}
			}
		}
				[Logic]
		public static void FindCollidersInRadius (Vector3 center, float radius, ColliderDelegate affected, ColliderDelegate done)
		{
			Collider[] colliders = Physics.OverlapSphere(center, radius);
			foreach (Collider col in colliders)
			{
				affected(col);
			}
			if (done == null)
				Debug.LogWarning("done delegate is null");
			else
				done(colliders[0]);
		}

		[Logic]
		public static float AssignFloat (float value)
		{
			return value;
		}

		// Eval
		[LogicEval]
		public static Vector3 Vector3FromFloats (float x, float y, float z)
		{
			return new Vector3(x, y, z);
		}
		
		public enum Vector3Element {X, Y, Z}
		[LogicEval]
		public static float ElementFromVector3 (Vector3 vector, Vector3Element element)
		{
			switch (element)
			{
				case Vector3Element.X:
					return vector.x;
				case Vector3Element.Y:
					return vector.y;
				case Vector3Element.Z:
					return vector.z;
				default:
					return 0f;
			}
		}
		
		[LogicEval]
		public static Vector3 ScaleVector (Vector3 vector, float scalar)
		{
			return vector * scalar;
		}

		[LogicEval]
		public static Vector3 AddVectors (Vector3 vector1, Vector3 vector2)
		{
			return vector1 + vector2;
		}

		[LogicEval]
		public static Vector3 InverseDistVector (Vector3 from, Vector3 to, float multiplier)
		{
			float dist = Vector3.Distance(from, to);
			if (dist == 0)
				return Vector3.zero;
			return (to - from) / (dist * dist) * multiplier;
		}