31 ClassImp(TEveTriangleSet);
36 TEveTriangleSet::TEveTriangleSet(Int_t nv, Int_t nt, Bool_t norms, Bool_t cols) :
37 TEveElementList(
"TEveTriangleSet",
"", kTRUE),
38 fNVerts (nv), fVerts(0),
39 fNTrings (nt), fTrings(0), fTringNorms(0), fTringCols(0)
43 fVerts =
new Float_t[3*fNVerts];
44 fTrings =
new Int_t [3*fNTrings];
45 fTringNorms = (norms) ?
new Float_t[3*fNTrings] : 0;
46 fTringCols = (cols) ?
new UChar_t[3*fNTrings] : 0;
52 TEveTriangleSet::~TEveTriangleSet()
56 delete [] fTringNorms;
63 void TEveTriangleSet::GenerateTriangleNormals()
65 if (fTringNorms == 0) fTringNorms =
new Float_t[3*fNTrings];
68 Float_t *norm = fTringNorms;
69 Int_t *tring = fTrings;
70 for(Int_t t=0; t<fNTrings; ++t, norm+=3, tring+=3)
72 Float_t* v0 = Vertex(tring[0]);
73 Float_t* v1 = Vertex(tring[1]);
74 Float_t* v2 = Vertex(tring[2]);
75 e1.SetXYZ(v1[0]-v0[0], v1[1]-v0[1], v1[2]-v0[2]);
76 e2.SetXYZ(v2[0]-v0[0], v2[1]-v0[1], v2[2]-v0[2]);
86 void TEveTriangleSet::GenerateRandomColors()
88 if (fTringCols == 0) fTringCols =
new UChar_t[3*fNTrings];
92 UChar_t *col = fTringCols;
93 for(Int_t t=0; t<fNTrings; ++t, col+=3)
95 col[0] = (UChar_t) r.Uniform(60, 255);
96 col[1] = (UChar_t) r.Uniform(60, 255);
97 col[2] = (UChar_t) r.Uniform(60, 255);
105 void TEveTriangleSet::GenerateZNormalColors(Float_t fac, Int_t min, Int_t max,
106 Bool_t interp, Bool_t wrap)
108 if (fTringCols == 0) fTringCols =
new UChar_t[3*fNTrings];
109 if (fTringNorms == 0) GenerateTriangleNormals();
111 TEveRGBAPalette pal(min, max, interp, wrap);
112 UChar_t *col = fTringCols;
113 Float_t *norm = fTringNorms;
114 for(Int_t t=0; t<fNTrings; ++t, col+=3, norm+=3)
116 Int_t v = TMath::Nint(fac * norm[2]);
117 pal.ColorFromValue(v, col, kFALSE);
126 void TEveTriangleSet::ComputeBBox()
135 for (Int_t i=0; i<fNVerts; ++i, v += 3)
142 void TEveTriangleSet::Paint(Option_t*)
150 TEveTriangleSet* TEveTriangleSet::ReadTrivialFile(
const char* file)
152 static const TEveException kEH(
"TEveTriangleSet::ReadTrivialFile ");
154 FILE* f = fopen(file,
"r");
156 ::Error(kEH,
"file '%s' not found.", file);
161 if (fscanf(f,
"%d %d", &nv, &nt) != 2) {
163 throw kEH +
"Reading nv, nt failed.";
166 if (nv < 0 || nt < 0) {
168 throw kEH +
"Negative number of vertices / triangles specified.";
171 TEveTriangleSet* ts =
new TEveTriangleSet(nv, nt);
173 Float_t *vtx = ts->Vertex(0);
174 for (Int_t i=0; i<nv; ++i, vtx+=3) {
175 if (fscanf(f,
"%f %f %f", &vtx[0], &vtx[1], &vtx[2]) != 3) {
177 throw kEH + TString::Format(
"Reading vertex data %d failed.", i);
181 Int_t *tngl = ts->Triangle(0);
182 for (Int_t i=0; i<nt; ++i, tngl+=3) {
183 if (fscanf(f,
"%d %d %d", &tngl[0], &tngl[1], &tngl[2]) != 3) {
185 throw kEH + TString::Format(
"Reading triangle data %d failed.", i);