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); }
void display_gl_io_init(struct display_gl_s* display) { location_t location[] = { {"in_Position", 0}, {"in_Value", 1}, {NULL, 0} }; display->write_texture = display_gl_load_texture(TEXTURE("write.png")); display->read_texture = display_gl_load_texture(TEXTURE("read.png")); display_gl_load_shader(&display->io_shader, SHADER("io.vert"), SHADER("io.frag"), location); display->io_uniform_projection_matrix = glGetUniformLocation(display->io_shader.id, "uni_ProjectionMatrix"); display->io_uniform_color = glGetUniformLocation(display->io_shader.id, "uni_Color"); display->io_uniform_texture = glGetUniformLocation(display->io_shader.id, "uni_Texture"); glUseProgram(display->io_shader.id); GLint samplerId = 0; glUniform1iv(display->io_uniform_texture, 1, &samplerId); glUseProgram(0); display->io_read_buffer = (uint8*)malloc(display->memory_size * 4); display->io_write_buffer = (uint8*)malloc(display->memory_size * 4); }
t_display* display_initialize(int width, int height) { t_display* display = (t_display*)malloc(sizeof(t_display)); if (!glfwInit()) return NULL; glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_FALSE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); display->window = glfwCreateWindow(width, height, "corewar", NULL, NULL); glfwMakeContextCurrent(display->window); glewExperimental = GL_TRUE; glewInit(); display_generate_grid(display, MEM_SIZE); display->hex_texture = display_gl_load_texture("data/hex.png"); display_gl_load_shader(&display->memory_shader, "shaders/memory.vert", "shaders/memory.frag"); 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 / 256.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_gl_load_shader(&display->io_shader, "shaders/io.vert", "shaders/io.frag"); display->io_uniform_projection_matrix = glGetUniformLocation(display->io_shader.id, "uni_ProjectionMatrix"); display->io_uniform_color = glGetUniformLocation(display->io_shader.id, "uni_Color"); display->memory_vao = display_gl_create_vao(); display_gl_bind_vao(display->memory_vao); display_gl_bind_buffer(GL_ARRAY_BUFFER, display->memory_grid_vertex_buffer); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, (const void*)0); display_gl_bind_buffer(GL_ARRAY_BUFFER, display->memory_vertex_buffer); glVertexAttribPointer(1, 1, GL_UNSIGNED_BYTE, GL_FALSE, 1, (const void*)0); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glDisable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); display->mesh_renderer = display_mesh_renderer_initialize(); glfwGetCursorPos(display->window, &display->mouse_prev_x, &display->mouse_prev_y); glfwGetFramebufferSize(display->window, &display->frame_buffer_width, &display->frame_buffer_height); float screen_memory_ratio = display->memory_width / (float) display->frame_buffer_width; float screen_memory_ratio_height = display->memory_height / (float) display->frame_buffer_height; if (screen_memory_ratio_height > screen_memory_ratio) screen_memory_ratio = screen_memory_ratio_height; display->display_zoom = screen_memory_ratio; display->display_center_x = ((float)display->frame_buffer_width * 0.5f) * screen_memory_ratio; display->display_center_y = ((float)display->frame_buffer_height * 0.5f) * screen_memory_ratio; display->frame_last_time = glfwGetTime(); display_generate_process_mesh(display); display->texts = display_text_intialize(); glfwSwapInterval(-1); return display; }