gamnit: extract Cuboid as super class to cube and intro Boxed3d::to_mesh
authorAlexis Laferrière <alexis.laf@xymus.net>
Sat, 20 May 2017 17:50:13 +0000 (10:50 -0700)
committerAlexis Laferrière <alexis.laf@xymus.net>
Wed, 31 May 2017 14:59:53 +0000 (10:59 -0400)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

lib/gamnit/depth/more_meshes.nit

index 0a4d53c..e316b89 100644 (file)
@@ -79,22 +79,31 @@ class Plane
        # TODO use gl_TRIANGLE_FAN instead
 end
 
-# Cube, with 6 faces
+# Cuboid, or rectangular prism, with 6 faces and right angles
 #
-# Occupies `[-0.5..0.5]` on all three axes.
-class Cube
+# Can be created from a `Boxed3d` using `to_mesh`.
+class Cuboid
        super Mesh
 
+       # Width, on the X axis
+       var width: Float
+
+       # Height, on the Y axis
+       var height: Float
+
+       # Depth, on the Z axis
+       var depth: Float
+
        redef var vertices is lazy do
-               var a = [-0.5, -0.5, -0.5]
-               var b = [ 0.5, -0.5, -0.5]
-               var c = [-0.5,  0.5, -0.5]
-               var d = [ 0.5,  0.5, -0.5]
+               var a = [-0.5*width, -0.5*height, -0.5*depth]
+               var b = [ 0.5*width, -0.5*height, -0.5*depth]
+               var c = [-0.5*width,  0.5*height, -0.5*depth]
+               var d = [ 0.5*width,  0.5*height, -0.5*depth]
 
-               var e = [-0.5, -0.5,  0.5]
-               var f = [ 0.5, -0.5,  0.5]
-               var g = [-0.5,  0.5,  0.5]
-               var h = [ 0.5,  0.5,  0.5]
+               var e = [-0.5*width, -0.5*height,  0.5*depth]
+               var f = [ 0.5*width, -0.5*height,  0.5*depth]
+               var g = [-0.5*width,  0.5*height,  0.5*depth]
+               var h = [ 0.5*width,  0.5*height,  0.5*depth]
 
                var vertices = new Array[Float]
                for v in [a, c, d, a, d, b, # front
@@ -135,6 +144,35 @@ class Cube
        redef var center = new Point3d[Float](0.0, 0.0, 0.0) is lazy
 end
 
+# Cube, with 6 faces, edges of equal length and square angles
+#
+# Occupies `[-0.5..0.5]` on all three axes.
+class Cube
+       super Cuboid
+
+       noautoinit
+
+       init
+       do
+               width = 1.0
+               height = 1.0
+               depth = 1.0
+       end
+end
+
+redef class Boxed3d[N]
+       # Create a `Cuboid` mesh with the dimension of `self`
+       #
+       # Does not use the position of `self`, but it can be given to an `Actor`.
+       fun to_mesh: Cuboid
+       do
+               var width = right.to_f-left.to_f
+               var height = top.to_f-bottom.to_f
+               var depth = front.to_f-back.to_f
+               return new Cuboid(width, height, depth)
+       end
+end
+
 # Sphere with `radius` and a number of faces set by `n_meridians` and `n_parallels`
 class UVSphere
        super Mesh