KHalfEdgeMeshPrivate::FaceIndex KHalfEdgeMeshPrivate::addFace(index_array &v1, index_array &v2, index_array &v3) { // Normalize Indices size_t size = m_vertices.size() + 1; // Normalize Indices normalizeIndex(v1[0], size); normalizeIndex(v2[0], size); normalizeIndex(v3[0], size); // Create edges HalfEdgeIndex edgeA = getHalfEdge(v1, v2); HalfEdgeIndex edgeB = getHalfEdge(v2, v3); HalfEdgeIndex edgeC = getHalfEdge(v3, v1); // Create Face m_faces.emplace_back(edgeA); FaceIndex faceIdx = FaceIndex(static_cast<index_type>(m_faces.size())); // Initialize Inner Half Edges initializeInnerHalfEdge(edgeA, faceIdx, edgeB); initializeInnerHalfEdge(edgeB, faceIdx, edgeC); initializeInnerHalfEdge(edgeC, faceIdx, edgeA); // Set Vertex half edges if (vertex(v1[0])->to == 0) vertex(v1[0])->to = edgeA; if (vertex(v2[0])->to == 0) vertex(v2[0])->to = edgeB; if (vertex(v3[0])->to == 0) vertex(v3[0])->to = edgeC; return faceIdx; }
void Graphics::CreatePlane(VertexContainer& vertices, IndexedTriangleContainer& container, const Texture& texture, int width, int height) { vertices.clear(); container.clear(); Vertex cell[] = { Vertex(-0.5f, 0, -0.5f, 0, 0.99f), Vertex(-0.5f, 0, 0.5f, 0, 0), Vertex(0.5f, 0, 0.5f, 0.99f, 0), Vertex(0.5f, 0, -0.5f, 0.99f, 0.99f), }; for (int x = -width; x <= width; ++x) { for (int z = -height; z <= height; ++z) { Vertex lb = cell[0], lt = cell[1], rt = cell[2], rb = cell[3]; lb.x += x, lb.z += z; lt.x += x, lt.z += z; rt.x += x, rt.z += z; rb.x += x, rb.z += z; vertices.push_back(lb); vertices.push_back(lt); vertices.push_back(rt); vertices.push_back(rb); } } for (size_t i = 0; i < vertices.size(); i += 4) { Triangle lt(i + 0, i + 1, i + 2, texture); Triangle rb(i + 0, i + 2, i + 3, texture); container.push_back(lt); container.push_back(rb); } }
/******************************************************************************* * HalfEdgeMeshPrivate :: Add Commands ******************************************************************************/ inline KHalfEdgeMeshPrivate::VertexIndex KHalfEdgeMeshPrivate::addVertex(const KVector3D &v) { m_vertices.emplace_back(v, 0); m_aabb.encompassPoint(v); return VertexIndex(static_cast<index_type>(m_vertices.size())); }