void load_shape_into_class()

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);
	}
}