1515 * limitations under the License.
1616 */
1717
18+ #include < array>
1819#include < memory>
1920#include < set>
2021#include < sstream>
@@ -31,14 +32,20 @@ std::vector<double> Read(pugi::xml_node node, const char* attribute) {
3132 std::istringstream stream (node.attribute (attribute).value ());
3233 std::vector<double > values;
3334 double value;
34- while (stream >> value) values.push_back (value);
35+ while (stream >> value) {
36+ values.push_back (value);
37+ }
3538 return values;
3639}
3740
3841void Scale (pugi::xml_node node, const char * attribute, double factor) {
3942 auto values = Read (node, attribute);
40- if (values.empty ()) return ;
41- for (double & value : values) value *= factor;
43+ if (values.empty ()) {
44+ return ;
45+ }
46+ for (double & value : values) {
47+ value *= factor;
48+ }
4249 Set (node, attribute, Numbers (values.data (), values.size ()));
4350}
4451
@@ -65,22 +72,26 @@ void Rescale(pugi::xml_node model) {
6572 mjVFS vfs;
6673 mj_defaultVFS (&vfs);
6774 mj_addBufferVFS (&vfs, " cmu.xml" , contents.data (), contents.size ());
68- char error[ 1024 ] {};
75+ std::array< char , 1024 > error {};
6976 std::unique_ptr<mjModel, decltype (&mj_deleteModel)> physics (
70- mj_loadXML (" cmu.xml" , &vfs, error, sizeof (error)), mj_deleteModel);
77+ mj_loadXML (" cmu.xml" , &vfs, error. data () , sizeof (error)), mj_deleteModel);
7178 mj_deleteVFS (&vfs);
72- if (!physics) throw std::runtime_error (error);
79+ if (!physics) {
80+ throw std::runtime_error (error.data ());
81+ }
7382 const int root = mj_name2id (physics.get (), mjOBJ_BODY, " root" );
7483 const double mass_factor = 70 / physics->body_subtreemass [root];
75- for (auto entry : Find (model, " body" , " root" ).select_nodes (" .//inertial" ))
84+ for (auto entry : Find (model, " body" , " root" ).select_nodes (" .//inertial" )) {
7685 Scale (entry.node (), " mass" , mass_factor);
86+ }
7787 for (auto entry : Find (model, " body" , " root" ).select_nodes (" .//geom" )) {
7888 auto geom = entry.node ();
79- if (geom.attribute (" mass" ))
89+ if (geom.attribute (" mass" ) != nullptr ) {
8090 Scale (geom, " mass" , mass_factor);
81- else
91+ } else {
8292 Set (geom, " density" ,
8393 geom.attribute (" density" ).as_double (1000 ) * mass_factor);
94+ }
8495 }
8596}
8697
@@ -124,8 +135,9 @@ void Scene::CmuVisuals(pugi::xml_node model, Walker walker, int player,
124135 auto visual = geom.parent ().append_child (" geom" );
125136 Set (visual, " name" , name + " _visual" );
126137 for (const char * attr : {" type" , " quat" , " pos" , " size" }) {
127- if (geom.attribute (attr))
138+ if (geom.attribute (attr) != nullptr ) {
128139 Set (visual, attr, geom.attribute (attr).value ());
140+ }
129141 }
130142 Scale (visual, " size" , name == hand ? 1.3 : 1.5 );
131143 Scale (visual, " pos" , 1.5 );
@@ -153,33 +165,38 @@ void Scene::CmuVisuals(pugi::xml_node model, Walker walker, int player,
153165 for (const char * name :
154166 {" lhipjoint" , " rhipjoint" , " lfemur" , " lowerback" , " upperback" ,
155167 " rclavicle" , " lclavicle" , " thorax" , " lhumerus" , " root_geom" ,
156- " lowerneck" , " rhumerus" , " rfemur" })
168+ " lowerneck" , " rhumerus" , " rfemur" }) {
157169 Set (Find (model, " geom" , name), " rgba" , {0 , 0 , 0 , 0 });
158- const double neck = .066 - .0452401 , arm = .20 - .138421 ,
159- leg = .384 - .202473 ;
160- const char * bodies[]{" lowerneck" , " lhumerus" , " rhumerus" , " lfemur" , " rfemur" };
161- const char * names[]{" halfneck" , " lelbow" , " relbow" , " lknee" , " rknee" };
162- const double sizes[5 ][2 ]{{.05 , .02279225 - neck},
163- {.035 , .1245789 - arm},
164- {.035 , .1245789 - arm},
165- {.055 , .1822257 - leg},
166- {.055 , .1822257 - leg}};
167- const double positions[5 ][3 ]{{-.00165071 , .0452401 + neck, .00534359 },
168- {0 , -.138421 - arm, 0 },
169- {0 , -.138421 - arm, 0 },
170- {-5.0684e-8 , -.202473 - leg, 0 },
171- {-5.0684e-8 , -.202473 - leg, 0 }};
172- const double quats[5 ][4 ]{{.66437 , .746906 , .027253 , 0 },
173- {.612372 , -.612372 , .353553 , .353553 },
174- {.612372 , -.612372 , -.353553 , -.353553 },
175- {.696364 , -.696364 , -.122788 , -.122788 },
176- {.696364 , -.696364 , .122788 , .122788 }};
170+ }
171+ const double neck = .066 - .0452401 ;
172+ const double arm = .20 - .138421 ;
173+ const double leg = .384 - .202473 ;
174+ const std::array bodies{" lowerneck" , " lhumerus" , " rhumerus" , " lfemur" ,
175+ " rfemur" };
176+ const std::array names{" halfneck" , " lelbow" , " relbow" , " lknee" , " rknee" };
177+ const std::array<std::array<double , 2 >, 5 > sizes{{{.05 , .02279225 - neck},
178+ {.035 , .1245789 - arm},
179+ {.035 , .1245789 - arm},
180+ {.055 , .1822257 - leg},
181+ {.055 , .1822257 - leg}}};
182+ const std::array<std::array<double , 3 >, 5 > positions{
183+ {{-.00165071 , .0452401 + neck, .00534359 },
184+ {0 , -.138421 - arm, 0 },
185+ {0 , -.138421 - arm, 0 },
186+ {-5.0684e-8 , -.202473 - leg, 0 },
187+ {-5.0684e-8 , -.202473 - leg, 0 }}};
188+ const std::array<std::array<double , 4 >, 5 > quats{
189+ {{.66437 , .746906 , .027253 , 0 },
190+ {.612372 , -.612372 , .353553 , .353553 },
191+ {.612372 , -.612372 , -.353553 , -.353553 },
192+ {.696364 , -.696364 , -.122788 , -.122788 },
193+ {.696364 , -.696364 , .122788 , .122788 }}};
177194 for (int i = 0 ; i < 5 ; ++i) {
178195 auto geom = Find (model, " body" , bodies[i]).append_child (" geom" );
179196 Set (geom, " name" , names[i]);
180- Set (geom, " size" , Numbers (sizes[i], 2 ));
181- Set (geom, " pos" , Numbers (positions[i], 3 ));
182- Set (geom, " quat" , Numbers (quats[i], 4 ));
197+ Set (geom, " size" , Numbers (sizes[i]. data () , 2 ));
198+ Set (geom, " pos" , Numbers (positions[i]. data () , 3 ));
199+ Set (geom, " quat" , Numbers (quats[i]. data () , 4 ));
183200 Set (geom, " mass" , 0 );
184201 Set (geom, " contype" , 0 );
185202 Set (geom, " conaffinity" , 0 );
0 commit comments