22 ClassImp(TEveStraightLineSet);
27 TEveStraightLineSet::TEveStraightLineSet(
const char* n,
const char* t):
31 fLinePlex (sizeof(Line_t), 4),
32 fMarkerPlex (sizeof(Marker_t), 8),
33 fOwnLinesIds (kFALSE),
34 fOwnMarkersIds (kFALSE),
43 fMainColorPtr = &fLineColor;
52 TEveStraightLineSet::Line_t*
53 TEveStraightLineSet::AddLine(Float_t x1, Float_t y1, Float_t z1,
54 Float_t x2, Float_t y2, Float_t z2)
56 fLastLine =
new (fLinePlex.NewAtom()) Line_t(x1, y1, z1, x2, y2, z2);
57 fLastLine->fId = fLinePlex.Size() - 1;
64 TEveStraightLineSet::Line_t*
65 TEveStraightLineSet::AddLine(
const TEveVector& p1,
const TEveVector& p2)
67 return AddLine(p1.fX, p1.fY, p1.fZ, p2.fX, p2.fY, p2.fZ);
74 TEveStraightLineSet::SetLine(
int idx,
75 Float_t x1, Float_t y1, Float_t z1,
76 Float_t x2, Float_t y2, Float_t z2)
78 Line_t* l = (Line_t*) fLinePlex.Atom(idx);
80 l->fV1[0] = x1; l->fV1[1] = y1; l->fV1[2] = z1;
81 l->fV2[0] = x2; l->fV2[1] = y2; l->fV2[2] = z2;
88 TEveStraightLineSet::SetLine(
int idx,
const TEveVector& p1,
const TEveVector& p2)
90 SetLine(idx, p1.fX, p1.fY, p1.fZ, p2.fX, p2.fY, p2.fZ);
96 TEveStraightLineSet::Marker_t*
97 TEveStraightLineSet::AddMarker(Float_t x, Float_t y, Float_t z, Int_t line_id)
99 Marker_t* marker =
new (fMarkerPlex.NewAtom()) Marker_t(x, y, z, line_id);
106 TEveStraightLineSet::Marker_t*
107 TEveStraightLineSet::AddMarker(
const TEveVector& p, Int_t line_id)
109 return AddMarker(p.fX, p.fY, p.fZ, line_id);
115 TEveStraightLineSet::Marker_t*
116 TEveStraightLineSet::AddMarker(Int_t line_id, Float_t pos)
118 Line_t& l = * (Line_t*) fLinePlex.Atom(line_id);
119 return AddMarker(l.fV1[0] + (l.fV2[0] - l.fV1[0])*pos,
120 l.fV1[1] + (l.fV2[1] - l.fV1[1])*pos,
121 l.fV1[2] + (l.fV2[2] - l.fV1[2])*pos,
128 void TEveStraightLineSet::CopyVizParams(
const TEveElement* el)
130 const TEveStraightLineSet* m =
dynamic_cast<const TEveStraightLineSet*
>(el);
133 TAttLine::operator=(*m);
134 TAttMarker::operator=(*m);
135 fRnrMarkers = m->fRnrMarkers;
136 fRnrLines = m->fRnrLines;
137 fDepthTest = m->fDepthTest;
140 TEveElement::CopyVizParams(el);
146 void TEveStraightLineSet::WriteVizParams(std::ostream& out,
const TString& var)
148 TEveElement::WriteVizParams(out, var);
150 TString t =
" " + var +
"->";
151 TAttMarker::SaveMarkerAttributes(out, var);
152 TAttLine ::SaveLineAttributes (out, var);
153 out << t <<
"SetRnrMarkers(" << ToString(fRnrMarkers) <<
");\n";
154 out << t <<
"SetRnrLines(" << ToString(fRnrLines) <<
");\n";
155 out << t <<
"SetDepthTest(" << ToString(fDepthTest) <<
");\n";
162 TClass* TEveStraightLineSet::ProjectedClass(
const TEveProjection*)
const
164 return TEveStraightLineSetProjected::Class();
171 void TEveStraightLineSet::ComputeBBox()
173 if (fLinePlex.Size() == 0 && fMarkerPlex.Size() == 0) {
180 TEveChunkManager::iterator li(fLinePlex);
182 BBoxCheckPoint(((Line_t*)li())->fV1);
183 BBoxCheckPoint(((Line_t*)li())->fV2);
186 TEveChunkManager::iterator mi(fMarkerPlex);
189 BBoxCheckPoint(((Marker_t*)mi())->fV);
196 void TEveStraightLineSet::Paint(Option_t*)
206 ClassImp(TEveStraightLineSetProjected);
211 TEveStraightLineSetProjected::TEveStraightLineSetProjected() :
212 TEveStraightLineSet(), TEveProjected ()
219 void TEveStraightLineSetProjected::SetProjection(TEveProjectionManager* mng,
220 TEveProjectable* model)
222 TEveProjected::SetProjection(mng, model);
224 CopyVizParams(dynamic_cast<TEveElement*>(model));
230 void TEveStraightLineSetProjected::SetDepthLocal(Float_t d)
232 SetDepthCommon(d,
this, fBBox);
234 TEveChunkManager::iterator li(fLinePlex);
237 TEveStraightLineSet::Line_t& l = * (TEveStraightLineSet::Line_t*) li();
242 TEveChunkManager::iterator mi(fMarkerPlex);
245 Marker_t& m = * (Marker_t*) mi();
254 void TEveStraightLineSetProjected::UpdateProjection()
256 TEveProjection& proj = * fManager->GetProjection();
257 TEveStraightLineSet& orig = *
dynamic_cast<TEveStraightLineSet*
>(fProjectable);
259 TEveTrans *trans = orig.PtrMainTrans(kFALSE);
264 Int_t num_lines = orig.GetLinePlex().Size();
265 if (proj.HasSeveralSubSpaces())
266 num_lines += TMath::Max(1, num_lines/10);
267 fLinePlex.Reset(
sizeof(Line_t), num_lines);
269 TEveChunkManager::iterator li(orig.GetLinePlex());
272 Line_t *l = (Line_t*) li();
274 proj.ProjectPointfv(trans, l->fV1, p1, fDepth);
275 proj.ProjectPointfv(trans, l->fV2, p2, fDepth);
277 if (proj.AcceptSegment(p1, p2, 0.1f))
279 AddLine(p1, p2)->fId = l->fId;
283 TEveVector bp1(l->fV1), bp2(l->fV2);
285 trans->MultiplyIP(bp1);
286 trans->MultiplyIP(bp2);
288 proj.BisectBreakPoint(bp1, bp2, kTRUE, fDepth);
290 AddLine(p1, bp1)->fId = l->fId;
291 AddLine(bp2, p2)->fId = l->fId;
294 if (proj.HasSeveralSubSpaces())
298 fMarkerPlex.Reset(
sizeof(Marker_t), orig.GetMarkerPlex().Size());
299 TEveChunkManager::iterator mi(orig.GetMarkerPlex());
303 Marker_t &m = * (Marker_t*) mi();
305 proj.ProjectPointfv(trans, m.fV, pp, fDepth);
306 AddMarker(pp, m.fLineId);