28 ASSERT(0 <= cut && cut < 1);
32 int rings, slices =
SLICES;
33 float minPh, maxPh, phRge;
37 minPh = asinf(2 * cut - 1);
39 maxPh = asinf(1 - 2 * removedTop);
46 maxPh = asinf(1 - removedTop);
50 phRge = maxPh - minPh;
51 rings = qMax(2, qCeil(qreal(
RINGS * phRge) /
M_PI));
54 ASSERT(2 <= rings && 2 <= slices);
57 QVector<Vertices> vs_(rings), ns_(rings);
58 for (
auto& ring : vs_)
60 for (
auto& ring : ns_)
65 for (
int r = 0; r < rings; ++r) {
66 float ph = minPh + phRge * r / (rings - 1);
67 float cp = cosf(ph), sp = sinf(ph);
69 for (
int s = 0; s < slices; ++s) {
70 float th = float(2 *
M_PI * s / slices);
71 Vector3D v(R * cp * cosf(th), R * cp * sinf(th), R * sp);
80 int const nv = 6 * (rings)*slices;
86 for (
int r = 0; r < rings; ++r) {
87 auto &vr = vs_.at(r), &nr = ns_.at(r);
89 for (
int s = 0; s < slices; ++s) {
90 int s0 = s, s1 = (s + 1) % slices;
92 auto &v0 = vr.at(s0), &v1 = vr.at(s1);
93 auto &n0 = nr.at(s0), &n1 = nr.at(s1);
101 vp =
Vector3D(0, 0, -R + baseShift);
109 if (r + 1 == rings) {
111 if (removedTop > 0) {
115 vp =
Vector3D(0, 0, +R + baseShift);
122 auto &vr1 = vs_.at(r + 1), &nr1 = ns_.at(r + 1);
123 auto &n2 = nr1.at(s1), &n3 = nr1.at(s0);
124 vs.
addQuad(v0, v1, vr1.at(s1), vr1.at(s0));
Defines the macro ASSERT.
#define ASSERT(condition)
static Mesh meshSphere(float cut, float baseShift=0.0f, float removedTop=0.0f)
static Mesh makeMesh(const Vertices &vs, Vertices const *ns=nullptr)
QVector< Vert_Normal > Mesh
void addTriangle(const Vector3D &, const Vector3D &, const Vector3D &)
void addQuad(const Vector3D &, const Vector3D &, const Vector3D &, const Vector3D &)
Vector3D normalized() const