conic static method

Geometry conic({
  1. double radius = 1.0,
  2. double length = 1.0,
  3. bool normals = true,
  4. bool uvs = true,
})

Implementation

static Geometry conic({double radius = 1.0, double length = 1.0, bool normals = true, bool uvs = true}) {
  int segments = 32;
  List<double> verticesList = [];
  List<double> normalsList = [];
  List<double> uvsList = [];
  List<int> indices = [];

  // Create vertices, normals, and UVs
  for (int i = 0; i <= segments; i++) {
    double theta = i * 2 * pi / segments;
    double x = radius * cos(theta);
    double z = radius * sin(theta);

    // Base circle
    verticesList.addAll([x, 0, z]);

    // Calculate normal for the side
    double nx = x / sqrt(x * x + length * length);
    double nz = z / sqrt(z * z + length * length);
    double ny = radius / sqrt(radius * radius + length * length);
    normalsList.addAll([nx, ny, nz]);

    // UV coordinates
    uvsList.addAll([i / segments, 0]);
  }
  // Apex
  verticesList.addAll([0, length, 0]);
  normalsList.addAll([0, 1, 0]); // Normal at apex points straight up
  uvsList.addAll([0.5, 1]); // UV for apex

  // Create indices
  for (int i = 0; i < segments; i++) {
    // Base face (fixed to counterclockwise)
    indices.addAll([segments + 1, i + 1, i]);
    // Side faces (already correct)
    indices.addAll([i, segments, i + 1]);
  }

  // Add base face normals and UVs
  for (int i = 0; i <= segments; i++) {
    normalsList.addAll([0, -1, 0]); // Base face normal
    double u = 0.5 + 0.5 * cos(i * 2 * pi / segments);
    double v = 0.5 + 0.5 * sin(i * 2 * pi / segments);
    uvsList.addAll([u, v]); // Base face UV
  }

  Float32List vertices = Float32List.fromList(verticesList);
  Float32List? _normals = normals ? Float32List.fromList(normalsList) : null;
  Float32List? _uvs = uvs ? Float32List.fromList(uvsList) : null;

  return Geometry(vertices, indices, normals: _normals, uvs: _uvs);
}