diff --git a/src/ImageInteractionAnimation.cpp b/src/ImageInteractionAnimation.cpp new file mode 100644 index 0000000..550157a --- /dev/null +++ b/src/ImageInteractionAnimation.cpp @@ -0,0 +1,41 @@ +#include "ImageInteractionAnimation.hpp" +#include "glutils.hpp" +#include "MultiImageVisualisation.hpp" +#include + +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()); + + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glEnableClientState(GL_VERTEX_ARRAY); + glEnable(GL_TEXTURE_2D); + glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); + texture.bind(GL_TEXTURE_2D); + glTexCoordPointer(2, GL_FLOAT, 0, textureCoordinates.data()); + glVertexPointer(3, GL_FLOAT, 0, vertexBuffer.data()); + glDrawArrays(GL_QUADS, 0, vertexBuffer.size() / 3); + glDisable(GL_TEXTURE_2D); + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); +} + +ImageInteractionAnimation::ImageInteractionAnimation(const DType *data, const std::vector &shape, + const std::vector &prevPositions, + const std::vector &curPositions, float xDist) : + texture(loadTexture(data, shape[2], shape[1] * shape[3], shape[1])), + startingPositions(MultiImageVisualisation::getVertices(prevPositions)), + deltas(MultiImageVisualisation::getVertices(curPositions)), + textureCoordinates(MultiImageVisualisation::getTexCoords(shape[1])) +{ + caffe::caffe_sub(deltas.size(), deltas.data(), startingPositions.data(), deltas.data()); + + for (auto i = 0u; i < deltas.size(); i += 3) { + deltas[i] = xDist; + } +} diff --git a/src/ImageInteractionAnimation.hpp b/src/ImageInteractionAnimation.hpp new file mode 100644 index 0000000..2b03b19 --- /dev/null +++ b/src/ImageInteractionAnimation.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include "Animation.hpp" +#include "utils.hpp" +#include "Texture.hpp" + +namespace fmri +{ + class ImageInteractionAnimation : public Animation + { + public: + ImageInteractionAnimation(const DType* data, const std::vector& shape, const std::vector& prevPositions, const std::vector& curPositions, float xDist); + virtual void draw(float step); + + private: + Texture texture; + std::vector startingPositions; + std::vector deltas; + std::vector textureCoordinates; + }; +} diff --git a/src/visualisations.cpp b/src/visualisations.cpp index 5e9f0d5..1c5856d 100644 --- a/src/visualisations.cpp +++ b/src/visualisations.cpp @@ -9,6 +9,7 @@ #include "ActivityAnimation.hpp" #include "InputLayerVisualisation.hpp" #include "PoolingLayerAnimation.hpp" +#include "ImageInteractionAnimation.hpp" using namespace fmri; using namespace std; @@ -204,10 +205,9 @@ static Animation *getNormalizingAnimation(const fmri::LayerData &prevState, cons }; }); } else { - // TODO: do something for image-like layers. + transform(scaling.begin(), scaling.end(), scaling.begin(), [](float x) { return log(x); }); + return new ImageInteractionAnimation(scaling.data(), prevState.shape(), prevPositions, curPositions, -10); } - - return nullptr; } Animation * fmri::getActivityAnimation(const fmri::LayerData &prevState, const fmri::LayerData &curState,