package Ġutils Ċ Ċ import Ġcore . Assembler Ċ import Ġcore . Mesh Ċ import Ġmath . Matrix 4 Ċ import Ġmath . Scalar Ċ import Ġmath . Vector 3 Ċ Ċ object ĠPrimitive Factory Ġ{ ĊĊĠĠĠ Ġfun Ġcreate Cube ( size : ĠFloat ): ĠMesh Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġassembler Ġ= ĠAs sembler () ĊĊĠĠĠĠĠĠĠ Ġval Ġhalf Size Ġ= Ġsize Ġ/ Ġ 2 F ĊĊĠĠĠĠĠĠĠ Ġassembler . add Vertex (- half Size , Ġhalf Size , Ġ- half Size ) ĊĠĠĠĠĠĠĠ Ġassembler . add Vertex ( half Size , Ġhalf Size , Ġ- half Size ) ĊĠĠĠĠĠĠĠ Ġassembler . add Vertex ( half Size , Ġ- half Size , Ġ- half Size ) ĊĠĠĠĠĠĠĠ Ġassembler . add Vertex (- half Size , Ġ- half Size , Ġ- half Size ) ĊĠĠĠĠĠĠĠ Ġassembler . add Vertex ( half Size , Ġhalf Size , Ġhalf Size ) ĊĠĠĠĠĠĠĠ Ġassembler . add Vertex (- half Size , Ġhalf Size , Ġhalf Size ) ĊĠĠĠĠĠĠĠ Ġassembler . add Vertex (- half Size , Ġ- half Size , Ġhalf Size ) ĊĠĠĠĠĠĠĠ Ġassembler . add Vertex ( half Size , Ġ- half Size , Ġhalf Size ) ĊĊĠĠĠĠĠĠĠ Ġassembler . add Normal ( 0 . 0 F , Ġ 0 . 0 F , Ġ- 1 . 0 F ) ĊĠĠĠĠĠĠĠ Ġassembler . add Normal ( 1 . 0 F , Ġ 0 . 0 F , Ġ 0 . 0 F ) ĊĠĠĠĠĠĠĠ Ġassembler . add Normal ( 0 . 0 F , Ġ 0 . 0 F , Ġ 1 . 0 F ) ĊĠĠĠĠĠĠĠ Ġassembler . add Normal (- 1 . 0 F , Ġ 0 . 0 F , Ġ 0 . 0 F ) ĊĠĠĠĠĠĠĠ Ġassembler . add Normal ( 0 . 0 F , Ġ 1 . 0 F , Ġ 0 . 0 F ) ĊĠĠĠĠĠĠĠ Ġassembler . add Normal ( 0 . 0 F , Ġ- 1 . 0 F , Ġ 0 . 0 F ) ĊĊĠĠĠĠĠĠĠ Ġassembler . add Texture Coordinate ( 0 . 0 F , Ġ 0 . 0 F ) ĊĠĠĠĠĠĠĠ Ġassembler . add Texture Coordinate ( 1 . 0 F , Ġ 0 . 0 F ) ĊĠĠĠĠĠĠĠ Ġassembler . add Texture Coordinate ( 1 . 0 F , Ġ 1 . 0 F ) ĊĠĠĠĠĠĠĠ Ġassembler . add Texture Coordinate ( 0 . 0 F , Ġ 1 . 0 F ) ĊĊĠĠĠĠĠĠĠ Ġassembler . add Face ( int ArrayOf ( 0 , Ġ 1 , Ġ 2 ), Ġint ArrayOf ( 0 , Ġ 0 , Ġ 0 ), Ġint ArrayOf ( 0 , Ġ 1 , Ġ 2 )) ĊĠĠĠĠĠĠĠ Ġassembler . add Face ( int ArrayOf ( 2 , Ġ 3 , Ġ 0 ), Ġint ArrayOf ( 0 , Ġ 0 , Ġ 0 ), Ġint ArrayOf ( 2 , Ġ 3 , Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġassembler . add Face ( int ArrayOf ( 1 , Ġ 4 , Ġ 7 ), Ġint ArrayOf ( 1 , Ġ 1 , Ġ 1 ), Ġint ArrayOf ( 0 , Ġ 1 , Ġ 2 )) ĊĠĠĠĠĠĠĠ Ġassembler . add Face ( int ArrayOf ( 7 , Ġ 2 , Ġ 1 ), Ġint ArrayOf ( 1 , Ġ 1 , Ġ 1 ), Ġint ArrayOf ( 2 , Ġ 3 , Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġassembler . add Face ( int ArrayOf ( 4 , Ġ 5 , Ġ 6 ), Ġint ArrayOf ( 2 , Ġ 2 , Ġ 2 ), Ġint ArrayOf ( 0 , Ġ 1 , Ġ 2 )) ĊĠĠĠĠĠĠĠ Ġassembler . add Face ( int ArrayOf ( 6 , Ġ 7 , Ġ 4 ), Ġint ArrayOf ( 2 , Ġ 2 , Ġ 2 ), Ġint ArrayOf ( 2 , Ġ 3 , Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġassembler . add Face ( int ArrayOf ( 0 , Ġ 3 , Ġ 6 ), Ġint ArrayOf ( 3 , Ġ 3 , Ġ 3 ), Ġint ArrayOf ( 0 , Ġ 1 , Ġ 2 )) ĊĠĠĠĠĠĠĠ Ġassembler . add Face ( int ArrayOf ( 6 , Ġ 5 , Ġ 0 ), Ġint ArrayOf ( 3 , Ġ 3 , Ġ 3 ), Ġint ArrayOf ( 2 , Ġ 3 , Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġassembler . add Face ( int ArrayOf ( 0 , Ġ 5 , Ġ 4 ), Ġint ArrayOf ( 4 , Ġ 4 , Ġ 4 ), Ġint ArrayOf ( 0 , Ġ 1 , Ġ 2 )) ĊĠĠĠĠĠĠĠ Ġassembler . add Face ( int ArrayOf ( 4 , Ġ 1 , Ġ 0 ), Ġint ArrayOf ( 4 , Ġ 4 , Ġ 4 ), Ġint ArrayOf ( 2 , Ġ 3 , Ġ 0 )) ĊĠĠĠĠĠĠĠ Ġassembler . add Face ( int ArrayOf ( 3 , Ġ 2 , Ġ 7 ), Ġint ArrayOf ( 5 , Ġ 5 , Ġ 5 ), Ġint ArrayOf ( 0 , Ġ 1 , Ġ 2 )) ĊĠĠĠĠĠĠĠ Ġassembler . add Face ( int ArrayOf ( 7 , Ġ 6 , Ġ 3 ), Ġint ArrayOf ( 5 , Ġ 5 , Ġ 5 ), Ġint ArrayOf ( 2 , Ġ 3 , Ġ 0 )) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġassembler . compile (). meshes [ 0 ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Sphere ( radius : ĠFloat , Ġstacks : ĠInt , Ġslices : ĠInt ): ĠMesh Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġassembler Ġ= ĠAs sembler () ĊĊĠĠĠĠĠĠĠ Ġval Ġstack Angle Ġ= ĠScalar . PI Ġ/ Ġstacks ĊĠĠĠĠĠĠĠ Ġval Ġslice Angle Ġ= ĠScalar . PI Ġ/ Ġslices Ġ* Ġ 2 . 0 F ĊĊĠĠĠĠĠĠĠ Ġval Ġcurve Ġ= Ġmutable ListOf < Vector 3 >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( stack Ġin Ġ 0 .. stacks ) Ġcurve . add ( Matrix 4 . create Rotation Z ( stack Angle Ġ* Ġstack ) Ġ* ĠVector 3 ( 0 . 0 F , Ġ 1 . 0 F , Ġ 0 . 0 F )) ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( slice Ġin Ġ 0 .. slices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġabout Y Ġ= ĠMatrix 4 . create Rotation Y ( slice Angle Ġ* Ġslice ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( v , Ġpoint ) Ġin Ġcurve . with Index ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvertex Ġ= Ġabout Y Ġ* Ġpoint ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassembler . add Vertex ( vertex . x Ġ* Ġradius , Ġvertex . y Ġ* Ġradius , Ġvertex . z Ġ* Ġradius ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassembler . add Normal ( vertex . x , Ġvertex . y , Ġvertex . z ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassembler . add Texture Coordinate ( slice Ġ/ Ġslices . toFloat (), Ġv Ġ/ Ġcurve . size . toFloat ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( slice Ġin Ġ 0 Ġuntil Ġslices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt index Ġ= Ġslice Ġ* Ġ( stacks Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( stack Ġin Ġ 0 Ġuntil Ġstacks ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġma Ġ= Ġstack Ġ+ Ġt index ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmb Ġ= Ġstack Ġ+ Ġt index Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmc Ġ= Ġstack Ġ+ Ġt index Ġ+ Ġ( stacks Ġ+ Ġ 1 ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmd Ġ= Ġstack Ġ+ Ġt index Ġ+ Ġ( stacks Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassembler . add Face ( int ArrayOf ( md , Ġma , Ġmb ), Ġint ArrayOf ( md , Ġma , Ġmb ), Ġint ArrayOf ( md , Ġma , Ġmb )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassembler . add Face ( int ArrayOf ( mb , Ġmc , Ġmd ), Ġint ArrayOf ( mb , Ġmc , Ġmd ), Ġint ArrayOf ( mb , Ġmc , Ġmd )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġassembler . compile (). meshes [ 0 ] ĊĠĠĠ Ġ} Ċ } Ċ