diff --git a/engine/include/sophia/camera_2d.hpp b/engine/include/sophia/camera_2d.hpp new file mode 100644 index 0000000..177674c --- /dev/null +++ b/engine/include/sophia/camera_2d.hpp @@ -0,0 +1,31 @@ +#pragma once + +#define GLM_FORCE_RADIANS +#define GLM_FORCE_DEPTH_ZERO_TO_ONE + +#include +#include + +namespace sophia { + +class Camera2D { + public: + glm::vec2 position{0.f, 0.f}; + + void setProjection(float left, float right, float bottom, float top) { + projection = glm::ortho(left, right, bottom, top); + } + + const glm::mat4& getProjection() const { return projection; } + + glm::mat4 getView() const { + return glm::translate(glm::mat4(1.f), glm::vec3(-position, 0.f)); + } + + glm::mat4 getViewProjection() const { return projection * getView(); } + + private: + glm::mat4 projection{1.f}; +}; + +} // namespace sophia diff --git a/engine/include/sophia/canvas.hpp b/engine/include/sophia/canvas.hpp new file mode 100644 index 0000000..47d884e --- /dev/null +++ b/engine/include/sophia/canvas.hpp @@ -0,0 +1,42 @@ +#pragma once + +#include +#include +#include + +#define GLM_FORCE_RADIANS +#define GLM_FORCE_DEPTH_ZERO_TO_ONE +#include + +namespace sophia { + +class Application; + +struct CanvasVertex { + glm::vec2 position; + glm::vec3 color; +}; + +class Canvas { + public: + Canvas(const Canvas&) = delete; + Canvas& operator=(const Canvas&) = delete; + + ~Canvas(); + + void triangle(glm::vec2 a, glm::vec2 b, glm::vec2 c, + glm::vec3 color = {1.0f, 1.0f, 1.0f}); + void quad(glm::vec2 position, glm::vec2 size, + glm::vec3 color = {1.0f, 1.0f, 1.0f}); + void clear(); + + private: + friend class Application; + + Canvas(Application* application); + + class Impl; + std::unique_ptr impl; +}; + +} // namespace sophia diff --git a/engine/include/sophia/frame_info.hpp b/engine/include/sophia/frame_info.hpp index 1cbd013..b542555 100644 --- a/engine/include/sophia/frame_info.hpp +++ b/engine/include/sophia/frame_info.hpp @@ -1,5 +1,6 @@ #pragma once +#include #include #define GLM_FORCE_RADIANS @@ -13,6 +14,7 @@ struct FrameInfo { double elapsedTime; double deltaTime; glm::vec2 currentFramebufferExtent; + const Camera2D& camera; }; } // namespace sophia diff --git a/engine/src/canvas.cpp b/engine/src/canvas.cpp new file mode 100644 index 0000000..36c0ab8 --- /dev/null +++ b/engine/src/canvas.cpp @@ -0,0 +1,55 @@ +#include +#include + +namespace sophia { + +class Canvas::Impl { + public: + explicit Impl(Application* application) : application{application} {} + + void triangle(glm::vec2 a, glm::vec2 b, glm::vec2 c, + glm::vec3 color = {1.0f, 1.0f, 1.0f}) { + std::vector vertices{ + {a, color}, + {b, color}, + {c, color}, + }; + + application->pushModel(std::move(vertices), {}); + } + + void quad(glm::vec2 position, glm::vec2 size, + glm::vec3 color = {1.0f, 1.0f, 1.0f}) { + std::vector vertices{ + {position, color}, + {position + glm::vec2(size.x, 0.f), color}, + {position + size, color}, + {position + glm::vec2(0.f, size.y), color}, + }; + std::vector indices{0, 1, 2, 2, 3, 0}; + + application->pushModel(std::move(vertices), std::move(indices)); + } + + void clear() { application->clearModels(); } + + private: + Application* application; +}; + +Canvas::Canvas(Application* application) + : impl{std::make_unique(application)} {} + +Canvas::~Canvas() = default; + +void Canvas::triangle(glm::vec2 a, glm::vec2 b, glm::vec2 c, glm::vec3 color) { + impl->triangle(a, b, c, color); +} + +void Canvas::quad(glm::vec2 position, glm::vec2 size, glm::vec3 color) { + impl->quad(position, size, color); +} + +void Canvas::clear() { impl->clear(); } + +} // namespace sophia