Esempio n. 1
0
 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))
 {}
Esempio n. 2
0
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");
}
Esempio n. 3
0
 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))
 {}
Esempio n. 4
0
 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))
 {}
Esempio n. 5
0
	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)))
	{}
Esempio n. 6
0
	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 ) ) )
	{}
Esempio n. 7
0
    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)))
    {}