/// \file
/// \ingroup tutorial_eve
/// Combinatorial Solid Geometry example
///
/// Stripped down to demonstrate EVE shape-extracts.
/// 1. `Run root csgdemo.C`
///    This will produce csg.root containing the extract.
/// 2. Display the assembly as:
///    `root show_extract.C("csg.root")`
///
/// \image html eve_csgdemo.png
/// \macro_code
///
/// \author Andrei Gheata

#include "TGeoManager.h"

//____________________________________________________________________________
void csgdemo()
{
   gSystem->Load("libGeom");

   auto c = new TCanvas("composite shape", "A * B - C");
   c->Iconify();

   if (gGeoManager)
      delete gGeoManager;

   new TGeoManager("xtru", "poza12");
   auto mat = new TGeoMaterial("Al", 26.98, 13, 2.7);
   auto med = new TGeoMedium("MED", 1, mat);
   auto top = gGeoManager->MakeBox("TOP", med, 100, 100, 100);
   gGeoManager->SetTopVolume(top);

   // define shape components with names
   auto box = new TGeoBBox("box", 20., 20., 20.);
   auto box1 = new TGeoBBox("box1", 5., 5., 5.);
   auto sph = new TGeoSphere("sph", 5., 25.);
   auto sph1 = new TGeoSphere("sph1", 1., 15.);
   // create the composite shape based on a Boolean expression
   auto tr = new TGeoTranslation(0., 30., 0.);
   auto tr1 = new TGeoTranslation(0., 40., 0.);
   auto tr2 = new TGeoTranslation(0., 30., 0.);
   auto tr3 = new TGeoTranslation(0., 30., 0.);
   tr->SetName("tr");
   tr1->SetName("tr1");
   tr2->SetName("tr2");
   tr3->SetName("tr3");
   // register all used transformations
   tr->RegisterYourself();
   tr1->RegisterYourself();
   tr2->RegisterYourself();
   tr3->RegisterYourself();

   TGeoCompositeShape *cs = new TGeoCompositeShape("mir", "(sph * box) + (sph1:tr - box1:tr1)");

   auto vol = new TGeoVolume("COMP4", cs);
   vol->SetLineColor(kMagenta);
   top->AddNode(vol, 1);
   gGeoManager->CloseGeometry();
   top->Draw();

   gGeoManager->SetNsegments(40);
   TEveGeoNode::SetCSGExportNSeg(40);

   TGLFaceSet::SetEnforceTriangles(kTRUE);
   TEveManager::Create();

   auto node = gGeoManager->GetTopNode();
   auto en = new TEveGeoTopNode(gGeoManager, node);
   en->SetVisLevel(4);
   en->GetNode()->GetVolume()->SetVisibility(kFALSE);

   gEve->AddGlobalElement(en);

   gEve->Redraw3D(kTRUE);

   en->ExpandIntoListTreesRecursively();
   en->SaveExtract("csg.root", "CSG Demo", kFALSE);
}
