Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <onidev.h>
- void error_callback(
- GLenum source, GLenum type, GLuint id, GLenum severity,
- GLsizei length, const char* message, const void* user_param)
- {
- od::err() << message;
- }
- int main()
- {
- namespace gl = od::gl;
- od::Window win(640, 480, "OpenGL Demo", od::Version(3, 2));
- std::cout << "OpenGL " << od::Extension::get().version().str() << std::endl;
- gl::debugMessageCallback(error_callback, nullptr);
- glEnable(GL_DEBUG_OUTPUT);
- std::string vertex_shader_scr =
- OD_GLSL(140,
- attribute vec2 pos;
- uniform mat3 transform; // model view projection
- void main()
- {
- gl_Position = vec4(transform * vec3(pos, 1.0), 1.0);
- });
- std::string fragment_shader_scr =
- OD_GLSL(140,
- uniform vec4 col;
- void main()
- {
- gl_FragColor = col;
- });
- enum {
- position_attrib_index
- };
- const std::map<unsigned, std::string> attrib_map = {
- { position_attrib_index, "pos" }
- };
- gl::Program program;
- {
- gl::Shader vertex_shader(gl::Shader::Vertex, vertex_shader_scr);
- gl::Shader fragment_shader(gl::Shader::Fragment, fragment_shader_scr);
- program.attach(vertex_shader);
- program.attach(fragment_shader);
- for(const auto& p: attrib_map) {
- program.bindAttribLocation(p.first, p.second);
- }
- program.link();
- program.detach(vertex_shader);
- program.detach(fragment_shader);
- }
- gl::Vao vao;
- gl::Vbo vbo_shape;
- {
- std::vector<float> data_pos = {
- -10, -10, 10, -10,
- 10, -10, 10, 10,
- 10, 10, -10, 10,
- -10, 10, -10, -10
- };
- vbo_shape.bind();
- vbo_shape.data(data_pos.size() * sizeof(float), &data_pos[0]);
- vao.bind();
- vao.setVertexAttribf(vbo_shape, position_attrib_index, 2, false, 2 * sizeof(float), 0);
- vao.unbind();
- }
- program.use();
- unsigned uniform_color = gl::getUniformLocation(program.handle(), "col");
- unsigned uniform_transform = gl::getUniformLocation(program.handle(), "transform");
- GLfloat color[4] = {0.2f, 0.7f, 0.7f, 1.f};
- gl::uniform4fv(uniform_color, 1, static_cast<const GLfloat*>(color));
- program.unuse();
- od::Camera camera( Vec2(win.width(), win.height()) );
- while(win.open())
- {
- win.ioHandle();
- if(od::keyPressed(od::vk_escape))
- break;
- od::Vec2 mouse(win.mouse_x(), win.mouse_y());
- od::drawClear();
- glBlendFunc(GL_SRC_ALPHA, GL_ONE);
- glLineWidth(6);
- od::Vec2 m = camera.angle;
- m = m * (6.f / camera.scale.x);
- if(od::keyCheck(od::vk_right)) camera.pos += Vec2(m.y, -m.x);
- if(od::keyCheck(od::vk_left )) camera.pos += Vec2(-m.y, m.x);
- if(od::keyCheck(od::vk_up )) camera.pos -= m;
- if(od::keyCheck(od::vk_down )) camera.pos += m;
- if(od::keyCheck(od::vk_numpad4)) camera.angle.rotate(-0.05);
- if(od::keyCheck(od::vk_numpad6)) camera.angle.rotate( 0.05);
- if(od::keyCheck(od::vk_add )) camera.scale *= 1.05;
- if(od::keyCheck(od::vk_subtract)) camera.scale /= 1.05;
- {
- program.use();
- od::Mat3 camera_matrix = camera.matrix();
- GLfloat color1[4] = {0.2f, 0.7f, 0.7f, 1.f};
- gl::uniform4fv(uniform_color, 1, color1);
- for(int i=0; i<4; ++i)
- for(int j=0; j<4; ++j)
- {
- od::Mat3 model(1.f, 0.f, i*32.f,
- 0.f, 1.f, j*32.f,
- 0.f, 0.f, 1.f);
- gl::uniformMatrix(uniform_transform, camera_matrix * model);
- vao.bind();
- glDrawArrays(GL_LINES, 0, 15);
- vao.unbind();
- }
- GLfloat color2[4] = {0.7f, 0.2f, 0.2f, 1.f};
- gl::uniform4fv(uniform_color, 1, color2);
- for(int i=-4; i<0; ++i)
- for(int j=-4; j<0; ++j)
- {
- od::Mat3 model(1.f, 0.f, i*32.f,
- 0.f, 1.f, j*32.f,
- 0.f, 0.f, 1.f);
- gl::uniformMatrix(uniform_transform, camera_matrix * model);
- vao.bind();
- glDrawArrays(GL_LINES, 0, 15);
- vao.unbind();
- }
- {
- GLfloat color3[4] = {0.2f, 0.7f, 0.2f, 1.f};
- gl::uniform4fv(uniform_color, 1, color3);
- Vec2 p = camera.viewToWorld(mouse);
- od::Mat3 model(1.f, 0.f, p.x,
- 0.f, 1.f, p.y,
- 0.f, 0.f, 1.f);
- gl::uniformMatrix(uniform_transform, camera_matrix * model);
- vao.bind();
- glDrawArrays(GL_LINES, 0, 15);
- vao.unbind();
- }
- program.unuse();
- }
- od::framerateUpdate();
- win.screenRefresh();
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment