From 8ccfe726fccad1f84eb0e26ebfc6ffb0a231c7f1 Mon Sep 17 00:00:00 2001 From: onezplpl Date: Fri, 19 Jul 2024 21:14:40 -0400 Subject: [PATCH] basic inventory (doesn't save) --- control.c | 43 ++++++++++++++++++++++++++++++++---------- control.h | 6 ++++-- cubes.h | 4 ++-- inv.h | 8 ++++++++ main.c | 55 +++++++++++++++++++++++++++++++++++++++--------------- test.png | Bin 9133 -> 9746 bytes 6 files changed, 87 insertions(+), 29 deletions(-) create mode 100644 inv.h diff --git a/control.c b/control.c index a6bc77e..290a32e 100644 --- a/control.c +++ b/control.c @@ -1,8 +1,8 @@ #include "cubes.h" #include "gen.h" +#include "inv.h" #include "linmath.h" #include -#include int is_space; @@ -66,9 +66,9 @@ struct v3f control_handler(double cx, double cy, vec3 pos, vec3 dir_temp, for (int a = -2; a < 0; a++) { off[1] = a; for (int b = -1; b < 1; b++) { - off[0] = (b + 0.5)*0.95; + off[0] = (b + 0.5) * 0.95; for (int c = -1; c < 1; c++) { - off[2] = (c + 0.5)*0.95; + off[2] = (c + 0.5) * 0.95; col = col || gen_cube(pos[0] + off[0], pos[1] + off[1], pos[2] + off[2], chunk, 0, -1); } @@ -82,9 +82,9 @@ struct v3f control_handler(double cx, double cy, vec3 pos, vec3 dir_temp, off[1] = -2; for (int b = -1; b < 1; b++) { - off[0] = (b + 0.5)*0.95; + off[0] = (b + 0.5) * 0.95; for (int c = -1; c < 1; c++) { - off[2] = (c + 0.5)*0.95; + off[2] = (c + 0.5) * 0.95; col = col || gen_cube(pos[0] + off[0], pos[1] + off[1], pos[2] + off[2], chunk, 0, -1); } @@ -152,7 +152,7 @@ struct v3f control_rtrace(double cx, double cy, vec3 pos, int mode) { return out_pos; } -void control_lclick(double cx, double cy, vec3 pos) { +void control_lclick(double cx, double cy, vec3 pos, struct item *inv) { struct v3f highlighted = control_rtrace(cx, cy, pos, 1); struct chunk placeChunk; int cube = gen_cube(highlighted.pos[0], highlighted.pos[1], @@ -163,16 +163,39 @@ void control_lclick(double cx, double cy, vec3 pos) { return; gen_cube(highlighted.pos[0], highlighted.pos[1], highlighted.pos[2], placeChunk, 0, 0); + + for (int i = 0; i < 10; i++) { + if (inv[i].id == 0) { + inv[i].id = cube; + inv[i].count = 0; + } + if (inv[i].id == cube) { + inv[i].count++; + break; + } + } } -void control_rclick(double cx, double cy, vec3 pos) { +void control_rclick(double cx, double cy, vec3 pos, struct item *inv, int slot) { struct v3f highlighted = control_rtrace(cx, cy, pos, 0); struct chunk placeChunk; int cube = gen_cube(highlighted.pos[0], highlighted.pos[1], highlighted.pos[2], placeChunk, 0, -1); - if (cube != 0 || - (fabs(highlighted.pos[0] - pos[0]) < 1 && fabs(highlighted.pos[1] - pos[1] + 0.5) < 1.5 && fabs(highlighted.pos[2] - pos[2]) < 1)) + if (cube != 0 || (fabs(highlighted.pos[0] - pos[0]) < 1 && + fabs(highlighted.pos[1] - pos[1] + 0.5) < 1.5 && + fabs(highlighted.pos[2] - pos[2]) < 1)) return; gen_cube(highlighted.pos[0], highlighted.pos[1], highlighted.pos[2], - placeChunk, 0, 1); + placeChunk, 0, inv[slot].id); + + for (int i = 0; i < 10; i++) { + if (inv[i].id == inv[slot].id) { + inv[i].count--; + if (inv[i].count == 0) { + inv[i].id = 0; + inv[i].count = 0; + } + break; + } + } } \ No newline at end of file diff --git a/control.h b/control.h index 0b556f2..9502994 100644 --- a/control.h +++ b/control.h @@ -2,9 +2,11 @@ #define V_CONTROL_H #include "cubes.h" #include "linmath.h" +#include "inv.h" + #include struct v3f control_handler(double cx, double cy, vec3 pos, vec3 dir_temp, GLFWwindow *window, struct chunk chunk); -void control_lclick(double cx, double cy, vec3 pos); -void control_rclick(double cx, double cy, vec3 pos); +void control_lclick(double cx, double cy, vec3 pos, struct item *inv); +void control_rclick(double cx, double cy, vec3 pos, struct item *inv, int slot); #endif \ No newline at end of file diff --git a/cubes.h b/cubes.h index 0f72abe..2da4cd9 100644 --- a/cubes.h +++ b/cubes.h @@ -7,7 +7,7 @@ #define CHUNK_RADIUS_V 4 // 4 #define TEXT_GAP_H 1 / 6.0 -#define TEXT_GAP_V 1 / 7.0 +#define TEXT_GAP_V 1 / 9.0 #define CHUNK_DIAMETER_H (CHUNK_RADIUS_H * 2 + 1) #define CHUNK_DIAMETER_V (CHUNK_RADIUS_V * 2 + 1) @@ -15,7 +15,7 @@ #define BLOCK_ALL CHUNK_LENGTH *CHUNK_LENGTH *CHUNK_LENGTH #define CBLOCK_ALL BLOCK_ALL *CHUNK_ALL #define CBUF_ALL 2 -#define UI_ALL 1024 +#define UI_ALL 20480 #define CTRI_ALL CBLOCK_ALL * 18 * sizeof(struct v3f) diff --git a/inv.h b/inv.h new file mode 100644 index 0000000..94b35b9 --- /dev/null +++ b/inv.h @@ -0,0 +1,8 @@ + +#ifndef V_INV_H +#define V_INV_H +struct item { + int id; + int count; +}; +#endif \ No newline at end of file diff --git a/main.c b/main.c index 62ce688..264786b 100644 --- a/main.c +++ b/main.c @@ -13,6 +13,7 @@ #include "cubes.h" #include "gen.h" #include "gl.h" +#include "inv.h" #include "linmath.h" #include "stb_image.h" @@ -52,6 +53,12 @@ static const char *fragment_shader_text = "}\n"; int isCursor = 0; +double cx = 0; +double cy = 0; +int fr = 0; +vec3 pos; +struct item *inv; +int slot; static void key_callback(GLFWwindow *window, int key, int scancode, int action, int mods) { @@ -63,22 +70,23 @@ static void key_callback(GLFWwindow *window, int key, int scancode, int action, glfwSetInputMode(window, GLFW_CURSOR, isCursor ? GLFW_CURSOR_NORMAL : GLFW_CURSOR_DISABLED); } + if (key == GLFW_KEY_Q && action == GLFW_PRESS) { + slot = (slot + 9) % 10; + } + if (key == GLFW_KEY_E && action == GLFW_PRESS) { + slot = (slot + 1) % 10; + } } -double cx = 0; -double cy = 0; -int fr = 0; -vec3 pos; - void mouse_button_callback(GLFWwindow *window, int button, int action, int mods) { if (button == GLFW_MOUSE_BUTTON_RIGHT && action == GLFW_PRESS) { fr = 1; - control_rclick(cx, cy, pos); + control_rclick(cx, cy, pos, inv, slot); } if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS) { fr = 1; - control_lclick(cx, cy, pos); + control_lclick(cx, cy, pos, inv); } } @@ -128,6 +136,8 @@ void *render_chunks(void *args) { #define WinMain main int main(void) { + inv = calloc(10, sizeof(struct item)); + if (!glfwInit()) exit(EXIT_FAILURE); @@ -359,12 +369,27 @@ int main(void) { cubes_rect(textO, &iz, -0.5, 0.5, -0.5, 0.5, 1, 0, 6); for (int i = 0; i < 10; i++) { + for (int x = 0; x < 3; x++) { + int dig = (int)(inv[i].count / (pow(10, x))) % 10; + + dig = (dig + 9) % 10; + + iz += 6; + cubes_rect(cubeO, &iz, ((i - 4.5) * 2.5) + 0.5 - ((x + 1) * 0.5), + ((i - 4.5) * 2.5) + 1 - ((x + 1) * 0.5), -10, -10.5, 0, 0, + 0); + cubes_rect(textO, &iz, 0, 0, 0, 0, 1, (dig + 3) % 6, (dig + 3) / 6 + 6); + } iz += 6; cubes_rect(cubeO, &iz, ((i - 4.5) * 2.5) - 1, ((i - 4.5) * 2.5) + 1, -11, - -9, 0, 1, 6); - cubes_rect(textO, &iz, ((i - 4.5) * 2.5) - 1, ((i - 4.5) * 2.5) + 1, -11, - -9, 1, 1, 6); + -9, 0, 0, 0); + cubes_rect(textO, &iz, 0, 0, 0, 0, 1, (slot == i) ? 1 : 2, 6); + iz += 6; + cubes_rect(cubeO, &iz, ((i - 4.5) * 2.5) - 0.5, ((i - 4.5) * 2.5) + 0.5, + -10.5, -9.5, 0, 0, 0); + cubes_rect(textO, &iz, 0, 0, 0, 0, 1, inv[i].id - 1, 0); } + iz += 6; mat4x4_identity(v); mat4x4_ortho(p, -ratio * 15, ratio * 15, -1.f * 15, 1.f * 15, 1.0f, -1.0f); @@ -374,15 +399,15 @@ int main(void) { glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat *)&mvp); glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer[1]); - glBufferSubData(GL_ARRAY_BUFFER, CTRI_ALL, - (long)6 * 11 * sizeof(struct v3f), &textO[iz2]); + glBufferSubData(GL_ARRAY_BUFFER, CTRI_ALL, (iz - iz2) * sizeof(struct v3f), + &textO[iz2]); glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer[0]); - glBufferSubData(GL_ARRAY_BUFFER, CTRI_ALL, - (long)6 * 11 * sizeof(struct v3f), &cubeO[iz2]); + glBufferSubData(GL_ARRAY_BUFFER, CTRI_ALL, (iz - iz2) * sizeof(struct v3f), + &cubeO[iz2]); glBindVertexArray(vertex_array); - glDrawArrays(GL_TRIANGLES, CBLOCK_ALL * 18, 6 * 11); + glDrawArrays(GL_TRIANGLES, CBLOCK_ALL * 18, (iz - iz2)); } if (fp) { diff --git a/test.png b/test.png index af944e4b4c5fa2186f9b0379d2128d0cd270cc98..e89ddcacf51411a45dabc2247a6144591a22b40f 100644 GIT binary patch delta 5369 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 delta 4921 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