Add new animation class.

This commit is contained in:
2018-01-22 14:05:35 +01:00
parent c45a684d39
commit aeccd2b772
2 changed files with 68 additions and 0 deletions

48
src/ActivityAnimation.cpp Normal file
View File

@@ -0,0 +1,48 @@
#include <cmath>
#include <cstring>
#include <random>
#include <GL/gl.h>
#include "ActivityAnimation.hpp"
#include "utils.hpp"
using namespace fmri;
static inline float correct_timescale(float original)
{
float ignore;
return std::modf(original, &ignore);
}
ActivityAnimation::ActivityAnimation(std::size_t count, const float *aPos, const float *bPos, const float xDist) :
bufferLength(3 * count),
startingPos(new float[bufferLength]),
delta(new float[bufferLength]),
offset(new float[count])
{
memcpy(startingPos.get(), aPos, sizeof(aPos[0]) * bufferLength);
for (int i = 0; i < bufferLength; ++i) {
delta[i] = bPos[i] - aPos[i];
}
auto& random = rng();
std::uniform_real_distribution<float> rd;
for (int i = 0; i < count; ++i) {
offset[i] = rd(random);
delta[3 * i] += xDist;
}
}
void ActivityAnimation::draw(float timeScale) const
{
std::unique_ptr<float[]> vertexBuffer(new float[bufferLength]);
for (auto i = 0; i < bufferLength; ++i) {
vertexBuffer[i] = startingPos[i] + correct_timescale(offset[i/3] + timeScale) * delta[i];
}
glColor3f(1, 1, 1);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertexBuffer.get());
glDrawArrays(GL_POINTS, bufferLength / 3, bufferLength);
glDisableClientState(GL_VERTEX_ARRAY);
}

20
src/ActivityAnimation.hpp Normal file
View File

@@ -0,0 +1,20 @@
#pragma once
#include <cstddef>
#include <memory>
namespace fmri
{
class ActivityAnimation
{
public:
ActivityAnimation(std::size_t count, const float* aPos, const float* bPos, const float xDist);
void draw(float timeScale) const;
private:
std::size_t bufferLength;
std::unique_ptr<float[]> startingPos;
std::unique_ptr<float[]> delta;
std::unique_ptr<float[]> offset;
};
}