| 131 | // `new Array(N)` + index assignment is documented as working |
| 132 | // (per the perry-llvm fix history). |
| 133 | function makeSphere(segs: number, rings: number): { |
| 134 | vertices: number[]; vertexCount: number; |
| 135 | indices: number[]; indexCount: number; |
| 136 | } { |
| 137 | const vCount = (rings + 1) * (segs + 1); |
| 138 | const iCount = rings * segs * 6; |
| 139 | const verts: number[] = new Array(vCount * 12); |
| 140 | const inds: number[] = new Array(iCount); |
| 141 | let vi = 0; |
| 142 | for (let r = 0; r <= rings; r = r + 1) { |
| 143 | const phi = PI * r / rings; |
| 144 | const sp = Math.sin(phi); |
| 145 | const cp = Math.cos(phi); |
| 146 | for (let s = 0; s <= segs; s = s + 1) { |
| 147 | const theta = TWO_PI * s / segs; |
| 148 | const x = sp * Math.cos(theta); |
| 149 | const y = cp; |
| 150 | const z = sp * Math.sin(theta); |
| 151 | verts[vi] = x; verts[vi + 1] = y; verts[vi + 2] = z; // pos |
| 152 | verts[vi + 3] = x; verts[vi + 4] = y; verts[vi + 5] = z; // normal |
| 153 | verts[vi + 6] = 1; verts[vi + 7] = 1; verts[vi + 8] = 1; |
| 154 | verts[vi + 9] = 1; // color rgba |
| 155 | verts[vi + 10] = s / segs; verts[vi + 11] = r / rings; // uv |
| 156 | vi = vi + 12; |
| 157 | } |
| 158 | } |
| 159 | let ii = 0; |
| 160 | for (let r = 0; r < rings; r = r + 1) { |
| 161 | for (let s = 0; s < segs; s = s + 1) { |
| 162 | const a = r * (segs + 1) + s; |
| 163 | const b = a + segs + 1; |
| 164 | inds[ii] = a; inds[ii + 1] = b; inds[ii + 2] = a + 1; |
| 165 | inds[ii + 3] = b; inds[ii + 4] = b + 1; inds[ii + 5] = a + 1; |
| 166 | ii = ii + 6; |
| 167 | } |
| 168 | } |
| 169 | return { vertices: verts, vertexCount: vCount, indices: inds, indexCount: iCount }; |
| 170 | } |
| 171 | |
| 172 | function initSharedMeshes(): void { |
| 173 | const sphere = makeSphere(24, 16); |