]> git.localhorst.tv Git - blank.git/blobdiff - src/graphics/viewport.cpp
use entity's eyes to aim
[blank.git] / src / graphics / viewport.cpp
index 875da78d83c6ecb1913f5cfa61a45ebcc0cabbcb..e1719668eab185b4bf27b200de5d8d45d5a99f08 100644 (file)
@@ -1,5 +1,6 @@
 #include "Camera.hpp"
 #include "Canvas.hpp"
+#include "SkyBox.hpp"
 #include "Viewport.hpp"
 
 #include "../app/init.hpp"
@@ -44,6 +45,9 @@ void Camera::Clip(float n, float f) noexcept {
        UpdateProjection();
 }
 
+void Camera::View(const glm::mat4 &v) noexcept {
+       view = v;
+}
 
 void Camera::UpdateProjection() noexcept {
        projection = glm::perspective(fov, aspect, near, far);
@@ -73,6 +77,19 @@ void Canvas::UpdateProjection() noexcept {
 }
 
 
+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()
@@ -134,13 +151,9 @@ void Viewport::Resize(int w, int h) noexcept {
        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 {
@@ -228,6 +241,7 @@ SkyBoxShader &Viewport::SkyBoxProgram() noexcept {
        if (active_prog != SKY_BOX) {
                sky_prog.Activate();
                DisableBlending();
+               DisableBackfaceCulling();
                EqualDepthTest();
                active_prog = SKY_BOX;
        }
@@ -245,8 +259,12 @@ BlendedSprite &Viewport::SpriteProgram() noexcept {
 
 
 void Viewport::WorldPosition(const glm::mat4 &t) noexcept {
-       cam.View(glm::inverse(t));
-       chunk_prog.SetView(cam.View());
+       const glm::vec3 offset(0.0f, 0.0f, 0.0f);
+       //const glm::vec3 offset(0.0f, 0.0f, -5.0f);
+       cam.View(glm::translate(glm::inverse(t), glm::vec3(t * glm::vec4(offset, 0.0f))));
+       ChunkProgram().SetView(cam.View());
+       sky_prog.Activate();
+       SkyBoxProgram().SetView(cam.View());
 }
 
 }