@@ -46,34 +46,41 @@ typedef enum {
46
46
EFFECT_RUNNING = 4 ,
47
47
} EffectStateT ;
48
48
49
+ typedef void (* EffectFuncT )(void );
50
+
49
51
typedef struct Effect {
50
52
const char * name ;
51
53
EffectStateT state ;
52
54
/*
53
55
* Executed in background task when other effect is running.
54
56
* Precalculates data for the effect to be launched.
55
57
*/
56
- void ( * Load )( void ) ;
58
+ EffectFuncT Load ;
57
59
/*
58
60
* Frees all resources allocated by "Load" step.
59
61
*/
60
- void ( * UnLoad )( void ) ;
62
+ EffectFuncT UnLoad ;
61
63
/*
62
64
* Does all initialization steps required to launch the effect:
63
65
* 1) Allocate memory for buffers
64
66
* 2) Generate copper lists
65
67
* (setup for display window, display data fetch, palette, sprites, etc.)
66
68
* 3) Set up interrupts and DMA channels (copper, blitter, etc.)
67
69
*/
68
- void ( * Init )( void ) ;
70
+ EffectFuncT Init ;
69
71
/*
70
72
* Frees all resources allocated by "Init" step.
71
73
*/
72
- void ( * Kill )( void ) ;
74
+ EffectFuncT Kill ;
73
75
/*
74
76
* Renders single frame of an effect.
75
77
*/
76
- void (* Render )(void );
78
+ EffectFuncT Render ;
79
+ /*
80
+ * Called each frame during VBlank interrupt.
81
+ * Effect::data will be passed as the argument.
82
+ */
83
+ EffectFuncT VBlank ;
77
84
} EffectT ;
78
85
79
86
void EffectLoad (EffectT * effect );
@@ -82,7 +89,7 @@ void EffectKill(EffectT *effect);
82
89
void EffectUnLoad (EffectT * effect );
83
90
void EffectRun (EffectT * effect );
84
91
85
- #define EFFECT (NAME , L , U , I , K , R ) \
92
+ #define EFFECT (NAME , L , U , I , K , R , V ) \
86
93
EffectT NAME##Effect = { \
87
94
.name = #NAME, \
88
95
.state = 0, \
@@ -91,6 +98,7 @@ void EffectRun(EffectT *effect);
91
98
.Init = (I), \
92
99
.Kill = (K), \
93
100
.Render = (R), \
101
+ .VBlank = (V) \
94
102
}; \
95
103
ALIAS(NAME##Effect, Effect);
96
104
0 commit comments