diff --git a/examples/pxScene2d/src/pxImageA.cpp b/examples/pxScene2d/src/pxImageA.cpp index a6c9d817e0..ec0e7fbdc4 100644 --- a/examples/pxScene2d/src/pxImageA.cpp +++ b/examples/pxScene2d/src/pxImageA.cpp @@ -21,6 +21,7 @@ #include "pxImageA.h" #include "pxContext.h" #include +#include "pxTimer.h" extern pxContext context; @@ -397,9 +398,58 @@ rtError pxImageA::setResolveWithoutParent(bool v) return RT_OK; } +rtError pxImageA::animateImage() +{ + if (getImageAResource() == NULL || !mImageLoaded) + { + return RT_OK; + } + + double t = pxSeconds(); + pxTimedOffscreenSequence& imageSequence = getImageAResource()->getTimedOffscreenSequence(); + uint32_t numFrames = imageSequence.numFrames(); + + if (numFrames > 0) + { + if (mFrameTime < 0) + { + mCurFrame = 0; + mFrameTime = t; + } + + for (; mCurFrame < numFrames; mCurFrame++) + { + double d = imageSequence.getDuration(mCurFrame); + if (mFrameTime + d >= t) + break; + mFrameTime += d; + } + + if (mCurFrame >= numFrames) + { + mCurFrame = numFrames - 1; // snap animation to last frame + + if (!imageSequence.numPlays() || mPlays < imageSequence.numPlays()) + { + mFrameTime = -1; // reset animation + mPlays++; + } + } + + if (mCachedFrame != mCurFrame) + { + pxOffscreen &o = imageSequence.getFrameBuffer(mCurFrame); + mTexture = context.createTexture(o); + mCachedFrame = mCurFrame; + } + } + return RT_OK; +} + rtDefineObject(pxImageA, pxObject); rtDefineProperty(pxImageA, url); rtDefineProperty(pxImageA, resource); rtDefineProperty(pxImageA, stretchX); rtDefineProperty(pxImageA, stretchY); rtDefineProperty(pxImageA, resolveWithoutParent); +rtDefineMethod(pxImageA, animateImage); diff --git a/examples/pxScene2d/src/pxImageA.h b/examples/pxScene2d/src/pxImageA.h index 03facb4f9c..9ac9a05298 100644 --- a/examples/pxScene2d/src/pxImageA.h +++ b/examples/pxScene2d/src/pxImageA.h @@ -35,6 +35,7 @@ class pxImageA: public pxObject, pxResourceListener rtProperty(stretchY, stretchY, setStretchY, int32_t); rtProperty(resource, resource, setResource, rtObjectRef); rtProperty(resolveWithoutParent, resolveWithoutParent, setResolveWithoutParent, bool); + rtMethodNoArgAndNoReturn("animateImage", animateImage); pxImageA(pxScene2d* scene); virtual ~pxImageA(); @@ -53,6 +54,7 @@ class pxImageA: public pxObject, pxResourceListener rtError removeResourceListener(); rtError resolveWithoutParent(bool& v) const; rtError setResolveWithoutParent(bool v); + rtError animateImage(); virtual void resourceReady(rtString readyResolution); virtual void resourceDirty(); diff --git a/examples/pxScene2d/src/pxScene2d.cpp b/examples/pxScene2d/src/pxScene2d.cpp index d3931b58a8..dfd6648566 100755 --- a/examples/pxScene2d/src/pxScene2d.cpp +++ b/examples/pxScene2d/src/pxScene2d.cpp @@ -570,6 +570,7 @@ pxScene2d::pxScene2d(bool top, pxScriptView* scriptView) // capabilities.video.player = 1 // capabilities.sparkgl.nativedrawing = 1 // capabilities.sparkgl.supports1080 = 1 + // capabilities.sparkgl.animatedImages = 1 mCapabilityVersions = new rtMapObject; @@ -677,6 +678,7 @@ pxScene2d::pxScene2d(bool top, pxScriptView* scriptView) } } sparkGlCapabilities.set("supports1080", 1); + sparkGlCapabilities.set("animatedImages", 1); mCapabilityVersions.set("sparkgl", sparkGlCapabilities); //////////////////////////////////////////////////////