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