shadow
This commit is contained in:
parent
b9f4b88381
commit
8ea9cdf08c
8 changed files with 108 additions and 43 deletions
47
client/gl.c
47
client/gl.c
|
|
@ -11,7 +11,9 @@ double gl_cam_z;
|
|||
|
||||
int gl_scene = AF_SCENE_MAIN;
|
||||
|
||||
static GLuint shadow_texture, shadow;
|
||||
GLuint gl_shadow;
|
||||
|
||||
static GLuint shadow_texture;
|
||||
|
||||
gl_scene_t gl_scenes[] = {
|
||||
{gl_main_changed, gl_main_init, gl_main_draw, gl_main_after}, /**/
|
||||
|
|
@ -25,7 +27,7 @@ void gl_resize(int width, int height) {
|
|||
}
|
||||
|
||||
void gl_init(void) {
|
||||
GLfloat lightamb[] = {0.1, 0.1, 0.1, 1.0};
|
||||
GLfloat lightamb[] = {0.25, 0.25, 0.25, 1.0};
|
||||
GLfloat lightcol[] = {1.0, 1.0, 1.0, 1.0};
|
||||
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
|
@ -70,9 +72,10 @@ void gl_init(void) {
|
|||
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
|
||||
if(gl_shader(&shadow, DATAROOTDIR "/assaultfish/shadow.vs", DATAROOTDIR "/assaultfish/shadow.fs")) {
|
||||
glUseProgram(shadow);
|
||||
glUniform1i(glGetUniformLocation(shadow, "texture"), 1);
|
||||
if(gl_shader(&gl_shadow, DATAROOTDIR "/assaultfish/shadow.vs", DATAROOTDIR "/assaultfish/shadow.fs")) {
|
||||
glUseProgram(gl_shadow);
|
||||
glUniform1i(glGetUniformLocation(gl_shadow, "texture"), 1);
|
||||
glUniform1i(glGetUniformLocation(gl_shadow, "texture_in"), 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -109,16 +112,34 @@ void gl_cube(double x, double y, double z, double xs, double ys, double zs, doub
|
|||
}
|
||||
|
||||
static void gl_common(void) {
|
||||
char buf[128];
|
||||
char buf1[128];
|
||||
char buf2[128];
|
||||
int l;
|
||||
gl_util_begin_2d();
|
||||
|
||||
glColor4f(0, 0, 0, 0.5);
|
||||
sprintf(buf1, "AssaultFish %s", AF_VERSION);
|
||||
sprintf(buf2, "%s", AF_COPYRIGHT);
|
||||
|
||||
l = gl_font_width(buf1);
|
||||
if(l < gl_font_width(buf2)) l = gl_font_width(buf2);
|
||||
|
||||
glBegin(GL_QUADS);
|
||||
glVertex2f(MwGetInteger(opengl, MwNwidth) - l, MwGetInteger(opengl, MwNheight) - gl_font_height(buf1) - gl_font_height(buf2));
|
||||
glVertex2f(MwGetInteger(opengl, MwNwidth) - l, MwGetInteger(opengl, MwNheight));
|
||||
glVertex2f(MwGetInteger(opengl, MwNwidth), MwGetInteger(opengl, MwNheight));
|
||||
glVertex2f(MwGetInteger(opengl, MwNwidth), MwGetInteger(opengl, MwNheight) - gl_font_height(buf1) - gl_font_height(buf2));
|
||||
glEnd();
|
||||
|
||||
glColor3f(1, 1, 1);
|
||||
|
||||
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);
|
||||
gl_font_text(buf1, MwGetInteger(opengl, MwNwidth) - gl_font_width(buf1), MwGetInteger(opengl, MwNheight) - gl_font_height(buf1) - gl_font_height(buf2), 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);
|
||||
gl_font_text(buf2, MwGetInteger(opengl, MwNwidth) - gl_font_width(buf2), MwGetInteger(opengl, MwNheight) - gl_font_height(buf2), 1);
|
||||
|
||||
gl_font_text(gl_status, 0, 0, 1);
|
||||
|
||||
gl_util_end_2d();
|
||||
}
|
||||
|
||||
static void scene(void) {
|
||||
|
|
@ -157,9 +178,11 @@ void gl_render(void) {
|
|||
|
||||
scene();
|
||||
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glBindTexture(GL_TEXTURE_2D, shadow_texture);
|
||||
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, SHADOW_WIDTH, SHADOW_HEIGHT);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
|
||||
glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
|
||||
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||
|
|
@ -201,8 +224,6 @@ void gl_render(void) {
|
|||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
|
||||
glUseProgram(0);
|
||||
|
||||
glMatrixMode(GL_TEXTURE);
|
||||
glLoadIdentity();
|
||||
|
||||
|
|
@ -210,8 +231,6 @@ void gl_render(void) {
|
|||
|
||||
gl_common();
|
||||
|
||||
glUseProgram(shadow);
|
||||
|
||||
if(gl_scenes[gl_scene].after != NULL) gl_scenes[gl_scene].after();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -25,21 +25,11 @@ void gl_font_text(const char* text, int x, int y, double scale) {
|
|||
int gw = font_width / 16 * scale, gh = font_height / 16 * scale;
|
||||
int is = glIsEnabled(GL_TEXTURE_2D) ? 1 : 0;
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glDisable(GL_LIGHTING);
|
||||
glDisable(GL_CULL_FACE);
|
||||
gl_util_begin_2d();
|
||||
|
||||
if(!is) glEnable(GL_TEXTURE_2D);
|
||||
glBindTexture(GL_TEXTURE_2D, font_atlas);
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glPushMatrix();
|
||||
glLoadIdentity();
|
||||
glOrtho(0, MwGetInteger(opengl, MwNwidth), MwGetInteger(opengl, MwNheight), 0, -1, 1);
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPushMatrix();
|
||||
glLoadIdentity();
|
||||
|
||||
glBegin(GL_QUADS);
|
||||
for(i = 0; text[i] != 0; i++) {
|
||||
double bx = 1.0 / 16 * (text[i] % 16), by = 1.0 / 16 * (text[i] / 16);
|
||||
|
|
@ -55,19 +45,10 @@ void gl_font_text(const char* text, int x, int y, double scale) {
|
|||
}
|
||||
glEnd();
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPopMatrix();
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glPopMatrix();
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
if(!is) glEnable(GL_TEXTURE_2D);
|
||||
glEnable(GL_CULL_FACE);
|
||||
glEnable(GL_LIGHTING);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
if(!is) glDisable(GL_TEXTURE_2D);
|
||||
|
||||
gl_util_end_2d();
|
||||
}
|
||||
|
||||
int gl_font_width(const char* text) {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,7 @@
|
|||
#include <af_common.h>
|
||||
|
||||
#include <stb_image.h>
|
||||
|
||||
static double rad;
|
||||
|
||||
void gl_main_changed(void) {
|
||||
|
|
@ -18,6 +20,8 @@ void gl_main_init(void) {
|
|||
void gl_main_draw(void) {
|
||||
int i;
|
||||
|
||||
glUniform1f(glGetUniformLocation(gl_shadow, "solid_color"), 1);
|
||||
|
||||
glPushMatrix();
|
||||
glRotatef(rad, 1, 0, 0);
|
||||
glRotatef(rad, 0, 1, 0);
|
||||
|
|
@ -31,6 +35,7 @@ void gl_main_draw(void) {
|
|||
|
||||
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);
|
||||
|
|
@ -53,6 +58,8 @@ void gl_main_draw(void) {
|
|||
glVertex3f(5, -1, 5);
|
||||
glVertex3f(5, -1, -5);
|
||||
glEnd();
|
||||
|
||||
glUniform1f(glGetUniformLocation(gl_shadow, "solid_color"), 0);
|
||||
}
|
||||
|
||||
void gl_main_after(void) {
|
||||
|
|
|
|||
|
|
@ -53,6 +53,8 @@ int gl_shader(GLuint* r, const char* vs, const char* fs) {
|
|||
glDeleteShader(fsi);
|
||||
free(vss);
|
||||
free(fss);
|
||||
|
||||
printf("%s: compilation failure\n", vs);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -63,6 +65,8 @@ int gl_shader(GLuint* r, const char* vs, const char* fs) {
|
|||
glDeleteShader(fsi);
|
||||
free(vss);
|
||||
free(fss);
|
||||
|
||||
printf("%s: compilation failure\n", fs);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
34
client/gl_util.c
Normal file
34
client/gl_util.c
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
#include <af_common.h>
|
||||
|
||||
void gl_util_begin_2d(void) {
|
||||
glUseProgram(0);
|
||||
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glDisable(GL_LIGHTING);
|
||||
glDisable(GL_CULL_FACE);
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glPushMatrix();
|
||||
glLoadIdentity();
|
||||
glOrtho(0, MwGetInteger(opengl, MwNwidth), MwGetInteger(opengl, MwNheight), 0, -1, 1);
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPushMatrix();
|
||||
glLoadIdentity();
|
||||
}
|
||||
|
||||
void gl_util_end_2d(void) {
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPopMatrix();
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glPopMatrix();
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
|
||||
glEnable(GL_CULL_FACE);
|
||||
glEnable(GL_LIGHTING);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
glUseProgram(gl_shadow);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue