diff --git a/src/game/propobj.c b/src/game/propobj.c index 9f579e71f..00e768fb4 100644 --- a/src/game/propobj.c +++ b/src/game/propobj.c @@ -16082,7 +16082,7 @@ glabel func0f07079c ); GLOBAL_ASM( -glabel func0f07092c +glabel glassCalculateOpacity /* f07092c: 27bdffe8 */ addiu $sp,$sp,-24 /* f070930: 3c02800a */ lui $v0,%hi(g_Vars+0x284) /* f070934: 8c42a244 */ lw $v0,%lo(g_Vars+0x284)($v0) @@ -33022,7 +33022,7 @@ void doorUpdatePortalIfWindowed(struct prop *doorprop, s32 playercount) union modelrwdata *rwdata; if (doorobj->doorflags & DOORFLAG_WINDOWED) { - doorobj->fadealpha = func0f07092c(&doorprop->pos, doorobj->xludist, doorobj->opadist, 0); + doorobj->fadealpha = glassCalculateOpacity(&doorprop->pos, doorobj->xludist, doorobj->opadist, 0); if (doorobj->fadealpha != 255 || doorobj->frac > 0) { canhide = false; @@ -46977,64 +46977,26 @@ void dropshipUpdateInterior(struct prop *prop) } } -GLOBAL_ASM( -glabel func0f07e0b8 -/* f07e0b8: 27bdffe0 */ addiu $sp,$sp,-32 -/* f07e0bc: 3c0f8007 */ lui $t7,%hi(g_TintedGlassEnabled) -/* f07e0c0: 8def98d0 */ lw $t7,%lo(g_TintedGlassEnabled)($t7) -/* f07e0c4: afbf0014 */ sw $ra,0x14($sp) -/* f07e0c8: afa40020 */ sw $a0,0x20($sp) -/* f07e0cc: afa50024 */ sw $a1,0x24($sp) -/* f07e0d0: afa60028 */ sw $a2,0x28($sp) -/* f07e0d4: 11e00004 */ beqz $t7,.L0f07e0e8 -/* f07e0d8: 8c830004 */ lw $v1,0x4($a0) -/* f07e0dc: 241800ff */ addiu $t8,$zero,0xff -/* f07e0e0: 10000011 */ b .L0f07e128 -/* f07e0e4: a4780060 */ sh $t8,0x60($v1) -.L0f07e0e8: -/* f07e0e8: 8479005c */ lh $t9,0x5c($v1) -/* f07e0ec: 8468005e */ lh $t0,0x5e($v1) -/* f07e0f0: 8fa40020 */ lw $a0,0x20($sp) -/* f07e0f4: 44992000 */ mtc1 $t9,$f4 -/* f07e0f8: 44883000 */ mtc1 $t0,$f6 -/* f07e0fc: 8c670064 */ lw $a3,0x64($v1) -/* f07e100: 46802120 */ cvt.s.w $f4,$f4 -/* f07e104: afa3001c */ sw $v1,0x1c($sp) -/* f07e108: 24840008 */ addiu $a0,$a0,0x8 -/* f07e10c: 468031a0 */ cvt.s.w $f6,$f6 -/* f07e110: 44052000 */ mfc1 $a1,$f4 -/* f07e114: 44063000 */ mfc1 $a2,$f6 -/* f07e118: 0fc1c24b */ jal func0f07092c -/* f07e11c: 00000000 */ nop -/* f07e120: 8fa3001c */ lw $v1,0x1c($sp) -/* f07e124: a4620060 */ sh $v0,0x60($v1) -.L0f07e128: -/* f07e128: 84640062 */ lh $a0,0x62($v1) -/* f07e12c: 8fa90024 */ lw $t1,0x24($sp) -/* f07e130: 24010001 */ addiu $at,$zero,0x1 -/* f07e134: 0482000e */ bltzl $a0,.L0f07e170 -/* f07e138: 8fab0028 */ lw $t3,0x28($sp) -/* f07e13c: 5521000c */ bnel $t1,$at,.L0f07e170 -/* f07e140: 8fab0028 */ lw $t3,0x28($sp) -/* f07e144: 846a0060 */ lh $t2,0x60($v1) -/* f07e148: 240100ff */ addiu $at,$zero,0xff -/* f07e14c: 15410005 */ bne $t2,$at,.L0f07e164 -/* f07e150: 00000000 */ nop -/* f07e154: 0fc59392 */ jal portalSetEnabled -/* f07e158: 00002825 */ or $a1,$zero,$zero -/* f07e15c: 10000004 */ b .L0f07e170 -/* f07e160: 8fab0028 */ lw $t3,0x28($sp) -.L0f07e164: -/* f07e164: 0fc59392 */ jal portalSetEnabled -/* f07e168: 24050001 */ addiu $a1,$zero,0x1 -/* f07e16c: 8fab0028 */ lw $t3,0x28($sp) -.L0f07e170: -/* f07e170: ad600000 */ sw $zero,0x0($t3) -/* f07e174: 8fbf0014 */ lw $ra,0x14($sp) -/* f07e178: 27bd0020 */ addiu $sp,$sp,0x20 -/* f07e17c: 03e00008 */ jr $ra -/* f07e180: 00000000 */ nop -); +void glassUpdatePortal(struct prop *prop, s32 playercount, bool *arg2) +{ + struct tintedglassobj *glass = (struct tintedglassobj *) prop->obj; + + if (g_TintedGlassEnabled) { + glass->opacity = 255; + } else { + glass->opacity = glassCalculateOpacity(&prop->pos, glass->xludist, glass->opadist, glass->unk64); + } + + if (glass->portalnum >= 0 && playercount == 1) { + if (glass->opacity == 255) { + portalSetEnabled(glass->portalnum, false); + } else { + portalSetEnabled(glass->portalnum, true); + } + } + + *arg2 = false; +} GLOBAL_ASM( glabel func0f07e184 @@ -47659,7 +47621,7 @@ s32 objTick(struct prop *prop) } if (obj->type == OBJTYPE_TINTEDGLASS) { - func0f07e0b8(prop, playercount, &sp564); + glassUpdatePortal(prop, playercount, &sp564); } else if (obj->type == OBJTYPE_DOOR) { doorUpdatePortalIfWindowed(prop, playercount); } diff --git a/src/include/game/propobj.h b/src/include/game/propobj.h index 4515134fa..17d9cd834 100644 --- a/src/include/game/propobj.h +++ b/src/include/game/propobj.h @@ -135,7 +135,7 @@ void func0f07063c(struct prop *prop, bool arg1); void func0f070698(struct prop *prop, bool arg1); void func0f0706f8(struct prop *prop, bool arg1); void func0f07079c(struct prop *prop, bool arg1); -s32 func0f07092c(struct coord *pos, f32 arg1, f32 arg2, f32 arg3); +s32 glassCalculateOpacity(struct coord *pos, f32 arg1, f32 arg2, f32 arg3); u32 func0f070a1c(void); u32 func0f070bd0(void); u32 func0f070ca0(void); @@ -196,7 +196,7 @@ void hovercarTick(struct prop *hovercar); void hoverpropTick(struct prop *hoverprop, bool arg1); void hoverbikeTick(struct prop *hoverbike, bool arg1); void dropshipUpdateInterior(struct prop *prop); -void func0f07e0b8(struct prop *glass, s32 playercount, bool *arg2); +void glassUpdatePortal(struct prop *glass, s32 playercount, bool *arg2); u32 func0f07e184(void); u32 func0f07e1fc(void); void func0f07e2cc(struct prop *prop); diff --git a/src/include/types.h b/src/include/types.h index 6b08d5385..28ffa55c7 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -1953,8 +1953,9 @@ struct camera2obj { // objtype 0x2e struct tintedglassobj { // objtype 0x2f struct defaultobj base; - /*0x5c*/ u32 unk5c; - /*0x60*/ s16 unk60; + /*0x5c*/ s16 xludist; + /*0x5e*/ s16 opadist; + /*0x60*/ s16 opacity; /*0x62*/ s16 portalnum; /*0x64*/ f32 unk64; };