onilink_

Untitled

Jan 3rd, 2019
259
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.51 KB | None | 0 0
  1. #include <onidev.h>
  2.  
  3. void error_callback(
  4.     GLenum source, GLenum type, GLuint id, GLenum severity,
  5.     GLsizei length, const char* message, const void* user_param)
  6. {
  7.     od::err() << message;
  8. }
  9.  
  10. int main()
  11. {
  12.     namespace gl = od::gl;
  13.    
  14.     od::Window win(640, 480, "OpenGL Demo", od::Version(3, 2));
  15.    
  16.     std::cout << "OpenGL " << od::Extension::get().version().str() << std::endl;
  17.    
  18.     gl::debugMessageCallback(error_callback, nullptr);
  19.     glEnable(GL_DEBUG_OUTPUT);
  20.    
  21.     std::string vertex_shader_scr =
  22.         OD_GLSL(140,
  23.             attribute vec2 pos;
  24.             uniform   mat3 transform; // model view projection
  25.            
  26.             void main()
  27.             {
  28.                 gl_Position = vec4(transform * vec3(pos, 1.0), 1.0);
  29.             });
  30.    
  31.     std::string fragment_shader_scr =
  32.         OD_GLSL(140,
  33.             uniform vec4 col;
  34.             void main()
  35.             {
  36.                 gl_FragColor = col;
  37.             });
  38.    
  39.     enum {
  40.         position_attrib_index
  41.     };
  42.     const std::map<unsigned, std::string> attrib_map = {
  43.         { position_attrib_index, "pos" }
  44.     };
  45.    
  46.     gl::Program program;
  47.     {
  48.         gl::Shader vertex_shader(gl::Shader::Vertex, vertex_shader_scr);
  49.         gl::Shader fragment_shader(gl::Shader::Fragment, fragment_shader_scr);
  50.        
  51.         program.attach(vertex_shader);
  52.         program.attach(fragment_shader);
  53.         for(const auto& p: attrib_map) {
  54.             program.bindAttribLocation(p.first, p.second);
  55.         }
  56.         program.link();
  57.        
  58.         program.detach(vertex_shader);
  59.         program.detach(fragment_shader);
  60.     }
  61.    
  62.     gl::Vao vao;
  63.     gl::Vbo vbo_shape;
  64.     {
  65.         std::vector<float> data_pos = {
  66.             -10, -10, 10, -10,
  67.             10, -10, 10, 10,
  68.             10, 10, -10, 10,
  69.             -10, 10, -10, -10
  70.         };
  71.        
  72.         vbo_shape.bind();
  73.         vbo_shape.data(data_pos.size() * sizeof(float), &data_pos[0]);
  74.        
  75.         vao.bind();
  76.         vao.setVertexAttribf(vbo_shape, position_attrib_index, 2, false, 2 * sizeof(float), 0);
  77.         vao.unbind();
  78.     }
  79.    
  80.     program.use();
  81.     unsigned uniform_color = gl::getUniformLocation(program.handle(), "col");
  82.     unsigned uniform_transform = gl::getUniformLocation(program.handle(), "transform");
  83.     GLfloat color[4] = {0.2f, 0.7f, 0.7f, 1.f};
  84.     gl::uniform4fv(uniform_color, 1, static_cast<const GLfloat*>(color));
  85.     program.unuse();
  86.    
  87.     od::Camera camera( Vec2(win.width(), win.height()) );
  88.    
  89.     while(win.open())
  90.     {
  91.         win.ioHandle();
  92.        
  93.         if(od::keyPressed(od::vk_escape))
  94.             break;
  95.        
  96.         od::Vec2 mouse(win.mouse_x(), win.mouse_y());
  97.        
  98.         od::drawClear();
  99.        
  100.        
  101.         glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  102.         glLineWidth(6);
  103.        
  104.         od::Vec2 m = camera.angle;
  105.         m = m * (6.f / camera.scale.x);
  106.        
  107.         if(od::keyCheck(od::vk_right)) camera.pos += Vec2(m.y, -m.x);
  108.         if(od::keyCheck(od::vk_left )) camera.pos += Vec2(-m.y, m.x);
  109.         if(od::keyCheck(od::vk_up   )) camera.pos -= m;
  110.         if(od::keyCheck(od::vk_down )) camera.pos += m;
  111.        
  112.         if(od::keyCheck(od::vk_numpad4)) camera.angle.rotate(-0.05);
  113.         if(od::keyCheck(od::vk_numpad6)) camera.angle.rotate( 0.05);
  114.        
  115.         if(od::keyCheck(od::vk_add     )) camera.scale *= 1.05;
  116.         if(od::keyCheck(od::vk_subtract)) camera.scale /= 1.05;
  117.        
  118.         {
  119.             program.use();
  120.            
  121.             od::Mat3 camera_matrix = camera.matrix();
  122.             GLfloat color1[4] = {0.2f, 0.7f, 0.7f, 1.f};
  123.             gl::uniform4fv(uniform_color, 1, color1);
  124.            
  125.             for(int i=0; i<4; ++i)
  126.             for(int j=0; j<4; ++j)
  127.             {
  128.                 od::Mat3 model(1.f, 0.f, i*32.f,
  129.                                0.f, 1.f, j*32.f,
  130.                                0.f, 0.f, 1.f);
  131.                
  132.                 gl::uniformMatrix(uniform_transform, camera_matrix * model);
  133.                
  134.                 vao.bind();
  135.                 glDrawArrays(GL_LINES, 0, 15);
  136.                 vao.unbind();
  137.             }
  138.            
  139.             GLfloat color2[4] = {0.7f, 0.2f, 0.2f, 1.f};
  140.             gl::uniform4fv(uniform_color, 1, color2);
  141.            
  142.             for(int i=-4; i<0; ++i)
  143.             for(int j=-4; j<0; ++j)
  144.             {
  145.                 od::Mat3 model(1.f, 0.f, i*32.f,
  146.                                0.f, 1.f, j*32.f,
  147.                                0.f, 0.f, 1.f);
  148.                
  149.                 gl::uniformMatrix(uniform_transform, camera_matrix * model);
  150.                
  151.                 vao.bind();
  152.                 glDrawArrays(GL_LINES, 0, 15);
  153.                 vao.unbind();
  154.             }
  155.            
  156.             {
  157.                 GLfloat color3[4] = {0.2f, 0.7f, 0.2f, 1.f};
  158.                 gl::uniform4fv(uniform_color, 1, color3);
  159.                
  160.                 Vec2 p = camera.viewToWorld(mouse);
  161.                 od::Mat3 model(1.f, 0.f, p.x,
  162.                                0.f, 1.f, p.y,
  163.                                0.f, 0.f, 1.f);
  164.                
  165.                 gl::uniformMatrix(uniform_transform, camera_matrix * model);
  166.                
  167.                 vao.bind();
  168.                 glDrawArrays(GL_LINES, 0, 15);
  169.                 vao.unbind();
  170.             }
  171.            
  172.             program.unuse();
  173.         }
  174.        
  175.         od::framerateUpdate();
  176.         win.screenRefresh();
  177.     }
  178.    
  179.     return 0;
  180. }
Advertisement
Add Comment
Please, Sign In to add comment