diff --git a/src/hexgame.cpp b/src/hexgame.cpp index 13a3015..2ba4f9c 100644 --- a/src/hexgame.cpp +++ b/src/hexgame.cpp @@ -199,6 +199,13 @@ handleMouseDown(SDL_MouseButtonEvent &e) hgAddHex(gs->grid, xsect, rs->filled_hex_render_group, rs->hex_line_render_group); break; } + case REMOVE_HEXES: { + v3f ray = cameraCreateRay(rs->cam, coords, dims); + v3f xsect; + if (cameraIntersectPlane(rs->cam, ray, gs->grid.position, gs->grid.normal, xsect)) + hgRemoveHex(gs->grid, xsect, rs->filled_hex_render_group, rs->hex_line_render_group); + break; + } case NONE: default: v2f v = cameraUnproject(rs->cam, coords.x, coords.y, dims.x, dims.y); diff --git a/src/hexgrid.cpp b/src/hexgrid.cpp index efd23d9..240001a 100644 --- a/src/hexgrid.cpp +++ b/src/hexgrid.cpp @@ -119,8 +119,55 @@ hgAddHex(hexgrid& hg, v3f hex_coords, render_group* rg_filled, render_group* rg_ } bool -hgRemoveHex(hexgrid& hg, v3i hex_coords) +hgRemoveHex(hexgrid& hg, v3f hex_coords, render_group* rg_filled, render_group* rg_lines) { + hex_info* hxi = hgGetSingleHex(hg, hex_coords.x, hex_coords.y); + if (hxi) { + render_object* ro_f = rg_filled->render_objects[0]; + gl_buffer& vb_f = ro_f->vertex_buffer; + gl_buffer& nb_f = ro_f->normal_buffer; + gl_buffer& ub_f = ro_f->uv_buffer; + render_object* ro_l = rg_lines->render_objects[0]; + gl_buffer& vb_l = ro_l->vertex_buffer; + gl_buffer& nb_l = ro_l->normal_buffer; + gl_buffer& ub_l = ro_l->uv_buffer; + + // NOTE: don't need sanity checks to delete from buffers + vb_f.count -= IDX_PER_HEX_FILLED; + nb_f.count -= IDX_PER_HEX_FILLED; + ub_f.count -= IDX_PER_HEX_FILLED; + vb_l.count -= IDX_PER_HEX_LINES; + nb_l.count -= IDX_PER_HEX_LINES; + ub_l.count -= IDX_PER_HEX_LINES; + + assert(hg.hex_map.erase(hxi->hex) == 1); + + // NOTE: have to repopulate all the buffers, and re-index + uint i = 0; + for (auto it : hg.hex_map) { + it.second.hexID = i; + populateFilledHexGLBuffers(hg, it.second, rg_filled); + populateLineGLBuffers(hg, it.second, rg_lines); + i++; + } + + // NOTE: we do need to update the whole buffer when removing data + glBindBuffer(GL_ARRAY_BUFFER, vb_f.buffer_id); + glBufferSubData(GL_ARRAY_BUFFER, 0, vb_f.count * sizeof(GLfloat), vb_f.buffer); + glBindBuffer(GL_ARRAY_BUFFER, nb_f.buffer_id); + glBufferSubData(GL_ARRAY_BUFFER, 0, nb_f.count * sizeof(GLfloat), nb_f.buffer); + glBindBuffer(GL_ARRAY_BUFFER, ub_f.buffer_id); + glBufferSubData(GL_ARRAY_BUFFER, 0, ub_f.count * sizeof(GLfloat), ub_f.buffer); + glBindBuffer(GL_ARRAY_BUFFER, vb_l.buffer_id); + glBufferSubData(GL_ARRAY_BUFFER, 0, vb_l.count * sizeof(GLfloat), vb_l.buffer); + glBindBuffer(GL_ARRAY_BUFFER, nb_l.buffer_id); + glBufferSubData(GL_ARRAY_BUFFER, 0, nb_l.count * sizeof(GLfloat), nb_l.buffer); + glBindBuffer(GL_ARRAY_BUFFER, ub_l.buffer_id); + glBufferSubData(GL_ARRAY_BUFFER, 0, ub_l.count * sizeof(GLfloat), ub_l.buffer); + + return true; + } + return false; } diff --git a/src/hexgrid.h b/src/hexgrid.h index 2a0cc35..fbd53ef 100644 --- a/src/hexgrid.h +++ b/src/hexgrid.h @@ -89,7 +89,7 @@ bool hgInit(hexgrid& hg, render_group* rg_filled, render_group* rg_lines); bool hgAddHex(hexgrid& hg, v3f hex_coords, render_group* rg_filled, render_group* rg_lines); -bool hgRemoveHex(hexgrid& hg, v3i hex_coords); +bool hgRemoveHex(hexgrid& hg, v3f hex_coords, render_group* rg_filled, render_group* rg_lines); // -------------------