function createCylinderMesh(
radiusTop = 1,
radiusBottom = 1,
height = 5,
radialSegments = 64,
heightSegments = 8
) {
var index = 0
var indexOffset = 0
var indexArray = []
var capCount = 0
if (radiusTop > 0) {
capCount++
}
if (radiusBottom > 0) {
capCount++
}
var vertexCount = ((radialSegments + 1) * (heightSegments + 1)) +
((radialSegments + 2) * capCount)
var cellCount = (radialSegments * heightSegments * 2) + (radialSegments * capCount)
var normals = new Array(vertexCount)
var vertices = new Array(vertexCount)
var uvs = new Array(vertexCount)
var cells = new Array(cellCount)
var slope = (radiusBottom - radiusTop) / height
var thetaLength = 2.0 * Math.PI
for (var zz = 0; zz <= heightSegments; zz++) {
var indexRow = []
var v = zz / heightSegments
var radius = v * (radiusBottom - radiusTop) + radiusTop
for (var xx = 0; xx <= radialSegments; xx++) {
var u = xx / radialSegments
var theta = u * thetaLength
var sinTheta = Math.sin(theta)
var cosTheta = Math.cos(theta)
vertices[index] = [radius * sinTheta, radius * cosTheta, -v * height + (height)]
normals[index] = [sinTheta, slope, cosTheta]
uvs[index] = [u, 1 - v]
indexRow.push(index)
index++
}
indexArray.push(indexRow)
}
for (var xx = 0; xx < radialSegments; xx++) {
for (var zz = 0; zz < heightSegments; zz++) {
var i1 = indexArray[zz][xx]
var i2 = indexArray[zz + 1][xx]
var i3 = indexArray[zz + 1][xx + 1]
var i4 = indexArray[zz][xx + 1]
cells[indexOffset] = [i1, i2, i4]
indexOffset++
cells[indexOffset] = [i2, i3, i4]
indexOffset++
}
}
var generateCap = function (top) {
var vertex = new Array(3).fill(0)
var radius = (top === true) ? radiusTop : radiusBottom
var sign = (top === true) ? 1 : 0
var centerIndexStart = index
for (var x = 1; x <= radialSegments; x++) {
vertices[index] = [0, 0, height * sign]
normals[index] = [0, sign, 0]
uvs[index] = [0.5, 0.5]
index++
}
var centerIndexEnd = index
for (var x = 0; x <= radialSegments; x++) {
var u = x / radialSegments
var theta = u * thetaLength
var cosTheta = Math.cos(theta)
var sinTheta = Math.sin(theta)
vertices[index] = [radius * sinTheta, radius * cosTheta, height * sign]
normals[index] = [0, sign, 0]
uvs[index] = [(cosTheta * 0.5) + 0.5, (sinTheta * 0.5 * sign) + 0.5]
index++
}
for (var xx = 0; xx < radialSegments; xx++) {
var c = centerIndexStart + xx
var i = centerIndexEnd + xx
if ( top === true ) {
cells[indexOffset] = [i, i + 1, c]
indexOffset++
} else {
cells[indexOffset] = [i + 1, i, c]
indexOffset++
}
}
}
if (radiusTop > 0) {
generateCap(true)
}
if (radiusBottom > 0) {
generateCap(false)
}
return {
uvs: uvs,
cells: cells,
normals: normals,
positions: vertices
}
}