diff Renderer/test_render/tools/create_sglist.pl @ 283:15bfacccde99 draft

fix test_render
author e065746@localhost.localdomain
date Fri, 05 Jun 2009 16:49:12 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Renderer/test_render/tools/create_sglist.pl	Fri Jun 05 16:49:12 2009 +0900
@@ -0,0 +1,111 @@
+#!/usr/bin/perl
+
+# TODO
+#   同じ名前の SceneGraph が来た時の処理
+#   まあ Blender の時点でそうならないように書くべきなんだが
+
+####################################
+#
+# Create SceneGraph List
+# 
+# SceneGraph が記載された xml ファイルを読み込み、
+# 名前に対応するID列が記述された SGList.h を生成する。
+# また、名前から ID を取得するために sglist_table を生成しておく。
+# sglist_table は SGList.cpp に記述する
+#
+# xml に ID を入れれば table は要らないんだが、
+# xml の読み込む順番、その時々に応じて使うものと使わないもので
+# ID にズレが出てくるので、Blender からの出力時点では決定できない。
+# このスクリプトで xml に上書きするって手もあるけど、微妙じゃない?
+# 
+# xml ファイルは複数指定可能。
+# 実際に使うやつ全て指定する感じでおk
+# 
+# (例)
+# 
+# % cat ../xml_file/universe.xml
+# 
+# <?xml version="1.0"?>
+# <OBJECT-3D>
+#     <surface name="Earth" size="5952" prim="Triangle" parent="NULL">
+#        (省略)
+#     </surface>
+# 
+#     <surface name="Moon" size="3312" prim="Triangle" parent="Earth">
+#        (省略)
+#     </surface>
+# <OBJECT-3D>
+# 
+# % ./create_sglist.pl ../xml_file/universe.xml
+# % cat SGList.h
+# 
+# /* ../xml_file/universe.xml */
+# #define Earth 0
+# #define Moon 1
+# 
+# /* Number of Scene */
+# #define SGLIST_LENGTH 2
+# 
+# /* Scene Table */
+# const char *sglist_table[SGLIST_LENGTH] = {
+#     "Earth", "Moon"
+# };
+# 
+####################################
+
+use strict;
+use XML::LibXML;
+
+my $outfile_h = "../SGList.h";
+my $outfile_c = "../SGList.cpp";
+my $id = 0;
+my @table;
+
+###################
+# cretae SGList.h #
+###################
+open(FH, ">$outfile_h") || die "Error: Can't open file : $outfile_h\n";
+
+print FH "#ifndef INCLUDED_SGLIST\n";
+print FH "#define INCLUDED_SGLIST\n\n";
+
+foreach (@ARGV) {
+    my $parser = XML::LibXML->new();
+    my $doc = $parser->parse_file($_);
+    my @nodes = $doc->findnodes('//surface');
+
+    print FH "/* $_ */\n";
+
+    foreach my $surface (@nodes) {
+	my $name = $surface->findvalue('@name');
+
+	$table[$id] = $name;
+
+	print FH "#define $name\t $id\n";
+	$id++;
+    }
+
+    print FH "\n";
+}
+
+print FH "/* Number of Scene */\n";
+print FH "#define SGLIST_LENGTH $id\n\n";
+
+print FH "/* Scene Table */\n";
+print FH "extern const char *sglist_table[SGLIST_LENGTH];\n\n";
+print FH "#endif\n";
+
+close(FH);
+
+#####################
+# cretae SGList.cpp #
+#####################
+open(FH, ">$outfile_c") || die "Error: Can't open file : $outfile_c\n";
+
+print FH "#include \"SGList.h\"\n\n";
+print FH "const char *sglist_table[SGLIST_LENGTH] = {\n";
+print FH "    \"";
+print FH join("\", \"", @table);
+print FH "\"\n};\n";
+
+close(FH);