void Brush_ConstructSphere(Brush& brush, const AABB& bounds, std::size_t sides, const char* shader, const TextureProjection& projection) { if(sides < c_brushSphere_minSides) { globalErrorStream() << c_brushSphere_name << ": sides " << Unsigned(sides) << ": too few sides, minimum is " << Unsigned(c_brushSphere_minSides) << "\n"; return; } if(sides > c_brushSphere_maxSides) { globalErrorStream() << c_brushSphere_name << ": sides " << Unsigned(sides) << ": too many sides, maximum is " << Unsigned(c_brushSphere_maxSides) << "\n"; return; } brush.undoSave(); brush.clear(); brush.reserve(sides*sides); float radius = max_extent(bounds.extents); const Vector3& mid = bounds.origin; Vector3 planepts[3]; double dt = 2 * c_pi / sides; double dp = c_pi / sides; for(std::size_t i=0; i < sides; i++) { for(std::size_t j=0;j < sides-1; j++) { double t = i * dt; double p = float(j * dp - c_pi / 2); planepts[0] = vector3_added(mid, vector3_scaled(vector3_for_spherical(t, p), radius)); planepts[1] = vector3_added(mid, vector3_scaled(vector3_for_spherical(t, p + dp), radius)); planepts[2] = vector3_added(mid, vector3_scaled(vector3_for_spherical(t + dt, p + dp), radius)); brush.addPlane(planepts[0], planepts[1], planepts[2], shader, projection); } } { double p = (sides - 1) * dp - c_pi / 2; for(std::size_t i = 0; i < sides; i++) { double t = i * dt; planepts[0] = vector3_added(mid, vector3_scaled(vector3_for_spherical(t, p), radius)); planepts[1] = vector3_added(mid, vector3_scaled(vector3_for_spherical(t + dt, p + dp), radius)); planepts[2] = vector3_added(mid, vector3_scaled(vector3_for_spherical(t + dt, p), radius)); brush.addPlane(planepts[0], planepts[1], planepts[2], shader, projection); } } }
void Sphere::generate (Brush& brush, const AABB& bounds, std::size_t sides, const TextureProjection& projection, const std::string& shader) { if (sides < _minSides) { gtkutil::errorDialog(_("Too few sides for constructing the sphere, minimum is 3")); return; } if (sides > _maxSides) { gtkutil::errorDialog(_("Too many sides for constructing the sphere, maximum is 31")); return; } brush.clear(); brush.reserve(sides * sides); float radius = maxExtent(bounds.extents); const Vector3& mid = bounds.origin; Vector3 planepts[3]; double dt = 2 * c_pi / sides; double dp = c_pi / sides; for (std::size_t i = 0; i < sides; i++) { for (std::size_t j = 0; j < sides - 1; j++) { double t = i * dt; double p = float(j * dp - c_pi / 2); planepts[0] = mid + vector3_for_spherical(t, p) * radius; planepts[1] = mid + vector3_for_spherical(t, p + dp) * radius; planepts[2] = mid + vector3_for_spherical(t + dt, p + dp) * radius; brush.addPlane(planepts[0], planepts[1], planepts[2], shader, projection); } } { double p = (sides - 1) * dp - c_pi / 2; for (std::size_t i = 0; i < sides; i++) { double t = i * dt; planepts[0] = mid + vector3_for_spherical(t, p) * radius; planepts[1] = mid + vector3_for_spherical(t + dt, p + dp) * radius; planepts[2] = mid + vector3_for_spherical(t + dt, p) * radius; brush.addPlane(planepts[0], planepts[1], planepts[2], shader, projection); } } }
static void sphere_draw_fill (const Vector3& origin, float radius, int sides) { if (radius <= 0) return; const double dt = c_2pi / static_cast<double> (sides); const double dp = c_pi / static_cast<double> (sides); glBegin(GL_TRIANGLES); for (int i = 0; i <= sides - 1; ++i) { for (int j = 0; j <= sides - 2; ++j) { const double t = i * dt; const double p = (j * dp) - (c_pi / 2.0); { Vector3 v(origin + vector3_for_spherical(t, p) * radius); glVertex3fv(v); } { Vector3 v(origin + vector3_for_spherical(t, p + dp) * radius); glVertex3fv(v); } { Vector3 v(origin + vector3_for_spherical(t + dt, p + dp) * radius); glVertex3fv(v); } { Vector3 v(origin + vector3_for_spherical(t, p) * radius); glVertex3fv(v); } { Vector3 v(origin + vector3_for_spherical(t + dt, p + dp) * radius); glVertex3fv(v); } { Vector3 v(origin + vector3_for_spherical(t + dt, p) * radius); glVertex3fv(v); } } } { const double p = (sides - 1) * dp - (c_pi / 2.0); for (int i = 0; i <= sides - 1; ++i) { const double t = i * dt; { Vector3 v(origin + vector3_for_spherical(t, p) * radius); glVertex3fv(v); } { Vector3 v(origin + vector3_for_spherical(t + dt, p + dp) * radius); glVertex3fv(v); } { Vector3 v(origin + vector3_for_spherical(t + dt, p) * radius); glVertex3fv(v); } } } glEnd(); }