X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fapp.cpp;h=9ec9384f9ce749198af886d8fb16cff93c5d5ac3;hb=8881c507009521d08648560984c0f50166224542;hp=8c957a78a815f348fb423f86c8840e6c35deea7f;hpb=482114e156e91729f2529ea6bb1fe98dacdee97f;p=blank.git diff --git a/src/app.cpp b/src/app.cpp index 8c957a7..9ec9384 100644 --- a/src/app.cpp +++ b/src/app.cpp @@ -1,5 +1,7 @@ #include "app.hpp" +#include "geometry.hpp" + #include #include @@ -17,12 +19,15 @@ Application::Application() , move_velocity(0.003f) , pitch_sensitivity(-0.0025f) , yaw_sensitivity(-0.001f) -, testBlockType(true) +, 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(100.0f) +, light_power(250.0f) , m_handle(0) , v_handle(0) , mv_handle(0) @@ -36,7 +41,12 @@ Application::Application() , left(false) , right(false) , up(false) -, down(false) { +, down(false) +, place(false) +, remove(false) +, pick(false) +, remove_id(0) +, place_id(1) { GLContext::EnableVSync(); GLContext::EnableDepthTest(); GLContext::EnableBackfaceCulling(); @@ -107,14 +117,46 @@ Application::Application() cam.Position(glm::vec3(0, 4, 4)); - chunk.BlockAt(glm::vec3(0, 0, 0)) = Block(&testBlockType); - chunk.BlockAt(glm::vec3(1, 0, 0)) = Block(&testBlockType); - chunk.BlockAt(glm::vec3(1, 1, 0)) = Block(&testBlockType); - chunk.BlockAt(glm::vec3(1, 1, 1)) = Block(&testBlockType); - chunk.BlockAt(glm::vec3(2, 1, 1)) = Block(&testBlockType); - chunk.BlockAt(glm::vec3(2, 2, 1)) = Block(&testBlockType); + 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"); mv_handle = program.UniformLocation("MV"); @@ -126,10 +168,6 @@ Application::Application() glClearColor(0.0, 0.0, 0.0, 1.0); } -Application::~Application() { - -} - void Application::Run() { running = true; @@ -177,6 +215,18 @@ void Application::HandleEvents() { break; } break; + case SDL_MOUSEBUTTONDOWN: + if (event.button.button == 1) { + // left + remove = true; + } else if (event.button.button == 2) { + // middle + pick = true; + } else if (event.button.button == 3) { + // right + place = true; + } + break; case SDL_MOUSEMOTION: cam.RotateYaw(event.motion.xrel * yaw_sensitivity); cam.RotatePitch(event.motion.yrel * pitch_sensitivity); @@ -219,6 +269,40 @@ void Application::Update(int dt) { cam.OrientationVelocity(vel); cam.Update(dt); + + Ray aim = cam.Aim(); + int blkid; + float dist; + glm::vec3 normal; + if (chunk.Intersection(aim, glm::mat4(1.0f), &blkid, &dist, &normal)) { + glm::vec3 pos = Chunk::ToCoords(blkid); + outline_visible = true; + outline_transform = glm::translate(glm::mat4(1.0f), pos); + } else { + outline_visible = false; + } + + if (pick) { + if (outline_visible) { + place_id = chunk.BlockAt(blkid).type->id; + } + pick = false; + } + if (remove) { + chunk.BlockAt(blkid).type = blockType[remove_id]; + chunk.Invalidate(); + remove = false; + } + if (place) { + if (outline_visible) { + int next_blkid = Chunk::ToIndex(Chunk::ToCoords(blkid) + normal); + if (next_blkid >= 0 && next_blkid < Chunk::Size()) { + chunk.BlockAt(next_blkid).type = blockType[place_id]; + chunk.Invalidate(); + } + } + place = false; + } } void Application::Render() { @@ -238,6 +322,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(); }