gss/obj2d.rb
2013-11-20 23:54:15 -05:00

70 lines
1.6 KiB
Ruby

#!/usr/bin/env ruby
require "erb"
TEMPLATE = <<EOF
struct indices_range_t
{
int start;
int length;
};
float[<%= vertices.size %>] vertices = [
<% vertices.each do |coord| -%>
<%= coord %>,
<% end -%>
];
ushort[<%= indices.size %>] indices = [
<% indices.each do |index| -%>
<%= index %>,
<% end -%>
];
<% object_ranges.each_pair do |obj_name, obj_ranges| -%>
indices_range_t[] <%= obj_name %> = [
<% obj_ranges.each do |obj_range| -%>
{<%= obj_range[0] %>, <%= obj_range[1] %>},
<% end -%>
];
<% end -%>
EOF
def main(obj_fname, d_fname)
objects = {}
object_ranges = {}
vertices = []
indices = []
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
vertices.flatten!
objects.each_pair do |obj_name, obj_array|
object_ranges[obj_name] = obj_array.map do |obj_indices|
obj_indices.flatten!
base_index = indices.size
indices += obj_indices
[base_index, obj_indices.size]
end
end
File.open(d_fname, "w") do |fh|
fh.puts ERB.new(TEMPLATE, nil, "<>-").result(binding)
end
end
main(*ARGV)