docs: public static void generateCone(TFloatList positions, TFloatList normals, TIntList indices, float radius, float height) {
          // 0,0,0 will be halfway up the cone in the middle
          final float halfHeight = height / 2;
          // The positions at the bottom rim of the cone
          final List<Vector3f> rim = new ArrayList<>();
          for (int angle = 0; angle < 360; angle += 15) {
              final double angleRads = Math.toRadians(angle);
              rim.add(new Vector3f(
                      radius * TrigMath.cos(angleRads),
                      -halfHeight,
                      radius * -TrigMath.sin(angleRads)));
          }
          // Apex of the cone
          final Vector3f top = new Vector3f(0, halfHeight, 0);
          // The normal for the triangle of the bottom face
          final Vector3f bottomNormal = new Vector3f(0, -1, 0);
          // Add the bottom face center vertex
          addVector(positions, new Vector3f(0, -halfHeight, 0));// 0
          addVector(normals, bottomNormal);
          // The square of the radius of the cone on the xy plane
          final float radiusSquared = radius * radius / 4;
          // Add all the faces section by section, turning around the y axis
          final int rimSize = rim.size();
          for (int i = 0; i < rimSize; i++) {
              // Get the bottom vertex position and the side normal
              final Vector3f b = rim.get(i);
              final Vector3f bn = new Vector3f(b.getX() / radiusSquared, halfHeight - b.getY(), b.getZ() / radiusSquared).normalize();
              // Average the current and next normal to get the top normal
              final int nextI = i == rimSize - 1 ? 0 : i + 1;
              final Vector3f nextB = rim.get(nextI);
              final Vector3f nextBN = new Vector3f(nextB.getX() / radiusSquared, halfHeight - nextB.getY(), nextB.getZ() / radiusSquared).normalize();
              final Vector3f tn = bn.add(nextBN).normalize();
              // Top side vertex
              addVector(positions, top);// index
              addVector(normals, tn);
              // Bottom side vertex
              addVector(positions, b);// index + 1
              addVector(normals, bn);
              // Bottom face vertex
              addVector(positions, b);// index + 2
              addVector(normals, bottomNormal);
              // Get the current index for our vertices
              final int currentIndex = i * 3 + 1;
              // Get the index for the next iteration, wrapping around at the end
              final int nextIndex = nextI * 3 + 1;
              // Add the 2 triangles (1 side, 1 bottom)
              addAll(indices, currentIndex, currentIndex + 1, nextIndex + 1);
              addAll(indices, currentIndex + 2, 0, nextIndex + 2);
          }
      }