// @(#)root/eve:$Id$
// Authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007

/*************************************************************************
 * Copyright (C) 1995-2007, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TEveTriangleSet.h"
#include "TEveRGBAPalette.h"
#include "TEveManager.h"

#include "TMath.h"
#include "TVector3.h"
#include "TRandom3.h"


//______________________________________________________________________________
//
// Made from a list of vertices and a list of triangles (triplets of
// vertex indices).
//
// If input is composed from triangles with direct vertex coordinates
// one should consider finding all occurences of the same vertex
// and specifying it only once.
//

ClassImp(TEveTriangleSet);

//______________________________________________________________________________
TEveTriangleSet::TEveTriangleSet(Int_t nv, Int_t nt, Bool_t norms, Bool_t cols) :
   TEveElementList("TEveTriangleSet", "", kTRUE),
   fNVerts  (nv), fVerts(0),
   fNTrings (nt), fTrings(0), fTringNorms(0), fTringCols(0)
{
   // Constructor.

   InitMainTrans();

   fVerts  = new Float_t[3*fNVerts];
   fTrings = new Int_t  [3*fNTrings];
   fTringNorms = (norms) ? new Float_t[3*fNTrings] : 0;
   fTringCols  = (cols)  ? new UChar_t[3*fNTrings] : 0;
}

//______________________________________________________________________________
TEveTriangleSet::~TEveTriangleSet()
{
   // Destructor.

   delete [] fVerts;
   delete [] fTrings;
   delete [] fTringNorms;
   delete [] fTringCols;
}

/******************************************************************************/

//______________________________________________________________________________
void TEveTriangleSet::GenerateTriangleNormals()
{
   // Generate triangle normals via cross product of triangle edges.

   if (fTringNorms == 0)  fTringNorms = new Float_t[3*fNTrings];

   TVector3 e1, e2, n;
   Float_t *norm = fTringNorms;
   Int_t   *tring  = fTrings;
   for(Int_t t=0; t<fNTrings; ++t, norm+=3, tring+=3)
   {
      Float_t* v0 = Vertex(tring[0]);
      Float_t* v1 = Vertex(tring[1]);
      Float_t* v2 = Vertex(tring[2]);
      e1.SetXYZ(v1[0]-v0[0], v1[1]-v0[1], v1[2]-v0[2]);
      e2.SetXYZ(v2[0]-v0[0], v2[1]-v0[1], v2[2]-v0[2]);
      n = e1.Cross(e2);
      n.SetMag(1);
      n.GetXYZ(norm);
   }
}

//______________________________________________________________________________
void TEveTriangleSet::GenerateRandomColors()
{
   // Assign random colors to all triangles.

   if (fTringCols == 0)  fTringCols = new UChar_t[3*fNTrings];

   TRandom r;
   r.SetSeed(0);
   UChar_t *col = fTringCols;
   for(Int_t t=0; t<fNTrings; ++t, col+=3)
   {
      col[0] = (UChar_t) r.Uniform(60, 255);
      col[1] = (UChar_t) r.Uniform(60, 255);
      col[2] = (UChar_t) r.Uniform(60, 255);
   }
}

//______________________________________________________________________________
void TEveTriangleSet::GenerateZNormalColors(Float_t fac, Int_t min, Int_t max,
                                            Bool_t interp, Bool_t wrap)
{
   // Generate triangle colors by the z-component of the normal.
   // Current palette is taken from gStyle.

   if (fTringCols  == 0)  fTringCols = new UChar_t[3*fNTrings];
   if (fTringNorms == 0)  GenerateTriangleNormals();

   TEveRGBAPalette pal(min, max, interp, wrap);
   UChar_t *col = fTringCols;
   Float_t *norm = fTringNorms;
   for(Int_t t=0; t<fNTrings; ++t, col+=3, norm+=3)
   {
      Int_t v = TMath::Nint(fac * norm[2]);
      pal.ColorFromValue(v, col, kFALSE);
   }
   gEve->Redraw3D();
}

/******************************************************************************/

//______________________________________________________________________________
void TEveTriangleSet::ComputeBBox()
{
   // Compute bounding box.
   // Virtual from TAttBBox.

   if (fNVerts <= 0) {
      BBoxZero();
      return;
   }

   BBoxInit();
   Float_t* v = fVerts;
   for (Int_t i=0; i<fNVerts; ++i, v += 3)
      BBoxCheckPoint(v);
}

//______________________________________________________________________________
void TEveTriangleSet::Paint(Option_t*)
{
   // Paint this object. Only direct rendering is supported.

   PaintStandard(this);
}

/******************************************************************************/

//______________________________________________________________________________
TEveTriangleSet* TEveTriangleSet::ReadTrivialFile(const char* file)
{
   // Read a simple ascii input file describing vertices and triangles.

   static const TEveException kEH("TEveTriangleSet::ReadTrivialFile ");

   FILE* f = fopen(file, "r");
   if (f == 0) {
      ::Error(kEH, "file '%s' not found.", file);
      return 0;
   }

   Int_t nv, nt;
   if (fscanf(f, "%d %d", &nv, &nt) != 2) {
      fclose(f);
      throw kEH + "Reading nv, nt failed.";
   }

   if (nv < 0 || nt < 0) {
      fclose(f);
      throw kEH + "Negative number of vertices / triangles specified.";
   }

   TEveTriangleSet* ts = new TEveTriangleSet(nv, nt);

   Float_t *vtx = ts->Vertex(0);
   for (Int_t i=0; i<nv; ++i, vtx+=3) {
      if (fscanf(f, "%f %f %f", &vtx[0], &vtx[1], &vtx[2]) != 3) {
         fclose(f);
         throw kEH + TString::Format("Reading vertex data %d failed.", i);
      }
    }

   Int_t *tngl = ts->Triangle(0);
   for (Int_t i=0; i<nt; ++i, tngl+=3) {
      if (fscanf(f, "%d %d %d", &tngl[0], &tngl[1], &tngl[2]) != 3) {
         fclose(f);
         throw kEH + TString::Format("Reading triangle data %d failed.", i);
      }
   }

   fclose(f);

   return ts;
}
 TEveTriangleSet.cxx:1
 TEveTriangleSet.cxx:2
 TEveTriangleSet.cxx:3
 TEveTriangleSet.cxx:4
 TEveTriangleSet.cxx:5
 TEveTriangleSet.cxx:6
 TEveTriangleSet.cxx:7
 TEveTriangleSet.cxx:8
 TEveTriangleSet.cxx:9
 TEveTriangleSet.cxx:10
 TEveTriangleSet.cxx:11
 TEveTriangleSet.cxx:12
 TEveTriangleSet.cxx:13
 TEveTriangleSet.cxx:14
 TEveTriangleSet.cxx:15
 TEveTriangleSet.cxx:16
 TEveTriangleSet.cxx:17
 TEveTriangleSet.cxx:18
 TEveTriangleSet.cxx:19
 TEveTriangleSet.cxx:20
 TEveTriangleSet.cxx:21
 TEveTriangleSet.cxx:22
 TEveTriangleSet.cxx:23
 TEveTriangleSet.cxx:24
 TEveTriangleSet.cxx:25
 TEveTriangleSet.cxx:26
 TEveTriangleSet.cxx:27
 TEveTriangleSet.cxx:28
 TEveTriangleSet.cxx:29
 TEveTriangleSet.cxx:30
 TEveTriangleSet.cxx:31
 TEveTriangleSet.cxx:32
 TEveTriangleSet.cxx:33
 TEveTriangleSet.cxx:34
 TEveTriangleSet.cxx:35
 TEveTriangleSet.cxx:36
 TEveTriangleSet.cxx:37
 TEveTriangleSet.cxx:38
 TEveTriangleSet.cxx:39
 TEveTriangleSet.cxx:40
 TEveTriangleSet.cxx:41
 TEveTriangleSet.cxx:42
 TEveTriangleSet.cxx:43
 TEveTriangleSet.cxx:44
 TEveTriangleSet.cxx:45
 TEveTriangleSet.cxx:46
 TEveTriangleSet.cxx:47
 TEveTriangleSet.cxx:48
 TEveTriangleSet.cxx:49
 TEveTriangleSet.cxx:50
 TEveTriangleSet.cxx:51
 TEveTriangleSet.cxx:52
 TEveTriangleSet.cxx:53
 TEveTriangleSet.cxx:54
 TEveTriangleSet.cxx:55
 TEveTriangleSet.cxx:56
 TEveTriangleSet.cxx:57
 TEveTriangleSet.cxx:58
 TEveTriangleSet.cxx:59
 TEveTriangleSet.cxx:60
 TEveTriangleSet.cxx:61
 TEveTriangleSet.cxx:62
 TEveTriangleSet.cxx:63
 TEveTriangleSet.cxx:64
 TEveTriangleSet.cxx:65
 TEveTriangleSet.cxx:66
 TEveTriangleSet.cxx:67
 TEveTriangleSet.cxx:68
 TEveTriangleSet.cxx:69
 TEveTriangleSet.cxx:70
 TEveTriangleSet.cxx:71
 TEveTriangleSet.cxx:72
 TEveTriangleSet.cxx:73
 TEveTriangleSet.cxx:74
 TEveTriangleSet.cxx:75
 TEveTriangleSet.cxx:76
 TEveTriangleSet.cxx:77
 TEveTriangleSet.cxx:78
 TEveTriangleSet.cxx:79
 TEveTriangleSet.cxx:80
 TEveTriangleSet.cxx:81
 TEveTriangleSet.cxx:82
 TEveTriangleSet.cxx:83
 TEveTriangleSet.cxx:84
 TEveTriangleSet.cxx:85
 TEveTriangleSet.cxx:86
 TEveTriangleSet.cxx:87
 TEveTriangleSet.cxx:88
 TEveTriangleSet.cxx:89
 TEveTriangleSet.cxx:90
 TEveTriangleSet.cxx:91
 TEveTriangleSet.cxx:92
 TEveTriangleSet.cxx:93
 TEveTriangleSet.cxx:94
 TEveTriangleSet.cxx:95
 TEveTriangleSet.cxx:96
 TEveTriangleSet.cxx:97
 TEveTriangleSet.cxx:98
 TEveTriangleSet.cxx:99
 TEveTriangleSet.cxx:100
 TEveTriangleSet.cxx:101
 TEveTriangleSet.cxx:102
 TEveTriangleSet.cxx:103
 TEveTriangleSet.cxx:104
 TEveTriangleSet.cxx:105
 TEveTriangleSet.cxx:106
 TEveTriangleSet.cxx:107
 TEveTriangleSet.cxx:108
 TEveTriangleSet.cxx:109
 TEveTriangleSet.cxx:110
 TEveTriangleSet.cxx:111
 TEveTriangleSet.cxx:112
 TEveTriangleSet.cxx:113
 TEveTriangleSet.cxx:114
 TEveTriangleSet.cxx:115
 TEveTriangleSet.cxx:116
 TEveTriangleSet.cxx:117
 TEveTriangleSet.cxx:118
 TEveTriangleSet.cxx:119
 TEveTriangleSet.cxx:120
 TEveTriangleSet.cxx:121
 TEveTriangleSet.cxx:122
 TEveTriangleSet.cxx:123
 TEveTriangleSet.cxx:124
 TEveTriangleSet.cxx:125
 TEveTriangleSet.cxx:126
 TEveTriangleSet.cxx:127
 TEveTriangleSet.cxx:128
 TEveTriangleSet.cxx:129
 TEveTriangleSet.cxx:130
 TEveTriangleSet.cxx:131
 TEveTriangleSet.cxx:132
 TEveTriangleSet.cxx:133
 TEveTriangleSet.cxx:134
 TEveTriangleSet.cxx:135
 TEveTriangleSet.cxx:136
 TEveTriangleSet.cxx:137
 TEveTriangleSet.cxx:138
 TEveTriangleSet.cxx:139
 TEveTriangleSet.cxx:140
 TEveTriangleSet.cxx:141
 TEveTriangleSet.cxx:142
 TEveTriangleSet.cxx:143
 TEveTriangleSet.cxx:144
 TEveTriangleSet.cxx:145
 TEveTriangleSet.cxx:146
 TEveTriangleSet.cxx:147
 TEveTriangleSet.cxx:148
 TEveTriangleSet.cxx:149
 TEveTriangleSet.cxx:150
 TEveTriangleSet.cxx:151
 TEveTriangleSet.cxx:152
 TEveTriangleSet.cxx:153
 TEveTriangleSet.cxx:154
 TEveTriangleSet.cxx:155
 TEveTriangleSet.cxx:156
 TEveTriangleSet.cxx:157
 TEveTriangleSet.cxx:158
 TEveTriangleSet.cxx:159
 TEveTriangleSet.cxx:160
 TEveTriangleSet.cxx:161
 TEveTriangleSet.cxx:162
 TEveTriangleSet.cxx:163
 TEveTriangleSet.cxx:164
 TEveTriangleSet.cxx:165
 TEveTriangleSet.cxx:166
 TEveTriangleSet.cxx:167
 TEveTriangleSet.cxx:168
 TEveTriangleSet.cxx:169
 TEveTriangleSet.cxx:170
 TEveTriangleSet.cxx:171
 TEveTriangleSet.cxx:172
 TEveTriangleSet.cxx:173
 TEveTriangleSet.cxx:174
 TEveTriangleSet.cxx:175
 TEveTriangleSet.cxx:176
 TEveTriangleSet.cxx:177
 TEveTriangleSet.cxx:178
 TEveTriangleSet.cxx:179
 TEveTriangleSet.cxx:180
 TEveTriangleSet.cxx:181
 TEveTriangleSet.cxx:182
 TEveTriangleSet.cxx:183
 TEveTriangleSet.cxx:184
 TEveTriangleSet.cxx:185
 TEveTriangleSet.cxx:186
 TEveTriangleSet.cxx:187
 TEveTriangleSet.cxx:188
 TEveTriangleSet.cxx:189
 TEveTriangleSet.cxx:190
 TEveTriangleSet.cxx:191
 TEveTriangleSet.cxx:192
 TEveTriangleSet.cxx:193
 TEveTriangleSet.cxx:194
 TEveTriangleSet.cxx:195
 TEveTriangleSet.cxx:196
 TEveTriangleSet.cxx:197
 TEveTriangleSet.cxx:198