From 9032ace9592bbbbeb71d1ffaaaca68060dbec594 Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Thu, 29 Feb 2024 14:24:40 -0500 Subject: [PATCH] Add optional fix for ac_sample, add tmpr Gfx for fixing later --- src/ac_sample.c | 239 ++++++++++++++--------------- src/data/field/bg/acre/tmpr/tmpr.c | 144 +++++++++++++++++ 2 files changed, 262 insertions(+), 121 deletions(-) create mode 100644 src/data/field/bg/acre/tmpr/tmpr.c diff --git a/src/ac_sample.c b/src/ac_sample.c index d4516499..dc1d1e5e 100644 --- a/src/ac_sample.c +++ b/src/ac_sample.c @@ -8,188 +8,185 @@ #include "m_name_table.h" #include "m_play.h" -static ClObjPipeData_c Ac_Sample_OcInfoData_forStand = { - { 0x39, 0x20, ClObj_TYPE_PIPE }, // collision data - { 1 }, // element data - // Pipe specs - { - 30, // radius - 60, // height - 0, // offset +static ClObjPipeData_c Ac_Sample_OcInfoData_forStand = { { 0x39, 0x20, ClObj_TYPE_PIPE }, // collision data + { 1 }, // element data + // Pipe specs + { + 30, // radius + 60, // height + 0, // offset - { 0, 0, 0 } // center - } -}; + { 0, 0, 0 } // center + } }; static void Ac_Sample_ct_forCorect(ACTOR* actor, GAME* game) { - GAME_PLAY* play = (GAME_PLAY*)game; - SAMPLE_ACTOR* sample = (SAMPLE_ACTOR*)actor; - ClObjPipe_ct(game, &sample->stand); - ClObjPipe_set5(game, &sample->stand, (ACTOR*)actor, &Ac_Sample_OcInfoData_forStand); + GAME_PLAY* play = (GAME_PLAY*)game; + SAMPLE_ACTOR* sample = (SAMPLE_ACTOR*)actor; + ClObjPipe_ct(game, &sample->stand); + ClObjPipe_set5(game, &sample->stand, (ACTOR*)actor, &Ac_Sample_OcInfoData_forStand); } static void Ac_Sample_Excute_Corect(SAMPLE_ACTOR* actor, GAME_PLAY* play) { - ClObjPipe_c* stand = &actor->stand; - - CollisionCheck_Uty_ActorWorldPosSetPipeC((ACTOR*)actor, stand); - CollisionCheck_setOC(&play->game, &play->collision_check, (ClObj_c*)stand); + ClObjPipe_c* stand = &actor->stand; + + CollisionCheck_Uty_ActorWorldPosSetPipeC((ACTOR*)actor, stand); + CollisionCheck_setOC(&play->game, &play->collision_check, (ClObj_c*)stand); } static void Ac_Sample_Actor_dt(ACTOR* actor, GAME* game) { - SAMPLE_ACTOR* sample = (SAMPLE_ACTOR*)actor; - cKF_SkeletonInfo_R_c* keyframe = &sample->keyframe; - if (actor->child_actor != NULL) { - Actor_delete(actor->child_actor); - } + SAMPLE_ACTOR* sample = (SAMPLE_ACTOR*)actor; + cKF_SkeletonInfo_R_c* keyframe = &sample->keyframe; + if (actor->child_actor != NULL) { + Actor_delete(actor->child_actor); + } - cKF_SkeletonInfo_R_dt(keyframe); - ClObjPipe_dt(game, &sample->stand); + cKF_SkeletonInfo_R_dt(keyframe); + ClObjPipe_dt(game, &sample->stand); } static void Ac_Sample_Animation_Base(SAMPLE_ACTOR* actor) { - cKF_SkeletonInfo_R_play(&actor->keyframe); + cKF_SkeletonInfo_R_play(&actor->keyframe); } static void Ac_Sample_Actor_wait_demo_ct(ACTOR* actor) { - // ドリキャス "Dreamcast" - static u8 str0[16] = { 0xDC, 0xB8, 0x97, 0x8C, 0x9D, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE }; + // ドリキャス "Dreamcast" + static u8 str0[16] = { 0xDC, 0xB8, 0x97, 0x8C, 0x9D, CHAR_SPACE, + CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, + CHAR_SPACE, CHAR_SPACE, CHAR_SPACE, CHAR_SPACE }; - // プレステ2 "Playstation 2" - static u8 str9[5] = { 0xE4, 0xBA, 0x9D, 0xA3, 0x32 }; + // プレステ2 "Playstation 2" + static u8 str9[5] = { 0xE4, 0xBA, 0x9D, 0xA3, 0x32 }; - static u8 str_mail[64]; + static u8 str_mail[64]; - mDemo_Set_msg_num(9); - mMsg_Set_item_str(mMsg_Get_base_window_p(), 0, str0, 6); - mMsg_Set_item_str(mMsg_Get_base_window_p(), 4, str9, 5); - mMsg_Set_free_str(mMsg_Get_base_window_p(), 0, str0, 16); - mMsg_Set_free_str(mMsg_Get_base_window_p(), 9, str9, 5); - mMsg_Set_mail_str(mMsg_Get_base_window_p(), 0, str_mail, 64); + mDemo_Set_msg_num(9); + mMsg_Set_item_str(mMsg_Get_base_window_p(), 0, str0, 6); + mMsg_Set_item_str(mMsg_Get_base_window_p(), 4, str9, 5); + mMsg_Set_free_str(mMsg_Get_base_window_p(), 0, str0, 16); + mMsg_Set_free_str(mMsg_Get_base_window_p(), 9, str9, 5); + mMsg_Set_mail_str(mMsg_Get_base_window_p(), 0, str_mail, 64); } static void Ac_Sample_Actor_main_wait(SAMPLE_ACTOR* actor, GAME_PLAY* play) { - Ac_Sample_Animation_Base(actor); - Actor_world_to_eye((ACTOR*)actor, 48.0f); - Ac_Sample_Excute_Corect(actor, play); + Ac_Sample_Animation_Base(actor); + Actor_world_to_eye((ACTOR*)actor, 48.0f); + Ac_Sample_Excute_Corect(actor, play); - if (mDemo_Check(mDemo_TYPE_TALK, (ACTOR*)actor) == FALSE) { - mDemo_Request(mDemo_TYPE_TALK, (ACTOR*)actor, &Ac_Sample_Actor_wait_demo_ct); - } - else { - actor->main_action = 1; - } + if (mDemo_Check(mDemo_TYPE_TALK, (ACTOR*)actor) == FALSE) { + mDemo_Request(mDemo_TYPE_TALK, (ACTOR*)actor, &Ac_Sample_Actor_wait_demo_ct); + } else { + actor->main_action = 1; + } } static void Ac_Sample_Actor_main_talk(SAMPLE_ACTOR* actor, GAME_PLAY* play) { - Ac_Sample_Animation_Base(actor); - Actor_world_to_eye((ACTOR*)actor, 48.0f); - Ac_Sample_Excute_Corect(actor, play); + Ac_Sample_Animation_Base(actor); + Actor_world_to_eye((ACTOR*)actor, 48.0f); + Ac_Sample_Excute_Corect(actor, play); - if (mDemo_Check(mDemo_TYPE_TALK, (ACTOR*)actor)) { - s16 angle = add_calc_short_angle2(&actor->actor_class.shape_info.rotation.y, actor->actor_class.player_angle_y, 1.0f, 5000, 100); - actor->actor_class.world.angle.y = actor->actor_class.shape_info.rotation.y; + if (mDemo_Check(mDemo_TYPE_TALK, (ACTOR*)actor)) { + s16 angle = add_calc_short_angle2(&actor->actor_class.shape_info.rotation.y, actor->actor_class.player_angle_y, + 1.0f, 5000, 100); + actor->actor_class.world.angle.y = actor->actor_class.shape_info.rotation.y; - if (mDemo_Check_ListenAble() == FALSE && mDemo_Check_DiffAngle_forTalk(angle)) { - mDemo_Set_ListenAble(); + if (mDemo_Check_ListenAble() == FALSE && mDemo_Check_DiffAngle_forTalk(angle)) { + mDemo_Set_ListenAble(); + } + } else { + actor->main_action = 0; } - } - else { - actor->main_action = 0; - } } typedef void (*Ac_Sample_Actor_PROC)(SAMPLE_ACTOR*, GAME_PLAY*); static void Ac_Sample_Actor_main(ACTOR* actor, GAME* game) { - static Ac_Sample_Actor_PROC proc[] = { &Ac_Sample_Actor_main_wait, &Ac_Sample_Actor_main_talk }; + static Ac_Sample_Actor_PROC proc[] = { &Ac_Sample_Actor_main_wait, &Ac_Sample_Actor_main_talk }; - SAMPLE_ACTOR* sample = (SAMPLE_ACTOR*)actor; - GAME_PLAY* play = (GAME_PLAY*)game; + SAMPLE_ACTOR* sample = (SAMPLE_ACTOR*)actor; + GAME_PLAY* play = (GAME_PLAY*)game; - if (sample->main_action < 0 || sample->main_action >= 2 || proc[sample->main_action] == NULL) { - return; - } + if (sample->main_action < 0 || sample->main_action >= 2 || proc[sample->main_action] == NULL) { + return; + } - (*proc[sample->main_action])(sample, play); + (*proc[sample->main_action])(sample, play); } extern cKF_Skeleton_R_c cKF_bs_r_hnw; extern cKF_Animation_R_c cKF_ba_r_hnw_move; static void Ac_Sample_Actor_ct(ACTOR* actor, GAME* game) { - cKF_SkeletonInfo_R_c* keyframe; - GAME_PLAY* play = (GAME_PLAY*)game; - SAMPLE_ACTOR* sample = (SAMPLE_ACTOR*)actor; - Object_Bank_c* bank; + cKF_SkeletonInfo_R_c* keyframe; + GAME_PLAY* play = (GAME_PLAY*)game; + SAMPLE_ACTOR* sample = (SAMPLE_ACTOR*)actor; + Object_Bank_c* bank; - keyframe = &sample->keyframe; - cKF_SkeletonInfo_R_ct(keyframe, &cKF_bs_r_hnw, &cKF_ba_r_hnw_move, sample->work_area, sample->morph_area); - cKF_SkeletonInfo_R_init_standard_stop(keyframe, &cKF_ba_r_hnw_move, NULL); - Ac_Sample_ct_forCorect(actor, game); + keyframe = &sample->keyframe; + cKF_SkeletonInfo_R_ct(keyframe, &cKF_bs_r_hnw, &cKF_ba_r_hnw_move, sample->work_area, sample->morph_area); + cKF_SkeletonInfo_R_init_standard_stop(keyframe, &cKF_ba_r_hnw_move, NULL); + Ac_Sample_ct_forCorect(actor, game); - sample->draw_action = 1; - bank = &play->object_exchange.banks[actor->data_bank_id]; - sample->obj_bank_ram_start = bank->ram_start; + sample->draw_action = 1; + bank = &play->object_exchange.banks[actor->data_bank_id]; + sample->obj_bank_ram_start = bank->ram_start; } extern u8 hnw_tmem_txt[]; extern u16 hnw_face[]; static void Ac_Sample_Actor_draw_normal(SAMPLE_ACTOR* actor, GAME_PLAY* play) { - cKF_SkeletonInfo_R_c* keyframe = &actor->keyframe; - Mtx* m = GRAPH_ALLOC_TYPE(play->game.graph, Mtx, keyframe->skeleton->num_shown_joints); + cKF_SkeletonInfo_R_c* keyframe = &actor->keyframe; + Mtx* m = GRAPH_ALLOC_TYPE(play->game.graph, Mtx, keyframe->skeleton->num_shown_joints); - if (m != NULL) { - GRAPH* g; - Gfx* gfx; - _texture_z_light_fog_prim(play->game.graph); + if (m != NULL) { + GRAPH* g; + Gfx* gfx; + _texture_z_light_fog_prim(play->game.graph); - g = play->game.graph; - OPEN_DISP(g); - gfx = NOW_POLY_OPA_DISP; + g = play->game.graph; + OPEN_DISP(g); + gfx = NOW_POLY_OPA_DISP; - gDPLoadTextureBlockS( - gfx++, - hnw_tmem_txt, G_IM_FMT_I, G_IM_SIZ_8b, - 64, 64, - 0, - G_TX_MIRROR | G_TX_WRAP, G_TX_MIRROR | G_TX_WRAP, - 7, 7, - G_TX_NOLOD, G_TX_NOLOD - ); - gDPLoadTLUT_pal16(gfx++, 15, hnw_face); // pal is different - gDPSetTextureLUT(gfx++, G_TT_RGBA16); + /* @BUG - rendering was never updated to GC format resulting in corrupted textures */ +#ifndef BUGFIXES + gDPLoadTextureBlockS(gfx++, hnw_tmem_txt, G_IM_FMT_I, G_IM_SIZ_8b, 64, 64, 0, G_TX_MIRROR | G_TX_WRAP, + G_TX_MIRROR | G_TX_WRAP, 7, 7, G_TX_NOLOD, G_TX_NOLOD); + gDPLoadTLUT_pal16(gfx++, 15, hnw_face); // pal is different + gDPSetTextureLUT(gfx++, G_TT_RGBA16); +#else + gSPSegment(gfx++, G_MWO_SEGMENT_B, hnw_tmem_txt); + gDPSetPrimColor(gfx++, 0, 128, 255, 255, 255, 255); + gDPLoadTLUT_Dolphin(gfx++, 15, 16, 1, hnw_face); +#endif - SET_POLY_OPA_DISP(gfx); - CLOSE_DISP(g); + SET_POLY_OPA_DISP(gfx); + CLOSE_DISP(g); - cKF_Si3_draw_R_SV((GAME*)play, keyframe, m, NULL, NULL, NULL); - } + cKF_Si3_draw_R_SV((GAME*)play, keyframe, m, NULL, NULL, NULL); + } } static void Ac_Sample_Actor_draw(ACTOR* actor, GAME* game) { - static Ac_Sample_Actor_PROC proc[] = { (Ac_Sample_Actor_PROC)&none_proc2, &Ac_Sample_Actor_draw_normal }; + static Ac_Sample_Actor_PROC proc[] = { (Ac_Sample_Actor_PROC)&none_proc2, &Ac_Sample_Actor_draw_normal }; - SAMPLE_ACTOR* sample = (SAMPLE_ACTOR*)actor; - GAME_PLAY* play = (GAME_PLAY*)game; + SAMPLE_ACTOR* sample = (SAMPLE_ACTOR*)actor; + GAME_PLAY* play = (GAME_PLAY*)game; - if (sample->draw_action < 0 || sample->draw_action >= 2 || proc[sample->draw_action] == NULL) { - return; - } + if (sample->draw_action < 0 || sample->draw_action >= 2 || proc[sample->draw_action] == NULL) { + return; + } - (*proc[sample->draw_action])(sample, play); + (*proc[sample->draw_action])(sample, play); } -ACTOR_PROFILE Sample_Profile = { - mAc_PROFILE_SAMPLE, - ACTOR_PART_BG, - 0, - MISC_ACTOR_SAMPLE, - ACTOR_OBJ_BANK_12, - sizeof(SAMPLE_ACTOR), - &Ac_Sample_Actor_ct, - &Ac_Sample_Actor_dt, - &Ac_Sample_Actor_main, - &Ac_Sample_Actor_draw, - NULL -}; +ACTOR_PROFILE Sample_Profile = { mAc_PROFILE_SAMPLE, + ACTOR_PART_BG, + 0, + MISC_ACTOR_SAMPLE, + ACTOR_OBJ_BANK_12, + sizeof(SAMPLE_ACTOR), + &Ac_Sample_Actor_ct, + &Ac_Sample_Actor_dt, + &Ac_Sample_Actor_main, + &Ac_Sample_Actor_draw, + NULL }; diff --git a/src/data/field/bg/acre/tmpr/tmpr.c b/src/data/field/bg/acre/tmpr/tmpr.c new file mode 100644 index 00000000..d0695ef7 --- /dev/null +++ b/src/data/field/bg/acre/tmpr/tmpr.c @@ -0,0 +1,144 @@ +#include "libforest/gbi_extensions.h" + +// clang-format off + +static Vtx tmpr_v[] = { }; // TODO: include asset + +extern u8 earth_tex_dummy[]; +extern u8 river_tex_dummy[]; +extern u8 grass_tex_dummy[]; +extern u8 water_1_tex_dummy[]; +extern u8 water_2_tex_dummy[]; +extern u8 bridge_2_tex_dummy[]; +extern u16 bridge_2_pal_dummy[]; + +Gfx tmpr_modelT[] = { + gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON), + gsDPPipeSync(), + gsDPSetCombineLERP(PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, 1, 0, TEXEL0, TEXEL1, COMBINED, 0, SHADE, TEXEL0, COMBINED, 0, PRIM_LOD_FRAC, PRIMITIVE), + gsDPSetPrimColor(0, 50, 255, 255, 255, 50), + gsDPSetEnvColor(0, 100, 255, 255), + gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_ZB_XLU_SURF2), + gsDPSetTextureLUT(G_TT_NONE), + gsDPLoadTextureBlock_4b(water_1_tex_dummy, G_IM_FMT_I, 32, 32, 15, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPLoadMultiBlock_4b(water_2_tex_dummy, 0x0040, 1, G_IM_FMT_I, 32, 32, 15, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD), + gsSPDisplayList(0x08000000), + gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), + gsSPVertex(&tmpr_v[152], 22, 0), + gsSP2Triangles(0, 1, 2, 0, 0, 3, 1, 0), + gsSP2Triangles(4, 0, 5, 0, 0, 2, 5, 0), + gsSP2Triangles(6, 4, 7, 0, 4, 5, 7, 0), + gsSP2Triangles(8, 9, 10, 0, 11, 8, 10, 0), + gsSP2Triangles(12, 11, 10, 0, 10, 9, 13, 0), + gsSP2Triangles(14, 12, 10, 0, 14, 10, 15, 0), + gsSP2Triangles(7, 14, 15, 0, 6, 7, 15, 0), + gsSP2Triangles(16, 6, 15, 0, 17, 16, 15, 0), + gsSP2Triangles(18, 17, 15, 0, 18, 15, 10, 0), + gsSP2Triangles(18, 10, 13, 0, 19, 18, 13, 0), + gsSP2Triangles(19, 13, 20, 0, 21, 19, 20, 0), + gsSPTexture(0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON), + gsDPPipeSync(), + gsDPSetRenderMode(G_RM_FOG_SHADE_A, G_RM_AA_ZB_TEX_EDGE2), + gsDPSetCombineLERP(TEXEL0, 0, SHADE, 0, 0, 0, 0, TEXEL0, PRIMITIVE, 0, COMBINED, 0, 0, 0, 0, COMBINED), + gsDPSetTextureLUT(G_TT_RGBA16), + gsDPLoadTLUT_pal16(15, 0x80FD90E0), + gsDPLoadTextureBlock_4b(bridge_2_tex_dummy, G_IM_FMT_CI, 128, 32, 15, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_WRAP, 7, 5, G_TX_NOLOD, G_TX_NOLOD), + gsDPSetPrimColor(0, 128, 255, 255, 255, 255), + gsSPVertex(&tmpr_v[174], 32, 0), + gsSP2Triangles(0, 1, 2, 0, 0, 2, 3, 0), + gsSP2Triangles(1, 4, 5, 0, 1, 5, 2, 0), + gsSP2Triangles(6, 7, 8, 0, 6, 8, 9, 0), + gsSP2Triangles(9, 8, 10, 0, 9, 10, 11, 0), + gsSP2Triangles(8, 12, 13, 0, 8, 13, 10, 0), + gsSP2Triangles(14, 15, 16, 0, 14, 16, 17, 0), + gsSP2Triangles(18, 14, 17, 0, 18, 17, 19, 0), + gsSP2Triangles(20, 21, 14, 0, 20, 14, 18, 0), + gsSP2Triangles(22, 23, 24, 0, 22, 24, 25, 0), + gsSP2Triangles(25, 24, 26, 0, 25, 26, 27, 0), + gsSP2Triangles(24, 28, 29, 0, 24, 29, 26, 0), + gsSPVertex(&tmpr_v[204], 8, 0), + gsSP2Triangles(0, 1, 2, 0, 0, 2, 3, 0), + gsSP2Triangles(4, 0, 3, 0, 4, 3, 5, 0), + gsSP2Triangles(6, 7, 0, 0, 6, 0, 4, 0), + gsSPEndDisplayList(), +}; + +Gfx tmpr_model[] = { + gsSPTexture(0xFFFF, 0xFFFF, 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), + gsDPLoadTLUT_pal16(15, 0x09000000), + gsDPLoadTextureBlock_4b(earth_tex_dummy, G_IM_FMT_CI, 64, 64, 15, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_CLAMP, 6, 6, G_TX_NOLOD, G_TX_NOLOD), + gsDPSetPrimColor(0, 128, 255, 255, 255, 255), + gsSPLoadGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BACK | G_FOG | G_LIGHTING | G_SHADING_SMOOTH), + gsSPVertex(&tmpr_v[0], 32, 0), + gsSP2Triangles(0, 1, 2, 0, 3, 0, 4, 0), + gsSP2Triangles(5, 3, 6, 0, 6, 7, 5, 0), + gsSP2Triangles(8, 9, 7, 0, 8, 10, 11, 0), + gsSP2Triangles(8, 11, 9, 0, 8, 12, 10, 0), + gsSP2Triangles(12, 13, 10, 0, 14, 13, 15, 0), + gsSP2Triangles(16, 14, 17, 0, 18, 16, 19, 0), + gsSP2Triangles(19, 20, 18, 0, 20, 21, 18, 0), + gsSP2Triangles(22, 21, 23, 0, 23, 24, 22, 0), + gsSP2Triangles(25, 22, 24, 0, 25, 26, 22, 0), + gsSP2Triangles(27, 26, 28, 0, 29, 30, 31, 0), + gsSPVertex(&tmpr_v[32], 9, 0), + gsSP2Triangles(0, 1, 2, 0, 3, 0, 4, 0), + gsSP2Triangles(5, 3, 6, 0, 7, 5, 8, 0), + gsDPPipeSync(), + gsDPLoadTLUT_pal16(15, 0x09000000), + gsDPLoadTextureBlock_4b(river_tex_dummy, G_IM_FMT_CI, 64, 32, 15, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_CLAMP, 6, 5, G_TX_NOLOD, G_TX_NOLOD), + gsSPVertex(&tmpr_v[41], 32, 0), + gsSP2Triangles(0, 1, 2, 0, 0, 3, 1, 0), + gsSP2Triangles(4, 5, 6, 0, 5, 7, 6, 0), + gsSP2Triangles(8, 9, 10, 0, 9, 11, 10, 0), + gsSP2Triangles(12, 13, 14, 0, 13, 15, 16, 0), + gsSP2Triangles(12, 15, 13, 0, 15, 17, 16, 0), + gsSP2Triangles(18, 19, 17, 0, 15, 18, 17, 0), + gsSP2Triangles(18, 20, 19, 0, 20, 21, 19, 0), + gsSP2Triangles(22, 23, 21, 0, 22, 24, 23, 0), + gsSP2Triangles(24, 25, 26, 0, 25, 27, 26, 0), + gsSP2Triangles(28, 29, 27, 0, 25, 28, 27, 0), + gsSP2Triangles(30, 31, 29, 0, 29, 28, 30, 0), + gsSPVertex(&tmpr_v[73], 27, 0), + gsSP2Triangles(0, 1, 2, 0, 3, 4, 1, 0), + gsSP2Triangles(1, 0, 3, 0, 5, 6, 4, 0), + gsSP2Triangles(3, 5, 4, 0, 6, 7, 8, 0), + gsSP2Triangles(7, 9, 8, 0, 10, 11, 9, 0), + gsSP2Triangles(10, 12, 11, 0, 13, 14, 15, 0), + gsSP2Triangles(16, 17, 18, 0, 17, 16, 19, 0), + gsSP2Triangles(16, 20, 19, 0, 21, 22, 23, 0), + gsSP2Triangles(24, 25, 22, 0, 22, 21, 24, 0), + gsSP1Triangle(26, 5, 3, 0), + gsDPPipeSync(), + gsDPLoadTLUT_pal16(15, 0x09000000), + gsDPLoadTextureBlock_4b(grass_tex_dummy, G_IM_FMT_CI, 32, 32, 15, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, 5, 5, G_TX_NOLOD, G_TX_NOLOD), + gsSPVertex(&tmpr_v[100], 32, 0), + gsSP2Triangles(0, 1, 2, 0, 1, 3, 2, 0), + gsSP2Triangles(4, 5, 3, 0, 5, 2, 3, 0), + gsSP2Triangles(0, 6, 1, 0, 7, 8, 9, 0), + gsSP2Triangles(7, 10, 8, 0, 10, 11, 8, 0), + gsSP2Triangles(10, 12, 11, 0, 13, 14, 9, 0), + gsSP2Triangles(12, 15, 13, 0, 12, 16, 15, 0), + gsSP2Triangles(16, 17, 15, 0, 16, 18, 17, 0), + gsSP2Triangles(16, 19, 18, 0, 19, 20, 21, 0), + gsSP2Triangles(19, 21, 18, 0, 19, 22, 20, 0), + gsSP2Triangles(19, 23, 22, 0, 23, 24, 25, 0), + gsSP2Triangles(23, 25, 22, 0, 26, 27, 28, 0), + gsSP2Triangles(27, 29, 28, 0, 29, 30, 28, 0), + gsSP1Triangle(27, 31, 29, 0), + gsSPVertex(&tmpr_v[132], 20, 0), + gsSP2Triangles(0, 1, 2, 0, 1, 3, 2, 0), + gsSP2Triangles(1, 4, 3, 0, 1, 5, 4, 0), + gsSP2Triangles(5, 6, 4, 0, 6, 7, 4, 0), + gsSP2Triangles(5, 8, 6, 0, 9, 10, 7, 0), + gsSP2Triangles(11, 12, 13, 0, 12, 14, 13, 0), + gsSP2Triangles(12, 15, 14, 0, 12, 16, 15, 0), + gsSP2Triangles(14, 17, 13, 0, 17, 18, 13, 0), + gsSP1Triangle(17, 19, 18, 0), + gsSPEndDisplayList(), +}; + +// clang-format on