line( const Segment& segment ) : m_u(get_start(segment)) , m_v( normalize(get_end(segment) - get_start(segment) ) ) , m_n(left_normal(m_v)) , m_d(scalar_projection(as_vector(m_u), m_n)) {}
Walls::Walls(const unsigned int width, const unsigned int height): Model(true), _grid(width, height, Grid::MAZEGEN_DFS, 25, 100) { _key = "WALLS"; Logger_locator::get()(Logger::DBG, "Creating walls"); std::vector<glm::vec3> vert_pos; std::vector<glm::vec2> vert_tex_coords; std::vector<glm::vec3> vert_normals; std::vector<glm::vec3> vert_tangents; _meshes.emplace_back(); Mesh & mesh = _meshes.back(); glm::vec3 cell_scale(1.0f, 1.0f, 1.0f); glm::vec3 base(-0.5f * (float)_grid.grid[0].size(), 0.0f, -0.5f * (float)_grid.grid.size()); glm::vec3 left_normal(1.0f, 0.0f, 0.0f); glm::vec3 left_tangent(0.0f, 0.0f, -1.0f); glm::vec3 up_normal(0.0f, 0.0f, 1.0f); glm::vec3 up_tangent(1.0f, 0.0f, 0.0f); // draw border walls for(std::size_t col = 0; col < _grid.grid[0].size(); ++col) { glm::vec3 origin(cell_scale.x * (float)col, 0.0f, cell_scale.z * (float)_grid.grid.size()); origin += base; vert_pos.push_back(origin); vert_pos.push_back(origin + glm::vec3(cell_scale.x, 0.0f, 0.0f)); vert_pos.push_back(origin + glm::vec3(0.0f, cell_scale.y, 0.0f)); vert_pos.push_back(origin + glm::vec3(0.0f, cell_scale.y, 0.0f)); vert_pos.push_back(origin + glm::vec3(cell_scale.x, 0.0f, 0.0f)); vert_pos.push_back(origin + glm::vec3(cell_scale.x, cell_scale.y, 0.0f)); for(int i = 0; i < 6; ++i) { vert_normals.push_back(up_normal); vert_tangents.push_back(up_tangent); } } for(std::size_t row = 0; row < _grid.grid.size(); ++row) { glm::vec3 origin(cell_scale.x * (float)_grid.grid[row].size(), 0.0f, cell_scale.z * (float)row); origin += base; vert_pos.push_back(origin + glm::vec3(0.0f, 0.0f, cell_scale.z)); vert_pos.push_back(origin); vert_pos.push_back(origin + glm::vec3(0.0f, cell_scale.y, cell_scale.z)); vert_pos.push_back(origin + glm::vec3(0.0f, cell_scale.y, cell_scale.z)); vert_pos.push_back(origin); vert_pos.push_back(origin + glm::vec3(0.0f, cell_scale.y, 0.0f)); for(int i = 0; i < 6; ++i) { vert_normals.push_back(left_normal); vert_tangents.push_back(left_tangent); } } // draw cell walls for(std::size_t row = 0; row < _grid.grid.size(); ++row) { for(std::size_t col = 0; col < _grid.grid[row].size(); ++col) { glm::vec3 origin(cell_scale.x * (float)col, 0.0f, cell_scale.y * (float)row); origin += base; if(_grid.grid[row][col].walls[UP]) { vert_pos.push_back(origin); vert_pos.push_back(origin + glm::vec3(cell_scale.x, 0.0f, 0.0f)); vert_pos.push_back(origin + glm::vec3(0.0f, cell_scale.y, 0.0f)); vert_pos.push_back(origin + glm::vec3(0.0f, cell_scale.y, 0.0f)); vert_pos.push_back(origin + glm::vec3(cell_scale.x, 0.0f, 0.0f)); vert_pos.push_back(origin + glm::vec3(cell_scale.x, cell_scale.y, 0.0f)); for(int i = 0; i < 6; ++i) { vert_normals.push_back(up_normal); vert_tangents.push_back(up_tangent); } } if(_grid.grid[row][col].walls[LEFT]) { vert_pos.push_back(origin + glm::vec3(0.0f, 0.0f, cell_scale.z)); vert_pos.push_back(origin); vert_pos.push_back(origin + glm::vec3(0.0f, cell_scale.y, cell_scale.z)); vert_pos.push_back(origin + glm::vec3(0.0f, cell_scale.y, cell_scale.z)); vert_pos.push_back(origin); vert_pos.push_back(origin + glm::vec3(0.0f, cell_scale.y, 0.0f)); for(int i = 0; i < 6; ++i) { vert_normals.push_back(left_normal); vert_tangents.push_back(left_tangent); } } } } // add tex coords for(std::size_t i = 0; i < vert_pos.size(); i += 6) { vert_tex_coords.push_back(glm::vec2(0.0f, 0.0f)); vert_tex_coords.push_back(glm::vec2(1.0f, 0.0f)); vert_tex_coords.push_back(glm::vec2(0.0f, 1.0f)); vert_tex_coords.push_back(glm::vec2(0.0f, 1.0f)); vert_tex_coords.push_back(glm::vec2(1.0f, 0.0f)); vert_tex_coords.push_back(glm::vec2(1.0f, 1.0f)); } mesh.count = vert_pos.size(); _vao.bind(); _vbo.bind(); glBufferData(_vbo.type(), sizeof(glm::vec3) * vert_pos.size() + sizeof(glm::vec2) * vert_tex_coords.size() + sizeof(glm::vec3) * vert_normals.size() + sizeof(glm::vec3) * vert_tangents.size(), NULL, GL_STATIC_DRAW); glBufferSubData(_vbo.type(), 0, sizeof(glm::vec3) * vert_pos.size(), vert_pos.data()); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); glEnableVertexAttribArray(0); glBufferSubData(_vbo.type(), sizeof(glm::vec3) * vert_pos.size(), sizeof(glm::vec2) * vert_tex_coords.size(), vert_tex_coords.data()); glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid *)(sizeof(glm::vec3) * vert_pos.size())); glEnableVertexAttribArray(1); glBufferSubData(_vbo.type(), sizeof(glm::vec3) * vert_pos.size() + sizeof(glm::vec2) * vert_tex_coords.size(), sizeof(glm::vec3) * vert_normals.size(), vert_normals.data()); glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid *)(sizeof(glm::vec3) * vert_pos.size() + sizeof(glm::vec2) * vert_tex_coords.size())); glEnableVertexAttribArray(2); glBufferSubData(_vbo.type(), sizeof(glm::vec3) * vert_pos.size() + sizeof(glm::vec2) * vert_tex_coords.size() + sizeof(glm::vec3) * vert_normals.size(), sizeof(glm::vec3) * vert_tangents.size(), vert_tangents.data()); glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid *)(sizeof(glm::vec3) * vert_pos.size() + sizeof(glm::vec2) * vert_tex_coords.size() + sizeof(glm::vec3) * vert_normals.size())); glEnableVertexAttribArray(3); glBindVertexArray(0); _mats.emplace_back(); Material & mat = _mats.back(); mat.specular_color = glm::vec3(0.1f, 0.1f, 0.1f); mat.diffuse_map = Texture_2D::create(check_in_pwd("img/GroundCover.jpg"), GL_RGB8); mat.normal_shininess_map = Texture_2D::create(check_in_pwd("img/normals/GroundCover_N.jpg"), GL_RGB8); mat.shininess = 500.0f; mesh.mat = &_mats.back(); check_error("Walls::Walls"); }
line( const point_type& a, const point_type& b ) : m_u(a) , m_v(normalize( b - a )) , m_n(left_normal( m_v )) , m_d(scalar_projection(as_vector( a ), m_n)) {}
line( const point_type& u, const Vector& v ) : m_u(u) , m_v(normalize(v)) , m_n(left_normal( m_v )) , m_d(scalar_projection(as_vector(u), m_n)) {}
line( const Segment& segment ) : m_u(get_start(segment)) , m_v( normalize(get_end(segment) - get_start(segment) ) ) , m_n( left_normal(m_v)) , m_d( dot_product(m_n, as_vector(m_u))) {}
line( const point_type& a, const point_type& b ) : m_u( a ) , m_v( normalize( b - a ) ) , m_n( left_normal( m_v ) ) , m_d( dot_product( m_n, as_vector( a ) ) ) {}
line( const point_type& u, const vector_type& v ) : m_u( u ) , m_v( normalize(v) ) , m_n(left_normal( m_v )) , m_d(dot_product(m_n, as_vector(u))) {}