70 lines
1.6 KiB
Ruby
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)
|