Exemplo n.º 1
0
void Model::addBall(float radius, size_t step, size_t rstep, const glm::vec3 &center) {
    if (step < 2) {
        step = 2; // step < 2 => straight line
    }
    if (rstep < 3) {
        rstep = 2 * step; // rstep < 3 => flat polygon
    }

    float phi = 0, theta = 0, dPhi = Pi / (step), dTheta = 2.0f * Pi / rstep;

    step += 1;
    rstep += 1;

    reserveVertices((step) * (rstep));
    reserveIndices((step) * (rstep) * 2);

    glm::vec3 n;
    size_t i, j, k = mVertices.size();

    for (i = 0; i < rstep; i++, theta += dTheta) {
        for (j = 0, phi = 0; j < step; j++, phi += dPhi) {

            n.x = std::sin(phi)*std::cos(theta);
            n.y = std::cos(phi);
            n.z = std::sin(phi)*std::sin(theta);
            addVertex(Vertex(n, center+n*radius));

            size_t p = (i + 1) % rstep;
            size_t q = (j + 1) % step;
            addQuad(k+(i*step)+j, k+(p*step)+j, k+(p*step)+q, k+(i*step)+q);
        }
    }
}
Exemplo n.º 2
0
void Model::addPlane(const glm::vec3 &a, const glm::vec3 &b, const glm::vec3 &c, const glm::vec4 &texRect) {
    glm::vec3 normal = normalize(cross(c - b, a - b));
    glm::vec3 d = a + c - b;

    glm::vec2 t0(texRect.x, texRect.y);
    glm::vec2 t1(texRect.x + texRect.z, texRect.y + texRect.w);

    switch (mPrimitive) {
        case GLTriangles: {
            reserveIndices(6);
            size_t n = mVertices.size();
            addQuad(n+0, n+1, n+2, n+3);

            reserveVertices(4);
            addVertex(Vertex(glm::vec2(t1.x,t0.y), normal, c));
            addVertex(Vertex(glm::vec2(t1.x,t1.y), normal, d));
            addVertex(Vertex(glm::vec2(t0.x,t1.y), normal, a));
            addVertex(Vertex(glm::vec2(t0.x,t0.y), normal, b));
            break;
        }
    }
}
Exemplo n.º 3
0
bool Mesh::read(std::istream& in)
{
    std::string str;
    unsigned i,vertices,indices;

    clear();

    in >> str >> m_name;
    if (in.fail() || str.compare(WZM_MESH_SIGNATURE) != 0)
    {
        std::cerr << "Mesh::read - Expected " << WZM_MESH_SIGNATURE << " directive found " << str;
        return false;
    }

    if (!isValidWzName(m_name))
    {
        std::cerr << "Mesh::read - Invalid mesh name: " << m_name;
        m_name = std::string();
    }

    in >> str >> m_teamColours;
    if (in.fail() || str.compare(WZM_MESH_DIRECTIVE_TEAMCOLOURS) != 0)
    {
        std::cerr << "Mesh::read - Expected " << WZM_MESH_DIRECTIVE_TEAMCOLOURS << " directive found " << str;
        return false;
    }

    in >> str;
    if (in.fail() || str.compare(WZM_MESH_DIRECTIVE_MINMAXTSCEN) != 0)
    {
        std::cerr << "Mesh::read - Expected " << WZM_MESH_DIRECTIVE_MINMAXTSCEN << " directive found " << str;
        return false;
    }
    else
    {
        // ignore those, they will be recalculated later (support for manual editing for example)
        float f;
        in >> f >> f >> f >> f >> f >> f >> f >> f >> f;
        if (in.fail())
        {
            std::cerr << "Mesh::read - Error reading minmaxtspcen values";
            return false;
        }
    }

    in >> str >> vertices;
    if (in.fail() || str.compare(WZM_MESH_DIRECTIVE_VERTICES) != 0)
    {
        std::cerr << "Mesh::read - Expected " << WZM_MESH_DIRECTIVE_VERTICES << " directive found " << str;
        return false;
    }

    in >> str >> indices;
    if (in.fail() || str.compare(WZM_MESH_DIRECTIVE_INDICES) != 0)
    {
        std::cerr << "Mesh::read - Expected " << WZM_MESH_DIRECTIVE_INDICES << " directive found " << str;
        return false;
    }

    in >> str;
    if (in.fail() || str.compare(WZM_MESH_DIRECTIVE_VERTEXARRAY) != 0)
    {
        std::cerr << "Mesh::read - Expected " << WZM_MESH_DIRECTIVE_VERTEXARRAY << " directive found " << str;
        return false;
    }

    reservePoints(vertices);

    WZMVertex vert, normal;
    WZMVertex4 tangent;
    WZMUV uv;

    for (; vertices > 0; --vertices)
    {
        in >> vert.x() >> vert.y() >> vert.z();
        if (in.fail())
        {
            std::cerr << "Mesh::read - Error reading vertex";
            return false;
        }
        m_vertexArray.push_back(vert);

        in >> uv.u() >> uv.v();
        if (in.fail())
        {
            std::cerr << "Mesh::read - Error reading uv coords.";
            return false;
        }
        else if (uv.u() > 1 || uv.v() > 1)
        {
            std::cerr << "Mesh::read - Error uv coords out of range";
            return false;
        }
        m_textureArray.push_back(uv);

        in >> normal.x() >> normal.y() >> normal.z();
        if (in.fail())
        {
            std::cerr << "Mesh::read - Error reading normal";
            return false;
        }
        m_normalArray.push_back(normal);

        in >> tangent.x() >> tangent.y() >> tangent.z() >> tangent.w();
        if (in.fail())
        {
            std::cerr << "Mesh::read - Error reading t";
            return false;
        }
        m_tangentArray.push_back(tangent);
    }

    in >> str;
    if (str.compare(WZM_MESH_DIRECTIVE_INDEXARRAY) != 0)
    {
        std::cerr << "Mesh::read - Expected " << WZM_MESH_DIRECTIVE_INDEXARRAY << " directive found " << str;
        return false;
    }

    reserveIndices(indices);
    for(; indices > 0; --indices)
    {
        IndexedTri tri;

        in >> tri.a() >> tri.b() >> tri.c();

        if (in.fail())
        {
            std::cerr << "Mesh::read - Error reading indices";
            return false;
        }
        m_indexArray.push_back(tri);
    }

    in >> str >> i;
    if (in.fail() || str.compare(WZM_MESH_DIRECTIVE_CONNECTORS) != 0)
    {
        std::cerr << "Mesh::read - Expected " << WZM_MESH_DIRECTIVE_CONNECTORS << " directive found " << str;
        return false;
    }

    if (i > 0)
    {
        WZMVertex con;

        for(; i > 0; --i)
        {
            in >> con.x() >> con.y() >> con.z();
        }
        if (in.fail())
        {
            std::cerr << "Mesh::read - Error reading connectors";
            return false;
        }
        m_connectors.push_back(con);
    }