diff --git a/modules/NIGHTDLL/sprite_eupdate.c b/modules/NIGHTDLL/sprite_eupdate.c index 17799e9..f625228 100644 --- a/modules/NIGHTDLL/sprite_eupdate.c +++ b/modules/NIGHTDLL/sprite_eupdate.c @@ -61,7 +61,6 @@ static ecopyparam_t ecp; // #include "sprite_eupdate_perspect.c" // #include "sprite_eupdate_mosaic.c" -// #include "sprite_eupdate_aff.c" // #include "sprite_eupdate_uneune.c" #include "sprite_eupdate_buller.c" // #include "sprite_eupdate_zmbbul.c" diff --git a/modules/SACT/sprite_eupdate.c b/modules/SACT/sprite_eupdate.c index 8e20d6d..90396c5 100644 --- a/modules/SACT/sprite_eupdate.c +++ b/modules/SACT/sprite_eupdate.c @@ -64,7 +64,6 @@ static ecopyparam_t ecp; #include "sprite_eupdate_perspect.c" #include "sprite_eupdate_mosaic.c" -#include "sprite_eupdate_aff.c" #include "sprite_eupdate_uneune.c" #include "sprite_eupdate_buller.c" #include "sprite_eupdate_zmbbul.c" @@ -91,10 +90,10 @@ static entrypoint *cb[39] = { sdlfader_cb, ec_dummy_cb, // 欠番 ec19_cb, - ec20_cb, - ec21_cb, - ec22_cb, - ec23_cb, + sdlfader_cb, + sdlfader_cb, + sdlfader_cb, + sdlfader_cb, ec_dummy_cb, ec25_cb, ec26_cb, @@ -364,8 +363,9 @@ int sp_eupdate(int type, int time, int cancel) { sfdst = sf_dup(sf0); - if (SACT_EFFECT_PENTAGRAM_IN_OUT <= type && type <= SACT_EFFECT_HEXAGRAM_OUT_IN) - ecp.fader = sdl_fader_init(0, 0, sfsrc->width, sfsrc->height, 0, 0, from_sact_effect(type)); + enum sdl_effect sdl_effect = from_sact_effect(type); + if (sdl_effect != EFFECT_INVALID) + ecp.fader = sdl_fader_init(0, 0, sfsrc->width, sfsrc->height, 0, 0, sdl_effect); else sf_copyall(sf0, sfsrc); // 全部の効果タイプにこの処理は要らないんだけど diff --git a/modules/SACT/sprite_eupdate_aff.c b/modules/SACT/sprite_eupdate_aff.c deleted file mode 100644 index 682403c..0000000 --- a/modules/SACT/sprite_eupdate_aff.c +++ /dev/null @@ -1,102 +0,0 @@ -// アフィン変換 (回転) - -static void do_aff(surface_t *in, surface_t *out, int deg, double zx, double zy) { - int xs = in->width / 2; - int ys = in->height / 2; - double r = deg * M_PI / 180; - double c = cos(r); - double s = sin(r); - double x, y; - int i, j, m, n; - - switch(in->depth) { - case 16: { - WORD *src, *dst; - - for (i = -ys; i < ys; i++) { - for (j = -xs; j < xs; j++) { - y = (j * s + i * c) / zy; - x = (j * c - i * s) / zx; - if (y > 0) m = (int)y; - else m = (int)(y -1); - if (x > 0) n = (int)x; - else n = (int)(x -1); - src = (WORD *)GETOFFSET_PIXEL(in, n+xs, m+ys); - dst = (WORD *)GETOFFSET_PIXEL(out, j+xs, i+ys); - if ((m >= -ys) && (m < ys) && (n >= -xs) && (n < xs)) { - *dst = *src; - } - } - } - break; - } - case 24: - case 32: { - DWORD *src, *dst; - - for (i = -ys; i < ys; i++) { - for (j = -xs; j < xs; j++) { - y = (j * s + i * c) / zy; - x = (j * c - i * s) / zx; - if (y > 0) m = (int)y; - else m = (int)(y -1); - if (x > 0) n = (int)x; - else n = (int)(x -1); - src = (DWORD *)GETOFFSET_PIXEL(in, n+xs, m+ys); - dst = (DWORD *)GETOFFSET_PIXEL(out, j+xs, i+ys); - if ((m >= -ys) && (m < ys) && (n >= -xs) && (n < xs)) { - *dst = *src; - } - } - } - break; - }} -} - - - -//回転アウト -static void ec20_cb(surface_t *sfsrc, surface_t *sfdst) { - //1回転だけ - int maxstep, curstep; - maxstep = 360; - curstep = maxstep * (ecp.curtime - ecp.sttime)/ (ecp.edtime - ecp.sttime); - sf_copyall(sf0, sfdst); - do_aff(sfsrc, sf0, curstep, 1- (double)curstep / maxstep, 1- (double)curstep / maxstep); - ags_updateFull(); - ecp.oldstep = curstep; -} - -//回転イン -static void ec21_cb(surface_t *sfsrc, surface_t *sfdst) { - int maxstep, curstep; - maxstep = 360; - curstep = maxstep * (ecp.curtime - ecp.sttime)/ (ecp.edtime - ecp.sttime); - sf_copyall(sf0, sfsrc); - do_aff(sfdst, sf0, curstep, (double)curstep / maxstep, (double)curstep / maxstep); - ags_updateFull(); - ecp.oldstep = curstep; -} - -//回転アウト(時計回り) -static void ec22_cb(surface_t *sfsrc, surface_t *sfdst) { - int maxstep, curstep; - maxstep = 360; - curstep = maxstep * (ecp.curtime - ecp.sttime)/ (ecp.edtime - ecp.sttime); - sf_copyall(sf0, sfdst); - do_aff(sfsrc, sf0, -curstep, 1- (double)curstep / maxstep, 1- (double)curstep / maxstep); - ags_updateFull(); - ecp.oldstep = curstep; -} - -//回転イン(時計回り) -static void ec23_cb(surface_t *sfsrc, surface_t *sfdst) { - int maxstep, curstep; - maxstep = 360; - curstep = maxstep * (ecp.curtime - ecp.sttime)/ (ecp.edtime - ecp.sttime); - sf_copyall(sf0, sfsrc); - do_aff(sfdst, sf0, -curstep, (double)curstep / maxstep, (double)curstep / maxstep); - ags_updateFull(); - ecp.oldstep = curstep; -} - diff --git a/src/effect.h b/src/effect.h index d4e1401..31c12b1 100644 --- a/src/effect.h +++ b/src/effect.h @@ -38,6 +38,10 @@ enum sact_effect { SACT_EFFECT_PENTAGRAM_OUT_IN = 15, SACT_EFFECT_HEXAGRAM_IN_OUT = 16, SACT_EFFECT_HEXAGRAM_OUT_IN = 17, + SACT_EFFECT_ROTATE_OUT = 20, + SACT_EFFECT_ROTATE_IN = 21, + SACT_EFFECT_ROTATE_OUT_CW = 22, + SACT_EFFECT_ROTATE_IN_CW = 23, }; // Internal effect numbers. @@ -51,6 +55,10 @@ enum sdl_effect { EFFECT_WINDMILL, EFFECT_WINDMILL_180, EFFECT_WINDMILL_360, + EFFECT_ROTATE_OUT, + EFFECT_ROTATE_IN, + EFFECT_ROTATE_OUT_CW, + EFFECT_ROTATE_IN_CW, }; enum sdl_effect from_nact_effect(enum nact_effect effect); diff --git a/src/sdl_fader.c b/src/sdl_fader.c index cf866e7..6e5d043 100644 --- a/src/sdl_fader.c +++ b/src/sdl_fader.c @@ -53,6 +53,10 @@ enum sdl_effect from_sact_effect(enum sact_effect effect) { case SACT_EFFECT_PENTAGRAM_OUT_IN: return EFFECT_PENTAGRAM_OUT_IN; case SACT_EFFECT_HEXAGRAM_IN_OUT: return EFFECT_HEXAGRAM_IN_OUT; case SACT_EFFECT_HEXAGRAM_OUT_IN: return EFFECT_HEXAGRAM_OUT_IN; + case SACT_EFFECT_ROTATE_OUT: return EFFECT_ROTATE_OUT; + case SACT_EFFECT_ROTATE_IN: return EFFECT_ROTATE_IN; + case SACT_EFFECT_ROTATE_OUT_CW: return EFFECT_ROTATE_OUT_CW; + case SACT_EFFECT_ROTATE_IN_CW: return EFFECT_ROTATE_IN_CW; default: return EFFECT_INVALID; } } @@ -293,8 +297,47 @@ static void step_crossfade(struct sdl_fader *fader, int step) { SDL_RenderPresent(sdl_renderer); } +static void step_rotate(struct sdl_fader *fader, int step) { + SDL_Texture *bg_texture, *fg_texture; + double angle = step * 360.0 / SDL_FADER_MAXSTEP; + double scale = step / (double)SDL_FADER_MAXSTEP; + switch (fader->effect) { + case EFFECT_ROTATE_OUT: + scale = 1.0 - scale; + bg_texture = fader->tx_new; + fg_texture = fader->tx_old; + angle *= -1.0; + break; + case EFFECT_ROTATE_IN: + bg_texture = fader->tx_old; + fg_texture = fader->tx_new; + angle *= -1.0; + break; + case EFFECT_ROTATE_OUT_CW: + scale = 1.0 - scale; + bg_texture = fader->tx_new; + fg_texture = fader->tx_old; + break; + case EFFECT_ROTATE_IN_CW: + bg_texture = fader->tx_old; + fg_texture = fader->tx_new; + break; + default: + assert(!"Cannot happen"); + } + SDL_Rect r = fader->dst_rect; + r.x += (1.0 - scale) * r.w / 2; + r.y += (1.0 - scale) * r.h / 2; + r.w *= scale; + r.h *= scale; + SDL_RenderCopy(sdl_renderer, bg_texture, NULL, &fader->dst_rect); + SDL_RenderCopyEx(sdl_renderer, fg_texture, NULL, &r, angle, NULL, SDL_FLIP_NONE); + SDL_RenderPresent(sdl_renderer); +} + struct sdl_fader *sdl_fader_init(int sx, int sy, int w, int h, int dx, int dy, enum sdl_effect effect) { - if (!SDL_RenderTargetSupported(sdl_renderer) || !HAS_SDL_RenderGeometry) { + if (EFFECT_PENTAGRAM_IN_OUT <= effect && effect <= EFFECT_WINDMILL_360 && + (!SDL_RenderTargetSupported(sdl_renderer) || !HAS_SDL_RenderGeometry)) { WARNING("Effect %d is not supported in this system. Falling back to crossfade.\n", effect); effect = EFFECT_CROSSFADE; } @@ -345,6 +388,12 @@ void sdl_fader_step(struct sdl_fader *fader, int step) { step_polygon_mask(fader, step); break; #endif + case EFFECT_ROTATE_OUT: + case EFFECT_ROTATE_IN: + case EFFECT_ROTATE_OUT_CW: + case EFFECT_ROTATE_IN_CW: + step_rotate(fader, step); + break; default: if (step == 0) WARNING("Unknown effect %d\n", fader->effect);