diff --git a/src/app.c b/src/app.c index 855d5c0..e3dcfa5 100644 --- a/src/app.c +++ b/src/app.c @@ -93,7 +93,7 @@ void update_app(App* app) void init_opengl() { // https://gitlab.com/imre-piller/me-courses/ alapjan. - /* glShadeModel(GL_SMOOTH); + glShadeModel(GL_SMOOTH); glEnable(GL_NORMALIZE); glEnable(GL_AUTO_NORMAL); @@ -106,7 +106,7 @@ void init_opengl() glEnable(GL_DEPTH_TEST); glClearDepth(1.0); glEnable(GL_TEXTURE_2D); - */ + } void reshape(GLsizei width, GLsizei height) diff --git a/src/camera.c b/src/camera.c index 534e5c9..c539554 100644 --- a/src/camera.c +++ b/src/camera.c @@ -108,13 +108,8 @@ void update_camera(Camera* camera, double time) } else { puts("is block"); camera->speed.z = 0; - - while(is_block(camera->cm->chunks[i].blocks[(int)camera->position.x] - [(int)camera->position.y] - [(int)camera->position.z-1])) { - camera->position.z+=0.2; - print_vec3f(camera->position, "camera"); - } + float diff = ceil(camera->position.z) - camera->position.z; + camera->position.z += diff; } if(!is_block(camera->cm->chunks[i].blocks[(int)x1][(int)y1][(int)z1-1])) { @@ -128,12 +123,8 @@ void update_camera(Camera* camera, double time) puts("is block"); camera->speed.z = 0; - while(is_block(camera->cm->chunks[i].blocks[(int)camera->position.x] - [(int)camera->position.y] - [(int)camera->position.z-1])) { - camera->position.z+=0.2; - print_vec3f(camera->position, "camera"); - } + float diff = ceil(camera->position.z) - camera->position.z; + camera->position.z += diff; } } diff --git a/src/chunk.c b/src/chunk.c index d451883..3762c85 100644 --- a/src/chunk.c +++ b/src/chunk.c @@ -95,15 +95,10 @@ void draw_cube(ChunkManager *cm, Block_type type, float x, float y, float z) glTexCoord2f(1, 1); glVertex3f(x+1.0, y-1.0, z-1.0); // Bottom-Left of left face glTexCoord2f(1, 0); glVertex3f(x+1.0, y-1.0, z); // Bottom-Right of left face glEnd(); - glFlush(); } void chunk_create_displayl(ChunkManager *cm, Chunk *chunk) { - - - - //glBindTexture(GL_TEXTURE_2D, 1); chunk->id = glGenLists(1); glBindTexture(GL_TEXTURE_2D, cm->textures[0].tid); glNewList(chunk->id, GL_COMPILE); diff --git a/src/main.c b/src/main.c index 431a094..e7a7147 100644 --- a/src/main.c +++ b/src/main.c @@ -14,215 +14,21 @@ int main() app.cm = &cm; init_app(&app, 1600, 900); - ///// - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - - glShadeModel(GL_SMOOTH); - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); - - glClearDepth(1.0f); - glDepthFunc(GL_LEQUAL); - glEnable(GL_DEPTH_TEST); - //glEnable(GL_CULL_FACE); - - glEnable(GL_NORMALIZE); - - - GLuint shadowmap_texture; - - float light_proj_matrix[16]; - float light_view_matrix[16]; - float cam_proj_matrix[16]; - float cam_view_matrix[16]; - - glGenTextures(1, &shadowmap_texture); - glBindTexture(GL_TEXTURE_2D, shadowmap_texture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, - SHADOWMAP_SIZE, SHADOWMAP_SIZE, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); - glEnable(GL_COLOR_MATERIAL); - - //GLfloat materialColor[] = {1.0f, 1.0f, 1.0f, 1.0f}; - //glMaterialfv(GL_FRONT, GL_SPECULAR, materialColor); - glMaterialf(GL_FRONT, GL_SHININESS, 64.0f); - - - - - //reshape(1600, 900); - glPushMatrix(); - glLoadIdentity(); - gluPerspective(45.0f, (float)1600/900, 1.0f, 10000.0f); - glGetFloatv(GL_MODELVIEW_MATRIX, cam_proj_matrix); - - - - glLoadIdentity(); - gluPerspective(45.0, 1.0, 2.0, 10000.0); - glGetFloatv(GL_MODELVIEW_MATRIX, light_proj_matrix); - - glLoadIdentity(); - gluLookAt(80, 80, 90, - 20.0, 20.0, 10.0, - 0.0, 0.0, 1.0); - glGetFloatv(GL_MODELVIEW_MATRIX, light_view_matrix); - - glPopMatrix(); ///// while(app.is_running) { clock_gettime(CLOCK_MONOTONIC_RAW, &start); - - vec3f cd = get_camera_dir_vec3f(&app.camera); - vec3f cp = app.camera.position; - - // glLoadIdentity(); - // gluLookAt(cp.x, cp.y, cp.z, - // 10.0, 10.0, 30.0, - // 0.0, 0.0, 1.0); - set_view(&app.camera); - glGetFloatv(GL_MODELVIEW_MATRIX, cam_view_matrix); - - + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - glMatrixMode(GL_PROJECTION); - glLoadMatrixf(light_proj_matrix); - - glMatrixMode(GL_MODELVIEW); - glLoadMatrixf(light_view_matrix); - - glViewport(0, 0, SHADOWMAP_SIZE, SHADOWMAP_SIZE); - - glCullFace(GL_FRONT); - - glShadeModel(GL_FLAT); - glColorMask(0, 0, 0, 0); - - for (int i = 0; i < app.cm->chunk_count; i++) { - chunk_render(&app.cm->chunks[i]); - //printf("c sp: %f\n", app.chunks[i].start_pos.x); - } - - glBindTexture(GL_TEXTURE_2D, shadowmap_texture); - glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, SHADOWMAP_SIZE, SHADOWMAP_SIZE); - - glCullFace(GL_BACK); - //glDisable(GL_CULL_FACE); - glShadeModel(GL_SMOOTH); - glColorMask(1, 1, 1, 1); - - glClear(GL_DEPTH_BUFFER_BIT); - glMatrixMode(GL_PROJECTION); - glLoadMatrixf(cam_proj_matrix); - glMatrixMode(GL_MODELVIEW); - glLoadMatrixf(cam_view_matrix); - glViewport(0, 0, 1600, 900); - /////////////// - handle_events(&app); update_app(&app); - float color1[4] = {0, 0, 0, 0}; - float color2[4] = {0, 0, 0, 0}; - float color3[4] = {1.0, 1.0, 1.0, 0.0}; - float light_pos[4] = {80, 80, 90, 0}; - glLightfv(GL_LIGHT1, GL_POSITION, light_pos); - glLightfv(GL_LIGHT1, GL_AMBIENT, color1); - glLightfv(GL_LIGHT1, GL_DIFFUSE, color1); - glLightfv(GL_LIGHT1, GL_SPECULAR, color2); - glEnable(GL_LIGHT1); - glEnable(GL_LIGHTING); - - //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - //set_view(&app.camera); + set_view(&app.camera); for (int i = 0; i < app.cm->chunk_count; i++) { chunk_render(&app.cm->chunks[i]); //printf("c sp: %f\n", app.chunks[i].start_pos.x); } - - glLightfv(GL_LIGHT1, GL_DIFFUSE, color3); - glLightfv(GL_LIGHT1, GL_SPECULAR, color3); - float bias[16] = {0.5f, 0.0f, 0.0f, 0.0f, - 0.0f, 0.5f, 0.0f, 0.0f, - 0.0f, 0.0f, 0.5f, 0.0f, - 0.5f, 0.5f, 0.5f, 1.0f}; - float m1[16]; - float tm[16]; - mult_matrix(bias, light_proj_matrix, m1); - mult_matrix(m1, light_view_matrix, tm); - - float v1[4] = {tm[0], tm[1], tm[2], tm[3]}; - glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); - glTexGenfv(GL_S, GL_EYE_PLANE, v1); - glEnable(GL_TEXTURE_GEN_S); - float v2[4] = {tm[4], tm[5], tm[6], tm[7]}; - glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); - glTexGenfv(GL_T, GL_EYE_PLANE, v2); - glEnable(GL_TEXTURE_GEN_T); - float v3[4] = {tm[8], tm[9], tm[10], tm[11]}; - glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); - glTexGenfv(GL_R, GL_EYE_PLANE, v3); - glEnable(GL_TEXTURE_GEN_R); - float v4[4] = {tm[12], tm[13], tm[14], tm[15]}; - glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); - glTexGenfv(GL_Q, GL_EYE_PLANE, v4); - glEnable(GL_TEXTURE_GEN_Q); - - glBindTexture(GL_TEXTURE_2D, shadowmap_texture); - glEnable(GL_TEXTURE_2D); - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL); - glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE_ARB, GL_INTENSITY); - glAlphaFunc(GL_GEQUAL, 0.99f); - glEnable(GL_ALPHA_TEST); - - //glMatrixMode(GL_MODELVIEW); - for (int i = 0; i < app.cm->chunk_count; i++) { - chunk_render(&app.cm->chunks[i]); - //printf("c sp: %f\n", app.chunks[i].start_pos.x); - } - - glDisable(GL_TEXTURE_2D); - - glDisable(GL_TEXTURE_GEN_S); - glDisable(GL_TEXTURE_GEN_T); - glDisable(GL_TEXTURE_GEN_R); - glDisable(GL_TEXTURE_GEN_Q); - - glDisable(GL_LIGHTING); - glDisable(GL_ALPHA_TEST); - - glMatrixMode(GL_PROJECTION); - glPushMatrix(); - glLoadIdentity(); - gluOrtho2D(-1.0f, 1.0f, -1.0f, 1.0f); - - glMatrixMode(GL_MODELVIEW); - glPushMatrix(); - glLoadIdentity(); - - glMatrixMode(GL_PROJECTION); - glPopMatrix(); - glMatrixMode(GL_MODELVIEW); - glPopMatrix(); - - glFinish(); - //////////// vec3f pos = app.camera.position; - // vec3f dir = get_camera_dir_vec3f(&app.camera); - - // draw_cube(&app, pos.x + dir.x*3, pos.y + dir.y*3, pos.z + dir.z*3); SDL_GL_SwapWindow(app.window); diff --git a/src/main1.c b/src/main1.c new file mode 100644 index 0000000..431a094 --- /dev/null +++ b/src/main1.c @@ -0,0 +1,240 @@ +#include "../include/app.h" +#include +#include +#include +#include + +#define SHADOWMAP_SIZE 2048 +int main() +{ + struct timespec start; + struct timespec end; + App app; + ChunkManager cm; + app.cm = &cm; + init_app(&app, 1600, 900); + + ///// + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glShadeModel(GL_SMOOTH); + glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); + + glClearDepth(1.0f); + glDepthFunc(GL_LEQUAL); + glEnable(GL_DEPTH_TEST); + //glEnable(GL_CULL_FACE); + + glEnable(GL_NORMALIZE); + + + GLuint shadowmap_texture; + + float light_proj_matrix[16]; + float light_view_matrix[16]; + float cam_proj_matrix[16]; + float cam_view_matrix[16]; + + glGenTextures(1, &shadowmap_texture); + glBindTexture(GL_TEXTURE_2D, shadowmap_texture); + glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, + SHADOWMAP_SIZE, SHADOWMAP_SIZE, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + + glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); + glEnable(GL_COLOR_MATERIAL); + + //GLfloat materialColor[] = {1.0f, 1.0f, 1.0f, 1.0f}; + //glMaterialfv(GL_FRONT, GL_SPECULAR, materialColor); + glMaterialf(GL_FRONT, GL_SHININESS, 64.0f); + + + + + //reshape(1600, 900); + glPushMatrix(); + glLoadIdentity(); + gluPerspective(45.0f, (float)1600/900, 1.0f, 10000.0f); + glGetFloatv(GL_MODELVIEW_MATRIX, cam_proj_matrix); + + + + glLoadIdentity(); + gluPerspective(45.0, 1.0, 2.0, 10000.0); + glGetFloatv(GL_MODELVIEW_MATRIX, light_proj_matrix); + + glLoadIdentity(); + gluLookAt(80, 80, 90, + 20.0, 20.0, 10.0, + 0.0, 0.0, 1.0); + glGetFloatv(GL_MODELVIEW_MATRIX, light_view_matrix); + + glPopMatrix(); + ///// + while(app.is_running) { + clock_gettime(CLOCK_MONOTONIC_RAW, &start); + + vec3f cd = get_camera_dir_vec3f(&app.camera); + vec3f cp = app.camera.position; + + // glLoadIdentity(); + // gluLookAt(cp.x, cp.y, cp.z, + // 10.0, 10.0, 30.0, + // 0.0, 0.0, 1.0); + set_view(&app.camera); + glGetFloatv(GL_MODELVIEW_MATRIX, cam_view_matrix); + + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + glMatrixMode(GL_PROJECTION); + glLoadMatrixf(light_proj_matrix); + + glMatrixMode(GL_MODELVIEW); + glLoadMatrixf(light_view_matrix); + + glViewport(0, 0, SHADOWMAP_SIZE, SHADOWMAP_SIZE); + + glCullFace(GL_FRONT); + + glShadeModel(GL_FLAT); + glColorMask(0, 0, 0, 0); + + for (int i = 0; i < app.cm->chunk_count; i++) { + chunk_render(&app.cm->chunks[i]); + //printf("c sp: %f\n", app.chunks[i].start_pos.x); + } + + glBindTexture(GL_TEXTURE_2D, shadowmap_texture); + glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, SHADOWMAP_SIZE, SHADOWMAP_SIZE); + + glCullFace(GL_BACK); + //glDisable(GL_CULL_FACE); + glShadeModel(GL_SMOOTH); + glColorMask(1, 1, 1, 1); + + glClear(GL_DEPTH_BUFFER_BIT); + glMatrixMode(GL_PROJECTION); + glLoadMatrixf(cam_proj_matrix); + glMatrixMode(GL_MODELVIEW); + glLoadMatrixf(cam_view_matrix); + glViewport(0, 0, 1600, 900); + /////////////// + + handle_events(&app); + update_app(&app); + + float color1[4] = {0, 0, 0, 0}; + float color2[4] = {0, 0, 0, 0}; + float color3[4] = {1.0, 1.0, 1.0, 0.0}; + float light_pos[4] = {80, 80, 90, 0}; + glLightfv(GL_LIGHT1, GL_POSITION, light_pos); + glLightfv(GL_LIGHT1, GL_AMBIENT, color1); + glLightfv(GL_LIGHT1, GL_DIFFUSE, color1); + glLightfv(GL_LIGHT1, GL_SPECULAR, color2); + glEnable(GL_LIGHT1); + glEnable(GL_LIGHTING); + + //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + //set_view(&app.camera); + for (int i = 0; i < app.cm->chunk_count; i++) { + chunk_render(&app.cm->chunks[i]); + //printf("c sp: %f\n", app.chunks[i].start_pos.x); + } + + glLightfv(GL_LIGHT1, GL_DIFFUSE, color3); + glLightfv(GL_LIGHT1, GL_SPECULAR, color3); + float bias[16] = {0.5f, 0.0f, 0.0f, 0.0f, + 0.0f, 0.5f, 0.0f, 0.0f, + 0.0f, 0.0f, 0.5f, 0.0f, + 0.5f, 0.5f, 0.5f, 1.0f}; + float m1[16]; + float tm[16]; + mult_matrix(bias, light_proj_matrix, m1); + mult_matrix(m1, light_view_matrix, tm); + + float v1[4] = {tm[0], tm[1], tm[2], tm[3]}; + glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); + glTexGenfv(GL_S, GL_EYE_PLANE, v1); + glEnable(GL_TEXTURE_GEN_S); + float v2[4] = {tm[4], tm[5], tm[6], tm[7]}; + glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); + glTexGenfv(GL_T, GL_EYE_PLANE, v2); + glEnable(GL_TEXTURE_GEN_T); + float v3[4] = {tm[8], tm[9], tm[10], tm[11]}; + glTexGeni(GL_R, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); + glTexGenfv(GL_R, GL_EYE_PLANE, v3); + glEnable(GL_TEXTURE_GEN_R); + float v4[4] = {tm[12], tm[13], tm[14], tm[15]}; + glTexGeni(GL_Q, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR); + glTexGenfv(GL_Q, GL_EYE_PLANE, v4); + glEnable(GL_TEXTURE_GEN_Q); + + glBindTexture(GL_TEXTURE_2D, shadowmap_texture); + glEnable(GL_TEXTURE_2D); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL); + glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE_ARB, GL_INTENSITY); + glAlphaFunc(GL_GEQUAL, 0.99f); + glEnable(GL_ALPHA_TEST); + + //glMatrixMode(GL_MODELVIEW); + for (int i = 0; i < app.cm->chunk_count; i++) { + chunk_render(&app.cm->chunks[i]); + //printf("c sp: %f\n", app.chunks[i].start_pos.x); + } + + glDisable(GL_TEXTURE_2D); + + glDisable(GL_TEXTURE_GEN_S); + glDisable(GL_TEXTURE_GEN_T); + glDisable(GL_TEXTURE_GEN_R); + glDisable(GL_TEXTURE_GEN_Q); + + glDisable(GL_LIGHTING); + glDisable(GL_ALPHA_TEST); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + gluOrtho2D(-1.0f, 1.0f, -1.0f, 1.0f); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + + glFinish(); + //////////// + vec3f pos = app.camera.position; + // vec3f dir = get_camera_dir_vec3f(&app.camera); + + // draw_cube(&app, pos.x + dir.x*3, pos.y + dir.y*3, pos.z + dir.z*3); + + SDL_GL_SwapWindow(app.window); + + clock_gettime(CLOCK_MONOTONIC_RAW, &end); + app.frame_time = calc_frame_time(&start, &end); + + printf("fps: %f\n", 1000/app.frame_time); + //printf("lkat pos x: %f y: %f z: %f\n", pos.x+5*dir.x, pos.y+5*dir.y, pos.z+5*dir.z); + printf("camera x: %f y: %f z: %f\n", pos.x, pos.y, pos.z); + //printf("dir x: %f y: %f z: %f\n", dir.x, dir.y, dir.z); + printf("dird x: %f y: %f z: %f\n", app.camera.rotation.x, app.camera.rotation.y, app.camera.rotation.z); + } + + return 0; +}