Permalink
Cannot retrieve contributors at this time
Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign up| #include "myy.h" | |
| #include <GLES2/gl2.h> | |
| #include <GLES2/gl2ext.h> | |
| #include <helpers/base_gl.h> | |
| #include <helpers/struct.h> | |
| #define GLCARD TWO_TRIANGLES_TEX_QUAD | |
| /**** CARD MODEL ****/ | |
| // Comments use a 1080p screen as a basis | |
| #define CARD_WIDTH 0.090625f // 174px - ~Bridge ratio | |
| #define CARD_HEIGHT 0.25f // 270px - ~Bridge ratio | |
| #define CARD_ALPHA_PART_HEIGHT 0.05f // 13.5px * 2 (Two parts) | |
| #define CARD_X 14 | |
| #define CARD_Y 1 | |
| #define TEX_WIDTH_IN_PIXELS 1392.0 | |
| #define TEX_HEIGHT_IN_PIXELS 540.0 | |
| #define HALF_TEX_WIDTH_PIXEL (1/(TEX_WIDTH_IN_PIXELS*2)) | |
| #define HALF_TEX_HEIGHT_PIXEL (1/(TEX_HEIGHT_IN_PIXELS*2)) | |
| #define CARD_TEX_WIDTH 0.0625f | |
| #define CARD_TEX_HEIGHT 0.25f | |
| #define CARD_ALPHA_PART_TEX_HEIGHT 0.025f | |
| #define CARD_TEX_LEFT (CARD_TEX_WIDTH*CARD_X+HALF_TEX_WIDTH_PIXEL) | |
| #define CARD_TEX_RIGHT (CARD_TEX_WIDTH*(CARD_X+1)-HALF_TEX_WIDTH_PIXEL) | |
| /* Splitting cards mesh in two alpha parts and one opaque part */ | |
| #define CARD_TEX_ALPHA_BOTTOM_BOTTOM (CARD_TEX_HEIGHT*CARD_Y+HALF_TEX_HEIGHT_PIXEL) | |
| #define CARD_TEX_ALPHA_BOTTOM_TOP (CARD_TEX_HEIGHT*CARD_Y+CARD_ALPHA_PART_TEX_HEIGHT) | |
| #define CARD_TEX_ALPHA_TOP_TOP (CARD_TEX_HEIGHT*(CARD_Y+1)-HALF_TEX_HEIGHT_PIXEL) | |
| #define CARD_TEX_ALPHA_TOP_BOTTOM (CARD_TEX_ALPHA_TOP_TOP-CARD_ALPHA_PART_TEX_HEIGHT) | |
| #define CARD_TEX_OPAQUE_BOTTOM (CARD_TEX_ALPHA_BOTTOM_TOP) | |
| #define CARD_TEX_OPAQUE_TOP (CARD_TEX_ALPHA_TOP_BOTTOM) | |
| struct GLcard { two_tris_quad opaque, top, bottom; } gl_cards_parts = { | |
| .opaque = GLCARD( | |
| /* Coords : Left, Right, Down, Up - Tex : Left, Right, Down Up */ | |
| -CARD_WIDTH, CARD_WIDTH, | |
| -(CARD_HEIGHT-CARD_ALPHA_PART_HEIGHT), | |
| (CARD_HEIGHT-CARD_ALPHA_PART_HEIGHT), | |
| CARD_TEX_LEFT, CARD_TEX_RIGHT, | |
| CARD_TEX_OPAQUE_BOTTOM, | |
| CARD_TEX_OPAQUE_TOP | |
| ), | |
| .top = GLCARD( | |
| -CARD_WIDTH, CARD_WIDTH, | |
| (CARD_HEIGHT-CARD_ALPHA_PART_HEIGHT), CARD_HEIGHT, | |
| CARD_TEX_LEFT, CARD_TEX_RIGHT, | |
| CARD_TEX_ALPHA_TOP_BOTTOM, | |
| CARD_TEX_ALPHA_TOP_TOP | |
| ), | |
| .bottom = GLCARD( | |
| -CARD_WIDTH, CARD_WIDTH, | |
| -CARD_HEIGHT, -(CARD_HEIGHT-CARD_ALPHA_PART_HEIGHT), | |
| CARD_TEX_LEFT, CARD_TEX_RIGHT, | |
| CARD_TEX_ALPHA_BOTTOM_BOTTOM, | |
| CARD_TEX_ALPHA_BOTTOM_TOP | |
| ) | |
| }; | |
| typedef struct GLcard GLcard; | |
| void | |
| offseted_GLcard_copy(GLcard *model, GLcard *card, | |
| GLfloat x_offset, GLfloat y_offset) { | |
| copy_two_triangles_quad_with_offset( | |
| gl_cards_parts.opaque.raw_coords, x_offset, y_offset, | |
| card->opaque.raw_coords | |
| ); | |
| copy_two_triangles_quad_with_offset( | |
| gl_cards_parts.top.raw_coords, x_offset, y_offset, | |
| card->top.raw_coords | |
| ); | |
| copy_two_triangles_quad_with_offset( | |
| gl_cards_parts.bottom.raw_coords, x_offset, y_offset, | |
| card->bottom.raw_coords | |
| ); | |
| } | |
| /**** The actual code ****/ | |
| enum attributes { attr_xyst, attrs_n }; | |
| void generate_cards_coords_in_buffer(GLint *buffer_id) { | |
| GLcard cards[2]; | |
| offseted_GLcard_copy(&gl_cards_parts, cards+0, -0.02f, 0); | |
| offseted_GLcard_copy(&gl_cards_parts, cards+1, 0.24f, 0); | |
| glGenBuffers(1, buffer_id); | |
| glBindBuffer(GL_ARRAY_BUFFER, *buffer_id); | |
| glBufferData(GL_ARRAY_BUFFER, 2*sizeof(GLcard), | |
| (GLfloat *) cards, GL_STATIC_DRAW); | |
| } | |
| void myy_init() { | |
| GLint tex_id; | |
| uploadTextures("tex/cards.raw", 1, &tex_id); | |
| GLuint program = | |
| glhSetupAndUse("shaders/standard.vert", "shaders/standard.frag", | |
| attrs_n, "xyst"); | |
| glUniform1i(glGetUniformLocation(program, "sid"), 0); | |
| GLint buffer_id; | |
| generate_cards_coords_in_buffer(&buffer_id); | |
| glEnableVertexAttribArray(attr_xyst); | |
| glBindBuffer(GL_ARRAY_BUFFER, buffer_id); | |
| glEnable(GL_CULL_FACE); | |
| glEnable(GL_DEPTH_TEST); | |
| glEnable(GL_BLEND); | |
| glCullFace(GL_BACK); | |
| glDepthFunc(GL_LESS); | |
| glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | |
| } | |
| void myy_draw() { | |
| glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT ); | |
| glClearColor(0.8f,0.8f,0.8f,1.0f); | |
| glVertexAttribPointer(attr_xyst, 4, GL_FLOAT, GL_FALSE, 0, 0); | |
| /* 6 points per quad, 3 quads per card, 2 cards */ | |
| glDrawArrays(GL_TRIANGLES, 0, 6*3*2); | |
| } | |
| void myy_save() {} | |
| void myy_stop() {} | |
| void myy_animating() {} | |
| void myy_pause() {} | |
| void myy_resume() {} | |
| void myy_click(int x, int y, unsigned int button) {} | |
| void myy_move(int x, int y) {} | |
| void myy_key(unsigned int keycode) {} | |
| void myy_display_initialised(int width, int height) {} |