21 using namespace ROOT::Experimental;
22 namespace REX = ROOT::Experimental;
30 REveTrackProjected::~REveTrackProjected()
42 void REveTrackProjected::SetProjection(REveProjectionManager* mng, REveProjectable* model)
44 REveProjected::SetProjection(mng, model);
45 CopyVizParams(dynamic_cast<REveElement*>(model));
47 REveTrack* otrack =
dynamic_cast<REveTrack*
>(fProjectable);
48 SetTrackParams(*otrack);
49 SetLockPoints(otrack->GetLockPoints());
55 void REveTrackProjected::SetDepthLocal(Float_t d)
57 SetDepthCommon(d,
this, fBBox);
59 for (Int_t i = 0; i < fSize; ++i)
61 fPoints[i].fZ = fDepth;
64 for (
auto &pm: fPathMarks)
73 void REveTrackProjected::UpdateProjection()
84 Int_t REveTrackProjected::GetBreakPointIdx(Int_t start)
86 REveProjection *projection = fManager->GetProjection();
88 Int_t val = fSize - 1;
90 if (projection->HasSeveralSubSpaces())
100 if(projection->AcceptSegment(v1, v2, fPropagator->GetDelta()) == kFALSE)
117 void REveTrackProjected::MakeTrack(Bool_t recurse)
119 REveTrack *otrack =
dynamic_cast<REveTrack*
>(fProjectable);
120 REveTrans *trans = otrack->PtrMainTrans(kFALSE);
121 REveProjection *projection = fManager->GetProjection();
123 fBreakPoints.clear();
126 SetPathMarks(*otrack);
127 if (GetLockPoints() || otrack->GetSize() > 0)
129 ClonePoints(*otrack);
130 fLastPMIdx = otrack->GetLastPMIdx();
134 REveTrack::MakeTrack(recurse);
136 if (fSize == 0)
return;
139 ReduceSegmentLengths(projection->GetMaxTrackStep());
148 Float_t *p = & fPoints[0].fX;
149 fOrigPnts =
new REveVector[fSize];
150 for (Int_t i = 0; i < fSize; ++i, p+=3)
152 if (trans) trans->MultiplyIP(p);
154 projection->ProjectPointfv(p, fDepth);
157 Int_t bL = 0, bR = GetBreakPointIdx(0);
158 std::vector<REveVector> vvec;
161 for (Int_t i = bL; i <= bR; i++)
163 vvec.push_back( RefPoint(i) );
168 REveVector vL = fOrigPnts[bR];
169 REveVector vR = fOrigPnts[bR + 1];
170 projection->BisectBreakPoint(vL, vR, kTRUE, fDepth);
172 fBreakPoints.push_back((Int_t)vvec.size());
176 bR = GetBreakPointIdx(bL);
178 fBreakPoints.push_back((Int_t)vvec.size());
183 Bool_t fix_y = kFALSE;
185 if (projection->HasSeveralSubSpaces())
187 switch (fPropagator->GetProjTrackBreaking())
189 case REveTrackPropagator::kPTB_UseFirstPointPos:
192 sign_y = vvec.front().fY;
195 case REveTrackPropagator::kPTB_UseLastPointPos:
198 sign_y = vvec.back().fY;
204 Reset((Int_t)vvec.size());
208 SetNextPoint(i.fX, TMath::Sign(i.fY, sign_y), i.fZ);
210 SetNextPoint(i.fX, i.fY, i.fZ);
216 for (
auto &pm: fPathMarks)
218 projection->ProjectPointdv(trans, pm.fV.Arr(), pm.fV.Arr(), fDepth);
225 void REveTrackProjected::PrintLineSegments()
227 printf(
"%s LineSegments:\n", GetCName());
232 for (
auto &bpi: fBreakPoints)
234 Int_t size = bpi - start;
236 const REveVector &sVec = RefPoint(start);
237 const REveVector &bPnt = RefPoint(bpi-1);
238 printf(
"seg %d size %d start %d ::(%f, %f, %f) (%f, %f, %f)\n",
239 segment, size, start, sVec.fX, sVec.fY, sVec.fZ,
240 bPnt.fX, bPnt.fY, bPnt.fZ);
249 void REveTrackProjected::SecSelected(REveTrack* )
251 REveTrack* t =
dynamic_cast<REveTrack*
>(fProjectable);
265 REveTrackListProjected::REveTrackListProjected() :
274 void REveTrackListProjected::SetProjection(REveProjectionManager* proj, REveProjectable* model)
276 REveProjected::SetProjection(proj, model);
277 CopyVizParams(dynamic_cast<REveElement*>(model));
279 REveTrackList& tl = *
dynamic_cast<REveTrackList*
>(model);
280 SetPropagator(tl.GetPropagator());
288 void REveTrackListProjected::SetDepthLocal(Float_t )
290 Warning(
"SetDepthLocal",
"This function only exists to fulfill an abstract interface.");
296 void REveTrackListProjected::SetDepth(Float_t d)
304 void REveTrackListProjected::SetDepth(Float_t d, REveElement *el)
306 for (
auto &c: el->RefChildren()) {
307 auto ptrack =
dynamic_cast<REveTrackProjected *
>(c);
318 Int_t REveTrackProjected::WriteCoreJson(nlohmann::json &j, Int_t rnr_offset)
320 Int_t ret = REveTrack::WriteCoreJson(j, rnr_offset);
322 j[
"render_data"][
"break_point_size"] = fBreakPoints.size();
330 void REveTrackProjected::BuildRenderData()
332 REveTrack::BuildRenderData();
334 if (fRenderData && !fBreakPoints.empty()) {
335 fRenderData->Reserve(0, 0, fBreakPoints.size());
336 fRenderData->PushI(fBreakPoints);