#include "Camera.hpp"
#include "Canvas.hpp"
+#include "SkyBox.hpp"
#include "Viewport.hpp"
#include "../app/init.hpp"
-#include "../model/geometry.hpp"
+#include "../geometry/const.hpp"
#include <GL/glew.h>
#include <glm/gtc/matrix_transform.hpp>
UpdateProjection();
}
+void Camera::View(const glm::mat4 &v) noexcept {
+ view = v;
+}
void Camera::UpdateProjection() noexcept {
projection = glm::perspective(fov, aspect, near, far);
}
+SkyBox::SkyBox(CubeMap &&tex)
+: texture(std::move(tex))
+, mesh() {
+ mesh.LoadUnitBox();
+}
+
+void SkyBox::Render(Viewport &viewport) noexcept {
+ SkyBoxShader &prog = viewport.SkyBoxProgram();
+ prog.SetTexture(texture);
+ mesh.Draw();
+}
+
+
Viewport::Viewport()
: cam()
, canv()
, cursor(1.0f)
+, cam_offset(0.0f)
, chunk_prog()
, entity_prog()
+, sky_prog()
, sprite_prog()
, active_prog(NONE) {
glClearColor(0.0, 0.0, 0.0, 1.0);
glDepthFunc(GL_LESS);
}
+void Viewport::EqualDepthTest() noexcept {
+ glEnable(GL_DEPTH_TEST);
+ glDepthFunc(GL_LEQUAL);
+}
+
void Viewport::DisableDepthTest() noexcept {
glDisable(GL_DEPTH_TEST);
}
cam.Aspect(fw, fh);
canv.Resize(fw, fh);
- chunk_prog.SetProjection(Perspective());
- if (active_prog == HUD) {
- entity_prog.SetProjection(Ortho());
- } else {
- entity_prog.SetProjection(Perspective());
- }
- sprite_prog.SetProjection(Ortho());
+ ChunkProgram().SetProjection(Perspective());
+ SkyBoxProgram().SetProjection(Perspective());
+ SpriteProgram().SetProjection(Ortho());
}
void Viewport::Clear() noexcept {
}
-void Viewport::SetCursor(const glm::vec3 &pos) {
+glm::vec2 Viewport::GetPosition(const glm::vec2 &off, Gravity grav) const noexcept {
+ return align(grav, canv.Size(), off + canv.Offset());
+}
+
+void Viewport::SetCursor(const glm::vec3 &pos) noexcept {
cursor[3].x = pos.x;
cursor[3].y = pos.y;
cursor[3].z = pos.z;
}
-void Viewport::SetCursor(const glm::vec3 &pos, Gravity grav) {
- glm::vec2 p(align(grav, canv.Size(), glm::vec2(pos) + canv.Offset()));
+void Viewport::SetCursor(const glm::vec3 &pos, Gravity grav) noexcept {
+ glm::vec2 p(GetPosition(glm::vec2(pos), grav));
cursor[3].x = p.x;
cursor[3].y = p.y;
cursor[3].z = pos.z;
}
-void Viewport::MoveCursor(const glm::vec3 &d) {
+void Viewport::MoveCursor(const glm::vec3 &d) noexcept {
cursor[3].x += d.x;
cursor[3].y += d.y;
cursor[3].z += d.z;
return entity_prog;
}
+PlainColor &Viewport::WorldColorProgram() noexcept {
+ if (active_prog != COLOR_WORLD) {
+ color_prog.Activate();
+ color_prog.SetVP(cam.View(), cam.Projection());
+ active_prog = COLOR_WORLD;
+ }
+ return color_prog;
+}
+
+PlainColor &Viewport::HUDColorProgram() noexcept {
+ if (active_prog != COLOR_HUD) {
+ color_prog.Activate();
+ color_prog.SetVP(canv.View(), canv.Projection());
+ active_prog = COLOR_HUD;
+ }
+ return color_prog;
+}
+
+SkyBoxShader &Viewport::SkyBoxProgram() noexcept {
+ if (active_prog != SKY_BOX) {
+ sky_prog.Activate();
+ DisableBlending();
+ DisableBackfaceCulling();
+ EqualDepthTest();
+ active_prog = SKY_BOX;
+ }
+ return sky_prog;
+}
+
BlendedSprite &Viewport::SpriteProgram() noexcept {
if (active_prog != SPRITE) {
sprite_prog.Activate();
void Viewport::WorldPosition(const glm::mat4 &t) noexcept {
- cam.View(glm::inverse(t));
- chunk_prog.SetView(cam.View());
+ cam.View(glm::translate(glm::inverse(t), glm::vec3(t * glm::vec4(cam_offset, 0.0f))));
+ ChunkProgram().SetView(cam.View());
+ sky_prog.Activate();
+ SkyBoxProgram().SetView(cam.View());
}
}