Mercurial > hg > dmlib
diff dmengine.h @ 368:08ea68abb1f8
Work towards re-entrancy.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Wed, 17 Oct 2012 00:01:46 +0300 |
parents | 9875c65029af |
children | 56bd2693472f 29f0babc686f |
line wrap: on
line diff
--- a/dmengine.h Tue Oct 16 23:31:19 2012 +0300 +++ b/dmengine.h Wed Oct 17 00:01:46 2012 +0300 @@ -5,7 +5,7 @@ #include <SDL_events.h> #include <SDL_audio.h> #include "dmres.h" -#include "dmtimeline.h" +#include "dmvecmat.h" #ifdef DM_USE_JSS #include "jss.h" @@ -20,9 +20,176 @@ #endif +#define DT_MAGIC_ID "SDMETLNE" +#define DT_MAX_EFFECT_PARAMS 16 +#define DT_MAX_NAME_LENGTH 32 +#define DT_FLOAT_STORE_SIZE 16 + + +enum +{ + EFIT_SET, // No interpolation, just "set" the value + EFIT_LINEAR, // Linear interpolation + EFIT_SMOOTH, // Smoothstep interpolation +}; + +enum +{ + EFPT_INT, + EFPT_FLOAT, + EFPT_STRING, + EFPT_VECTOR, + EFPT_MATRIX, +}; + + +typedef struct +{ + int type; // Interpolation type (EFIT_*) between this and next point + int time; // Offsets to event start, -1 == attach to event start, -2 = event end (if event) + + int vint; + DMFloat vfloat; + DMVector vector; + DMMatrix matrix; +} DMTimelinePoint; + + +typedef struct +{ + int npoints, nallocated; + DMTimelinePoint *points; +} DMTimelinePoints; + + +typedef struct +{ + char *name; // Name / description of the parameter + int type; // Type (EFPT_*) + + DMTimelinePoints pts; + char *vstr; + + // Current values (interpolated) + int vint; + DMFloat vfloat; + DMVector vvector; + DMMatrix vmatrix; +} DMTimelineEventParam; + + +typedef struct +{ + char name[DT_MAX_NAME_LENGTH]; + Uint32 type; +} DMFTimelineEventParam; + + +struct DMEngineData; + + +typedef struct +{ + char * name; + int type; + + int (*init)(struct DMEngineData *, void **data); + void (*shutdown)(struct DMEngineData *, void *data); + int (*render)(SDL_Surface *screen, void *data, const DMTimelineEventParam *params, const int time); + + int nparams; + DMTimelineEventParam params[DT_MAX_EFFECT_PARAMS]; +} DMEffect; + + +typedef struct +{ + Uint32 start, duration; + char effectName[DT_MAX_NAME_LENGTH]; + Uint32 nparams; +} DMFTimelineEvent; + + +typedef struct +{ + int start, duration; + DMEffect *effect; + int nparams; + DMTimelineEventParam *params; +} DMTimelineEvent; + + +typedef struct +{ + BOOL enabled; + DMTimelinePoints points; +} DMTimelineCurve; + + +typedef struct +{ + char name[DT_MAX_NAME_LENGTH]; + Uint8 enabled; + Uint32 nevents; +} DMFTimelineTrack; + + +typedef struct +{ + char *name; // Name of the timeline track + BOOL enabled; // Enabled? + + int nevents, nallocated; // Number of events + DMTimelineEvent **events; // Events + + DMTimelineCurve composite; // Composite curve (transparency of the "layer") +} DMTimelineTrack; + + +typedef struct +{ + char magic[8]; + char name[DT_MAX_NAME_LENGTH]; + Uint32 ntracks; + Uint32 duration; +} DMFTimeline; + + +typedef struct +{ + char *name; + int ntracks, nallocated, duration; + DMTimelineTrack **tracks; +} DMTimeline; + + +typedef struct +{ + DMTimelineTrack *track; + DMTimelineEvent *event; +} DMPreparedEvent; + + +typedef struct _DMPreparedEventGroup +{ + int start, end, nevents, nallocated; + DMPreparedEvent *events; + + struct _DMPreparedEventGroup *next, *prev; +} DMPreparedEventGroup; + + +typedef struct +{ + int duration, ngroups, pos; + DMPreparedEventGroup **groups; +} DMPreparedTimeline; + + typedef struct DMEngineData { DMResourceLib *resources; + void **effectData; DMResource *timeline; DMTimeline *tl; @@ -61,6 +228,49 @@ } DMEngineData; +extern DMEffect *dmEffects; +extern int ndmEffects, ndmEffectsAlloc; +extern void **dmEffectData; + + +// Effect registration +int engineRegisterEffect(const DMEffect *ef); +int engineInitializeEffects(); +void engineShutdownEffects(); +DMEffect *engineFindEffect(const char *name, const int nparams); +DMEffect *engineFindEffectByName(const char *name); + + +// Basic timeline handling +int dmLoadTimeline(DMResource *res, DMTimeline **tl); +void dmFreeTimeline(DMTimeline *tl); + +void dmFreeTimelinePoints(DMTimelinePoints *points); +void dmFreeTimelineEventParam(DMTimelineEventParam *param); +void dmFreeTimelineEvent(DMTimelineEvent *event); +void dmFreeTimelineTrack(DMTimelineTrack *track); + + +// Execution related +int dmPrepareTimeline(DMTimeline *tl, DMPreparedTimeline *ptl); +void dmFreePreparedTimelineData(DMPreparedTimeline *ptl); + +int dmSeekTimeline(DMPreparedTimeline *tl, int time); +int dmExecuteTimeline(DMPreparedTimeline *tl, SDL_Surface *screen, int time); + + +// Editing/saving related functions +int dmSaveTimeline(DMResource *res, DMTimeline *tl); + +int dmTimelineNew(DMTimeline **tl, const char *name); +int dmTimelineAddTrack(DMTimeline *tl, DMTimelineTrack **track, const char *name); +int dmTimelineTrackAddEvent(DMTimelineTrack *track, int start, int duration, DMTimelineEvent **pev); +int dmTimelineEventSetEffect(DMTimelineEvent *event, const char *name); + +DMTimelineEvent *dmTimelineGetEventAt(DMTimelineTrack *track, int time); + + +// Resource helpers #define engineGetResImage(eng, x, name) \ do { \ if ((x = (SDL_Surface *) engineGetResource(eng, name)) == NULL) \ @@ -82,6 +292,8 @@ int engineGetTimeDTi(DMEngineData *eng); int engineGetTick(DMEngineData *eng); float engineGetTimeDT(DMEngineData *eng); + +// Implemented in actual demo code int demoPreInit(DMEngineData *eng);