using Forever.Stars.NScene; namespace Forever { module Forever { Cube(size : float * float * float) : list [NObject.Triangle] { def (x, y, z) = ( size[0] / 2.0f, size[1] / 2.0f, size[2] / 2.0f ); [ // Back NObject.Triangle( NObject.Point((-x, -y, -z)), NObject.Point((+x, -y, -z)), NObject.Point((+x, +y, -z)) ), NObject.Triangle( NObject.Point((+x, +y, -z)), NObject.Point((-x, +y, -z)), NObject.Point((-x, -y, -z)) ), // Front NObject.Triangle( NObject.Point((-x, -y, +z)), NObject.Point((+x, -y, +z)), NObject.Point((+x, +y, +z)) ), NObject.Triangle( NObject.Point((+x, +y, +z)), NObject.Point((-x, +y, +z)), NObject.Point((-x, -y, +z)) ), // Top NObject.Triangle( NObject.Point((-x, -y, -z)), NObject.Point((-x, -y, +z)), NObject.Point((+x, -y, +z)) ), NObject.Triangle( NObject.Point((+x, -y, +z)), NObject.Point((+x, -y, -z)), NObject.Point((-x, -y, -z)) ), // Bottom NObject.Triangle( NObject.Point((-x, +y, -z)), NObject.Point((-x, +y, +z)), NObject.Point((+x, +y, +z)) ), NObject.Triangle( NObject.Point((+x, +y, +z)), NObject.Point((+x, +y, -z)), NObject.Point((-x, +y, -z)) ), // Left NObject.Triangle( NObject.Point((-x, -y, -z)), NObject.Point((-x, -y, +z)), NObject.Point((-x, +y, +z)) ), NObject.Triangle( NObject.Point((-x, +y, +z)), NObject.Point((-x, +y, -z)), NObject.Point((-x, -y, -z)) ), // Right NObject.Triangle( NObject.Point((+x, -y, -z)), NObject.Point((+x, -y, +z)), NObject.Point((+x, +y, +z)) ), NObject.Triangle( NObject.Point((+x, +y, +z)), NObject.Point((+x, +y, -z)), NObject.Point((+x, -y, -z)) ), ] } public Main() : void { def unit = 1.0f; def group = NObject.Group( [ NObject.Transform( Center=(0.0f, 0.0f, 0.0f), Rotation=(0.0f, 0.5f, 0.2f, 0.7f), Scale=(10.0f, 10.0f, 10.0f), Object=NObject.Mesh( Color=(1.0f, 1.0f, 1.0f, 1.0f), Triangles=Cube(1.0f, 1.0f, 1.0f) ) ) ], Callback=fun(obj : NObject) : NObject { | Transform(center, rotation, scale, obj) => NObject.Transform( center, ( (rotation[0] + unit) % 360.0f, rotation[1], rotation[2], rotation[3] ), scale, obj ) | obj => obj } ); def backend = OpenGL( NObject.Scene( group ) ); backend.Setup(500, 500); backend.RenderScene(); } } }