Files
game-physics/Simulations/MassSpringSystemSimulator.h

71 lines
2.0 KiB
C++

#ifndef MASSSPRINGSYSTEMSIMULATOR_h
#define MASSSPRINGSYSTEMSIMULATOR_h
#include "Simulator.h"
#include "MassPoint.h"
#include "Spring.h"
// Do Not Change
#define EULER 0
#define LEAPFROG 1
#define MIDPOINT 2
// Do Not Change
class MassSpringSystemSimulator:public Simulator{
public:
// Construtors
MassSpringSystemSimulator();
// UI Functions
const char * getTestCasesStr();
void initUI(DrawingUtilitiesClass * DUC);
void reset();
void drawFrame(ID3D11DeviceContext* pd3dImmediateContext);
void notifyCaseChanged(int testCase);
void externalForcesCalculations(float timeElapsed);
void simulateTimestep(float timeStep);
void onClick(int x, int y);
void onMouse(int x, int y);
// Specific Functions
void setMass(float mass);
void setStiffness(float stiffness);
void setDampingFactor(float damping);
int addMassPoint(Vec3 position, Vec3 Velocity, bool isFixed);
void addSpring(int masspoint1, int masspoint2, float initialLength);
int getNumberOfMassPoints();
int getNumberOfSprings();
Vec3 getPositionOfMassPoint(int index);
Vec3 getVelocityOfMassPoint(int index);
void applyExternalForce(Vec3 force);
Vec3 calcualtePositionTimestepEuler(Vec3 oldPosition, float timestep, Vec3 veloctiy);
Vec3 calcualteVelocityTimestepEuler(Vec3 oldVelocity, float timestep, Vec3 acceleration);
Vec3 calculateAcceleration(Vec3 acceleration, float mass);
void Euler(MassPoint& masspoint1, MassPoint& masspoint2, Spring& spring, float timestep);
void printSpring(const Spring& spring);
// Do Not Change
void setIntegrator(int integrator) {
m_iIntegrator = integrator;
}
private:
// Data Attributes
float m_fMass;
float m_fStiffness;
float m_fDamping;
int m_iIntegrator;
// UI Attributes
Vec3 m_externalForce;
Point2D m_mouse;
Point2D m_trackmouse;
Point2D m_oldtrackmouse;
//Mass points and springs
std::vector<std::shared_ptr<MassPoint>> masspoints;
std::vector<Spring> springs;
};
#endif