class ObjParser::ObjParser

Constants

INDEXES_ID
NORMAL_LINE_ID
TEXTURE_LINE_ID
VERTEX_LINE_ID

Attributes

index_array_starting_at_index[RW]

Public Class Methods

new(index_array_starting_at = 0) click to toggle source
# File lib/obj_parser/obj_parser.rb, line 14
def initialize(index_array_starting_at = 0)
  self.index_array_starting_at_index = 1
end

Public Instance Methods

load(input_io) click to toggle source
# File lib/obj_parser/obj_parser.rb, line 18
def load(input_io)
  obj = Obj.new
  input_io.rewind
  while(line = input_io.gets)
    parser_for_line(line).call(line, obj)
  end
  obj
end

Private Instance Methods

parse_point_on_line(line, options = {}) click to toggle source
# File lib/obj_parser/obj_parser.rb, line 44
def parse_point_on_line(line, options = {})
  item_size = {:item_size => 3}.merge(options)[:item_size] 
  vertice_regex = "\s(.[^\s]*)" * item_size
  Point.new((line.scan(/#{vertice_regex}/).last || []))
end
parser_for_line(input_line) click to toggle source
# File lib/obj_parser/obj_parser.rb, line 29
def parser_for_line(input_line)
  {
    NORMAL_LINE_ID => Proc.new {|line, obj| obj.normals <<  parse_point_on_line(line, :item_size => 3)},
    TEXTURE_LINE_ID => Proc.new {|line, obj| obj.textures << parse_point_on_line(line, :item_size => 2)},
    VERTEX_LINE_ID => Proc.new {|line, obj| obj.vertice << parse_point_on_line(line, :item_size => 3)},
    INDEXES_ID => Proc.new { |line, obj|
          v_regex = line.include?("/") ? /\s(\d+).*?\s(\d+).*?\s(\d+)/ : /\s*(\d+)\s*(\d+)\s*(\d+)/
                          obj.vertice_indexes += (line.scan(v_regex).last || []).map{|index| index.to_i - self.index_array_starting_at_index}
                n_regex = line.include?("/") ? /\s\d*\/\d*\/(\d+)\s\d*\/\d*\/(\d+)\s\d*\/\d*\/(\d+)/ : /\s*(\d+)\s*(\d+)\s*(\d+)/
                          obj.normals_indexes += (line.scan(n_regex).last || []).map{|index| index.to_i - self.index_array_starting_at_index}
                t_regex = line.include?("/") ? /\s\d*\/(\d+)\/\d*\s\d*\/(\d+)\/\d*\s\d*\/(\d+)\/\d*/ : /nothing/
                          obj.textures_indexes += (line.scan(t_regex).last || []).map{|index| index.to_i - self.index_array_starting_at_index} }
  }[input_line[0..1].rstrip] || Proc.new{|line, obj| [] }
end