From b22302a0217ea8ccf30bfca6a6a42059530aa915 Mon Sep 17 00:00:00 2001 From: frank <420@shampoo.ooo> Date: Tue, 14 Sep 2021 20:14:15 -0400 Subject: [PATCH] tiling effect using original texture size --- config.json | 7 +++- resource/mario_3_star_background.png | Bin 7437 -> 0 bytes resource/tile/teapot.jpg | Bin 0 -> 21348 bytes resource/tile/utensil1.jpg | Bin 0 -> 17771 bytes resource/tile/vase.jpg | Bin 0 -> 20883 bytes src/Item.hpp | 2 + src/Pudding.cpp | 55 +++++++++++++++++++-------- src/Pudding.hpp | 10 +++-- src/flat.frag | 13 ++++++- src/white.frag | 9 ----- 10 files changed, 66 insertions(+), 30 deletions(-) delete mode 100644 resource/mario_3_star_background.png create mode 100644 resource/tile/teapot.jpg create mode 100644 resource/tile/utensil1.jpg create mode 100644 resource/tile/vase.jpg delete mode 100644 src/white.frag diff --git a/config.json b/config.json index 0e2c3a3..ce222a1 100644 --- a/config.json +++ b/config.json @@ -17,7 +17,8 @@ "print-frame-length-history": ["CTRL", "SHIFT", "h"], "toggle-camera": ["CTRL", "c"], "toggle-item": ["CTRL", "i"], - "effect": ["CTRL", "e"] + "effect": ["CTRL", "e"], + "tile": ["CTRL", "t"] }, "recording": { @@ -72,5 +73,9 @@ "layer-count": 12, "y-range": [-0.6, 0.6], "gradient-position": 0.25 + }, + "resource": + { + "tile-path": "resource/tile" } } diff --git a/resource/mario_3_star_background.png b/resource/mario_3_star_background.png deleted file mode 100644 index 55e81e5dc40c96f2814b156f0d5fbba4f114c5fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7437 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 E0gk3+L;wH) diff --git a/resource/tile/teapot.jpg b/resource/tile/teapot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6f9f9a457228a594ab80b0c0afd766c8d682c626 GIT binary patch literal 21348 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 literal 0 HcmV?d00001 diff --git a/resource/tile/utensil1.jpg b/resource/tile/utensil1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b9b8d26dd25fa7d39a666ad040a2a2c5bfe1408 GIT binary patch literal 17771 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 Nb{9h^zj{*Py literal 0 HcmV?d00001 diff --git a/resource/tile/vase.jpg b/resource/tile/vase.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0fcd81afc989b9ee24f0f2d1230b39dbcd05e819 GIT binary patch literal 20883 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 #include #include +#include "json/json.hpp" #include "Node.hpp" class Item : public Node @@ -26,6 +27,7 @@ class Item : public Node private: + nlohmann::json json = {}; std::vector> image_textures; std::string brand_name = "", product_name = "", upc = ""; int current_image_index = 0; diff --git a/src/Pudding.cpp b/src/Pudding.cpp index 46d549f..c210206 100644 --- a/src/Pudding.cpp +++ b/src/Pudding.cpp @@ -38,6 +38,7 @@ Pudding::Pudding() pudding["y-range"][0], pudding["y-range"][1], pudding["gradient-position"]); /* use gl context so we can draw 3D */ load_gl_context(); + load_tiles(); } /* Assign vertices, colors and texture UV coordinates to the pudding model */ @@ -160,18 +161,6 @@ void Pudding::load_gl_context() { log("could not create capture frame thread context"); } - /* load background as surface, generate texture to load pixel data into, allocate storage, bind and edit texture properties */ - std::unique_ptr surface(IMG_Load("local/tptile.jpg"), SDL_FreeSurface); - std::unique_ptr flipped_surface(rotozoomSurfaceXY(surface.get(), 0, 1, -1, 0), SDL_FreeSurface); - glGenTextures(1, &background_texture_id); - glBindTexture(GL_TEXTURE_2D, background_texture_id); - glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8, flipped_surface->w, flipped_surface->h); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, flipped_surface->w, flipped_surface->h, GL_RGBA, GL_UNSIGNED_BYTE, flipped_surface->pixels); - std::ostringstream message; - message << "loaded background image " << flipped_surface->w << "x" << flipped_surface->h; - log(message.str()); /* Allocate a vertex array object, bind it as current, doesn't need to be a member var because the same one is always bound */ GLuint vao; glGenVertexArrays(1, &vao); @@ -225,6 +214,8 @@ void Pudding::load_gl_context() glBindAttribLocation(flat_program, 1, "vertex_uv"); link_shader(flat_program); flat_texture_uniform_location = glGetUniformLocation(flat_program, "base_texture"); + flat_time_uniform_location = glGetUniformLocation(flat_program, "time"); + scroll_uniform_location = glGetUniformLocation(flat_program, "scroll"); /* load, configure and link the 3D world program */ vertex_shader = load_shader("src/mvp.vert", GL_VERTEX_SHADER); fragment_shader = load_shader("src/mvp.frag", GL_FRAGMENT_SHADER); @@ -243,6 +234,30 @@ void Pudding::load_gl_context() log_gl_errors(); } +/* Read every resource/tile/.*.jpg into a GL texture, storing the texture pointer and file name in a std::map */ +void Pudding::load_tiles() +{ + for (fs::path path : sb::glob(get_configuration()["resource"]["tile-path"].get() / ".*.jpg")) + { + /* load background as surface */ + std::unique_ptr surface(IMG_Load(path.c_str()), SDL_FreeSurface); + std::unique_ptr flipped_surface(rotozoomSurfaceXY(surface.get(), 0, 1, -1, 0), SDL_FreeSurface); + /* generate a GL texture, allocate space and set properties */ + std::shared_ptr texture_id(new GLuint, Pudding::destroy_texture); + glGenTextures(1, texture_id.get()); + glBindTexture(GL_TEXTURE_2D, *texture_id); + glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB8, flipped_surface->w, flipped_surface->h); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, flipped_surface->w, flipped_surface->h, GL_RGBA, GL_UNSIGNED_BYTE, flipped_surface->pixels); + log_gl_errors(); + std::ostringstream message; + message << "loaded background image " << path.stem() << " from " << path << "(" << flipped_surface->w << "x" << flipped_surface->h << ")"; + log(message.str()); + tiles.push_back(texture_id); + } +} + /* Try to create cv::VideoCapture object using device ID #0. If successful, this will create GL texture IDs and storage * for the camera frames, so it must be called after GL context has been created. Two textures will be created, so they * can be used as a double buffer. @@ -319,6 +334,10 @@ void Pudding::respond(SDL_Event& event) glUseProgram(mvp_program); glUniform1i(effect_uniform_location, effect_id); } + else if (get_delegate().compare(event, "tile")) + { + current_tile_index = ++current_tile_index % tiles.size(); + } } /* Build an Item object by submitting the upc parameter to multiple APIs and taking @@ -720,6 +739,8 @@ int Pudding::capture_frame(void* game) /* Update parameters and draw the screen */ void Pudding::update() { + /* number of seconds we've been running for */ + float time_seconds = SDL_GetTicks() / 1000.0f; /* launch the camera capture thread if it is not currently running */ if (capture.isOpened() && !reading_capture_frame) { @@ -755,6 +776,7 @@ void Pudding::update() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /* switch to flat shader for background */ glUseProgram(flat_program); + glUniform1f(flat_time_uniform_location, time_seconds); /* disable pudding attributes and enable rectangle attributes */ glDisableVertexAttribArray(2); glDisableVertexAttribArray(3); @@ -762,16 +784,17 @@ void Pudding::update() glEnableVertexAttribArray(1); glUniform1i(flat_texture_uniform_location, 0); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, background_texture_id); + glBindTexture(GL_TEXTURE_2D, *tiles[current_tile_index]); /* set blend to modify white part of background, color passed is in HSV format */ GLint blend_min_hsv_location = glGetUniformLocation(flat_program, "blend_min_hsv"); - /* blend min with black will create a black blackground regardless of texture */ - glUniform3f(blend_min_hsv_location, 0, 0, 0); + glUniform3f(blend_min_hsv_location, 0.0f, 0.0f, 1.0f); + glUniform1i(scroll_uniform_location, true); /* draws rectangle vertices and rectangle texture using UV coords */ glDrawArrays(GL_TRIANGLES, 0, 6); + glUniform1i(scroll_uniform_location, false); /* draw pudding model using MVP shader */ glUseProgram(mvp_program); - glUniform1f(time_uniform_location, SDL_GetTicks() / 1000.0f); + glUniform1f(time_uniform_location, 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( diff --git a/src/Pudding.hpp b/src/Pudding.hpp index 89900ed..3f81acc 100644 --- a/src/Pudding.hpp +++ b/src/Pudding.hpp @@ -61,20 +61,24 @@ private: const glm::vec3 PUDDING_YELLOW = glm::vec3(0.878f, 0.859f, 0.122f); std::string current_barcode, previous_barcode, current_config_barcode, current_camera_barcode; std::vector items; - int current_item_index = 0, effect_id = EFFECT_NONE, pudding_triangle_vertex_count = 0, pudding_fan_vertex_count = 0; + int current_item_index = 0, effect_id = EFFECT_NONE, pudding_triangle_vertex_count = 0, pudding_fan_vertex_count = 0, + current_tile_index = 0; cv::VideoCapture capture; zbar::ImageScanner image_scanner; GLuint flat_program, mvp_program, capture_texture_front_buffer_id, capture_texture_back_buffer_id, capture_texture_id, - mvp_uniform_location, background_texture_id, time_uniform_location, effect_uniform_location, uv_transformation_uniform_location, - flat_texture_uniform_location, coordinate_bound_uniform_location; + mvp_uniform_location, time_uniform_location, effect_uniform_location, uv_transformation_uniform_location, + flat_texture_uniform_location, coordinate_bound_uniform_location, flat_time_uniform_location, + scroll_uniform_location; glm::mat4 projection, model = glm::mat4(1.0f), mvp; std::vector pudding_vertices, pudding_colors; std::vector pudding_uv; bool show_item = false, reading_capture_frame = false; SDL_GLContext capture_frame_thread_context = nullptr; + std::vector> tiles; void set_pudding_model(float, float, int, int = 1, float = -1, float = 1, float = 0.3f); void load_gl_context(); + void load_tiles(); void initialize_camera(); void incorporate_open_food_api(Item&); void incorporate_nutronix_api(Item&); diff --git a/src/flat.frag b/src/flat.frag index ba8a3a2..ef87422 100644 --- a/src/flat.frag +++ b/src/flat.frag @@ -3,6 +3,8 @@ in vec2 uv; uniform sampler2D base_texture; uniform vec3 blend_min_hsv; +uniform float time; +uniform bool scroll = false; /* from http://lolengine.net/blog/2013/07/27/rgb-to-hsv-in-glsl, licensed under WTFPL */ vec3 hsv2rgb(vec3 c) @@ -14,6 +16,15 @@ vec3 hsv2rgb(vec3 c) void main(void) { - gl_FragColor = texture(base_texture, uv); + if (scroll) + { + ivec2 texture_size = textureSize(base_texture, 0); + float speed = time * 35.0; + gl_FragColor = texelFetch(base_texture, ivec2(mod(vec2(gl_FragCoord.x + speed, gl_FragCoord.y - speed), texture_size)), 0); + } + else + { + gl_FragColor = texture(base_texture, uv); + } gl_FragColor = min(gl_FragColor, vec4(hsv2rgb(blend_min_hsv), 1)); } diff --git a/src/white.frag b/src/white.frag deleted file mode 100644 index 8daf986..0000000 --- a/src/white.frag +++ /dev/null @@ -1,9 +0,0 @@ -#version 130 - -in vec3 ex_Color; -in float x; - -void main(void) -{ - gl_FragColor = vec4(1, 1, 1, 1); -}