diff --git a/client/gl.c b/client/gl.c index c4d48b3..9f3193a 100644 --- a/client/gl.c +++ b/client/gl.c @@ -18,8 +18,30 @@ void gl_resize(int width, int height) { } void gl_init(void) { + GLfloat lightamb[] = {0.1, 0.1, 0.1, 1.0}; + GLfloat lightcol[] = {1.0, 1.0, 1.0, 1.0}; + const GLdouble genfunc[][4] = { + {1.0, 0.0, 0.0, 0.0}, + {0.0, 1.0, 0.0, 0.0}, + {0.0, 0.0, 1.0, 0.0}, + {0.0, 0.0, 0.0, 1.0}, + }; + glEnable(GL_DEPTH_TEST); + glEnable(GL_NORMALIZE); glEnable(GL_BLEND); + glEnable(GL_COLOR_MATERIAL); + glEnable(GL_LIGHT0); + glEnable(GL_LIGHTING); + glEnable(GL_CULL_FACE); + + glLightfv(GL_LIGHT0, GL_AMBIENT, lightamb); + glLightfv(GL_LIGHT0, GL_DIFFUSE, lightcol); + glLightfv(GL_LIGHT0, GL_SPECULAR, lightcol); + + glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE); + + glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); @@ -28,22 +50,62 @@ void gl_init(void) { gl_font_init(); } +static void gl_common(void) { + char buf[128]; + glColor3f(1, 0, 0); + + sprintf(buf, "AssaultFish %s", AF_VERSION); + gl_font_text(buf, MwGetInteger(opengl, MwNwidth) - gl_font_width(buf), MwGetInteger(opengl, MwNheight) - gl_font_height(buf) * 2, 1); + + sprintf(buf, "%s", AF_COPYRIGHT); + gl_font_text(buf, MwGetInteger(opengl, MwNwidth) - gl_font_width(buf), MwGetInteger(opengl, MwNheight) - gl_font_height(buf), 1); +} + void gl_render(void) { - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + GLfloat lightpos[4] = {0, 5, 0, 1}; + GLdouble modelview[16]; if(gl_scenes[gl_scene].init != NULL) gl_scenes[gl_scene].init(); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); glLoadIdentity(); - gluPerspective(60, (double)MwGetInteger(opengl, MwNwidth) / MwGetInteger(opengl, MwNheight), 0.01, 100); - + gluPerspective(60, (double)MwGetInteger(opengl, MwNwidth) / MwGetInteger(opengl, MwNheight), 0.01, 100.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(gl_cam_x, gl_cam_y, gl_cam_z, gl_cam_x + cos(gl_cam_lr / 180.0 * M_PI), gl_cam_y + sin(gl_cam_ud / 180.0 * M_PI), gl_cam_z + sin(gl_cam_lr / 180.0 * M_PI), 0, 1, 0); + glLightfv(GL_LIGHT0, GL_POSITION, lightpos); + if(gl_scenes[gl_scene].draw != NULL) gl_scenes[gl_scene].draw(); + + gl_common(); } void gl_scene_change(void) { if(gl_scenes[gl_scene].changed != NULL) gl_scenes[gl_scene].changed(); } + +static void cross(double* out, double v00, double v01, double v02, double v10, double v11, double v12) { + out[0] = v01 * v12 - v02 * v11; + out[1] = v02 * v10 - v00 * v12; + out[2] = v00 * v11 - v01 * v10; +} + +void gl_calc_normal(double* out, double v00, double v01, double v02, double v10, double v11, double v12, double v20, double v21, double v22) { + double v[3]; + double l = 0; + int i; + + cross(&v[0], /**/ + v10 - v00, v11 - v01, v12 - v02, /**/ + v20 - v00, v21 - v01, v22 - v02 /**/ + ); + + l = sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); + + for(i = 0; i < 3; i++) { + out[i] = v[i] / l; + } +} diff --git a/client/gl_font.c b/client/gl_font.c index 932ce3c..3c50f75 100644 --- a/client/gl_font.c +++ b/client/gl_font.c @@ -23,9 +23,10 @@ void gl_font_init(void) { void gl_font_text(const char* text, int x, int y, double scale) { int i; int gw = font_width / 16 * scale, gh = font_height / 16 * scale; + int is = glIsEnabled(GL_TEXTURE_2D) ? 1 : 0; glDisable(GL_DEPTH_TEST); - glEnable(GL_TEXTURE_2D); + if(!is) glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, font_atlas); glMatrixMode(GL_PROJECTION); @@ -61,7 +62,7 @@ void gl_font_text(const char* text, int x, int y, double scale) { glMatrixMode(GL_MODELVIEW); glBindTexture(GL_TEXTURE_2D, 0); - glEnable(GL_TEXTURE_2D); + if(!is) glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); } diff --git a/client/gl_main.c b/client/gl_main.c index 2edc772..96b1be4 100644 --- a/client/gl_main.c +++ b/client/gl_main.c @@ -18,23 +18,32 @@ void gl_main_init(void) { void gl_main_draw(void) { int i; - glDisable(GL_DEPTH_TEST); glPushMatrix(); glRotatef(rad, 1, 0, 0); glRotatef(rad, 0, 1, 0); glRotatef(rad, 0, 0, 1); - glBegin(GL_TRIANGLES); for(i = 0; i < 8; i++) { - double r = i * 90 / 180.0 * M_PI; - int c = ((i + (i / 4)) % 2) == 0 ? 1 : 0; - glColor4f(c ? 0.75 : 0, 0, c ? 0 : 0.75, 0.5); - glVertex3f(0, (i > 3 ? -1 : 1) * 0.5, 0); - glVertex3f(cos(r) / 2, 0, sin(r) / 2); - glVertex3f(cos(r + 90 / 180.0 * M_PI) / 2, 0, sin(r + 90 / 180.0 * M_PI) / 2); + int c = (i % 2) == 0 ? 1 : 0; + double n[3]; + double u = 0.3; + + gl_calc_normal(&n[0], 0, u * 1.4, 0, -u, 0, u, u, 0, u); + + glColor3f(c ? 0.75 : 0, 0, c ? 0 : 0.75); + glBegin(GL_TRIANGLES); + glNormal3f(n[0], n[1], n[2]); + glVertex3f(0, u * 1.4, 0); + glVertex3f(-u, 0, u); + glVertex3f(u, 0, u); + glEnd(); + glRotatef(90, 0, 1, 0); + if(i == 3) { + glRotatef(180, 0, 0, 1); + glRotatef(90, 0, 1, 0); + } } - glEnd(); + glPopMatrix(); - glEnable(GL_DEPTH_TEST); rad += 60.0 / (1000.0 / AF_WAIT_MS); } diff --git a/include/af_client.h b/include/af_client.h index 326e33d..fd9d20c 100644 --- a/include/af_client.h +++ b/include/af_client.h @@ -38,6 +38,7 @@ void gl_init(void); void gl_render(void); void gl_resize(int width, int height); void gl_scene_change(void); +void gl_calc_normal(double* out, double v00, double v01, double v02, double v10, double v11, double v12, double v20, double v21, double v22); /* gl_font.c */ void gl_font_init(void); diff --git a/include/af_common.h b/include/af_common.h index 02f38cc..65ada07 100644 --- a/include/af_common.h +++ b/include/af_common.h @@ -18,6 +18,8 @@ #endif #define AF_DEFAULT_PORT 5312 +#define AF_VERSION "0.0.0" +#define AF_COPYRIGHT "Copyright (C) 2025 Fishsoup" /* should be broadcasted! otherwise other user wouldn't know */ typedef struct af_pkt_join {