class Mittsu::LatheGeometry

Public Class Methods

new(points, segments = 12, phi_start = 0.0, phi_length = (::Math::PI * 2.0)) click to toggle source
Calls superclass method Mittsu::Geometry::new
# File lib/mittsu/extras/geometries/lathe_geometry.rb, line 6
def initialize(points, segments = 12, phi_start = 0.0, phi_length = (::Math::PI * 2.0))
  super()

  @type = 'LatheGeometry'

  @parameters = {
    points:     points,
    segments:   segments,
    phi_start:  phi_start,
    phi_length: phi_length
  }

  inverse_point_length = 1.0 / (points.length.to_f - 1.0)
  inverse_segments = 1.0 / segments.to_f

  for i in 0..segments do
    phi = phi_start + i.to_f * inverse_segments * phi_length

    c = ::Math.cos(phi)
    s = ::Math.sin(phi)

    for j in 0...points.length do
      pt = points[j]

      vertex = Vector3.new

      vertex.x = c * pt.x
      vertex.y = pt.y
      vertex.z = s * pt.x

      @vertices << vertex
    end
  end

  np = points.length

  for i in 0...segments do
    for j in 0...(points.length - 1) do
      base = j + np * i
      a = base
      b = base + np
      c = base + 1 + np
      d = base + 1

      u0 = i.to_f * inverse_segments
      v0 = j.to_f * inverse_point_length
      u1 = u0 + inverse_segments
      v1 = v0 + inverse_point_length

      @faces << Face3.new(a, b, d)

      @face_vertex_uvs[0] << [
        Vector2.new(u0, v0),
        Vector2.new(u1, v0),
        Vector2.new(u0, v1)
      ]

      @faces << Face3.new(b, c, d)

      @face_vertex_uvs[0] << [
        Vector2.new(u1, v0),
        Vector2.new(u1, v1),
        Vector2.new(u0, v1)
      ]
    end
  end

  merge_vertices
  compute_face_normals
  compute_vertex_normals
end