X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fgraphics%2Fviewport.cpp;h=ddc609baad6599a88012ba8b8dd4128c31e600a2;hb=2e3774eb3f2d5d23a08731175b168566457e2192;hp=48bd5ee32ce017751f436a25a8228a51f5703059;hpb=a32b120a2c06d3c7ad6a217bc46bba9e76d75d93;p=blank.git diff --git a/src/graphics/viewport.cpp b/src/graphics/viewport.cpp index 48bd5ee..ddc609b 100644 --- a/src/graphics/viewport.cpp +++ b/src/graphics/viewport.cpp @@ -1,5 +1,6 @@ #include "Camera.hpp" #include "Canvas.hpp" +#include "SkyBox.hpp" #include "Viewport.hpp" #include "../app/init.hpp" @@ -73,12 +74,26 @@ void Canvas::UpdateProjection() noexcept { } +SkyBox::SkyBox(CubeMap &&tex) +: texture(std::move(tex)) +, model() { + model.LoadUnitBox(); +} + +void SkyBox::Render(Viewport &viewport) noexcept { + SkyBoxShader &prog = viewport.SkyBoxProgram(); + prog.SetTexture(texture); + model.Draw(); +} + + Viewport::Viewport() : cam() , canv() , cursor(1.0f) , chunk_prog() , entity_prog() +, sky_prog() , sprite_prog() , active_prog(NONE) { glClearColor(0.0, 0.0, 0.0, 1.0); @@ -95,6 +110,11 @@ void Viewport::EnableDepthTest() noexcept { glDepthFunc(GL_LESS); } +void Viewport::EqualDepthTest() noexcept { + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LEQUAL); +} + void Viewport::DisableDepthTest() noexcept { glDisable(GL_DEPTH_TEST); } @@ -128,13 +148,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 { @@ -218,6 +234,17 @@ PlainColor &Viewport::HUDOutlineProgram() noexcept { return outline_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(); @@ -230,7 +257,9 @@ BlendedSprite &Viewport::SpriteProgram() noexcept { void Viewport::WorldPosition(const glm::mat4 &t) noexcept { cam.View(glm::inverse(t)); - chunk_prog.SetView(cam.View()); + ChunkProgram().SetView(cam.View()); + sky_prog.Activate(); + SkyBoxProgram().SetView(cam.View()); } }