void Model::addBall(float radius, size_t step, size_t rstep, const glm::vec3 ¢er) { 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); } } }
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; } } }
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); }