Tanoda
HandCopyAvg.cs
Go to the documentation of this file.
1using NaughtyAttributes;
2using System.Collections;
3using System.Collections.Generic;
4using UnityEngine;
5#if !UNITY_WEBGL
6using static Valve.VR.InteractionSystem.Hand;
7#endif
8
9public class HandCopyAvg : MonoBehaviour
10{
11 public bool clampFingers = false;
12 internal bool releaseFingers = false;
13 public int AvgClamp = 5;
14 public int AvgHand = 5;
15 public Vector3 thumbOffset = new Vector3(90, 0, 0f);
16 public GameObject[] from, to, thumb1, thumb2;
17 public int angle;
18 private List<Queue<Vector3>> fromQueue, thumbQueue;
19 private List<Vector3> handPosQueue, handRotQueue;
20 internal float time = 0.0f;
21 internal List<GameObject> SavedCollidedFingers = new List<GameObject>();
22 public float speed = 0;
23 private Vector3 lastPosition;
24 internal bool isCollision = false;
25 private Vector3 OriginalHandPosition;
26 private Vector3 OriginalHandRotation;
27 private Quaternion OriginalHandRot;
28 private Vector3 PrevHandRotation;
29 public Transform OriginalTransform;
30 public GameObject ActiveHand;
31
32 void Start()
33 {
34 fromQueue = new List<Queue<Vector3>>();
35 thumbQueue = new List<Queue<Vector3>>();
36 handPosQueue = new List<Vector3>();
37 handRotQueue = new List<Vector3>();
38 for (int i = 0; i < @from.Length; i++)
39 {
40 fromQueue.Add(new Queue<Vector3>());
41 }
42 for (int i = 0; i < thumb1.Length; i++)
43 {
44 thumbQueue.Add(new Queue<Vector3>());
45 }
46
47 OriginalHandPosition = gameObject.transform.localPosition;
48 OriginalHandRotation = gameObject.transform.localEulerAngles;
49 OriginalHandRot = gameObject.transform.localRotation;
50
51 }
52
53#if DANA
54 void Update()
55 {
56 if (!transform || !OriginalTransform) return;
57
58 var delta = Vector3.Distance(transform.localPosition, OriginalTransform.localPosition);
59
60 //if (delta > 0.06f || Macro.VectorCompare(Macro.ClampAngle(OriginalHandRotation), Macro.ClampAngle(transform.localEulerAngles), 0.02f))
61 //{
62 GetComponent<PhysicsHand>().MoveTo(OriginalHandPosition,OriginalTransform.rotation);
63 //}
64 if (GetComponentInParent<HackedHand>().attachedToHand)
65 {
66 transform.localPosition = OriginalHandPosition;
67 transform.localEulerAngles = OriginalHandRotation;
68 }
69 //else
70 //{
71 // transform.localPosition = OriginalHandPosition;
72 // transform.localEulerAngles = OriginalHandRotation;
73 //}
74
75
76 if (GetComponentInChildren<ThrowableCanDisable>() && !GetComponentInChildren<ThrowableCanDisable>().attachmentFlags.HasFlag(AttachmentFlags.SnapOnAttach) && !ToolPositioner.instance.IsTool(GetComponentInChildren<ThrowableCanDisable>().gameObject)) return;
77 for (int i = 0; i < @from.Length; i++)
78 {
79 fromQueue[i].Enqueue(
80 new Vector3(Macro.ClampAngle(@from[i].transform.localEulerAngles.y),
82 ? Mathf.Min(Macro.ClampAngle(@from[i].transform.localEulerAngles.z), 20f)
83 : @from[i].transform.localEulerAngles.z,
85 ? Mathf.Min(10, Mathf.Max(-10, Macro.ClampAngle(-@from[i].transform.localEulerAngles.x)))
86 : -@from[i].transform.localEulerAngles.x));
87
88 while (fromQueue[i].Count > AvgClamp)
89 {
90 fromQueue[i].Dequeue();
91 }
92
93
94 //to[i].transform.localEulerAngles = new Vector3(Macro.ClampAngle(@from[i].transform.localEulerAngles.y),
95 // clampFingers ? Mathf.Min(Macro.ClampAngle(@from[i].transform.localEulerAngles.z), 20f) : @from[i].transform.localEulerAngles.z,
96 // clampFingers
97 // ? Mathf.Min(20, Mathf.Max(-20, Macro.ClampAngle(-@from[i].transform.localEulerAngles.x)))
98 // : -@from[i].transform.localEulerAngles.x);
99 }
100 //if (GetComponentInParent<HandCopySkelet>() && GetComponentInParent<HandCopySkelet>().isCollision || isCollision)
101 //{
102 // if (PrevHandRotation == null)
103 // {
104 // PrevHandRotation = gameObject.transform.localEulerAngles;
105 // }
106 // if (gameObject.transform.localPosition != OriginalHandPosition) handPosQueue.Add(gameObject.transform.localPosition);
107
108 // if (gameObject.transform.localEulerAngles != OriginalHandRotation /*&& Macro.VectorCompare(Macro.ClampAngle(gameObject.transform.localEulerAngles), Macro.ClampAngle(PrevHandRotation), 0.3f)*/)
109 // {
110 // handRotQueue.Add(Macro.ClampAngle(gameObject.transform.localEulerAngles));
111 // }
112
113 // if (handPosQueue.Count == 0) handPosQueue.Add(gameObject.transform.localPosition);
114
115 // if (handRotQueue.Count == 0) handRotQueue.Add(Macro.ClampAngle(gameObject.transform.localEulerAngles));
116
117
118 // while (handPosQueue.Count > AvgHand)
119 // {
120 // handPosQueue.RemoveAt(0);
121 // }
122 // while (handRotQueue.Count > AvgHand)
123 // {
124 // handRotQueue.RemoveAt(0);
125 // }
126
127 // var avgHandPos = default(Vector3);
128 // var avgHandRot = default(Vector3);
129 // foreach (var v in handPosQueue)
130 // {
131 // avgHandPos += v;
132 // }
133 // foreach (var v in handRotQueue)
134 // {
135 // avgHandRot += v;
136 // }
137
138 // if (handRotQueue.Count > 2)
139 // {
140 // var average = Macro.AngleLerp(handRotQueue[0], handRotQueue[1], 0.5f);
141 // for (int i = 2; i < handRotQueue.Count; i++)
142 // {
143 // average = Macro.AngleLerp(average, handRotQueue[i], 0.5f);
144 // }
145 // avgHandPos /= handPosQueue.Count;
146 // avgHandRot /= handRotQueue.Count;
147 // gameObject.transform.localPosition = Vector3.Lerp(gameObject.transform.localPosition, avgHandPos, 1);
148 // gameObject.transform.localEulerAngles = Vector3.Lerp(gameObject.transform.localEulerAngles, average, 1) /*Macro.ClampAngle(avgHandRot)*/;
149 // PrevHandRotation = gameObject.transform.localEulerAngles;
150 // }
151
152
153
154
155 //}
156 //else
157 //{
158 // handPosQueue.Clear();
159 // handRotQueue.Clear();
160 // gameObject.transform.localPosition = Vector3.Lerp(gameObject.transform.localPosition, OriginalHandPosition, 1);
161 // gameObject.transform.localEulerAngles = Vector3.Lerp(gameObject.transform.localEulerAngles, OriginalHandRotation, 1);
162 //}
163
164 var fingers = GetComponentsInChildren<FingerCollisionDetection>();
165 foreach (var finger in fingers)
166 {
167 if (finger.raycastFinger() && !SavedCollidedFingers.Contains(finger.gameObject))
168 {
169 SavedCollidedFingers.Add(finger.gameObject);
170 SavedCollidedFingers.Add(finger.gameObject.transform.parent.gameObject);
171 SavedCollidedFingers.Add(finger.gameObject.transform.parent.transform.parent.gameObject);
172 if (finger.name.Contains("Bone005")) SavedCollidedFingers.Add(finger.gameObject.transform.parent.transform.parent.transform.parent.gameObject);
173
174 }
175 if (finger.name.Contains("Bone005") && !SavedCollidedFingers.Contains(finger.gameObject))
176 {
177 SavedCollidedFingers.Add(finger.gameObject);
178 SavedCollidedFingers.Add(finger.gameObject.transform.parent.gameObject);
179 SavedCollidedFingers.Add(finger.gameObject.transform.parent.transform.parent.gameObject);
180 SavedCollidedFingers.Add(finger.gameObject.transform.parent.transform.parent.transform.parent.gameObject);
181 }
182 //if (!finger.raycastFinger())
183 //{
184 // SavedCollidedFingers.Remove(finger.gameObject);
185 // SavedCollidedFingers.Remove(finger.gameObject.transform.parent.gameObject);
186 // SavedCollidedFingers.Remove(finger.gameObject.transform.parent.transform.parent.gameObject);
187 //}
188 }
189 //}
190 //else SavedCollidedFingers.Clear();
191 if (!GetComponentInParent<HackedHand>().attachedToHand)
192 {
193 SavedCollidedFingers.Clear();
194 }
195 for (int i = 0; i < @from.Length; i++)
196 {
197 var avg = default(Vector3);
198 foreach (var v in fromQueue[i])
199 {
200 avg += v;
201 }
202
203 avg /= fromQueue[i].Count;
204 //if (SavedCollidedFingers.Contains(to[i]) && GetComponentInParent<HackedHand>().attachedToHand) continue;
205
206 to[i].transform.localEulerAngles = avg;
207 }
208 if (!GetComponentInParent<HackedHand>().attachedToHand)
209 {
210 var le0 = thumb1[0].transform.localEulerAngles;
211 thumb2[0].transform.localEulerAngles = new Vector3(clampFingers ? Mathf.Min(Macro.ClampAngle(-le0.x), 0f) : -le0.x, le0.y, -le0.z) + thumbOffset;
212 for (int i = 1; i < thumb1.Length; i++)
213 {
214 var le = thumb1[i].transform.localEulerAngles;
215 //if (SavedCollidedFingers.Contains(thumb2[i]) && GetComponentInParent<HackedHand>().attachedToHand) continue;
216 thumb2[i].transform.localEulerAngles = new Vector3(-le.y, clampFingers ? Mathf.Min(Macro.ClampAngle(-le.x), 0f) : -le.x, -le.z);
217 }
218 }
219
220 //Checks whether your hand is open or not
221 if (Macro.ClampAngle(@from[0].transform.localEulerAngles.z) < -10 && Macro.ClampAngle(@from[1].transform.localEulerAngles.z) < -10 && Macro.ClampAngle(@from[3].transform.localEulerAngles.z) < -10 && Macro.ClampAngle(@from[4].transform.localEulerAngles.z) < -10)
222 {
223 releaseFingers = false;
224 time = 0.0f;
225 }
226 else if (ActiveHand && ActiveHand.activeInHierarchy)
227 {
228 time += Time.deltaTime;
229 if (time >= 1.0f) releaseFingers = true;
230 }
232 if (!GetComponentInParent<HackedHand>().handAnim)
233 {
234 CopyColliderPosition();
235 }
236 }
237#endif
238
239 [Button]
240 void CopyColliderPosition()
241 {
242 var capsule = GetComponents<CapsuleCollider>();
243 if (capsule == null) return;
244 if (to == null) return;
245 //if (capsule.Length < 14) return;
246
247 //Copy the colliders to the end of the fingers
248 capsule[0].center = gameObject.transform.InverseTransformPoint(new Vector3(to[2].transform.position.x,to[2].transform.position.y+0.01f,to[2].transform.position.z));
249 capsule[1].center = gameObject.transform.InverseTransformPoint(new Vector3(to[2].transform.position.x,to[2].transform.position.y-0.01f,to[2].transform.position.z));
250 capsule[2].center = gameObject.transform.InverseTransformPoint(new Vector3(to[5].transform.position.x,to[5].transform.position.y+0.01f,to[5].transform.position.z));
251 capsule[3].center = gameObject.transform.InverseTransformPoint(new Vector3(to[5].transform.position.x,to[5].transform.position.y-0.01f,to[5].transform.position.z));
252 capsule[4].center = gameObject.transform.InverseTransformPoint(new Vector3(to[8].transform.position.x,to[8].transform.position.y+0.01f,to[8].transform.position.z));
253 capsule[5].center = gameObject.transform.InverseTransformPoint(new Vector3(to[8].transform.position.x,to[8].transform.position.y-0.01f,to[8].transform.position.z));
254 capsule[6].center = gameObject.transform.InverseTransformPoint(new Vector3(to[11].transform.position.x,to[11].transform.position.y+0.01f,to[11].transform.position.z));
255 capsule[7].center = gameObject.transform.InverseTransformPoint(new Vector3(to[11].transform.position.x,to[11].transform.position.y-0.01f,to[11].transform.position.z));
256 capsule[8].center = gameObject.transform.InverseTransformPoint(thumb2[2].transform.position);
257 capsule[9].center = gameObject.transform.InverseTransformPoint(thumb2[2].transform.GetChild(0).position);
258 //Copy the colliders to the middle of the fingers
259 capsule[10].center = gameObject.transform.InverseTransformPoint(to[1].transform.position);
260 capsule[11].center = gameObject.transform.InverseTransformPoint(to[4].transform.position);
261 capsule[12].center = gameObject.transform.InverseTransformPoint(to[7].transform.position);
262 capsule[13].center = gameObject.transform.InverseTransformPoint(to[10].transform.position);
263 }
264
265 internal float speedometer()
266 {
267 speed = (transform.position - lastPosition).magnitude;
268 lastPosition = transform.position;
269 return speed*100;
270 }
271 private void OnCollisionEnter(Collision collision)
272 {
273 if (!collision.gameObject.GetComponentInChildren<ThrowableCanDisable>())
274 {
275 isCollision = true;
276 }
277 isCollision = true;
278 }
279 private void OnCollisionExit(Collision collision)
280 {
281 isCollision = false;
282 }
283 //public void OnTriggerEnter(Collision collision)
284 //{
285 // if (!collision.gameObject.GetComponentInChildren<ThrowableCanDisable>())
286 // {
287 // isCollision = true;
288 // }
289 // if (GetComponentInParent<ConfigurableJoint>() && GetComponentInParent<ConfigurableJoint>().connectedBody == null)
290 // {
291 // GetComponentInParent<ConfigurableJoint>().connectedBody = GetComponent<Rigidbody>();
292 // }
293
294
295 //}
296 //public void OnTriggerExit(Collision collision)
297 //{
298 // isCollision = false;
299 //}
300 public bool release()
301 {
302 return releaseFingers;
303 }
304
305
306}
UnityEngine.UI.Button Button
Definition: Pointer.cs:7
GameObject ActiveHand
Definition: HandCopyAvg.cs:30
Vector3 thumbOffset
Definition: HandCopyAvg.cs:15
Transform OriginalTransform
Definition: HandCopyAvg.cs:29
float speed
Definition: HandCopyAvg.cs:22
GameObject[] to
Definition: HandCopyAvg.cs:16
GameObject[] thumb1
Definition: HandCopyAvg.cs:16
bool clampFingers
Definition: HandCopyAvg.cs:11
GameObject[] thumb2
Definition: HandCopyAvg.cs:16
GameObject[] from
Definition: HandCopyAvg.cs:16
bool release()
Definition: HandCopyAvg.cs:300
Definition: Macro.cs:12
static Vector3 ClampAngle(Vector3 value)
Definition: Macro.cs:303
bool IsTool(GameObject tool)
static ToolPositioner instance