diff --git a/config.json b/config.json index fe596c0..7eaef27 100644 --- a/config.json +++ b/config.json @@ -47,7 +47,7 @@ "enabled": true, "json-save": true, "json-save-directory": "local/scans", - "barcode": "", + "barcode": "014100085980", "capture-device": "/dev/video0" }, "api": diff --git a/src/Pudding.cpp b/src/Pudding.cpp index 61e446b..eeb1d15 100644 --- a/src/Pudding.cpp +++ b/src/Pudding.cpp @@ -223,13 +223,13 @@ void Pudding::load_gl_context() /* store uniform locations after linking */ uniform["flat"]["texture"] = glGetUniformLocation(flat_program, "base_texture"); uniform["flat"]["time"] = glGetUniformLocation(flat_program, "time"); - scroll_uniform_location = glGetUniformLocation(flat_program, "scroll"); + uniform["flat"]["scroll"] = glGetUniformLocation(flat_program, "scroll"); uniform["flat"]["blend"] = glGetUniformLocation(flat_program, "blend_min_hsv"); - mvp_uniform_location = glGetUniformLocation(mvp_program, "mvp"); - time_uniform_location = glGetUniformLocation(mvp_program, "time"); - effect_uniform_location = glGetUniformLocation(mvp_program, "effect"); - uv_transformation_uniform_location = glGetUniformLocation(mvp_program, "uv_transformation"); - coordinate_bound_uniform_location = glGetUniformLocation(mvp_program, "coordinate_bound"); + uniform["mvp"]["mvp"] = glGetUniformLocation(mvp_program, "mvp"); + uniform["mvp"]["time"] = glGetUniformLocation(mvp_program, "time"); + uniform["mvp"]["effect"] = glGetUniformLocation(mvp_program, "effect"); + uniform["mvp"]["uv transformation"] = glGetUniformLocation(mvp_program, "uv_transformation"); + uniform["mvp"]["coordinate bound"] = glGetUniformLocation(mvp_program, "coordinate_bound"); uniform["mvp"]["pudding texture"] = glGetUniformLocation(mvp_program, "pudding_texture"); sb::Log::gl_errors("after uniform locations"); } @@ -283,7 +283,10 @@ void Pudding::respond(SDL_Event& event) } else if (get_delegate().compare(event, "right")) { - get_current_item().increment_image_index(); + if (items.size() > 0) + { + current_item().increment_image_index(); + } } else if (get_delegate().compare(event, "down")) { @@ -291,7 +294,10 @@ void Pudding::respond(SDL_Event& event) } else if (get_delegate().compare(event, "left")) { - get_current_item().increment_image_index(-1); + if (items.size() > 0) + { + current_item().increment_image_index(-1); + } } else if (get_delegate().compare(event, "toggle-camera")) { @@ -313,7 +319,7 @@ void Pudding::respond(SDL_Event& event) { effect_id = ++effect_id % EFFECT_COUNT; glUseProgram(mvp_program); - glUniform1i(effect_uniform_location, effect_id); + glUniform1i(uniform["mvp"]["effect"], effect_id); } else if (get_delegate().compare(event, "tile")) { @@ -636,9 +642,19 @@ void Pudding::increment_item_index(int increment) current_item_index = sb::mod(current_item_index + increment, static_cast(items.size())); } -Item& Pudding::get_current_item() +/* Return the item currently selected in the inventory */ +Item& Pudding::current_item() { - return items[current_item_index]; + try + { + return items.at(current_item_index); + } + catch (const std::out_of_range& exception) + { + std::ostringstream message; + message << "Out of range exception: " << exception.what() << " (Attempting to retrieve an item from empty inventory)"; + sb::Log::log(message); + } } /* Returns true if item display is toggled on and there is at least one item to display */ @@ -757,20 +773,20 @@ void Pudding::update() tiles[current_tile_index].bind(); /* set blend to modify white part of background, color passed is in HSV format */ glUniform3f(uniform["flat"]["blend"], 0.0f, 0.0f, 1.0f); - glUniform1i(scroll_uniform_location, true); + glUniform1i(uniform["flat"]["scroll"], true); /* draws rectangle vertices and rectangle texture using UV coords */ glDrawArrays(GL_TRIANGLES, 0, rectangle_attributes["position"].count()); - glUniform1i(scroll_uniform_location, false); + glUniform1i(uniform["flat"]["scroll"], false); /* draw pudding model using MVP shader */ glUseProgram(mvp_program); - glUniform1f(time_uniform_location, time_seconds); + glUniform1f(uniform["mvp"]["time"], time_seconds); /* calculate the transformation matrix for displaying pudding in viewport */ model = glm::rotate(model, weight(get_configuration()["pudding"]["rotation-speed"].get()), Y_UNIT_NORMAL_3D); projection = glm::perspective( glm::radians(40.0f * 1 / viewport_box.aspect()), viewport_box.aspect(), 0.1f, 100.0f); mvp = projection * VIEW_MATRIX * model; /* pass the mvp matrix to the shader */ - glUniformMatrix4fv(mvp_uniform_location, 1, GL_FALSE, &mvp[0][0]); + glUniformMatrix4fv(uniform["mvp"]["mvp"], 1, GL_FALSE, &mvp[0][0]); /* disable rectangle attributes and enable pudding attributes */ glDisableVertexAttribArray(rectangle_attributes["position"]); glDisableVertexAttribArray(rectangle_attributes["color"]); @@ -787,20 +803,20 @@ void Pudding::update() glEnableVertexAttribArray(pudding_attributes["uv"]); glUniform1i(uniform["mvp"]["pudding texture"], 0); glActiveTexture(GL_TEXTURE0); - get_current_item().get_active_image_texture().bind(); + current_item().get_active_image_texture().bind(); } /* draw pudding model */ glEnable(GL_DEPTH_TEST); /* draw the sides of the pudding */ glDrawArrays(GL_TRIANGLES, 0, pudding_triangle_vertex_count); /* enable squircling and draw the top and bottom of pudding */ - glUniform1i(uv_transformation_uniform_location, UV_SQUIRCLE); - glUniform1f(coordinate_bound_uniform_location, get_configuration()["pudding"]["top-radius"]); + glUniform1i(uniform["mvp"]["uv transformation"], UV_SQUIRCLE); + glUniform1f(uniform["mvp"]["coordinate bound"], get_configuration()["pudding"]["top-radius"]); glDrawArrays(GL_TRIANGLE_FAN, pudding_triangle_vertex_count, pudding_fan_vertex_count); - glUniform1f(coordinate_bound_uniform_location, get_configuration()["pudding"]["base-radius"]); + glUniform1f(uniform["mvp"]["coordinate bound"], get_configuration()["pudding"]["base-radius"]); glDrawArrays(GL_TRIANGLE_FAN, pudding_triangle_vertex_count + pudding_fan_vertex_count, pudding_fan_vertex_count); /* disable squircling for all other drawing */ - glUniform1i(uv_transformation_uniform_location, UV_NONE); + glUniform1i(uniform["mvp"]["uv transformation"], UV_NONE); /* regular fill mode enabled for all other drawing */ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); /* only do more drawing if items are downloaded or camera is enabled */ @@ -832,7 +848,7 @@ void Pudding::update() viewport_box.left(viewport_box.cx(), true); } glViewport(viewport_box.left(), viewport_box.bottom(), viewport_box.width(), viewport_box.height()); - get_current_item().get_active_image_texture().bind(); + current_item().get_active_image_texture().bind(); /* draws rectangle vertices and rectangle texture using UV coords */ glDrawArrays(GL_TRIANGLES, 0, rectangle_attributes["position"].count()); } diff --git a/src/Pudding.hpp b/src/Pudding.hpp index dfb63a8..3069eb8 100644 --- a/src/Pudding.hpp +++ b/src/Pudding.hpp @@ -82,15 +82,9 @@ private: cv::VideoCapture capture; zbar::ImageScanner image_scanner; std::map> uniform; - GLuint flat_program, mvp_program, mvp_uniform_location, time_uniform_location, effect_uniform_location, - uv_transformation_uniform_location, coordinate_bound_uniform_location, - scroll_uniform_location; + GLuint flat_program, mvp_program; glm::mat4 projection, model = glm::mat4(1.0f), mvp; - std::map rectangle_attributes, pudding_attributes = { - {"position", sb::Attributes()}, - {"uv", sb::Attributes()}, - {"color", sb::Attributes()} - }; + std::map rectangle_attributes, pudding_attributes; bool show_item = false, reading_capture_frame = false; SDL_GLContext capture_frame_thread_context = nullptr; std::vector tiles; @@ -122,7 +116,7 @@ public: void respond(SDL_Event&); void add_item(const std::string&); void increment_item_index(int = 1); - Item& get_current_item(); + Item& current_item(); void update(); virtual std::string class_name() const { return "Pudding"; }