#include #define SDL_MAIN_HANDLED #include #ifdef __unix__ #include #endif #ifdef _WIN64 #include #endif #ifdef __EMSCRIPTEN__ #include #endif SDL_Window *window; SDL_GLContext context; bool running = true; void first_2d_triangle() { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); //immediate mode glBegin(GL_TRIANGLES); glVertex2f(0.0, 0.5); glVertex2f(0.5, -0.5); glVertex2f(-0.5, -0.5); glEnd(); SDL_GL_SwapWindow(window); } void first_2d_triangle_colored() { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); //immediate mode glBegin(GL_TRIANGLES); glColor3f(1, 0, 0); glVertex2f(0.0, 0.5); glColor3f(0, 1, 0); glVertex2f(0.5, -0.5); glColor3f(0, 0, 1); glVertex2f(-0.5, -0.5); glEnd(); SDL_GL_SwapWindow(window); } void first_2d_quad() { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); //immediate mode glBegin(GL_QUADS); glVertex2f(0.5, 0.5); glVertex2f(0.5, -0.5); glVertex2f(-0.5, -0.5); glVertex2f(-0.5, 0.5); glEnd(); SDL_GL_SwapWindow(window); } void first_2d_quad_colored() { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); //immediate mode glBegin(GL_QUADS); glColor3f(1, 0, 0); glVertex2f(0.5, 0.5); glColor3f(0.5, 0.5, 0.5); glVertex2f(0.5, -0.5); glColor3f(0, 1, 0); glVertex2f(-0.5, -0.5); glColor3f(0, 0, 1); glVertex2f(-0.5, 0.5); glEnd(); SDL_GL_SwapWindow(window); } void first_3d_triangle() { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); glVertex3f(0, 0.5, 0); glVertex3f(0.5, -0.5, 0); glVertex3f(-0.5, -0.5, 0); glEnd(); SDL_GL_SwapWindow(window); } void first_3d_triangle_color() { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); glColor3f(1, 0, 0); glVertex3f(0, 0.5, 0); glColor3f(0, 1, 0); glVertex3f(0.5, -0.5, 0); glColor3f(0,0,1); glVertex3f(-0.5, -0.5, 0); glEnd(); SDL_GL_SwapWindow(window); } float c3dc_rot = 0; void first_3d_triangle_color_rotated() { c3dc_rot += 1; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.5, 0, 0); glRotatef(c3dc_rot, 0, 1, 0); glBegin(GL_TRIANGLES); glColor3f(1, 0, 0); glVertex3f(0, 0.5, 0); glColor3f(0, 1, 0); glVertex3f(0.5, -0.5, 0); glColor3f(0,0,1); glVertex3f(-0.5, -0.5, 0); glEnd(); SDL_GL_SwapWindow(window); } void first_3d_triangle_color_rotated_face_culling() { c3dc_rot += 1; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotatef(c3dc_rot, 0, 1, 0); glEnable(GL_CULL_FACE); //alap //glCullFace(GL_BACK); //glCullFace(GL_FRONT); //glCullFace(GL_FRONT_AND_BACK); //Winding order //alap: //glFrontFace(GL_CCW); //glFrontFace(GL_CW); glBegin(GL_TRIANGLES); glColor3f(1, 0, 0); glVertex3f(0, 0.5, 0); glColor3f(0,0,1); glVertex3f(-0.5, -0.5, 0); glColor3f(0, 1, 0); glVertex3f(0.5, -0.5, 0); glEnd(); SDL_GL_SwapWindow(window); } void first_3d_cone() { c3dc_rot += 1; //Ebben a példában a -z jön a kamera fele (alapbeállítás) glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotatef(c3dc_rot, 0, 1, 0); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glBegin(GL_TRIANGLES); //eleje glColor3f(1, 0, 0); glVertex3f(0, 0.5, 0); glColor3f(1,0,0); glVertex3f(-0.5, -0.5, -0.5); glColor3f(1, 0, 0); glVertex3f(0.5, -0.5, -0.5); //bal glColor3f(0, 1, 0); glVertex3f(0, 0.5, 0); glColor3f(0, 1, 0); glVertex3f(-0.5, -0.5, 0.5); glColor3f(0, 1, 0); glVertex3f(-0.5, -0.5, -0.5); //jobb glColor3f(0, 0, 1); glVertex3f(0, 0.5, 0); glColor3f(0, 0, 1); glVertex3f(0.5, -0.5, -0.5); glColor3f(0, 0, 1); glVertex3f(0.5, -0.5, 0.5); //hátulja glColor3f(1, 1, 0); glVertex3f(0, 0.5, 0); glColor3f(1, 1, 0); glVertex3f(0.5, -0.5, 0.5); glColor3f(1, 1, 0); glVertex3f(-0.5, -0.5, 0.5); glEnd(); SDL_GL_SwapWindow(window); } void first_3d_cone_ortho() { c3dc_rot += 1; //Ebben a példában a -z jön a kamera fele (alapbeállítás) glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); //alapbeállítás: //glOrtho(-1, 1, -1, 1, 1, -1); // glOrtho(-2, 2, -1, 1, 1, -1); // glOrtho(-1, 1, -2, 2, 1, -1); //glOrtho(-1, 1, -0.75, 0.75, 1, -1); //glTranslatef(0, 1, 0); //glTranslatef(1, 0, 0); glOrtho(-1.33, 1.33, -1, 1, 1, -1); //glOrtho(-1.33, 1.33, -1, 1, -1, 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glRotatef(c3dc_rot, 0, 1, 0); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glBegin(GL_TRIANGLES); //eleje glColor3f(1, 0, 0); glVertex3f(0, 0.5, 0); glColor3f(1,0,0); glVertex3f(-0.5, -0.5, -0.5); glColor3f(1, 0, 0); glVertex3f(0.5, -0.5, -0.5); //bal glColor3f(0, 1, 0); glVertex3f(0, 0.5, 0); glColor3f(0, 1, 0); glVertex3f(-0.5, -0.5, 0.5); glColor3f(0, 1, 0); glVertex3f(-0.5, -0.5, -0.5); //jobb glColor3f(0, 0, 1); glVertex3f(0, 0.5, 0); glColor3f(0, 0, 1); glVertex3f(0.5, -0.5, -0.5); glColor3f(0, 0, 1); glVertex3f(0.5, -0.5, 0.5); //hátulja glColor3f(1, 1, 0); glVertex3f(0, 0.5, 0); glColor3f(1, 1, 0); glVertex3f(0.5, -0.5, 0.5); glColor3f(1, 1, 0); glVertex3f(-0.5, -0.5, 0.5); glEnd(); SDL_GL_SwapWindow(window); } void first_3d_cone_perspective() { c3dc_rot += 1; //Ebben a példában a +z jön a kamera fele (alapbeállítás) glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); //glFrustum(-1, 1, -1, 1, 1, 10); glFrustum(-1, 1, -0.75, 0.75, 1, 10); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0, 0, -2); glRotatef(c3dc_rot, 0, 1, 0); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glBegin(GL_TRIANGLES); //eleje glColor3f(1, 0, 0); glVertex3f(0, 0.5, 0); glColor3f(1,0,0); glVertex3f(-0.5, -0.5, 0.5); glColor3f(1, 0, 0); glVertex3f(0.5, -0.5, 0.5); //bal glColor3f(0, 1, 0); glVertex3f(0, 0.5, 0); glColor3f(0, 1, 0); glVertex3f(-0.5, -0.5, -0.5); glColor3f(0, 1, 0); glVertex3f(-0.5, -0.5, 0.5); //jobb glColor3f(0, 0, 1); glVertex3f(0, 0.5, 0); glColor3f(0, 0, 1); glVertex3f(0.5, -0.5, 0.5); glColor3f(0, 0, 1); glVertex3f(0.5, -0.5, -0.5); //hátulja glColor3f(1, 1, 0); glVertex3f(0, 0.5, 0); glColor3f(1, 1, 0); glVertex3f(0.5, -0.5, -0.5); glColor3f(1, 1, 0); glVertex3f(-0.5, -0.5, -0.5); glEnd(); SDL_GL_SwapWindow(window); } float box_tris_rot = 0; bool box_tris_rot_dir = false; void box_tris() { if (box_tris_rot_dir) box_tris_rot += 0.5; else box_tris_rot -= 0.5; if (box_tris_rot > 90 || box_tris_rot < 0) box_tris_rot_dir = !box_tris_rot_dir; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); //glFrustum(-1, 1, -0.75, 0.75, 1, 10); glTranslatef(0, 0.1, 0); glOrtho(-2, 2, -1.5, 1.5, -10, 10); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //glTranslatef(0, 0, -2); glRotatef(30, 1, 0, 0); glRotatef(box_tris_rot, 0, 1, 0); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glBegin(GL_TRIANGLES); glColor3f(1, 0, 0); glVertex3f(-0.5, 0.5, 0.5); glVertex3f(-0.5, -0.5, 0.5); glVertex3f(0.5, -0.5, 0.5); glColor3f(0.5, 0, 0); glVertex3f(0.5, -0.5, 0.5); glVertex3f(0.5, 0.5, 0.5); glVertex3f(-0.5, 0.5, 0.5); glColor3f(0, 1, 0); glVertex3f(-0.5, 0.5, -0.5); glVertex3f(-0.5, -0.5, -0.5); glVertex3f(-0.5, 0.5, 0.5); glColor3f(0, 0.5, 0); glVertex3f(-0.5, 0.5, 0.5); glVertex3f(-0.5, -0.5, -0.5); glVertex3f(-0.5, -0.5, 0.5); glEnd(); SDL_GL_SwapWindow(window); } void box_tris_lights() { if (box_tris_rot_dir) box_tris_rot += 0.5; else box_tris_rot -= 0.5; if (box_tris_rot > 90 || box_tris_rot < 0) box_tris_rot_dir = !box_tris_rot_dir; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); float light1_ambient[] = { 0, 0, 0, 1 }; float light1_diffuse[] = { 1, 1, 1, 1 }; float light1_specular[] = { 1, 1, 1, 1 }; float light1_pos[] = { -2, 1, 1 }; glLightfv(GL_LIGHT0, GL_AMBIENT, light1_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light1_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light1_specular); glLightfv(GL_LIGHT0, GL_POSITION, light1_pos); glEnable(GL_LIGHT1); float light2_ambient[] = { 0, 0, 0, 1 }; float light2_diffuse[] = { 1, 0, 0, 1 }; float light2_specular[] = { 1, 1, 1, 1 }; float light2_pos[] = { 1, 1, 2 }; glLightfv(GL_LIGHT1, GL_AMBIENT, light2_ambient); glLightfv(GL_LIGHT1, GL_DIFFUSE, light2_diffuse); glLightfv(GL_LIGHT1, GL_SPECULAR, light2_specular); glLightfv(GL_LIGHT1, GL_POSITION, light2_pos); glMatrixMode(GL_PROJECTION); glLoadIdentity(); //glFrustum(-1, 1, -0.75, 0.75, 1, 10); glTranslatef(0, 0.1, 0); glOrtho(-2, 2, -1.5, 1.5, -10, 10); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //glTranslatef(0, 0, -2); glRotatef(30, 1, 0, 0); glRotatef(box_tris_rot, 0, 1, 0); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glBegin(GL_TRIANGLES); glColor3f(1, 0, 0); glNormal3f(0, 0, 1); glVertex3f(-0.5, 0.5, 0.5); glNormal3f(0, 0, 1); glVertex3f(-0.5, -0.5, 0.5); glNormal3f(0, 0, 1); glVertex3f(0.5, -0.5, 0.5); glColor3f(0.5, 0, 0); glNormal3f(0, 0, 1); glVertex3f(0.5, -0.5, 0.5); glNormal3f(0, 0, 1); glVertex3f(0.5, 0.5, 0.5); glNormal3f(0, 0, 1); glVertex3f(-0.5, 0.5, 0.5); glColor3f(0, 1, 0); glNormal3f(-1, 0, 0); glVertex3f(-0.5, 0.5, -0.5); glNormal3f(-1, 0, 0); glVertex3f(-0.5, -0.5, -0.5); glNormal3f(-1, 0, 0); glVertex3f(-0.5, 0.5, 0.5); glColor3f(0, 0.5, 0); glNormal3f(-1, 0, 0); glVertex3f(-0.5, 0.5, 0.5); glNormal3f(-1, 0, 0); glVertex3f(-0.5, -0.5, -0.5); glNormal3f(-1, 0, 0); glVertex3f(-0.5, -0.5, 0.5); glEnd(); SDL_GL_SwapWindow(window); } bool texture_loaded = false; GLuint texture; void loadGLTextures(const char *file_name) { if (texture_loaded) return; texture_loaded = true; SDL_Surface *texture_image; texture_image = SDL_LoadBMP(file_name); if (!texture_image) { printf("Couldn't load %s.\n", file_name); } else { glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); glTexImage2D(GL_TEXTURE_2D, 0, 3, texture_image->w, texture_image->h, 0, GL_RGB, GL_UNSIGNED_BYTE, texture_image->pixels); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); //(bi)linear filtering //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); SDL_FreeSurface(texture_image); } } void first_2d_triangle_uv() { loadGLTextures("img_forest.bmp"); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture); //immediate mode glBegin(GL_TRIANGLES); glTexCoord2f(0.5, 0); glVertex2f(0.0, 0.5); glTexCoord2f(1, 1); glVertex2f(0.5, -0.5); glTexCoord2f(0, 1); glVertex2f(-0.5, -0.5); glEnd(); SDL_GL_SwapWindow(window); } void first_2d_triangle_quad_uv() { loadGLTextures("img_forest.bmp"); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture); //immediate mode glBegin(GL_TRIANGLES); glTexCoord2f(0, 0); glVertex2f(-0.5, 0.5); glTexCoord2f(1, 1); glVertex2f(0.5, -0.5); glTexCoord2f(0, 1); glVertex2f(-0.5, -0.5); glTexCoord2f(1, 1); glVertex2f(0.5, -0.5); glTexCoord2f(0, 0); glVertex2f(-0.5, 0.5); glTexCoord2f(1, 0); glVertex2f(0.5, 0.5); glEnd(); SDL_GL_SwapWindow(window); } void box_tris_lights_uv() { loadGLTextures("img_forest.bmp"); if (box_tris_rot_dir) box_tris_rot += 0.5; else box_tris_rot -= 0.5; if (box_tris_rot > 90 || box_tris_rot < 0) box_tris_rot_dir = !box_tris_rot_dir; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); float light1_ambient[] = { 0, 0, 0, 1 }; float light1_diffuse[] = { 1, 1, 1, 1 }; float light1_specular[] = { 1, 1, 1, 1 }; float light1_pos[] = { -2, 1, 1 }; glLightfv(GL_LIGHT0, GL_AMBIENT, light1_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light1_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light1_specular); glLightfv(GL_LIGHT0, GL_POSITION, light1_pos); glEnable(GL_LIGHT1); float light2_ambient[] = { 0, 0, 0, 1 }; float light2_diffuse[] = { 1, 0, 0, 1 }; float light2_specular[] = { 1, 1, 1, 1 }; float light2_pos[] = { 1, 1, 2 }; glLightfv(GL_LIGHT1, GL_AMBIENT, light2_ambient); glLightfv(GL_LIGHT1, GL_DIFFUSE, light2_diffuse); glLightfv(GL_LIGHT1, GL_SPECULAR, light2_specular); glLightfv(GL_LIGHT1, GL_POSITION, light2_pos); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture); glMatrixMode(GL_PROJECTION); glLoadIdentity(); //glFrustum(-1, 1, -0.75, 0.75, 1, 10); glTranslatef(0, 0.1, 0); glOrtho(-2, 2, -1.5, 1.5, -10, 10); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //glTranslatef(0, 0, -2); glRotatef(30, 1, 0, 0); glRotatef(box_tris_rot, 0, 1, 0); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glBegin(GL_TRIANGLES); //glColor3f(1, 0, 0); glTexCoord2f(0, 0); glNormal3f(0, 0, 1); glVertex3f(-0.5, 0.5, 0.5); glTexCoord2f(0, 1); glNormal3f(0, 0, 1); glVertex3f(-0.5, -0.5, 0.5); glTexCoord2f(1, 1); glNormal3f(0, 0, 1); glVertex3f(0.5, -0.5, 0.5); //glColor3f(0.5, 0, 0); glTexCoord2f(1, 1); glNormal3f(0, 0, 1); glVertex3f(0.5, -0.5, 0.5); glTexCoord2f(1, 0); glNormal3f(0, 0, 1); glVertex3f(0.5, 0.5, 0.5); glTexCoord2f(0, 0); glNormal3f(0, 0, 1); glVertex3f(-0.5, 0.5, 0.5); //glColor3f(0, 1, 0); glTexCoord2f(0, 0); glNormal3f(-1, 0, 0); glVertex3f(-0.5, 0.5, -0.5); glTexCoord2f(0, 1); glNormal3f(-1, 0, 0); glVertex3f(-0.5, -0.5, -0.5); glTexCoord2f(1, 0); glNormal3f(-1, 0, 0); glVertex3f(-0.5, 0.5, 0.5); // glColor3f(0, 0.5, 0); glTexCoord2f(1, 0); glNormal3f(-1, 0, 0); glVertex3f(-0.5, 0.5, 0.5); glTexCoord2f(0, 1); glNormal3f(-1, 0, 0); glVertex3f(-0.5, -0.5, -0.5); glTexCoord2f(1, 1); glNormal3f(-1, 0, 0); glVertex3f(-0.5, -0.5, 0.5); glEnd(); SDL_GL_SwapWindow(window); } #define ATLAS_SIZE_X 16.0 #define ATLAS_SIZE_Y 16.0 void add_tex_coord(int atlas_coord_x, int atlas_coord_y, float uv_x, float uv_y) { float tile_size_x = 1.0 / ATLAS_SIZE_X; float tile_size_y = 1.0 / ATLAS_SIZE_Y; float pos_x = tile_size_x * atlas_coord_x; float pos_y = tile_size_y * atlas_coord_y; float offset_x = uv_x * tile_size_x; float offset_y = uv_y * tile_size_y; glTexCoord2f(pos_x + offset_x, pos_y + offset_y); } void box_tris_lights_uv_texture_atlas() { loadGLTextures("download.bmp"); if (box_tris_rot_dir) box_tris_rot += 0.5; else box_tris_rot -= 0.5; if (box_tris_rot > 90 || box_tris_rot < 0) box_tris_rot_dir = !box_tris_rot_dir; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); float light1_ambient[] = { 0, 0, 0, 1 }; float light1_diffuse[] = { 1, 1, 1, 1 }; float light1_specular[] = { 1, 1, 1, 1 }; float light1_pos[] = { -2, 1, 1 }; glLightfv(GL_LIGHT0, GL_AMBIENT, light1_ambient); glLightfv(GL_LIGHT0, GL_DIFFUSE, light1_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light1_specular); glLightfv(GL_LIGHT0, GL_POSITION, light1_pos); glEnable(GL_LIGHT1); float light2_ambient[] = { 0, 0, 0, 1 }; float light2_diffuse[] = { 1, 0, 0, 1 }; float light2_specular[] = { 1, 1, 1, 1 }; float light2_pos[] = { 1, 1, 2 }; glLightfv(GL_LIGHT1, GL_AMBIENT, light2_ambient); glLightfv(GL_LIGHT1, GL_DIFFUSE, light2_diffuse); glLightfv(GL_LIGHT1, GL_SPECULAR, light2_specular); glLightfv(GL_LIGHT1, GL_POSITION, light2_pos); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, texture); glMatrixMode(GL_PROJECTION); glLoadIdentity(); //glFrustum(-1, 1, -0.75, 0.75, 1, 10); glTranslatef(0, 0.1, 0); glOrtho(-2, 2, -1.5, 1.5, -10, 10); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //glTranslatef(0, 0, -2); glRotatef(30, 1, 0, 0); glRotatef(box_tris_rot, 0, 1, 0); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); int atlas_coord_1_x = 3; int atlas_coord_1_y = 3; int atlas_coord_2_x = 2; int atlas_coord_2_y = 3; glBegin(GL_TRIANGLES); //glColor3f(1, 0, 0); add_tex_coord(atlas_coord_1_x, atlas_coord_1_y, 0, 0); glNormal3f(0, 0, 1); glVertex3f(-0.5, 0.5, 0.5); add_tex_coord(atlas_coord_1_x, atlas_coord_1_y, 0, 1); glNormal3f(0, 0, 1); glVertex3f(-0.5, -0.5, 0.5); add_tex_coord(atlas_coord_1_x, atlas_coord_1_y, 1, 1); glNormal3f(0, 0, 1); glVertex3f(0.5, -0.5, 0.5); //glColor3f(0.5, 0, 0); add_tex_coord(atlas_coord_1_x, atlas_coord_1_y, 1, 1); glNormal3f(0, 0, 1); glVertex3f(0.5, -0.5, 0.5); add_tex_coord(atlas_coord_1_x, atlas_coord_1_y, 1, 0); glNormal3f(0, 0, 1); glVertex3f(0.5, 0.5, 0.5); add_tex_coord(atlas_coord_1_x, atlas_coord_1_y, 0, 0); glNormal3f(0, 0, 1); glVertex3f(-0.5, 0.5, 0.5); //glColor3f(0, 1, 0); add_tex_coord(atlas_coord_2_x, atlas_coord_2_y, 0, 0); glNormal3f(-1, 0, 0); glVertex3f(-0.5, 0.5, -0.5); add_tex_coord(atlas_coord_2_x, atlas_coord_2_y, 0, 1); glNormal3f(-1, 0, 0); glVertex3f(-0.5, -0.5, -0.5); add_tex_coord(atlas_coord_2_x, atlas_coord_2_y, 1, 0); glNormal3f(-1, 0, 0); glVertex3f(-0.5, 0.5, 0.5); // glColor3f(0, 0.5, 0); add_tex_coord(atlas_coord_2_x, atlas_coord_2_y, 1, 0); glNormal3f(-1, 0, 0); glVertex3f(-0.5, 0.5, 0.5); add_tex_coord(atlas_coord_2_x, atlas_coord_2_y, 0, 1); glNormal3f(-1, 0, 0); glVertex3f(-0.5, -0.5, -0.5); add_tex_coord(atlas_coord_2_x, atlas_coord_2_y, 1, 1); glNormal3f(-1, 0, 0); glVertex3f(-0.5, -0.5, 0.5); glEnd(); SDL_GL_SwapWindow(window); } void first_2d_triangle_vertex_array() { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); GLfloat vertices[] = { 0.0, 0.5, 0.5, -0.5, -0.5, -0.5 }; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_FLOAT, 0, vertices); glDrawArrays(GL_TRIANGLES, 0, 3); glDisableClientState(GL_VERTEX_ARRAY); SDL_GL_SwapWindow(window); } void first_3d_triangle_vertex_array() { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); GLfloat vertices[] = { 0.0, 0.5, 0.0, 0.5, -0.5, 0.0, -0.5, -0.5, 0.0, }; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, vertices); glDrawArrays(GL_TRIANGLES, 0, 3); glDisableClientState(GL_VERTEX_ARRAY); SDL_GL_SwapWindow(window); } void first_3d_triangle_vertex_array_colors() { glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); GLfloat vertices[] = { 0.0, 0.5, 0.0, 0.5, -0.5, 0.0, -0.5, -0.5, 0.0, }; GLfloat colors[] = { 1, 0, 0, 0, 1, 0, 0, 0, 1 }; glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glVertexPointer(3, GL_FLOAT, 0, vertices); glColorPointer(3, GL_FLOAT, 0, colors); glDrawArrays(GL_TRIANGLES, 0, 3); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); SDL_GL_SwapWindow(window); } void box_tris_vertex_array() { if (box_tris_rot_dir) box_tris_rot += 0.5; else box_tris_rot -= 0.5; if (box_tris_rot > 90 || box_tris_rot < 0) box_tris_rot_dir = !box_tris_rot_dir; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); //glFrustum(-1, 1, -0.75, 0.75, 1, 10); glTranslatef(0, 0.1, 0); glOrtho(-2, 2, -1.5, 1.5, -10, 10); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //glTranslatef(0, 0, -2); //glRotatef(30, 1, 0, 0); //glRotatef(box_tris_rot, 0, 1, 0); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); GLfloat vertices[] = { -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, }; GLfloat colors[] = { 1, 0, 0, 1, 0, 0, 1, 0, 0, 0.5, 0, 0, 0.5, 0, 0, 0.5, 0, 0, }; glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glVertexPointer(3, GL_FLOAT, 0, vertices); glColorPointer(3, GL_FLOAT, 0, colors); glDrawArrays(GL_TRIANGLES, 0, 6); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); SDL_GL_SwapWindow(window); } void box_tris_vertex_array_indices() { if (box_tris_rot_dir) box_tris_rot += 0.5; else box_tris_rot -= 0.5; if (box_tris_rot > 90 || box_tris_rot < 0) box_tris_rot_dir = !box_tris_rot_dir; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); //glFrustum(-1, 1, -0.75, 0.75, 1, 10); glTranslatef(0, 0.1, 0); glOrtho(-2, 2, -1.5, 1.5, -10, 10); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //glTranslatef(0, 0, -2); //glRotatef(30, 1, 0, 0); //glRotatef(box_tris_rot, 0, 1, 0); glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); GLfloat vertices[] = { -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, }; GLfloat colors[] = { 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, }; GLuint indices[] = { 0, 1, 2, 0, 2, 3 }; glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glVertexPointer(3, GL_FLOAT, 0, vertices); glColorPointer(3, GL_FLOAT, 0, colors); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, indices); glDisableClientState(GL_COLOR_ARRAY); glDisableClientState(GL_VERTEX_ARRAY); SDL_GL_SwapWindow(window); } int current_demo = 21; //gameloop void handle_frame() { //handle input SDL_Event current_evevnt; while(SDL_PollEvent(¤t_evevnt)) { if (current_evevnt.type == SDL_QUIT) { running = false; } } //update world //most ez nem kell //render switch (current_demo) { case 0: first_2d_triangle(); break; case 1: first_2d_triangle_colored(); break; case 2: first_2d_quad(); break; case 3: first_2d_quad_colored(); break; case 4: first_3d_triangle(); break; case 5: first_3d_triangle_color(); break; case 6: first_3d_triangle_color_rotated(); break; case 7: first_3d_triangle_color_rotated_face_culling(); break; case 8: first_3d_cone(); break; case 9: first_3d_cone_ortho(); break; case 10: first_3d_cone_perspective(); break; case 11: box_tris(); break; case 12: box_tris_lights(); break; case 13: first_2d_triangle_uv(); break; case 14: first_2d_triangle_quad_uv(); break; case 15: box_tris_lights_uv(); break; case 16: box_tris_lights_uv_texture_atlas(); break; case 17: first_2d_triangle_vertex_array(); break; case 18: first_3d_triangle_vertex_array(); break; case 19: first_3d_triangle_vertex_array_colors(); break; case 20: box_tris_vertex_array(); break; case 21: box_tris_vertex_array_indices(); break; } } int main(int argc, char *argv[]) { SDL_SetMainReady(); int error = SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER); if (error) { SDL_Log("SDL_Init: %s", SDL_GetError()); return 1; } //Use OpenGl 2.1 SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); window = SDL_CreateWindow("SDL + OpenGL", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL); if (!window) { SDL_Log("SDL_CreateWindow: %s", SDL_GetError()); return 1; } context = SDL_GL_CreateContext(window); #ifdef _WIN64 gladLoadGLLoader((GLADloadproc)SDL_GL_GetProcAddress); #endif #ifdef __EMSCRIPTEN__ emscripten_set_main_loop(handle_frame, 0, 1); #else while (running) { handle_frame(); } #endif printf("%s\n", glGetString(GL_VERSION)); SDL_DestroyWindow(window); window = nullptr; SDL_Quit(); return 0; }