#ifndef Var1_TriMeshField_H
#define Var1_TriMeshField_H
#include <Glasses/ZGlass.h>
class RGBAPalette;
class TriMesh;
class TriMeshField : public ZGlass
{
MAC_RNR_FRIENDS(TriMeshField);
private:
void _init();
protected:
ZLink<TriMesh> mMesh;
Int_t mNVerts;
Int_t mDim;
vector<Float_t> mField;
ZLink<RGBAPalette> mPalette;
TString mFormula;
Float_t mMinValue;
Float_t mMaxValue;
ZLink<ZGlass> mColorArraySource;
void check_min_max(Float_t v);
public:
TriMeshField(const Text_t* n="TriMeshField", const Text_t* t=0) :
ZGlass(n,t) { _init(); }
Float_t* FVec(Int_t i=0) { return &mField[i*mDim]; }
Float_t& F (Int_t i, Int_t j=0) { return mField[i*mDim + j]; }
Float_t& operator[](Int_t idx) { return mField[idx]; }
void Resize(Int_t nvert, Int_t dim=0);
void ResizeToMesh(Int_t dim=-1);
void SetField(Float_t c0);
void SetField(Float_t c0, Float_t c1);
void SetField(Float_t c0, Float_t c1, Float_t c2);
void FindMinMaxField();
void UpdateMinMaxField(set<Int_t> vertices);
void ApplyColors(Bool_t regen_tring_cols=true);
void PartiallyApplyColors(set<Int_t> vertices, Bool_t regen_tring_cols=true);
void FillByGaussBlobs(Bool_t reset_field=true, Int_t n_blobs=40,
Float_t A_min=5, Float_t A_max=20,
Float_t sigma_min=2, Float_t sigma_max=10,
Bool_t minmax_p=false, Bool_t recolor_p=false);
void Diffuse(Float_t diff_const=1, Float_t dt=0.1,
Bool_t limit_df=false, Bool_t recolor_p=false);
#include "TriMeshField.h7"
ClassDef(TriMeshField, 1);
};
inline void TriMeshField::check_min_max(Float_t v)
{
if (v < mMinValue)
mMinValue = v;
else if (v > mMaxValue)
mMaxValue = v;
}
#endif