[jak2] fully implement collide mesh renderer (#3010)

Fixes #2983
This commit is contained in:
ManDude
2023-09-22 15:50:16 +01:00
committed by GitHub
parent fe491c2b5e
commit 61c4fc4b91
31 changed files with 501 additions and 200 deletions
+1 -1
View File
@@ -14939,7 +14939,7 @@
(deadly 1)
(endlessfall 2)
(burn 3)
(deadlup 4)
(deadlyup 4)
(burnup 5)
(melt 6)
(slide 7)
@@ -325,24 +325,34 @@ void handle_collide_fragment(const TypedRef& collide_fragment,
4 * (max_pat + 1));
for (const auto& p : polys) {
math::Vector4f verts_in[3];
for (int vi = 0; vi < 3; vi++) {
int v = p.vert_index[vi];
auto& vert_out = out->emplace_back();
vert_out.flags = 0;
math::Vector4f pt(u32(verts.at(v * 3)) * 16 + bbox_min.data[0],
u32(verts.at(v * 3 + 1)) * 16 + bbox_min.data[1],
u32(verts.at(v * 3 + 2)) * 16 + bbox_min.data[2], 1.f);
verts_in[vi] = {u32(verts.at(v * 3)) * 16 + bbox_min.data[0],
u32(verts.at(v * 3 + 1)) * 16 + bbox_min.data[1],
u32(verts.at(v * 3 + 2)) * 16 + bbox_min.data[2], 1.f};
if (matrix) {
pt = transform_tie(*matrix, pt);
verts_in[vi] = transform_tie(*matrix, verts_in[vi]);
}
vert_out.x = pt.x();
vert_out.y = pt.y();
vert_out.z = pt.z();
}
math::Vector3f v10 = verts_in[1].xyz() - verts_in[0].xyz();
math::Vector3f v20 = verts_in[2].xyz() - verts_in[0].xyz();
auto normal = (v10.cross(v20).normalized() * INT16_MAX).cast<s16>();
for (int i = 0; i < 3; i++) {
auto& vert_out = out->emplace_back();
vert_out.x = verts_in[i].x();
vert_out.y = verts_in[i].y();
vert_out.z = verts_in[i].z();
vert_out.nx = normal.x();
vert_out.ny = normal.y();
vert_out.nz = normal.z();
vert_out.flags = 0; // todo
vert_out.pad = 0;
vert_out.pad2 = 0;
vert_out.pat = pats.at(p.pat);
}
};
}
}
void extract_collide_frags(const level_tools::CollideHash& chash,
+26 -9
View File
@@ -130,7 +130,7 @@ u32 sync_path() {
return 0;
}
bool CollisionRendererGetMask(GfxGlobalSettings::CollisionRendererMode mode, int mask_id) {
bool CollisionRendererGetMask(GfxGlobalSettings::CollisionRendererMode mode, s64 mask_id) {
int arr_idx = mask_id / 32;
int arr_ofs = mask_id % 32;
@@ -142,15 +142,20 @@ bool CollisionRendererGetMask(GfxGlobalSettings::CollisionRendererMode mode, int
case GfxGlobalSettings::CollisionRendererMode::Material:
return (g_global_settings.collision_material_mask[arr_idx] >> arr_ofs) & 1;
case GfxGlobalSettings::CollisionRendererMode::Skip:
ASSERT(arr_idx == 0);
return (g_global_settings.collision_skip_mask >> arr_ofs) & 1;
if (mask_id == -1) {
return g_global_settings.collision_skip_nomask_allowed;
} else {
return g_global_settings.collision_skip_mask & mask_id;
}
case GfxGlobalSettings::CollisionRendererMode::SkipHide:
return g_global_settings.collision_skip_hide_mask & mask_id;
default:
lg::error("{} invalid params {} {}", __PRETTY_FUNCTION__, fmt::underlying(mode), mask_id);
return false;
}
}
void CollisionRendererSetMask(GfxGlobalSettings::CollisionRendererMode mode, int mask_id) {
void CollisionRendererSetMask(GfxGlobalSettings::CollisionRendererMode mode, s64 mask_id) {
int arr_idx = mask_id / 32;
int arr_ofs = mask_id % 32;
@@ -165,8 +170,14 @@ void CollisionRendererSetMask(GfxGlobalSettings::CollisionRendererMode mode, int
g_global_settings.collision_material_mask[arr_idx] |= 1 << arr_ofs;
break;
case GfxGlobalSettings::CollisionRendererMode::Skip:
ASSERT(arr_idx == 0);
g_global_settings.collision_skip_mask |= 1 << arr_ofs;
if (mask_id == -1) {
g_global_settings.collision_skip_nomask_allowed = true;
} else {
g_global_settings.collision_skip_mask |= mask_id;
}
break;
case GfxGlobalSettings::CollisionRendererMode::SkipHide:
g_global_settings.collision_skip_hide_mask |= mask_id;
break;
default:
lg::error("{} invalid params {} {}", __PRETTY_FUNCTION__, fmt::underlying(mode), mask_id);
@@ -174,7 +185,7 @@ void CollisionRendererSetMask(GfxGlobalSettings::CollisionRendererMode mode, int
}
}
void CollisionRendererClearMask(GfxGlobalSettings::CollisionRendererMode mode, int mask_id) {
void CollisionRendererClearMask(GfxGlobalSettings::CollisionRendererMode mode, s64 mask_id) {
int arr_idx = mask_id / 32;
int arr_ofs = mask_id % 32;
@@ -189,8 +200,14 @@ void CollisionRendererClearMask(GfxGlobalSettings::CollisionRendererMode mode, i
g_global_settings.collision_material_mask[arr_idx] &= ~(1 << arr_ofs);
break;
case GfxGlobalSettings::CollisionRendererMode::Skip:
ASSERT(arr_idx == 0);
g_global_settings.collision_skip_mask &= ~(1 << arr_ofs);
if (mask_id == -1) {
g_global_settings.collision_skip_nomask_allowed = false;
} else {
g_global_settings.collision_skip_mask &= ~mask_id;
}
break;
case GfxGlobalSettings::CollisionRendererMode::SkipHide:
g_global_settings.collision_skip_hide_mask &= ~mask_id;
break;
default:
lg::error("{} invalid params {} {}", __PRETTY_FUNCTION__, fmt::underlying(mode), mask_id);
+11 -8
View File
@@ -42,15 +42,16 @@ struct GfxRendererModule {
std::function<void(const u8*, int, u32)> texture_upload_now;
std::function<void(u32, u32, u32)> texture_relocate;
std::function<void(const std::vector<std::string>&)> set_levels;
std::function<void(const std::vector<std::string>&)> set_active_levels;
std::function<void(float)> set_pmode_alp;
GfxPipeline pipeline;
const char* name;
};
// runtime settings
static constexpr int PAT_MOD_COUNT = 3;
static constexpr int PAT_EVT_COUNT = 7;
static constexpr int PAT_MAT_COUNT = 23;
static constexpr int PAT_MOD_COUNT = 4;
static constexpr int PAT_EVT_COUNT = 15;
static constexpr int PAT_MAT_COUNT = 29;
struct GfxGlobalSettings {
bool debug = true; // graphics debugging
@@ -93,11 +94,13 @@ struct GfxGlobalSettings {
bool collision_wireframe = true;
// matching enum in kernel-defs.gc !!
enum CollisionRendererMode { None, Mode, Event, Material, Skip } collision_mode = Mode;
enum CollisionRendererMode { None, Mode, Event, Material, Skip, SkipHide } collision_mode = Mode;
std::array<u32, (PAT_MOD_COUNT + 31) / 32> collision_mode_mask = {UINT32_MAX};
std::array<u32, (PAT_EVT_COUNT + 31) / 32> collision_event_mask = {UINT32_MAX};
std::array<u32, (PAT_MAT_COUNT + 31) / 32> collision_material_mask = {UINT32_MAX};
u32 collision_skip_mask = UINT32_MAX;
u32 collision_skip_mask = 0;
u32 collision_skip_hide_mask = 0;
bool collision_skip_nomask_allowed = true;
};
namespace Gfx {
@@ -118,9 +121,9 @@ u32 sync_path();
// matching enum in kernel-defs.gc !!
enum class RendererTreeType { NONE = 0, TFRAG3 = 1, TIE3 = 2, INVALID };
bool CollisionRendererGetMask(GfxGlobalSettings::CollisionRendererMode mode, int mask_id);
void CollisionRendererSetMask(GfxGlobalSettings::CollisionRendererMode mode, int mask_id);
void CollisionRendererClearMask(GfxGlobalSettings::CollisionRendererMode mode, int mask_id);
bool CollisionRendererGetMask(GfxGlobalSettings::CollisionRendererMode mode, s64 mask_id);
void CollisionRendererSetMask(GfxGlobalSettings::CollisionRendererMode mode, s64 mask_id);
void CollisionRendererClearMask(GfxGlobalSettings::CollisionRendererMode mode, s64 mask_id);
void CollisionRendererSetMode(GfxGlobalSettings::CollisionRendererMode mode);
} // namespace Gfx
@@ -1,9 +1,11 @@
#include "CollideMeshRenderer.h"
#include <vector>
#include "game/graphics/gfx.h"
#include "game/graphics/opengl_renderer/background/background_common.h"
float material_colors_jak1[23 * 3] = {
const static std::vector<float> material_colors_jak1 = {
1.0f, 0.7f, 1.0f, // 0, stone
0.1f, 2.0f, 2.0f, // 1, ice
0.75f, 0.25f, 0.1f, // 2, quicksand
@@ -29,7 +31,7 @@ float material_colors_jak1[23 * 3] = {
1.0f, 1.0f, 1.0f, // 22, neutral
};
float event_colors_jak1[7 * 3] = {
const static std::vector<float> event_colors_jak1 = {
1.0f, 1.0f, 1.0f, // 0, none
0.2f, 1.0f, 1.0f, // 1, deadly
0.1f, 1.0f, 0.1f, // 2, endlessfall
@@ -39,12 +41,69 @@ float event_colors_jak1[7 * 3] = {
1.0f, 0.1f, 0.1f, // 6, melt
};
float mode_colors_jak1[3 * 3] = {
const static std::vector<float> mode_colors_jak1 = {
1.25f, 0.1f, 0.1f, // 0, ground
0.1f, 0.1f, 1.0f, // 1, wall
1.0f, 0.1f, 1.0f, // 2, obstacle
};
const static std::vector<float> material_colors_jak2 = {
1.0f, 0.1f, 1.0f, // 0, unknown
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
1.0f, 0.7f, 1.0f, // 23, stone
0.8f, 1.2f, 1.2f, // 24, crmetal
0.7f, 0.0f, 0.0f, // 25, carpet
0.1f, 0.9f, 0.1f, // 26, grmetal
1.4f, 0.7f, 0.1f, // 27, shmetal
0.5f, 0.5f, 0.0f, // 28, hdwood
};
const static std::vector<float> event_colors_jak2 = {
1.0f, 1.0f, 1.0f, // 0, none
0.5f, 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
0.1f, 0.7f, 0.7f, // 7, slide
1.0f, 0.2f, 1.0f, // 8, lip
0.5f, 0.2f, 1.0f, // 9, lipramp
0.1f, 0.5f, 1.0f, // 10, shock
0.5f, 0.6f, 1.0f, // 11, shockup
0.5f, 0.6f, 0.5f, // 12, hide
0.5f, 1.0f, 0.5f, // 13, rail
0.7f, 0.7f, 0.7f, // 14, slippery
};
const static std::vector<float> mode_colors_jak2 = {
1.25f, 0.1f, 0.1f, // 0, ground
0.1f, 0.1f, 1.0f, // 1, wall
1.0f, 0.1f, 1.0f, // 2, obstacle
1.0f, 1.0f, 0.1f, // 3, halfpipe
};
CollideMeshRenderer::CollideMeshRenderer(GameVersion version) {
glGenVertexArrays(1, &m_vao);
glGenBuffers(1, &m_ubo);
@@ -62,37 +121,54 @@ CollideMeshRenderer::~CollideMeshRenderer() {
}
void CollideMeshRenderer::init_pat_colors(GameVersion version) {
for (int i = 0; i < 0x8; ++i) {
for (int i = 0; i < 4; ++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) {
for (int i = 0; i < 32; ++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) {
for (int i = 0; i < 32; ++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;
}
const std::vector<float>* material_colors = nullptr;
const std::vector<float>* event_colors = nullptr;
const std::vector<float>* mode_colors = nullptr;
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];
}
material_colors = &material_colors_jak1;
event_colors = &event_colors_jak1;
mode_colors = &mode_colors_jak1;
break;
case GameVersion::Jak2:
material_colors = &material_colors_jak2;
event_colors = &event_colors_jak2;
mode_colors = &mode_colors_jak2;
break;
}
if (material_colors) {
for (size_t i = 0; i < material_colors->size(); ++i) {
m_colors.pat_material_colors[i / 3].data()[i % 3] = material_colors->at(i);
}
}
if (event_colors) {
for (size_t i = 0; i < event_colors->size(); ++i) {
m_colors.pat_event_colors[i / 3].data()[i % 3] = event_colors->at(i);
}
}
if (mode_colors) {
for (size_t i = 0; i < mode_colors->size(); ++i) {
m_colors.pat_mode_colors[i / 3].data()[i % 3] = mode_colors->at(i);
}
}
}
void CollideMeshRenderer::render(SharedRenderState* render_state, ScopedProfilerNode& prof) {
@@ -161,6 +237,8 @@ void CollideMeshRenderer::render(SharedRenderState* render_state, ScopedProfiler
(void*)offsetof(tfrag3::CollisionMesh::Vertex, pat) // offset (0)
);
glUniform1i(glGetUniformLocation(shader, "wireframe"), 0);
glUniform1i(glGetUniformLocation(shader, "wireframe_enabled"),
Gfx::g_global_settings.collision_wireframe);
glUniform1uiv(glGetUniformLocation(shader, "collision_mode_mask"),
Gfx::g_global_settings.collision_mode_mask.size(),
Gfx::g_global_settings.collision_mode_mask.data());
@@ -172,6 +250,10 @@ void CollideMeshRenderer::render(SharedRenderState* render_state, ScopedProfiler
Gfx::g_global_settings.collision_material_mask.data());
glUniform1ui(glGetUniformLocation(shader, "collision_skip_mask"),
Gfx::g_global_settings.collision_skip_mask);
glUniform1ui(glGetUniformLocation(shader, "collision_skip_hide_mask"),
Gfx::g_global_settings.collision_skip_hide_mask);
glUniform1ui(glGetUniformLocation(shader, "collision_skip_nomask_allowed"),
Gfx::g_global_settings.collision_skip_nomask_allowed);
glUniform1i(glGetUniformLocation(shader, "mode"), Gfx::g_global_settings.collision_mode);
glDrawArrays(GL_TRIANGLES, 0, lev->level->collision.vertices.size());
@@ -188,5 +270,7 @@ void CollideMeshRenderer::render(SharedRenderState* render_state, ScopedProfiler
prof.add_draw_call();
prof.add_tri(lev->level->collision.vertices.size() / 3);
last_render_time = current_time;
}
}
@@ -4,9 +4,9 @@
#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];
math::Vector4f pat_mode_colors[4];
math::Vector4f pat_material_colors[32];
math::Vector4f pat_event_colors[32];
};
class CollideMeshRenderer {
@@ -15,6 +15,9 @@ class CollideMeshRenderer {
void render(SharedRenderState* render_state, ScopedProfilerNode& prof);
~CollideMeshRenderer();
int current_time = 0;
int last_render_time = 0;
private:
void init_pat_colors(GameVersion version);
@@ -1010,6 +1010,8 @@ void OpenGLRenderer::dispatch_buckets_jak2(DmaFollower dma,
m_render_state.bucket_for_vis_copy = (int)jak2::BucketId::BUCKET_2;
m_render_state.num_vis_to_copy = jak2::LEVEL_MAX;
++m_collide_renderer.current_time;
for (size_t bucket_id = 0; bucket_id < m_bucket_renderers.size(); bucket_id++) {
auto& renderer = m_bucket_renderers[bucket_id];
auto bucket_prof = prof.make_scoped_child(renderer->name_and_id());
@@ -1030,7 +1032,8 @@ void OpenGLRenderer::dispatch_buckets_jak2(DmaFollower dma,
// 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) {
Gfx::g_global_settings.collision_enable &&
m_collide_renderer.last_render_time != m_collide_renderer.current_time) {
auto p = prof.make_scoped_child("collision-draw");
m_collide_renderer.render(&m_render_state, p);
}
@@ -1,5 +1,7 @@
#include "VisDataHandler.h"
#include "background/background_common.h"
#include "third-party/imgui/imgui.h"
VisDataHandler::VisDataHandler(const std::string& name, int my_id) : BucketRenderer(name, my_id) {}
@@ -75,6 +77,18 @@ void VisDataHandler::render(DmaFollower& dma,
ASSERT(next.size_bytes == 0);
}
if (dma.current_tag_offset() != render_state->next_bucket) {
// we have some fallback data to use.
TfragPcPortData pc_port_data;
auto pc_port_data_dma = dma.read_and_advance();
ASSERT(pc_port_data_dma.size_bytes == sizeof(TfragPcPortData));
memcpy(&pc_port_data, pc_port_data_dma.data, sizeof(TfragPcPortData));
update_render_state_from_pc_settings(render_state, pc_port_data);
auto next = dma.read_and_advance();
ASSERT(next.size_bytes == 0);
}
while (dma.current_tag_offset() != render_state->next_bucket) {
dma.read_and_advance();
ASSERT(false);
@@ -83,6 +83,15 @@ void Loader::set_want_levels(const std::vector<std::string>& levels) {
}
}
/*!
* The game calls this to tell the loader that we absolutely want these levels active.
* This will NOT trigger a load!
*/
void Loader::set_active_levels(const std::vector<std::string>& levels) {
std::unique_lock<std::mutex> lk(m_loader_mutex);
m_active_levels = levels;
}
/*!
* Get all levels that are in memory and used very recently.
*/
@@ -90,9 +99,9 @@ std::vector<LevelData*> Loader::get_in_use_levels() {
std::vector<LevelData*> result;
std::unique_lock<std::mutex> lk(m_loader_mutex);
for (auto& lev : m_loaded_tfrag3_levels) {
if (lev.second->frames_since_last_used < 5) {
result.push_back(lev.second.get());
for (auto& [name, lev] : m_loaded_tfrag3_levels) {
if (lev->frames_since_last_used < 5) {
result.push_back(lev.get());
}
}
return result;
@@ -376,8 +385,12 @@ void Loader::update(TexturePool& texture_pool) {
Timer loader_timer;
// only main thread can touch this.
for (auto& lev : m_loaded_tfrag3_levels) {
lev.second->frames_since_last_used++;
for (auto& [name, lev] : m_loaded_tfrag3_levels) {
if (std::find(m_active_levels.begin(), m_active_levels.end(), name) == m_active_levels.end()) {
lev->frames_since_last_used++;
} else {
lev->frames_since_last_used = 0;
}
}
bool did_gpu_stuff = false;
@@ -23,6 +23,7 @@ class Loader {
std::optional<MercRef> get_merc_model(const char* model_name);
const tfrag3::Level& load_common(TexturePool& tex_pool, const std::string& name);
void set_want_levels(const std::vector<std::string>& levels);
void set_active_levels(const std::vector<std::string>& levels);
std::vector<LevelData*> get_in_use_levels();
void draw_debug_window();
@@ -52,6 +53,7 @@ class Loader {
std::unordered_map<std::string, std::vector<MercRef>> m_all_merc_models;
std::vector<std::string> m_desired_levels;
std::vector<std::string> m_active_levels;
std::vector<std::unique_ptr<LoaderStage>> m_loader_stages;
fs::path m_base_path;
@@ -12,18 +12,21 @@ uniform float fog_constant;
uniform float fog_min;
uniform float fog_max;
uniform int wireframe;
uniform int wireframe_enabled;
uniform int mode;
uniform int version;
out vec4 fragment_color;
const int PAT_MOD_COUNT = 3;
const int PAT_EVT_COUNT = 7;
const int PAT_MAT_COUNT = 23;
const int PAT_MOD_COUNT = 4;
const int PAT_EVT_COUNT = 15;
const int PAT_MAT_COUNT = 29;
uniform uint collision_mode_mask[(PAT_MOD_COUNT + 31) / 32];
uniform uint collision_event_mask[(PAT_EVT_COUNT + 31) / 32];
uniform uint collision_material_mask[(PAT_MAT_COUNT + 31) / 32];
uniform uint collision_skip_mask;
uniform uint collision_skip_hide_mask;
uniform uint collision_skip_nomask_allowed;
const int MODE_NONE = 0;
const int MODE_MODE = 1;
@@ -33,14 +36,15 @@ const int MODE_MATERIAL = 3;
uint pat_get_mode(uint p) { return version == 2 ? (p >> 7) & 0x7u : (p >> 3) & 0x7u; }
uint pat_get_material(uint p) { return version == 2 ? (p >> 10) & 0x3fu : (p >> 6) & 0x3fu; }
uint pat_get_event(uint p) { return version == 2 ? (p >> 18) & 0x3fu : (p >> 14) & 0x3fu; }
uint pat_get_skip(uint p) { return version == 2 ? p & 0x1f03007fu : p & 0x3007u; }
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];
vec4 pat_mode_colors[4];
vec4 pat_material_colors[32];
vec4 pat_event_colors[32];
};
void main() {
@@ -86,30 +90,36 @@ void main() {
float cam_dot = abs(dot(to_cam_n, normal_in));
// base colors
fragment_color = vec4(0.5, 0.5, 0.5, 1);
fragment_color.xyz *= (pow(cam_dot, 2) * 0.5 + 0.5);
fragment_color = vec4(vec3(0.75), 1);
if (wireframe_enabled == 0) {
fragment_color.rgb *= (pow(cam_dot, 2) * 0.35 + 0.65);
} else {
fragment_color.rgb *= (pow(cam_dot, 2.5) * 0.25 + 0.75);
}
// pat checks
uint pMode = pat_get_mode(pat);
uint pMat = pat_get_material(pat);
uint pEvent = pat_get_event(pat);
uint pSkip = pat_get_skip(pat);
if (logtest(collision_mode_mask[pMode/32], 1 << (pMode & 0x1fu)) &&
logtest(collision_material_mask[pMat/32], 1 << (pMat & 0x1fu)) &&
logtest(collision_event_mask[pEvent/32], 1 << (pEvent & 0x1fu)) &&
logtesta(collision_skip_mask, pat)) {
logtest(collision_material_mask[pMat/32], 1 << (pMat & 0x1fu)) &&
logtest(collision_event_mask[pEvent/32], 1 << (pEvent & 0x1fu)) &&
!logtest(collision_skip_hide_mask, pSkip) &&
((pSkip == 0 && collision_skip_nomask_allowed == 1) || (pSkip != 0 && (collision_skip_mask == 0 || logtest(pSkip, collision_skip_mask))))) {
// fancy colors
if (mode == MODE_MODE) {
fragment_color.rgb *= pat_mode_colors[pMode].rgb;
fragment_color.rgb *= pat_mode_colors[pMode].rgb;
} else if (mode == MODE_EVENT) {
fragment_color.rgb *= pat_event_colors[pEvent].rgb;
fragment_color.rgb *= pat_event_colors[pEvent].rgb;
} else if (mode == MODE_MATERIAL) {
fragment_color.rgb *= pat_material_colors[pMat].rgb;
fragment_color.rgb *= pat_material_colors[pMat].rgb;
} else {
fragment_color = vec4((normal_in + 1)*.5, 1);
fragment_color.rgb *= (pow(cam_dot, 2) * 0.5 + 0.5);
fragment_color = vec4((normal_in + 1)*.5, 1);
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);
fragment_color.rgb = vec3(1, 0, 1);
}
} else {
// filtered out. goodbye!
+5
View File
@@ -715,6 +715,10 @@ void gl_set_levels(const std::vector<std::string>& levels) {
g_gfx_data->loader->set_want_levels(levels);
}
void gl_set_active_levels(const std::vector<std::string>& levels) {
g_gfx_data->loader->set_active_levels(levels);
}
void gl_set_pmode_alp(float val) {
g_gfx_data->pmode_alp = val;
}
@@ -729,6 +733,7 @@ const GfxRendererModule gRendererOpenGL = {
gl_texture_upload_now, // texture_upload_now
gl_texture_relocate, // texture_relocate
gl_set_levels, // set_levels
gl_set_active_levels, // set_active_levels
gl_set_pmode_alp, // set_pmode_alp
GfxPipeline::OpenGL, // pipeline
"OpenGL 4.3" // name
+2 -2
View File
@@ -769,7 +769,7 @@ void pc_renderer_tree_set_lod(Gfx::RendererTreeType tree, int lod) {
}
}
void pc_set_collision_mask(GfxGlobalSettings::CollisionRendererMode mode, int mask, u32 symptr) {
void pc_set_collision_mask(GfxGlobalSettings::CollisionRendererMode mode, s64 mask, u32 symptr) {
if (symbol_to_bool(symptr)) {
Gfx::CollisionRendererSetMask(mode, mask);
} else {
@@ -777,7 +777,7 @@ void pc_set_collision_mask(GfxGlobalSettings::CollisionRendererMode mode, int ma
}
}
u32 pc_get_collision_mask(GfxGlobalSettings::CollisionRendererMode mode, int mask) {
u32 pc_get_collision_mask(GfxGlobalSettings::CollisionRendererMode mode, s64 mask) {
return Gfx::CollisionRendererGetMask(mode, mask) ? s7.offset + true_symbol_offset(g_game_version)
: s7.offset;
}
+17
View File
@@ -662,6 +662,22 @@ void pc_set_levels(u32 lev_list) {
Gfx::GetCurrentRenderer()->set_levels(levels);
}
void pc_set_active_levels(u32 lev_list) {
if (!Gfx::GetCurrentRenderer()) {
return;
}
std::vector<std::string> levels;
for (int i = 0; i < LEVEL_MAX; i++) {
u32 lev = *Ptr<u32>(lev_list + i * 4);
std::string ls = Ptr<String>(lev).c()->data();
if (ls != "none" && ls != "#f" && ls != "") {
levels.push_back(ls);
}
}
Gfx::GetCurrentRenderer()->set_active_levels(levels);
}
void init_autosplit_struct() {
g_auto_splitter_block_jak2.pointer_to_symbol =
(u64)g_ee_main_mem + (u64)intern_from_c("*autosplit-info-jak2*")->value();
@@ -761,6 +777,7 @@ void InitMachine_PCPort() {
make_string_from_c);
make_function_symbol_from_c("__pc-set-levels", (void*)pc_set_levels);
make_function_symbol_from_c("__pc-set-active-levels", (void*)pc_set_active_levels);
make_function_symbol_from_c("__pc-get-tex-remap", (void*)lookup_jak2_texture_dest_offset);
make_function_symbol_from_c("pc-init-autosplitter-struct", (void*)init_autosplit_struct);
make_function_symbol_from_c("pc-encode-utf8-string", (void*)encode_utf8_string);
+5 -3
View File
@@ -400,14 +400,16 @@
:flag-assert #x900000010
)
(defmacro static-vectorm (x y z w)
`(new 'static 'vector :x (meters ,x) :y (meters ,y) :z (meters ,z) :w (meters ,w))
(defmacro static-vectorm (x y z)
"creates a static vector using meters. w is set to 1.0"
`(new 'static 'vector :x (meters ,x) :y (meters ,y) :z (meters ,z) :w 1.0)
)
(defmacro static-spherem (x y z r)
"actually makes a vector. use bspherem for sphere."
"creates a static vector using meters where the w component is used as sphere radius. for a 'real' sphere use static-bspherem."
`(new 'static 'vector :x (meters ,x) :y (meters ,y) :z (meters ,z) :w (meters ,r))
)
(defmacro static-bspherem (x y z r)
"creates a static sphere using meters."
`(new 'static 'sphere :x (meters ,x) :y (meters ,y) :z (meters ,z) :w (meters ,r))
)
+2 -1
View File
@@ -317,7 +317,8 @@
(mode 1)
(event 2)
(material 3)
(skip 4))
(skip 4)
(skiphide 5))
(defenum pc-gfx-hack
(no-tex 0))
+15 -1
View File
@@ -370,6 +370,13 @@
(pc-get-collision-mask (pc-collision-mode skip) arg)
)
(defun dm-collision-filter-skiphide-pick-func ((arg int) (msg debug-menu-msg))
(when (= msg (debug-menu-msg press))
(pc-set-collision-mask (pc-collision-mode skiphide) arg (not (pc-get-collision-mask (pc-collision-mode skiphide) arg)))
)
(pc-get-collision-mask (pc-collision-mode skiphide) arg)
)
(defun debug-menu-make-collision-renderer-menu ((ctx debug-menu-context))
(let ((menu (new 'debug 'debug-menu ctx "Collision renderer menu")))
;; master toggle
@@ -400,11 +407,18 @@
)
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")))
(let ((filter-menu (new 'debug 'debug-menu ctx "Collision renderer hide skip menu")))
(debug-menu-append-item filter-menu (new-dm-flag "(no skip)" -1 dm-collision-filter-skip-pick-func))
(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)))
(debug-menu-append-item menu (new-dm-submenu "Hide skip"
(let ((filter-menu (new 'debug 'debug-menu ctx "Collision renderer hide skip menu")))
(doenum (name val pc-pat-skip-hack)
(debug-menu-append-item filter-menu (new-dm-flag name val dm-collision-filter-skiphide-pick-func))
)
filter-menu)))
(new-dm-submenu "Collision renderer" menu)
)
-21
View File
@@ -29,27 +29,6 @@
"return the current pckernel version"
PC_KERNEL_VERSION)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; global variables
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; collision renderer things. debug only.
(define *collision-renderer* #f)
(define *collision-wireframe* #f)
(define *collision-mode* (pc-collision-mode mode))
;; todo
(defenum pc-pat-skip-hack
:bitfield #t
(noentity 0)
(nocamera 1)
(noedge 2)
(nolineofsight 12)
(unknowncamera 13)
(unknown 15)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; updates
+5
View File
@@ -277,6 +277,11 @@
(define *display-text-box* #f)
(define *display-sha* *debug-segment*)
;; collision renderer things. debug only.
(define *collision-renderer* #f)
(define *collision-wireframe* #f)
(define *collision-mode* (pc-collision-mode mode))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;; resets
+11
View File
@@ -211,3 +211,14 @@
(defun get-video-params () *video-parms*)
;; for debugging
(defenum pc-pat-skip-hack
:bitfield #t
(noentity 0)
(nocamera 1)
(noedge 2)
(nolineofsight 12)
(unknowncamera 13)
)
@@ -874,7 +874,7 @@ it returns a triangle and normal direction to push in.
(static-attack-info ((id (the-as uint 2)) (mode 'burn) (shove-up (meters 3))))
)
)
(((pat-event deadlup))
(((pat-event deadlyup))
(set! set-flags (logior set-flags (cshape-reaction-flags csrf14)))
(target-attack-up (the-as target (-> obj process)) 'attack-or-shove 'deadlyup)
)
+1 -1
View File
@@ -52,7 +52,7 @@
(deadly 1)
(endlessfall 2)
(burn 3)
(deadlup 4)
(deadlyup 4)
(burnup 5)
(melt 6)
(slide 7)
+153 -85
View File
@@ -229,6 +229,141 @@
(none)
)
(defun add-pc-tfrag3-data ((dma-buf dma-buffer) (lev level))
"Add PC-port specific tfrag data"
(let ((packet (the-as dma-packet (-> dma-buf base))))
(set! (-> packet dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc 24))
(set! (-> packet vif0) (new 'static 'vif-tag))
(set! (-> packet vif1) (new 'static 'vif-tag :cmd (vif-cmd pc-port)))
(set! (-> dma-buf base) (the pointer (&+ packet 16)))
)
;; first 4 quadwords are planes, then itimes
(let ((data-ptr (the-as (pointer uint128) (-> dma-buf base))))
;; the "use-camera-other" flag is set to "move" entire levels,
;; like the rotating city below in the throne room.
(cond
((-> lev info use-camera-other)
(set! (-> data-ptr 0) (-> *math-camera* plane-other 0 quad))
(set! (-> data-ptr 1) (-> *math-camera* plane-other 1 quad))
(set! (-> data-ptr 2) (-> *math-camera* plane-other 2 quad))
(set! (-> data-ptr 3) (-> *math-camera* plane-other 3 quad))
(set! (-> data-ptr 4) (-> lev mood-context itimes 0 quad))
(set! (-> data-ptr 5) (-> lev mood-context itimes 1 quad))
(set! (-> data-ptr 6) (-> lev mood-context itimes 2 quad))
(set! (-> data-ptr 7) (-> lev mood-context itimes 3 quad))
(set! (-> data-ptr 8) (-> *math-camera* camera-temp-other vector 0 quad))
(set! (-> data-ptr 9) (-> *math-camera* camera-temp-other vector 1 quad))
(set! (-> data-ptr 10) (-> *math-camera* camera-temp-other vector 2 quad))
(set! (-> data-ptr 11) (-> *math-camera* camera-temp-other vector 3 quad))
(set! (-> data-ptr 12) (-> *math-camera* hvdf-off quad))
(let ((vec (-> (the (inline-array vector) data-ptr) 13)))
(set! (-> vec x) (-> *math-camera* pfog0))
(set! (-> vec y) (-> *math-camera* fog-min))
(set! (-> vec z) (-> *math-camera* fog-max))
)
(set! (-> data-ptr 14) (-> *math-camera* trans-other quad))
(set! (-> data-ptr 15) (-> *math-camera* camera-rot-other vector 0 quad))
(set! (-> data-ptr 16) (-> *math-camera* camera-rot-other vector 1 quad))
(set! (-> data-ptr 17) (-> *math-camera* camera-rot-other vector 2 quad))
(set! (-> data-ptr 18) (-> *math-camera* camera-rot-other vector 3 quad))
(set! (-> data-ptr 19) (-> *math-camera* perspective vector 0 quad))
(set! (-> data-ptr 20) (-> *math-camera* perspective vector 1 quad))
(set! (-> data-ptr 21) (-> *math-camera* perspective vector 2 quad))
(set! (-> data-ptr 22) (-> *math-camera* perspective vector 3 quad))
)
(else
(set! (-> data-ptr 0) (-> *math-camera* plane 0 quad))
(set! (-> data-ptr 1) (-> *math-camera* plane 1 quad))
(set! (-> data-ptr 2) (-> *math-camera* plane 2 quad))
(set! (-> data-ptr 3) (-> *math-camera* plane 3 quad))
(set! (-> data-ptr 4) (-> lev mood-context itimes 0 quad))
(set! (-> data-ptr 5) (-> lev mood-context itimes 1 quad))
(set! (-> data-ptr 6) (-> lev mood-context itimes 2 quad))
(set! (-> data-ptr 7) (-> lev mood-context itimes 3 quad))
(set! (-> data-ptr 8) (-> *math-camera* camera-temp vector 0 quad))
(set! (-> data-ptr 9) (-> *math-camera* camera-temp vector 1 quad))
(set! (-> data-ptr 10) (-> *math-camera* camera-temp vector 2 quad))
(set! (-> data-ptr 11) (-> *math-camera* camera-temp vector 3 quad))
(set! (-> data-ptr 12) (-> *math-camera* hvdf-off quad))
(let ((vec (-> (the (inline-array vector) data-ptr) 13)))
(set! (-> vec x) (-> *math-camera* pfog0))
(set! (-> vec y) (-> *math-camera* fog-min))
(set! (-> vec z) (-> *math-camera* fog-max))
)
(set! (-> data-ptr 14) (-> *math-camera* trans quad))
(set! (-> data-ptr 15) (-> *math-camera* camera-rot vector 0 quad))
(set! (-> data-ptr 16) (-> *math-camera* camera-rot vector 1 quad))
(set! (-> data-ptr 17) (-> *math-camera* camera-rot vector 2 quad))
(set! (-> data-ptr 18) (-> *math-camera* camera-rot vector 3 quad))
(set! (-> data-ptr 19) (-> *math-camera* perspective vector 0 quad))
(set! (-> data-ptr 20) (-> *math-camera* perspective vector 1 quad))
(set! (-> data-ptr 21) (-> *math-camera* perspective vector 2 quad))
(set! (-> data-ptr 22) (-> *math-camera* perspective vector 3 quad))
)
)
(charp<-string (the (pointer uint8) (&-> data-ptr 23)) (symbol->string (-> lev nickname)))
)
(&+! (-> dma-buf base) (* 16 24))
)
(defun add-pc-camera-data ((dma-buf dma-buffer))
"Add PC-port specific camera data. used as fallback for collide mesh renderer.
Same as add-pc-trag3-data but level-specific data is left undefined."
(let ((packet (the-as dma-packet (-> dma-buf base))))
(set! (-> packet dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc 24))
(set! (-> packet vif0) (new 'static 'vif-tag))
(set! (-> packet vif1) (new 'static 'vif-tag :cmd (vif-cmd pc-port)))
(set! (-> dma-buf base) (the pointer (&+ packet 16)))
)
;; first 4 quadwords are planes, then itimes
(let ((data-ptr (the-as (pointer uint128) (-> dma-buf base))))
;; the "use-camera-other" flag is set to "move" entire levels,
;; like the rotating city below in the throne room.
(set! (-> data-ptr 0) (-> *math-camera* plane 0 quad))
(set! (-> data-ptr 1) (-> *math-camera* plane 1 quad))
(set! (-> data-ptr 2) (-> *math-camera* plane 2 quad))
(set! (-> data-ptr 3) (-> *math-camera* plane 3 quad))
;; (set! (-> data-ptr 4) (-> lev mood-context itimes 0 quad))
;; (set! (-> data-ptr 5) (-> lev mood-context itimes 1 quad))
;; (set! (-> data-ptr 6) (-> lev mood-context itimes 2 quad))
;; (set! (-> data-ptr 7) (-> lev mood-context itimes 3 quad))
(set! (-> data-ptr 8) (-> *math-camera* camera-temp vector 0 quad))
(set! (-> data-ptr 9) (-> *math-camera* camera-temp vector 1 quad))
(set! (-> data-ptr 10) (-> *math-camera* camera-temp vector 2 quad))
(set! (-> data-ptr 11) (-> *math-camera* camera-temp vector 3 quad))
(set! (-> data-ptr 12) (-> *math-camera* hvdf-off quad))
(let ((vec (-> (the (inline-array vector) data-ptr) 13)))
(set! (-> vec x) (-> *math-camera* pfog0))
(set! (-> vec y) (-> *math-camera* fog-min))
(set! (-> vec z) (-> *math-camera* fog-max))
)
(set! (-> data-ptr 14) (-> *math-camera* trans quad))
(set! (-> data-ptr 15) (-> *math-camera* camera-rot vector 0 quad))
(set! (-> data-ptr 16) (-> *math-camera* camera-rot vector 1 quad))
(set! (-> data-ptr 17) (-> *math-camera* camera-rot vector 2 quad))
(set! (-> data-ptr 18) (-> *math-camera* camera-rot vector 3 quad))
(set! (-> data-ptr 19) (-> *math-camera* perspective vector 0 quad))
(set! (-> data-ptr 20) (-> *math-camera* perspective vector 1 quad))
(set! (-> data-ptr 21) (-> *math-camera* perspective vector 2 quad))
(set! (-> data-ptr 22) (-> *math-camera* perspective vector 3 quad))
(charp<-string (the (pointer uint8) (&-> data-ptr 23)) (symbol->string #f))
)
(&+! (-> dma-buf base) (* 16 24))
)
(defun add-pc-port-background-data ((dma-buf dma-buffer))
"PC Port added"
;; loop over levels
@@ -275,6 +410,24 @@
)
)
)
(let* ((shrub-dma-buff (-> *display* frames (-> *display* on-screen) global-buf))
(dma-start (-> shrub-dma-buff base)))
(add-pc-camera-data shrub-dma-buff)
(let ((a3-22 (-> shrub-dma-buff base)))
(let ((v1-57 (the-as object (-> shrub-dma-buff base))))
(set! (-> (the-as dma-packet v1-57) dma) (new 'static 'dma-tag :id (dma-tag-id next)))
(set! (-> (the-as dma-packet v1-57) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet v1-57) vif1) (new 'static 'vif-tag))
(set! (-> shrub-dma-buff base) (&+ (the-as pointer v1-57) 16))
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) bucket-group)
(bucket-id bucket-2)
dma-start
(the-as (pointer dma-tag) a3-22)
)
)
)
(the-as pointer 0)
)
@@ -602,88 +755,3 @@
0
(none)
)
(defun add-pc-tfrag3-data ((dma-buf dma-buffer) (lev level))
"Add PC-port specific tfrag data"
(let ((packet (the-as dma-packet (-> dma-buf base))))
(set! (-> packet dma) (new 'static 'dma-tag :id (dma-tag-id cnt) :qwc 24))
(set! (-> packet vif0) (new 'static 'vif-tag))
(set! (-> packet vif1) (new 'static 'vif-tag :cmd (vif-cmd pc-port)))
(set! (-> dma-buf base) (the pointer (&+ packet 16)))
)
;; first 4 quadwords are planes, then itimes
(let ((data-ptr (the-as (pointer uint128) (-> dma-buf base))))
;; the "use-camera-other" flag is set to "move" entire levels,
;; like the rotating city below in the throne room.
(cond
((-> lev info use-camera-other)
(set! (-> data-ptr 0) (-> *math-camera* plane-other 0 quad))
(set! (-> data-ptr 1) (-> *math-camera* plane-other 1 quad))
(set! (-> data-ptr 2) (-> *math-camera* plane-other 2 quad))
(set! (-> data-ptr 3) (-> *math-camera* plane-other 3 quad))
(set! (-> data-ptr 4) (-> lev mood-context itimes 0 quad))
(set! (-> data-ptr 5) (-> lev mood-context itimes 1 quad))
(set! (-> data-ptr 6) (-> lev mood-context itimes 2 quad))
(set! (-> data-ptr 7) (-> lev mood-context itimes 3 quad))
(set! (-> data-ptr 8) (-> *math-camera* camera-temp-other vector 0 quad))
(set! (-> data-ptr 9) (-> *math-camera* camera-temp-other vector 1 quad))
(set! (-> data-ptr 10) (-> *math-camera* camera-temp-other vector 2 quad))
(set! (-> data-ptr 11) (-> *math-camera* camera-temp-other vector 3 quad))
(set! (-> data-ptr 12) (-> *math-camera* hvdf-off quad))
(let ((vec (-> (the (inline-array vector) data-ptr) 13)))
(set! (-> vec x) (-> *math-camera* pfog0))
(set! (-> vec y) (-> *math-camera* fog-min))
(set! (-> vec z) (-> *math-camera* fog-max))
)
(set! (-> data-ptr 14) (-> *math-camera* trans-other quad))
(set! (-> data-ptr 15) (-> *math-camera* camera-rot-other vector 0 quad))
(set! (-> data-ptr 16) (-> *math-camera* camera-rot-other vector 1 quad))
(set! (-> data-ptr 17) (-> *math-camera* camera-rot-other vector 2 quad))
(set! (-> data-ptr 18) (-> *math-camera* camera-rot-other vector 3 quad))
(set! (-> data-ptr 19) (-> *math-camera* perspective vector 0 quad))
(set! (-> data-ptr 20) (-> *math-camera* perspective vector 1 quad))
(set! (-> data-ptr 21) (-> *math-camera* perspective vector 2 quad))
(set! (-> data-ptr 22) (-> *math-camera* perspective vector 3 quad))
)
(else
(set! (-> data-ptr 0) (-> *math-camera* plane 0 quad))
(set! (-> data-ptr 1) (-> *math-camera* plane 1 quad))
(set! (-> data-ptr 2) (-> *math-camera* plane 2 quad))
(set! (-> data-ptr 3) (-> *math-camera* plane 3 quad))
(set! (-> data-ptr 4) (-> lev mood-context itimes 0 quad))
(set! (-> data-ptr 5) (-> lev mood-context itimes 1 quad))
(set! (-> data-ptr 6) (-> lev mood-context itimes 2 quad))
(set! (-> data-ptr 7) (-> lev mood-context itimes 3 quad))
(set! (-> data-ptr 8) (-> *math-camera* camera-temp vector 0 quad))
(set! (-> data-ptr 9) (-> *math-camera* camera-temp vector 1 quad))
(set! (-> data-ptr 10) (-> *math-camera* camera-temp vector 2 quad))
(set! (-> data-ptr 11) (-> *math-camera* camera-temp vector 3 quad))
(set! (-> data-ptr 12) (-> *math-camera* hvdf-off quad))
(let ((vec (-> (the (inline-array vector) data-ptr) 13)))
(set! (-> vec x) (-> *math-camera* pfog0))
(set! (-> vec y) (-> *math-camera* fog-min))
(set! (-> vec z) (-> *math-camera* fog-max))
)
(set! (-> data-ptr 14) (-> *math-camera* trans quad))
(set! (-> data-ptr 15) (-> *math-camera* camera-rot vector 0 quad))
(set! (-> data-ptr 16) (-> *math-camera* camera-rot vector 1 quad))
(set! (-> data-ptr 17) (-> *math-camera* camera-rot vector 2 quad))
(set! (-> data-ptr 18) (-> *math-camera* camera-rot vector 3 quad))
(set! (-> data-ptr 19) (-> *math-camera* perspective vector 0 quad))
(set! (-> data-ptr 20) (-> *math-camera* perspective vector 1 quad))
(set! (-> data-ptr 21) (-> *math-camera* perspective vector 2 quad))
(set! (-> data-ptr 22) (-> *math-camera* perspective vector 3 quad))
)
)
(charp<-string (the (pointer uint8) (&-> data-ptr 23)) (symbol->string (-> lev nickname)))
)
(&+! (-> dma-buf base) (* 16 24))
)
+10 -5
View File
@@ -2959,18 +2959,23 @@ into 7 sections, which might explain the weird sizes in the center.
)
;; og:preserve-this added
(let ((lev-names (new 'stack-no-clear 'array 'string LEVEL_MAX)))
(let ((lev-names (new 'stack-no-clear 'array 'string LEVEL_MAX))
(active-lev-names (new 'stack-no-clear 'array 'string LEVEL_MAX)))
(dotimes (i LEVEL_MAX)
(set! (-> active-lev-names i) "none")
(set! (-> lev-names i) "none")
(cond
((= (-> obj level i status) 'inactive)
(set! (-> lev-names i) "none")
)
(else
((or (= (-> obj level i status) 'active)
(= (-> obj level i status) 'alive)
(= (-> obj level i status) 'loaded))
(set! (-> lev-names i) (symbol->string (-> obj level i nickname)))
(if (-> obj level i display?)
(set! (-> active-lev-names i) (symbol->string (-> obj level i nickname))))
)
)
)
(__pc-set-levels lev-names)
(__pc-set-active-levels active-lev-names)
)
0
(none)
+5 -3
View File
@@ -436,14 +436,16 @@ Changes:
:flag-assert #x900000010
)
(defmacro static-vectorm (x y z w)
`(new 'static 'vector :x (meters ,x) :y (meters ,y) :z (meters ,z) :w (meters ,w))
(defmacro static-vectorm (x y z)
"creates a static vector using meters. w is set to 1.0"
`(new 'static 'vector :x (meters ,x) :y (meters ,y) :z (meters ,z) :w 1.0)
)
(defmacro static-spherem (x y z r)
"actually makes a vector. use bspherem for sphere."
"creates a static vector using meters where the w component is used as sphere radius. for a 'real' sphere use static-bspherem."
`(new 'static 'vector :x (meters ,x) :y (meters ,y) :z (meters ,z) :w (meters ,r))
)
(defmacro static-bspherem (x y z r)
"creates a static sphere using meters."
`(new 'static 'sphere :x (meters ,x) :y (meters ,y) :z (meters ,z) :w (meters ,r))
)
+3 -1
View File
@@ -142,7 +142,8 @@
(mode 1)
(event 2)
(material 3)
(skip 4))
(skip 4)
(skiphide 5))
(defenum pc-gfx-hack
(no-tex 0))
@@ -155,6 +156,7 @@
(define-extern __pc-texture-relocate (function object object object none))
(define-extern __pc-get-mips2c (function string function))
(define-extern __pc-set-levels (function (pointer string) none))
(define-extern __pc-set-active-levels (function (pointer string) none))
(define-extern __pc-get-tex-remap (function int int int))
;; Input Related Functions
+14
View File
@@ -403,6 +403,13 @@
(pc-get-collision-mask (pc-collision-mode skip) arg)
)
(defun dm-collision-filter-skiphide-pick-func ((arg int) (msg debug-menu-msg))
(when (= msg (debug-menu-msg press))
(pc-set-collision-mask (pc-collision-mode skiphide) arg (not (pc-get-collision-mask (pc-collision-mode skiphide) arg)))
)
(pc-get-collision-mask (pc-collision-mode skiphide) 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
@@ -434,10 +441,17 @@
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")))
(debug-menu-append-item filter-menu (new-dm-flag "(no skip)" -1 dm-collision-filter-skip-pick-func))
(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)))
(debug-menu-append-item menu (new-dm-submenu "Hide skip"
(let ((filter-menu (new 'debug 'debug-menu ctx "OpenGOAL collision renderer hide skip menu")))
(doenum (name val pc-pat-skip-hack)
(debug-menu-append-item filter-menu (new-dm-flag name val dm-collision-filter-skiphide-pick-func))
)
filter-menu)))
(new-dm-submenu "OpenGOAL collision renderer" menu)
)
+20
View File
@@ -165,6 +165,26 @@
(define *debug-region-show-bsphere* #f)
;; for debugging
(defenum pc-pat-skip-hack
:bitfield #t
(noentity 0)
(nocamera 1)
(noedge 2)
(nogrind 3)
(nojak 4)
(noboard 5)
(nopilot 6)
(nolineofsight 16)
(unknowncamera 17)
(probe 24)
(nomech 25)
(noproj 26)
(noendlessfall 27)
(noprobe 28)
)
(defun get-video-params () *video-params*)
+2 -1
View File
@@ -393,7 +393,8 @@ void Compiler::setup_goos_forms() {
std::vector<std::pair<std::string, s64>> sorted_values;
for (auto& val : enum_type->entries()) {
sorted_values.emplace_back(val.first, val.second);
sorted_values.emplace_back(val.first,
enum_type->is_bitfield() ? (u64)1 << val.second : val.second);
}
std::sort(sorted_values.begin(), sorted_values.end(),
+1 -1
View File
@@ -828,7 +828,7 @@
(static-attack-info ((id (the-as uint 2)) (mode 'burn) (shove-up (meters 3))))
)
)
(((pat-event deadlup))
(((pat-event deadlyup))
(set! set-flags (logior set-flags (cshape-reaction-flags csrf14)))
(target-attack-up (the-as target (-> obj process)) 'attack-or-shove 'deadlyup)
)
+1 -5
View File
@@ -200,7 +200,7 @@
(((pat-event hide))
"hide"
)
(((pat-event deadlup))
(((pat-event deadlyup))
"deadlyup"
)
(((pat-event shockup))
@@ -288,7 +288,3 @@
;; failed to figure out what this is:
0