#!/usr/bin/env ruby require "erb" TEMPLATE = < ]; <% objects.each_pair do |obj_name, obj_array| %> <% obj_array.each_with_index do |oa, index| %> ushort[<%= oa.size * oa.first.size %>] <%= obj_name %>_<%= index %> = [ <%= oa.map {|indices| indices.join(", ")}.join(",\n ") %> ]; <% end %> ushort[][] get_<%= obj_name %>() { return [ <% obj_array.each_with_index do |oa, index| -%> <%= obj_name %>_<%= index %>, <% end -%> ]; } <% end %> EOF def main(obj_fname, d_fname) objects = {} vertices = [] cur_obj = nil File.read(obj_fname).each_line do |line| if line =~ /^v\s+(\S+)\s+(\S+)/ vertices << [$1.to_f, $2.to_f] elsif line =~ /^o\s+(..)-(\d+)/ obj_class, obj_class_index = $1, $2.to_i objects[obj_class] ||= [] objects[obj_class][obj_class_index] ||= [] cur_obj = objects[obj_class][obj_class_index] elsif line =~ /^o\s+(.*)/ raise "Do not know how to handle object #{$1.inspect}" elsif line =~ /^f\s+(\d+)\s+(\d+)\s+(\d+)/ cur_obj << [$1, $2, $3].map {|v| v.to_i - 1} elsif line =~ /^l\s+(\d+)\s+(\d+)/ cur_obj << [$1, $2].map {|v| v.to_i - 1} end end File.open(d_fname, "w") do |fh| fh.puts ERB.new(TEMPLATE, nil, "<>-").result(binding) end end main(*ARGV)