diff --git a/src/fmri/camera.cpp b/src/fmri/RenderingState.cpp similarity index 54% rename from src/fmri/camera.cpp rename to src/fmri/RenderingState.cpp index 0254857..a95bc30 100644 --- a/src/fmri/camera.cpp +++ b/src/fmri/RenderingState.cpp @@ -1,24 +1,33 @@ -#include +#include #include #include #include -#include "camera.hpp" +#include "RenderingState.hpp" #include "utils.hpp" using namespace fmri; -using namespace std; -static Camera& camera = Camera::instance(); +static RenderingState& state = RenderingState::instance(); +/** + * Static utility function to bind to GLUT. + * + * @param x + * @param y + */ static void handleMouseMove(int x, int y) { - const float width = glutGet(GLUT_WINDOW_WIDTH) / 2; - const float height = glutGet(GLUT_WINDOW_HEIGHT) / 2; + state.handleMouseAt(x, y); +} - camera.angle[0] = (x - width) / width * 180; - camera.angle[1] = (y - height) / height * 90; - - glutPostRedisplay(); +/** + * Static utility function to bind to GLUT. + * + * @param key + */ +static void handleKeys(unsigned char key, int, int) +{ + state.handleKey(key); } static float getFPS() @@ -39,22 +48,22 @@ static float getFPS() return fps; } -static void move(unsigned char key) +void RenderingState::move(unsigned char key) { float speed = 0.5; float dir[3]; - const auto yaw = deg2rad(camera.angle[0]); - const auto pitch = deg2rad(camera.angle[1]); + const auto yaw = deg2rad(state.angle[0]); + const auto pitch = deg2rad(state.angle[1]); if (key == 'w' || key == 's') { - dir[0] = sin(yaw) * cos(pitch); - dir[1] = -sin(pitch); - dir[2] = -cos(yaw) * cos(pitch); + dir[0] = std::sin(yaw) * std::cos(pitch); + dir[1] = -std::sin(pitch); + dir[2] = -std::cos(yaw) * std::cos(pitch); } else { - dir[0] = -cos(yaw); + dir[0] = -std::cos(yaw); dir[1] = 0; - dir[2] = -sin(yaw); + dir[2] = -std::sin(yaw); } if (key == 's' || key == 'd') { @@ -62,27 +71,25 @@ static void move(unsigned char key) } for (auto i = 0; i < 3; ++i) { - camera.pos[i] += speed * dir[i]; + pos[i] += speed * dir[i]; } } -static void handleKeys(unsigned char key, int, int) +void RenderingState::handleKey(unsigned char x) { - switch (key) { + switch (x) { case 'w': case 'a': case 's': case 'd': - move(key); + move(x); break; case 'q': - // Utility quit function. - glutLeaveMainLoop(); - break; + exit(0); case 'h': - camera.reset(); + state.reset(); break; default: @@ -93,16 +100,16 @@ static void handleKeys(unsigned char key, int, int) glutPostRedisplay(); } -std::string Camera::infoLine() +std::string RenderingState::infoLine() { - stringstream buffer; + std::stringstream buffer; buffer << "Pos(x,y,z) = (" << pos[0] << ", " << pos[1] << ", " << pos[2] << ")\n"; buffer << "Angle(p,y) = (" << angle[0] << ", " << angle[1] << ")\n"; buffer << "FPS = " << getFPS() << "\n"; return buffer.str(); } -void Camera::reset() +void RenderingState::reset() { pos[0] = 0; pos[1] = 0; @@ -112,7 +119,7 @@ void Camera::reset() angle[1] = 0; } -void Camera::configureRenderingContext() +void RenderingState::configureRenderingContext() { glLoadIdentity(); glRotatef(angle[1], 1, 0, 0); @@ -120,15 +127,26 @@ void Camera::configureRenderingContext() glTranslatef(-pos[0], -pos[1], -pos[2]); } -Camera &Camera::instance() +RenderingState &RenderingState::instance() { - static Camera camera; - return camera; + static RenderingState state; + return state; } -void Camera::registerControls() +void RenderingState::registerControls() { reset(); glutPassiveMotionFunc(handleMouseMove); glutKeyboardFunc(handleKeys); } + +void RenderingState::handleMouseAt(int x, int y) +{ + const float width = glutGet(GLUT_WINDOW_WIDTH) / 2.f; + const float height = glutGet(GLUT_WINDOW_HEIGHT) / 2.f; + + angle[0] = (x - width) / width * 180; + angle[1] = (y - height) / height * 90; + + glutPostRedisplay(); +} diff --git a/src/fmri/RenderingState.hpp b/src/fmri/RenderingState.hpp new file mode 100644 index 0000000..7212cad --- /dev/null +++ b/src/fmri/RenderingState.hpp @@ -0,0 +1,43 @@ +#pragma once + +#include + +namespace fmri +{ + /** + * Singleton class defining the state of the current rendering. + * + * This class manages the currently loaded data and any related visualisations. + */ + class RenderingState { + public: + /** + * Reset the rendering state + */ + void reset(); + void configureRenderingContext(); + void registerControls(); + /** + * GLUT mouse handler function + * @param x coordinate + * @param y coordinate + */ + void handleMouseAt(int x, int y); + /** + * GLUT keyboard handler function + * @param x + */ + void handleKey(unsigned char x); + std::string infoLine(); + + static RenderingState& instance(); + + private: + float pos[3]; + float angle[2]; + + RenderingState() noexcept = default; + + void move(unsigned char key); + }; +} diff --git a/src/fmri/camera.hpp b/src/fmri/camera.hpp deleted file mode 100644 index fc7a75d..0000000 --- a/src/fmri/camera.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include - -namespace fmri -{ - struct Camera { - float pos[3]; - float angle[2]; - - void reset(); - void configureRenderingContext(); - void registerControls(); - std::string infoLine(); - - static Camera& instance(); - - private: - Camera() noexcept = default; - }; -} diff --git a/src/fmri/main.cpp b/src/fmri/main.cpp index 9780636..ca9db44 100644 --- a/src/fmri/main.cpp +++ b/src/fmri/main.cpp @@ -8,7 +8,7 @@ #include "Options.hpp" #include "Simulator.hpp" #include "glutils.hpp" -#include "camera.hpp" +#include "RenderingState.hpp" #include "LayerVisualisation.hpp" #include "Range.hpp" #include "visualisations.hpp" @@ -67,7 +67,7 @@ static void renderDebugInfo() glLoadIdentity(); setOrthographicProjection(); glColor3f(1, 1, 0); - renderText(Camera::instance().infoLine(), 2, 10); + renderText(RenderingState::instance().infoLine(), 2, 10); restorePerspectiveProjection(); } @@ -76,7 +76,7 @@ static void render() // Clear Color and Depth Buffers glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - auto& camera = Camera::instance(); + auto& camera = RenderingState::instance(); camera.configureRenderingContext(); @@ -192,7 +192,7 @@ int main(int argc, char *argv[]) glutReshapeFunc(changeWindowSize); glutSpecialFunc(specialKeyFunc); - Camera::instance().registerControls(); + RenderingState::instance().registerControls(); rendererData.currentData = rendererData.data.begin(); updateVisualisers(); diff --git a/src/fmri/visualisations.cpp b/src/fmri/visualisations.cpp index e9ae975..df98b5e 100644 --- a/src/fmri/visualisations.cpp +++ b/src/fmri/visualisations.cpp @@ -125,26 +125,9 @@ static Animation *getFullyConnectedAnimation(const fmri::LayerData &prevState, c if (abs(interactions[i]) < EPSILON){ break; } - result.emplace_back(interactions[i], make_pair((i % shape[1]), i / shape[1])); + result.emplace_back(interactions[i], make_pair((i % shape[1]) / normalizer, i / shape[1])); } - for (auto entry : result) { - if (prevState.data()[entry.second.first] < EPSILON) { - std::cerr << "Error in data!" << entry.first << " " - << entry.second.first << " " << entry.second.second - << " " << prevState.data()[entry.second.first] << " " - << "\n"; - } - } - - if (normalizer != 1) { - for (auto& entry : result) { - entry.second.first /= normalizer; - } - } - - cerr.flush(); - return new ActivityAnimation(result, prevPositions.data(), curPositions.data()); }