3 #include "Viewport.hpp"
5 #include "../app/init.hpp"
6 #include "../model/geometry.hpp"
9 #include <glm/gtc/matrix_transform.hpp>
10 #include <glm/gtx/transform.hpp>
16 Camera::Camera() noexcept
21 , projection(glm::perspective(fov, aspect, near, far))
27 void Camera::FOV(float f) noexcept {
32 void Camera::Aspect(float r) noexcept {
37 void Camera::Aspect(float w, float h) noexcept {
41 void Camera::Clip(float n, float f) noexcept {
48 void Camera::UpdateProjection() noexcept {
49 projection = glm::perspective(fov, aspect, near, far);
53 Canvas::Canvas() noexcept
58 , projection(glm::ortho(offset.x, size.x, size.y, offset.y, near, far))
64 void Canvas::Resize(float w, float h) noexcept {
71 void Canvas::UpdateProjection() noexcept {
72 projection = glm::ortho(offset.x, size.x, size.y, offset.y, near, far);
84 glClearColor(0.0, 0.0, 0.0, 1.0);
87 void Viewport::VSync(bool b) noexcept {
88 if (SDL_GL_SetSwapInterval(b) != 0) {
89 throw SDLError("SDL_GL_SetSwapInterval");
93 void Viewport::EnableDepthTest() noexcept {
94 glEnable(GL_DEPTH_TEST);
98 void Viewport::DisableDepthTest() noexcept {
99 glDisable(GL_DEPTH_TEST);
102 void Viewport::EnableBackfaceCulling() noexcept {
103 glEnable(GL_CULL_FACE);
106 void Viewport::DisableBackfaceCulling() noexcept {
107 glDisable(GL_CULL_FACE);
110 void Viewport::EnableAlphaBlending() noexcept {
112 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
115 void Viewport::EnableInvertBlending() noexcept {
117 glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
120 void Viewport::DisableBlending() noexcept {
124 void Viewport::Resize(int w, int h) noexcept {
125 glViewport(0, 0, w, h);
131 center = glm::translate(glm::vec3(fw * 0.5f, fh * 0.5f, 0.0f));
133 chunk_prog.SetProjection(Perspective());
134 if (active_prog == HUD) {
135 entity_prog.SetProjection(Ortho());
137 entity_prog.SetProjection(Perspective());
139 sprite_prog.SetProjection(Ortho());
142 void Viewport::Clear() noexcept {
143 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
146 void Viewport::ClearDepth() noexcept {
147 glClear(GL_DEPTH_BUFFER_BIT);
151 BlockLighting &Viewport::ChunkProgram() noexcept {
152 if (active_prog != CHUNK) {
153 chunk_prog.Activate();
155 EnableBackfaceCulling();
162 DirectionalLighting &Viewport::EntityProgram() noexcept {
163 if (active_prog != ENTITY) {
164 entity_prog.Activate();
166 EnableBackfaceCulling();
168 entity_prog.SetVP(cam.View(), cam.Projection());
169 active_prog = ENTITY;
174 DirectionalLighting &Viewport::HUDProgram() noexcept {
175 if (active_prog != HUD) {
176 entity_prog.Activate();
178 EnableBackfaceCulling();
179 entity_prog.SetVP(canv.View(), canv.Projection());
185 BlendedSprite &Viewport::SpriteProgram() noexcept {
186 if (active_prog != SPRITE) {
187 sprite_prog.Activate();
188 EnableAlphaBlending();
189 active_prog = SPRITE;
195 void Viewport::WorldPosition(const glm::mat4 &t) noexcept {
196 cam.View(glm::inverse(t));
197 chunk_prog.SetView(cam.View());