[jak2] improve debugging tools for entity lights and regions (#2327)

also fixes some other random bugs
This commit is contained in:
ManDude 2023-03-18 06:29:40 +00:00 committed by GitHub
parent 2fa4a23ea1
commit 198c8e1946
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 124 additions and 104 deletions

View file

@ -117,6 +117,13 @@
"name": "Game - Jak 2 - Runtime",
"args": ["-v", "--game", "jak2", "--", "-fakeiso", "-debug"]
},
{
"type": "default",
"project": "CMakeLists.txt",
"projectTarget": "gk.exe (bin\\gk.exe)",
"name": "Game - Jak 2 - Runtime (boot)",
"args": ["-v", "--game", "jak2", "--", "-boot", "-fakeiso", "-debug"]
},
{
"type": "default",
"project": "CMakeLists.txt",

View file

@ -409,11 +409,16 @@ void ISONameFromAnimationName(char* dst, const char* src) {
// some special case words map to special letters (likely to avoid animation name conflicts)
if (next_ptr - src_ptr == 10 && !memcmp(src_ptr, "resolution", 10)) {
// NOTE : jak 2 also allows "res" here but that doesn't work properly.
char_to_add = 'z';
} else if (next_ptr - src_ptr == 6 && !memcmp(src_ptr, "accept", 6)) {
char_to_add = 'y';
} else if (next_ptr - src_ptr == 6 && !memcmp(src_ptr, "reject", 6)) {
char_to_add = 'n';
} else if (next_ptr - src_ptr == 5 && !memcmp(src_ptr, "keira", 5)) {
// NOTE : this was added in jak 2. it's safe to use in jak 1 since she was referred to as
// "assistant" there
char_to_add = 'i';
} else {
// not a special case, just take the first letter.
char_to_add = *src_ptr;

View file

@ -4440,7 +4440,7 @@
((on-screen int32 :offset-assert 4)
(last-screen int32 :offset-assert 8)
(frames display-frame 2 :offset-assert 12)
(bgcolor uint64 :offset-assert 24)
(bgcolor gs-bgcolor :offset-assert 24)
(pmode gs-pmode :offset-assert 32)
(clock clock 13 :offset-assert 40)
(session-clock clock :offset 40)

View file

@ -98,6 +98,7 @@ void OpenGLRenderer::init_bucket_renderers_jak2() {
init_bucket_renderer<DirectRenderer>("sky-draw", BucketCategory::OTHER, BucketId::SKY_DRAW, 1024);
init_bucket_renderer<OceanMidAndFar>("ocean-mid-far", BucketCategory::OCEAN,
BucketId::OCEAN_MID_FAR);
// hardcoded level number!!!
for (int i = 0; i < 6; ++i) {
#define GET_BUCKET_ID_FOR_LIST(bkt1, bkt2, idx) ((int)(bkt1) + ((int)(bkt2) - (int)(bkt1)) * (idx))
init_bucket_renderer<TextureUploadHandler>(
@ -143,6 +144,9 @@ void OpenGLRenderer::init_bucket_renderers_jak2() {
fmt::format("etie-t-l{}-alpha", i), BucketCategory::TIE,
GET_BUCKET_ID_FOR_LIST(BucketId::ETIE_T_L0_ALPHA, BucketId::ETIE_T_L1_ALPHA, i), tie,
tfrag3::TieCategory::TRANS_ENVMAP);
init_bucket_renderer<Merc2>(
fmt::format("merc-l{}-alpha", i), BucketCategory::MERC,
GET_BUCKET_ID_FOR_LIST(BucketId::MERC_L0_ALPHA, BucketId::MERC_L1_ALPHA, i));
init_bucket_renderer<TextureUploadHandler>(
fmt::format("tex-l{}-pris", i), BucketCategory::TEX,

View file

@ -580,7 +580,8 @@ void Tie3::draw_matching_draws_for_tree(int idx,
last_texture = draw.tree_tex_id;
}
auto double_draw = setup_tfrag_shader(render_state, draw.mode, ShaderId::TFRAG3);
auto double_draw = setup_tfrag_shader(render_state, draw.mode,
use_envmap ? ShaderId::ETIE_BASE : ShaderId::TFRAG3);
glUniform1i(use_envmap ? m_etie_base_uniforms.decal : m_uniforms.decal,
draw.mode.get_decal() ? 1 : 0);

View file

@ -157,9 +157,13 @@ DoubleDraw setup_opengl_from_draw_mode(DrawMode mode, u32 tex_unit, bool mipmap)
DoubleDraw setup_tfrag_shader(SharedRenderState* render_state, DrawMode mode, ShaderId shader) {
auto draw_settings = setup_opengl_from_draw_mode(mode, GL_TEXTURE0, true);
glUniform1f(glGetUniformLocation(render_state->shaders[shader].id(), "alpha_min"),
draw_settings.aref_first);
glUniform1f(glGetUniformLocation(render_state->shaders[shader].id(), "alpha_max"), 10.f);
auto sh_id = render_state->shaders[shader].id();
if (auto u_id = glGetUniformLocation(sh_id, "alpha_min"); u_id != -1) {
glUniform1f(u_id, draw_settings.aref_first);
}
if (auto u_id = glGetUniformLocation(sh_id, "alpha_max"); u_id != -1) {
glUniform1f(u_id, 10.f);
}
return draw_settings;
}

View file

@ -154,11 +154,16 @@ void ISONameFromAnimationName(char* dst, const char* src) {
// some special case words map to special letters (likely to avoid animation name conflicts)
if (next_ptr - src_ptr == 10 && !memcmp(src_ptr, "resolution", 10)) {
// NOTE : jak 2 also allows "res" here but that doesn't work properly.
char_to_add = 'z';
} else if (next_ptr - src_ptr == 6 && !memcmp(src_ptr, "accept", 6)) {
char_to_add = 'y';
} else if (next_ptr - src_ptr == 6 && !memcmp(src_ptr, "reject", 6)) {
char_to_add = 'n';
} else if (next_ptr - src_ptr == 5 && !memcmp(src_ptr, "keira", 5)) {
// NOTE : this was added in jak 2. it's safe to use in jak 1 since she was referred to as
// "assistant" there
char_to_add = 'i';
} else {
// not a special case, just take the first letter.
char_to_add = *src_ptr;

View file

@ -1417,41 +1417,16 @@ Most functions take a boolean as their first argument. If the boolean is set to
(if (not enable)
(return #f)
)
(when (!= (-> light extra x) 0.0)
(add-debug-vector
enable
bucket
position
(-> light direction)
(meters 3)
(new 'static 'rgba :r #xff :g #xff :b #xff :a #x80)
)
(let ((sphere-pos (new-stack-vector0)))
(let ((v1-3 (-> light direction)))
(let ((a0-3 (* 12288.0 (-> light extra x))))
(.mov vf7 a0-3)
)
(.lvf vf5 (&-> v1-3 quad))
)
(.lvf vf4 (&-> position quad))
(.add.x.vf vf6 vf0 vf0 :mask #b1000)
(.mul.x.vf acc vf5 vf7 :mask #b111)
(.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111)
(.svf (&-> sphere-pos quad) vf6)
(let ((color-rgba (logior (logior (logior (shr (shl (the int (* 128.0 (-> light color w))) 56) 32)
(shr (shl (the int (* 128.0 (-> light color z))) 56) 40)
)
(shr (shl (the int (* 128.0 (-> light color y))) 56) 48)
)
(shr (shl (the int (* 128.0 (-> light color x))) 56) 56)
)
)
)
(format (clear *temp-string*) "~S ~,,2f" text (-> light extra x))
(let ((t0-2 *temp-string*))
(add-debug-text-sphere enable bucket sphere-pos (* 2048.0 (-> light extra x)) t0-2 (the-as rgba color-rgba))
)
)
(when (!= (-> light level) 0.0)
(add-debug-vector enable bucket position (-> light direction) (meters 3) (static-rgba #xff #xff #xff #x80))
(let ((light-vec-end (vector+*! (new-stack-vector0) position (-> light direction) (* (meters 3) (-> light level))))
;; the original code here uses w for alpha but that looks terrible
(light-rgba (new 'static 'rgba :r (the int (* 128.0 (-> light color x)))
:g (the int (* 128.0 (-> light color y)))
:b (the int (* 128.0 (-> light color z)))
:a 128
)))
(add-debug-text-sphere enable bucket light-vec-end (* (meters 0.5) (-> light level)) (string-format "~S ~,,2f" text (-> light level)) light-rgba)
)
)
#f

View file

@ -1062,6 +1062,8 @@
(set! (-> dc shadow-ctrl settings shadow-dir w) shadow-dir-w)
)
)
(#when PC_PORT (add-debug-lights *display-lights* (bucket-id debug2) (-> lg lights) (-> dc origin)))
)
)
)

View file

@ -178,6 +178,7 @@
(define *display-sprite-marks* #f)
(define *display-sprite-spheres* #f)
(define *display-entity-errors* #t)
(#when PC_PORT (define *display-lights* #f))
(define *display-instance-info* #f)
(define *display-deci-count* #f)
(define *sync-dma* #f)

View file

@ -1328,34 +1328,43 @@
(define-extern entity-inspect-draw (function entity-debug-inspect object))
(entity-inspect-draw *entity-debug-inspect*)
)
(when *display-region-inside*
(format *stdcon* "~1kinside region:~%")
;; go through active levels
(dotimes (lev-i (-> *level* length))
(let ((lev (-> *level* level lev-i)))
(when (= (-> lev status) 'active)
(let ((region-trees (-> lev bsp region-trees)))
(when (nonzero? region-trees)
(let* ((s3-5 (-> region-trees length))
(tree-i 0)
(region-tree (-> region-trees tree-i))
)
(while (< tree-i s3-5)
(let* ((s0-4 (-> region-tree data2 (+ (-> region-tree length) -1) length))
(i 0)
(region (-> (the-as drawable-inline-array-region-prim (-> region-tree data2 (+ (-> region-tree length) -1))) data i))
)
(while (< i s0-4)
(when (region-method-9 (-> region region) (target-pos 0))
(debug-draw-region region 0)
(format *stdcon* " region-~D~%" (-> region region id)))
(set! i (+ i 1))
(set! region (-> (the-as drawable-inline-array-region-prim (-> region-tree data2 (+ (-> region-tree length) -1))) data i))
)
;; go through active levels
(dotimes (lev-i (-> *level* length))
(let ((lev (-> *level* level lev-i)))
(when (= (-> lev status) 'active)
(let ((region-trees (-> lev bsp region-trees)))
(when (nonzero? region-trees)
(let* ((s3-5 (-> region-trees length))
(tree-i 0)
(region-tree (-> region-trees tree-i))
)
(while (< tree-i s3-5)
(let* ((s0-4 (-> region-tree data2 (+ (-> region-tree length) -1) length))
(i 0)
(region (-> (the-as drawable-inline-array-region-prim (-> region-tree data2 (+ (-> region-tree length) -1))) data i))
)
(while (< i s0-4)
(let ((draw? #f))
(when (and *display-region-inside* (region-method-9 (-> region region) (target-pos 0)))
(true! draw?)
(format *stdcon* "~1kinside region-~D (~A)~%" (-> region region id) (-> lev name)))
(when (and *region-debug-inspect* (or (= *region-debug-inspect* region) (and *merge-region-prims* (= (-> region region id) (-> *region-debug-inspect* region id)))))
(when (= *region-debug-inspect* region)
(format *stdcon* "~1kinspecting region-~D (~A)~%" (-> *region-debug-inspect* region id) (-> lev name))
(format *stdcon* " on-enter: ~A~%" (-> *region-debug-inspect* region on-enter))
(format *stdcon* " on-inside: ~A~%" (-> *region-debug-inspect* region on-inside))
(format *stdcon* " on-exit: ~A~%" (-> *region-debug-inspect* region on-exit))
)
(true! draw?)
)
(when draw?
(debug-draw-region region 0)))
(set! i (+ i 1))
(set! region (-> (the-as drawable-inline-array-region-prim (-> region-tree data2 (+ (-> region-tree length) -1))) data i))
)
(+! tree-i 1)
(set! region-tree (-> region-trees tree-i))
)
(+! tree-i 1)
(set! region-tree (-> region-trees tree-i))
)
)
)
@ -1363,15 +1372,6 @@
)
)
)
(when *region-debug-inspect*
(format *stdcon* "~1kinspecting region-~D~%" (-> *region-debug-inspect* region id))
(format *stdcon* " on-enter: ~A~%" (-> *region-debug-inspect* region on-enter))
(format *stdcon* " on-inside: ~A~%" (-> *region-debug-inspect* region on-inside))
(format *stdcon* " on-exit: ~A~%" (-> *region-debug-inspect* region on-exit))
(when (or (not *display-region-inside*) (not (region-method-9 (-> *region-debug-inspect* region) (target-pos 0))))
(debug-draw-region *region-debug-inspect* 0)
)
)
)
)
(debug-draw-buffers)

View file

@ -1232,15 +1232,9 @@
(if (not (-> s5-0 allow-blackout))
(set! f0-71 0.0)
)
(set! (-> v1-133 bgcolor)
(logior (logand (-> v1-133 bgcolor) -256) (shr (shl (the int (* 255.0 (-> s5-0 bg-r))) 56) 56))
)
(set! (-> v1-133 bgcolor)
(logior (logand (-> v1-133 bgcolor) -65281) (shr (shl (the int (* 255.0 (-> s5-0 bg-g))) 56) 48))
)
(set! (-> v1-133 bgcolor)
(logior (logand (-> v1-133 bgcolor) -16711681) (shr (shl (the int (* 255.0 (-> s5-0 bg-b))) 56) 40))
)
(set! (-> v1-133 bgcolor r) (the int (* 255.0 (-> s5-0 bg-r))))
(set! (-> v1-133 bgcolor g) (the int (* 255.0 (-> s5-0 bg-g))))
(set! (-> v1-133 bgcolor b) (the int (* 255.0 (-> s5-0 bg-b))))
(set! (-> v1-133 pmode alp) (the int (* 255.0 (- 1.0 f0-71))))
)
(set! (-> v1-133 run-half-speed) (the-as basic (-> s5-0 half-speed)))

View file

@ -59,7 +59,7 @@ At any point in time, there are 3 frames in progress:
((on-screen int32 :offset-assert 4) ;; frame index (0 or 1)
(last-screen int32 :offset-assert 8) ;; frame index (0 or 1)
(frames display-frame 2 :offset-assert 12) ;; per-frame dma/timing
(bgcolor uint64 :offset-assert 24) ;; GS setting
(bgcolor gs-bgcolor :offset-assert 24) ;; GS setting
(pmode gs-pmode :offset-assert 32) ;; GS setting
(clock clock 13 :offset-assert 40)
(session-clock clock :offset 40)

View file

@ -130,7 +130,7 @@ Will also set a bunch of common settings related to profiling and the camera to
)
)
(set! (-> gs-bank pmode) (-> display pmode))
(set! (-> gs-bank bgcolor) (the-as gs-bgcolor (-> display bgcolor)))
(set! (-> gs-bank bgcolor) (-> display bgcolor))
)
(set! (-> gs-bank dspfb1) (new 'static 'gs-display-fb :fbw #xa :fbp (-> video-settings display-fbp)))
)

View file

@ -601,16 +601,33 @@
(defun dm-region-pick-func ((r drawable-region-prim) (msg debug-menu-msg))
(when (= msg (debug-menu-msg press))
(if (= *region-debug-inspect* r)
(set! *region-debug-inspect* (the drawable-region-prim #f))
(set! *region-debug-inspect* #f)
(set! *region-debug-inspect* r))
)
(= *region-debug-inspect* r)
)
(defun build-regions-list ()
(defun debug-menu-node-region<? ((arg0 debug-menu-item) (arg1 debug-menu-item))
(<= (-> (the-as drawable-region-prim (-> arg0 id)) region id) (-> (the-as drawable-region-prim (-> arg1 id)) region id))
)
(defun array-uint32-value? ((arr (array uint32)) (val uint))
(dotimes (i (-> arr length))
(if (= val (-> arr i)) (return #t)))
#f)
(define *region-debug-id-list* (new 'static 'boxed-array :type uint32 :length 0 :allocated-length 2000))
(defun build-regions-list ((merge-prims? symbol))
"Fill the region pick menu"
;; clear old list
(debug-menu-remove-all-items *region-pick-menu*)
(set! *region-debug-inspect* #f)
(set! *merge-region-prims* merge-prims?)
(dotimes (i (-> *region-debug-id-list* allocated-length))
(set! (-> *region-debug-id-list* i) -1))
(set! (-> *region-debug-id-list* length) 0)
;; go through active levels
(dotimes (lev-i (-> *level* length))
(let ((lev (-> *level* level lev-i)))
@ -627,12 +644,18 @@
(region (-> (the-as drawable-inline-array-region-prim (-> region-tree data2 (+ (-> region-tree length) -1))) data i))
)
(while (< i s0-4)
(debug-menu-append-item *region-pick-menu* (new-dm-flag (new 'debug 'string 0 (string-format "region-~D" (-> region region id))) region dm-region-pick-func))
(set! i (+ i 1))
(when (or (not merge-prims?) (not (array-uint32-value? *region-debug-id-list* (-> region region id))))
(debug-menu-append-item *region-pick-menu* (new-dm-flag (new 'debug 'string 0 (string-format "region-~D" (-> region region id))) region dm-region-pick-func))
(when merge-prims?
(set! (-> *region-debug-id-list* (-> *region-debug-id-list* length)) (-> region region id))
(1+! (-> *region-debug-id-list* length))
)
)
(1+! i)
(set! region (-> (the-as drawable-inline-array-region-prim (-> region-tree data2 (+ (-> region-tree length) -1))) data i))
)
)
(+! tree-i 1)
(1+! tree-i)
(set! region-tree (-> region-trees tree-i))
)
)
@ -641,7 +664,8 @@
)
)
)
(set! (-> *region-pick-menu* items) (sort (-> *region-pick-menu* items) debug-menu-node<?))
(set! (-> *region-pick-menu* items) (sort (-> *region-pick-menu* items) debug-menu-node-region<?))
)
(defun dm-print-region-pick-func ((kind symbol))
@ -660,6 +684,7 @@
(debug-menu-append-item regions-menu (new-dm-submenu "Pick Region" pick-menu))
)
(debug-menu-append-item regions-menu (new-dm-func "Refresh" #f build-regions-list))
(debug-menu-append-item regions-menu (new-dm-func "Refresh (merge prims)" #t build-regions-list))
(debug-menu-append-item regions-menu (new-dm-func "Go to region" #f
(lambda ()
(unless *region-debug-inspect* (return #f))
@ -673,6 +698,7 @@
(debug-menu-append-item regions-menu (new-dm-func "Print on-inside" 'on-inside dm-print-region-pick-func))
(debug-menu-append-item regions-menu (new-dm-func "Print on-exit" 'on-exit dm-print-region-pick-func))
(debug-menu-append-item regions-menu (new-dm-bool "Display region inside" *display-region-inside* dm-boolean-toggle-pick-func))
(debug-menu-append-item regions-menu (new-dm-bool "Region Marks" *display-region-marks* dm-boolean-toggle-pick-func))
(new-dm-submenu "Regions" regions-menu)
)
@ -863,6 +889,7 @@
;; )
(flag "Joint names" *display-joint-names* dm-boolean-toggle-pick-func)
(flag "Bone lines" *display-bones* dm-boolean-toggle-pick-func)
(flag "Entity Lights" *display-lights* dm-boolean-toggle-pick-func)
)
)
)

View file

@ -55,6 +55,7 @@
(define *region-debug-inspect* (the drawable-region-prim #f))
(define *display-region-inside* #f)
(define *merge-region-prims* #f)
(define *display-city-info* #f)
(define *city-info-x* 0)

View file

@ -1246,15 +1246,9 @@
(if (not (-> s5-0 allow-blackout))
(set! f0-71 0.0)
)
(set! (-> v1-133 bgcolor)
(logior (logand (-> v1-133 bgcolor) -256) (shr (shl (the int (* 255.0 (-> s5-0 bg-r))) 56) 56))
)
(set! (-> v1-133 bgcolor)
(logior (logand (-> v1-133 bgcolor) -65281) (shr (shl (the int (* 255.0 (-> s5-0 bg-g))) 56) 48))
)
(set! (-> v1-133 bgcolor)
(logior (logand (-> v1-133 bgcolor) -16711681) (shr (shl (the int (* 255.0 (-> s5-0 bg-b))) 56) 40))
)
(set! (-> v1-133 bgcolor r) (the int (* 255.0 (-> s5-0 bg-r))))
(set! (-> v1-133 bgcolor g) (the int (* 255.0 (-> s5-0 bg-g))))
(set! (-> v1-133 bgcolor b) (the int (* 255.0 (-> s5-0 bg-b))))
(set! (-> v1-133 pmode alp) (the int (* 255.0 (- 1.0 f0-71))))
)
(set! (-> v1-133 run-half-speed) (the-as basic (-> s5-0 half-speed)))

View file

@ -60,7 +60,7 @@
((on-screen int32 :offset-assert 4)
(last-screen int32 :offset-assert 8)
(frames display-frame 2 :offset-assert 12)
(bgcolor uint64 :offset-assert 24)
(bgcolor gs-bgcolor :offset-assert 24)
(pmode gs-pmode :offset-assert 32)
(clock clock 13 :offset-assert 40)
(session-clock clock :offset 40)

View file

@ -134,7 +134,7 @@ Will also set a bunch of common settings related to profiling and the camera to
)
)
(set! (-> gs-bank pmode) (-> display pmode))
(set! (-> gs-bank bgcolor) (the-as gs-bgcolor (-> display bgcolor)))
(set! (-> gs-bank bgcolor) (-> display bgcolor))
)
(set! (-> gs-bank dspfb1) (new 'static 'gs-display-fb :fbw #xa :fbp (-> video-settings display-fbp)))
)