543
|
1 #!/usr/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 #
|
|
58 # to install this,
|
|
59 # cpan -i XML::LibXML::SAX::Generator
|
|
60 #
|
|
61 use XML::LibXML;
|
|
62
|
|
63 my $file = "SGList";
|
|
64 my $id = 0;
|
|
65 my @table;
|
|
66
|
|
67 ###################
|
|
68 # cretae SGList.h #
|
|
69 ###################
|
|
70
|
|
71 my $done = 0;
|
|
72
|
|
73 if ($ARGV[0]=~/-o/) {
|
|
74 shift;
|
|
75 $_ = shift;
|
|
76 s/\.(h|cc)$//;
|
|
77 $file = $_;
|
|
78 }
|
|
79
|
|
80 open(FH, ">$file.h");
|
|
81
|
|
82 print FH "#ifndef INCLUDED_SGLIST\n";
|
|
83 print FH "#define INCLUDED_SGLIST\n\n";
|
|
84
|
|
85 foreach (@ARGV) {
|
|
86 my $parser = XML::LibXML->new();
|
|
87 my $doc = $parser->parse_file($_);
|
|
88 my @nodes = $doc->findnodes('//surface');
|
|
89
|
|
90 print FH "/* $_ */\n";
|
|
91
|
|
92 foreach my $surface (@nodes) {
|
|
93 my $name = $surface->findvalue('@name');
|
|
94
|
|
95 $table[$id] = $name;
|
|
96
|
|
97 print FH "#define $name\t $id\n";
|
|
98 $id++;
|
|
99 }
|
|
100
|
|
101 print FH "\n";
|
|
102 }
|
|
103
|
|
104 print FH "/* Number of Scene */\n";
|
|
105 print FH "#define SGLIST_LENGTH $id\n\n";
|
|
106
|
|
107 print FH "/* Scene Table */\n";
|
544
|
108 print FH "extern const char *sglist_table[SGLIST_LENGTH+1];\n\n";
|
543
|
109 print FH "#endif\n";
|
|
110
|
|
111 close(FH);
|
|
112
|
|
113 #####################
|
|
114 # cretae SGList.cpp #
|
|
115 #####################
|
|
116 open(FH, ">$file.cc") or die "Error: Can't open file : $file.cc\n";
|
|
117
|
|
118 print FH "#include \"$file.h\"\n\n";
|
544
|
119 print FH "const char *sglist_table[SGLIST_LENGTH+1] = {\n";
|
543
|
120 print FH " \"";
|
|
121 print FH join("\", \"", @table);
|
544
|
122 print FH "\",0\n};\n";
|
543
|
123
|
|
124 close(FH);
|