Implement & link ac_mural

This commit is contained in:
Cuyler36
2024-02-28 21:25:26 -05:00
parent 3edf86ad45
commit d2a7c0f121
8 changed files with 156 additions and 3 deletions
+91
View File
@@ -0,0 +1,91 @@
#include "ac_mural.h"
#include "m_debug.h"
#include "m_name_table.h"
#include "m_player_lib.h"
#include "sys_matrix.h"
static void Mural_Actor_ct(ACTOR* actorx, GAME* game);
static void Mural_Actor_dt(ACTOR* actorx, GAME* game);
static void Mural_Actor_move(ACTOR* actorx, GAME* game);
static void Mural_Actor_draw(ACTOR* actorx, GAME* game);
ACTOR_PROFILE Mural_Profile = {
mAc_PROFILE_MURAL,
ACTOR_PART_BG,
ACTOR_STATE_CAN_MOVE_IN_DEMO_SCENES | ACTOR_STATE_NO_DRAW_WHILE_CULLED | ACTOR_STATE_NO_MOVE_WHILE_CULLED,
EMPTY_NO,
ACTOR_OBJ_BANK_MURAL,
sizeof(MURAL_ACTOR),
&Mural_Actor_ct,
&Mural_Actor_dt,
&Mural_Actor_move,
&Mural_Actor_draw,
NULL,
};
static u8 tex[aML_MURAL_NUM][(32 * 32) / 2];
static u16 pal[aML_MURAL_NUM][16];
static void Mural_Actor_ct(ACTOR* actorx, GAME* game) {
MURAL_ACTOR* mural = (MURAL_ACTOR*)actorx;
int i;
for (i = 0; i < aML_MURAL_NUM; i++) {
mural->mural[i].tex_p = tex[i];
mural->mural[i].pal_p = pal[i];
mPlib_Load_PlayerTexAndPallet(mural->mural[i].tex_p, mural->mural[i].pal_p, i);
mural->mural[i].type = 0;
}
}
static void Mural_Actor_dt(ACTOR* actorx, GAME* game) {
// nothing
}
static void Mural_Actor_move(ACTOR* actorx, GAME* game) {
MURAL_ACTOR* mural = (MURAL_ACTOR*)actorx;
if (REGADDR(TAKREG, 10) == 0 || REGADDR(TAKREG, 10) == 1) {
if (REGADDR(TAKREG, 12) >= 0 && REGADDR(TAKREG, 12) < 255) {
if (REGADDR(TAKREG, 11) >= 0 && REGADDR(TAKREG, 11) < aML_MURAL_NUM) {
mural->mural[REGADDR(TAKREG, 11)].type = REGADDR(TAKREG, 10);
mPlib_Load_PlayerTexAndPallet(mural->mural[REGADDR(TAKREG, 11)].tex_p,
mural->mural[REGADDR(TAKREG, 11)].pal_p, REGADDR(TAKREG, 12));
}
}
}
actorx->world.position.y = 140.0f;
}
extern Gfx obj_mural_model[];
static void Mural_Actor_draw(ACTOR* actorx, GAME* game) {
MURAL_ACTOR* mural = (MURAL_ACTOR*)actorx;
int y;
int x;
int i;
i = 0;
for (y = 0; y < aML_MURAL_Y_NUM; y++) {
for (x = 0; x < aML_MURAL_X_NUM; x++, i++) {
OPEN_DISP(game->graph);
Matrix_translate(actorx->world.position.x + x * 24.0f, actorx->world.position.y - y * 24.0f,
actorx->world.position.z, 0);
Matrix_scale(0.01f, 0.01f, 0.01f, 1);
/* Segment 8 holds the palette */
gSPSegment(NEXT_POLY_OPA_DISP, G_MWO_SEGMENT_8, mural->mural[i].pal_p);
/* Segment 9 holds the texture */
gSPSegment(NEXT_POLY_OPA_DISP, G_MWO_SEGMENT_9, mural->mural[i].tex_p);
gSPMatrix(NEXT_POLY_OPA_DISP, _Matrix_to_Mtx_new(game->graph), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPDisplayList(NEXT_POLY_OPA_DISP, obj_mural_model);
CLOSE_DISP(game->graph);
}
}
}
+30
View File
@@ -0,0 +1,30 @@
#include "libforest/gbi_extensions.h"
// clang-format off
static Vtx obj_mural_v[] = {
#include "assets/obj_mural_v.inc"
};
Gfx obj_mural_model[] = {
gsSPTexture(65535, 65535, 0, G_TX_RENDERTILE, G_ON),
gsDPPipeSync(),
gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_OPA_SURF2),
gsDPSetCombineLERP(TEXEL0, 0, SHADE, 0, 0, 0, 0, TEXEL0, PRIMITIVE, 0, COMBINED, 0, 0, 0, 0, COMBINED),
gsDPSetTextureLUT(G_TT_RGBA16),
/* @BUG - These commands were never updated for Dolphin and therefore render broken */
#ifndef BUGFIXES
gsDPLoadTLUT_pal16(15, 0x08000000),
gsDPLoadTextureBlock_4b(0x09000000, G_IM_FMT_CI, 32, 32, 15, G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_CLAMP, 5, 5, G_TX_NOLOD, G_TX_NOLOD),
#else
gsDPLoadTLUT_Dolphin(15, 16, 1, 0x08000000),
gsDPLoadTextureBlock_4b_Dolphin(0x09000000, G_IM_FMT_CI, 32, 32, 15, GX_MIRROR, GX_CLAMP, 0, 0),
#endif
gsDPSetPrimColor(0, 128, 255, 255, 255, 255),
gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH),
gsSPVertex(&obj_mural_v[0], 4, 0),
gsSP2Triangles(0, 1, 2, 0, 0, 2, 3, 0),
gsSPEndDisplayList(),
};
// clang-format on