comparison TaskManager/Test/test_render/tools/create_sglist.pl @ 196:ecda783a926f draft

add SceneGraphRoot, tools/create_sglist.pl
author gongo@gendarme.cr.ie.u-ryukyu.ac.jp
date Sun, 25 Jan 2009 17:46:37 +0900
parents
children efd7e4712342
comparison
equal deleted inserted replaced
195:4e66b3327c50 196:ecda783a926f
1 #!/opt/local/bin/perl
2
3 # TODO
4 # 同じ名前の SceneGraph が来た時の処理
5 # まあ Blender の時点でそうならないように書くべきなんだが
6
7 ####################################
8 #
9 # Create SceneGraph List
10 #
11 # SceneGraph が記載された xml ファイルを読み込み、
12 # 名前に対応するID列が記述された SGList.h を生成する。
13 # また、名前から ID を取得するために sglist_table を生成しておく。
14 # sglist_table は SGList.cpp に記述する
15 #
16 # xml に ID を入れれば table は要らないんだが、
17 # xml の読み込む順番、その時々に応じて使うものと使わないもので
18 # ID にズレが出てくるので、Blender からの出力時点では決定できない。
19 # このスクリプトで xml に上書きするって手もあるけど、微妙じゃない?
20 #
21 # xml ファイルは複数指定可能。
22 # 実際に使うやつ全て指定する感じでおk
23 #
24 # (例)
25 #
26 # % cat ../xml_file/universe.xml
27 #
28 # <?xml version="1.0"?>
29 # <OBJECT-3D>
30 # <surface name="Earth" size="5952" prim="Triangle" parent="NULL">
31 # (省略)
32 # </surface>
33 #
34 # <surface name="Moon" size="3312" prim="Triangle" parent="Earth">
35 # (省略)
36 # </surface>
37 # <OBJECT-3D>
38 #
39 # % ./create_sglist.pl ../xml_file/universe.xml
40 # % cat SGList.h
41 #
42 # /* ../xml_file/universe.xml */
43 # #define Earth 0
44 # #define Moon 1
45 #
46 # /* Number of Scene */
47 # #define SGLIST_LENGTH 2
48 #
49 # /* Scene Table */
50 # const char *sglist_table[SGLIST_LENGTH] = {
51 # "Earth", "Moon"
52 # };
53 #
54 ####################################
55
56 use strict;
57 use XML::LibXML;
58
59 my $outfile_h = "../SGList.h";
60 my $outfile_c = "../SGList.cpp";
61 my $id = 0;
62 my @table;
63
64 ###################
65 # cretae SGList.h #
66 ###################
67 open(FH, ">$outfile_h") || die "Error: Can't open file : $outfile_h\n";
68
69 print FH "#ifndef INCLUDE_SGLIST\n";
70 print FH "#define INCLUDE_SGLIST\n\n";
71
72 foreach (@ARGV) {
73 my $parser = XML::LibXML->new();
74 my $doc = $parser->parse_file($_);
75 my @nodes = $doc->findnodes('//surface');
76
77 print FH "/* $_ */\n";
78
79 foreach my $surface (@nodes) {
80 my $name = $surface->findvalue('@name');
81
82 $table[$id] = $name;
83
84 print FH "#define $name\t $id\n";
85 $id++;
86 }
87
88 print FH "\n";
89 }
90
91 print FH "/* Number of Scene */\n";
92 print FH "#define SGLIST_LENGTH $id\n\n";
93
94 print FH "/* Scene Table */\n";
95 print FH "extern const char *sglist_table[SGLIST_LENGTH];\n\n";
96 print FH "#endif\n";
97
98 close(FH);
99
100 #####################
101 # cretae SGList.cpp #
102 #####################
103 open(FH, ">$outfile_c") || die "Error: Can't open file : $outfile_c\n";
104
105 print FH "#include \"SGList.h\"\n\n";
106 print FH "const char *sglist_table[SGLIST_LENGTH] = {\n";
107 print FH " \"";
108 print FH join("\", \"", @table);
109 print FH "\"\n};\n";
110
111 close(FH);