Spieleprogrammierung/RubiksCube/SceneInterface.h
2025-01-19 14:17:36 +01:00

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;
};