icosphere: type: procedure debug: false definitions: subdivisions script: - define lookup - define verts:->:]> - define verts:->:]> - define verts:->:]> - define verts:->:]> - define verts:->:]> - define verts:->:]> - define verts:->:]> - define verts:->:]> - define verts:->:]> - define verts:->:]> - define verts:->:]> - define verts:->:]> - define faces:->:]> - define faces:->:]> - define faces:->:]> - define faces:->:]> - define faces:->:]> - define faces:->:]> - define faces:->:]> - define faces:->:]> - define faces:->:]> - define faces:->:]> - define faces:->:]> - define faces:->:]> - define faces:->:]> - define faces:->:]> - define faces:->:]> - define faces:->:]> - define faces:->:]> - define faces:->:]> - define faces:->:]> - define faces:->:]> - repeat <[subdivisions]>: - define face_subdivisions - foreach <[faces]> as:triangle: - define new_verts - foreach 1,2|2,3|3,1 as:tuple: - define indices <[tuple].split[,]> - define i1 <[triangle].get[<[indices].first>]> - define i2 <[triangle].get[<[indices].last>]> - define min <[i1].min[<[i2]>]> - define max <[i1].max[<[i2]>]> - define key <[min]>_<[max]> - if not <[lookup.<[key]>].exists>: - define verts:->:]>;b=<[verts].get[<[max]>]>].normalize> - define lookup.<[key]>:<[verts].size> - define new_verts:->:<[lookup.<[key]>]> - define face_subdivisions:->:|<[new_verts].get[1]>|<[new_verts].get[3]>]> - define face_subdivisions:->:|<[new_verts].get[2]>|<[new_verts].get[1]>]> - define face_subdivisions:->:|<[new_verts].get[3]>|<[new_verts].get[2]>]> - define face_subdivisions:->:|<[new_verts].get[2]>|<[new_verts].get[3]>]> - define faces <[face_subdivisions]> - determine <[verts]>