sm64coopdx/actors/luigi/geo.inc.c
FluffaLuigi 2a52b4af4e
Update Mario, Luigi and Wario's Models (#434)
Updated Luigi and Wario's models to their latest revision.
Mario, Luigi and Wario's sideburns now match the color of the rest of their hair with the player's palette.
Mario and Luigi's Logos were made into IA16 textures and are now shaded to look a bit better with the rest of the cap.
Cap inside was made a darker variant of the regular cap color across both the held and item caps.
Fixed an oversight with the cap wings, though mostly so that they're more consistent.
Removed Mario's unused model data since none of it is ever getting used as far as I'm aware.
2023-07-04 16:23:34 -07:00

702 lines
31 KiB
C

// Normal Mario Geo
const GeoLayout luigi_geo_face_and_wings[] = {
GEO_ASM(0, geo_mario_head_rotation),
GEO_ROTATION_NODE(0x00, 0, 0, 0),
GEO_OPEN_NODE(),
GEO_SWITCH_CASE(0, geo_switch_mario_cap_on_off),
GEO_OPEN_NODE(),
GEO_NODE_START(),
GEO_OPEN_NODE(),
GEO_ASM(2, geo_mirror_mario_backface_culling),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_hair_sideburn_decal_cap_on_dl),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_l_logo_decal_dl),
GEO_ASM(3, geo_mirror_mario_backface_culling),
GEO_OPEN_NODE(),
GEO_SWITCH_CASE(0, geo_switch_mario_eyes),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_cap_on_eyes_front),
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_cap_on_eyes_half_closed),
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_cap_on_eyes_closed),
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_cap_on_eyes_right), // unused
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_cap_on_eyes_left), // unused
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_cap_on_eyes_up), // unused
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_cap_on_eyes_down), // unused
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_cap_on_eyes_dead),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_NODE_START(),
GEO_OPEN_NODE(),
GEO_ASM(2, geo_mirror_mario_backface_culling),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_hair_sideburn_decal_cap_off_dl),
GEO_ASM(3, geo_mirror_mario_backface_culling),
GEO_OPEN_NODE(),
GEO_SWITCH_CASE(0, geo_switch_mario_eyes),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_cap_off_eyes_front),
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_cap_off_eyes_half_closed),
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_cap_off_eyes_closed),
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_cap_off_eyes_right), // unused
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_cap_off_eyes_left), // unused
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_cap_off_eyes_up), // unused
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_cap_off_eyes_down), // unused
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_cap_off_eyes_dead),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_TRANSLATE_ROTATE(0, 140, -45, -110, 22, -40, -135),
GEO_OPEN_NODE(),
GEO_ASM(0, geo_mario_rotate_wing_cap_wings),
GEO_ROTATION_NODE(0x00, 0, 0, 0),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_ALPHA, luigi_cap_wings), // left
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_TRANSLATE_ROTATE(0, 140, -45, 110, -22, 40, -135),
GEO_OPEN_NODE(),
GEO_ASM(1, geo_mario_rotate_wing_cap_wings),
GEO_ROTATION_NODE(0x00, 0, 0, 0),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_ALPHA, luigi_cap_wings), // right
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
const GeoLayout luigi_geo_left_hand[] = {
GEO_SWITCH_CASE(1, geo_switch_mario_hand),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 65, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ASM(1, geo_mario_hand_foot_scaler),
GEO_SCALE(0x00, 65536),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_left_hand_closed),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 65, 0, 0, luigi_left_hand_open),
GEO_ANIMATED_PART(LAYER_OPAQUE, 65, 0, 0, luigi_left_hand_closed),
GEO_ANIMATED_PART(LAYER_OPAQUE, 65, 0, 0, luigi_left_hand_closed),
GEO_ANIMATED_PART(LAYER_OPAQUE, 65, 0, 0, luigi_left_hand_closed),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
const GeoLayout luigi_geo_right_hand[] = {
GEO_SWITCH_CASE(0, geo_switch_mario_hand),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 65, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ASM(0, geo_mario_hand_foot_scaler),
GEO_SCALE(0x00, 65536),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_right_hand_closed),
GEO_CLOSE_NODE(),
GEO_HELD_OBJECT(0x00, 0, 0, 0, geo_switch_mario_hand_grab_pos),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 65, 0, 0, luigi_right_hand_open),
GEO_OPEN_NODE(),
GEO_HELD_OBJECT(0x00, 0, 0, 0, geo_switch_mario_hand_grab_pos),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 65, 0, 0, luigi_right_hand_peace), // here we go hand
GEO_ANIMATED_PART(LAYER_OPAQUE, 60, 0, 0, luigi_right_hand_cap),
GEO_OPEN_NODE(),
GEO_ASM(2, geo_mirror_mario_backface_culling),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_right_hand_cap_decal_dl),
GEO_ASM(3, geo_mirror_mario_backface_culling),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 60, 0, 0, luigi_right_hand_cap),
GEO_OPEN_NODE(),
GEO_ASM(2, geo_mirror_mario_backface_culling),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_right_hand_cap_decal_dl),
GEO_ASM(3, geo_mirror_mario_backface_culling),
GEO_DISPLAY_LIST(LAYER_ALPHA, luigi_right_hand_cap_wings),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
// The body loads all the parts with some shared dls to apply the solid color of the dl that has it, the same rule applies to the medium and low poly geos
const GeoLayout luigi_geo_body[] = {
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 22, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, luigi_butt), // starts sharing solid color with mario_torso (blue)
GEO_OPEN_NODE(),
GEO_ASM(0, geo_move_mario_part_from_parent),
GEO_ASM(0, geo_mario_tilt_torso),
GEO_ROTATION_NODE(0x00, 0, 0, 0),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 80, 0, 0, luigi_torso),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 91, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_BRANCH(1, luigi_geo_face_and_wings), // stops sharing because faces has its own dl
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 60, -10, 69, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, luigi_left_arm), // starts sharing solid color with mario_left_forearm (red)
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 70, 0, 0, luigi_left_forearm_shared_dl),
GEO_OPEN_NODE(),
GEO_BRANCH(1, luigi_geo_left_hand), // stops sharing because hand has its solid color (white)
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 61, -10, -69, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, luigi_right_arm), // starts sharing solid color of his dl with mario_right_forearm (red)
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 70, 0, 0, luigi_right_forearm_shared_dl),
GEO_OPEN_NODE(),
GEO_BRANCH(1, luigi_geo_right_hand), // stops sharing because hand has its solid color (white)
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 13, -8, 39, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, luigi_left_thigh), // starts sharing solid color of his dl with mario_left_leg (blue)
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 98, 0, 0, luigi_left_leg_shared_dl),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 78, 0, 0, luigi_left_foot), // stops sharing because foot has its solid color (brown)
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 13, -8, -39, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, luigi_right_thigh), // starts sharing solid color of his dl with mario_left_leg (blue)
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 98, 0, 0, luigi_right_leg_shared_dl),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 78, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ASM(2, geo_mario_hand_foot_scaler),
GEO_SCALE(0x00, 65536),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_right_foot), // stops sharing because foot has its solid color (brown)
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
// Vanish Mario Geo
const GeoLayout luigi_vanish_geo_face_and_wings[] = {
GEO_ASM(0, geo_mario_head_rotation),
GEO_ROTATION_NODE(0x00, 0, 0, 0),
GEO_OPEN_NODE(),
GEO_SWITCH_CASE(0, geo_switch_mario_cap_on_off),
GEO_OPEN_NODE(),
GEO_NODE_START(),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_hair_sideburn_decal_cap_on_dl),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_l_logo_decal_dl),
GEO_OPEN_NODE(),
GEO_SWITCH_CASE(0, geo_switch_mario_eyes),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_cap_on_eyes_front),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_cap_on_eyes_half_closed),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_cap_on_eyes_closed),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_cap_on_eyes_right), // unused
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_cap_on_eyes_left), // unused
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_cap_on_eyes_up), // unused
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_cap_on_eyes_down), // unused
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_cap_on_eyes_dead),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_NODE_START(),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_hair_sideburn_decal_cap_off_dl),
GEO_OPEN_NODE(),
GEO_SWITCH_CASE(0, geo_switch_mario_eyes),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_cap_off_eyes_front),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_cap_off_eyes_half_closed),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_cap_off_eyes_closed),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_cap_off_eyes_right), // unused
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_cap_off_eyes_left), // unused
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_cap_off_eyes_up), // unused
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_cap_off_eyes_down), // unused
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_cap_off_eyes_dead),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_TRANSLATE_ROTATE(0, 140, -45, -110, 22, -40, -135),
GEO_OPEN_NODE(),
GEO_ASM(0, geo_mario_rotate_wing_cap_wings),
GEO_ROTATION_NODE(0x00, 0, 0, 0),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_cap_wings_transparent),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_TRANSLATE_ROTATE(0, 140, -45, 110, -22, 40, -135),
GEO_OPEN_NODE(),
GEO_ASM(1, geo_mario_rotate_wing_cap_wings),
GEO_ROTATION_NODE(0x00, 0, 0, 0),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_cap_wings_transparent),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
const GeoLayout luigi_vanish_geo_left_hand[] = {
GEO_SWITCH_CASE(1, geo_switch_mario_hand),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 65, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ASM(1, geo_mario_hand_foot_scaler),
GEO_SCALE(0x00, 65536),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_left_hand_closed),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 65, 0, 0, luigi_left_hand_open),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 65, 0, 0, luigi_left_hand_closed),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 65, 0, 0, luigi_left_hand_closed),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 65, 0, 0, luigi_left_hand_closed),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
const GeoLayout luigi_vanish_geo_right_hand[] = {
GEO_SWITCH_CASE(0, geo_switch_mario_hand),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 65, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ASM(0, geo_mario_hand_foot_scaler),
GEO_SCALE(0x00, 65536),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_right_hand_closed),
GEO_CLOSE_NODE(),
GEO_HELD_OBJECT(0x00, 0, 0, 0, geo_switch_mario_hand_grab_pos),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 65, 0, 0, luigi_right_hand_open),
GEO_OPEN_NODE(),
GEO_HELD_OBJECT(0x00, 0, 0, 0, geo_switch_mario_hand_grab_pos),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 65, 0, 0, luigi_right_hand_peace), // here we go hand
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 60, 0, 0, luigi_right_hand_cap),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_right_hand_cap_decal_dl),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 60, 0, 0, luigi_right_hand_cap),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_right_hand_cap_decal_dl),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_right_hand_cap_wings_transparent),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
// Same rule body as Normal Mario
const GeoLayout luigi_vanish_geo_body[] = {
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 0, 22, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 0, 0, 0, luigi_butt),
GEO_OPEN_NODE(),
GEO_ASM(0, geo_move_mario_part_from_parent),
GEO_ASM(0, geo_mario_tilt_torso),
GEO_ROTATION_NODE(0x00, 0, 0, 0),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 80, 0, 0, luigi_torso),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 91, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_BRANCH(1, luigi_vanish_geo_face_and_wings),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 60, -10, 69, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 0, 0, 0, luigi_left_arm),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 70, 0, 0, luigi_left_forearm_shared_dl),
GEO_OPEN_NODE(),
GEO_BRANCH(1, luigi_vanish_geo_left_hand),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 61, -10, -69, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 0, 0, 0, luigi_right_arm),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 70, 0, 0, luigi_right_forearm_shared_dl),
GEO_OPEN_NODE(),
GEO_BRANCH(1, luigi_vanish_geo_right_hand),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 13, -8, 39, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 0, 0, 0, luigi_left_thigh),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 98, 0, 0, luigi_left_leg_shared_dl),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 78, 0, 0, luigi_left_foot),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 13, -8, -39, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 0, 0, 0, luigi_right_thigh),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 98, 0, 0, luigi_right_leg_shared_dl),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 78, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ASM(2, geo_mario_hand_foot_scaler),
GEO_SCALE(0x00, 65536),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_right_foot),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
// Metal Mario Geo
const GeoLayout luigi_metal_geo_face_and_wings[] = {
GEO_ASM(0, geo_mario_head_rotation),
GEO_ROTATION_NODE(0x00, 0, 0, 0),
GEO_OPEN_NODE(),
GEO_SWITCH_CASE(0, geo_switch_mario_cap_on_off),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_metal_cap_on_shared_dl),
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_metal_cap_off_shared_dl),
GEO_CLOSE_NODE(),
GEO_TRANSLATE_ROTATE(0, 140, -45, -110, 22, -40, -135),
GEO_OPEN_NODE(),
GEO_ASM(0, geo_mario_rotate_wing_cap_wings),
GEO_ROTATION_NODE(0x00, 0, 0, 0),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_ALPHA, luigi_metal_cap_wings), // left
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_TRANSLATE_ROTATE(0, 140, -45, 110, -22, 40, -135),
GEO_OPEN_NODE(),
GEO_ASM(1, geo_mario_rotate_wing_cap_wings),
GEO_ROTATION_NODE(0x00, 0, 0, 0),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_ALPHA, luigi_metal_cap_wings), // right
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
const GeoLayout luigi_metal_geo_left_hand[] = {
GEO_SWITCH_CASE(1, geo_switch_mario_hand),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 65, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ASM(1, geo_mario_hand_foot_scaler),
GEO_SCALE(0x00, 65536),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_left_hand_closed_shared_dl),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 65, 0, 0, luigi_left_hand_open_shared_dl),
GEO_ANIMATED_PART(LAYER_OPAQUE, 65, 0, 0, luigi_left_hand_closed_shared_dl),
GEO_ANIMATED_PART(LAYER_OPAQUE, 65, 0, 0, luigi_left_hand_closed_shared_dl),
GEO_ANIMATED_PART(LAYER_OPAQUE, 65, 0, 0, luigi_left_hand_closed_shared_dl),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
const GeoLayout luigi_metal_geo_right_hand[] = {
GEO_SWITCH_CASE(0, geo_switch_mario_hand),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 65, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ASM(0, geo_mario_hand_foot_scaler),
GEO_SCALE(0x00, 65536),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_metal_right_hand_closed),
GEO_CLOSE_NODE(),
GEO_HELD_OBJECT(0x00, 0, 0, 0, geo_switch_mario_hand_grab_pos),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 65, 0, 0, luigi_metal_right_hand_open),
GEO_OPEN_NODE(),
GEO_HELD_OBJECT(0x00, 0, 0, 0, geo_switch_mario_hand_grab_pos),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 65, 0, 0, luigi_right_hand_peace_shared_dl), // here we go hand
GEO_ANIMATED_PART(LAYER_OPAQUE, 65, 0, 0, luigi_metal_right_hand_cap_shared_dl),
GEO_ANIMATED_PART(LAYER_OPAQUE, 65, 0, 0, luigi_metal_right_hand_cap_shared_dl),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_ALPHA, luigi_metal_right_hand_cap_shared_dl_wings),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
// A difference from Normal Mario is that the dls after the butt and left thigh shares the metal texture of it, same rule applies to the medium and low poly geos
const GeoLayout luigi_metal_geo_body[] = {
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 22, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, luigi_metal_butt), // starts sharing metal texture with the dls below
GEO_OPEN_NODE(),
GEO_ASM(0, geo_move_mario_part_from_parent),
GEO_ASM(0, geo_mario_tilt_torso),
GEO_ROTATION_NODE(0x00, 0, 0, 0),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 80, 0, 0, luigi_metal_torso_shared_dl),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 91, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_BRANCH(1, luigi_metal_geo_face_and_wings), // unlike normal mario geo, these dls still share the metal texture
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 60, -10, 69, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, luigi_left_arm_shared_dl),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 70, 0, 0, luigi_left_forearm_shared_dl),
GEO_OPEN_NODE(),
GEO_BRANCH(1, luigi_metal_geo_left_hand),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 61, -10, -69, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, luigi_right_arm_shared_dl),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 70, 0, 0, luigi_right_forearm_shared_dl),
GEO_OPEN_NODE(),
GEO_BRANCH(1, luigi_metal_geo_right_hand), // stop sharing because the wing metal cap of it
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 13, -8, 39, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, luigi_metal_left_thigh), // starts sharing metal texture with the dls below
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 98, 0, 0, luigi_left_leg_shared_dl),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 78, 0, 0, luigi_left_foot_shared_dl),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 13, -8, -39, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 0, 0, 0, luigi_right_thigh_shared_dl),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 98, 0, 0, luigi_right_leg_shared_dl),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_OPAQUE, 78, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ASM(2, geo_mario_hand_foot_scaler),
GEO_SCALE(0x00, 65536),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_OPAQUE, luigi_metal_right_foot),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
// Metal Vanish Mario Geo
const GeoLayout luigi_metal_vanish_geo_face_and_wings[] = {
GEO_ASM(0, geo_mario_head_rotation),
GEO_ROTATION_NODE(0x00, 0, 0, 0),
GEO_OPEN_NODE(),
GEO_SWITCH_CASE(0, geo_switch_mario_cap_on_off),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_metal_cap_on_shared_dl),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_metal_cap_off_shared_dl),
GEO_CLOSE_NODE(),
GEO_TRANSLATE_ROTATE(0, 140, -45, -110, 22, -40, -135),
GEO_OPEN_NODE(),
GEO_ASM(0, geo_mario_rotate_wing_cap_wings),
GEO_ROTATION_NODE(0x00, 0, 0, 0),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_metal_cap_wings_transparent),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_TRANSLATE_ROTATE(0, 140, -45, 110, -22, 40, -135),
GEO_OPEN_NODE(),
GEO_ASM(1, geo_mario_rotate_wing_cap_wings),
GEO_ROTATION_NODE(0x00, 0, 0, 0),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_metal_cap_wings_transparent),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
const GeoLayout luigi_metal_vanish_geo_left_hand[] = {
GEO_SWITCH_CASE(0, geo_switch_mario_hand),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 65, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ASM(1, geo_mario_hand_foot_scaler),
GEO_SCALE(0x00, 65536),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_left_hand_closed_shared_dl),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 65, 0, 0, luigi_left_hand_open_shared_dl),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 65, 0, 0, luigi_left_hand_closed_shared_dl),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 65, 0, 0, luigi_left_hand_closed_shared_dl),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 65, 0, 0, luigi_left_hand_closed_shared_dl),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
const GeoLayout luigi_metal_vanish_geo_right_hand[] = {
GEO_SWITCH_CASE(0, geo_switch_mario_hand),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 65, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ASM(0, geo_mario_hand_foot_scaler),
GEO_SCALE(0x00, 65536),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_metal_right_hand_closed),
GEO_CLOSE_NODE(),
GEO_HELD_OBJECT(0x00, 0, 0, 0, geo_switch_mario_hand_grab_pos),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 65, 0, 0, luigi_metal_right_hand_open),
GEO_OPEN_NODE(),
GEO_HELD_OBJECT(0x00, 0, 0, 0, geo_switch_mario_hand_grab_pos),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 65, 0, 0, luigi_right_hand_peace_shared_dl), // here we go hand
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 65, 0, 0, luigi_metal_right_hand_cap_shared_dl),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 65, 0, 0, luigi_metal_right_hand_cap_shared_dl),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_ALPHA, luigi_metal_right_hand_cap_shared_dl_wings_transparent),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
// Same rules as Metal Mario
const GeoLayout luigi_metal_vanish_geo_body[] = {
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 0, 22, 0, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 0, 0, 0, luigi_metal_butt),
GEO_OPEN_NODE(),
GEO_ASM(0, geo_move_mario_part_from_parent),
GEO_ASM(0, geo_mario_tilt_torso),
GEO_ROTATION_NODE(0x00, 0, 0, 0),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 80, 0, 0, luigi_metal_torso_shared_dl),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 91, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_BRANCH(1, luigi_metal_vanish_geo_face_and_wings),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 60, -10, 69, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 0, 0, 0, luigi_left_arm_shared_dl),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 70, 0, 0, luigi_left_forearm_shared_dl),
GEO_OPEN_NODE(),
GEO_BRANCH(1, luigi_metal_vanish_geo_left_hand),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 61, -10, -69, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 0, 0, 0, luigi_right_arm_shared_dl),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 70, 0, 0, luigi_right_forearm_shared_dl),
GEO_OPEN_NODE(),
GEO_BRANCH(1, luigi_metal_vanish_geo_right_hand),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 13, -8, 39, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 0, 0, 0, luigi_metal_left_thigh),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 98, 0, 0, luigi_left_leg_shared_dl),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 78, 0, 0, luigi_left_foot_shared_dl),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 13, -8, -39, NULL),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 0, 0, 0, luigi_right_thigh_shared_dl),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 98, 0, 0, luigi_right_leg_shared_dl),
GEO_OPEN_NODE(),
GEO_ANIMATED_PART(LAYER_TRANSPARENT, 78, 0, 0, NULL),
GEO_OPEN_NODE(),
GEO_ASM(2, geo_mario_hand_foot_scaler),
GEO_SCALE(0x00, 65536),
GEO_OPEN_NODE(),
GEO_DISPLAY_LIST(LAYER_TRANSPARENT, luigi_metal_right_foot),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
// High Poly
const GeoLayout luigi_geo_load_body[] = {
GEO_SWITCH_CASE(0, geo_switch_mario_cap_effect),
GEO_OPEN_NODE(),
GEO_BRANCH(1, luigi_geo_body),
GEO_BRANCH(1, luigi_vanish_geo_body),
GEO_BRANCH(1, luigi_metal_geo_body),
GEO_BRANCH(1, luigi_metal_vanish_geo_body),
GEO_CLOSE_NODE(),
GEO_RETURN(),
};
// This last geo is used to load all of Mario Geo in the Level Scripts
const GeoLayout luigi_geo[] = {
GEO_SHADOW(SHADOW_CIRCLE_PLAYER, 0xB4, 100),
GEO_OPEN_NODE(),
GEO_SCALE(0x00, 16384),
GEO_OPEN_NODE(),
GEO_ASM(0, geo_mario_set_player_colors),
GEO_ASM(LAYER_TRANSPARENT + 3, geo_mario_set_player_colors),
GEO_ASM(0, geo_mirror_mario_backface_culling),
GEO_ASM(0, geo_mirror_mario_set_alpha),
GEO_OPEN_NODE(),
GEO_BRANCH(1, luigi_geo_load_body),
GEO_CLOSE_NODE(),
GEO_ASM(1, geo_mirror_mario_backface_culling),
GEO_CLOSE_NODE(),
GEO_CLOSE_NODE(),
GEO_END(),
};