Files
jak-project/goal_src/engine/collide/collide-shape.gc
T
ManDude 25b0e1be7d [decomp] collectables + works ingame! (#971)
* decomp: `collectables`

* fix types

* `powerups` and fixes

* fixes

* Merge branch 'pr/929' into d/temp/collectables

* fix collide stuff

* update things...

* update

* update

* temp bump global heap mem

* fix `defstate` hooks wrong/unnecessary sets & collide stuff for collectables

* dumb mistakes :)

* stub out broken process-drawable stuff

* update refs

* add `:no-inspect` key and save some memory & remove birth logs

* Update kmachine.h

* clang

* add citadel

* fix no-inspect key

* fix tests!!

* fix stupid mistake in `collide-shape-prim-sphere` alloc

* comment annoying print

* feedback

* fix edge-case probably

* remove `:no-inspect`s
2021-11-23 18:25:57 -05:00

2225 lines
56 KiB
Common Lisp

;;-*-Lisp-*-
(in-package goal)
;; name: collide-shape.gc
;; name in dgo: collide-shape
;; dgos: GAME, ENGINE
;; TODO - for misty-teetertotter | rigid-body
(define-extern default-collision-reaction (function collide-shape-moving collide-shape-intersect vector vector none)) ;; TODO - not completely confirmed
;; DECOMP BEGINS
;; ERROR: function was not converted to expressions. Cannot decompile.
(defmethod should-push-away-test collide-shape-prim ()
(format
0
"ERROR: collide-shape-prim::should-push-away-test was called illegally!~%"
)
(none)
)
;; ERROR: function was not converted to expressions. Cannot decompile.
;; ERROR: function was not converted to expressions. Cannot decompile.
;; ERROR: function was not converted to expressions. Cannot decompile.
;; ERROR: function was not converted to expressions. Cannot decompile.
(defmethod
collide-with-collide-cache-prim-mesh
collide-shape-prim
((obj collide-shape-prim)
(arg0 collide-shape-intersect)
(arg1 collide-cache-prim)
)
(format
0
"ERROR: Unsupported prim type in collide-shape-prim::collide-with-collide-cache-prim-mesh!~%"
)
(none)
)
;; ERROR: function was not converted to expressions. Cannot decompile.
(defmethod
collide-with-collide-cache-prim-mesh
collide-shape-prim-mesh
((obj collide-shape-prim-mesh)
(arg0 collide-shape-intersect)
(arg1 collide-cache-prim)
)
(format
0
"ERROR: collide-shape-prim-mesh vs. collide-cache-prim mesh is not currently supported!~%"
)
(none)
)
(defmethod
collide-with-collide-cache-prim-mesh
collide-shape-prim-group
((obj collide-shape-prim-group)
(arg0 collide-shape-intersect)
(arg1 collide-cache-prim)
)
(let ((s3-0 (-> arg1 prim-core collide-as)))
(dotimes (s2-0 (-> obj num-prims))
(let ((a0-1 (-> obj prims s2-0)))
(if (logtest? (-> a0-1 collide-with) s3-0)
(collide-with-collide-cache-prim-mesh a0-1 arg0 arg1)
)
)
)
)
(none)
)
(defmethod
collide-with-collide-cache-prim-sphere
collide-shape-prim
((obj collide-shape-prim)
(arg0 collide-shape-intersect)
(arg1 collide-cache-prim)
)
(format
0
"ERROR: Unsupported prim type in collide-shape-prim::collide-with-collide-cache-prim-sphere!~%"
)
(none)
)
(defmethod
collide-with-collide-cache-prim-sphere
collide-shape-prim-sphere
((obj collide-shape-prim-sphere)
(arg0 collide-shape-intersect)
(arg1 collide-cache-prim)
)
(local-vars (v1-4 int) (a3-2 uint))
(rlet ((vf1 :class vf)
(vf2 :class vf)
(vf3 :class vf)
(vf4 :class vf)
(vf5 :class vf)
)
(let* ((s5-0 (new 'stack-no-clear 'collide-mesh-cache-tri))
(f0-1
(dummy-10
arg1
s5-0
(-> obj prim-core)
(-> arg0 move-vec)
(-> arg0 best-u)
(the-as int (-> obj prim-core action))
)
)
)
(when (>= f0-1 0.0)
(let ((v1-3 0)
(a1-2 (-> obj prim-core action))
)
(nop!)
(let ((a2-2 (-> arg1 prim-core action)))
(nop!)
(let ((a0-2 (-> arg1 prim-core offense))
(a1-3 (logand a1-2 a2-2))
(a2-3 (-> arg1 prim))
)
(let ((a3-1 (logand a1-3 1))
(a1-4 (-> obj prim-core offense))
)
(b! (zero? a3-1) cfg-5 :delay (set! a3-2 (-> s5-0 bbox4w max data 0)))
(b! (= a0-2 v1-3) cfg-5 :delay (set! v1-4 (- a1-4 a0-2)))
)
(b! (> v1-4 0) cfg-5 :delay (.lvf vf1 (&-> s5-0 normal quad)))
(.lvf vf2 (&-> s5-0 bbox4w min quad))
(.lvf vf3 (&-> s5-0 vertex 0 quad))
(.lvf vf4 (&-> s5-0 vertex 1 quad))
(.lvf vf5 (&-> s5-0 vertex 2 quad))
(set! (-> arg0 best-u) f0-1)
(set! (-> arg0 best-to-prim) (the-as collide-shape-prim a2-3))
(set! (-> arg0 best-from-prim) obj)
(set! (-> arg0 best-tri pat) (the-as pat-surface a3-2))
(.svf (&-> arg0 best-tri intersect quad) vf1)
(.svf (&-> arg0 best-tri normal quad) vf2)
(.svf (&-> arg0 best-tri vertex 0 quad) vf3)
(.svf (&-> arg0 best-tri vertex 1 quad) vf4)
(.svf (&-> arg0 best-tri vertex 2 quad) vf5)
(label cfg-5)
(dummy-9
*touching-list*
obj
(the-as collide-shape-prim a2-3)
f0-1
(the-as collide-shape #f)
s5-0
)
)
)
)
)
)
0
(none)
)
)
(defmethod
collide-with-collide-cache-prim-sphere
collide-shape-prim-mesh
((obj collide-shape-prim-mesh)
(arg0 collide-shape-intersect)
(arg1 collide-cache-prim)
)
(format
0
"ERROR: collide-shape-prim-mesh vs. collide-cache-prim sphere is not currently supported!~%"
)
(none)
)
(defmethod
collide-with-collide-cache-prim-sphere
collide-shape-prim-group
((obj collide-shape-prim-group)
(arg0 collide-shape-intersect)
(arg1 collide-cache-prim)
)
(let ((s3-0 (-> arg1 prim-core collide-as)))
(dotimes (s2-0 (-> obj num-prims))
(let ((a0-1 (-> obj prims s2-0)))
(if (logtest? (-> a0-1 collide-with) s3-0)
(collide-with-collide-cache-prim-sphere a0-1 arg0 arg1)
)
)
)
)
(none)
)
(defun
find-ground-point
((arg0 control-info) (arg1 vector) (arg2 float) (arg3 float))
(local-vars (sv-176 int) (sv-192 int))
(let ((f30-1 (if (< 819.2 (vector-xz-length (-> arg0 transv)))
(vector-y-angle (-> arg0 transv))
(y-angle arg0)
)
)
(s2-0 (-> arg0 trans))
(s1-0 (new 'stack-no-clear 'vector))
(s0-0 (new 'stack-no-clear 'collide-mesh-cache-tri))
)
(let ((a1-1 (new 'stack-no-clear 'bounding-box)))
(set! (-> arg1 w) 0.0)
(dotimes (v1-1 3)
(set! (-> a1-1 min data v1-1) (- (-> s2-0 data v1-1) arg3))
(set! (-> a1-1 max data v1-1) (+ (-> s2-0 data v1-1) arg3))
)
(set! (-> a1-1 min y) (+ -40960.0 (-> s2-0 y)))
(set! (-> a1-1 max y) (+ 20480.0 (-> s2-0 y)))
(dummy-13
*collide-cache*
a1-1
(-> arg0 root-prim collide-with)
(-> arg0 process)
(the-as uint 1)
)
)
(set! sv-176 0)
(while (< sv-176 8)
(let ((f28-0 (+ f30-1 (if (zero? (logand sv-176 1))
(* 8192.0 (the float (/ sv-176 2)))
(* -8192.0 (the float (/ sv-176 2)))
)
)
)
)
(set! sv-192 0)
(let ((f26-0 arg3))
(set-vector! s1-0 0.0 0.0 arg3 1.0)
(vector-rotate-y! s1-0 s1-0 f28-0)
(if
(>=
(dummy-18
*collide-cache*
(vector+!
(new 'stack-no-clear 'vector)
s2-0
(new 'static 'vector :y 20480.0 :w 1.0)
)
s1-0
2048.0
(the-as int (-> arg0 root-prim collide-with))
s0-0
1
)
0.0
)
(set!
f26-0
(+ -6144.0 (vector-vector-xz-distance s2-0 (-> s0-0 normal)))
)
)
(let ((f24-0 arg2))
(while (>= f26-0 f24-0)
(set-vector! s1-0 0.0 0.0 f24-0 1.0)
(vector-rotate-y! s1-0 s1-0 f28-0)
(vector+! s1-0 s2-0 s1-0)
(set! (-> s1-0 y) (+ 20480.0 (-> s2-0 y)))
(when
(>=
(dummy-18
*collide-cache*
s1-0
(new 'static 'vector :y -251658240.0 :w 1.0)
10240.0
(the-as int (-> arg0 root-prim collide-with))
s0-0
1
)
0.0
)
(cond
((and
(zero? (shr (shl (-> s0-0 bbox4w max data 0) 58) 61))
(zero? (shr (shl (-> s0-0 bbox4w max data 0) 44) 58))
(< 0.7 (the-as float (-> s0-0 bbox4w min data 1)))
)
(set! (-> arg1 quad) (-> s0-0 normal quad))
(set! sv-192 (+ sv-192 1))
(if (>= sv-192 2)
(return arg1)
)
)
((and
(= (shr (shl (-> s0-0 bbox4w max data 0) 58) 61) 1)
(< (+ 4096.0 (-> s2-0 y)) (-> s0-0 normal y))
)
(goto cfg-35)
)
)
)
(set! f24-0 (+ 4096.0 f24-0))
)
)
)
)
(label cfg-35)
(set! sv-176 (+ sv-176 1))
)
)
(the-as vector #f)
)
(defun target-attack-up ((arg0 target) (arg1 symbol) (arg2 symbol))
(with-pp
(let
((s4-0
(find-ground-point
(-> arg0 control)
(new 'stack-no-clear 'vector)
8192.0
40960.0
)
)
)
(set! s4-0 (cond
(s4-0
(empty)
s4-0
)
(else
(-> arg0 control unknown-vector54)
)
)
)
(let*
((s2-1
(vector-! (new 'stack-no-clear 'vector) s4-0 (-> arg0 control trans))
)
(f30-1 (fmax 8192.0 (fmin 40960.0 (vector-xz-length s2-1))))
)
(cond
((<
(fabs
(vector-dot
(-> arg0 control dynam gravity-normal)
(vector-! (new 'stack-no-clear 'vector) s4-0 (-> arg0 control trans))
)
)
40960.0
)
(vector-xz-normalize! s2-1 f30-1)
(let ((s1-0 (new 'stack-no-clear 'event-message-block)))
(set! (-> s1-0 from) pp)
(set! (-> s1-0 num-params) 2)
(set! (-> s1-0 message) arg1)
(set! (-> s1-0 param 0) (the-as uint #f))
(let ((s3-1 (new 'static 'attack-info :mask #x8a2)))
(set! (-> s3-1 mode) arg2)
(set! (-> s3-1 vector quad) (-> s2-1 quad))
(set!
(-> s3-1 shove-up)
(+
(lerp-scale 4096.0 16384.0 f30-1 4096.0 40960.0)
(fmax 0.0 (- (-> s4-0 y) (-> arg0 control trans y)))
)
)
(set! (-> s3-1 angle) 'up)
(set! (-> s1-0 param 1) (the-as uint s3-1))
)
(send-event-function arg0 s1-0)
)
)
(else
(let ((a1-6 (new 'stack-no-clear 'event-message-block)))
(set! (-> a1-6 from) pp)
(set! (-> a1-6 num-params) 2)
(set! (-> a1-6 message) arg1)
(set! (-> a1-6 param 0) (the-as uint #f))
(let ((v1-12 (new 'static 'attack-info :mask #xca2)))
(set! (-> v1-12 mode) arg2)
(set!
(-> v1-12 vector quad)
(->
(new 'static 'attack-info
:trans (new 'static 'vector :y 40960.0 :w 1.0)
:speed (the-as float #x1)
)
trans
quad
)
)
(set! (-> v1-12 shove-up) 40960.0)
(set! (-> v1-12 angle) 'up)
(set! (-> v1-12 control) 1.0)
(set! (-> a1-6 param 1) (the-as uint v1-12))
)
(send-event-function arg0 a1-6)
)
)
)
)
)
(none)
)
)
(defmethod
dummy-56
collide-shape-moving
((obj collide-shape-moving) (arg0 pat-surface))
(with-pp
(set! (-> obj cur-pat) arg0)
(set! (-> obj poly-pat) arg0)
(case (-> arg0 material)
(((pat-material ice))
(set! (-> obj surf) *ice-surface*)
)
(((pat-material quicksand))
(set! (-> obj surf) *quicksand-surface*)
)
(((pat-material tube))
(set! (-> obj surf) *no-walk-surface*)
)
(((pat-material rotate))
(set! (-> obj surf) *rotate-surface*)
)
(else
(set! (-> obj surf) *standard-ground-surface*)
)
)
(if (logtest? (-> obj root-prim prim-core action) 512)
(set! (-> obj surf) *race-track-surface*)
)
(when (nonzero? (-> arg0 event))
(case (-> arg0 event)
(((pat-event deadly))
(let ((a1-3 (new 'stack-no-clear 'event-message-block)))
(set! (-> a1-3 from) pp)
(set! (-> a1-3 num-params) 2)
(set! (-> a1-3 message) 'attack)
(set! (-> a1-3 param 0) (the-as uint #f))
(let ((v1-19 (new 'static 'attack-info :mask #xa0)))
(set! (-> v1-19 mode) 'deadly)
(set! (-> v1-19 shove-up) 12288.0)
(set! (-> a1-3 param 1) (the-as uint v1-19))
)
(send-event-function (-> obj process) a1-3)
)
)
(((pat-event burn))
(let ((a1-6 (new 'stack-no-clear 'event-message-block)))
(set! (-> a1-6 from) pp)
(set! (-> a1-6 num-params) 2)
(set! (-> a1-6 message) 'attack)
(set! (-> a1-6 param 0) (the-as uint #f))
(let ((v1-23 (new 'static 'attack-info :mask #xa0)))
(set! (-> v1-23 mode) 'burn)
(set! (-> v1-23 shove-up) 12288.0)
(set! (-> a1-6 param 1) (the-as uint v1-23))
)
(send-event-function (-> obj process) a1-6)
)
)
(((pat-event deadlyup))
(target-attack-up
(the-as target (-> obj process))
'attack-or-shove
'deadlyup
)
)
(((pat-event burnup))
(if
(zero?
(logand
(->
(the-as target (-> obj process))
control
root-prim
prim-core
action
)
512
)
)
(target-attack-up
(the-as target (-> obj process))
'attack-or-shove
'burnup
)
)
)
(((pat-event melt))
(let ((a1-15 (new 'stack-no-clear 'event-message-block)))
(set! (-> a1-15 from) pp)
(set! (-> a1-15 num-params) 2)
(set! (-> a1-15 message) 'attack-invinc)
(set! (-> a1-15 param 0) (the-as uint #f))
(let ((a2-8 (new 'static 'attack-info :mask #x20)))
(set! (-> a2-8 mode) 'melt)
(set! (-> a1-15 param 1) (the-as uint a2-8))
)
(send-event-function (-> obj process) a1-15)
)
)
(((pat-event endlessfall))
(let ((a1-17 (new 'stack-no-clear 'event-message-block)))
(set! (-> a1-17 from) pp)
(set! (-> a1-17 num-params) 2)
(set! (-> a1-17 message) 'attack-invinc)
(set! (-> a1-17 param 0) (the-as uint #f))
(let ((a2-9 (new 'static 'attack-info :mask #x20)))
(set! (-> a2-9 mode) 'endlessfall)
(set! (-> a1-17 param 1) (the-as uint a2-9))
)
(send-event-function (-> obj process) a1-17)
)
)
)
)
0
(none)
)
)
(defun
default-collision-reaction
((arg0 collide-shape-moving)
(arg1 collide-shape-intersect)
(arg2 vector)
(arg3 vector)
)
(local-vars
(sv-64 vector)
(sv-68 vector)
(sv-72 vector)
(sv-80 int)
(sv-128 symbol)
)
(set! sv-64 (new-stack-vector0))
(set! sv-68 (new-stack-vector0))
(set! sv-72 (new 'stack-no-clear 'vector))
(set! sv-80 0)
(set! (-> sv-72 quad) (-> arg3 quad))
(let ((a1-1 (new 'stack-no-clear 'vector)))
(vector-float*! a1-1 (-> arg1 move-vec) (-> arg1 best-u))
(TODO-RENAME-28 arg0 a1-1)
)
(dummy-56 arg0 (-> arg1 best-tri pat))
(vector-!
sv-64
(the-as vector (-> arg1 best-from-prim prim-core))
(-> arg1 best-tri intersect)
)
(set! (-> sv-64 w) 1.0)
(vector-normalize! sv-64 1.0)
(set! (-> arg0 coverage) (vector-dot sv-64 (-> arg1 best-tri normal)))
(let ((v1-16 (-> sv-64 quad)))
(set! (-> sv-68 quad) v1-16)
)
(if (= (-> arg1 best-u) 0.0)
(TODO-RENAME-28 arg0 sv-68)
)
(set! (-> arg0 surface-normal quad) (-> sv-68 quad))
(set! (-> arg0 poly-normal quad) (-> arg1 best-tri normal quad))
(set!
(-> arg0 surface-angle)
(vector-dot sv-68 (-> arg0 dynam gravity-normal))
)
(set!
(-> arg0 poly-angle)
(vector-dot (-> arg0 poly-normal) (-> arg0 dynam gravity-normal))
)
(set!
(-> arg0 touch-angle)
(vector-dot
sv-68
(vector-normalize! (vector-negate! (new-stack-vector0) sv-72) 1.0)
)
)
(if (< (-> arg0 poly-angle) -0.2)
(set! sv-80 (logior sv-80 16))
)
(set!
sv-128
(<
(fabs (-> arg0 surface-angle))
(-> *pat-mode-info* (-> arg0 cur-pat mode) wall-angle)
)
)
(when (zero? (logand (-> arg0 prev-status) 1))
(set!
(-> arg0 ground-impact-vel)
(- (vector-dot (-> arg0 transv) (-> arg0 dynam gravity-normal)))
)
(when (not sv-128)
(let ((f30-0 (- 1.0 (-> arg0 surf impact-fric))))
(when (< f30-0 1.0)
(let ((s3-1 (new-stack-vector0))
(f28-0 (vector-dot (-> arg0 dynam gravity-normal) sv-72))
)
0.0
(vector-!
s3-1
sv-72
(vector-float*! s3-1 (-> arg0 dynam gravity-normal) f28-0)
)
(let* ((f0-22 (vector-length s3-1))
(f1-4 f0-22)
)
(if (< f28-0 0.0)
(set! f28-0 (* f28-0 f30-0))
)
(vector+!
sv-72
(vector-float*! sv-72 (-> arg0 dynam gravity-normal) f28-0)
(vector-float*! s3-1 s3-1 (/ f0-22 f1-4))
)
)
)
)
)
)
)
(set! sv-80 (logior sv-80 4))
(if (-> arg1 best-to-prim)
(set! sv-80 (logior sv-80 32))
)
(cond
(sv-128
(set! sv-80 (logior sv-80 8))
(set! (-> arg0 cur-pat mode) 1)
)
(else
(set! sv-80 (logior sv-80 1))
(set! (-> arg0 local-normal quad) (-> sv-68 quad))
)
)
(vector-reflect-flat! arg2 sv-72 sv-68)
(when (and (not sv-128) (>= (-> arg0 coverage) 0.9))
(set! sv-80 (logior sv-80 2))
(set! (-> arg0 ground-poly-normal quad) (-> arg0 poly-normal quad))
(when (!= (-> arg0 poly-pat mode) (pat-mode wall))
(set! (-> arg0 ground-pat) (-> arg0 poly-pat))
(set! (-> arg0 ground-touch-point quad) (-> arg1 best-tri intersect quad))
)
)
(logior! (-> arg0 status) sv-80)
sv-80
(none)
)
(defun
simple-collision-reaction
((arg0 collide-shape-moving) (arg1 collide-shape-intersect))
(let ((s5-0 0))
(let ((a1-1 (new 'stack-no-clear 'vector)))
(vector-float*! a1-1 (-> arg1 move-vec) (-> arg1 best-u))
(TODO-RENAME-28 arg0 a1-1)
)
(let ((f0-2 (vector-dot (-> arg0 transv) (-> arg1 best-tri normal)))
(v1-6 (new 'stack-no-clear 'vector))
)
(vector-float*! v1-6 (-> arg1 best-tri normal) (* 1.5 f0-2))
(vector-! (-> arg0 transv) (-> arg0 transv) v1-6)
)
(let ((v0-1 (logior s5-0 7)))
(logior! (-> arg0 status) v0-1)
)
)
(none)
)
(defmethod
dummy-63
collide-shape-moving
((obj collide-shape-moving) (arg0 vector) (arg1 vector) (arg2 float))
(local-vars (sv-192 int))
(let ((s5-0 (new 'stack 'collide-shape-intersect))
(s2-0 (new 'stack-no-clear 'vector))
)
(vector-float*! s2-0 arg1 (* arg2 (-> *display* seconds-per-frame)))
(init! s5-0 s2-0)
(let* ((s1-1 (-> obj root-prim))
(v1-4 *collide-cache*)
(s0-0 (the-as collide-cache-prim (-> v1-4 prims)))
)
(set! sv-192 (-> v1-4 num-prims))
(while (nonzero? sv-192)
(set! sv-192 (+ sv-192 -1))
(when (logtest? (-> s1-1 collide-with) (-> s0-0 prim-core collide-as))
(if (>= (-> s0-0 prim-core prim-type) 0)
(collide-with-collide-cache-prim-mesh s1-1 s5-0 s0-0)
(collide-with-collide-cache-prim-sphere s1-1 s5-0 s0-0)
)
)
(set! s0-0 (-> (the-as (inline-array collide-cache-prim) s0-0) 1))
)
)
(let ((f30-0 (-> s5-0 best-u)))
(cond
((>= f30-0 0.0)
(let ((s2-1 (new 'stack-no-clear 'vector)))
(if *display-collision-marks*
(set! (-> s2-1 quad) (-> arg1 quad))
)
(set!
(-> obj prev-status)
(the-as uint ((-> obj reaction) obj s5-0 arg0 arg1))
)
(when *display-collision-marks*
(let
((t1-0 (-> *pat-mode-info* (-> s5-0 best-tri pat mode) hilite-color)))
(add-debug-outline-triangle
#t
(bucket-id debug-draw1)
(the-as vector (-> s5-0 best-tri))
(-> s5-0 best-tri vertex 1)
(-> s5-0 best-tri vertex 2)
t1-0
)
)
(add-debug-vector
#t
(bucket-id debug-draw1)
(-> s5-0 best-tri intersect)
s2-1
(meters 0.00007324219)
(new 'static 'rgba :r #xff :g #xa0 :a #x80)
)
(add-debug-vector
#t
(bucket-id debug-draw1)
(-> s5-0 best-tri intersect)
arg0
(meters 0.00007324219)
(new 'static 'rgba :r #xff :g #xff :b #xff :a #x80)
)
(if (= (-> obj process type) target)
(add-debug-vector
#t
(bucket-id debug-draw1)
(-> s5-0 best-tri intersect)
(-> obj surface-normal)
(meters 0.5)
(-> *pat-mode-info* (-> obj cur-pat mode) hilite-color)
)
)
)
)
(return f30-0)
)
(else
(set! (-> obj reaction-flag) (the-as uint 0))
((-> obj no-reaction) obj s5-0 arg0 arg1)
(set! (-> obj prev-status) (the-as uint 0))
(TODO-RENAME-28 obj s2-0)
(set! (-> arg0 quad) (-> arg1 quad))
(return 1.0)
)
)
)
)
(the-as none 0)
(the-as float 1.0)
)
(defmethod dummy-37 collide-shape ((obj collide-shape) (arg0 vector))
(local-vars (at-0 int))
(rlet ((vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf)
)
(init-vf0-vector)
(let ((t9-0 (method-of-object obj TODO-RENAME-28))
(v1-1 (new 'stack-no-clear 'vector))
)
(.lvf vf1 (&-> arg0 quad))
(let ((f0-0 (-> *display* seconds-per-frame)))
(.mov at-0 f0-0)
)
(.mov vf2 at-0)
(.mov.vf vf1 vf0 :mask #b1000)
(.mul.x.vf vf1 vf1 vf2 :mask #b111)
(.svf (&-> v1-1 quad) vf1)
(t9-0 obj v1-1)
)
(none)
)
)
(defmethod
dummy-37
collide-shape-moving
((obj collide-shape-moving) (arg0 vector))
(dummy-47 obj)
(set! (-> obj trans-old 2 quad) (-> obj trans-old 1 quad))
(set! (-> obj trans-old 1 quad) (-> obj trans-old 0 quad))
(set! (-> obj trans-old 0 quad) (-> obj trans quad))
(set! (-> obj prev-status) (-> obj status))
(set! (-> obj status) (logand -16128 (-> obj status)))
(set! (-> obj local-normal quad) (-> obj dynam gravity-normal quad))
(set! (-> obj surface-normal quad) (-> obj dynam gravity-normal quad))
(set! (-> obj poly-normal quad) (-> obj dynam gravity-normal quad))
(set! (-> obj coverage) 0.0)
(set! (-> obj touch-angle) 0.0)
(let ((f30-0 1.0)
(s4-0 0)
)
(while
(and
(< 0.05 f30-0)
(and
(< s4-0 (the-as int (-> obj max-iteration-count)))
(not (and (= (-> arg0 x) 0.0) (= (-> arg0 y) 0.0) (= (-> arg0 z) 0.0)))
)
)
(let ((f28-0 (dummy-63 obj arg0 arg0 f30-0)))
(dummy-11 *touching-list* f28-0)
(set! f30-0 (- f30-0 (* f28-0 f30-0)))
)
(+! s4-0 1)
)
)
0
(none)
)
(defmethod dummy-37 control-info ((obj control-info) (arg0 vector))
(stopwatch-start (-> *collide-stats* total-target))
(when (< 1638400.0 (vector-length arg0))
(format
0
"WARNING: target vel is ~M m/s, reseting to zero.~%"
(vector-length arg0)
)
(vector-reset! arg0)
)
(set! (-> obj unknown-vector15 quad) (-> obj unknown-vector14 quad))
(vector-matrix*!
(-> obj unknown-vector14)
(-> obj unknown-vector13)
(-> obj unknown-matrix02)
)
(vector-!
(-> obj unknown-vector16)
(-> obj unknown-vector14)
(-> obj unknown-vector15)
)
(let
((a1-6
(vector-!
(new 'stack-no-clear 'vector)
(-> obj unknown-vector11)
(-> obj unknown-vector14)
)
)
)
(vector-seek!
(-> obj unknown-vector12)
a1-6
(* 16384.0 (-> *display* seconds-per-frame))
)
)
(let
((s3-1
(vector+float*! (new-stack-vector0) arg0 (-> obj unknown-vector16) 60.0)
)
(s4-1 (new 'stack-no-clear 'vector))
)
(set! (-> s4-1 quad) (-> arg0 quad))
(let ((t9-7 (method-of-type collide-shape-moving dummy-37)))
(t9-7 obj s3-1)
)
(let ((s1-0 (new-stack-vector0)))
(set! (-> s1-0 quad) (-> s4-1 quad))
(let ((s2-1 (new-stack-vector0)))
(set! (-> s2-1 quad) (-> s3-1 quad))
(let ((s0-0 (new-stack-vector0)))
(let ((f0-4 (vector-dot (-> obj dynam gravity-normal) s1-0)))
0.0
(vector-!
s0-0
s1-0
(vector-float*! s0-0 (-> obj dynam gravity-normal) f0-4)
)
)
(let* ((f0-5 (vector-length s0-0))
(f1-2 f0-5)
(f2-0 0.0)
)
(vector+!
s1-0
(vector-float*! s1-0 (-> obj dynam gravity-normal) f2-0)
(vector-float*! s0-0 s0-0 (/ f0-5 f1-2))
)
)
)
(let ((s0-1 (new-stack-vector0)))
(let ((f0-8 (vector-dot (-> obj dynam gravity-normal) s2-1)))
0.0
(vector-!
s0-1
s2-1
(vector-float*! s0-1 (-> obj dynam gravity-normal) f0-8)
)
)
(let* ((f0-9 (vector-length s0-1))
(f1-4 f0-9)
(f2-1 0.0)
)
(vector+!
s2-1
(vector-float*! s2-1 (-> obj dynam gravity-normal) f2-1)
(vector-float*! s0-1 s0-1 (/ f0-9 f1-4))
)
)
)
(vector-normalize! s1-0 1.0)
(vector-normalize! s2-1 1.0)
(let ((f30-1 (vector-dot s1-0 s2-1)))
(cond
((and
(!= (vector-length (-> obj unknown-vector01)) 0.0)
(if (logtest? (-> obj status) 8)
(< f30-1 0.9999)
(< f30-1 0.95)
)
)
(set!
(-> obj unknown-float70)
(seek
(-> obj unknown-float70)
1.0
(* 4.0 (-> *display* seconds-per-frame))
)
)
(set!
(-> obj unknown-float71)
(seek
(-> obj unknown-float71)
(if (= (-> obj unknown-surface00 mode) 'air)
1.0
0.0
)
(* 4.0 (-> *display* seconds-per-frame))
)
)
(logior! (-> obj status) 512)
)
(else
(set!
(-> obj unknown-float70)
(seek
(-> obj unknown-float70)
0.0
(* 2.0 (-> *display* seconds-per-frame))
)
)
(set!
(-> obj unknown-float71)
(seek
(-> obj unknown-float71)
0.0
(* 2.0 (-> *display* seconds-per-frame))
)
)
)
)
)
)
)
(if (logtest? (-> obj status) 1)
(set! (-> arg0 quad) (-> s3-1 quad))
(vector--float*! arg0 s3-1 (-> obj unknown-vector16) 60.0)
)
(if
(and
(logtest? (-> obj status) 1)
(and
(zero? (logand (-> obj status) 520))
(< (vector-length (-> obj unknown-vector61)) (vector-length s4-1))
)
)
(set! (-> obj unknown-vector61 quad) (-> s4-1 quad))
)
)
(let
((s5-1
(vector-normalize-copy!
(new 'stack-no-clear 'vector)
(the-as vector (&-> obj unknown-vector120))
1.0
)
)
(f0-32 (vector-length (the-as vector (&-> obj unknown-vector120))))
)
(set! (-> obj unknown-float140) (if (= f0-32 0.0)
0.0
(fmax
0.0
(/ (vector-dot (-> obj transv) s5-1) f0-32)
)
)
)
)
(stopwatch-stop (-> *collide-stats* total-target))
0
(none)
)
(defmethod
TODO-RENAME-61
collide-shape-moving
((obj collide-shape-moving) (arg0 vector) (arg1 vector) (arg2 vector))
(TODO-RENAME-30 obj arg0)
(set! (-> arg1 y) 0.0)
(logior! (-> obj status) 7)
(set! (-> obj poly-normal quad) (-> arg2 quad))
(set! (-> obj surface-normal quad) (-> arg2 quad))
(set! (-> obj local-normal quad) (-> arg2 quad))
(set! (-> obj ground-poly-normal quad) (-> arg2 quad))
(set!
(-> obj ground-impact-vel)
(- (vector-dot arg1 (-> obj dynam gravity-normal)))
)
(set! (-> obj ground-touch-point quad) (-> arg0 quad))
0
(none)
)
(defmethod
dummy-57
collide-shape-moving
((obj collide-shape-moving) (arg0 vector))
(local-vars (at-0 int))
(rlet ((vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf)
)
(init-vf0-vector)
(dummy-47 obj)
(set! (-> obj trans-old 2 quad) (-> obj trans-old 1 quad))
(set! (-> obj trans-old 1 quad) (-> obj trans-old 0 quad))
(set! (-> obj trans-old 0 quad) (-> obj trans quad))
(set! (-> obj prev-status) (-> obj status))
(set! (-> obj status) (logand -16128 (-> obj status)))
(set! (-> obj local-normal quad) (-> obj dynam gravity-normal quad))
(set! (-> obj surface-normal quad) (-> obj dynam gravity-normal quad))
(set! (-> obj poly-normal quad) (-> obj dynam gravity-normal quad))
(set! (-> obj coverage) 0.0)
(set! (-> obj touch-angle) 0.0)
(let* ((a0-12 obj)
(t9-1 (method-of-object a0-12 TODO-RENAME-28))
(a1-1 (new 'stack-no-clear 'vector))
)
(.lvf vf1 (&-> arg0 quad))
(let ((f0-2 (-> *display* seconds-per-frame)))
(.mov at-0 f0-2)
)
(.mov vf2 at-0)
(.mov.vf vf1 vf0 :mask #b1000)
(.mul.x.vf vf1 vf1 vf2 :mask #b111)
(.svf (&-> a1-1 quad) vf1)
(t9-1 a0-12 a1-1)
)
(set! (-> obj shadow-pos quad) (-> obj trans quad))
0
(none)
)
)
(defmethod
dummy-58
collide-shape-moving
((obj collide-shape-moving) (arg0 vector))
(dummy-57 obj arg0)
(let ((a1-1 (new 'stack-no-clear 'touching-shapes-entry)))
(set! (-> a1-1 cshape1) (the-as collide-shape 1))
(set! (-> a1-1 cshape2) (the-as collide-shape *touching-list*))
(when (dummy-40 obj a1-1)
(TODO-RENAME-30 obj (the-as vector (-> obj trans-old)))
(return #t)
)
)
#f
)
(defmethod
dummy-64
collide-shape-moving
((obj collide-shape-moving) (arg0 collide-tri-result) (arg1 vector))
(TODO-RENAME-30 obj arg1)
(logior! (-> obj status) 7)
(let ((v1-4 (-> arg0 normal)))
(set! (-> obj poly-normal quad) (-> v1-4 quad))
(set! (-> obj surface-normal quad) (-> v1-4 quad))
(set! (-> obj local-normal quad) (-> v1-4 quad))
(set! (-> obj ground-poly-normal quad) (-> v1-4 quad))
)
(set! (-> obj poly-pat) (-> arg0 pat))
(set! (-> obj cur-pat) (-> arg0 pat))
(set! (-> obj ground-pat) (-> arg0 pat))
(set! (-> obj ground-touch-point quad) (-> arg1 quad))
0
(none)
)
;; WARN: Stack slot offset 128 signed mismatch
(defmethod
dummy-59
collide-shape-moving
((obj collide-shape-moving)
(arg0 vector)
(arg1 uint)
(arg2 float)
(arg3 symbol)
(arg4 symbol)
(arg5 symbol)
)
(local-vars (sv-128 float) (sv-144 collide-mesh-cache-tri))
(set! sv-128 arg2)
(let ((s5-0 arg3))
(let ((s3-0 arg4)
(s1-0 arg5)
)
(if *debug-segment*
(add-frame
(-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :r #x40 :b #x40 :a #x80)
)
)
(dummy-57 obj arg0)
(let ((s0-0 (-> obj shadow-pos)))
(set! (-> s0-0 quad) (-> obj trans quad))
(set! sv-144 (new 'stack-no-clear 'collide-mesh-cache-tri))
(+! (-> s0-0 y) sv-128)
0.0
(let ((f0-4 (if s1-0
(misty-ambush-height-probe s0-0 81920.0)
(dummy-10
*collide-cache*
s0-0
(new 'static 'vector :y -81920.0 :w 1.0)
40.96
(the-as int arg1)
(-> obj process)
sv-144
1
)
)
)
)
(cond
((>= f0-4 0.0)
(let ((a2-3 (new 'static 'vector :y -81920.0 :w 1.0)))
(vector+float*! s0-0 s0-0 a2-3 f0-4)
)
(when (>= (-> s0-0 y) (-> obj trans y))
(dummy-64 obj (the-as collide-tri-result sv-144) s0-0)
(set!
(-> obj ground-impact-vel)
(- (vector-dot arg0 (-> obj dynam gravity-normal)))
)
(set! (-> arg0 y) 0.0)
)
)
(s3-0
(set! (-> obj trans y) (-> obj trans-old 0 y))
)
)
)
)
)
(when (logtest? (-> obj root-prim collide-with) 30)
(let ((a1-7 (new 'stack-no-clear 'touching-shapes-entry)))
(set! (-> a1-7 cshape1) (the-as collide-shape 1))
(set! (-> a1-7 cshape2) (the-as collide-shape *touching-list*))
(when (dummy-40 obj a1-7)
(if s5-0
(TODO-RENAME-30 obj (the-as vector (-> obj trans-old)))
)
)
)
)
)
(if *debug-segment*
(add-frame
(-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :g #xff :a #x80)
)
)
0
(none)
)
(defmethod
dummy-60
collide-shape-moving
((obj collide-shape-moving)
(arg0 float)
(arg1 float)
(arg2 symbol)
(arg3 uint)
)
(if *debug-segment*
(add-frame
(-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :r #x40 :b #x40 :a #x80)
)
)
(let ((s4-0 (new 'stack-no-clear 'vector))
(s3-0 (new 'stack-no-clear 'collide-tri-result))
)
(let ((f30-0 (+ arg0 arg1)))
(set! (-> s4-0 quad) (-> obj trans quad))
(+! (-> s4-0 y) arg0)
0.0
(let
((f0-4
(fill-and-probe-using-y-probe
*collide-cache*
s4-0
f30-0
arg3
(-> obj process)
s3-0
(the-as uint 1)
)
)
)
(when (< f0-4 0.0)
(if arg2
(format
0
"WARNING: move-to-ground: (~f ~f) failed to locate ground [~S type ~S]~%"
(* 0.00024414062 (-> s4-0 y))
(* 0.00024414062 f30-0)
(-> obj process name)
(-> obj process type symbol)
)
)
(return #f)
)
(set! (-> s4-0 y) (- (-> s4-0 y) (* f0-4 f30-0)))
)
)
(set! (-> obj shadow-pos quad) (-> s4-0 quad))
(dummy-64 obj s3-0 s4-0)
)
(if *debug-segment*
(add-frame
(-> *display* frames (-> *display* on-screen) frame profile-bar 0)
'draw
(new 'static 'rgba :r #xff :g #xff :b #xff :a #x80)
)
)
#t
)
(defmethod
dummy-62
collide-shape-moving
((obj collide-shape-moving) (arg0 vector) (arg1 float))
(let* ((s4-0 (vector-negate! (new-stack-vector0) (-> obj dynam gravity)))
(a2-1 (-> obj local-normal))
(a2-2 (vector-reflect-flat! (new-stack-vector0) s4-0 a2-1))
)
(vector--float*! arg0 s4-0 a2-2 (cond
((logtest? (-> obj status) 1)
(empty)
arg1
)
(else
0.0
)
)
)
)
arg0
)
(defmethod dummy-33 collide-shape ((obj collide-shape) (arg0 vector) (arg1 uint))
(local-vars (at-0 int))
(rlet ((vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf)
)
(init-vf0-vector)
(let ((a0-1 (new 'stack-no-clear 'vector)))
(let ((v1-0 a0-1))
(.lvf vf1 (&-> arg0 quad))
(let ((f0-0 (-> *display* seconds-per-frame)))
(.mov at-0 f0-0)
)
(.mov vf2 at-0)
(.mov.vf vf1 vf0 :mask #b1000)
(.mul.x.vf vf1 vf1 vf2 :mask #b111)
(.svf (&-> v1-0 quad) vf1)
)
(let ((f0-2 (+ (vector-length a0-1) (if (= (-> obj process type) target)
4096.0
0.0
)
)
)
)
(dummy-32 obj f0-2 arg1)
)
)
(dummy-37 obj arg0)
(none)
)
)
(defmethod dummy-32 collide-shape ((obj collide-shape) (arg0 object) (arg1 uint))
(let ((s5-0 (new 'stack-no-clear 'bounding-box)))
(cond
((dummy-36 obj s5-0 (the-as float arg0) arg1)
(dummy-13
*collide-cache*
s5-0
arg1
(-> obj process)
(the-as uint (-> obj pat-ignore-mask))
)
(if (and *display-collide-cache* (= (-> obj process type) target))
(dummy-9 *collide-cache*)
)
)
(else
(initialize *collide-cache*)
)
)
)
(none)
)
(defmethod
dummy-36
collide-shape
((obj collide-shape) (arg0 bounding-box) (arg1 float) (arg2 uint))
(rlet ((vf0 :class vf)
(vf1 :class vf)
(vf29 :class vf)
(vf30 :class vf)
(vf31 :class vf)
)
(init-vf0-vector)
(let ((v1-0 (new 'static 'vector :x 4.096))
(a0-1 (-> obj root-prim))
)
(cond
((logtest? (-> a0-1 collide-with) arg2)
(.mov vf31 arg1)
(.lvf vf1 (&-> v1-0 quad))
(.add.x.vf vf31 vf31 vf1 :mask #b1)
(cond
((dummy-20 a0-1 arg2)
(.mov.vf vf29 vf0 :mask #b1000)
(.mov.vf vf30 vf0 :mask #b1000)
(.svf (&-> arg0 min quad) vf29)
(.svf (&-> arg0 max quad) vf30)
(return #t)
)
(else
(return #f)
)
)
(the-as none 0)
)
(else
(return #f)
)
)
)
(the-as symbol 0)
)
)
;; WARN: Bad vector register dependency: vf31
(defmethod dummy-20 collide-shape-prim ((obj collide-shape-prim) (arg0 uint))
(rlet ((vf1 :class vf)
(vf2 :class vf)
(vf29 :class vf)
(vf30 :class vf)
(vf31 :class vf)
)
(.lvf vf1 (&-> obj prim-core world-sphere quad))
(.add.w.vf vf2 vf31 vf1 :mask #b1)
(.add.x.vf vf30 vf1 vf2 :mask #b111)
(.sub.x.vf vf29 vf1 vf2 :mask #b111)
#t
)
)
;; ERROR: function was not converted to expressions. Cannot decompile.
(defmethod dummy-34 collide-shape ((obj collide-shape) (arg0 uint))
(dummy-10 (-> obj root-prim) arg0)
)
(defmethod dummy-10 collide-shape-prim ((obj collide-shape-prim) (arg0 uint))
(if (= (-> obj prim-id) arg0)
(return obj)
)
(the-as collide-shape-prim #f)
)
(defmethod
dummy-10
collide-shape-prim-group
((obj collide-shape-prim-group) (arg0 uint))
(if (= (-> obj prim-id) arg0)
(return obj)
)
(countdown (s4-0 (-> obj num-prims))
(let ((a0-1 (-> obj prims s4-0)))
(cond
((= (-> a0-1 type) collide-shape-prim-group)
(let ((a0-2 (dummy-10 a0-1 arg0)))
(if a0-2
(return a0-2)
)
)
)
(else
(if (= (-> a0-1 prim-id) arg0)
(return a0-1)
)
)
)
)
)
(the-as collide-shape-prim #f)
)
(defun-debug collide-shape-draw-debug-marks ()
(add-debug-sphere
(or *display-collision-marks* *display-target-marks*)
(bucket-id debug-draw0)
(target-pos 0)
819.2
(new 'static 'rgba :r #xff :g #xff :b #xff :a #x80)
)
(when *display-collision-marks*
(let ((v1-4 (-> *collide-player-list* alive-list next0)))
*collide-player-list*
(let ((gp-1 (-> v1-4 next0)))
(while (!= v1-4 (-> *collide-player-list* alive-list-end))
(let ((s5-1 (-> (the-as connection v1-4) param1)))
(if
(or
(and (not *display-actor-anim*) (not *display-process-anim*))
(or
(= (-> (the-as collide-shape s5-1) process) *target*)
(name=
*display-actor-anim*
(-> (the-as collide-shape s5-1) process name)
)
(=
(ppointer->process *display-process-anim*)
(-> (the-as collide-shape s5-1) process)
)
)
)
(dummy-31 (the-as collide-shape s5-1))
)
)
(set! v1-4 gp-1)
*collide-player-list*
(set! gp-1 (-> gp-1 next0))
)
)
)
(let ((v1-19 (-> *collide-hit-by-player-list* alive-list next0)))
*collide-hit-by-player-list*
(let ((gp-2 (-> v1-19 next0)))
(while (!= v1-19 (-> *collide-hit-by-player-list* alive-list-end))
(let ((s5-2 (-> (the-as connection v1-19) param1)))
(if
(or
(and (not *display-actor-anim*) (not *display-process-anim*))
(or
(= (-> (the-as collide-shape s5-2) process) *target*)
(name=
*display-actor-anim*
(-> (the-as collide-shape s5-2) process name)
)
(=
(ppointer->process *display-process-anim*)
(-> (the-as collide-shape s5-2) process)
)
)
)
(dummy-31 (the-as collide-shape s5-2))
)
)
(set! v1-19 gp-2)
*collide-hit-by-player-list*
(set! gp-2 (-> gp-2 next0))
)
)
)
(let ((v1-34 (-> *collide-usually-hit-by-player-list* alive-list next0)))
*collide-usually-hit-by-player-list*
(let ((gp-3 (-> v1-34 next0)))
(while (!= v1-34 (-> *collide-usually-hit-by-player-list* alive-list-end))
(let ((s5-3 (-> (the-as connection v1-34) param1)))
(if
(or
(and (not *display-actor-anim*) (not *display-process-anim*))
(or
(= (-> (the-as collide-shape s5-3) process) *target*)
(name=
*display-actor-anim*
(-> (the-as collide-shape s5-3) process name)
)
(=
(ppointer->process *display-process-anim*)
(-> (the-as collide-shape s5-3) process)
)
)
)
(dummy-31 (the-as collide-shape s5-3))
)
)
(set! v1-34 gp-3)
*collide-usually-hit-by-player-list*
(set! gp-3 (-> gp-3 next0))
)
)
)
(let ((v1-49 (-> *collide-hit-by-others-list* alive-list next0)))
*collide-hit-by-others-list*
(let ((gp-4 (-> v1-49 next0)))
(while (!= v1-49 (-> *collide-hit-by-others-list* alive-list-end))
(let ((s5-4 (-> (the-as connection v1-49) param1)))
(if
(or
(and (not *display-actor-anim*) (not *display-process-anim*))
(or
(= (-> (the-as collide-shape s5-4) process) *target*)
(name=
*display-actor-anim*
(-> (the-as collide-shape s5-4) process name)
)
(=
(ppointer->process *display-process-anim*)
(-> (the-as collide-shape s5-4) process)
)
)
)
(dummy-31 (the-as collide-shape s5-4))
)
)
(set! v1-49 gp-4)
*collide-hit-by-others-list*
(set! gp-4 (-> gp-4 next0))
)
)
)
)
0
(none)
)
(defmethod dummy-31 collide-shape ((obj collide-shape))
(if (sphere-in-view-frustum? (the-as sphere (-> obj root-prim prim-core)))
(debug-draw-world-sphere (-> obj root-prim))
)
(none)
)
(define *col-timer* (new 'global 'stopwatch))
(define *frame-timer* (new 'global 'stopwatch))
(define *col-timer-enable* #t)
(defun debug-report-col-stats ()
(when *col-timer-enable*
(stopwatch-end *frame-timer*)
(format *stdcon* "col stats:~%")
(format
*stdcon*
" col ~F ms~%"
(* 1000.0 (stopwatch-elapsed-seconds *col-timer*))
)
(format
*stdcon*
" frame ~F ms~%"
(* 1000.0 (stopwatch-elapsed-seconds *frame-timer*))
)
(stopwatch-init *col-timer*)
(stopwatch-init *frame-timer*)
(stopwatch-begin *frame-timer*)
)
)
(defmethod dummy-47 collide-shape ((obj collide-shape))
(dummy-25 (-> obj root-prim) (-> obj process))
#f
)
(defmethod
dummy-25
collide-shape-prim
((obj collide-shape-prim) (arg0 process-drawable))
(local-vars (a0-2 float) (a0-4 float) (a0-6 float))
(rlet ((acc :class vf)
(Q :class vf)
(vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf)
(vf3 :class vf)
(vf4 :class vf)
(vf5 :class vf)
)
(init-vf0-vector)
(let ((a1-1 (-> arg0 node-list))
(v1-0 (-> obj cshape))
(a0-1 (-> obj transform-index))
)
(cond
((nonzero? a1-1)
(cond
((>= a0-1 0)
(let ((v1-4 (-> a1-1 data a0-1 bone transform)))
(.lvf vf5 (&-> v1-4 vector 3 quad))
(.lvf vf1 (&-> obj local-sphere quad))
(.lvf vf2 (&-> v1-4 vector 0 quad))
(.mul.w.vf acc vf5 vf0)
(.div.vf Q vf0 vf5 :fsf #b11 :ftf #b11)
(.lvf vf3 (&-> v1-4 vector 1 quad))
(.add.mul.x.vf acc vf2 vf1 acc)
(.lvf vf4 (&-> v1-4 vector 2 quad))
)
(.add.mul.y.vf acc vf3 vf1 acc)
(.add.mul.z.vf vf1 vf4 vf1 acc :mask #b111)
(.mul.vf vf1 vf1 Q :mask #b111)
(.svf (&-> obj prim-core world-sphere quad) vf1)
(.mov a0-2 vf1)
)
(else
(when (= a0-1 -2)
(.lvf vf1 (&-> obj local-sphere quad))
(.lvf vf2 (&-> v1-0 trans quad))
(.add.vf vf1 vf1 vf2 :mask #b111)
(.svf (&-> obj prim-core world-sphere quad) vf1)
(.mov a0-4 vf1)
)
)
)
)
(else
(when (!= a0-1 -1)
(.lvf vf1 (&-> obj local-sphere quad))
(.lvf vf2 (&-> v1-0 trans quad))
(.add.vf vf1 vf1 vf2 :mask #b111)
(.svf (&-> obj prim-core world-sphere quad) vf1)
(.mov a0-6 vf1)
)
)
)
)
(when (= (-> obj type) collide-shape-prim-group)
(countdown (s4-0 (-> (the-as collide-shape-prim-group obj) num-prims))
(dummy-25 (-> (the-as collide-shape-prim-group obj) prims s4-0) arg0)
)
#f
)
)
)
(defmethod TODO-RENAME-28 collide-shape ((obj collide-shape) (arg0 vector))
(vector+! (-> obj trans) (-> obj trans) arg0)
(dummy-9 (-> obj root-prim) arg0)
(none)
)
(defmethod dummy-9 collide-shape-prim ((obj collide-shape-prim) (arg0 vector))
(vector+!
(the-as vector (-> obj prim-core))
(the-as vector (-> obj prim-core))
arg0
)
(let ((f0-0 (-> obj local-sphere w)))
(set! (-> obj prim-core world-sphere w) f0-0)
(the-as object f0-0)
)
)
(defmethod
dummy-9
collide-shape-prim-group
((obj collide-shape-prim-group) (arg0 vector))
(vector+!
(the-as vector (-> obj prim-core))
(the-as vector (-> obj prim-core))
arg0
)
(set! (-> obj prim-core world-sphere w) (-> obj local-sphere w))
(countdown (s4-0 (-> obj num-prims))
(let ((a0-2 (-> obj prims s4-0)))
(cond
((= (-> a0-2 type) collide-shape-prim-group)
(dummy-9 a0-2 arg0)
)
(else
(vector+!
(the-as vector (-> a0-2 prim-core))
(the-as vector (-> a0-2 prim-core))
arg0
)
(set! (-> a0-2 prim-core world-sphere w) (-> a0-2 local-sphere w))
)
)
)
)
(the-as object #f)
)
(defmethod TODO-RENAME-30 collide-shape ((obj collide-shape) (arg0 vector))
(let ((v1-0 (new 'stack-no-clear 'vector)))
(vector-! v1-0 arg0 (-> obj trans))
(TODO-RENAME-28 obj v1-0)
)
(none)
)
(defmethod
set-root-prim!
collide-shape
((obj collide-shape) (arg0 collide-shape-prim))
(set! (-> obj root-prim) arg0)
arg0
)
(defmethod
set-collide-with!
collide-shape-prim
((obj collide-shape-prim) (arg0 handle))
(set! (-> obj collide-with) (the-as uint arg0))
0
(none)
)
(defmethod
set-collide-with!
collide-shape-prim-group
((obj collide-shape-prim-group) (arg0 handle))
(set! (-> obj collide-with) (the-as uint arg0))
(dotimes (s4-0 (-> obj num-prims))
(set-collide-with! (-> obj prims s4-0) arg0)
)
0
(none)
)
(defmethod
set-collide-as!
collide-shape-prim
((obj collide-shape-prim) (arg0 handle))
(set! (-> obj prim-core collide-as) (the-as uint arg0))
0
(none)
)
(defmethod
set-collide-as!
collide-shape-prim-group
((obj collide-shape-prim-group) (arg0 handle))
(set! (-> obj prim-core collide-as) (the-as uint arg0))
(dotimes (s4-0 (-> obj num-prims))
(set-collide-as! (-> obj prims s4-0) arg0)
)
0
(none)
)
(defmethod
set-root-prim-collide-with!
collide-shape
((obj collide-shape) (arg0 handle))
(set-collide-with! (-> obj root-prim) arg0)
0
(none)
)
(defmethod
set-root-prim-collide-as!
collide-shape
((obj collide-shape) (arg0 handle))
(set-collide-as! (-> obj root-prim) arg0)
0
(none)
)
(defmethod
append-prim
collide-shape-prim-group
((obj collide-shape-prim-group) (arg0 collide-shape-prim))
(let ((v1-0 (-> obj num-prims)))
(cond
((>= v1-0 (-> obj allocated-prims))
(format
0
"collide-shape-prim-group::append-prim : Exceeded max # of prims!~%"
)
)
(else
(set! (-> obj prims v1-0) arg0)
(set! (-> obj num-prims) (+ v1-0 1))
)
)
)
(none)
)
(defmethod find-collision-meshes collide-shape ((obj collide-shape))
(let ((s5-0 0))
(let ((v1-1 (-> obj process draw)))
(when (and (nonzero? v1-1) (-> v1-1 jgeo))
(let
((a1-1
(res-lump-struct (-> v1-1 jgeo extra) 'collide-mesh-group structure)
)
)
(if a1-1
(set!
s5-0
(num-mesh (-> obj root-prim) (the-as collide-shape-prim a1-1))
)
)
)
)
)
(if (nonzero? s5-0)
(format
0
"ERROR: Failed to find collision meshes for ~D prim(s) in ~A!~%"
s5-0
(-> obj process name)
)
)
)
(dummy-47 obj)
)
(defmethod
num-mesh
collide-shape-prim
((obj collide-shape-prim) (arg0 collide-shape-prim))
(local-vars (v0-0 int))
(return 0)
v0-0
)
(defmethod
num-mesh
collide-shape-prim-mesh
((obj collide-shape-prim-mesh) (arg0 collide-shape-prim))
(let ((s4-0 (-> obj mesh-id)))
(cond
((and (>= s4-0 0) (< s4-0 (length arg0)))
(set!
(-> obj mesh)
(the-as collide-mesh (-> arg0 prim-core world-sphere data s4-0))
)
(return 0)
)
(else
(set! (-> obj mesh) #f)
(return 1)
)
)
)
(the-as int 0)
)
(defmethod
num-mesh
collide-shape-prim-group
((obj collide-shape-prim-group) (arg0 collide-shape-prim))
(let ((gp-0 0))
(countdown (s3-0 (-> obj num-prims))
(+! gp-0 (num-mesh (-> obj prims s3-0) arg0))
)
gp-0
)
)
(defmethod
init!
collide-shape-intersect
((obj collide-shape-intersect) (arg0 vector))
(set! (-> obj move-vec quad) (-> arg0 quad))
(set! (-> obj best-u) -100000000.0)
(set! (-> obj best-from-prim) #f)
(set! (-> obj best-to-prim) #f)
#f
)
(defmethod debug-draw-world-sphere collide-shape-prim ((obj collide-shape-prim))
(add-debug-sphere
#t
(bucket-id debug-draw0)
(the-as vector (-> obj prim-core))
(-> obj local-sphere w)
(new 'static 'rgba :r #xff :g #xff :b #xff :a #x40)
)
)
(defmethod
debug-draw-world-sphere
collide-shape-prim-sphere
((obj collide-shape-prim-sphere))
(add-debug-sphere
#t
(bucket-id debug-draw0)
(the-as vector (-> obj prim-core))
(-> obj local-sphere w)
(the-as rgba (cond
((and
(zero? (-> obj prim-core collide-as))
(zero? (-> obj collide-with))
)
#x40808080
)
((logtest? (-> obj prim-core action) 1)
#x4000ffff
)
(else
#x400080ff
)
)
)
)
)
(defmethod
debug-draw-world-sphere
collide-shape-prim-mesh
((obj collide-shape-prim-mesh))
(add-debug-sphere
#t
(bucket-id debug-draw0)
(the-as vector (-> obj prim-core))
(-> obj local-sphere w)
(new 'static 'rgba :b #xff :a #x40)
)
)
(defmethod
debug-draw-world-sphere
collide-shape-prim-group
((obj collide-shape-prim-group))
(add-debug-sphere
#t
(bucket-id debug-draw0)
(the-as vector (-> obj prim-core))
(-> obj local-sphere w)
(new 'static 'rgba :g #xff :a #x10)
)
(countdown (s5-0 (-> obj num-prims))
(debug-draw-world-sphere (-> obj prims s5-0))
)
#f
)
;; ERROR: function was not converted to expressions. Cannot decompile.
(defmethod overlaps-others-test collide-shape-prim ((obj collide-shape-prim))
(format
0
"ERROR: Unsupported call to collide-shape-prim::overlaps-others-test!~%"
)
#f
)
;; ERROR: function was not converted to expressions. Cannot decompile.
;; ERROR: function was not converted to expressions. Cannot decompile.
;; ERROR: function was not converted to expressions. Cannot decompile.
;; ERROR: function was not converted to expressions. Cannot decompile.
(defmethod clear-collide-with-as collide-shape ((obj collide-shape))
(set! (-> obj root-prim collide-with) (the-as uint 0))
(set! (-> obj root-prim prim-core collide-as) (the-as uint 0))
0
(none)
)
(defmethod backup-collide-with-as collide-shape ((obj collide-shape))
(set! (-> obj backup-collide-with) (-> obj root-prim collide-with))
(set! (-> obj backup-collide-as) (-> obj root-prim prim-core collide-as))
0
(none)
)
(defmethod restore-collide-with-as collide-shape ((obj collide-shape))
(set! (-> obj root-prim collide-with) (-> obj backup-collide-with))
(set! (-> obj root-prim prim-core collide-as) (-> obj backup-collide-as))
0
(none)
)
(defmethod
dummy-53
collide-shape
((obj collide-shape) (arg0 int) (arg1 int) (arg2 int))
(let ((s3-0 (-> obj root-prim)))
(if (logtest? (-> s3-0 prim-id) arg0)
(set!
(-> s3-0 prim-core collide-as)
(logior (logclear (-> s3-0 prim-core collide-as) arg1) arg2)
)
)
(let
((v1-7
(if
(and
(nonzero? s3-0)
(type-type? (-> s3-0 type) collide-shape-prim-group)
)
s3-0
)
)
)
(when v1-7
(dotimes (a0-4 (-> (the-as collide-shape-prim-group v1-7) num-prims))
(let
((a1-4
(->
(the-as collide-shape-prim-group (+ (* a0-4 4) (the-as int v1-7)))
prims
0
)
)
)
(if (logtest? (-> a1-4 prim-id) arg0)
(set!
(-> a1-4 prim-core collide-as)
(logior (logclear (-> a1-4 prim-core collide-as) arg1) arg2)
)
)
)
)
)
)
)
0
(none)
)
(defmethod dummy-54 collide-shape ((obj collide-shape) (arg0 int) (arg1 int))
(let ((s4-0 (-> obj root-prim)))
(if (logtest? (-> s4-0 prim-id) arg0)
(set! (-> s4-0 prim-core offense) arg1)
)
(let
((v1-5
(if
(and
(nonzero? s4-0)
(type-type? (-> s4-0 type) collide-shape-prim-group)
)
s4-0
)
)
)
(when v1-5
(dotimes (a0-3 (-> (the-as collide-shape-prim-group v1-5) num-prims))
(let
((a1-4
(->
(the-as collide-shape-prim-group (+ (* a0-3 4) (the-as int v1-5)))
prims
0
)
)
)
(if (logtest? (-> a1-4 prim-id) arg0)
(set! (-> a1-4 prim-core offense) arg1)
)
)
)
)
)
)
0
(none)
)
(defmethod
dummy-55
collide-shape
((obj collide-shape)
(arg0 process)
(arg1 touching-shapes-entry)
(arg2 float)
(arg3 float)
(arg4 float)
)
(local-vars (sv-144 process))
(with-pp
(when arg1
(let ((s1-0 (-> arg1 head)))
(set! sv-144 arg0)
(let
((s5-0
(if
(and (nonzero? sv-144) (type-type? (-> sv-144 type) process-drawable))
sv-144
)
)
)
(when (and s1-0 s5-0)
(let
((s0-1 (get-touched-prim s1-0 obj (the-as touching-prims-entry arg1))))
(get-touched-prim
s1-0
(-> (the-as process-drawable s5-0) root)
(the-as touching-prims-entry arg1)
)
(let* ((v1-8 (dummy-11 s1-0 (new 'stack-no-clear 'vector)))
(s1-2
(vector-!
(new 'stack-no-clear 'vector)
v1-8
(the-as vector (-> s0-1 prim-core))
)
)
)
(vector-normalize! s1-2 1.0)
(when (< arg2 (-> s1-2 y))
(let ((s2-1 (new 'stack-no-clear 'vector)))
(set!
(-> s2-1 quad)
(-> (the-as process-drawable s5-0) root transv quad)
)
(let
((f30-0
(vector-xz-length (-> (the-as process-drawable s5-0) root transv))
)
)
(if (= f30-0 0.0)
(set!
(-> s2-1 quad)
(->
(vector-z-quaternion!
s2-1
(-> (the-as process-drawable s5-0) root quat)
)
quad
)
)
)
(vector-xz-normalize! s2-1 (fmax f30-0 arg4))
)
(set! (-> s2-1 y) arg3)
(let ((a1-8 (new 'stack-no-clear 'event-message-block)))
(set! (-> a1-8 from) pp)
(set! (-> a1-8 num-params) 2)
(set! (-> a1-8 message) 'shove)
(set! (-> a1-8 param 0) (the-as uint arg1))
(let ((v1-18 (new 'static 'attack-info :mask #x802)))
(set! (-> v1-18 vector quad) (-> s2-1 quad))
(set! (-> v1-18 angle) 'jump)
(set! (-> a1-8 param 1) (the-as uint v1-18))
)
(send-event-function s5-0 a1-8)
)
)
)
)
)
)
)
)
)
(none)
)
)
(defmethod
dummy-41
collide-shape
((obj collide-shape) (arg0 attack-info) (arg1 float))
(set! (-> arg0 shove-up) arg1)
(let* ((s3-0 (-> obj process path))
(s2-0 (-> s3-0 curve num-cverts))
(s4-0 (target-pos 0))
(s1-0 (new 'stack-no-clear 'vector))
(s5-0 (new 'stack-no-clear 'vector))
)
(let ((f30-0 -1.0))
(dotimes (s0-0 s2-0)
(eval-path-curve-div! s3-0 s1-0 (the float s0-0) 'interp)
(let ((f0-3 (vector-vector-distance-squared s4-0 s1-0)))
(when (or (< f30-0 0.0) (< f0-3 f30-0))
(set! f30-0 f0-3)
(set! (-> s5-0 quad) (-> s1-0 quad))
)
)
)
)
(vector-! (-> arg0 vector) s5-0 s4-0)
)
)