class Mittsu::OBJLoader

Constants

FACE_PATTERN
FACE_V_PATTERN
FACE_V_VN_PATTERN
FACE_V_VT_PATTERN
FACE_V_VT_VN_PATTERN
FLOAT
GROUP_PATTERN
LOAD_MTL_PATTERN
NORMAL_PATTERN
OBJECT_PATTERN
SMOOTH_GROUP_PATTERN
USE_MTL_PATTERN
UV_PATTERN
VERTEX_PATTERN

Public Class Methods

new(manager = DefaultLoadingManager) click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 24
def initialize(manager = DefaultLoadingManager)
  @manager = manager
  @object = nil
  @mesh = nil
  @material = nil
  @_listeners = {}
end

Public Instance Methods

load(url) click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 32
def load(url)
  loader = FileLoader.new(@manager)

  text = loader.load(url)
  parse(text)
end
parse(data) click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 39
def parse(data)
  init_parsing
  relevant_lines(data).each { |line| parse_line(line) }
  end_object
  @group
end

Private Instance Methods

add_face(a, b, c, normal_inds = nil) click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 167
def add_face(a, b, c, normal_inds = nil)
  if normal_inds.nil?
    @geometry.faces << face3(
      a.to_i - (@face_offset + 1),
      b.to_i - (@face_offset + 1),
      c.to_i - (@face_offset + 1)
    )
  else
    @geometry.faces << face3(
      a.to_i - (@face_offset + 1),
      b.to_i - (@face_offset + 1),
      c.to_i - (@face_offset + 1),
      normal_inds.take(3).map { |i| @normals[i.to_i - 1].clone }
    )
  end
end
add_uvs(a, b, c) click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 184
def add_uvs(a, b, c)
  @geometry.face_vertex_uvs[0] << [
    @uvs[a.to_i - 1].clone,
    @uvs[b.to_i - 1].clone,
    @uvs[c.to_i - 1].clone
  ]
end
end_mesh() click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 136
def end_mesh
  return if @mesh.nil? || @vertices.empty?
  @geometry.vertices = @vertices

  @geometry.merge_vertices
  @geometry.compute_face_normals
  @geometry.compute_bounding_sphere

  @object.add(@mesh)
  @mesh = nil
end
end_object() click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 120
def end_object
  return if @object.nil?
  end_mesh
  @group.add(@object)
  @object = nil
end
face3(a, b, c, normals = nil) click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 87
def face3(a, b, c, normals = nil)
  Face3.new(a, b, c, normals)
end
handle_face(faces, uvs = [], normal_inds = []) click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 200
def handle_face(faces, uvs = [], normal_inds = [])
  new_mesh if @mesh.nil?
  if faces[3].nil?
    handle_triangle(faces, uvs, normal_inds)
  else
    handle_quad(faces, uvs, normal_inds)
  end
end
handle_normal(x, y, z) click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 159
def handle_normal(x, y, z)
  @normals << Vector3.new(x, y, z)
end
handle_object(object_name = '') click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 108
def handle_object(object_name = '')
  # Reset if we're already working on a named object
  # otherwise, just name the one we have in progress
  unless @object&.name.nil?
    end_object
    reset_vertices
    @object = nil
  end
  @object ||= Object3D.new
  @object.name = object_name
end
handle_quad(faces, uvs, normal_inds) click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 209
def handle_quad(faces, uvs, normal_inds)
  handle_quad_triangle(faces, uvs, normal_inds, [0, 1, 3])
  handle_quad_triangle(faces, uvs, normal_inds, [1, 2, 3])
end
handle_quad_triangle(faces, uvs, normal_inds, tri_inds) click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 214
def handle_quad_triangle(faces, uvs, normal_inds, tri_inds)
  handle_triangle(
    faces.values_at(*tri_inds).compact,
    uvs.values_at(*tri_inds).compact,
    normal_inds.values_at(*tri_inds).compact
  )
end
handle_triangle(faces, uvs, normal_inds) click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 192
def handle_triangle(faces, uvs, normal_inds)
  add_face(faces[0], faces[1], faces[2], normal_inds)

  if !uvs.nil? && !uvs.empty?
    add_uvs(uvs[0], uvs[1], uvs[2])
  end
end
handle_uv(u, v) click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 163
def handle_uv(u, v)
  @uvs << Vector2.new(u, v)
end
handle_vertex(x, y, z) click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 155
def handle_vertex(x, y, z)
  @vertices << Vector3.new(x, y, z)
end
init_parsing() click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 91
def init_parsing
  @face_offset = 0
  @group = Group.new
  @vertices = []
  @normals = []
  @uvs = []
end
new_mesh() click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 127
def new_mesh
  end_mesh
  handle_object if @object.nil?
  @geometry = Geometry.new
  @mesh = Mesh.new(@geometry, @material || MeshLambertMaterial.new)
  @mesh.name = @object.name
  @mesh.name += " #{@material.name}" unless @material.nil?
end
parse_face(line) click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 66
def parse_face(line)
  case line
  when FACE_V_PATTERN       then handle_face(
    [$1, $2, $3, $4])   #face
                        #(uv)
                        #(normal)
  when FACE_V_VT_PATTERN    then handle_face(
    [$1, $3, $5, $7],   #face
    [$2, $4, $6, $8])   #uv
                        #(normal)
  when FACE_V_VN_PATTERN    then handle_face(
    [$1, $3, $5, $7 ],  #face
    [],                 #(uv)
    [$2, $4, $6, $8 ])  #normal
  when FACE_V_VT_VN_PATTERN then handle_face(
    [$1, $4, $7, $10],  #face
    [$2, $5, $8, $11],  #uv
    [$3, $6, $9, $12])  #normal
  end
end
parse_line(line) click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 48
def parse_line(line)
  case line
  when VERTEX_PATTERN       then handle_vertex($1.to_f, $2.to_f, $3.to_f)
  when NORMAL_PATTERN       then handle_normal($1.to_f, $2.to_f, $3.to_f)
  when UV_PATTERN           then handle_uv($1.to_f, $2.to_f)

  when FACE_PATTERN         then parse_face(line)

  when OBJECT_PATTERN       then handle_object($1)
  when GROUP_PATTERN        # ignore
  when SMOOTH_GROUP_PATTERN # ignore

  when USE_MTL_PATTERN      then set_material($1)
  when LOAD_MTL_PATTERN     # TODO
  else                      raise "Mittsu::OBJMTLLoader: Unhandled line #{line}"
  end
end
relevant_lines(raw_lines) click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 104
def relevant_lines(raw_lines)
  raw_lines.split("\n").map(&:strip).reject(&:empty?).reject{|l| l.start_with? '#'}
end
reset_vertices() click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 99
def reset_vertices
  @face_offset = @face_offset + @vertices.length
  @vertices = []
end
set_material(material_name) click to toggle source
# File lib/mittsu/loaders/obj_loader.rb, line 148
def set_material(material_name)
  end_mesh

  @material = MeshLambertMaterial.new
  @material.name = material_name
end