Mercurial > hg > Game > Cerium
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);