import geometry
import depth_core
+import model_dimensions
# Simple flat mesh, sits on the axes X and Z, normal on Y
class Plane
# TODO allow for complex rotation, either at creation or in Actor
+ # Modifier to `texture_coords` to repeat the texture on the X axis
+ #
+ # At 1.0, the texture is stretched to cover the whole plane.
+ # If greater than 1.0, the texture is repeated.
+ #
+ # This value must be set before using `texture_coords` or drawing this plane.
+ var repeat_x = 1.0 is writable
+
+ # Modifier to `texture_coords` to repeat the texture on the Y axis
+ #
+ # At 1.0, the texture is stretched to cover the whole plane.
+ # If greater than 1.0, the texture is repeated.
+ #
+ # This value must be set before using `texture_coords` or drawing this plane.
+ var repeat_y = 1.0 is writable
+
redef var vertices is lazy do
var a = [-0.5, 0.0, -0.5]
var b = [ 0.5, 0.0, -0.5]
redef var texture_coords: Array[Float] is lazy do
var offset_left = 0.0
var offset_top = 0.0
- var offset_right = 1.0
- var offset_bottom = 1.0
+ var offset_right = 1.0*repeat_x
+ var offset_bottom = 1.0*repeat_y
var a = [offset_left, offset_bottom]
var b = [offset_right, offset_bottom]
var c = [offset_left, offset_top]
return normals
end
+ redef var texture_coords: Array[Float] is lazy do
+ var a = [0.0, 1.0]
+ var b = [1.0, 1.0]
+ var c = [0.0, 0.0]
+ var d = [1.0, 0.0]
+
+ var texture_coords = new Array[Float]
+ var face = [a, c, d, a, d, b]
+ for i in 6.times do for v in face do texture_coords.add_all v
+ return texture_coords
+ end
+
redef var center = new Point3d[Float](0.0, 0.0, 0.0) is lazy
end
+
+# Sphere with `radius` and a number of faces set by `n_meridians` and `n_parallels`
+class UVSphere
+ super Mesh
+
+ # Distance between the center and the vertices
+ var radius: Float
+
+ # Number of vertices on a full circle around the Z axis
+ var n_meridians: Int
+
+ # Number of vertices on an arc between both poles
+ var n_parallels: Int
+
+ init
+ do
+ var w = n_meridians
+ var h = n_parallels
+
+ var vertices = new Array[Float].with_capacity(w*h*3)
+ self.vertices = vertices
+
+ var texture_coords = new Array[Float].with_capacity(w*h*2)
+ self.texture_coords = texture_coords
+
+ var normals = new Array[Float].with_capacity(w*h*3)
+ self.normals = normals
+
+ # Build vertices
+ for m in [0..w[ do
+ for p in [0..h[ do
+ var u = m.to_f * 2.0 * pi / (w-1).to_f
+ var v = p.to_f * pi / (h-1).to_f
+
+ vertices.add radius * u.cos * v.sin
+ vertices.add radius * v.cos
+ vertices.add radius * u.sin * v.sin
+
+ texture_coords.add (1.0 - m.to_f/(w-1).to_f)
+ texture_coords.add(p.to_f/(h-1).to_f)
+
+ normals.add u.cos * v.sin
+ normals.add v.cos
+ normals.add u.sin * v.sin
+ end
+ end
+
+ # Build faces
+ var indices = new Array[Int].with_capacity((w-1)*(h-1)*6)
+ self.indices = indices
+ for m in [0..w-1[ do
+ for p in [0..h-1[ do
+ var a = m*h + p
+
+ indices.add a
+ indices.add a+h
+ indices.add a+1
+
+ indices.add a+h
+ indices.add a+h+1
+ indices.add a+1
+ end
+ end
+ end
+end