BoidRenderer::BoidRenderer(const BoidSystem& bs_, std::string vshader_fname, std::string fshader_fname, int width, int height) : bs(bs_), fov_angle_deg(60.0f), near_plane(0.0625f), far_plane(1024.0f), vertex_shader_fname(vshader_fname), fragment_shader_fname(fshader_fname) { update_projection_matrix((float)width/height); // vertex buffer GLuint vb; glGenBuffers(1, &vb); vertex_buffer = vb; glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); glBufferData(GL_ARRAY_BUFFER, bs.size()*3*sizeof(GL_FLOAT), NULL, GL_DYNAMIC_DRAW); if (!vertex_buffer) throw std::runtime_error("failed to create vertex_buffer"); vertex_shader = make_shader( GL_VERTEX_SHADER, vertex_shader_fname.c_str()); if (!vertex_shader) throw std::runtime_error("failed to create vertex_shader"); fragment_shader = make_shader( GL_FRAGMENT_SHADER, fragment_shader_fname.c_str()); if (!fragment_shader) throw std::runtime_error("failed to create fragment_shader"); program = make_program( vertex_shader, fragment_shader); if (!program) throw std::runtime_error("failed to compile shader program"); attributes.position = glGetAttribLocation( program, "position"); if (attributes.position == -1) throw std::runtime_error("failed to find 'position' attribute in shader program"); uniforms.pmatrix = glGetUniformLocation( program, "pmatrix"); if (uniforms.pmatrix == -1) throw std::runtime_error("failed to find 'pmatrix' uniform in shader program"); uniforms.mvmatrix = glGetUniformLocation( program, "mvmatrix"); if (uniforms.mvmatrix == -1) throw std::runtime_error("failed to find 'mvmatrix' uniform in shader program"); }
void camera::update_view_projection_matrix() const { if (projection_dirty || view_dirty) { if (projection_dirty) { update_projection_matrix(); } if (view_dirty) { update_view_matrix(); } view_projection = projection * view; } }