コード例 #1
0
ファイル: brushmanip.cpp プロジェクト: ChunHungLiu/GtkRadiant
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);
    }
  }
}
コード例 #2
0
ファイル: Sphere.cpp プロジェクト: AresAndy/ufoai
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);
        }
    }
}
コード例 #3
0
ファイル: light.cpp プロジェクト: MyWifeRules/ufoai-1
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();
}