// draw objects with geometry shader defined by points void draw_objects(const Shader& shad, const GLuint option) { // number of objects (quads) constexpr GLuint n {100}; shad.use(); GLuint vao{}, vbo{}; if (option == 0) { gen_objects(vao, vbo, quad_vertices(), 5, 2); const auto offset_arr = offsets_array(n); const auto idx = shad.id(); for (GLuint i {0}; i < n; ++i) { const GLint loc = glGetUniformLocation(idx, std::string{"offsets_arr[" + std::to_string(i) + "]"}. c_str()); glUniform2f(loc, offset_arr[i].x, offset_arr[i].y); } } else { GLuint inst_vbo {gen_instance_buf(offsets_array(n))}; gen_objects_base(vao, vbo, quad_vertices(), 5, 2); set_instance_data(inst_vbo); } glBindVertexArray(vao); glDrawArraysInstanced(GL_TRIANGLES, 0, 6, n); glBindVertexArray(0); }
void Tree::Create(const std::vector<sf::Vector3f>& tile_vertices) { if(tile_vertices.size() != 4) { throw std::invalid_argument("tile_vertices must have 4 elements"); } sf::Vector3f mid_point((tile_vertices[0].x + tile_vertices[2].x) / 2.0, (tile_vertices[0].y + tile_vertices[2].y) / 2.0, (tile_vertices[0].z + tile_vertices[2].z) / 2.0); std::vector<sf::Vector3f> quad_vertices(4); this->quads.resize(4); quad_vertices[0] = tile_vertices[0]; quad_vertices[1] = mid_point; quad_vertices[2] = mid_point + sf::Vector3f(0.0, 0.0, 1.0); quad_vertices[3] = tile_vertices[0] + sf::Vector3f(0.0, 0.0, 1.0); this->quads[0].create(quad_vertices); quad_vertices[0] = tile_vertices[1]; quad_vertices[1] = mid_point; quad_vertices[2] = mid_point + sf::Vector3f(0.0, 0.0, 1.0); quad_vertices[3] = tile_vertices[1] + sf::Vector3f(0.0, 0.0, 1.0); this->quads[1].create(quad_vertices); quad_vertices[0] = tile_vertices[2]; quad_vertices[1] = mid_point; quad_vertices[2] = mid_point + sf::Vector3f(0.0, 0.0, 1.0); quad_vertices[3] = tile_vertices[2] + sf::Vector3f(0.0, 0.0, 1.0); this->quads[2].create(quad_vertices); quad_vertices[0] = tile_vertices[3]; quad_vertices[1] = mid_point; quad_vertices[2] = mid_point + sf::Vector3f(0.0, 0.0, 1.0); quad_vertices[3] = tile_vertices[3] + sf::Vector3f(0.0, 0.0, 1.0); this->quads[3].create(quad_vertices); this->type = rand() % 2; }