aboutsummaryrefslogtreecommitdiff
path: root/src/collision/vu0Collision_1.s
blob: 055c86404150ad496836496816e3856036256958 (plain) (blame)
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
QuitAndFail:
	NOP[E]                                   IADDIU VI01, VI00, 0
	NOP                                      NOP


QuitAndSucceed:
	NOP[E]                                   IADDIU VI01, VI00, 1
	NOP                                      NOP


; 20 -- unused
; VF12, VF13 xyz: sphere centers
; VF14, VF15 x: sphere radii
; out:
;  VI01: set when collision
;  VF01: supposed to be intersection point?
;  VF02: normal (pointing towards s1, not normalized)
.globl Vu0SphereToSphereCollision
Vu0SphereToSphereCollision:
	SUB.xyz VF02, VF13, VF12                 NOP                     ; dist of centers
	ADD.x VF04, VF14, VF15                   NOP                     ; s = sum of radii
	MUL.xyzw VF03, VF02, VF02                NOP                     ;
	MUL.x VF04, VF04, VF04                   DIV Q, VF14x, VF04x     ; square s
	NOP                                      NOP                     ;
	NOP                                      NOP                     ;
	MULAx.w ACC, VF00, VF03                  NOP                     ;
	MADDAy.w ACC, VF00, VF03                 NOP                     ;
	MADDz.w VF03, VF00, VF03                 NOP                     ; d = DistSq of centers
	NOP                                      NOP                     ;
	MULAw.xyz ACC, VF12, VF00                NOP                     ;
	MADDq.xyz VF01, VF02, Q                  NOP                     ; intersection, but wrong
	CLIPw.xyz VF04, VF03                     NOP                     ; compare s and d
	SUB.xyz VF02, VF00, VF02                 NOP                     ; compute normal
	NOP                                      NOP                     ;
	NOP                                      NOP                     ;
	NOP                                      FCAND VI01, 0x3         ; 0x2 cannot be set here
	NOP[E]                                   NOP                     ;
	NOP                                      NOP                     ;


; B8 -- unused
; VF12:
; VF13: radius
; VF14:
; VF15: box dimensions (?)
.globl Vu0SphereToAABBCollision
Vu0SphereToAABBCollision:
	SUB.xyz VF03, VF12, VF14                 LOI 0.5
	MULi.xyz VF15, VF15, I                   NOP
	MUL.x VF13, VF13, VF13                   NOP
	SUB.xyz VF04, VF03, VF15                 NOP
	ADD.xyz VF05, VF03, VF15                 MR32.xyzw VF16, VF15
	CLIPw.xyz VF03, VF16                     MR32.xyzw VF17, VF16
	MUL.xyz VF04, VF04, VF04                 NOP
	MUL.xyz VF05, VF05, VF05                 NOP
	CLIPw.xyz VF03, VF17                     MR32.xyzw VF16, VF17
	NOP                                      FCAND VI01, 0x1
	MINI.xyz VF04, VF04, VF05                MFIR.x VF09, VI01
	NOP                                      NOP
	CLIPw.xyz VF03, VF16                     FCAND VI01, 0x4
	NOP                                      MFIR.y VF09, VI01
	NOP                                      NOP
	MULAx.w ACC, VF00, VF00                  NOP
	ADD.xyz VF01, VF00, VF03                 FCAND VI01, 0x10
	NOP                                      MFIR.z VF09, VI01
	NOP                                      LOI 2
	NOP                                      FCAND VI01, 0x30
	SUBAw.xyz ACC, VF00, VF00                IADD VI04, VI00, VI01
	ITOF0.xyz VF09, VF09                     FCAND VI01, 0x300
	NOP                                      IADD VI03, VI00, VI01
	NOP                                      FCAND VI01, 0x3000
	NOP                                      IADD VI02, VI00, VI01
	MADDi.xyzw VF09, VF09, I                 NOP
	NOP                                      IBEQ VI04, VI00, IgnoreZValue
	NOP                                      NOP
	MADDAz.w ACC, VF00, VF04                 NOP
	MUL.z VF01, VF09, VF15                   NOP
IgnoreZValue:
	NOP                                      IBEQ VI03, VI00, IgnoreYValue
	NOP                                      NOP
	MADDAy.w ACC, VF00, VF04                 NOP
	MUL.y VF01, VF09, VF15                   NOP
IgnoreYValue:
	NOP                                      IBEQ VI02, VI00, IgnoreXValue
	NOP                                      NOP
	MADDAx.w ACC, VF00, VF04                 NOP
	MUL.x VF01, VF09, VF15                   NOP
IgnoreXValue:
	MADDx.w VF06, VF00, VF00                 NOP
	SUB.xyz VF02, VF03, VF01                 NOP
	ADD.xyz VF01, VF01, VF14                 NOP
	MULx.w VF01, VF00, VF00                  NOP
	CLIPw.xyz VF13, VF06                     NOP
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      FCAND VI01, 0x1
QuitMicrocode:
	NOP[E]                                   NOP
	NOP                                      NOP


; 240
.globl Vu0LineToSphereCollision
Vu0LineToSphereCollision:
	SUB.xyzw VF01, VF13, VF12                NOP
	SUB.xyzw VF02, VF14, VF12                NOP
	MUL.xyz VF03, VF01, VF02                 NOP
	MUL.xyz VF04, VF01, VF01                 NOP
	MUL.x VF15, VF15, VF15                   NOP
	MUL.xyz VF02, VF02, VF02                 NOP
	MULAx.w ACC, VF00, VF03                  NOP
	MADDAy.w ACC, VF00, VF03                 NOP
	MADDz.w VF03, VF00, VF03                 NOP
	MULAx.w ACC, VF00, VF04                  NOP
	MADDAy.w ACC, VF00, VF04                 NOP
	MADDz.w VF01, VF00, VF04                 NOP
	MULAx.w ACC, VF00, VF02                  NOP
	MADDAy.w ACC, VF00, VF02                 NOP
	MADDz.w VF02, VF00, VF02                 NOP
	MULA.w ACC, VF03, VF03                   NOP
	MADDAx.w ACC, VF01, VF15                 NOP
	MSUB.w VF05, VF01, VF02                  NOP
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      IADDIU VI02, VI00, 0x10
	NOP                                      FMAND VI01, VI02
	NOP                                      IBNE VI01, VI00, QuitAndFail
	NOP                                      NOP
	CLIPw.xyz VF15, VF02                     SQRT Q, VF05w
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      FCAND VI01, 0x1
	NOP                                      IBNE VI00, VI01, LineStartInsideSphere
	NOP                                      NOP
	SUBq.w VF05, VF03, Q                     NOP
	SUB.w VF05, VF05, VF01                   DIV Q, VF05w, VF01w
	NOP                                      FMAND VI01, VI02
	NOP                                      IBNE VI01, VI00, QuitAndFail
	NOP                                      NOP
	NOP                                      FMAND VI01, VI02
	NOP                                      IBEQ VI01, VI00, QuitAndFail
	NOP                                      NOP
	ADDA.xyz ACC, VF12, VF00                 NOP
	MADDq.xyz VF01, VF01, Q                  NOP
	MULx.w VF01, VF00, VF00                  NOP
	SUB.xyz VF02, VF01, VF14                 NOP
	NOP[E]                                   NOP
	NOP                                      NOP
LineStartInsideSphere:
	NOP                                      MOVE.xyzw VF01, VF12
	NOP[E]                                   IADDIU VI01, VI00, 0x1
	NOP                                      NOP


; 3C0
.globl Vu0LineToAABBCollision
Vu0LineToAABBCollision:
	SUB.xyzw VF08, VF13, VF12                LOI 0.5
	MULi.xyz VF15, VF15, I                   IADDIU VI08, VI00, 0x0
	SUB.xyzw VF12, VF12, VF14                NOP
	SUB.xyzw VF13, VF13, VF14                NOP
	NOP                                      DIV Q, VF00w, VF08x
	NOP                                      MR32.xyzw VF03, VF15
	SUB.xyz VF06, VF15, VF12                 NOP
	ADD.xyz VF07, VF15, VF12                 NOP
	NOP                                      NOP
	CLIPw.xyz VF12, VF03                     MR32.xyzw VF04, VF03
	NOP                                      NOP
	ADDq.x VF09, VF00, Q                     DIV Q, VF00w, VF08y
	NOP                                      NOP
	CLIPw.xyz VF12, VF04                     MR32.xyzw VF05, VF04
	SUB.xyz VF07, VF00, VF07                 IADDIU VI06, VI00, 0xCC
	NOP                                      IADDIU VI07, VI00, 0x30
	NOP                                      NOP
	CLIPw.xyz VF12, VF05                     FCGET VI02
	NOP                                      IAND VI02, VI02, VI06
	ADDq.y VF09, VF00, Q                     DIV Q, VF00w, VF08z
	SUB.xyz VF10, VF00, VF10                 NOP
	CLIPw.xyz VF13, VF03                     FCGET VI03
	CLIPw.xyz VF13, VF04                     IAND VI03, VI03, VI07
	CLIPw.xyz VF13, VF05                     FCAND VI01, 0x3330
	NOP                                      IBEQ VI01, VI00, StartPointInsideAABB
	NOP                                      NOP
	ADDq.z VF09, VF00, Q                     FCGET VI04
	NOP                                      FCGET VI05
	NOP                                      IAND VI04, VI04, VI06
	NOP                                      IAND VI05, VI05, VI07
	MULx.xyz VF17, VF08, VF09                NOP
	MULy.xyz VF18, VF08, VF09                IADDIU VI07, VI00, 0x80
	MULz.xyz VF19, VF08, VF09                IAND VI06, VI02, VI07
	MUL.w VF10, VF00, VF00                   IAND VI07, VI04, VI07
	NOP                                      NOP
	NOP                                      IBEQ VI06, VI07, CheckMaxXSide
	NOP                                      NOP
	MULAx.xyz ACC, VF17, VF07                NOP
	MADDw.xyz VF16, VF12, VF00               NOP
	MUL.x VF10, VF07, VF09                   NOP
	CLIPw.xyz VF16, VF04                     NOP
	CLIPw.xyz VF16, VF05                     NOP
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      FCAND VI01, 0x330
	NOP                                      IBNE VI01, VI00, CheckMaxXSide
	NOP                                      NOP
	MULx.w VF10, VF00, VF10                  IADDIU VI08, VI00, 0x1
	ADD.yz VF02, VF00, VF00                  MOVE.xyzw VF01, VF16
	SUBw.x VF02, VF00, VF00                  NOP
CheckMaxXSide:
	MULAx.xyz ACC, VF17, VF06                IADDIU VI07, VI00, 0x40
	MADDw.xyz VF16, VF12, VF00               IAND VI06, VI02, VI07
	MUL.x VF10, VF06, VF09                   IAND VI07, VI04, VI07
	NOP                                      NOP
	NOP                                      IBEQ VI06, VI07, CheckMinYSide
	NOP                                      NOP
	CLIPw.xyz VF16, VF04                     NOP
	CLIPw.xyz VF16, VF05                     NOP
	CLIPw.xyz VF10, VF10                     NOP
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      FCAND VI01, 0xCC03
	NOP                                      IBNE VI01, VI00, CheckMinYSide
	NOP                                      NOP
	MULx.w VF10, VF00, VF10                  IADDIU VI08, VI00, 0x1
	ADD.yz VF02, VF00, VF00                  MOVE.xyzw VF01, VF16
	ADDw.x VF02, VF00, VF00                  NOP
CheckMinYSide:
	MULAy.xyz ACC, VF18, VF07                IADDIU VI07, VI00, 0x8
	MADDw.xyz VF16, VF12, VF00               IAND VI06, VI02, VI07
	MUL.y VF10, VF07, VF09                   IAND VI07, VI04, VI07
	NOP                                      NOP
	NOP                                      IBEQ VI06, VI07, CheckMaxYSide
	NOP                                      NOP
	CLIPw.xyz VF16, VF03                     NOP
	CLIPw.xyz VF16, VF05                     NOP
	CLIPw.xyz VF10, VF10                     NOP
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      FCAND VI01, 0x3C0C
	NOP                                      IBNE VI01, VI00, CheckMaxYSide
	NOP                                      NOP
	MULy.w VF10, VF00, VF10                  IADDIU VI08, VI00, 0x1
	ADD.xz VF02, VF00, VF00                  MOVE.xyzw VF01, VF16
	SUBw.y VF02, VF00, VF00                  NOP
CheckMaxYSide:
	MULAy.xyz ACC, VF18, VF06                IADDIU VI07, VI00, 0x4
	MADDw.xyz VF16, VF12, VF00               IAND VI06, VI02, VI07
	MUL.y VF10, VF06, VF09                   IAND VI07, VI04, VI07
	NOP                                      NOP
	NOP                                      IBEQ VI06, VI07, CheckMinZSide
	NOP                                      NOP
	CLIPw.xyz VF16, VF03                     NOP
	CLIPw.xyz VF16, VF05                     NOP
	CLIPw.xyz VF10, VF10                     NOP
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      FCAND VI01, 0x3C0C
	NOP                                      IBNE VI01, VI00, CheckMinZSide
	NOP                                      NOP
	MULy.w VF10, VF00, VF10                  IADDIU VI08, VI00, 0x1
	ADD.xz VF02, VF00, VF00                  MOVE.xyzw VF01, VF16
	ADDw.y VF02, VF00, VF00                  NOP
CheckMinZSide:
	MULAz.xyz ACC, VF19, VF07                IADDIU VI07, VI00, 0x20
	MADDw.xyz VF16, VF12, VF00               IAND VI06, VI03, VI07
	MUL.z VF10, VF07, VF09                   IAND VI07, VI05, VI07
	NOP                                      NOP
	NOP                                      IBEQ VI06, VI07, CheckMaxZSide
	NOP                                      NOP
	CLIPw.xyz VF16, VF03                     NOP
	CLIPw.xyz VF16, VF04                     NOP
	CLIPw.xyz VF10, VF10                     NOP
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      FCAND VI01, 0x3330
	NOP                                      IBNE VI01, VI00, CheckMaxZSide
	NOP                                      NOP
	MULz.w VF10, VF00, VF10                  IADDIU VI08, VI00, 0x1
	ADD.xy VF02, VF00, VF00                  MOVE.xyzw VF01, VF16
	SUBw.z VF02, VF00, VF00                  NOP
CheckMaxZSide:
	MULAz.xyz ACC, VF19, VF06                IADDIU VI07, VI00, 0x10
	MADDw.xyz VF16, VF12, VF00               IAND VI06, VI03, VI07
	MUL.z VF10, VF06, VF09                   IAND VI07, VI05, VI07
	NOP                                      NOP
	NOP                                      IBEQ VI06, VI07, DoneAllChecks
	NOP                                      NOP
	CLIPw.xyz VF16, VF03                     NOP
	CLIPw.xyz VF16, VF04                     NOP
	CLIPw.xyz VF10, VF10                     NOP
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      FCAND VI01, 0x3330
	NOP                                      IBNE VI01, VI00, DoneAllChecks
	NOP                                      NOP
	MULz.w VF10, VF00, VF10                  IADDIU VI08, VI00, 0x1
	ADD.xy VF02, VF00, VF00                  MOVE.xyzw VF01, VF16
	ADDw.z VF02, VF00, VF00                  NOP
DoneAllChecks:
	ADD.xyz VF01, VF01, VF14                 IADD VI01, VI00, VI08
	NOP[E]                                   NOP
	NOP                                      NOP
StartPointInsideAABB:
	ADD.xyz VF01, VF12, VF14                 WAITQ
	NOP                                      IADDIU VI01, VI00, 0x1
	NOP[E]                                   NOP
	NOP                                      NOP


; 860
.globl Vu0LineToTriangleCollisionCompressedStart
Vu0LineToTriangleCollisionCompressedStart:
	ITOF0.xyzw VF17, VF17                    LOI 0.000244140625	; 1.0/4096.0
	ITOF0.xyzw VF14, VF14                    NOP
	ITOF0.xyzw VF15, VF15                    NOP
	ITOF0.xyzw VF16, VF16                    NOP
	MULi.xyz VF17, VF17, I                   LOI 0.0078125		; 1.0/128.0
	MULi.w VF17, VF17, I                     NOP
	MULi.xyzw VF14, VF14, I                  NOP
	MULi.xyzw VF15, VF15, I                  NOP
	MULi.xyzw VF16, VF16, I                  NOP
; fall through

; 8A8
; VF12: point0
; VF13: point1
; VF14-16: verts
; VF17: plane
; out:
;  VF01: intersection point
;  VF02: triangle normal
;  VF03 x: intersection parameter
.globl Vu0LineToTriangleCollisionStart
Vu0LineToTriangleCollisionStart:
	MUL.xyz VF10, VF17, VF12                 LOI 0.5
	MUL.xyz VF11, VF17, VF13                 NOP
	SUB.xyz VF02, VF13, VF12                 NOP                            ; line dist
	ADD.xyz VF17, VF17, VF00                 NOP
	MULi.w VF03, VF00, I                     NOP
	MULAx.w ACC, VF00, VF10                  NOP
	MADDAy.w ACC, VF00, VF10                 IADDIU VI06, VI00, 0xE0
	MADDz.w VF10, VF00, VF10                 FMAND VI05, VI06               ; -- normal sign flags, unused
	MULAx.w ACC, VF00, VF11                  NOP
	MADDAy.w ACC, VF00, VF11                 NOP
	MADDz.w VF11, VF00, VF11                 NOP
	SUB.w VF09, VF17, VF10                   NOP                            ; plane-pos 0
	CLIPw.xyz VF17, VF03                     NOP                            ; compare normal against 0.5 to figure out which in which dimension to compare
	NOP                                      IADDIU VI02, VI00, 0x10        ; Sw flag
	SUBA.w ACC, VF17, VF11                   NOP                            ; plane-pos 1
	SUB.w VF08, VF11, VF10                   FMAND VI01, VI02
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      FMAND VI02, VI02
	NOP                                      IBEQ VI01, VI02, QuitAndFail   ; if on same side, no collision
	NOP                                      NOP
	NOP                                      DIV Q, VF09w, VF08w            ; parameter of intersection
	NOP                                      FCAND VI01, 0x3                ; check x direction
	NOP                                      IADDIU VI02, VI01, 0x7F
	NOP                                      IADDIU VI06, VI00, 0x80
	NOP                                      IAND VI02, VI02, VI06          ; Sx flag
	NOP                                      FCAND VI01, 0xC                ; check y direction
	NOP                                      IADDIU VI03, VI01, 0x3F
	MULAw.xyz ACC, VF12, VF00                IADDIU VI06, VI00, 0x40
	MADDq.xyz VF01, VF02, Q                  IAND VI03, VI03, VI06          ; point of intersection -- Sy flag
	MULx.w VF01, VF00, VF00                  FCAND VI01, 0x30               ; -- check z direction
	ADDq.x VF03, VF00, Q                     IADDIU VI04, VI01, 0x1F        ; output parameter
	SUB.xyz VF05, VF15, VF14                 IADDIU VI06, VI00, 0x20        ; edge vectors
	SUB.xyz VF08, VF01, VF14                 IAND VI04, VI04, VI06          ; edge vectors -- Sz flag
	SUB.xyz VF06, VF16, VF15                 IADD VI06, VI02, VI03          ; edge vectors
	SUB.xyz VF09, VF01, VF15                 IADD VI06, VI06, VI04          ; edge vectors -- combine flags
	SUB.xyz VF07, VF14, VF16                 NOP                            ; edge vectors
	SUB.xyz VF10, VF01, VF16                 NOP                            ; edge vectors
	OPMULA.xyz ACC, VF08, VF05               NOP
	OPMSUB.xyz VF18, VF05, VF08              NOP                            ; cross1
	OPMULA.xyz ACC, VF09, VF06               NOP
	OPMSUB.xyz VF19, VF06, VF09              NOP                            ; cross2
	OPMULA.xyz ACC, VF10, VF07               NOP
	OPMSUB.xyz VF20, VF07, VF10              FMAND VI02, VI06               ; cross3
	NOP                                      NOP
	NOP                                      FMAND VI03, VI06
	NOP                                      NOP
	NOP                                      FMAND VI04, VI06
	NOP                                      NOP
	NOP                                      IBNE VI03, VI02, QuitAndFail   ; point has to lie on the same side of all edges (i.e. inside)
	NOP                                      NOP
	NOP                                      IBNE VI04, VI02, QuitAndFail
	NOP                                      NOP
	MULw.xyz VF02, VF17, VF00                IADDIU VI01, VI00, 0x1         ; success
	NOP[E]                                   NOP
	NOP                                      NOP


; A68
; VF12: center
; VF14: line origin
; VF15: line vector to other point
; out: VF16 xyz: nearest point on line; w: distance to that point
DistanceBetweenSphereAndLine:
	SUB.xyz VF20, VF12, VF14                 NOP
	MUL.xyz VF21, VF15, VF15                 NOP
	ADDA.xyz ACC, VF14, VF15                 NOP
	MSUBw.xyz VF25, VF12, VF00               NOP                                        ; VF25 = VF12 - (VF14+VF15)
	MUL.xyz VF22, VF20, VF20                 NOP
	MUL.xyz VF23, VF20, VF15                 NOP
	MULAx.w ACC, VF00, VF21                  NOP
	MADDAy.w ACC, VF00, VF21                 NOP
	MADDz.w VF21, VF00, VF21                 NOP	                                    ; MagSq VF15 (line length)
	MULAx.w ACC, VF00, VF23                  NOP
	MADDAy.w ACC, VF00, VF23                 NOP
	MADDz.w VF23, VF00, VF23                 NOP                                        ; dot(VF12-VF14, VF15)
	MULAx.w ACC, VF00, VF22                  NOP
	MADDAy.w ACC, VF00, VF22                 NOP
	MADDz.w VF22, VF00, VF22                 IADDIU VI08, VI00, 0x10                    ; MagSq VF12-VF14 -- Sw bit
	MUL.xyz VF25, VF25, VF25                 FMAND VI08, VI08
	NOP                                      DIV Q, VF23w, VF21w
	NOP                                      IBNE VI00, VI08, NegativeRatio
	NOP                                      NOP
	ADDA.xyz ACC, VF00, VF14                 NOP
	MADDq.xyz VF16, VF15, Q                  WAITQ                                     ; nearest point on infinte line
	ADDq.x VF24, VF00, Q                     NOP                                       ; ratio
	NOP                                      NOP
	NOP                                      NOP
	SUB.xyz VF26, VF16, VF12                 NOP
	CLIPw.xyz VF24, VF00                     NOP                                       ; compare ratio to 1.0
	NOP                                      NOP
	NOP                                      NOP
	MUL.xyz VF26, VF26, VF26                 NOP
	NOP                                      FCAND VI01, 0x1
	NOP                                      IBNE VI00, VI01, RatioGreaterThanOne
	NOP                                      NOP
	MULAx.w ACC, VF00, VF26                  NOP
	MADDAy.w ACC, VF00, VF26                 NOP
	MADDz.w VF16, VF00, VF26                 NOP                                      ; distance
	NOP                                      JR VI15
	NOP                                      NOP
NegativeRatio:
	ADD.xyz VF16, VF00, VF14                 NOP                 ; return line origin
	MUL.w VF16, VF00, VF22                   NOP                 ; and DistSq to it
	NOP                                      JR VI15
	NOP                                      NOP
RatioGreaterThanOne:
	MULAx.w ACC, VF00, VF25                  NOP
	MADDAy.w ACC, VF00, VF25                 NOP
	MADDz.w VF16, VF00, VF25                 NOP
	ADD.xyz VF16, VF14, VF15                 NOP                ; return toerh line point
	NOP                                      JR VI15
	NOP                                      NOP


; BE0
.globl Vu0SphereToTriangleCollisionCompressedStart
Vu0SphereToTriangleCollisionCompressedStart:
	ITOF0.xyzw VF17, VF17                    LOI 0.000244140625	; 1.0/4096.0
	ITOF0.xyzw VF14, VF14                    NOP
	ITOF0.xyzw VF15, VF15                    NOP
	ITOF0.xyzw VF16, VF16                    NOP
	MULi.xyz VF17, VF17, I                   LOI 0.0078125		; 1.0/128.0
	MULi.w VF17, VF17, I                     NOP
	MULi.xyzw VF14, VF14, I                  NOP
	MULi.xyzw VF15, VF15, I                  NOP
	MULi.xyzw VF16, VF16, I                  NOP
; fall through

; C28
; VF12: sphere
; VF14-16: verts
; VF17: plane
; out:
;  VF01: intersection point
;  VF02: triangle normal
;  VF03 x: intersection parameter
.globl Vu0SphereToTriangleCollisionStart
Vu0SphereToTriangleCollisionStart:
	MUL.xyz VF02, VF12, VF17                 LOI 0.1
	ADD.xyz VF17, VF17, VF00                 NOP
	ADDw.x VF13, VF00, VF12                  NOP
	NOP                                      NOP
	MULAx.w ACC, VF00, VF02                  IADDIU VI06, VI00, 0xE0
	MADDAy.w ACC, VF00, VF02                 FMAND VI05, VI06                  ; normal sign flags
	MADDAz.w ACC, VF00, VF02                 NOP
	MSUB.w VF02, VF00, VF17                  NOP                               ; center plane pos
	MULi.w VF03, VF00, I                     MOVE.xyzw VF04, VF03
	NOP                                      NOP
	NOP                                      NOP
	CLIPw.xyz VF13, VF02                     NOP                               ; compare dist and radius
	CLIPw.xyz VF17, VF03                     NOP
	MULAw.xyz ACC, VF12, VF00                IADDIU VI07, VI00, 0x0            ; -- clear test case
	MSUBw.xyz VF01, VF17, VF02               NOP
	MULx.w VF01, VF00, VF00                  FCAND VI01, 0x3                   ; projected center on plane
	ABS.w VF02, VF02                         IBEQ VI00, VI01, QuitAndFail      ; no intersection
	NOP                                      NOP
	NOP                                      FCAND VI01, 0x3                   ; -- check x direction
	SUB.xyz VF02, VF12, VF01                 IADDIU VI02, VI01, 0x7F
	NOP                                      IADDIU VI06, VI00, 0x80
	SUB.xyz VF05, VF15, VF14                 IAND VI02, VI02, VI06
	SUB.xyz VF08, VF01, VF14                 FCAND VI01, 0xC                   ; -- check y direction
	SUB.xyz VF06, VF16, VF15                 IADDIU VI03, VI01, 0x3F
	SUB.xyz VF09, VF01, VF15                 IADDIU VI06, VI00, 0x40
	SUB.xyz VF07, VF14, VF16                 IAND VI03, VI03, VI06
	SUB.xyz VF10, VF01, VF16                 FCAND VI01, 0x30                  ; -- check z direction
	MUL.xyz VF03, VF02, VF02                 IADDIU VI04, VI01, 0x1F
	OPMULA.xyz ACC, VF08, VF05               IADDIU VI06, VI00, 0x20
	OPMSUB.xyz VF18, VF05, VF08              IAND VI04, VI04, VI06
	OPMULA.xyz ACC, VF09, VF06               NOP
	OPMSUB.xyz VF19, VF06, VF09              IADD VI06, VI02, VI03
	OPMULA.xyz ACC, VF10, VF07               IADD VI06, VI06, VI04             ; -- combine flags
	OPMSUB.xyz VF20, VF07, VF10              FMAND VI02, VI06                  ; -- cross 1 flags
	MULAx.w ACC, VF00, VF03                  IAND VI05, VI05, VI06
	MADDAy.w ACC, VF00, VF03                 FMAND VI03, VI06                  ; -- cross 2 flags
	MADDz.w VF03, VF00, VF03                 IADDIU VI08, VI00, 0x3
	NOP                                      FMAND VI04, VI06                  ; -- cross 3 flags
	NOP                                      NOP
	NOP                                      IBNE VI02, VI05, CheckSide2
	NOP                                      RSQRT Q, VF00w, VF03w
	ADD.xyz VF04, VF00, VF16                 IADDIU VI07, VI07, 0x1                          ; inside side 1
CheckSide2:
	NOP                                      IBNE VI03, VI05, CheckSide3
	NOP                                      NOP
	ADD.xyz VF04, VF00, VF14                 IADDIU VI07, VI07, 0x1                          ; inside side 2
CheckSide3:
	NOP                                      IBNE VI04, VI05, FinishCheckingSides
	NOP                                      NOP
	ADD.xyz VF04, VF00, VF15                 IADDIU VI07, VI07, 0x1                          ; inside side 3
	NOP                                      NOP
	NOP                                      IBEQ VI07, VI08, TotallyInsideTriangle
	NOP                                      NOP
FinishCheckingSides:
	MUL.x VF13, VF13, VF13                   IADDIU VI08, VI00, 0x2
	MULq.xyz VF02, VF02, Q                   WAITQ
	NOP                                      IBNE VI07, VI08, IntersectionOutsideTwoSides
	NOP                                      NOP
	NOP                                      IBEQ VI02, VI05, CheckDistanceSide2
	NOP                                      NOP
	NOP                                      MOVE.xyzw VF15, VF05
	NOP                                      BAL VI15, DistanceBetweenSphereAndLine
	NOP                                      NOP
	NOP                                      B ProcessLineResult
	NOP                                      NOP
CheckDistanceSide2:
	NOP                                      IBEQ VI03, VI05, CheckDistanceSide3
	NOP                                      NOP
	NOP                                      MOVE.xyzw VF14, VF15
	NOP                                      MOVE.xyzw VF15, VF06
	NOP                                      BAL VI15, DistanceBetweenSphereAndLine
	NOP                                      NOP
	NOP                                      B ProcessLineResult
	NOP                                      NOP
CheckDistanceSide3:
	NOP                                      MOVE.xyzw VF14, VF16
	NOP                                      MOVE.xyzw VF15, VF07
	NOP                                      BAL VI15, DistanceBetweenSphereAndLine
	NOP                                      NOP
	NOP                                      B ProcessLineResult
	NOP                                      NOP
IntersectionOutsideTwoSides:
	SUB.xyz VF05, VF04, VF12                 NOP
	ADD.xyz VF01, VF00, VF04                 NOP                                ; col point
	SUB.xyz VF02, VF12, VF04                 NOP
	NOP                                      NOP
	MUL.xyz VF05, VF05, VF05                 NOP
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      NOP
	MULAx.w ACC, VF00, VF05                  NOP
	MADDAy.w ACC, VF00, VF05                 NOP
	MADDz.w VF05, VF00, VF05                 NOP                                ; distSq to vertex
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      NOP
	CLIPw.xyz VF13, VF05                     SQRT Q, VF05w                      ; compare radiusSq and distSq
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      FCAND VI01, 0x1
	ADDq.x VF03, VF00, Q                     WAITQ                              ; dist to vertex
	NOP                                      IBEQ VI00, VI01, QuitAndFail       ; too far
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      DIV Q, VF00w, VF03x
	MULq.xyz VF02, VF02, Q                   WAITQ                              ; col normal
	NOP[E]                                   NOP
	NOP                                      NOP
TotallyInsideTriangle:
	ADDw.x VF03, VF00, VF02                  WAITQ
	MULq.xyz VF02, VF02, Q                   NOP
	NOP[E]                                   IADDIU VI01, VI00, 0x1
	NOP                                      NOP
ProcessLineResult:
	CLIPw.xyz VF13, VF16                     SQRT Q, VF16w
	ADD.xyz VF01, VF00, VF16                 NOP
	SUB.xyz VF02, VF12, VF16                 NOP
	NOP                                      NOP
	NOP                                      FCAND VI01, 0x1
	ADDq.x VF03, VF00, Q                     WAITQ
	NOP                                      IBEQ VI00, VI01, QuitAndFail
	NOP                                      NOP
	NOP                                      NOP
	NOP                                      DIV Q, VF00w, VF03x
	MULq.xyz VF02, VF02, Q                   WAITQ
	NOP[E]                                   NOP
	NOP                                      NOP

EndOfMicrocode: