X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fapp.cpp;h=5a5d6fba176376ab1052cec778afe9dd90c242e2;hb=6af76d9e1a6499ebdab405c1d679d24b9e19fded;hp=b398e9c20e4e032e7c6b9d59df18a39746e7239a;hpb=ac8765b510707d77cac9620778f40ddf3a4ad2a2;p=blank.git diff --git a/src/app.cpp b/src/app.cpp index b398e9c..5a5d6fb 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -1,5 +1,7 @@ #include "app.hpp" +#include "geometry.hpp" + #include #include @@ -20,6 +22,9 @@ Application::Application() , blockType() , cam() , chunk() +, outline() +, outline_visible(false) +, outline_transform(1.0f) , light_position(17.0f, 17.0f, 17.0f) , light_color(1.0f, 1.0f, 1.0f) , light_power(250.0f) @@ -130,6 +135,23 @@ Application::Application() chunk.BlockAt(glm::vec3(2, 2, 1)) = Block(blockType[2]); chunk.Invalidate(); + outline.vertices = std::vector({ + { 0.0f, 0.0f, 0.0f }, { 1.0f, 0.0f, 0.0f }, + { 1.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 0.0f }, + { 1.0f, 1.0f, 0.0f }, { 0.0f, 1.0f, 0.0f }, + { 0.0f, 1.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 1.0f }, + { 1.0f, 0.0f, 0.0f }, { 1.0f, 0.0f, 1.0f }, + { 1.0f, 1.0f, 0.0f }, { 1.0f, 1.0f, 1.0f }, + { 0.0f, 1.0f, 0.0f }, { 0.0f, 1.0f, 1.0f }, + { 0.0f, 0.0f, 1.0f }, { 1.0f, 0.0f, 1.0f }, + { 1.0f, 0.0f, 1.0f }, { 1.0f, 1.0f, 1.0f }, + { 1.0f, 1.0f, 1.0f }, { 0.0f, 1.0f, 1.0f }, + { 0.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 1.0f }, + }); + outline.colors.resize(24, { -1, -1, -1 }); + outline.Invalidate(); + m_handle = program.UniformLocation("M"); v_handle = program.UniformLocation("V"); mv_handle = program.UniformLocation("MV"); @@ -141,10 +163,6 @@ Application::Application() glClearColor(0.0, 0.0, 0.0, 1.0); } -Application::~Application() { - -} - void Application::Run() { running = true; @@ -234,6 +252,17 @@ void Application::Update(int dt) { cam.OrientationVelocity(vel); cam.Update(dt); + + Ray aim = cam.Aim(); + int blkid; + float dist; + if (chunk.Intersection(aim, glm::mat4(1.0f), &blkid, &dist)) { + glm::vec3 pos = Chunk::ToCoords(blkid); + outline_visible = true; + outline_transform = glm::translate(glm::mat4(1.0f), pos); + } else { + outline_visible = false; + } } void Application::Render() { @@ -253,6 +282,14 @@ void Application::Render() { glUniform1f(light_power_handle, light_power); chunk.Draw(); + if (outline_visible) { + mv = cam.View() * outline_transform; + mvp = cam.MakeMVP(outline_transform); + glUniformMatrix4fv(m_handle, 1, GL_FALSE, &m[0][0]); + glUniformMatrix4fv(mv_handle, 1, GL_FALSE, &mv[0][0]); + glUniformMatrix4fv(mvp_handle, 1, GL_FALSE, &mvp[0][0]); + outline.Draw(); + } window.Flip(); }