From 50d93a3f79880ec0ee322861c485c538a8faf19f Mon Sep 17 00:00:00 2001 From: ManDude <7569514+ManDude@users.noreply.github.com> Date: Mon, 17 Apr 2023 03:56:19 +0100 Subject: [PATCH] update collision renderer for jak 2 (#2508) Doesn't actually do anything in Jak 2 because the collide mesh isn't extracted, but the functionality is all there. Also updated the renderer a bit to keep the colors more readable. --- decompiler/level_extractor/extract_tie.cpp | 2 +- .../opengl_renderer/CollideMeshRenderer.cpp | 101 +++++++++- .../opengl_renderer/CollideMeshRenderer.h | 15 +- .../opengl_renderer/OpenGLRenderer.cpp | 14 +- .../opengl_renderer/shaders/collision.vert | 67 ++----- goal_src/jak2/pc/debug/default-menu-pc.gc | 186 +++++++++--------- 6 files changed, 238 insertions(+), 147 deletions(-) diff --git a/decompiler/level_extractor/extract_tie.cpp b/decompiler/level_extractor/extract_tie.cpp index 388d73da46..abb22c4201 100644 --- a/decompiler/level_extractor/extract_tie.cpp +++ b/decompiler/level_extractor/extract_tie.cpp @@ -718,7 +718,7 @@ void update_proto_info(std::vector* out, } } - if (version > GameVersion::Jak1) { + if (proto.has_envmap_shader && version > GameVersion::Jak1) { frag_info.envmap_tint_color = jak2_tint_color; } diff --git a/game/graphics/opengl_renderer/CollideMeshRenderer.cpp b/game/graphics/opengl_renderer/CollideMeshRenderer.cpp index 20262c9430..4e5b30b2ad 100644 --- a/game/graphics/opengl_renderer/CollideMeshRenderer.cpp +++ b/game/graphics/opengl_renderer/CollideMeshRenderer.cpp @@ -2,12 +2,96 @@ #include "game/graphics/opengl_renderer/background/background_common.h" -CollideMeshRenderer::CollideMeshRenderer() { +float material_colors_jak1[23 * 3] = { + 1.0f, 0.7f, 1.0f, // 0, stone + 0.1f, 2.0f, 2.0f, // 1, ice + 0.75f, 0.25f, 0.1f, // 2, quicksand + 0.1f, 0.25f, 0.75f, // 3, waterbottom + 0.5f, 0.15f, 0.1f, // 4, tar + 2.0f, 1.5f, 0.5f, // 5, sand + 1.5f, 0.75f, 0.1f, // 6, wood + 0.1f, 1.35f, 0.1f, // 7, grass + 1.7f, 1.3f, 0.1f, // 8, pcmetal + 1.8f, 1.8f, 1.8f, // 9, snow + 1.5f, 0.2f, 1.0f, // 10, deepsnow + 1.2f, 0.5f, 0.3f, // 11, hotcoals + 1.4f, 0.1f, 0.1f, // 12, lava + 0.8f, 0.3f, 0.1f, // 13, crwood + 1.0f, 0.4f, 1.0f, // 14, gravel + 1.5f, 0.5f, 0.15f, // 15, dirt + 0.7f, 0.7f, 1.0f, // 16, metal + 0.1f, 0.1f, 1.2f, // 17, straw + 0.75f, 1.75f, 0.75f, // 18, tube + 0.4f, 0.1f, 0.8f, // 19, swamp + 0.1f, 0.4f, 0.8f, // 20, stopproj + 1.9f, 0.1f, 1.9f, // 21, rotate + 1.0f, 1.0f, 1.0f, // 22, neutral +}; + +float event_colors_jak1[7 * 3] = { + 1.0f, 1.0f, 1.0f, // 0, none + 0.2f, 1.0f, 1.0f, // 1, deadly + 0.1f, 1.0f, 0.1f, // 2, endlessfall + 1.0f, 1.0f, 0.1f, // 3, burn + 0.1f, 0.1f, 1.0f, // 4, deadlyup + 1.0f, 0.1f, 0.5f, // 5, burnup + 1.0f, 0.1f, 0.1f, // 6, melt +}; + +float mode_colors_jak1[3 * 3] = { + 1.25f, 0.1f, 0.1f, // 0, ground + 0.1f, 0.1f, 1.0f, // 1, wall + 1.0f, 0.1f, 1.0f, // 2, obstacle +}; + +CollideMeshRenderer::CollideMeshRenderer(GameVersion version) { glGenVertexArrays(1, &m_vao); + glGenBuffers(1, &m_ubo); + + init_pat_colors(version); + + glBindBuffer(GL_UNIFORM_BUFFER, m_ubo); + glBufferData(GL_UNIFORM_BUFFER, sizeof(m_colors), &m_colors, GL_DYNAMIC_DRAW); + glBindBuffer(GL_UNIFORM_BUFFER, 0); } CollideMeshRenderer::~CollideMeshRenderer() { glDeleteVertexArrays(1, &m_vao); + glDeleteBuffers(1, &m_ubo); +} + +void CollideMeshRenderer::init_pat_colors(GameVersion version) { + for (int i = 0; i < 0x8; ++i) { + m_colors.pat_mode_colors[i].x() = -1.f; + m_colors.pat_mode_colors[i].y() = -1.f; + m_colors.pat_mode_colors[i].z() = -1.f; + } + for (int i = 0; i < 0x40; ++i) { + m_colors.pat_material_colors[i].x() = -1.f; + m_colors.pat_material_colors[i].y() = -1.f; + m_colors.pat_material_colors[i].z() = -1.f; + } + for (int i = 0; i < 0x40; ++i) { + m_colors.pat_event_colors[i].x() = -1.f; + m_colors.pat_event_colors[i].y() = -1.f; + m_colors.pat_event_colors[i].z() = -1.f; + } + + switch (version) { + case GameVersion::Jak1: + for (int i = 0; i < 23 * 3; ++i) { + m_colors.pat_material_colors[i / 3].data()[i % 3] = material_colors_jak1[i]; + } + for (int i = 0; i < 7 * 3; ++i) { + m_colors.pat_event_colors[i / 3].data()[i % 3] = event_colors_jak1[i]; + } + for (int i = 0; i < 3 * 3; ++i) { + m_colors.pat_mode_colors[i / 3].data()[i % 3] = mode_colors_jak1[i]; + } + break; + case GameVersion::Jak2: + break; + } } void CollideMeshRenderer::render(SharedRenderState* render_state, ScopedProfilerNode& prof) { @@ -31,6 +115,20 @@ void CollideMeshRenderer::render(SharedRenderState* render_state, ScopedProfiler settings.planes[i] = render_state->camera_planes[i]; } auto shader = render_state->shaders[ShaderId::COLLISION].id(); + // Get a free binding point + GLuint bind_loc = 0; + GLint bind_max; + glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &bind_max); + for (int i = 0; i < bind_max; i++) { + GLint params; + glGetIntegeri_v(GL_UNIFORM_BUFFER_BINDING, i, ¶ms); + if (params == 0) { + bind_loc = i; + break; + } + } + glUniformBlockBinding(shader, glGetUniformBlockIndex(shader, "PatColors"), bind_loc); + glBindBufferBase(GL_UNIFORM_BUFFER, bind_loc, m_ubo); glUniformMatrix4fv(glGetUniformLocation(shader, "camera"), 1, GL_FALSE, settings.math_camera.data()); glUniform4f(glGetUniformLocation(shader, "hvdf_offset"), settings.hvdf_offset[0], @@ -41,6 +139,7 @@ void CollideMeshRenderer::render(SharedRenderState* render_state, ScopedProfiler glUniform1f(glGetUniformLocation(shader, "fog_constant"), settings.fog.x()); glUniform1f(glGetUniformLocation(shader, "fog_min"), settings.fog.y()); glUniform1f(glGetUniformLocation(shader, "fog_max"), settings.fog.z()); + glUniform1i(glGetUniformLocation(shader, "version"), (GLint)render_state->version); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_GEQUAL); glEnable(GL_BLEND); diff --git a/game/graphics/opengl_renderer/CollideMeshRenderer.h b/game/graphics/opengl_renderer/CollideMeshRenderer.h index 13bb1c4202..f524dfed09 100644 --- a/game/graphics/opengl_renderer/CollideMeshRenderer.h +++ b/game/graphics/opengl_renderer/CollideMeshRenderer.h @@ -1,12 +1,25 @@ #pragma once +#include "common/versions.h" + #include "game/graphics/opengl_renderer/BucketRenderer.h" +struct PatColors { + math::Vector4f pat_mode_colors[0x8]; + math::Vector4f pat_material_colors[0x40]; + math::Vector4f pat_event_colors[0x40]; +}; + class CollideMeshRenderer { public: - CollideMeshRenderer(); + CollideMeshRenderer(GameVersion version); void render(SharedRenderState* render_state, ScopedProfilerNode& prof); ~CollideMeshRenderer(); private: + void init_pat_colors(GameVersion version); + GLuint m_vao; + GLuint m_ubo; + + PatColors m_colors; }; diff --git a/game/graphics/opengl_renderer/OpenGLRenderer.cpp b/game/graphics/opengl_renderer/OpenGLRenderer.cpp index 450b3b6ea8..ce28997648 100644 --- a/game/graphics/opengl_renderer/OpenGLRenderer.cpp +++ b/game/graphics/opengl_renderer/OpenGLRenderer.cpp @@ -46,7 +46,8 @@ void GLAPIENTRY opengl_error_callback(GLenum source, const GLchar* message, const void* /*userParam*/) { if (severity == GL_DEBUG_SEVERITY_NOTIFICATION) { - lg::debug("OpenGL notification 0x{:X} S{:X} T{:X}: {}", id, source, type, message); + lg::debug("[{}] OpenGL notification 0x{:X} S{:X} T{:X}: {}", g_current_render, id, source, type, + message); } else if (severity == GL_DEBUG_SEVERITY_LOW) { lg::info("[{}] OpenGL message 0x{:X} S{:X} T{:X}: {}", g_current_render, id, source, type, message); @@ -63,7 +64,9 @@ void GLAPIENTRY opengl_error_callback(GLenum source, OpenGLRenderer::OpenGLRenderer(std::shared_ptr texture_pool, std::shared_ptr loader, GameVersion version) - : m_render_state(texture_pool, loader, version), m_version(version) { + : m_render_state(texture_pool, loader, version), + m_collide_renderer(version), + m_version(version) { // setup OpenGL errors glEnable(GL_DEBUG_OUTPUT); glDebugMessageCallback(opengl_error_callback, nullptr); @@ -926,6 +929,13 @@ void OpenGLRenderer::dispatch_buckets_jak2(DmaFollower dma, m_render_state.next_bucket += 16; vif_interrupt_callback(bucket_id + 1); m_category_times[(int)m_bucket_categories[bucket_id]] += bucket_prof.get_elapsed_time(); + + // hack to draw the collision mesh in the middle the drawing + if (bucket_id + 1 == (int)jak2::BucketId::TEX_L0_ALPHA && + Gfx::g_global_settings.collision_enable) { + auto p = prof.make_scoped_child("collision-draw"); + m_collide_renderer.render(&m_render_state, p); + } } vif_interrupt_callback(m_bucket_renderers.size()); diff --git a/game/graphics/opengl_renderer/shaders/collision.vert b/game/graphics/opengl_renderer/shaders/collision.vert index 69dfc3ca25..4a7caccc59 100644 --- a/game/graphics/opengl_renderer/shaders/collision.vert +++ b/game/graphics/opengl_renderer/shaders/collision.vert @@ -13,6 +13,7 @@ uniform float fog_min; uniform float fog_max; uniform int wireframe; uniform int mode; +uniform int version; out vec4 fragment_color; @@ -29,13 +30,19 @@ const int MODE_MODE = 1; const int MODE_EVENT = 2; const int MODE_MATERIAL = 3; -uint pat_get_mode(uint p) { return (p >> 3) & 0x7; } -uint pat_get_material(uint p) { return (p >> 6) & 0x3f; } -uint pat_get_event(uint p) { return (p >> 14) & 0x3f; } +uint pat_get_mode(uint p) { return version == 2 ? (p >> 7) & 0x7 : (p >> 3) & 0x7; } +uint pat_get_material(uint p) { return version == 2 ? (p >> 10) & 0x3f : (p >> 6) & 0x3f; } +uint pat_get_event(uint p) { return version == 2 ? (p >> 18) & 0x3f : (p >> 14) & 0x3f; } bool logtest(uint a, uint b) { return (a & b) != 0; } bool logtesta(uint a, uint b) { return (a & b) == b; } +layout(std140) uniform PatColors { + vec4 pat_mode_colors[0x8]; + vec4 pat_material_colors[0x40]; + vec4 pat_event_colors[0x40]; +}; + void main() { // Step 3, the camera transform vec4 transformed = -camera[3].xyzw; @@ -79,8 +86,8 @@ void main() { float cam_dot = abs(dot(to_cam_n, normal_in)); // base colors - fragment_color = vec4(0.5, 0.6, 0.6, 1); - fragment_color.xyz *= (pow(cam_dot, 3) + 0.3); + fragment_color = vec4(0.5, 0.5, 0.5, 1); + fragment_color.xyz *= (pow(cam_dot, 2) * 0.5 + 0.5); // pat checks uint pMode = pat_get_mode(pat); @@ -92,53 +99,17 @@ void main() { logtesta(collision_skip_mask, pat)) { // fancy colors if (mode == MODE_MODE) { - switch ( pMode ) { - case 0: fragment_color.rgb *= vec3(1.25, 0.1, 0.1); break; // ground - case 1: fragment_color.rgb *= vec3(0.1, 0.1, 1.0); break; // wall - case 2: fragment_color.rgb *= vec3(1.0, 0.1, 1.0); break; // obstacle - default: fragment_color.rgb = vec3(1, 0, 1); break; - } + fragment_color.rgb *= pat_mode_colors[pMode].rgb; } else if (mode == MODE_EVENT) { - switch ( pEvent ) { - case 0: fragment_color.rgb *= vec3(1.0); break; // none - case 1: fragment_color.rgb *= vec3(0.2, 1.0, 1.0); break; // deadly - case 2: fragment_color.rgb *= vec3(0.1, 1.0, 0.1); break; // endlessfall - case 3: fragment_color.rgb *= vec3(1.0, 1.0, 0.1); break; // burn - case 4: fragment_color.rgb *= vec3(0.1, 0.1, 1.0); break; // deadlyup - case 5: fragment_color.rgb *= vec3(1.0, 0.1, 0.5); break; // burnup - case 6: fragment_color.rgb *= vec3(1.0, 0.1, 0.1); break; // melt - default: fragment_color.rgb = vec3(1, 0, 1); break; - } + fragment_color.rgb *= pat_event_colors[pEvent].rgb; } else if (mode == MODE_MATERIAL) { - switch ( pMat ) { - case 0: fragment_color.rgb *= vec3(1.0, 0.7, 1.0); break; // stone - case 1: fragment_color.rgb *= vec3(0.1, 2.0, 2.0); break; // ice - case 2: fragment_color.rgb *= vec3(0.75, 0.25, 0.1); break; // quicksand - case 3: fragment_color.rgb *= vec3(0.1, 0.25, 0.75); break; // waterbottom - case 4: fragment_color.rgb *= vec3(0.5, 0.15, 0.1); break; // tar - case 5: fragment_color.rgb *= vec3(2.0, 1.5, 0.5); break; // sand - case 6: fragment_color.rgb *= vec3(1.5, 0.75, 0.1); break; // wood - case 7: fragment_color.rgb *= vec3(0.1, 1.35, 0.1); break; // grass - case 8: fragment_color.rgb *= vec3(1.7, 1.3, 0.1); break; // pcmetal - case 9: fragment_color.rgb *= vec3(1.8); break; // snow - case 10: fragment_color.rgb *= vec3(1.5, 0.2, 1.0); break; // deepsnow - case 11: fragment_color.rgb *= vec3(1.2, 0.5, 0.3); break; // hotcoals - case 12: fragment_color.rgb *= vec3(1.4, 0.1, 0.1); break; // lava - case 13: fragment_color.rgb *= vec3(0.8, 0.3, 0.1); break; // crwood - case 14: fragment_color.rgb *= vec3(1.0, 0.4, 1.0); break; // gravel - case 15: fragment_color.rgb *= vec3(1.5, 0.5, 0.15); break; // dirt - case 16: fragment_color.rgb *= vec3(0.7, 0.7, 1.0); break; // metal - case 17: fragment_color.rgb *= vec3(0.1, 0.1, 1.2); break; // straw - case 18: fragment_color.rgb *= vec3(0.75, 1.75, 0.75); break; // tube - case 19: fragment_color.rgb *= vec3(0.4, 0.1, 0.8); break; // swamp - case 20: fragment_color.rgb *= vec3(0.1, 0.4, 0.8); break; // stopproj - case 21: fragment_color.rgb *= vec3(1.9, 0.1, 1.9); break; // rotate - case 22: fragment_color.rgb *= vec3(1.0); break; // neutral - default: fragment_color.rgb = vec3(1, 0, 1); break; - } + fragment_color.rgb *= pat_material_colors[pMat].rgb; } else { fragment_color = vec4((normal_in + 1)*.5, 1); - fragment_color.xyz *= (pow(cam_dot, 3) + 0.3); + fragment_color.rgb *= (pow(cam_dot, 2) * 0.5 + 0.5); + } + if (fragment_color.r < 0 || fragment_color.g < 0 || fragment_color.b < 0) { + fragment_color.rgb = vec3(1, 0, 1); } } else { // filtered out. goodbye! diff --git a/goal_src/jak2/pc/debug/default-menu-pc.gc b/goal_src/jak2/pc/debug/default-menu-pc.gc index d15b49113f..21708f22fc 100644 --- a/goal_src/jak2/pc/debug/default-menu-pc.gc +++ b/goal_src/jak2/pc/debug/default-menu-pc.gc @@ -354,98 +354,96 @@ )) ) -;; (defun dm-toggle-collision-pick-func ((arg symbol) (msg debug-menu-msg)) -;; (when (= msg (debug-menu-msg press)) -;; (cond -;; ((-> arg value) -;; (false! (-> arg value)) -;; (logior! *vu1-enable-user-menu* (vu1-renderer-mask tfrag trans-tfrag tie tie-near)) -;; (true! *generic-tie*) -;; ) -;; (else -;; (true! (-> arg value)) -;; (logclear! *vu1-enable-user-menu* (vu1-renderer-mask tfrag trans-tfrag tie tie-near)) -;; (false! *generic-tie*) -;; ) -;; ) -;; ) -;; (-> arg value) -;; ) -;; -;; (defun dm-collision-mode-pick-func ((arg pc-collision-mode) (msg debug-menu-msg)) -;; (when (= msg (debug-menu-msg press)) -;; (set! *collision-mode* arg) -;; ) -;; (= *collision-mode* arg) -;; ) -;; -;; (defun dm-collision-filter-mode-pick-func ((arg int) (msg debug-menu-msg)) -;; (when (= msg (debug-menu-msg press)) -;; (pc-set-collision-mask (pc-collision-mode mode) arg (not (pc-get-collision-mask (pc-collision-mode mode) arg))) -;; ) -;; (pc-get-collision-mask (pc-collision-mode mode) arg) -;; ) -;; -;; (defun dm-collision-filter-event-pick-func ((arg int) (msg debug-menu-msg)) -;; (when (= msg (debug-menu-msg press)) -;; (pc-set-collision-mask (pc-collision-mode event) arg (not (pc-get-collision-mask (pc-collision-mode event) arg))) -;; ) -;; (pc-get-collision-mask (pc-collision-mode event) arg) -;; ) -;; -;; (defun dm-collision-filter-material-pick-func ((arg int) (msg debug-menu-msg)) -;; (when (= msg (debug-menu-msg press)) -;; (pc-set-collision-mask (pc-collision-mode material) arg (not (pc-get-collision-mask (pc-collision-mode material) arg))) -;; ) -;; (pc-get-collision-mask (pc-collision-mode material) arg) -;; ) -;; -;; (defun dm-collision-filter-skip-pick-func ((arg int) (msg debug-menu-msg)) -;; (when (= msg (debug-menu-msg press)) -;; (pc-set-collision-mask (pc-collision-mode skip) arg (not (pc-get-collision-mask (pc-collision-mode skip) arg))) -;; ) -;; (pc-get-collision-mask (pc-collision-mode skip) arg) -;; ) -;; -;; (defun debug-menu-make-collision-renderer-menu ((ctx debug-menu-context)) -;; (let ((menu (new 'debug 'debug-menu ctx "Collision renderer menu"))) -;; ;; master toggle -;; (debug-menu-append-item menu (new-dm-bool "Enable" *collision-renderer* dm-toggle-collision-pick-func)) -;; (debug-menu-append-item menu (new-dm-bool "Wireframe" *collision-wireframe* dm-boolean-toggle-pick-func)) -;; (debug-menu-append-item menu (new-dm-submenu "Mode" -;; (let ((mode-menu (new 'debug 'debug-menu ctx "Collision renderer mode menu"))) -;; (doenum (name val pc-collision-mode) -;; (debug-menu-append-item mode-menu (new-dm-flag name val dm-collision-mode-pick-func)) -;; ) -;; mode-menu))) -;; (debug-menu-append-item menu (new-dm-submenu "Filter mode" -;; (let ((filter-menu (new 'debug 'debug-menu ctx "Collision renderer filter mode menu"))) -;; (doenum (name val pat-mode) -;; (debug-menu-append-item filter-menu (new-dm-flag name val dm-collision-filter-mode-pick-func)) -;; ) -;; filter-menu))) -;; (debug-menu-append-item menu (new-dm-submenu "Filter event" -;; (let ((filter-menu (new 'debug 'debug-menu ctx "Collision renderer filter event menu"))) -;; (doenum (name val pat-event) -;; (debug-menu-append-item filter-menu (new-dm-flag name val dm-collision-filter-event-pick-func)) -;; ) -;; filter-menu))) -;; (debug-menu-append-item menu (new-dm-submenu "Filter material" -;; (let ((filter-menu (new 'debug 'debug-menu ctx "Collision renderer filter material menu"))) -;; (doenum (name val pat-material) -;; (debug-menu-append-item filter-menu (new-dm-flag name val dm-collision-filter-material-pick-func)) -;; ) -;; filter-menu))) -;; (debug-menu-append-item menu (new-dm-submenu "Filter skip" -;; (let ((filter-menu (new 'debug 'debug-menu ctx "Collision renderer filter skip menu"))) -;; (doenum (name val pc-pat-skip-hack) -;; (debug-menu-append-item filter-menu (new-dm-flag name val dm-collision-filter-skip-pick-func)) -;; ) -;; filter-menu))) -;; -;; (new-dm-submenu "Collision renderer" menu) -;; ) -;; ) +(defun dm-toggle-collision-pick-func ((arg symbol) (msg debug-menu-msg)) + (when (= msg (debug-menu-msg press)) + (cond + ((-> arg value) + (false! (-> arg value)) + (logior! (-> *display* vu1-enable-user-menu) (vu1-renderer-mask tfrag tfrag-trans tie tie-envmap)) + ) + (else + (true! (-> arg value)) + (logclear! (-> *display* vu1-enable-user-menu) (vu1-renderer-mask tfrag tfrag-trans tie tie-envmap)) + ) + ) + ) + (-> arg value) + ) + +(defun dm-collision-mode-pick-func ((arg pc-collision-mode) (msg debug-menu-msg)) + (when (= msg (debug-menu-msg press)) + (set! *collision-mode* arg) + ) + (= *collision-mode* arg) + ) + +(defun dm-collision-filter-mode-pick-func ((arg int) (msg debug-menu-msg)) + (when (= msg (debug-menu-msg press)) + (pc-set-collision-mask (pc-collision-mode mode) arg (not (pc-get-collision-mask (pc-collision-mode mode) arg))) + ) + (pc-get-collision-mask (pc-collision-mode mode) arg) + ) + +(defun dm-collision-filter-event-pick-func ((arg int) (msg debug-menu-msg)) + (when (= msg (debug-menu-msg press)) + (pc-set-collision-mask (pc-collision-mode event) arg (not (pc-get-collision-mask (pc-collision-mode event) arg))) + ) + (pc-get-collision-mask (pc-collision-mode event) arg) + ) + +(defun dm-collision-filter-material-pick-func ((arg int) (msg debug-menu-msg)) + (when (= msg (debug-menu-msg press)) + (pc-set-collision-mask (pc-collision-mode material) arg (not (pc-get-collision-mask (pc-collision-mode material) arg))) + ) + (pc-get-collision-mask (pc-collision-mode material) arg) + ) + +(defun dm-collision-filter-skip-pick-func ((arg int) (msg debug-menu-msg)) + (when (= msg (debug-menu-msg press)) + (pc-set-collision-mask (pc-collision-mode skip) arg (not (pc-get-collision-mask (pc-collision-mode skip) arg))) + ) + (pc-get-collision-mask (pc-collision-mode skip) arg) + ) + +(defun debug-menu-make-collision-renderer-menu ((ctx debug-menu-context)) + (let ((menu (new 'debug 'debug-menu ctx "OpenGOAL collision renderer menu"))) + ;; master toggle + (debug-menu-append-item menu (new-dm-bool "Enable" *collision-renderer* dm-toggle-collision-pick-func)) + (debug-menu-append-item menu (new-dm-bool "Wireframe" *collision-wireframe* dm-boolean-toggle-pick-func)) + (debug-menu-append-item menu (new-dm-submenu "Mode" + (let ((mode-menu (new 'debug 'debug-menu ctx "OpenGOAL collision renderer mode menu"))) + (doenum (name val pc-collision-mode) + (debug-menu-append-item mode-menu (new-dm-flag name val dm-collision-mode-pick-func)) + ) + mode-menu))) + (debug-menu-append-item menu (new-dm-submenu "Filter mode" + (let ((filter-menu (new 'debug 'debug-menu ctx "OpenGOAL collision renderer filter mode menu"))) + (doenum (name val pat-mode) + (debug-menu-append-item filter-menu (new-dm-flag name val dm-collision-filter-mode-pick-func)) + ) + filter-menu))) + (debug-menu-append-item menu (new-dm-submenu "Filter event" + (let ((filter-menu (new 'debug 'debug-menu ctx "OpenGOAL collision renderer filter event menu"))) + (doenum (name val pat-event) + (debug-menu-append-item filter-menu (new-dm-flag name val dm-collision-filter-event-pick-func)) + ) + filter-menu))) + (debug-menu-append-item menu (new-dm-submenu "Filter material" + (let ((filter-menu (new 'debug 'debug-menu ctx "OpenGOAL collision renderer filter material menu"))) + (doenum (name val pat-material) + (debug-menu-append-item filter-menu (new-dm-flag name val dm-collision-filter-material-pick-func)) + ) + filter-menu))) + (debug-menu-append-item menu (new-dm-submenu "Filter skip" + (let ((filter-menu (new 'debug 'debug-menu ctx "OpenGOAL collision renderer filter skip menu"))) + (doenum (name val pc-pat-skip-hack) + (debug-menu-append-item filter-menu (new-dm-flag name val dm-collision-filter-skip-pick-func)) + ) + filter-menu))) + + (new-dm-submenu "OpenGOAL collision renderer" menu) + ) + ) (defun dm-lod-int ((arg0 int) (arg1 debug-menu-msg) (arg2 int) (arg3 int)) (when (= arg1 (debug-menu-msg press)) @@ -873,8 +871,8 @@ ) ) - ;; (debug-menu-append-item (debug-menu-find-from-template *debug-menu-context* '("Collision")) - ;; (debug-menu-make-collision-renderer-menu *debug-menu-context*)) + (debug-menu-append-item (debug-menu-find-from-template *debug-menu-context* '("Collision")) + (debug-menu-make-collision-renderer-menu *debug-menu-context*)) (debug-menu-append-item (debug-menu-find-from-template *debug-menu-context* '("Artist")) (debug-menu-make-anim-tester-x-menu *debug-menu-context*))