#pragma once #include #include "Debug.h" #include "Plane.h" #include "InputSystem.h" #include "GameInterface.h" #include "Camera.h" #include "Shader.h" #include "Cube.h" #include #include 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 _entities; std::queue _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; };