diff --git a/src/fmri/ActivityAnimation.cpp b/src/fmri/ActivityAnimation.cpp index 16605e1..8257271 100644 --- a/src/fmri/ActivityAnimation.cpp +++ b/src/fmri/ActivityAnimation.cpp @@ -5,6 +5,8 @@ #include #include "Range.hpp" #include "ActivityAnimation.hpp" +#include "RenderingState.hpp" +#include "glutils.hpp" using namespace std; using namespace fmri; @@ -29,11 +31,13 @@ ActivityAnimation::ActivityAnimation( const std::vector>> &interactions, const float *aPositions, const float *bPositions, ColoringFunction coloring) : - bufferLength(3 * interactions.size()) + bufferLength(3 * interactions.size()), + delta(bufferLength) { CHECK(coloring) << "Invalid coloring function passed."; startingPos.reserve(bufferLength); - delta.reserve(bufferLength); + vector endPos; + endPos.reserve(bufferLength); colorBuf.reserve(interactions.size()); for (auto &entry : interactions) { @@ -44,9 +48,16 @@ ActivityAnimation::ActivityAnimation( for (auto i : Range(3)) { startingPos.emplace_back(aPos[i]); - delta.emplace_back(bPos[i] - aPos[i] + (i % 3 ? 0 : LAYER_X_OFFSET)); + endPos.emplace_back(bPos[i] + (i % 3 ? 0 : LAYER_X_OFFSET)); } } + + caffe::caffe_sub(endPos.size(), endPos.data(), startingPos.data(), delta.data()); + startingPos.insert(startingPos.end(), endPos.begin(), endPos.end()); + for (auto i : Range(interactions.size())) { + lineIndices.push_back(i); + lineIndices.push_back(i + interactions.size()); + } } void ActivityAnimation::draw(float timeScale) @@ -60,5 +71,11 @@ void ActivityAnimation::draw(float timeScale) glVertexPointer(3, GL_FLOAT, 0, vertexBuffer.data()); glDrawArrays(GL_POINTS, 0, bufferLength / 3); glDisableClientState(GL_COLOR_ARRAY); + if (RenderingState::instance().renderInteractionPaths()) { + glColor4f(1, 1, 1, 0.1); + glVertexPointer(3, GL_FLOAT, 0, startingPos.data()); + glDrawElements(GL_LINES, lineIndices.size(), GL_UNSIGNED_INT, lineIndices.data()); + checkGLErrors(); + } glDisableClientState(GL_VERTEX_ARRAY); } diff --git a/src/fmri/ActivityAnimation.hpp b/src/fmri/ActivityAnimation.hpp index dca62d2..8d1f534 100644 --- a/src/fmri/ActivityAnimation.hpp +++ b/src/fmri/ActivityAnimation.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include #include "Animation.hpp" @@ -30,5 +31,6 @@ namespace fmri std::vector> colorBuf; std::vector startingPos; std::vector delta; + std::vector lineIndices; }; } diff --git a/src/fmri/RenderingState.cpp b/src/fmri/RenderingState.cpp index 02c924f..23fc5ba 100644 --- a/src/fmri/RenderingState.cpp +++ b/src/fmri/RenderingState.cpp @@ -94,6 +94,10 @@ void RenderingState::handleKey(unsigned char x) reset(); break; + case 'p': + toggle(options.renderInteractionPaths); + break; + case 'o': toggle(options.activatedOnly); break; @@ -254,6 +258,7 @@ void RenderingState::renderOverlayText() const "l: toggle layers visible\n" "i: toggle interactions visible\n" "o: toggle activated nodes only\n" + "p: toggle interaction paths visible\n" "q: quit\n"; } @@ -312,3 +317,8 @@ bool RenderingState::renderActivatedOnly() const { return options.activatedOnly; } + +bool RenderingState::renderInteractionPaths() const +{ + return options.renderInteractionPaths; +} diff --git a/src/fmri/RenderingState.hpp b/src/fmri/RenderingState.hpp index 77033e1..96287ec 100644 --- a/src/fmri/RenderingState.hpp +++ b/src/fmri/RenderingState.hpp @@ -43,6 +43,7 @@ namespace fmri * @return Whether the network should only render activated nodes, rather than all of them. */ bool renderActivatedOnly() const; + bool renderInteractionPaths() const; static RenderingState& instance(); @@ -53,6 +54,7 @@ namespace fmri bool renderLayers = true; bool renderInteractions = true; bool activatedOnly = false; + bool renderInteractionPaths = false; } options; std::array pos; std::array angle; diff --git a/src/fmri/main.cpp b/src/fmri/main.cpp index 8e76afd..282d148 100644 --- a/src/fmri/main.cpp +++ b/src/fmri/main.cpp @@ -54,7 +54,7 @@ int main(int argc, char *argv[]) google::InstallFailureSignalHandler(); glutInit(&argc, argv); - glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA); + glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA | GLUT_ALPHA); glutCreateWindow(argv[0]); // Prepare data for simulations @@ -77,7 +77,7 @@ int main(int argc, char *argv[]) glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); glEnable(GL_BLEND); - glBlendFunc(GL_DST_ALPHA,GL_ONE_MINUS_DST_ALPHA); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Start visualisation glutMainLoop(); diff --git a/src/fmri/utils.cpp b/src/fmri/utils.cpp index f16ce36..c0a0d6a 100644 --- a/src/fmri/utils.cpp +++ b/src/fmri/utils.cpp @@ -21,7 +21,7 @@ const std::vector & fmri::animate(const std::vector &start, const static std::vector vertexBuffer; vertexBuffer = delta; caffe::caffe_scal(vertexBuffer.size(), time, vertexBuffer.data()); - caffe::caffe_add(start.size(), vertexBuffer.data(), start.data(), vertexBuffer.data()); + caffe::caffe_add(vertexBuffer.size(), vertexBuffer.data(), start.data(), vertexBuffer.data()); return vertexBuffer; }