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.
This commit is contained in:
ManDude 2023-04-17 03:56:19 +01:00 committed by GitHub
parent 40c30cc0ab
commit 50d93a3f79
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 238 additions and 147 deletions

View file

@ -718,7 +718,7 @@ void update_proto_info(std::vector<TieProtoInfo>* out,
}
}
if (version > GameVersion::Jak1) {
if (proto.has_envmap_shader && version > GameVersion::Jak1) {
frag_info.envmap_tint_color = jak2_tint_color;
}

View file

@ -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, &params);
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);

View file

@ -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;
};

View file

@ -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<TexturePool> texture_pool,
std::shared_ptr<Loader> 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());

View file

@ -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!

View file

@ -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*))