#pragma once #include #include "Plane.h" #include "InputSystem.h" #include "GameInterface.h" #include "Shader.h" #include "Cube.h" #include #include struct Action { glm::ivec3 axis; int index; double duration; Action() : axis(glm::ivec3(0)), index(0), duration(0.0f) { } Action(const glm::ivec3& axis, int index, double duration) : axis(axis), index(index), duration(duration) { } }; class SceneInterface : public GameInterface { private: Cube _cube; std::queue _actions; Action currentAction; InputSystem _inputSystem; glm::quat _orientation; bool _wasMouseDown; glm::vec2 _initialMouseLocation; Plane _plane; glm::vec2 _mousePositionPlane; glm::mat4 _view; glm::mat4 _perspective; GLuint _shaderProgram; GLuint _transformLocation; GLuint _arrayBufferObject; GLuint _vertexBufferObject; const float MIN_DRAG_MAGNITUDE = 0.16f; void ApplyAction(const Action& action); void OnDragStart(); void OnDrag(double deltaTime); void OnDragStop(); public: void Initialize(GLFWwindow* window) override; void Update(float deltaTime) override; void Render(float aspectRatio) override; void EnqueueAction(const Action& action); void ClearResources() override; };