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