diff --git a/src/fmri/ActivityAnimation.cpp b/src/fmri/ActivityAnimation.cpp index 5ac74ae..e64744e 100644 --- a/src/fmri/ActivityAnimation.cpp +++ b/src/fmri/ActivityAnimation.cpp @@ -51,17 +51,13 @@ ActivityAnimation::ActivityAnimation( void ActivityAnimation::draw(float timeScale) { - std::unique_ptr vertexBuffer(new float[bufferLength]); - caffe::caffe_copy(bufferLength, delta.data(), vertexBuffer.get()); - caffe::caffe_scal(bufferLength, timeScale, vertexBuffer.get()); - caffe::caffe_add(bufferLength, startingPos.data(), vertexBuffer.get(), vertexBuffer.get()); - + const auto vertexBuffer = animate(startingPos, delta, timeScale); glPointSize(5); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glColorPointer(3, GL_FLOAT, 0, colorBuf.data()); - glVertexPointer(3, GL_FLOAT, 0, vertexBuffer.get()); + glVertexPointer(3, GL_FLOAT, 0, vertexBuffer.data()); glDrawArrays(GL_POINTS, 0, bufferLength / 3); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); diff --git a/src/fmri/ImageInteractionAnimation.cpp b/src/fmri/ImageInteractionAnimation.cpp index bfc2519..d14e99e 100644 --- a/src/fmri/ImageInteractionAnimation.cpp +++ b/src/fmri/ImageInteractionAnimation.cpp @@ -8,9 +8,7 @@ using namespace fmri; void ImageInteractionAnimation::draw(float step) { - auto vertexBuffer = deltas; - caffe::caffe_scal(deltas.size(), step, vertexBuffer.data()); - caffe::caffe_add(vertexBuffer.size(), vertexBuffer.data(), startingPositions.data(), vertexBuffer.data()); + auto vertexBuffer = animate(startingPositions, deltas, step); drawImageTiles(vertexBuffer.size() / 3, vertexBuffer.data(), textureCoordinates.data(), texture); } diff --git a/src/fmri/PoolingLayerAnimation.cpp b/src/fmri/PoolingLayerAnimation.cpp index b6af9eb..b26e595 100644 --- a/src/fmri/PoolingLayerAnimation.cpp +++ b/src/fmri/PoolingLayerAnimation.cpp @@ -30,9 +30,7 @@ PoolingLayerAnimation::PoolingLayerAnimation(const LayerData &prevData, const La void PoolingLayerAnimation::draw(float timeStep) { - vector vertexBuffer(deltas); - caffe::caffe_scal(vertexBuffer.size(), timeStep, vertexBuffer.data()); - caffe::caffe_add(startingPositions.size(), startingPositions.data(), vertexBuffer.data(), vertexBuffer.data()); + auto vertexBuffer = animate(startingPositions, deltas, timeStep); drawImageTiles(vertexBuffer.size() / 3, vertexBuffer.data(), textureCoordinates.data(), original); } diff --git a/src/fmri/utils.cpp b/src/fmri/utils.cpp index 90b3f0f..4b03af8 100644 --- a/src/fmri/utils.cpp +++ b/src/fmri/utils.cpp @@ -1,3 +1,4 @@ +#include #include "utils.hpp" const float fmri::LAYER_X_OFFSET = -10; @@ -14,3 +15,12 @@ std::default_random_engine &fmri::rng() return rng; } + +std::vector fmri::animate(const std::vector &start, const std::vector &delta, float time) +{ + auto vertexBuffer = delta; + caffe::caffe_scal(vertexBuffer.size(), time, vertexBuffer.data()); + caffe::caffe_add(start.size(), vertexBuffer.data(), start.data(), vertexBuffer.data()); + + return vertexBuffer; +} diff --git a/src/fmri/utils.hpp b/src/fmri/utils.hpp index d689b51..18e87fd 100644 --- a/src/fmri/utils.hpp +++ b/src/fmri/utils.hpp @@ -229,4 +229,14 @@ namespace fmri } } } + + /** + * Animate a list of floats. + * + * @param start Starting values for all floats + * @param delta Value to be added at the end of the animation + * @param time 0..1 where in the animation are we? + * @return Resulting list of floats. + */ + std::vector animate(const std::vector& start, const std::vector& delta, float time); }