]> git.mxchange.org Git - simgear.git/blob - simgear/io/decode_binobj.cxx
Patch from Melchior Franz:
[simgear.git] / simgear / io / decode_binobj.cxx
1 #include <simgear/compiler.h>
2
3 #include <unistd.h>
4 #include STL_IOSTREAM
5
6 #if !defined(SG_HAVE_NATIVE_SGI_COMPILERS)
7 SG_USING_STD(cout);
8 SG_USING_STD(endl);
9 #endif
10
11 #include "sg_binobj.hxx"
12
13
14 int main( int argc, char **argv ) {
15     int i, j;
16
17     // check usage
18     if ( argc != 2 ) {
19         cout << "Usage: " << argv[0] << " binary_obj_file" << endl;
20     }
21
22     SGBinObject obj;
23     bool result = obj.read_bin( argv[1] );
24     if ( !result ) {
25         cout << "error loading: " << argv[1] << endl;
26         exit(-1);
27     }
28
29     cout << "# FGFS Scenery" << endl;
30     cout << "# Version " << obj.get_version() << endl;
31     cout << endl;
32
33     printf("# gbs %.5f %.5f %.5f %.2f\n", obj.get_gbs_center().x(), 
34            obj.get_gbs_center().y(), obj.get_gbs_center().z(),
35            obj.get_gbs_radius());
36     cout << endl;
37
38     point_list nodes = obj.get_wgs84_nodes();
39     cout << "# vertex list" << endl;
40     for ( i = 0; i < (int)nodes.size(); ++i ) {
41         printf("v %.5f %.5f %.5f\n", nodes[i].x(), nodes[i].y(), nodes[i].z() );
42     }
43     cout << endl;
44
45     point_list normals = obj.get_normals();
46     cout << "# vertex normal list" << endl;
47     for ( i = 0; i < (int)normals.size(); ++i ) {
48         printf("vn %.5f %.5f %.5f\n",
49                normals[i].x(), normals[i].y(), normals[i].z() );
50     }
51     cout << endl;
52
53     point_list texcoords = obj.get_texcoords();
54     cout << "# texture coordinate list" << endl;
55     for ( i = 0; i < (int)texcoords.size(); ++i ) {
56         printf("vt %.5f %.5f\n",
57                texcoords[i].x(), texcoords[i].y() );
58     }
59     cout << endl;
60
61     cout << "# geometry groups" << endl;
62     cout << endl;
63
64     string material;
65     int_list vertex_index;
66     int_list normal_index;
67     int_list tex_index;
68
69     // generate points
70     string_list pt_materials = obj.get_pt_materials();
71     group_list pts_v = obj.get_pts_v();
72     group_list pts_n = obj.get_pts_n();
73     for ( i = 0; i < (int)pts_v.size(); ++i ) {
74         material = pt_materials[i];
75         vertex_index = pts_v[i];
76         normal_index = pts_n[i];
77         cout << "# usemtl " << material << endl;
78         cout << "pt ";
79         for ( j = 0; j < (int)vertex_index.size(); ++j ) {
80             cout << vertex_index[j] << "/" << normal_index[j] << " ";
81         }
82         cout << endl;
83     }
84
85     // generate triangles
86     string_list tri_materials = obj.get_tri_materials();
87     group_list tris_v = obj.get_tris_v();
88     group_list tris_n = obj.get_tris_n();
89     group_list tris_tc = obj.get_tris_tc();
90     for ( i = 0; i < (int)tris_v.size(); ++i ) {
91         material = tri_materials[i];
92         vertex_index = tris_v[i];
93         normal_index = tris_n[i];
94         tex_index = tris_tc[i];
95         cout << "# usemtl " << material << endl;
96         cout << "f ";
97         for ( j = 0; j < (int)vertex_index.size(); ++j ) {
98             cout << vertex_index[j];
99             if ( normal_index.size() ) {
100                 cout << "/" << normal_index[j];
101             }
102             cout << "/" << tex_index[j];
103             cout << " ";
104         }
105         cout << endl;
106     }
107
108     // generate strips
109     string_list strip_materials = obj.get_strip_materials();
110     group_list strips_v = obj.get_strips_v();
111     group_list strips_n = obj.get_strips_n();
112     group_list strips_tc = obj.get_strips_tc();
113     for ( i = 0; i < (int)strips_v.size(); ++i ) {
114         material = strip_materials[i];
115         vertex_index = strips_v[i];
116         normal_index = strips_n[i];
117         tex_index = strips_tc[i];
118         cout << "# usemtl " << material << endl;
119         cout << "ts ";
120         for ( j = 0; j < (int)vertex_index.size(); ++j ) {
121             cout << vertex_index[j];
122             if ( normal_index.size() ) {
123                 cout << "/" << normal_index[j];
124             }
125             cout << "/" << tex_index[j] << " ";
126         }
127         cout << endl;
128     }
129
130     // generate fans
131     string_list fan_materials = obj.get_fan_materials();
132     group_list fans_v = obj.get_fans_v();
133     group_list fans_n = obj.get_fans_n();
134     group_list fans_tc = obj.get_fans_tc();
135     for ( i = 0; i < (int)fans_v.size(); ++i ) {
136         material = fan_materials[i];
137         vertex_index = fans_v[i];
138         normal_index = fans_n[i];
139         tex_index = fans_tc[i];
140         cout << "# usemtl " << material << endl;
141         cout << "tf ";
142         for ( j = 0; j < (int)vertex_index.size(); ++j ) {
143             cout << vertex_index[j];
144             if ( normal_index.size() ) {
145                 cout << "/" << normal_index[j];
146             }
147             cout << "/" << tex_index[j] << " ";
148         }
149         cout << endl;
150     }
151 }