X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fapp.cpp;h=c418660ec48d209be4fef8ba2074c3aa1bb192ee;hb=2d8c7c015478a4528c0909f11d43998b1393948d;hp=652e1c1bbcac54a3ba9157520fd3de69873e936a;hpb=3baab6cca7423d55ea08288d96570b02380b1fe9;p=blank.git diff --git a/src/app.cpp b/src/app.cpp index 652e1c1..c418660 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -1,5 +1,7 @@ #include "app.hpp" +#include "geometry.hpp" + #include #include @@ -17,126 +19,15 @@ Application::Application() , move_velocity(0.003f) , pitch_sensitivity(-0.0025f) , yaw_sensitivity(-0.001f) +, blockType() , cam() -, model({ - // vertices - { 0.0f, 0.0f, 1.0f }, // front, red - { 1.0f, 0.0f, 1.0f }, - { 0.0f, 1.0f, 1.0f }, - { 1.0f, 0.0f, 1.0f }, - { 1.0f, 1.0f, 1.0f }, - { 0.0f, 1.0f, 1.0f }, - { 0.0f, 0.0f, 0.0f }, // back, cyan - { 0.0f, 1.0f, 0.0f }, - { 1.0f, 0.0f, 0.0f }, - { 1.0f, 0.0f, 0.0f }, - { 0.0f, 1.0f, 0.0f }, - { 1.0f, 1.0f, 0.0f }, - { 0.0f, 1.0f, 0.0f }, // top, green - { 0.0f, 1.0f, 1.0f }, - { 1.0f, 1.0f, 0.0f }, - { 1.0f, 1.0f, 0.0f }, - { 0.0f, 1.0f, 1.0f }, - { 1.0f, 1.0f, 1.0f }, - { 0.0f, 0.0f, 0.0f }, // bottom, magenta - { 1.0f, 0.0f, 0.0f }, - { 0.0f, 0.0f, 1.0f }, - { 1.0f, 0.0f, 0.0f }, - { 1.0f, 0.0f, 1.0f }, - { 0.0f, 0.0f, 1.0f }, - { 0.0f, 0.0f, 0.0f }, // left, blue - { 0.0f, 0.0f, 1.0f }, - { 0.0f, 1.0f, 0.0f }, - { 0.0f, 1.0f, 0.0f }, - { 0.0f, 0.0f, 1.0f }, - { 0.0f, 1.0f, 1.0f }, - { 1.0f, 0.0f, 0.0f }, // right, yellow - { 1.0f, 1.0f, 0.0f }, - { 1.0f, 0.0f, 1.0f }, - { 1.0f, 0.0f, 1.0f }, - { 1.0f, 1.0f, 0.0f }, - { 1.0f, 1.0f, 1.0f }, -}, { - // colors - { 1.0f, 0.0f, 0.0f }, // front, red - { 1.0f, 0.0f, 0.0f }, - { 1.0f, 0.0f, 0.0f }, - { 1.0f, 0.0f, 0.0f }, - { 1.0f, 0.0f, 0.0f }, - { 1.0f, 0.0f, 0.0f }, - { 0.0f, 1.0f, 1.0f }, // back, cyan - { 0.0f, 1.0f, 1.0f }, - { 0.0f, 1.0f, 1.0f }, - { 0.0f, 1.0f, 1.0f }, - { 0.0f, 1.0f, 1.0f }, - { 0.0f, 1.0f, 1.0f }, - { 0.0f, 1.0f, 0.0f }, // top, green - { 0.0f, 1.0f, 0.0f }, - { 0.0f, 1.0f, 0.0f }, - { 0.0f, 1.0f, 0.0f }, - { 0.0f, 1.0f, 0.0f }, - { 0.0f, 1.0f, 0.0f }, - { 1.0f, 0.0f, 1.0f }, // bottom, magenta - { 1.0f, 0.0f, 1.0f }, - { 1.0f, 0.0f, 1.0f }, - { 1.0f, 0.0f, 1.0f }, - { 1.0f, 0.0f, 1.0f }, - { 1.0f, 0.0f, 1.0f }, - { 0.0f, 0.0f, 1.0f }, // left, blue - { 0.0f, 0.0f, 1.0f }, - { 0.0f, 0.0f, 1.0f }, - { 0.0f, 0.0f, 1.0f }, - { 0.0f, 0.0f, 1.0f }, - { 0.0f, 0.0f, 1.0f }, - { 1.0f, 1.0f, 0.0f }, // right, yellow - { 1.0f, 1.0f, 0.0f }, - { 1.0f, 1.0f, 0.0f }, - { 1.0f, 1.0f, 0.0f }, - { 1.0f, 1.0f, 0.0f }, - { 1.0f, 1.0f, 0.0f }, -}, { - // normals - { 0.0f, 0.0f, 1.0f }, // front, red - { 0.0f, 0.0f, 1.0f }, - { 0.0f, 0.0f, 1.0f }, - { 0.0f, 0.0f, 1.0f }, - { 0.0f, 0.0f, 1.0f }, - { 0.0f, 0.0f, 1.0f }, - { 0.0f, 0.0f, -1.0f }, // back, cyan - { 0.0f, 0.0f, -1.0f }, - { 0.0f, 0.0f, -1.0f }, - { 0.0f, 0.0f, -1.0f }, - { 0.0f, 0.0f, -1.0f }, - { 0.0f, 0.0f, -1.0f }, - { 0.0f, 1.0f, 0.0f }, // top, green - { 0.0f, 1.0f, 0.0f }, - { 0.0f, 1.0f, 0.0f }, - { 0.0f, 1.0f, 0.0f }, - { 0.0f, 1.0f, 0.0f }, - { 0.0f, 1.0f, 0.0f }, - { 0.0f, -1.0f, 0.0f }, // bottom, magenta - { 0.0f, -1.0f, 0.0f }, - { 0.0f, -1.0f, 0.0f }, - { 0.0f, -1.0f, 0.0f }, - { 0.0f, -1.0f, 0.0f }, - { 0.0f, -1.0f, 0.0f }, - { -1.0f, 0.0f, 0.0f }, // left, blue - { -1.0f, 0.0f, 0.0f }, - { -1.0f, 0.0f, 0.0f }, - { -1.0f, 0.0f, 0.0f }, - { -1.0f, 0.0f, 0.0f }, - { -1.0f, 0.0f, 0.0f }, - { 1.0f, 0.0f, 0.0f }, // right, yellow - { 1.0f, 0.0f, 0.0f }, - { 1.0f, 0.0f, 0.0f }, - { 1.0f, 0.0f, 0.0f }, - { 1.0f, 0.0f, 0.0f }, - { 1.0f, 0.0f, 0.0f }, -}) -, modelCtrl() -, light_position(5.0f, 5.0f, 5.0f) +, 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(50.0f) +, light_power(250.0f) , m_handle(0) , v_handle(0) , mv_handle(0) @@ -152,6 +43,7 @@ Application::Application() , up(false) , down(false) { GLContext::EnableVSync(); + GLContext::EnableDepthTest(); GLContext::EnableBackfaceCulling(); program.LoadShader( GL_VERTEX_SHADER, @@ -218,8 +110,47 @@ Application::Application() glGenVertexArrays(1, &VertexArrayID); glBindVertexArray(VertexArrayID); - modelCtrl.Position(glm::vec3(0, 0, -4)); - cam.Position(glm::vec3(0, 0, 4)); + cam.Position(glm::vec3(0, 4, 4)); + + blockType.Add(BlockType(true, glm::vec3(1, 1, 1))); + blockType.Add(BlockType(true, glm::vec3(1, 0, 0))); + blockType.Add(BlockType(true, glm::vec3(0, 1, 0))); + blockType.Add(BlockType(true, glm::vec3(0, 0, 1))); + + chunk.BlockAt(glm::vec3(0, 0, 0)) = Block(blockType[4]); + chunk.BlockAt(glm::vec3(0, 0, 1)) = Block(blockType[1]); + chunk.BlockAt(glm::vec3(1, 0, 0)) = Block(blockType[2]); + chunk.BlockAt(glm::vec3(1, 0, 1)) = Block(blockType[3]); + chunk.BlockAt(glm::vec3(2, 0, 0)) = Block(blockType[4]); + chunk.BlockAt(glm::vec3(2, 0, 1)) = Block(blockType[1]); + chunk.BlockAt(glm::vec3(3, 0, 0)) = Block(blockType[2]); + chunk.BlockAt(glm::vec3(3, 0, 1)) = Block(blockType[3]); + chunk.BlockAt(glm::vec3(2, 0, 2)) = Block(blockType[4]); + chunk.BlockAt(glm::vec3(2, 0, 3)) = Block(blockType[1]); + chunk.BlockAt(glm::vec3(3, 0, 2)) = Block(blockType[2]); + chunk.BlockAt(glm::vec3(3, 0, 3)) = Block(blockType[3]); + chunk.BlockAt(glm::vec3(1, 1, 0)) = Block(blockType[1]); + chunk.BlockAt(glm::vec3(1, 1, 1)) = Block(blockType[4]); + chunk.BlockAt(glm::vec3(2, 1, 1)) = Block(blockType[3]); + 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"); @@ -322,18 +253,28 @@ void Application::Update(int dt) { } else if (front && !back) { vel.z = -move_velocity; } - cam.Velocity(vel); + cam.OrientationVelocity(vel); cam.Update(dt); - modelCtrl.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() { - glClear(GL_COLOR_BUFFER_BIT); + GLContext::Clear(); program.Use(); - glm::mat4 m(modelCtrl.Transform()); + glm::mat4 m(1.0f); glm::mat4 mv(cam.View() * m); glm::mat4 mvp(cam.MakeMVP(m)); glUniformMatrix4fv(m_handle, 1, GL_FALSE, &m[0][0]); @@ -344,7 +285,15 @@ void Application::Render() { glUniform3f(light_color_handle, light_color.x, light_color.y, light_color.z); glUniform1f(light_power_handle, light_power); - model.Draw(); + 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(); }