diff --git a/src/fmri/ActivityAnimation.cpp b/src/fmri/ActivityAnimation.cpp index ad61333..22380e7 100644 --- a/src/fmri/ActivityAnimation.cpp +++ b/src/fmri/ActivityAnimation.cpp @@ -38,14 +38,16 @@ ActivityAnimation::ActivityAnimation( startingPos.reserve(bufferLength); vector endPos; endPos.reserve(bufferLength); - colorBuf.reserve(interactions.size()); + transform(interactions.begin(), interactions.end(), back_inserter(colorBuffer), [&coloring](auto e) { + return coloring(e.first); + }); + colorBuffer.reserve(interactions.size()); + for (auto &entry : interactions) { auto *aPos = &aPositions[3 * entry.second.first]; auto *bPos = &bPositions[3 * entry.second.second]; - colorBuf.push_back(coloring(entry.first)); - for (auto i : Range(3)) { startingPos.emplace_back(aPos[i]); endPos.emplace_back(bPos[i] + (i % 3 ? 0 : LAYER_X_OFFSET)); @@ -59,7 +61,7 @@ ActivityAnimation::ActivityAnimation( lineIndices.push_back(i + interactions.size()); } - patchTransparancy(colorBuf.begin(), colorBuf.end()); + patchTransparancy(); } void ActivityAnimation::draw(float timeScale) @@ -68,7 +70,7 @@ void ActivityAnimation::draw(float timeScale) glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); - glColorPointer(std::tuple_size::value, GL_FLOAT, 0, colorBuf.data()); + glColorPointer(std::tuple_size::value, GL_FLOAT, 0, colorBuffer.data()); glVertexPointer(3, GL_FLOAT, 0, vertexBuffer.data()); glDrawArrays(GL_POINTS, 0, bufferLength / 3); glDisableClientState(GL_COLOR_ARRAY); diff --git a/src/fmri/ActivityAnimation.hpp b/src/fmri/ActivityAnimation.hpp index 27ec3b1..4d17b44 100644 --- a/src/fmri/ActivityAnimation.hpp +++ b/src/fmri/ActivityAnimation.hpp @@ -27,7 +27,6 @@ namespace fmri private: std::size_t bufferLength; - std::vector colorBuf; std::vector startingPos; std::vector delta; std::vector lineIndices; diff --git a/src/fmri/Animation.hpp b/src/fmri/Animation.hpp index b7d5ef0..4e8694d 100644 --- a/src/fmri/Animation.hpp +++ b/src/fmri/Animation.hpp @@ -2,31 +2,16 @@ #include "utils.hpp" +#include "Drawable.hpp" namespace fmri { - class Animation + class Animation : public Drawable { public: virtual ~Animation() = default; - virtual void draw(float step) = 0; - - private: - static float getAlpha(); - protected: - template - void patchTransparancy(It begin, It end) - { - if constexpr (std::tuple_size::value >= 4) { - const auto alpha = getAlpha(); - for (; begin != end; ++begin) { - Color &color = *begin; - color[3] = alpha; - } - } - } - + float getAlpha() override; }; } diff --git a/src/fmri/Drawable.cpp b/src/fmri/Drawable.cpp new file mode 100644 index 0000000..a5d3997 --- /dev/null +++ b/src/fmri/Drawable.cpp @@ -0,0 +1,16 @@ +#include "Drawable.hpp" + +void fmri::Drawable::patchTransparancy() +{ + if constexpr (std::tuple_size::value < 4) { + // Not compiling with alpha support + return; + } + + const auto alpha = getAlpha(); + const auto end = colorBuffer.end(); + + for (auto it = colorBuffer.begin(); it != end; ++it) { + (*it)[3] = alpha; + } +} diff --git a/src/fmri/Drawable.hpp b/src/fmri/Drawable.hpp new file mode 100644 index 0000000..da37a95 --- /dev/null +++ b/src/fmri/Drawable.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "utils.hpp" + +namespace fmri +{ + + class Drawable + { + public: + virtual ~Drawable() = default; + + virtual void draw(float time) = 0; + virtual void patchTransparancy(); + + protected: + std::vector colorBuffer; + + virtual float getAlpha() = 0; + }; + +} diff --git a/src/fmri/DummyLayerVisualisation.hpp b/src/fmri/DummyLayerVisualisation.hpp index 943f601..6ca5a9e 100644 --- a/src/fmri/DummyLayerVisualisation.hpp +++ b/src/fmri/DummyLayerVisualisation.hpp @@ -10,7 +10,7 @@ namespace fmri class DummyLayerVisualisation : public LayerVisualisation { public: - void render() override + void draw(float time) override {}; }; } diff --git a/src/fmri/FlatLayerVisualisation.cpp b/src/fmri/FlatLayerVisualisation.cpp index 4cff1ee..613931b 100644 --- a/src/fmri/FlatLayerVisualisation.cpp +++ b/src/fmri/FlatLayerVisualisation.cpp @@ -29,7 +29,6 @@ FlatLayerVisualisation::FlatLayerVisualisation(const LayerData &layer, Ordering LayerVisualisation(layer.numEntries()), ordering(ordering), vertexBuffer(layer.numEntries() * NODE_FACES.size()), - colorBuffer(layer.numEntries() * VERTICES_PER_NODE), indexBuffer(layer.numEntries() * NODE_FACES.size()) { auto &shape = layer.shape(); @@ -45,7 +44,7 @@ FlatLayerVisualisation::FlatLayerVisualisation(const LayerData &layer, Ordering auto scalingMax = std::max(abs(*minElem), abs(*maxElem)); - auto colorPos = colorBuffer.begin(); + auto colorPos = std::back_inserter(colorBuffer); auto indexPos = indexBuffer.begin(); for (int i : Range(limit)) { @@ -67,12 +66,10 @@ FlatLayerVisualisation::FlatLayerVisualisation(const LayerData &layer, Ordering } assert(indexPos == indexBuffer.end()); - assert(colorPos == colorBuffer.end()); - - patchTransparancy(colorBuffer.begin(), colorBuffer.end()); + patchTransparancy(); } -void FlatLayerVisualisation::render() +void FlatLayerVisualisation::draw(float time) { glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); @@ -85,7 +82,7 @@ void FlatLayerVisualisation::render() glDisableClientState(GL_COLOR_ARRAY); // Now draw wireframe - glColor4f(0, 0, 0, 1); + glColor4f(0, 0, 0, getAlpha()); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, indices.data()); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); diff --git a/src/fmri/FlatLayerVisualisation.hpp b/src/fmri/FlatLayerVisualisation.hpp index 82cc3b0..b32d25c 100644 --- a/src/fmri/FlatLayerVisualisation.hpp +++ b/src/fmri/FlatLayerVisualisation.hpp @@ -12,12 +12,11 @@ namespace fmri public: explicit FlatLayerVisualisation(const LayerData &layer, Ordering ordering); - void render() override; + void draw(float time) override; private: Ordering ordering; std::vector vertexBuffer; - std::vector colorBuffer; std::vector indexBuffer; std::vector activeIndexBuffer; diff --git a/src/fmri/InputLayerVisualisation.cpp b/src/fmri/InputLayerVisualisation.cpp index a5b0623..531ea3b 100644 --- a/src/fmri/InputLayerVisualisation.cpp +++ b/src/fmri/InputLayerVisualisation.cpp @@ -67,7 +67,7 @@ InputLayerVisualisation::InputLayerVisualisation(const LayerData &data) gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, width, height, GL_RGB, GL_FLOAT, imageData.data()); } -void InputLayerVisualisation::render() +void InputLayerVisualisation::draw(float time) { const float vertices[] = { 0, 0, 0, diff --git a/src/fmri/InputLayerVisualisation.hpp b/src/fmri/InputLayerVisualisation.hpp index 9b3e1ae..ee13570 100644 --- a/src/fmri/InputLayerVisualisation.hpp +++ b/src/fmri/InputLayerVisualisation.hpp @@ -11,7 +11,7 @@ namespace fmri public: explicit InputLayerVisualisation(const LayerData &data); - void render() override; + void draw(float time) override; private: Texture texture; diff --git a/src/fmri/LayerVisualisation.hpp b/src/fmri/LayerVisualisation.hpp index 90cad82..f2bac86 100644 --- a/src/fmri/LayerVisualisation.hpp +++ b/src/fmri/LayerVisualisation.hpp @@ -2,10 +2,12 @@ #include #include "utils.hpp" +#include "Drawable.hpp" namespace fmri { class LayerVisualisation + : public Drawable { public: enum class Ordering { @@ -17,28 +19,15 @@ namespace fmri explicit LayerVisualisation(size_t numNodes); virtual ~LayerVisualisation() = default; - virtual void render() = 0; virtual const std::vector& nodePositions() const; - private: - static float getAlpha(); + protected: + float getAlpha() override; protected: std::vector nodePositions_; template void initNodePositions(size_t n, float spacing); - - template - void patchTransparancy(It begin, It end) - { - if constexpr (std::tuple_size::value >= 4) { - const auto alpha = getAlpha(); - for (; begin != end; ++begin) { - Color &color = *begin; - color[3] = alpha; - } - } - } }; } diff --git a/src/fmri/MultiImageVisualisation.cpp b/src/fmri/MultiImageVisualisation.cpp index 1487ece..d0ea7a4 100644 --- a/src/fmri/MultiImageVisualisation.cpp +++ b/src/fmri/MultiImageVisualisation.cpp @@ -25,7 +25,7 @@ MultiImageVisualisation::MultiImageVisualisation(const fmri::LayerData &layer) texCoordBuffer = getTexCoords(channels); } -void MultiImageVisualisation::render() +void MultiImageVisualisation::draw(float time) { float alpha = RenderingState::instance().layerAlpha(); drawImageTiles(vertexBuffer.size() / 3, vertexBuffer.data(), texCoordBuffer.data(), texture, alpha); diff --git a/src/fmri/MultiImageVisualisation.hpp b/src/fmri/MultiImageVisualisation.hpp index e70ff58..2e861d0 100644 --- a/src/fmri/MultiImageVisualisation.hpp +++ b/src/fmri/MultiImageVisualisation.hpp @@ -20,7 +20,7 @@ namespace fmri explicit MultiImageVisualisation(const LayerData&); - void render() override; + void draw(float time) override; static vector getVertices(const std::vector &nodePositions, float scaling = 1); static std::vector getTexCoords(int n); diff --git a/src/fmri/RenderingState.cpp b/src/fmri/RenderingState.cpp index f2e4a8b..9f20217 100644 --- a/src/fmri/RenderingState.cpp +++ b/src/fmri/RenderingState.cpp @@ -242,7 +242,7 @@ void RenderingState::render(float time) const glPushMatrix(); renderLayerName(currentData->at(i).name()); if (options.renderLayers) { - layerVisualisations[i]->render(); + layerVisualisations[i]->draw(time); } if (options.renderInteractions && i < interactionAnimations.size() && interactionAnimations[i]) { interactionAnimations[i]->draw(time);