diff --git a/src/game/bondview2.c b/src/game/bondview2.c index 2fb05fe0..5c41b89a 100644 --- a/src/game/bondview2.c +++ b/src/game/bondview2.c @@ -365,6 +365,19 @@ static int d243mEnabled(void) } static int g_d243mFrameCounter = 0; + +/* M-154: accessors for the D243M: chrdraw census probe in objecthandler.c's + * drawjointlist (which does not include bondview.h). ProbeActive() folds in + * the scripted-camera gate (POSEND/INTRO/SWIRL/FADESWIRL) so callers need no + * camera-mode knowledge; silent during FPS play. */ +int d243mProbeActive(void) +{ + return d243mEnabled() && + ((g_CameraMode == CAMERAMODE_POSEND) || (g_CameraMode == CAMERAMODE_INTRO) || + (g_CameraMode == CAMERAMODE_SWIRL) || (g_CameraMode == CAMERAMODE_FADESWIRL)); +} + +int d243mGetFrameCounter(void) { return g_d243mFrameCounter; } #endif void solo_char_load(void) @@ -10394,11 +10407,32 @@ s32 playerTick(PropRecord *prop) int cutsceneCam = ((g_CameraMode == CAMERAMODE_POSEND) || (g_CameraMode == CAMERAMODE_INTRO)); g_d243mFrameCounter++; if (cutsceneCam || (pp->bodyModel != NULL)) { - osSyncPrintf("D243M: tick frame=%d idx=%d model=%p cam=%d subcam=%d " + /* M-154: rp = the render_pos pointer itself (a change between + * phases would mean the Model's matrix buffer is being + * reassigned/aliased); raw = render_pos[0]'s translation BEFORE + * the view transform (distinguishes model-matrix cycling from + * view-matrix cycling in f488pos). */ + RenderPosView *d243mrp = (pp->bodyModel != NULL) ? pp->bodyModel->render_pos : NULL; + double d243mrx = 0.0, d243mry = 0.0, d243mrz = 0.0; + if (d243mrp != NULL) { + Mtxf *d243mraw = (Mtxf *) d243mrp; + d243mrx = d243mraw->m[3][0]; + d243mry = d243mraw->m[3][1]; + d243mrz = d243mraw->m[3][2]; + } + /* M-154b: propptr/chrptr -- the phase-3 A,A,B,C position cycle + * with smoothly falling y could mean pp->prop itself rotates + * among three PropRecords per frame; a changing pointer proves + * it, a constant one points at a cycling x/z source (script / + * anim table). */ + osSyncPrintf("D243M: tick frame=%d idx=%d model=%p propptr=%p chrptr=%p " + "cam=%d subcam=%d " "prop=%.1f,%.1f,%.1f f488pos=%.1f,%.1f,%.1f " - "f3B8=%.1f,%.1f,%.1f f3C4=%.1f,%.1f,%.1f\n", + "f3B8=%.1f,%.1f,%.1f f3C4=%.1f,%.1f,%.1f " + "rp=%p raw=%.1f,%.1f,%.1f\n", g_d243mFrameCounter, index, (void *) pp->bodyModel, + (void *) pp->prop, (void *) pp->prop->chr, (int) g_CameraMode, (int) dword_CODE_bss_80079A18, (double) pp->prop->pos.f[0], (double) pp->prop->pos.f[1], @@ -10411,7 +10445,9 @@ s32 playerTick(PropRecord *prop) (double) pp->field_3B8.f[2], (double) pp->field_3C4, (double) pp->field_3C8, - (double) pp->field_3CC); + (double) pp->field_3CC, + (void *) d243mrp, + d243mrx, d243mry, d243mrz); } } #endif diff --git a/src/game/objecthandler.c b/src/game/objecthandler.c index 99def1f3..1ff4ed58 100644 --- a/src/game/objecthandler.c +++ b/src/game/objecthandler.c @@ -887,6 +887,24 @@ void drawjointlist(ModelRenderData *data, ModelHitEntry *entry) Gfx *gdl; s32 opcode; +#ifdef PORT + /* D243 M-154: per-frame model-draw census. One line per drawjointlist + * call (i.e. per CHR render submission) while a scripted camera mode is + * active, logging the Model* pointer and render_pos[0]'s raw translation + * BEFORE the view transform. A second Bond instance shows up as extra + * lines with distinct model pointers at the same frame; a shared/aliased + * matrix buffer shows up as one pointer whose raw position cycles. + * Diagnosis only; silent when GE_D243M is unset or during FPS play. */ + extern int d243mProbeActive(void); + extern int d243mGetFrameCounter(void); + if (d243mProbeActive() && (entry != NULL) && (entry->model != NULL) && (entry->model->render_pos != NULL)) { + Mtxf *d243mraw = (Mtxf *) entry->model->render_pos; + osSyncPrintf("D243M: chrdraw frame=%d model=%p raw=%.1f,%.1f,%.1f\n", + d243mGetFrameCounter(), (void *) entry->model, + (double) d243mraw->m[3][0], (double) d243mraw->m[3][1], (double) d243mraw->m[3][2]); + } +#endif + if (data->gdl == NULL) { osSyncPrintf("drawjointlist: no gfxlist!\n"); @@ -1014,6 +1032,19 @@ void drawjointlist(ModelRenderData *data, ModelHitEntry *entry) Gfx *gdl; s32 opcode; +#ifdef PORT + /* D243 M-154: per-frame model-draw census (EU variant) -- see the US/JP + * copy above for the full rationale. */ + extern int d243mProbeActive(void); + extern int d243mGetFrameCounter(void); + if (d243mProbeActive() && (entry != NULL) && (entry->model != NULL) && (entry->model->render_pos != NULL)) { + Mtxf *d243mraw = (Mtxf *) entry->model->render_pos; + osSyncPrintf("D243M: chrdraw frame=%d model=%p raw=%.1f,%.1f,%.1f\n", + d243mGetFrameCounter(), (void *) entry->model, + (double) d243mraw->m[3][0], (double) d243mraw->m[3][1], (double) d243mraw->m[3][2]); + } +#endif + while (entry != NULL) { root = entry->rootnode;