in roboschool/cpp-household/physics-bullet.cpp [134:184]
void load_shape_into_class(
const shared_ptr<ThingyClass>& klass,
int geom, const std::string& fn, float ex, float ey, float ez, uint32_t color,
const btTransform& viz_frame)
{
shared_ptr<ShapeDetailLevels> save_here = klass->shapedet_visual;
bool center_of_mass_sphere = false;
if (center_of_mass_sphere && save_here->detail_levels[DETAIL_BEST].empty()) {
shared_ptr<Shape> com(new Shape);
com->primitive_type = Shape::SPHERE;
com->sphere.reset(new Sphere({ 0.1f*SCALE }));
com->material.reset(new Material("center_of_mass_sphere"));
com->material->diffuse_color = 0x40FF0000;
save_here->detail_levels[DETAIL_BEST].push_back(com);
if (!save_here->materials)
save_here->materials.reset(new MaterialNamespace);
save_here->materials->name2mtl["center_of_mass_sphere"] = com->material;
}
shared_ptr<Shape> primitive(new Shape);
if (geom==5) { // URDF_GEOM_MESH
save_here->load_later_on = true;
save_here->load_later_fn = fn;
save_here->load_later_transform = viz_frame;
primitive.reset();
} else if (geom==2) { // URDF_GEOM_SPHERE
primitive->primitive_type = Shape::SPHERE;
primitive->sphere.reset(new Sphere({ ex*SCALE }));
} else if (geom==3) { // URDF_GEOM_BOX
primitive->primitive_type = Shape::BOX;
primitive->box.reset(new Box({ ex*SCALE, ey*SCALE, ez*SCALE }));
} else if (geom==4 || geom==7) { // URDF_GEOM_CYLINDER URDF_GEOM_CAPSULE
primitive->primitive_type = geom==7 ? Shape::CAPSULE : Shape::CYLINDER;
primitive->cylinder.reset(new Cylinder({ ey*SCALE, ex*SCALE })); // rad, length
} else {
// URDF_GEOM_PLANE ignore
primitive.reset();
}
if (primitive) {
primitive->origin = viz_frame;
char buf[20];
snprintf(buf, sizeof(buf), "#%08x", color);
primitive->material.reset(new Material(buf));
primitive->material->diffuse_color = color;
if (!save_here->materials)
save_here->materials.reset(new MaterialNamespace);
save_here->materials->name2mtl[buf] = primitive->material;
save_here->detail_levels[DETAIL_BEST].push_back(primitive);
}
}