From 30d3e78273852f823c42c9733181ad48c3c503ff Mon Sep 17 00:00:00 2001 From: NicJA Date: Sat, 30 Jan 2016 03:16:33 +0000 Subject: [PATCH] wip update. start adding support for jumping to a direct frame in the buffer proc. give it 2x the player procs stack (since all the work takes place in it) allocate a sync signal for the playback proc to inform it to jump to a new frame. add a noskip option, and when it isnt specified try to skip frames to keep the correct frame rate for the animation (highly wip). default to enabling frameskip in the datatype but for now create a prefs file which disables it. there are 2 main issues with this code that I am currently still working on -: # when frameskip is enabled, some animations will stop loading once they fill the buffer and just show the first frames, or not load the very last frames. # some animations show corrupt gfx on the first iteration. git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@51459 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- .../classes/datatypes/animation/animationbuffer.c | 46 ++++++++++-- .../classes/datatypes/animation/animationclass.c | 8 +- .../classes/datatypes/animation/animationclass.h | 19 +++-- .../datatypes/animation/animationplayback.c | 87 ++++++++++++++-------- .../classes/datatypes/animation/animationprefs.c | 15 +++- .../classes/datatypes/animation/mmakefile.src | 6 +- 6 files changed, 127 insertions(+), 54 deletions(-) diff --git a/workbench/classes/datatypes/animation/animationbuffer.c b/workbench/classes/datatypes/animation/animationbuffer.c index 126aaa2c44..0a0361ed62 100644 --- a/workbench/classes/datatypes/animation/animationbuffer.c +++ b/workbench/classes/datatypes/animation/animationbuffer.c @@ -71,8 +71,6 @@ struct AnimFrame *NextToBuffer(struct ProcessPrivate *priv, struct AnimFrame *ne DFRAMES("[animation.datatype/BUFFER]: %s()\n", __PRETTY_FUNCTION__) - newFrame->af_Frame.MethodID = ADTM_LOADFRAME; - ObtainSemaphoreShared(&priv->pp_Data->ad_FrameData.afd_AnimFramesLock); if ((startFrame = priv->pp_BufferFirst) == NULL) @@ -81,9 +79,9 @@ struct AnimFrame *NextToBuffer(struct ProcessPrivate *priv, struct AnimFrame *ne prevFrame = startFrame; findprevframe: - while ((prevFrame->af_Node.ln_Succ) && + while ((prevFrame->af_Node.ln_Succ) && (prevFrame->af_Node.ln_Succ->ln_Succ) && ((prevFrame == (struct AnimFrame *)&priv->pp_Data->ad_FrameData.afd_AnimFrames) || - ((prevFrame->af_Node.ln_Succ->ln_Succ) && (NODEID(prevFrame->af_Node.ln_Succ) == (NODEID(prevFrame) + 1))))) + (NODEID(prevFrame->af_Node.ln_Succ) == (NODEID(prevFrame) + 1)))) { prevFrame = (struct AnimFrame *)prevFrame->af_Node.ln_Succ; } @@ -108,6 +106,7 @@ findprevframe: NODEID(newFrame) = (UWORD) newFrame->af_Frame.alf_Frame; newFrame->af_Frame.alf_TimeStamp = newFrame->af_Frame.alf_Frame; + priv->pp_BufferFirst = startFrame; ReleaseSemaphore(&priv->pp_Data->ad_FrameData.afd_AnimFramesLock); @@ -165,6 +164,7 @@ AROS_UFH3(void, bufferProc, ) priv->pp_BufferFirst = NULL; + priv->pp_BufferSpecific = -1; priv->pp_BufferLevel = 0; priv->pp_BufferFlags |= PRIVPROCF_RUNNING; @@ -247,7 +247,34 @@ AROS_UFH3(void, bufferProc, if ((curFrame) || ((curFrame = AllocMem(sizeof(struct AnimFrame), MEMF_ANY|MEMF_CLEAR)) != NULL)) { - startFrame = NextToBuffer(priv, curFrame); + curFrame->af_Frame.MethodID = ADTM_LOADFRAME; + + if (!(priv->pp_BufferFirst) && (priv->pp_BufferSpecific != -1)) + { + curFrame->af_Frame.alf_Frame = priv->pp_BufferSpecific; + priv->pp_BufferSpecific = -1; + + ObtainSemaphore(&priv->pp_Data->ad_FrameData.afd_AnimFramesLock); + startFrame = (struct AnimFrame *)&priv->pp_Data->ad_FrameData.afd_AnimFrames; + while ((startFrame->af_Node.ln_Succ) && + (startFrame->af_Node.ln_Succ->ln_Succ) && + (NODEID(startFrame->af_Node.ln_Succ) < priv->pp_BufferSpecific)) + { + startFrame = (struct AnimFrame *)startFrame->af_Node.ln_Succ; + } + + if (startFrame == (struct AnimFrame *)&priv->pp_Data->ad_FrameData.afd_AnimFrames) + startFrame = NULL; + priv->pp_BufferFirst = startFrame; + ReleaseSemaphore(&priv->pp_Data->ad_FrameData.afd_AnimFramesLock); + + NODEID(curFrame) = (UWORD) curFrame->af_Frame.alf_Frame; + curFrame->af_Frame.alf_TimeStamp = curFrame->af_Frame.alf_Frame; + } + else + { + startFrame = NextToBuffer(priv, curFrame); + } D( bug("[animation.datatype/BUFFER]: %s: Loading Frame #%d (AnimFrame @ 0x%p)\n", __func__, curFrame->af_Frame.alf_Frame, curFrame); @@ -257,7 +284,8 @@ AROS_UFH3(void, bufferProc, if (DoMethodA(priv->pp_Object, (Msg)&curFrame->af_Frame)) { priv->pp_BufferLevel++; - D( bug("[animation.datatype/BUFFER]: %s: Loaded! bitmap @ %p\n", __func__, curFrame->af_Frame.alf_BitMap); + D( + bug("[animation.datatype/BUFFER]: %s: Loaded! bitmap @ %p\n", __func__, curFrame->af_Frame.alf_BitMap); bug("[animation.datatype/BUFFER]: %s: frame #%d. stamp %d\n", __func__, curFrame->af_Frame.alf_Frame, curFrame->af_Frame.alf_TimeStamp); bug("[animation.datatype/BUFFER]: %s: bitmap @ %p\n", __func__, curFrame->af_Frame.alf_BitMap); ) @@ -269,8 +297,12 @@ AROS_UFH3(void, bufferProc, if (NODEID(curFrame) < (priv->pp_Data->ad_FrameData.afd_Frames - 1)) { priv->pp_BufferFirst = curFrame; - while ((priv->pp_BufferFirst->af_Node.ln_Succ) && (NODEID(priv->pp_BufferFirst->af_Node.ln_Succ) == (NODEID(priv->pp_BufferFirst) + 1))) + while ((priv->pp_BufferFirst->af_Node.ln_Succ) && + (priv->pp_BufferFirst->af_Node.ln_Succ->ln_Succ) && + (NODEID(priv->pp_BufferFirst->af_Node.ln_Succ) == (NODEID(priv->pp_BufferFirst) + 1))) + { priv->pp_BufferFirst = (struct AnimFrame *)priv->pp_BufferFirst->af_Node.ln_Succ; + } } if ((priv->pp_BufferFirst) && (NODEID(priv->pp_BufferFirst) == (priv->pp_Data->ad_FrameData.afd_Frames - 1))) diff --git a/workbench/classes/datatypes/animation/animationclass.c b/workbench/classes/datatypes/animation/animationclass.c index 2fe30ef88d..68dcfb69f6 100644 --- a/workbench/classes/datatypes/animation/animationclass.c +++ b/workbench/classes/datatypes/animation/animationclass.c @@ -109,7 +109,7 @@ struct DTMethod SupportedTriggerMethods[] = { NULL, NULL, 0 }, }; -char *GenTaskName(char *basename, char*taskname) +char *GenTaskName(char *basename, char *taskname) { int namLen, id = 0; char *newName; @@ -198,6 +198,7 @@ IPTR DT_InitPlayer(struct IClass *cl, struct Gadget *g, Msg msg) if ((animd->ad_ProcessData) && !(animd->ad_BufferProc)) { + // buffer proc gets 2x as much stack as playback since that is where the work happens animd->ad_BufferProc = CreateNewProcTags( NP_Entry, (IPTR)bufferProc, NP_Name, (IPTR)animd->ad_ProcessData->pp_BufferingName, @@ -208,7 +209,7 @@ IPTR DT_InitPlayer(struct IClass *cl, struct Gadget *g, Msg msg) NP_Output, Output (), NP_CloseOutput, FALSE, NP_UserData, (IPTR)animd->ad_ProcessData, - NP_StackSize, animd->ad_ProcStack, + NP_StackSize, (animd->ad_ProcStack << 1), TAG_DONE); while (!(animd->ad_ProcessData->pp_BufferFlags & PRIVPROCF_RUNNING)) { @@ -421,7 +422,6 @@ IPTR DT_MapPens(struct IClass *cl, struct Gadget *g, struct privMapFramePens *ms { if (animd->ad_ColorData.acd_ColorMap) { - animd->ad_Flags |= ANIMDF_REMAPPEDPENS; animd->ad_ColorData.acd_Allocated[mappedpen] = ObtainBestPenA(animd->ad_ColorData.acd_ColorMap, @@ -1182,7 +1182,7 @@ IPTR DT_NewMethod(struct IClass *cl, Object *o, struct opSet *msg) NewList(&animd->ad_FrameData.afd_AnimFrames); D(bug("[animation.datatype] %s: FrameList @ 0x%p\n", __func__, &animd->ad_FrameData.afd_AnimFrames);) - animd->ad_Flags = ANIMDF_CONTROLPANEL|ANIMDF_REMAP; + animd->ad_Flags = ANIMDF_CONTROLPANEL|ANIMDF_REMAP|ANIMDF_FRAMESKIP; #if (1) animd->ad_Flags |= (ANIMDF_REPEAT|ANIMDF_IMMEDIATE); #endif diff --git a/workbench/classes/datatypes/animation/animationclass.h b/workbench/classes/datatypes/animation/animationclass.h index 52b137ddbd..fb26aaf0e0 100644 --- a/workbench/classes/datatypes/animation/animationclass.h +++ b/workbench/classes/datatypes/animation/animationclass.h @@ -16,11 +16,13 @@ */ #define ANIMDF_CONTROLPANEL (1 << 0) #define ANIMDF_IMMEDIATE (1 << 1) -#define ANIMDF_REMAP (1 << 2) -#define ANIMDF_REPEAT (1 << 3) -#define ANIMDF_ADAPTFPS (1 << 4) -#define ANIMDF_SMARTSKIP (1 << 5) -#define ANIMDF_ADJUSTPALETTE (1 << 6) +#define ANIMDF_REPEAT (1 << 2) +#define ANIMDF_REMAP (1 << 3) +#define ANIMDF_ADJUSTPALETTE (1 << 4) +#define ANIMDF_ADAPTFPS (1 << 5) +#define ANIMDF_FRAMESKIP (1 << 6) +#define ANIMDF_SMARTSKIP (1 << 7) + /* special flags used by rendering/layout code */ @@ -137,7 +139,8 @@ struct ProcessPrivate volatile ULONG pp_BufferFlags; ULONG pp_BufferFrames; /* no of frames to buffer in total */ ULONG pp_BufferLevel; /* no of frames buffered */ - struct AnimFrame *pp_BufferFirst; + IPTR pp_BufferSpecific; /* specific frame to load */ + struct AnimFrame *pp_BufferFirst; /* starting point to load from */ struct AnimFrame *pp_PlaybackFrame; ULONG pp_BufferSigMask; @@ -149,12 +152,14 @@ struct ProcessPrivate ULONG pp_PlaybackSigMask; UBYTE pp_PlaybackEnable; UBYTE pp_PlaybackDisable; - UBYTE pp_PlaybackTick; /* signal frames needs to change */ + UBYTE pp_PlaybackTick; /* signal frames needs to change */ + UBYTE pp_PlaybackSync; /* signal position changed */ }; #define PRIVPROCF_ENABLED (1 << 0) #define PRIVPROCF_RUNNING (1 << 1) #define PRIVPROCF_ACTIVE (1 << 2) +#define PRIVPROCF_BUSY (1 << 3) #define TAG_PRIVATE (ADTA_Dummy + 100) #define PRIVATE_INITPLAYER (TAG_PRIVATE - 1) diff --git a/workbench/classes/datatypes/animation/animationplayback.c b/workbench/classes/datatypes/animation/animationplayback.c index ac19bb498b..cf6ab1ad4f 100644 --- a/workbench/classes/datatypes/animation/animationplayback.c +++ b/workbench/classes/datatypes/animation/animationplayback.c @@ -33,7 +33,7 @@ AROS_UFH3(ULONG, playerHookFunc, struct Animation_Data *animd = (struct Animation_Data *)hook->h_Data; BOOL doTick = FALSE; - IPTR buffSigs = 0; + IPTR buffSigs = 0, playbacksigs = 0; #if (0) D(bug("[animation.datatype]: %s(%08x)\n", __PRETTY_FUNCTION__, msg->pmt_Method);) @@ -47,22 +47,27 @@ AROS_UFH3(ULONG, playerHookFunc, if (animd->ad_TimerData.atd_Tick >= animd->ad_TimerData.atd_TicksPerFrame) { animd->ad_TimerData.atd_Tick = 0; - animd->ad_FrameData.afd_FrameCurrent++; - if (animd->ad_FrameData.afd_FrameCurrent >= animd->ad_FrameData.afd_Frames) + // increment the frame counter if we are supposed to... + if (!(animd->ad_ProcessData->pp_PlayerFlags & PRIVPROCF_BUSY) || (animd->ad_Flags & ANIMDF_FRAMESKIP)) { - if (animd->ad_Flags & ANIMDF_REPEAT) - animd->ad_FrameData.afd_FrameCurrent = 0; - else - animd->ad_FrameData.afd_FrameCurrent = animd->ad_FrameData.afd_Frames - 1; + animd->ad_FrameData.afd_FrameCurrent++; + if (animd->ad_FrameData.afd_FrameCurrent >= animd->ad_FrameData.afd_Frames) + { + if (animd->ad_Flags & ANIMDF_REPEAT) + animd->ad_FrameData.afd_FrameCurrent = 1; + else + animd->ad_FrameData.afd_FrameCurrent = animd->ad_FrameData.afd_Frames - 1; + } } - doTick = TRUE; + if (animd->ad_ProcessData->pp_PlaybackTick != -1) + playbacksigs |= (1 << animd->ad_ProcessData->pp_PlaybackTick); } if (animd->ad_TimerData.atd_Tick == 0) { + // flush unused buffers... if (animd->ad_ProcessData->pp_BufferPurge != -1) buffSigs |= (1 << animd->ad_ProcessData->pp_BufferPurge); } - break; case PM_SHUTTLE: @@ -77,8 +82,8 @@ AROS_UFH3(ULONG, playerHookFunc, if (buffSigs && (animd->ad_BufferProc)) Signal((struct Task *)animd->ad_BufferProc, buffSigs); - if (doTick && (animd->ad_PlayerProc) && (animd->ad_ProcessData->pp_PlaybackTick != -1)) - Signal((struct Task *)animd->ad_PlayerProc, (1 << animd->ad_ProcessData->pp_PlaybackTick)); + if (playbacksigs && (animd->ad_PlayerProc)) + Signal((struct Task *)animd->ad_PlayerProc, playbacksigs); return 0; @@ -108,12 +113,16 @@ BOOL AllocPlaybackSignals(struct ProcessPrivate *priv) if ((priv->pp_PlaybackTick = AllocSignal(-1)) != -1) { D(bug("[animation.datatype/PLAY]: %s: allocated tick signal (%x)\n", __PRETTY_FUNCTION__, priv->pp_PlaybackTick);) + if ((priv->pp_PlaybackSync = AllocSignal(-1)) != -1) + { + D(bug("[animation.datatype/PLAY]: %s: allocated sync signal (%x)\n", __PRETTY_FUNCTION__, priv->pp_PlaybackSync);) - priv->pp_PlaybackSigMask = (1 << priv->pp_PlaybackEnable) | (1 << priv->pp_PlaybackDisable) | (1 << priv->pp_PlaybackTick); + priv->pp_PlaybackSigMask = (1 << priv->pp_PlaybackEnable) | (1 << priv->pp_PlaybackDisable) | (1 << priv->pp_PlaybackTick) | (1 << priv->pp_PlaybackSync); - D(bug("[animation.datatype/PLAY]: %s: signal mask (%x)\n", __PRETTY_FUNCTION__, priv->pp_PlaybackSigMask);) + D(bug("[animation.datatype/PLAY]: %s: signal mask (%x)\n", __PRETTY_FUNCTION__, priv->pp_PlaybackSigMask);) - return TRUE; + return TRUE; + } } } } @@ -158,12 +167,12 @@ struct AnimFrame *NextFrame(struct ProcessPrivate *priv, struct AnimFrame *frame { frameFound = NULL; - if (!(priv->pp_Data->ad_Flags & ANIMDF_SMARTSKIP)) + if (!(priv->pp_Data->ad_Flags & ANIMDF_FRAMESKIP)) { if ((frameFirst) && (NODEID(frameFirst) == (NODEID(frameCurrent) + 1))) frameFound = frameFirst; } - else if (framePrev) + else if ((framePrev) && (NODEID(framePrev) > 0)) frameFound = framePrev; if (!(frameFound) && @@ -206,7 +215,7 @@ AROS_UFH3(void, playerProc, { TAG_DONE, 0} }; UWORD frame = 0; - ULONG signal; + ULONG signal, buffsigs; D(bug("[animation.datatype/PLAY]: %s()\n", __PRETTY_FUNCTION__);) @@ -235,44 +244,57 @@ AROS_UFH3(void, playerProc, if (signal & SIGBREAKF_CTRL_C) break; + priv->pp_PlayerFlags |= PRIVPROCF_ACTIVE; + if (signal & (1 << priv->pp_PlaybackEnable)) priv->pp_PlayerFlags |= PRIVPROCF_ENABLED; else if (signal & (1 << priv->pp_PlaybackDisable)) priv->pp_PlayerFlags &= ~PRIVPROCF_ENABLED; - if ((priv->pp_PlayerFlags & PRIVPROCF_ENABLED) && (signal & (1 << priv->pp_PlaybackTick))) + if ((priv->pp_PlayerFlags & PRIVPROCF_ENABLED) && ((signal & ((1 << priv->pp_PlaybackTick)|(1 << priv->pp_PlaybackSync))) != 0)) { - BOOL doBuffering = FALSE; - + priv->pp_PlayerFlags |= PRIVPROCF_BUSY; frame = priv->pp_Data->ad_FrameData.afd_FrameCurrent; - D(bug("[animation.datatype/PLAY]: %s: TICK (frame %d)\n", __PRETTY_FUNCTION__, frame);) + buffsigs = 0; - priv->pp_PlayerFlags |= PRIVPROCF_ACTIVE; + DFRAMES("[animation.datatype/PLAY] %s: Frame #%d\n", __PRETTY_FUNCTION__, frame) curFrame = NextFrame(priv, priv->pp_PlaybackFrame, &frame); if ((priv->pp_BufferFrames > priv->pp_BufferLevel) && (priv->pp_BufferLevel < priv->pp_Data->ad_FrameData.afd_Frames)) - doBuffering = TRUE; + { + buffsigs |= (1 << priv->pp_BufferFill); + } if (!(curFrame)) { ObtainSemaphore(&priv->pp_Data->ad_FrameData.afd_AnimFramesLock); - if ((priv->pp_PlaybackFrame) && (NODEID(priv->pp_PlaybackFrame) < (priv->pp_Data->ad_FrameData.afd_Frames - 1))) + if ((signal & (1 << priv->pp_PlaybackSync)) || + (priv->pp_Data->ad_Flags & ANIMDF_FRAMESKIP)) + { + priv->pp_BufferSpecific = frame; + } + + if ((priv->pp_PlaybackFrame) && + ((NODEID(priv->pp_PlaybackFrame) < frame) || + (!(priv->pp_Data->ad_Flags & ANIMDF_FRAMESKIP) && (NODEID(priv->pp_PlaybackFrame) < (priv->pp_Data->ad_FrameData.afd_Frames - 1))))) + { priv->pp_BufferFirst = priv->pp_PlaybackFrame; - else + } + else if (priv->pp_Data->ad_Flags & ANIMDF_FRAMESKIP) priv->pp_BufferFirst = NULL; + ReleaseSemaphore(&priv->pp_Data->ad_FrameData.afd_AnimFramesLock); - doBuffering = TRUE; + buffsigs |= ((1 << priv->pp_BufferPurge) | (1 << priv->pp_BufferFill)); } - if ((doBuffering) && - (priv->pp_Data->ad_BufferProc) && - (priv->pp_BufferFill != -1)) + if ((buffsigs) && (priv->pp_Data->ad_BufferProc)) { - Signal((struct Task *)priv->pp_Data->ad_BufferProc, (1 << priv->pp_BufferFill)); - SetTaskPri((struct Task *)priv->pp_Data->ad_PlayerProc, -2); + Signal((struct Task *)priv->pp_Data->ad_BufferProc, buffsigs); + if (buffsigs & (1 << priv->pp_BufferPurge)) + SetTaskPri((struct Task *)priv->pp_Data->ad_PlayerProc, -2); } // frame has changed ... render it .. @@ -283,6 +305,8 @@ AROS_UFH3(void, playerProc, bug("[animation.datatype/PLAY]: %s: BitMap @ 0x%p\n", __PRETTY_FUNCTION__, curFrame->af_CacheBM); ) + priv->pp_PlayerFlags &= ~PRIVPROCF_BUSY; + if ((priv->pp_Data->ad_Window) && !(priv->pp_Data->ad_Flags & ANIMDF_LAYOUT)) { if (priv->pp_Data->ad_Tapedeck) @@ -303,7 +327,6 @@ AROS_UFH3(void, playerProc, DoGadgetMethodA((struct Gadget *)priv->pp_Object, priv->pp_Data->ad_Window, NULL, (Msg)&gprMsg); } } - } } FreePlaybackSignals(priv); diff --git a/workbench/classes/datatypes/animation/animationprefs.c b/workbench/classes/datatypes/animation/animationprefs.c index 3925dd4a1f..d5048d32e7 100644 --- a/workbench/classes/datatypes/animation/animationprefs.c +++ b/workbench/classes/datatypes/animation/animationprefs.c @@ -44,7 +44,7 @@ static BOOL matchstr(STRPTR, STRPTR); * Lines are limitted to 256 chars. * * TEMPLATE -* MATCHCLASS/K,MATCHPROJECT/K,STACK/K/N,BUFFERTIME/K/N,BUFFERSTEP/K/N +* MATCHCLASS/K,MATCHPROJECT/K,STACK/K/N,BUFFERTIME/K/N,BUFFERSTEP/K/N,NOSKIP/S * * MATCHCLASS -- settings in this line will only affect matching * classes, e.g. if the case-insensitive pattern does not match, @@ -65,6 +65,8 @@ static BOOL matchstr(STRPTR, STRPTR); * * BUFFERSTEP -- specify the number of frames to buffer at one time. * +* NOSKIP - dont skip frames to keep up with the FPS. +* * NOTE * * BUGS @@ -145,6 +147,7 @@ void ReadENVPrefs(Object *o, struct Animation_Data *animd) IPTR *stack; IPTR *bufftime; IPTR *buffstep; + IPTR noskip; } animationargs; TEXT varbuff[ 258 ]; @@ -181,7 +184,8 @@ void ReadENVPrefs(Object *o, struct Animation_Data *animd) "MATCHPROJECT/K," "STACK/K/N," "BUFFERTIME/K/N," - "BUFFERSTEP/K/N", (IPTR *)(&animationargs), (&envvarrda))) + "BUFFERSTEP/K/N," + "NOSKIP/S", (IPTR *)(&animationargs), (&envvarrda))) { BOOL noignore = TRUE; @@ -204,7 +208,7 @@ void ReadENVPrefs(Object *o, struct Animation_Data *animd) if (animationargs.stack) { animd->ad_ProcStack = *(animationargs.stack); - D(bug("[animation.datatype] %s: using %d bytes for child process stack(s)\n", __func__, animd->ad_ProcStack);) + D(bug("[animation.datatype] %s: using %d bytes for playback stack (%d for buffering)\n", __func__, animd->ad_ProcStack, (1 << animd->ad_ProcStack));) } if (animationargs.bufftime) { @@ -216,6 +220,11 @@ void ReadENVPrefs(Object *o, struct Animation_Data *animd) animd->ad_BufferStep = (ULONG)*(animationargs.buffstep); D(bug("[animation.datatype] %s: buffering %d frames at a time\n", __func__, animd->ad_BufferStep);) } + if (animationargs.noskip) + { + D(bug("[animation.datatype] %s: turning frame-skip off\n", __func__);) + animd->ad_Flags &= ~ANIMDF_FRAMESKIP; + } } FreeArgs(&envvarrda); diff --git a/workbench/classes/datatypes/animation/mmakefile.src b/workbench/classes/datatypes/animation/mmakefile.src index e8023939e9..625f77d0f7 100644 --- a/workbench/classes/datatypes/animation/mmakefile.src +++ b/workbench/classes/datatypes/animation/mmakefile.src @@ -4,7 +4,7 @@ include $(TOP)/config/make.cfg FILES := animationclass animationbuffer animationframe animationplayback animationsave animationprefs #MM- workbench-datatypes-animation : workbench-datatype-animation -#MM workbench-datatype-animation : includes linklibs +#MM workbench-datatype-animation : includes linklibs workbench-datatype-animation-envarc USER_CFLAGS := -DDEBUG=0 USER_LDFLAGS := -static @@ -13,3 +13,7 @@ USER_LDFLAGS := -static modname=animation modtype=datatype \ files=$(FILES) +#MM +workbench-datatype-animation-envarc: + @$(MKDIR) $(AROS_ENVARC)/Classes/DataTypes + @$(ECHO) "NOSKIP" > $(AROS_ENVARC)/Classes/DataTypes/animation.prefs -- 2.11.4.GIT