mirror of
https://github.com/kichikuou/xsystem35-sdl2.git
synced 2026-10-11 16:48:17 +03:00
Rewrite SACT's rotation effects using sdl_fader
This is much faster since it uses (possibly hardware accelarated) SDL rendering functions.
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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); // 全部の効果タイプにこの処理は要らないんだけど
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
+50
-1
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user