1 #include <vtestbed/config/real_type.hh>     2 #include <vtestbed/core/ship.hh>     3 #include <vtestbed/guile/macros.hh>     4 #include <vtestbed/guile/traits.hh>    17     SCM kw_hull, kw_compartments, kw_mass, kw_displacement, kw_draught;
    24         template <> SCM traits_type::type() { return ::type; }
    33             using T = VTB_REAL_TYPE;
    34             SCM hull = SCM_UNDEFINED, compartments = SCM_UNDEFINED, mass = SCM_UNDEFINED,
    35                 displacement = SCM_UNDEFINED, draught = SCM_UNDEFINED;
    36             scm_c_bind_keyword_arguments(
"make-ship", rest,
    37                                          scm_t_keyword_arguments_flags{},
    38                                          kw_hull, &hull, kw_compartments, &compartments,
    39                                          kw_mass, &mass, kw_displacement, &displacement,
    40                                          kw_draught, &draught, SCM_UNDEFINED);
    41             auto* wrapper = make_wrapper<object_type>();
    43                 SCM s_class = scm_class_of(hull);
    45                     auto* hull_wrapper = get_wrapper<polyhedron_type>(hull);
    46                     wrapper->get()->hull(*hull_wrapper->get());
    48                     auto* hull_wrapper = get_wrapper<hull_type>(hull);
    49                     wrapper->get()->hull(*hull_wrapper->get());
    51                     throw_error(
"hull should be of type polyhedron or hull");
    52                     return SCM_UNSPECIFIED;
    55             if (is_bound(compartments)) {
    57                 while (compartments != SCM_EOL) {
    58                     SCM comp = scm_car(compartments);
    59                     auto* comp_wrapper = get_wrapper<compartment_type>(comp);
    60                     rooms.emplace_back(*comp_wrapper->get());
    61                     compartments = scm_cdr(compartments);
    63                 wrapper->get()->compartments(rooms);
    65             if (is_bound(mass) + is_bound(displacement) + is_bound(draught) >= 2) {
    66                 throw_error(
"specify only one of the following: mass, displacement, draught");
    67                 return SCM_UNSPECIFIED;
    70                 wrapper->get()->mass(from_scm<T>(mass));
    72             if (is_bound(displacement)) {
    73                 wrapper->get()->displacement(from_scm<T>(displacement));
    75             if (is_bound(draught)) {
    76                 wrapper->get()->draught(from_scm<T>(draught));
    78             return make_object<object_type>(traits_type::type(), wrapper);
    88             auto* wrapper = get_wrapper<object_type>(
object);
    89             return to_scm(wrapper->get()->mass());
    93         traits_type::define() {
    94             ::type = define_type<object_type>(
"<compartment>");
    95             kw_hull = scm_from_utf8_keyword(
"hull");
    96             kw_compartments = scm_from_utf8_keyword(
"compartments");
    97             kw_mass = scm_from_utf8_keyword(
"mass");
    98             kw_displacement = scm_from_utf8_keyword(
"displacement");
    99             kw_draught = scm_from_utf8_keyword(
"draught");
   100             define_procedure(
"make-ship", 0, 0, 1, VTB_GUILE_1(
make_ship));
   101             define_procedure(
"ship-mass", 1, 0, 0, VTB_GUILE_1(
ship_mass));
 
SCM ship_mass(SCM object)
Get ship mass.
 
Rigid ship with a mass and translational and angular velocity.
 
SCM make_ship(SCM rest)
Construct ship from hull and compartments mass/displacement/draught.