Virtual Testbed
Ship dynamics simulator for extreme conditions
assets.cc
1 #include <vtestbed/assets/convert.hh>
2 #include <vtestbed/config/real_type.hh>
3 #include <vtestbed/core/compartment.hh>
4 #include <vtestbed/core/hull.hh>
5 #include <vtestbed/geometry/polyhedron.hh>
6 #include <vtestbed/guile/assets.hh>
7 #include <vtestbed/guile/base.hh>
8 #include <vtestbed/guile/macros.hh>
9 #include <vtestbed/guile/traits.hh>
10 #include <vtestbed/guile/wrapper.hh>
11 
16 using any_traits_type = vtb::guile::Traits<std::any>;
17 
18 namespace {
19  SCM any_type;
20  SCM sym_gnuplot, sym_obj, sym_vsl, sym_bsp, sym_stl, sym_igs, sym_rms;
21  SCM kw_format, kw_options;
22 
23  void read_options(vtb::assets::Options& options, SCM s_options) {
24  using namespace vtb::guile;
25  while (s_options != SCM_EOL) {
26  SCM pair = scm_car(s_options);
27  options.read(to_string(scm_symbol_to_string(scm_car(pair))),
28  to_string(scm_cdr(pair)));
29  s_options = scm_cdr(s_options);
30  }
31  }
32 
33 }
34 
35 
36 namespace vtb {
37 
38  namespace guile {
39 
40  SCM any_traits_type::type() { return ::any_type; }
41 
51  SCM import_asset(SCM rest) {
52  using namespace vtb::assets;
53  SCM s_options = SCM_EOL;
54  scm_c_bind_keyword_arguments("import-asset", rest,
55  scm_t_keyword_arguments_flags{},
56  kw_options, &s_options, SCM_UNDEFINED);
57  Options options;
58  read_options(options, s_options);
59  return Traits<std::any>::make(import_asset(std::move(options)));
60  }
61 
71  SCM export_asset(SCM s_asset, SCM rest) {
72  using namespace vtb::assets;
73  SCM s_options = SCM_EOL;
74  scm_c_bind_keyword_arguments("export-asset", rest,
75  scm_t_keyword_arguments_flags{},
76  kw_options, &s_options, SCM_UNDEFINED);
77  Options options;
78  read_options(options, s_options);
79  auto&& asset = get_wrapper<std::any>(s_asset)->get();
80  export_asset(std::move(asset), std::move(options));
81  return SCM_UNSPECIFIED;
82  }
83 
93  SCM convert_asset(SCM s_asset, SCM rest) {
94  using namespace vtb::assets;
95  SCM s_options = SCM_EOL;
96  scm_c_bind_keyword_arguments("convert-asset", rest,
97  scm_t_keyword_arguments_flags{},
98  kw_options, &s_options, SCM_UNDEFINED);
99  Options options;
100  read_options(options, s_options);
101  auto&& asset = get_wrapper<std::any>(s_asset)->get();
102  auto&& result = convert(std::move(asset), std::move(options));
103  return Traits<std::any>::make(std::move(result));
104  }
105 
115  SCM import_polyhedron(SCM path, SCM rest) {
116  using namespace vtb::assets;
117  Format format{};
118  SCM s_format = SCM_UNDEFINED, s_options = SCM_EOL;
119  scm_c_bind_keyword_arguments("import-polyhedron", rest,
120  scm_t_keyword_arguments_flags{},
121  kw_format, &s_format,
122  kw_options, &s_options, SCM_UNDEFINED);
123  auto filename = to_string(path);
124  if (is_bound(s_format)) {
125  format = string_to_format(to_c_string(scm_symbol_to_string(s_format)).get());
126  } else { format = filename_to_format(filename); }
127  Options options{{"input-path",filename}, {"input-format",format}};
128  read_options(options, s_options);
129  const auto& object = import_asset(options);
130  auto&& polyhedron = vtb::assets::convert<polyhedron_type>(object, options);
131  return Traits<polyhedron_type>::make(std::move(polyhedron));
132  }
133 
143  SCM export_polyhedron(SCM polyhedron, SCM path, SCM rest) {
144  using namespace vtb::assets;
145  using vtb::assets::export_asset;
146  auto* wrapper = get_wrapper<polyhedron_type>(polyhedron);
147  Format format{};
148  SCM s_format = SCM_UNDEFINED, s_options = SCM_EOL;
149  scm_c_bind_keyword_arguments("export-polyhedron", rest,
150  scm_t_keyword_arguments_flags{},
151  kw_format, &s_format,
152  kw_options, &s_options, SCM_UNDEFINED);
153  auto filename = to_string(path);
154  if (is_bound(s_format)) {
155  format = string_to_format(to_c_string(scm_symbol_to_string(s_format)).get());
156  } else { format = filename_to_format(filename); }
157  Options options{{"output-path",filename}, {"output-format",format}};
158  read_options(options, s_options);
159  export_asset<polyhedron_type>(*wrapper->get(), options);
160  return SCM_UNSPECIFIED;
161  }
162 
173  SCM import_hull(SCM path, SCM rest) {
174  using namespace vtb::assets;
175  Format format{};
176  SCM s_format = SCM_UNDEFINED, s_options = SCM_EOL;
177  scm_c_bind_keyword_arguments("import-hull", rest,
178  scm_t_keyword_arguments_flags{},
179  kw_format, &s_format,
180  kw_options, &s_options, SCM_UNDEFINED);
181  auto filename = to_string(path);
182  if (is_bound(s_format)) {
183  format = string_to_format(to_c_string(scm_symbol_to_string(s_format)).get());
184  } else { format = filename_to_format(filename); }
185  Options options{{"input-path",filename}, {"input-format",format}};
186  read_options(options, s_options);
187  return Traits<hull_type>::make(convert<hull_type>(import_asset(options), options));
188  }
189 
197  SCM import_compartments(SCM path, SCM rest) {
198  using namespace vtb::assets;
200  Format format{};
201  SCM s_format = SCM_UNDEFINED, s_options = SCM_EOL;
202  scm_c_bind_keyword_arguments("import-compartments", rest,
203  scm_t_keyword_arguments_flags{},
204  kw_format, &s_format,
205  kw_options, &s_options, SCM_UNDEFINED);
206  auto filename = to_string(path);
207  if (is_bound(s_format)) {
208  format = string_to_format(to_c_string(scm_symbol_to_string(s_format)).get());
209  } else { format = filename_to_format(filename); }
210  Options options{{"input-path",filename}, {"input-format",format}};
211  read_options(options, s_options);
212  const auto& object = import_asset(options);
213  auto&& rooms = convert<compartment_array>(object, options);
214  SCM s_rooms = SCM_EOL;
215  for (auto& room : rooms) {
216  s_rooms = scm_cons(traits_type::make(std::move(room)), s_rooms);
217  }
218  s_rooms = scm_reverse(s_rooms);
219  return s_rooms;
220  }
221 
222  void assets_define() {
223  ::any_type = define_type<std::any>("<any>");
224  sym_gnuplot = scm_from_utf8_symbol("gnuplot");
225  sym_obj = scm_from_utf8_symbol("obj");
226  sym_stl = scm_from_utf8_symbol("stl");
227  sym_vsl = scm_from_utf8_symbol("vsl");
228  sym_bsp = scm_from_utf8_symbol("bsp");
229  sym_igs = scm_from_utf8_symbol("igs");
230  sym_rms = scm_from_utf8_symbol("rms");
231  kw_format = scm_from_utf8_keyword("format");
232  kw_options = scm_from_utf8_keyword("options");
233  define_procedure("import-asset", 0, 0, 1, VTB_GUILE_1(import_asset));
234  define_procedure("export-asset", 1, 0, 1, VTB_GUILE_2(export_asset));
235  define_procedure("convert-asset", 1, 0, 1, VTB_GUILE_2(convert_asset));
236  define_procedure("import-polyhedron", 1, 0, 1, VTB_GUILE_2(import_polyhedron));
237  define_procedure("export-polyhedron", 2, 0, 1, VTB_GUILE_3(export_polyhedron));
238  define_procedure("import-hull", 1, 0, 1, VTB_GUILE_2(import_hull));
239  define_procedure("import-compartments", 1, 0, 1, VTB_GUILE_2(import_compartments));
240  }
241 
242  }
243 
244 }
Guile bindings.
SCM import_polyhedron(SCM path, SCM rest)
Import polyhedron from file path using options. Options are specified as rest argument.
Definition: assets.cc:115
SCM import_hull(SCM path, SCM rest)
Import ship hull from file path using options. Options are specified as rest argument.
Definition: assets.cc:173
Import/convert/export 3-d objects.
Definition: convert.hh:11
T to_string(T... args)
SCM export_asset(SCM s_asset, SCM rest)
Export asset asset to file using options. Options are specified as rest argument. File path is specif...
Definition: assets.cc:71
Main namespace.
Definition: convert.hh:9
SCM export_polyhedron(SCM polyhedron, SCM path, SCM rest)
Export polyhedron polyhedron to file path using options. Options are specified as rest argument.
Definition: assets.cc:143
SCM import_compartments(SCM path, SCM rest)
Import ship compartments from file path using options. Options are specified as rest argument.
Definition: assets.cc:197
SCM import_asset(SCM rest)
Import an asset from file using options. Options are specified as rest argument. File path is specifi...
Definition: assets.cc:51
SCM convert_asset(SCM s_asset, SCM rest)
Convert asset asset using options. Options are specified as rest argument. Output format is specified...
Definition: assets.cc:93