move camera textures into class
This commit is contained in:
parent
a41dbfd3b1
commit
c461475ea6
|
@ -47,7 +47,7 @@
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"json-save": true,
|
"json-save": true,
|
||||||
"json-save-directory": "local/scans",
|
"json-save-directory": "local/scans",
|
||||||
"barcode": "",
|
"barcode": "8410076472953",
|
||||||
"capture-device": "/dev/video0"
|
"capture-device": "/dev/video0"
|
||||||
},
|
},
|
||||||
"api":
|
"api":
|
||||||
|
|
2
lib/sb
2
lib/sb
|
@ -1 +1 @@
|
||||||
Subproject commit 950a95502bb178619376121ac9781ad1f2fe151e
|
Subproject commit 2c0517b9e28ab2be46c1402bab2dafffd24c6637
|
|
@ -147,9 +147,38 @@ void Background::next()
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the currently active tile texture. */
|
/* Return the currently active tile texture. */
|
||||||
const sb::Texture& Background::tile() const
|
const sb::Texture& Background::current() const
|
||||||
{
|
{
|
||||||
auto position = model_texture.begin();
|
auto position = model_texture.begin();
|
||||||
std::advance(position, offset);
|
std::advance(position, offset);
|
||||||
return position->second;
|
return position->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CameraView::CameraView() : Plane()
|
||||||
|
{
|
||||||
|
texture("front", sb::Texture());
|
||||||
|
texture("back", sb::Texture());
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraView::generate(const glm::vec2& size)
|
||||||
|
{
|
||||||
|
for (sb::Texture* buffer : {&texture("front"), &texture("back")})
|
||||||
|
{
|
||||||
|
buffer->generate(size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sb::Texture& CameraView::current()
|
||||||
|
{
|
||||||
|
return swapped ? texture("back") : texture("front");
|
||||||
|
}
|
||||||
|
|
||||||
|
sb::Texture& CameraView::free()
|
||||||
|
{
|
||||||
|
return swapped ? texture("front") : texture("back");
|
||||||
|
}
|
||||||
|
|
||||||
|
void CameraView::swap()
|
||||||
|
{
|
||||||
|
swapped = !swapped;
|
||||||
|
}
|
||||||
|
|
|
@ -86,7 +86,24 @@ private:
|
||||||
public:
|
public:
|
||||||
|
|
||||||
void next();
|
void next();
|
||||||
const sb::Texture& tile() const;
|
const sb::Texture& current() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class CameraView : public Plane
|
||||||
|
{
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
bool swapped = false;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
CameraView();
|
||||||
|
void generate(const glm::vec2&);
|
||||||
|
sb::Texture& current();
|
||||||
|
sb::Texture& free();
|
||||||
|
void swap();
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -38,21 +38,6 @@ Pudding::Pudding()
|
||||||
/* use gl context so we can draw 3D */
|
/* use gl context so we can draw 3D */
|
||||||
load_gl_context();
|
load_gl_context();
|
||||||
load_tiles();
|
load_tiles();
|
||||||
Model boom, kaboom;
|
|
||||||
boom["hello world"] = std::make_shared<sb::Attributes>(sb::Attributes{1, 2, 3, 4, 5});
|
|
||||||
std::cout << *boom["hello world"] << std::endl;
|
|
||||||
boom.attributes("bam", {{4.2f, 42.0f, 420.0f}, {.69f, 6.9f, 69.0f}});
|
|
||||||
std::cout << *boom["bam"] << std::endl;
|
|
||||||
kaboom = boom;
|
|
||||||
std::cout << *kaboom.attributes("hello world") << std::endl;
|
|
||||||
background_copy = background;
|
|
||||||
background_copy.next();
|
|
||||||
background = background_copy;
|
|
||||||
background_copy_2 = background_copy;
|
|
||||||
background_copy_2.next();
|
|
||||||
background = background_copy_2;
|
|
||||||
background_copy = background_copy_2;
|
|
||||||
background = background_copy;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Assign vertices, colors and texture UV coordinates to the pudding model */
|
/* Assign vertices, colors and texture UV coordinates to the pudding model */
|
||||||
|
@ -190,17 +175,17 @@ void Pudding::load_gl_context()
|
||||||
flat_program = glCreateProgram();
|
flat_program = glCreateProgram();
|
||||||
glAttachShader(flat_program, vertex_shader);
|
glAttachShader(flat_program, vertex_shader);
|
||||||
glAttachShader(flat_program, fragment_shader);
|
glAttachShader(flat_program, fragment_shader);
|
||||||
|
plane.attributes("position")->bind(0, flat_program, "in_position");
|
||||||
|
plane.attributes("uv")->bind(1, flat_program, "vertex_uv");
|
||||||
/* load, configure and link the 3D world program */
|
/* load, configure and link the 3D world program */
|
||||||
vertex_shader = load_shader("src/mvp.vert", GL_VERTEX_SHADER);
|
vertex_shader = load_shader("src/mvp.vert", GL_VERTEX_SHADER);
|
||||||
fragment_shader = load_shader("src/mvp.frag", GL_FRAGMENT_SHADER);
|
fragment_shader = load_shader("src/mvp.frag", GL_FRAGMENT_SHADER);
|
||||||
plane.attributes("position")->bind(12, flat_program, "in_position");
|
|
||||||
plane.attributes("uv")->bind(13, flat_program, "vertex_uv");
|
|
||||||
mvp_program = glCreateProgram();
|
mvp_program = glCreateProgram();
|
||||||
glAttachShader(mvp_program, vertex_shader);
|
glAttachShader(mvp_program, vertex_shader);
|
||||||
glAttachShader(mvp_program, fragment_shader);
|
glAttachShader(mvp_program, fragment_shader);
|
||||||
pudding_model.attributes("position")->bind(0, mvp_program, "in_position");
|
pudding_model.attributes("position")->bind(2, mvp_program, "vertex_position");
|
||||||
pudding_model.attributes("color")->bind(1, mvp_program, "in_color");
|
pudding_model.attributes("uv")->bind(3, mvp_program, "vertex_uv");
|
||||||
pudding_model.attributes("uv")->bind(2, mvp_program, "vertex_uv");
|
pudding_model.attributes("color")->bind(4, mvp_program, "vertex_color");
|
||||||
sb::Log::gl_errors("after loading shaders");
|
sb::Log::gl_errors("after loading shaders");
|
||||||
/* Fill VBO with attribute data */
|
/* Fill VBO with attribute data */
|
||||||
vbo.allocate(plane.size() + pudding_model.size(), GL_STATIC_DRAW);
|
vbo.allocate(plane.size() + pudding_model.size(), GL_STATIC_DRAW);
|
||||||
|
@ -256,10 +241,7 @@ void Pudding::initialize_camera()
|
||||||
"fps video capture device ID #" << device_id << " using " << capture.getBackendName();
|
"fps video capture device ID #" << device_id << " using " << capture.getBackendName();
|
||||||
/* generate two textures that will store the video frames with the intention of double buffering them
|
/* generate two textures that will store the video frames with the intention of double buffering them
|
||||||
* for threaded texture loading */
|
* for threaded texture loading */
|
||||||
for (sb::Texture* texture : {&capture_texture_front_buffer, &capture_texture_back_buffer})
|
camera_view.generate({capture.get(cv::CAP_PROP_FRAME_WIDTH), capture.get(cv::CAP_PROP_FRAME_HEIGHT)});
|
||||||
{
|
|
||||||
texture->generate({capture.get(cv::CAP_PROP_FRAME_WIDTH), capture.get(cv::CAP_PROP_FRAME_HEIGHT)});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -317,7 +299,7 @@ void Pudding::respond(SDL_Event& event)
|
||||||
}
|
}
|
||||||
else if (get_delegate().compare(event, "tile"))
|
else if (get_delegate().compare(event, "tile"))
|
||||||
{
|
{
|
||||||
background_copy.next();
|
background.next();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -680,13 +662,12 @@ int Pudding::capture_frame(void* game)
|
||||||
/* rotate the opencv matrix 180 to work with opengl coords */
|
/* rotate the opencv matrix 180 to work with opengl coords */
|
||||||
cv::flip(frame, frame, -1);
|
cv::flip(frame, frame, -1);
|
||||||
/* use whichever texture ID is not being used by the main rendering thread */
|
/* use whichever texture ID is not being used by the main rendering thread */
|
||||||
sb::Texture& texture = pudding->capture_texture == pudding->capture_texture_front_buffer ?
|
sb::Texture& texture = pudding->camera_view.free();
|
||||||
pudding->capture_texture_back_buffer : pudding->capture_texture_front_buffer;
|
|
||||||
/* bind texture for accepting pixel data */
|
/* bind texture for accepting pixel data */
|
||||||
texture.bind();
|
texture.bind();
|
||||||
/* fill texture memory with last frame's pixels */
|
/* fill texture memory with last frame's pixels */
|
||||||
texture.load(frame.ptr(), {frame.cols, frame.rows}, GL_BGR, GL_UNSIGNED_BYTE);
|
texture.load(frame.ptr(), {frame.cols, frame.rows}, GL_BGR, GL_UNSIGNED_BYTE);
|
||||||
pudding->capture_texture = texture;
|
pudding->camera_view.swap();
|
||||||
if (pudding->get_configuration()["scan"]["enabled"])
|
if (pudding->get_configuration()["scan"]["enabled"])
|
||||||
{
|
{
|
||||||
/* convert to gray and scan with zbar */
|
/* convert to gray and scan with zbar */
|
||||||
|
@ -761,7 +742,7 @@ void Pudding::update()
|
||||||
plane.enable();
|
plane.enable();
|
||||||
glUniform1i(uniform["flat"]["texture"], 0);
|
glUniform1i(uniform["flat"]["texture"], 0);
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
background_copy.tile().bind();
|
background.current().bind();
|
||||||
/* set blend to modify white part of background, color passed is in HSV format */
|
/* set blend to modify white part of background, color passed is in HSV format */
|
||||||
glUniform3f(uniform["flat"]["blend"], 0.0f, 0.0f, 1.0f);
|
glUniform3f(uniform["flat"]["blend"], 0.0f, 0.0f, 1.0f);
|
||||||
glUniform1i(uniform["flat"]["scroll"], true);
|
glUniform1i(uniform["flat"]["scroll"], true);
|
||||||
|
@ -845,7 +826,7 @@ void Pudding::update()
|
||||||
viewport_box.left(window_box(true).left());
|
viewport_box.left(window_box(true).left());
|
||||||
glViewport(viewport_box.left(), viewport_box.bottom(), viewport_box.width(), viewport_box.height());
|
glViewport(viewport_box.left(), viewport_box.bottom(), viewport_box.width(), viewport_box.height());
|
||||||
/* bind texture for drawing */
|
/* bind texture for drawing */
|
||||||
capture_texture.bind();
|
camera_view.current().bind();
|
||||||
/* draws rectangle vertices and rectangle texture using UV coords */
|
/* draws rectangle vertices and rectangle texture using UV coords */
|
||||||
glDrawArrays(GL_TRIANGLES, 0, plane.attributes("position")->count());
|
glDrawArrays(GL_TRIANGLES, 0, plane.attributes("position")->count());
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,12 +86,10 @@ private:
|
||||||
glm::mat4 projection, model = glm::mat4(1.0f), mvp;
|
glm::mat4 projection, model = glm::mat4(1.0f), mvp;
|
||||||
Model pudding_model;
|
Model pudding_model;
|
||||||
Plane plane;
|
Plane plane;
|
||||||
Background background, background_copy, background_copy_2;
|
Background background;
|
||||||
// Plane background, camera_frame;
|
CameraView camera_view;
|
||||||
bool show_item = false, reading_capture_frame = false;
|
bool show_item = false, reading_capture_frame = false;
|
||||||
SDL_GLContext capture_frame_thread_context = nullptr;
|
SDL_GLContext capture_frame_thread_context = nullptr;
|
||||||
sb::Texture capture_texture_front_buffer, capture_texture_back_buffer;
|
|
||||||
sb::Texture& capture_texture = capture_texture_front_buffer;
|
|
||||||
sb::VAO vao;
|
sb::VAO vao;
|
||||||
sb::VBO vbo;
|
sb::VBO vbo;
|
||||||
|
|
||||||
|
|
33
src/mvp.vert
33
src/mvp.vert
|
@ -1,11 +1,12 @@
|
||||||
/* _______________ +---------------------------------------------------------------------------------------+
|
/* _______________ ,----------------------------------------------------------------.
|
||||||
//~~~~~~~~~~~~~\\ | a game by @ohsqueezy & @sleepin |
|
//`````````````\\ \ \
|
||||||
//```````````````\\ | [ohsqueezy.itch.io] [instagram.com/sleepin] |
|
//~~~~~~~~~~~~~~~\\ \ by @ohsqueezy & @sleepin \
|
||||||
//_0_0_0_0_0_0_0_0_\\ | |
|
//=================\\ \ [ohsqueezy.itch.io] [sleepin.itch.io] \
|
||||||
//_/_/_/_/___\_\_\_\_\\ | with code licensed for copy, modification and redistribution [git.nugget.fun/pudding] |
|
// \\ \ \
|
||||||
//GGGUUUNNNKKKIIISSSSSS\\ | |
|
// \\ \ code released under the zlib license [git.nugget.fun/pudding] \
|
||||||
//_/__/__/__/_\__\__\__\_\\ | 😀 Thank you for choosing Puddendo for your business 😀 |
|
// ☆ GUNKISS ☆ \\ \ \
|
||||||
+---------------------------------------------------------------------------------------+ */
|
//_________________________\\ `---------------------------------------------------------------*/
|
||||||
|
|
||||||
#version 130
|
#version 130
|
||||||
|
|
||||||
#define PI 3.1415926535897932384626433832795
|
#define PI 3.1415926535897932384626433832795
|
||||||
|
@ -16,8 +17,8 @@
|
||||||
#define EFFECT_SNAKE 1
|
#define EFFECT_SNAKE 1
|
||||||
#define EFFECT_WOBBLE 2
|
#define EFFECT_WOBBLE 2
|
||||||
|
|
||||||
in vec3 in_position;
|
in vec3 vertex_position;
|
||||||
in vec3 in_color;
|
in vec3 vertex_color;
|
||||||
in vec2 vertex_uv;
|
in vec2 vertex_uv;
|
||||||
uniform mat4 mvp;
|
uniform mat4 mvp;
|
||||||
uniform float time;
|
uniform float time;
|
||||||
|
@ -32,7 +33,7 @@ out vec3 clip_coordinates;
|
||||||
* flattened coordinates (after projection matrix has been applied) */
|
* flattened coordinates (after projection matrix has been applied) */
|
||||||
void wobble()
|
void wobble()
|
||||||
{
|
{
|
||||||
gl_Position.x += sin(time * 10.0) * in_position.y / 2.0;
|
gl_Position.x += sin(time * 10.0) * vertex_position.y / 2.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Contort the X-coordinate according the time step and Y-coordinate using the sine function. This contorts
|
/* Contort the X-coordinate according the time step and Y-coordinate using the sine function. This contorts
|
||||||
|
@ -43,7 +44,7 @@ void wobble()
|
||||||
void snake()
|
void snake()
|
||||||
{
|
{
|
||||||
gl_Position = vec4(
|
gl_Position = vec4(
|
||||||
in_position.x + AMPLITUDE * sin(2.0 * PI / PERIOD * (time + in_position.y * PERIOD / WAVELENGTH)), in_position.yz, 1);
|
vertex_position.x + AMPLITUDE * sin(2.0 * PI / PERIOD * (time + vertex_position.y * PERIOD / WAVELENGTH)), vertex_position.yz, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void main()
|
void main()
|
||||||
|
@ -54,7 +55,7 @@ void main()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
gl_Position = vec4(in_position, 1);
|
gl_Position = vec4(vertex_position, 1);
|
||||||
}
|
}
|
||||||
gl_Position = mvp * gl_Position;
|
gl_Position = mvp * gl_Position;
|
||||||
if (effect == EFFECT_WOBBLE)
|
if (effect == EFFECT_WOBBLE)
|
||||||
|
@ -62,9 +63,9 @@ void main()
|
||||||
wobble();
|
wobble();
|
||||||
}
|
}
|
||||||
/* passing to fragment program */
|
/* passing to fragment program */
|
||||||
ex_color = in_color;
|
ex_color = vertex_color;
|
||||||
x_center_proximity = 1.8 - abs(in_position[0]);
|
x_center_proximity = 1.8 - abs(vertex_position[0]);
|
||||||
fragment_uv = vertex_uv;
|
fragment_uv = vertex_uv;
|
||||||
original_coordinates = in_position;
|
original_coordinates = vertex_position;
|
||||||
clip_coordinates = gl_Position.xyz;
|
clip_coordinates = gl_Position.xyz;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue