54 lines
1.4 KiB
Ruby
54 lines
1.4 KiB
Ruby
#!/usr/bin/env ruby
|
|
|
|
require "erb"
|
|
|
|
TEMPLATE = <<EOF
|
|
float[2][] vertices = [
|
|
<%= vertices.map {|v| v[0, 2].inspect}.join(",\n ") %>
|
|
];
|
|
<% 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)
|