111 lines
2.2 KiB
C++
111 lines
2.2 KiB
C++
#pragma once
|
|
|
|
#include <queue>
|
|
|
|
#include "Debug.h"
|
|
#include "Plane.h"
|
|
#include "InputSystem.h"
|
|
#include "GameInterface.h"
|
|
#include "Camera.h"
|
|
#include "Shader.h"
|
|
#include "Cube.h"
|
|
|
|
#include <glm/ext/quaternion_float.hpp>
|
|
|
|
#include <gl/glew.h>
|
|
|
|
struct Action {
|
|
protected:
|
|
Cube* _cube;
|
|
|
|
public:
|
|
double duration;
|
|
|
|
Action(Cube* cube, double duration) : _cube(cube), duration(duration) { }
|
|
virtual void Invoke() = 0;
|
|
};
|
|
|
|
struct ActionSpinDefault : public Action {
|
|
glm::ivec3 axis;
|
|
int index;
|
|
|
|
ActionSpinDefault() : Action(nullptr, 0.0f), axis(glm::ivec3(0)), index(0) { }
|
|
|
|
ActionSpinDefault(Cube* cube, const glm::ivec3& axis, int index, double duration)
|
|
: Action(cube, duration), axis(axis), index(index) {
|
|
|
|
}
|
|
|
|
void Invoke() override {
|
|
_cube->TransformAnimation(axis, index, glm::radians(90.0f), duration);
|
|
|
|
_cube->TransformData(axis, index, 1);
|
|
}
|
|
};
|
|
|
|
struct ActionSpinAfterDragging : public Action {
|
|
glm::ivec3 axis;
|
|
int index;
|
|
float angle;
|
|
int turns;
|
|
|
|
ActionSpinAfterDragging() : Action(nullptr, 0.0f), axis(glm::ivec3(0)), index(0), angle(0.0f), turns(0) { }
|
|
|
|
ActionSpinAfterDragging(Cube* cube, const glm::ivec3& axis, int index, float angle, int turns, double duration)
|
|
: Action(cube, duration), axis(axis), index(index), angle(angle), turns(turns) {
|
|
|
|
}
|
|
|
|
void Invoke() override {
|
|
_cube->TransformAnimation(axis, index, angle, duration);
|
|
|
|
_cube->TransformData(axis, index, turns);
|
|
}
|
|
};
|
|
|
|
class SceneInterface : public GameInterface
|
|
{
|
|
private:
|
|
Cube* _cube;
|
|
Camera* _camera;
|
|
|
|
std::vector<Entity*> _entities;
|
|
|
|
std::queue<Action*> _actions;
|
|
Action* currentAction;
|
|
|
|
Debug* _debug;
|
|
|
|
InputSystem _inputSystem;
|
|
|
|
bool _wasMouseDown;
|
|
glm::vec2 _initialMouseLocation;
|
|
Plane _plane;
|
|
glm::vec2 _mousePositionPlane;
|
|
|
|
int _spinIndex;
|
|
glm::ivec3 _spinAxis;
|
|
float _spinDelta;
|
|
|
|
const float MIN_DRAG_MAGNITUDE = 0.16f;
|
|
|
|
void ApplyAction(Action* action);
|
|
|
|
void OnDragStart();
|
|
void OnDrag(double deltaTime);
|
|
void OnDragStop();
|
|
|
|
public:
|
|
SceneInterface();
|
|
~SceneInterface();
|
|
|
|
void Initialize(GLFWwindow* window) override;
|
|
|
|
void Update(float deltaTime) override;
|
|
void Render(float aspectRatio) override;
|
|
|
|
void EnqueueAction(Action* action);
|
|
|
|
void ClearResources() override;
|
|
};
|