4 #include "Viewport.hpp"
6 #include "../app/init.hpp"
7 #include "../model/geometry.hpp"
10 #include <glm/gtc/matrix_transform.hpp>
11 #include <glm/gtx/transform.hpp>
17 Camera::Camera() noexcept
22 , projection(glm::perspective(fov, aspect, near, far))
28 void Camera::FOV(float f) noexcept {
33 void Camera::Aspect(float r) noexcept {
38 void Camera::Aspect(float w, float h) noexcept {
42 void Camera::Clip(float n, float f) noexcept {
49 void Camera::UpdateProjection() noexcept {
50 projection = glm::perspective(fov, aspect, near, far);
54 Canvas::Canvas() noexcept
59 , projection(glm::ortho(offset.x, size.x, size.y, offset.y, near, far))
65 void Canvas::Resize(float w, float h) noexcept {
72 void Canvas::UpdateProjection() noexcept {
73 projection = glm::ortho(offset.x, size.x, size.y, offset.y, near, far);
77 SkyBox::SkyBox(CubeMap &&tex)
78 : texture(std::move(tex))
83 void SkyBox::Render(Viewport &viewport) noexcept {
84 SkyBoxShader &prog = viewport.SkyBoxProgram();
85 prog.SetTexture(texture);
99 glClearColor(0.0, 0.0, 0.0, 1.0);
102 void Viewport::VSync(bool b) noexcept {
103 if (SDL_GL_SetSwapInterval(b) != 0) {
104 throw SDLError("SDL_GL_SetSwapInterval");
108 void Viewport::EnableDepthTest() noexcept {
109 glEnable(GL_DEPTH_TEST);
110 glDepthFunc(GL_LESS);
113 void Viewport::EqualDepthTest() noexcept {
114 glEnable(GL_DEPTH_TEST);
115 glDepthFunc(GL_LEQUAL);
118 void Viewport::DisableDepthTest() noexcept {
119 glDisable(GL_DEPTH_TEST);
122 void Viewport::EnableBackfaceCulling() noexcept {
123 glEnable(GL_CULL_FACE);
126 void Viewport::DisableBackfaceCulling() noexcept {
127 glDisable(GL_CULL_FACE);
130 void Viewport::EnableAlphaBlending() noexcept {
132 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
135 void Viewport::EnableInvertBlending() noexcept {
137 glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);
140 void Viewport::DisableBlending() noexcept {
144 void Viewport::Resize(int w, int h) noexcept {
145 glViewport(0, 0, w, h);
151 chunk_prog.SetProjection(Perspective());
152 if (active_prog == HUD) {
153 entity_prog.SetProjection(Ortho());
155 entity_prog.SetProjection(Perspective());
157 sky_prog.SetProjection(Perspective());
158 sprite_prog.SetProjection(Ortho());
161 void Viewport::Clear() noexcept {
162 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
165 void Viewport::ClearDepth() noexcept {
166 glClear(GL_DEPTH_BUFFER_BIT);
170 void Viewport::SetCursor(const glm::vec3 &pos) {
176 void Viewport::SetCursor(const glm::vec3 &pos, Gravity grav) {
177 glm::vec2 p(align(grav, canv.Size(), glm::vec2(pos) + canv.Offset()));
183 void Viewport::MoveCursor(const glm::vec3 &d) {
190 BlockLighting &Viewport::ChunkProgram() noexcept {
191 if (active_prog != CHUNK) {
192 chunk_prog.Activate();
194 EnableBackfaceCulling();
201 DirectionalLighting &Viewport::EntityProgram() noexcept {
202 if (active_prog != ENTITY) {
203 entity_prog.Activate();
205 EnableBackfaceCulling();
207 entity_prog.SetVP(cam.View(), cam.Projection());
208 active_prog = ENTITY;
213 DirectionalLighting &Viewport::HUDProgram() noexcept {
214 if (active_prog != HUD) {
215 entity_prog.Activate();
217 EnableBackfaceCulling();
218 entity_prog.SetVP(canv.View(), canv.Projection());
224 PlainColor &Viewport::WorldOutlineProgram() noexcept {
225 if (active_prog != OUTLINE_WORLD) {
226 outline_prog.Activate();
227 outline_prog.SetVP(cam.View(), cam.Projection());
228 active_prog = OUTLINE_WORLD;
233 PlainColor &Viewport::HUDOutlineProgram() noexcept {
234 if (active_prog != OUTLINE_HUD) {
235 outline_prog.Activate();
236 outline_prog.SetVP(canv.View(), canv.Projection());
237 active_prog = OUTLINE_HUD;
242 SkyBoxShader &Viewport::SkyBoxProgram() noexcept {
243 if (active_prog != SKY_BOX) {
246 DisableBackfaceCulling();
248 active_prog = SKY_BOX;
253 BlendedSprite &Viewport::SpriteProgram() noexcept {
254 if (active_prog != SPRITE) {
255 sprite_prog.Activate();
256 EnableAlphaBlending();
257 active_prog = SPRITE;
263 void Viewport::WorldPosition(const glm::mat4 &t) noexcept {
264 cam.View(glm::inverse(t));
265 chunk_prog.SetView(cam.View());
266 sky_prog.SetView(cam.View());