import * as bufferset from './bufferset' ; type BufferSet = bufferset . BufferSet ; /**
 * Create half of a dome, using half of the texture
 */ function createHalfDome ( bs , lats , lngs , radius , height , uStart , uEnd , vStart , vEnd , startAngle = 0 ) { const pos = bs . position ; const uv = bs . uv ; const id = bs . index ; let i = 0 ; for ( let lat = 0 ; lat < lats ; ++ lat ) { const phi = Math . PI / 2.0 * lat / ( lats - 1 ) ; const lrad = radius * Math . cos ( phi ) ; for ( let lng = 0 ; lng < lngs ; ++ lng ) { const lambda = startAngle + Math . PI * lng / ( lngs - 1 ) ; i = ( bs . vertexCount + lat * lngs + lng ) * 3 ; pos [ i ++ ] = Math . cos ( lambda ) * lrad ; pos [ i ++ ] = Math . sin ( lambda ) * lrad ; pos [ i ++ ] = Math . sin ( phi ) * height ; i = ( bs . vertexCount + lat * lngs + lng ) * 2 ; uv [ i ++ ] = uStart + ( ( lngs - 1 - lng ) / ( lngs - 1 ) ) * ( uEnd - uStart ) ; uv [ i ++ ] = vStart + Math . sin ( phi ) * ( vEnd - vStart ) ; } } i = bs . indexCount ; for ( let lat = 0 ; lat < lats - 1 ; ++ lat ) { for ( let lng = 0 ; lng < lngs - 1 ; ++ lng ) { const vi = bs . vertexCount + lat * ( lngs - 1 ) + lng ; id [ i ++ ] = vi + lat ; id [ i ++ ] = vi + lat + 1 ; id [ i ++ ] = vi + lats + lat + 1 ; id [ i ++ ] = vi + lats + lat + 1 ; id [ i ++ ] = vi + lats + lat ; id [ i ++ ] = vi + lat ; } } bs . vertexCount += lats * lngs ; bs . indexCount += 6 * ( lats - 1 ) * ( lngs - 1 ) ; return bs ; } export function createMesh ( tex , radius , height , lats = 16 , lngs = 16 ) { const bs = bufferset . create ( 2 * lats * lngs , 2 * 6 * ( lats - 1 ) * ( lngs - 1 ) , bufferset . POSITION | bufferset . UV | bufferset . INDEX ) ; createHalfDome ( bs , lats , lngs , radius , height , 0.0 , 1.0 , 0.0 , 0.5 , 0.0 ) ; createHalfDome ( bs , lats , lngs , radius , height , 0.0 , 1.0 , 0.5 , 1.0 , Math . PI ) ; const geo = new THREE . BufferGeometry ( ) ; geo . addAttribute ( 'position' , new THREE . BufferAttribute ( bs . position , 3 ) ) ; geo . addAttribute ( 'uv' , new THREE . BufferAttribute ( bs . uv , 2 ) ) ; geo . setIndex ( new THREE . BufferAttribute ( bs . index , 1 ) ) ; tex . wrapS = tex . wrapT = THREE . ClampToEdgeWrapping ; const mat = new THREE . MeshBasicMaterial ( { color : 0xFFFFFF , map : tex , fog : false , side : THREE . BackSide } ) ; const mesh = new THREE . Mesh ( geo , mat ) ; return mesh ; }