crosshair

This commit is contained in:
onezplpl 2024-07-18 17:04:40 -04:00
parent 328be44ed0
commit e799d50f77
No known key found for this signature in database
GPG key ID: 7EC026A136F9EEC3
5 changed files with 94 additions and 18 deletions

View file

@ -134,8 +134,10 @@ struct v3f control_rtrace(double cx, double cy, vec3 pos, int mode) {
vec3_add(temp_pos, temp_pos, temp_dir); vec3_add(temp_pos, temp_pos, temp_dir);
if (gen_cube(temp_pos[0],temp_pos[1],temp_pos[2],placeChunk,0,-1) != 0) { if (gen_cube(temp_pos[0], temp_pos[1], temp_pos[2], placeChunk, 0, -1) !=
if (mode == 0) vec3_sub(temp_pos,temp_pos,temp_dir); 0) {
if (mode == 0)
vec3_sub(temp_pos, temp_pos, temp_dir);
break; break;
} }
} }
@ -149,15 +151,21 @@ struct v3f control_rtrace(double cx, double cy, vec3 pos, int mode) {
void control_lclick(double cx, double cy, vec3 pos) { void control_lclick(double cx, double cy, vec3 pos) {
struct v3f highlighted = control_rtrace(cx, cy, pos, 1); struct v3f highlighted = control_rtrace(cx, cy, pos, 1);
struct chunk placeChunk; struct chunk placeChunk;
int cube = gen_cube(highlighted.pos[0],highlighted.pos[1],highlighted.pos[2],placeChunk,0,-1); int cube = gen_cube(highlighted.pos[0], highlighted.pos[1],
if (cube == 0) return; highlighted.pos[2], placeChunk, 0, -1);
gen_cube(highlighted.pos[0],highlighted.pos[1],highlighted.pos[2],placeChunk,0,0); if (cube == 0)
return;
gen_cube(highlighted.pos[0], highlighted.pos[1], highlighted.pos[2],
placeChunk, 0, 0);
} }
void control_rclick(double cx, double cy, vec3 pos) { void control_rclick(double cx, double cy, vec3 pos) {
struct v3f highlighted = control_rtrace(cx, cy, pos, 0); struct v3f highlighted = control_rtrace(cx, cy, pos, 0);
struct chunk placeChunk; struct chunk placeChunk;
int cube = gen_cube(highlighted.pos[0],highlighted.pos[1],highlighted.pos[2],placeChunk,0,-1); int cube = gen_cube(highlighted.pos[0], highlighted.pos[1],
if (cube != 0) return; highlighted.pos[2], placeChunk, 0, -1);
gen_cube(highlighted.pos[0],highlighted.pos[1],highlighted.pos[2],placeChunk,0,1); if (cube != 0)
return;
gen_cube(highlighted.pos[0], highlighted.pos[1], highlighted.pos[2],
placeChunk, 0, 1);
} }

35
cubes.c
View file

@ -22,6 +22,38 @@ int oz = -1024;
struct chunk *chunk_old = NULL; struct chunk *chunk_old = NULL;
void cubes_rect(struct v3f *cube, int *i, double x1, double x2, double y1,
double y2, int is_text, int text_x, int text_y) {
struct v3f a2 = {{x1, y1, 0}};
if (is_text) {
a2.pos[0] = TEXT_GAP_H * text_x;
a2.pos[1] = TEXT_GAP_V * text_y;
a2.pos[2] = 0;
}
struct v3f b = a2;
struct v3f c = a2;
struct v3f d = a2;
if (is_text) {
b.pos[0] += TEXT_GAP_H;
c.pos[1] += TEXT_GAP_V;
d.pos[0] += TEXT_GAP_H;
d.pos[1] += TEXT_GAP_V;
} else {
b.pos[0]++;
c.pos[1]++;
d.pos[0]++;
d.pos[1]++;
}
cube[*i] = a2;
cube[*i + 1] = b;
cube[*i + 2] = c;
cube[*i + 3] = c;
cube[*i + 4] = b;
cube[*i + 5] = d;
}
void cubes_face(struct v3f *cube, int i, int x, int y, int z, int x2, int y2, void cubes_face(struct v3f *cube, int i, int x, int y, int z, int x2, int y2,
int z2, int *j, int is_text, struct chunk dat, int ci, int a3) { int z2, int *j, int is_text, struct chunk dat, int ci, int a3) {
struct v3i a = {{x, y, z}}; struct v3i a = {{x, y, z}};
@ -137,7 +169,8 @@ void cubes_free() { free(chunk_old); }
void cubes_refresh(int x, int y, int z, struct chunk dat) { void cubes_refresh(int x, int y, int z, struct chunk dat) {
for (int i = 0; i < CHUNK_ALL; i++) { for (int i = 0; i < CHUNK_ALL; i++) {
if (chunk_old[i].exists != 0 && abs(((int)chunk_old[i].x) - x) <= 1 && if (chunk_old[i].exists != 0 && abs(((int)chunk_old[i].x) - x) <= 1 &&
abs(((int)chunk_old[i].y) - y) <= 1 && abs(((int)chunk_old[i].z) - z) <= 1) { abs(((int)chunk_old[i].y) - y) <= 1 &&
abs(((int)chunk_old[i].z) - z) <= 1) {
chunk_old[i].exists = 0; chunk_old[i].exists = 0;
} }
} }

View file

@ -7,7 +7,7 @@
#define CHUNK_RADIUS_V 4 // 4 #define CHUNK_RADIUS_V 4 // 4
#define TEXT_GAP_H 1 / 6.0 #define TEXT_GAP_H 1 / 6.0
#define TEXT_GAP_V 1 / 6.0 #define TEXT_GAP_V 1 / 7.0
#define CHUNK_DIAMETER_H (CHUNK_RADIUS_H * 2 + 1) #define CHUNK_DIAMETER_H (CHUNK_RADIUS_H * 2 + 1)
#define CHUNK_DIAMETER_V (CHUNK_RADIUS_V * 2 + 1) #define CHUNK_DIAMETER_V (CHUNK_RADIUS_V * 2 + 1)
@ -15,6 +15,7 @@
#define BLOCK_ALL CHUNK_LENGTH *CHUNK_LENGTH *CHUNK_LENGTH #define BLOCK_ALL CHUNK_LENGTH *CHUNK_LENGTH *CHUNK_LENGTH
#define CBLOCK_ALL BLOCK_ALL *CHUNK_ALL #define CBLOCK_ALL BLOCK_ALL *CHUNK_ALL
#define CBUF_ALL 2 #define CBUF_ALL 2
#define UI_ALL 1024
#define CTRI_ALL CBLOCK_ALL * 18 * sizeof(struct v3f) #define CTRI_ALL CBLOCK_ALL * 18 * sizeof(struct v3f)
@ -43,4 +44,6 @@ int cubes_vert(struct v3f *cube, struct v3f *text, struct v3f *cubeO,
void cubes_free(); void cubes_free();
void cubes_refresh(int x, int y, int z, struct chunk dat); void cubes_refresh(int x, int y, int z, struct chunk dat);
void cubes_rect(struct v3f *cube, int *i, double x1, double x2, double y1,
double y2, int is_text, int text_x, int text_y);
#endif #endif

46
main.c
View file

@ -37,13 +37,16 @@ static const char *fragment_shader_text =
"in vec3 v_pos_out;\n" "in vec3 v_pos_out;\n"
"uniform sampler2D sampler_tex;\n" "uniform sampler2D sampler_tex;\n"
"uniform vec3 center;\n" "uniform vec3 center;\n"
"uniform int use_shading;\n"
"float dist;\n" "float dist;\n"
"void main()\n" "void main()\n"
"{\n" "{\n"
//" color=vec4(v_tex.rg,0.5,0.5);\n" //" color=vec4(v_tex.rg,0.5,0.5);\n"
" if (v_tex.x < 0.0 || v_tex.y < 0.0) { discard; }\n" " if (v_tex.x < 0.0 || v_tex.y < 0.0 || texture(sampler_tex, v_tex).a "
"== 0.0) { discard; }\n"
" dist = distance(v_pos_out, center + vec3(8,8,8))/65;\n" " dist = distance(v_pos_out, center + vec3(8,8,8))/65;\n"
" if (dist > 1.0) { dist = 1.0; }\n" " if (dist > 1.0) { dist = 1.0; }\n"
" if (use_shading == 0) { dist = 0.0; }\n"
" color=vec4(texture(sampler_tex, v_tex).rgb,1.0)*(1.0-(dist*dist)) + " " color=vec4(texture(sampler_tex, v_tex).rgb,1.0)*(1.0-(dist*dist)) + "
"vec4(0.2,0.5,0.7,1.0)*(dist*dist);\n" "vec4(0.2,0.5,0.7,1.0)*(dist*dist);\n"
"}\n"; "}\n";
@ -144,8 +147,8 @@ int main(void) {
struct v3f *cube = malloc(CTRI_ALL); struct v3f *cube = malloc(CTRI_ALL);
struct v3f *text = malloc(CTRI_ALL); struct v3f *text = malloc(CTRI_ALL);
struct v3f *cubeO = malloc(CTRI_ALL); struct v3f *cubeO = malloc(CTRI_ALL + UI_ALL * 18 * sizeof(struct v3f));
struct v3f *textO = malloc(CTRI_ALL); struct v3f *textO = malloc(CTRI_ALL + UI_ALL * 18 * sizeof(struct v3f));
int bleh = (CHUNK_DIAMETER_H) * (CHUNK_DIAMETER_V); int bleh = (CHUNK_DIAMETER_H) * (CHUNK_DIAMETER_V);
int *i2 = calloc(CHUNK_ALL, sizeof(int)); int *i2 = calloc(CHUNK_ALL, sizeof(int));
@ -158,13 +161,13 @@ int main(void) {
glGenBuffers(2, vertex_buffer); glGenBuffers(2, vertex_buffer);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer[1]); glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer[1]);
glBufferData(GL_ARRAY_BUFFER, CTRI_ALL, text, GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, CTRI_ALL + UI_ALL* 18 * sizeof(struct v3f), textO, GL_STATIC_DRAW);
glEnableVertexAttribArray(1); glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(struct v3f), glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(struct v3f),
(void *)0); (void *)0);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer[0]); glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer[0]);
glBufferData(GL_ARRAY_BUFFER, CTRI_ALL, cube, GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, CTRI_ALL + UI_ALL * 18 * sizeof(struct v3f), cubeO, GL_STATIC_DRAW);
glEnableVertexAttribArray(0); glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(struct v3f), glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(struct v3f),
(void *)0); (void *)0);
@ -185,11 +188,12 @@ int main(void) {
GLint tex_location = glGetUniformLocation(program, "sampler_tex"); GLint tex_location = glGetUniformLocation(program, "sampler_tex");
GLint mvp_location = glGetUniformLocation(program, "mvp"); GLint mvp_location = glGetUniformLocation(program, "mvp");
GLint center_location = glGetUniformLocation(program, "center"); GLint center_location = glGetUniformLocation(program, "center");
GLint use_shading = glGetUniformLocation(program, "use_shading");
unsigned char *pixels; unsigned char *pixels;
int tx, ty, ch; int tx, ty, ch;
pixels = stbi_load("./test.png", &tx, &ty, &ch, 3); pixels = stbi_load("./test.png", &tx, &ty, &ch, 4);
glClearColor(0.2f, 0.5f, 0.7f, 1.0f); glClearColor(0.2f, 0.5f, 0.7f, 1.0f);
glEnable(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D);
@ -326,7 +330,7 @@ int main(void) {
glBindTexture(GL_TEXTURE_2D, GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, GL_TEXTURE0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tx, ty, 0, GL_RGB, GL_UNSIGNED_BYTE, glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tx, ty, 0, GL_RGBA, GL_UNSIGNED_BYTE,
pixels); pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
@ -336,7 +340,35 @@ int main(void) {
glBindVertexArray(vertex_array); glBindVertexArray(vertex_array);
glUniform1i(use_shading, 1);
glDrawArrays(GL_TRIANGLES, 0, cube_count); glDrawArrays(GL_TRIANGLES, 0, cube_count);
glClear(GL_DEPTH_BUFFER_BIT);
glUniform1i(use_shading, 0);
int iz = CBLOCK_ALL * 18;
cubes_rect(cubeO, &iz, -0.5,0.5, -0.5, 0.5, 0, 0, 6);
cubes_rect(textO, &iz, -0.5, 0.5, -0.5, 0.5, 1, 0, 6);
mat4x4_identity(v);
mat4x4_ortho(p, -ratio*15, ratio*15, -1.f*15, 1.f*15, 1.0f, -1.0f);
mat4x4_mul(mvp, p, v);
mat4x4_mul(mvp, mvp, m);
glUniformMatrix4fv(mvp_location, 1, GL_FALSE, (const GLfloat *)&mvp);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer[1]);
glBufferSubData(GL_ARRAY_BUFFER, CTRI_ALL,
(long)6 * sizeof(struct v3f), &textO[iz]);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer[0]);
glBufferSubData(GL_ARRAY_BUFFER, CTRI_ALL,
(long)6 * sizeof(struct v3f), &cubeO[iz]);
glBindVertexArray(vertex_array);
glDrawArrays(GL_TRIANGLES, CBLOCK_ALL * 18, 6);
} }
free(cube); free(cube);

BIN
test.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Before After
Before After