void display_generate_grid(t_display* display, int memory_size) { int32 width = (int32)roundf(sqrtf(MEM_SIZE)); int32 height = width; int32 size = width * height; int32 x, y; t_grid_vertex* vb; t_grid_vertex* temp_vb; uint16* ib; uint16* temp_ib; int32 vb_size = (size + height) * 4 * sizeof(t_grid_vertex); int32 ib_size = (size + height) * 6 * sizeof(int16); int32 cell_index = 0; temp_vb = vb = malloc(vb_size); temp_ib = ib = malloc(ib_size); for (y = 0; y < height + 1; ++y) { float yc = DISPLAY_CELL_SIZE * y; float yn = yc + DISPLAY_CELL_SIZE; for (x = 0; x < width; ++x) { float xc = DISPLAY_CELL_SIZE * x; float xn = xc + DISPLAY_CELL_SIZE; v3_set(&vb->v, xc, yc, 0.f), vb->i = 0, vb++; v3_set(&vb->v, xn, yc, 0.f), vb->i = 1, vb++; v3_set(&vb->v, xc, yn, 0.f), vb->i = 2, vb++; v3_set(&vb->v, xn, yn, 0.f), vb->i = 3, vb++; *ib++ = cell_index + 0; *ib++ = cell_index + 1; *ib++ = cell_index + 3; *ib++ = cell_index + 0; *ib++ = cell_index + 3; *ib++ = cell_index + 2; cell_index += 4; } } display->memory_grid_vertex_buffer = display_gl_create_buffer(GL_ARRAY_BUFFER, vb_size, GL_STATIC_DRAW, temp_vb); display->memory_grid_index_buffer = display_gl_create_buffer(GL_ELEMENT_ARRAY_BUFFER, ib_size, GL_STATIC_DRAW, temp_ib); display->memory_vertex_buffer = display_gl_create_buffer(GL_ARRAY_BUFFER, (size + height) * 4, GL_STREAM_DRAW, NULL); display->memory_temp_buffer = (uint8*)malloc((size + height) * 4); display->memory_vertex_count = (size + height) * 4; display->memory_index_count = (size + height) * 6; display->memory_size = (size + height); display->memory_width = DISPLAY_CELL_SIZE * width; display->memory_height = DISPLAY_CELL_SIZE * height + 1; display->memory_stride = width; free(temp_vb); free(temp_ib); }
void display_gl_memory_init(struct display_gl_s* display) { location_t location[] = { {"in_Position", 0}, {"in_Value", 1}, {NULL, 0} }; int32 width = display->grid_width; int32 height = display->grid_height; int32 size = width * height; display->hex_texture = display_gl_load_texture(TEXTURE("hex.png")); display_gl_load_shader(&display->memory_shader, SHADER("memory.vert"), SHADER("memory.frag"), location); display->memory_uniform_projection_matrix = glGetUniformLocation(display->memory_shader.id, "uni_ProjectionMatrix"); display->memory_uniform_coord = glGetUniformLocation(display->memory_shader.id, "uni_Coord"); display->memory_uniform_color = glGetUniformLocation(display->memory_shader.id, "uni_Color"); display->memory_uniform_texture = glGetUniformLocation(display->memory_shader.id, "uni_Texture"); { float delta = 1.f / 255.f; float uv[] = { 0.f, 0.f, delta, 0.f, 0.f, 1.0f, delta, 1.0f }; int id = 0; glUseProgram(display->memory_shader.id); glUniform2fv(display->memory_uniform_coord, 4, uv); glUniform1iv(display->memory_uniform_texture, 1, &id); glUseProgram(0); } display->memory_vao = display_gl_create_vao(); display->memory_vertex_buffer = display_gl_create_buffer(GL_ARRAY_BUFFER, (size + height) * 4, GL_STREAM_DRAW, NULL); display->memory_vertex_count = (size + height) * 4; display->memory_index_count = (size + height) * 6; display->memory_size = (size + height); display->memory_width = DISPLAY_CELL_SIZE * width; display->memory_height = DISPLAY_CELL_SIZE * height + 1; display->memory_stride = width; glBindVertexArray(display->memory_vao); glBindBuffer(GL_ARRAY_BUFFER, display->grid_vertex_buffer); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, (const void*)0); glBindBuffer(GL_ARRAY_BUFFER, display->memory_vertex_buffer); glVertexAttribPointer(1, 1, GL_UNSIGNED_BYTE, GL_FALSE, 1, (const void*)0); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glBindVertexArray(0); }