From af3b538ed92d9e87c86fdede957a1639189dec05 Mon Sep 17 00:00:00 2001
From: Lilaa3 <87947656+Lilaa3@users.noreply.github.com>
Date: Mon, 25 Sep 2023 14:26:31 +0100
Subject: [PATCH] Remove sharp transitions (#702)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Cannon render mode fix
Slipped past me.
* Removed sharp transitions
I like the idea but it really isn“t vanilla and causes issues.
Might be worth revisiting but for now lets just get rid of it.
* fixes
Missing render mode set for transitions, reduced display list alloc for cannon
tested more this time
---
bin/segment2.c | 20 ------------------
include/config/config_graphics.h | 5 -----
src/game/screen_transition.c | 17 +++------------
.../segment2/transition_bowser_half.i8.png | Bin 2876 -> 0 bytes
.../segment2/transition_circle_half.i8.png | Bin 1680 -> 0 bytes
textures/segment2/transition_mario.i8.png | Bin 3036 -> 0 bytes
textures/segment2/transition_star_half.i8.png | Bin 1607 -> 0 bytes
7 files changed, 3 insertions(+), 39 deletions(-)
delete mode 100644 textures/segment2/transition_bowser_half.i8.png
delete mode 100644 textures/segment2/transition_circle_half.i8.png
delete mode 100644 textures/segment2/transition_mario.i8.png
delete mode 100644 textures/segment2/transition_star_half.i8.png
diff --git a/bin/segment2.c b/bin/segment2.c
index aef1135d..71339cb3 100644
--- a/bin/segment2.c
+++ b/bin/segment2.c
@@ -2673,25 +2673,6 @@ UNUSED ALIGNED8 static const Texture texture_radial_light[] = {
#include "textures/segment2/light_quarter_circle.ia16.inc.c"
};
-#ifdef SHARP_TRANSITION_TEXTURES
-const Texture texture_transition_star_half[] = {
-#include "textures/segment2/transition_star_half.i8.inc.c"
-};
-
-const Texture texture_transition_circle_half[] = {
-#include "textures/segment2/transition_circle_half.i8.inc.c"
-};
-
-const Texture texture_transition_mario[] = {
-#include "textures/segment2/transition_mario.i8.inc.c"
-};
-
-const Texture texture_transition_bowser_half[] = {
-#include "textures/segment2/transition_bowser_half.i8.inc.c"
-};
-
-#else
-
const Texture texture_transition_star_half[] = {
#include "textures/segment2/segment2.0F458.ia8.inc.c"
};
@@ -2707,7 +2688,6 @@ const Texture texture_transition_mario[] = {
const Texture texture_transition_bowser_half[] = {
#include "textures/segment2/segment2.11458.ia8.inc.c"
};
-#endif
const Texture texture_waterbox_water[] = {
#include "textures/segment2/segment2.11C58.rgba16.inc.c"
diff --git a/include/config/config_graphics.h b/include/config/config_graphics.h
index b248c8a2..6e8c68c1 100644
--- a/include/config/config_graphics.h
+++ b/include/config/config_graphics.h
@@ -145,11 +145,6 @@
*/
#define EASE_IN_OUT_TRANSITIONS
-/**
- * Makes use of the tex edge render mode to deliver smooth transition textures
- */
-// #define SHARP_TRANSITION_TEXTURES
-
/**
* Uses frustratio of 2 instead of 1.
* Can improve performance in some circumstances, though it can also cause large tris to warp if cut off from the camera.
diff --git a/src/game/screen_transition.c b/src/game/screen_transition.c
index 03ccaf74..2376b1f7 100644
--- a/src/game/screen_transition.c
+++ b/src/game/screen_transition.c
@@ -13,12 +13,6 @@
#include "segment2.h"
#include "sm64.h"
-#ifdef SHARP_TRANSITION_TEXTURES
-#define TRANSITION_TEXTURE_TYPE G_IM_FMT_I
-#else
-#define TRANSITION_TEXTURE_TYPE G_IM_FMT_IA
-#endif
-
u8 sTransitionFadeTimer = 0;
u16 sTransitionTextureAngle = 0;
@@ -164,21 +158,16 @@ s32 render_textured_transition(s8 transTime, struct WarpTransitionData *transDat
gDPSetCombineLERP(gDisplayListHead++, 0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0,
0, 0, 0, PRIMITIVE, 0, 0, 0, TEXEL0);
-#ifdef SHARP_TRANSITION_TEXTURES
- gDPSetRenderMode(gDisplayListHead++, G_RM_AA_TEX_EDGE, G_RM_AA_TEX_EDGE2);
-#else
gDPSetRenderMode(gDisplayListHead++, G_RM_AA_XLU_SURF, G_RM_AA_XLU_SURF2);
-#endif
-
gDPSetTextureFilter(gDisplayListHead++, G_TF_BILERP);
switch (transTexType) {
case TRANS_TYPE_MIRROR:
- gDPLoadTextureBlock(gDisplayListHead++, sTextureTransitionID[texID], TRANSITION_TEXTURE_TYPE, G_IM_SIZ_8b, 32, 64, 0,
+ gDPLoadTextureBlock(gDisplayListHead++, sTextureTransitionID[texID], G_IM_FMT_IA, G_IM_SIZ_8b, 32, 64, 0,
G_TX_WRAP | G_TX_MIRROR, G_TX_WRAP | G_TX_MIRROR, 5, 6, G_TX_NOLOD, G_TX_NOLOD);
break;
case TRANS_TYPE_CLAMP:
- gDPLoadTextureBlock(gDisplayListHead++, sTextureTransitionID[texID], TRANSITION_TEXTURE_TYPE, G_IM_SIZ_8b, 64, 64, 0,
+ gDPLoadTextureBlock(gDisplayListHead++, sTextureTransitionID[texID], G_IM_FMT_IA, G_IM_SIZ_8b, 64, 64, 0,
G_TX_CLAMP, G_TX_CLAMP, 6, 6, G_TX_NOLOD, G_TX_NOLOD);
break;
}
@@ -325,7 +314,7 @@ Gfx *render_cannon_circle_base(void) {
gSPDisplayList(g++, dl_proj_mtx_fullscreen);
gDPSetCombineMode(g++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPSetTextureFilter(g++, G_TF_BILERP);
- gDPLoadTextureBlock(g++, sTextureTransitionID[TEX_TRANS_CIRCLE], TRANSITION_TEXTURE_TYPE, G_IM_SIZ_8b, 32, 64, 0,
+ gDPLoadTextureBlock(g++, sTextureTransitionID[TEX_TRANS_CIRCLE], G_IM_FMT_IA, G_IM_SIZ_8b, 32, 64, 0,
G_TX_WRAP | G_TX_MIRROR, G_TX_WRAP | G_TX_MIRROR, 5, 6, G_TX_NOLOD, G_TX_NOLOD);
gSPTexture(g++, 0xFFFF, 0xFFFF, 0, G_TX_RENDERTILE, G_ON);
gSPVertex(g++, VIRTUAL_TO_PHYSICAL(verts), 4, 0);
diff --git a/textures/segment2/transition_bowser_half.i8.png b/textures/segment2/transition_bowser_half.i8.png
deleted file mode 100644
index 7f321dc58e01493681fafc54abe5ced912b42ba2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2876
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
VcSQI+7#J8BJYD@<);T3K0RRMzk+T2*
diff --git a/textures/segment2/transition_star_half.i8.png b/textures/segment2/transition_star_half.i8.png
deleted file mode 100644
index f5843af042e5aead4fccea51290472467019d54f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 1607
zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU~u4IV_;yY?kio#z`&T7>FgYknVihPpfRy@
zqO~`(qe!d0u<0T}R$Y^boP|k(t|CW*lxCvnOA6vi$G+E}a#!_g(njfA_yX&+wAo#%IcVNO@PL<)P$58&i*m>`}b4
z?)jw5hqVtksIrUf3#dBv*!^f^f4pdP=MRe?A^y6*n}h8m&PTF7w0ro@Y2TXq`R;dB
zGDOmsEp1CFOB7c3V(Ar0op$2!1^ulWGylGo{`1KzsJp7e+n*~=?7u=mL$C2Zhdb!k|FJ^lY$G>U|?XbV9Co{kJemT49
z+Fo|u?1G}Wt3kI5cJaxUr(N=@^Q@b>&xdVZ|H4YXTk94S9z6Z3dhX(Ak2R-+V-KCv
z`*P~vw4?sI{u%O6&R-Q2Hw4YfBNCW
z&O7(*oA&+t_e+d-&YbaSczEud-^;geuU2o3(mksl^PsQa}
z>gt^g66s%@ot=#=EHq+cV}qt~y?gyy`@q|?KR$dYSgEz+!fR%?>`&4jky;uIl?^T}
ze|%c+T3cCtsnni4h5IUhM{URf#!j}HMf>;1@7leam0g#WLDZ>U;CT!$14l#D%L%I(
z{5THWzCC+c3eV*kU19C1ybYNNwhnnRo7QYt!?=J+;MoK*-nD$E|1(Os%uKu~a3Ewu
z!Io<6Lq==@p$mI9_^@bb>qs*#aEeTv$q^71p~f^re}=Qrv?uI`CdoKy)WC9m6ekcCEfe&6OTwNyS0g_Lv_EVLrCl8%fYeA^XAY0ns-^iT)du%;aFs{
zo4b2zSy|Y7U&a@wLM$vSF6`X5Yu72A{cAU^u&}pZU&rF3#SoIP)W*_s;_>6|v5Ouj
z=lp4zc)1|Pt@q6VgW8of2X-BO85bX4`re^EQ~%lALv3y>zJ7kIls^}1$#+OOaV}GS
z+giva)w6Ehx>L7q&C=1=e=Q<#ZAF0Z?Z|82bDlgr=5A(YmQq|CeEZO$rk?)(>t6q-
zF{nt!M@0ph&fvS3sKw3hVbu2}I5_wfx5fOQfeRTTdyUt&GX9Xz=Q(h_LXn}e=Q-Pn
zY?+3Tl{3U&>l^!3sUD12qh4A4_xrbceRY+V69p|-A3a*MX3d%tzkcl!c;4%Dw#Rf=
zHS>hyCo|UMiD+)yGbv?J;k^?XUuKFkWHUYY;^*hzWwwChEKl^LPARWnH>Debdc9sg
zd*1%}IU^t)gD()
zEOL5buJ^&I{iM&~xS>_d&w>9?@=mxUMyArW`SSImMNJY{xgqtd~Dvi(^5CiQqz%<
z?a)-|0}-zrC)~?&`O}v1pk&QGPHyHE?1@jd?Gdi(v9c