ROOT logo
// $Id: TringuRep.cxx 2325 2010-01-07 22:45:36Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#include "TringuRep.h"
#include "Tringula.h"
#include "TSPupilInfo.h"
#include "TriMeshLightField.h"
#include <Glasses/RGBAPalette.h>
#include "TringuRep.c7"

#include "TriMesh.h"

#include <TMath.h>

// TringuRep

//______________________________________________________________________________
//
// bTringStrips - will only be used if TringTvor has them.

ClassImp(TringuRep);

//==============================================================================

void TringuRep::_init()
{
  // Override settings from ZGlass
  bUseDispList = true;

  bSmoothShading = false;
  bTringStrips   = false;

  mActionValue  = 1;
  mActionRadius = 1;
  mActionBorder = 0.5;

  bSprayDLWasOn = false;
}

TringuRep::TringuRep(const Text_t* n, const Text_t* t) :
  ZNode(n, t),
  mFieldMutex(GMutex::recursive)
{
  _init();
}

TringuRep::~TringuRep()
{}

//==============================================================================

void TringuRep::AssertVertexColorArray()
{
  static const Exc_t _eh("TringuRep::AssertVertexColorArray ");

  // If tringula is set, color arrays are initialized.
  assert_tringula(_eh);
}

UChar_t* TringuRep::GetVertexColorArray()
{
  return &mVertCols[0];
}

UChar_t* TringuRep::GetTriangleColorArray()
{
  return mTringCols.empty() ? 0 : &mTringCols[0];
}

void TringuRep::ColorArraysModified()
{
  StampReqTring(FID());
}

//==============================================================================

void TringuRep::SetTringula(Tringula* tring)
{
  static const Exc_t _eh("TringuRep::SetTringula ");

  if (!tring)
    throw _eh + "attempting to set to null.";

  set_link_or_die(mTringula.ref_link(), tring, FID());

  mTrans = tring->RefTrans();

  mVertCols.resize(4*tring->GetMesh()->GetTTvor()->mNVerts);

  update_triangle_color_array();
}

void TringuRep::SetField(TriMeshField* field)
{
  static const Exc_t _eh("TringuRep::SetField ");

  throw _eh + "should not be used -- call ActivateField() instead.";
}

void TringuRep::SetLightField(TriMeshLightField* lightfield)
{
  static const Exc_t _eh("TringuRep::SetLightField ");

  throw _eh + "should not be used -- call ActivateLightField() instead.";
}

void TringuRep::SetSmoothShading(Bool_t ss)
{
  bSmoothShading = ss;
  update_triangle_color_array();
  StampReqTring(FID());
}

void TringuRep::SwitchSmoothShading()
{
  SetSmoothShading(!bSmoothShading);
}

//==============================================================================

void TringuRep::update_triangle_color_array()
{
  if (bSmoothShading)
  {
    mTringCols.resize(0);
  }
  else
  {
    TringTvor &TT = * mTringula->GetMesh()->GetTTvor();
    if ((Int_t) mTringCols.size() != 4*TT.mNTrings)
      mTringCols.resize(4*TT.mNTrings);
    TT.GenerateTriangleColorsFromVertexColors(&mVertCols[0], &mTringCols[0]);
  }
}

void TringuRep::refresh_color_arrays()
{
  // Called after (de)activation of field or light-field.
  // Expects to run with mFieldMutex locked in a detached thread.

  if (*mField)
    mField->ApplyColors(*mLightField == 0);

  if (*mLightField)
    mLightField->ModulateColors(true);
}

void TringuRep::ActivateField(TriMeshField* field)
{
  // Set current field. This should be called via MIR and executed in a
  // detached thread as we also need to set the TriMeshColorArraySource of
  // previous and new field.

  static const Exc_t _eh("TringuRep::ActivateField ");

  suggest_MIR_presence(_eh, MC_IsDetached);

  GMutexHolder flck(mFieldMutex);

  TriMeshField *ex_field = *mField;

  if (field != ex_field)
  {
    if (ex_field)
    {
      GLensWriteHolder lck(ex_field);
      if (ex_field->GetColorArraySource() == this)
	ex_field->SetColorArraySource(0);
    }

    {
      GLensWriteHolder lck(this);
      set_link_or_die(mField.ref_link(), field, FID());
    }

    if (field)
    {
      GLensWriteHolder lck(field);
      field->SetColorArraySource(this);
    }
  }

  refresh_color_arrays();

  {
    GLensWriteHolder lck(this);
    mStampReqTring = Stamp(FID());
  }
}

void TringuRep::ActivateLightField(TriMeshLightField* lightfield)
{
  static const Exc_t _eh("TringuRep::ActivateLightField ");

  suggest_MIR_presence(_eh, MC_IsDetached);

  GMutexHolder flck(mFieldMutex);

  TriMeshField *ex_lightfield = *mLightField;

  if (lightfield != ex_lightfield)
  {
    if (ex_lightfield)
    {
      GLensWriteHolder lck(ex_lightfield);
      if (ex_lightfield->GetColorArraySource() == this)
	ex_lightfield->SetColorArraySource(0);
    }

    {
      GLensWriteHolder lck(this);
      set_link_or_die(mLightField.ref_link(), lightfield, FID());
    }

    if (lightfield)
    {
      GLensWriteHolder lck(lightfield);
      lightfield->SetColorArraySource(this);
    }
  }

  refresh_color_arrays();

  {
    GLensWriteHolder lck(this);
    mStampReqTring = Stamp(FID());
  }
}

void TringuRep::SwitchLightField(TriMeshLightField* lightfield)
{
  // Activate lightfield unless it is already active - then desactivate it.

  static const Exc_t _eh("TringuRep::ActivateLightField ");

  suggest_MIR_presence(_eh, MC_IsDetached);

  GMutexHolder flck(mFieldMutex);

  if (lightfield == *mLightField)
    ActivateLightField(0);
  else
    ActivateLightField(lightfield);
}

//==============================================================================

void TringuRep::ColorByTerrainProps(Int_t mode)
{
  // Colorize terrain mesh based on mode:
  // 0 - height
  // 1 - normal | up-vector

  static const Exc_t _eh("TringuCam::ColorByTerrainProps ");

  suggest_MIR_presence(_eh, MC_IsDetached);

  ActivateField(0);
  ActivateLightField(0);

  assert_palette(_eh);

  TriMesh* mesh = mTringula->GetMesh();
  switch (mode)
  {
    case 0:
      mesh->ColorByParaSurfCoord(*mPalette, this, 2);
      break;
    case 1:
      mesh->ColorByParaSurfNormal(*mPalette, this, 2, 0.3, 1);
      break;
    default:
      ISwarn(_eh + "Unsupported mode.");
  }
}


//==============================================================================
// Field adding / spraying
//==============================================================================

namespace
{
  struct FieldSprayer : public TriMesh::VertexVisitorMaxDist
  {
    TriMeshField *mField;
    Float_t       mValue;
    Float_t       mFullDist;
    Float_t       mFracFactor;

    FieldSprayer(TriMesh* m, const Float_t origin[3], Float_t max_dist,
		 Float_t full_dist, Float_t value, TriMeshField* field) :
      VertexVisitorMaxDist(m, origin, max_dist),
      mField      (field),
      mValue      (value),
      mFullDist   (full_dist),
      mFracFactor (1.0f / (max_dist - full_dist))
    {}
    virtual ~FieldSprayer() {}

    virtual Bool_t VisitVertex(Int_t vertex)
    {
      if (TriMesh::VertexVisitorMaxDist::VisitVertex(vertex))
      {
	Float_t dist   = TMath::Sqrt(mLastDistSqr);
	Float_t value  = mValue;
	if (dist > mFullDist)
	  value *= (1 - (dist - mFullDist))*mFracFactor;

	mField->F(vertex) += value;

	return kTRUE;
      }
      else
      {
	return kFALSE;
      }
    }

  };
}

void TringuRep::AddField(const Float_t point[3], Int_t vertex, Float_t factor)
{
  static const Exc_t _eh("TringuRep::AddField ");

  assert_field(_eh);

  TriMesh* mesh = mTringula->GetMesh();

  FieldSprayer sprayer(mesh, point, mActionRadius + mActionBorder,
                       mActionRadius, mActionValue*factor, *mField);
  set<Int_t>   vv, cv; // visited/changed vertices

  mesh->VisitVertices(vertex, sprayer, vv, cv);
  if (!cv.empty())
  {
    if (mLightField == 0)
    {
      mField->PartiallyApplyColors(cv, true);
    }
    else
    {
      mField->PartiallyApplyColors(cv, false);
      mLightField->PartiallyModulateColors(cv, true);
    }
  }
}

void TringuRep::BeginSprayField()
{
  if (bUseDispList)
  {
    bUseDispList  = false;
    bSprayDLWasOn = true;
  }

  StampReqTring(FID());
}

void TringuRep::EndSprayField()
{
  if (bSprayDLWasOn)
  {
    bUseDispList  = true;
    bSprayDLWasOn = false;
  }

  StampReqTring(FID());
}
 TringuRep.cxx:1
 TringuRep.cxx:2
 TringuRep.cxx:3
 TringuRep.cxx:4
 TringuRep.cxx:5
 TringuRep.cxx:6
 TringuRep.cxx:7
 TringuRep.cxx:8
 TringuRep.cxx:9
 TringuRep.cxx:10
 TringuRep.cxx:11
 TringuRep.cxx:12
 TringuRep.cxx:13
 TringuRep.cxx:14
 TringuRep.cxx:15
 TringuRep.cxx:16
 TringuRep.cxx:17
 TringuRep.cxx:18
 TringuRep.cxx:19
 TringuRep.cxx:20
 TringuRep.cxx:21
 TringuRep.cxx:22
 TringuRep.cxx:23
 TringuRep.cxx:24
 TringuRep.cxx:25
 TringuRep.cxx:26
 TringuRep.cxx:27
 TringuRep.cxx:28
 TringuRep.cxx:29
 TringuRep.cxx:30
 TringuRep.cxx:31
 TringuRep.cxx:32
 TringuRep.cxx:33
 TringuRep.cxx:34
 TringuRep.cxx:35
 TringuRep.cxx:36
 TringuRep.cxx:37
 TringuRep.cxx:38
 TringuRep.cxx:39
 TringuRep.cxx:40
 TringuRep.cxx:41
 TringuRep.cxx:42
 TringuRep.cxx:43
 TringuRep.cxx:44
 TringuRep.cxx:45
 TringuRep.cxx:46
 TringuRep.cxx:47
 TringuRep.cxx:48
 TringuRep.cxx:49
 TringuRep.cxx:50
 TringuRep.cxx:51
 TringuRep.cxx:52
 TringuRep.cxx:53
 TringuRep.cxx:54
 TringuRep.cxx:55
 TringuRep.cxx:56
 TringuRep.cxx:57
 TringuRep.cxx:58
 TringuRep.cxx:59
 TringuRep.cxx:60
 TringuRep.cxx:61
 TringuRep.cxx:62
 TringuRep.cxx:63
 TringuRep.cxx:64
 TringuRep.cxx:65
 TringuRep.cxx:66
 TringuRep.cxx:67
 TringuRep.cxx:68
 TringuRep.cxx:69
 TringuRep.cxx:70
 TringuRep.cxx:71
 TringuRep.cxx:72
 TringuRep.cxx:73
 TringuRep.cxx:74
 TringuRep.cxx:75
 TringuRep.cxx:76
 TringuRep.cxx:77
 TringuRep.cxx:78
 TringuRep.cxx:79
 TringuRep.cxx:80
 TringuRep.cxx:81
 TringuRep.cxx:82
 TringuRep.cxx:83
 TringuRep.cxx:84
 TringuRep.cxx:85
 TringuRep.cxx:86
 TringuRep.cxx:87
 TringuRep.cxx:88
 TringuRep.cxx:89
 TringuRep.cxx:90
 TringuRep.cxx:91
 TringuRep.cxx:92
 TringuRep.cxx:93
 TringuRep.cxx:94
 TringuRep.cxx:95
 TringuRep.cxx:96
 TringuRep.cxx:97
 TringuRep.cxx:98
 TringuRep.cxx:99
 TringuRep.cxx:100
 TringuRep.cxx:101
 TringuRep.cxx:102
 TringuRep.cxx:103
 TringuRep.cxx:104
 TringuRep.cxx:105
 TringuRep.cxx:106
 TringuRep.cxx:107
 TringuRep.cxx:108
 TringuRep.cxx:109
 TringuRep.cxx:110
 TringuRep.cxx:111
 TringuRep.cxx:112
 TringuRep.cxx:113
 TringuRep.cxx:114
 TringuRep.cxx:115
 TringuRep.cxx:116
 TringuRep.cxx:117
 TringuRep.cxx:118
 TringuRep.cxx:119
 TringuRep.cxx:120
 TringuRep.cxx:121
 TringuRep.cxx:122
 TringuRep.cxx:123
 TringuRep.cxx:124
 TringuRep.cxx:125
 TringuRep.cxx:126
 TringuRep.cxx:127
 TringuRep.cxx:128
 TringuRep.cxx:129
 TringuRep.cxx:130
 TringuRep.cxx:131
 TringuRep.cxx:132
 TringuRep.cxx:133
 TringuRep.cxx:134
 TringuRep.cxx:135
 TringuRep.cxx:136
 TringuRep.cxx:137
 TringuRep.cxx:138
 TringuRep.cxx:139
 TringuRep.cxx:140
 TringuRep.cxx:141
 TringuRep.cxx:142
 TringuRep.cxx:143
 TringuRep.cxx:144
 TringuRep.cxx:145
 TringuRep.cxx:146
 TringuRep.cxx:147
 TringuRep.cxx:148
 TringuRep.cxx:149
 TringuRep.cxx:150
 TringuRep.cxx:151
 TringuRep.cxx:152
 TringuRep.cxx:153
 TringuRep.cxx:154
 TringuRep.cxx:155
 TringuRep.cxx:156
 TringuRep.cxx:157
 TringuRep.cxx:158
 TringuRep.cxx:159
 TringuRep.cxx:160
 TringuRep.cxx:161
 TringuRep.cxx:162
 TringuRep.cxx:163
 TringuRep.cxx:164
 TringuRep.cxx:165
 TringuRep.cxx:166
 TringuRep.cxx:167
 TringuRep.cxx:168
 TringuRep.cxx:169
 TringuRep.cxx:170
 TringuRep.cxx:171
 TringuRep.cxx:172
 TringuRep.cxx:173
 TringuRep.cxx:174
 TringuRep.cxx:175
 TringuRep.cxx:176
 TringuRep.cxx:177
 TringuRep.cxx:178
 TringuRep.cxx:179
 TringuRep.cxx:180
 TringuRep.cxx:181
 TringuRep.cxx:182
 TringuRep.cxx:183
 TringuRep.cxx:184
 TringuRep.cxx:185
 TringuRep.cxx:186
 TringuRep.cxx:187
 TringuRep.cxx:188
 TringuRep.cxx:189
 TringuRep.cxx:190
 TringuRep.cxx:191
 TringuRep.cxx:192
 TringuRep.cxx:193
 TringuRep.cxx:194
 TringuRep.cxx:195
 TringuRep.cxx:196
 TringuRep.cxx:197
 TringuRep.cxx:198
 TringuRep.cxx:199
 TringuRep.cxx:200
 TringuRep.cxx:201
 TringuRep.cxx:202
 TringuRep.cxx:203
 TringuRep.cxx:204
 TringuRep.cxx:205
 TringuRep.cxx:206
 TringuRep.cxx:207
 TringuRep.cxx:208
 TringuRep.cxx:209
 TringuRep.cxx:210
 TringuRep.cxx:211
 TringuRep.cxx:212
 TringuRep.cxx:213
 TringuRep.cxx:214
 TringuRep.cxx:215
 TringuRep.cxx:216
 TringuRep.cxx:217
 TringuRep.cxx:218
 TringuRep.cxx:219
 TringuRep.cxx:220
 TringuRep.cxx:221
 TringuRep.cxx:222
 TringuRep.cxx:223
 TringuRep.cxx:224
 TringuRep.cxx:225
 TringuRep.cxx:226
 TringuRep.cxx:227
 TringuRep.cxx:228
 TringuRep.cxx:229
 TringuRep.cxx:230
 TringuRep.cxx:231
 TringuRep.cxx:232
 TringuRep.cxx:233
 TringuRep.cxx:234
 TringuRep.cxx:235
 TringuRep.cxx:236
 TringuRep.cxx:237
 TringuRep.cxx:238
 TringuRep.cxx:239
 TringuRep.cxx:240
 TringuRep.cxx:241
 TringuRep.cxx:242
 TringuRep.cxx:243
 TringuRep.cxx:244
 TringuRep.cxx:245
 TringuRep.cxx:246
 TringuRep.cxx:247
 TringuRep.cxx:248
 TringuRep.cxx:249
 TringuRep.cxx:250
 TringuRep.cxx:251
 TringuRep.cxx:252
 TringuRep.cxx:253
 TringuRep.cxx:254
 TringuRep.cxx:255
 TringuRep.cxx:256
 TringuRep.cxx:257
 TringuRep.cxx:258
 TringuRep.cxx:259
 TringuRep.cxx:260
 TringuRep.cxx:261
 TringuRep.cxx:262
 TringuRep.cxx:263
 TringuRep.cxx:264
 TringuRep.cxx:265
 TringuRep.cxx:266
 TringuRep.cxx:267
 TringuRep.cxx:268
 TringuRep.cxx:269
 TringuRep.cxx:270
 TringuRep.cxx:271
 TringuRep.cxx:272
 TringuRep.cxx:273
 TringuRep.cxx:274
 TringuRep.cxx:275
 TringuRep.cxx:276
 TringuRep.cxx:277
 TringuRep.cxx:278
 TringuRep.cxx:279
 TringuRep.cxx:280
 TringuRep.cxx:281
 TringuRep.cxx:282
 TringuRep.cxx:283
 TringuRep.cxx:284
 TringuRep.cxx:285
 TringuRep.cxx:286
 TringuRep.cxx:287
 TringuRep.cxx:288
 TringuRep.cxx:289
 TringuRep.cxx:290
 TringuRep.cxx:291
 TringuRep.cxx:292
 TringuRep.cxx:293
 TringuRep.cxx:294
 TringuRep.cxx:295
 TringuRep.cxx:296
 TringuRep.cxx:297
 TringuRep.cxx:298
 TringuRep.cxx:299
 TringuRep.cxx:300
 TringuRep.cxx:301
 TringuRep.cxx:302
 TringuRep.cxx:303
 TringuRep.cxx:304
 TringuRep.cxx:305
 TringuRep.cxx:306
 TringuRep.cxx:307
 TringuRep.cxx:308
 TringuRep.cxx:309
 TringuRep.cxx:310
 TringuRep.cxx:311
 TringuRep.cxx:312
 TringuRep.cxx:313
 TringuRep.cxx:314
 TringuRep.cxx:315
 TringuRep.cxx:316
 TringuRep.cxx:317
 TringuRep.cxx:318
 TringuRep.cxx:319
 TringuRep.cxx:320
 TringuRep.cxx:321
 TringuRep.cxx:322
 TringuRep.cxx:323
 TringuRep.cxx:324
 TringuRep.cxx:325
 TringuRep.cxx:326
 TringuRep.cxx:327
 TringuRep.cxx:328
 TringuRep.cxx:329
 TringuRep.cxx:330
 TringuRep.cxx:331
 TringuRep.cxx:332
 TringuRep.cxx:333
 TringuRep.cxx:334
 TringuRep.cxx:335
 TringuRep.cxx:336
 TringuRep.cxx:337
 TringuRep.cxx:338
 TringuRep.cxx:339
 TringuRep.cxx:340
 TringuRep.cxx:341
 TringuRep.cxx:342
 TringuRep.cxx:343
 TringuRep.cxx:344
 TringuRep.cxx:345
 TringuRep.cxx:346
 TringuRep.cxx:347
 TringuRep.cxx:348
 TringuRep.cxx:349
 TringuRep.cxx:350
 TringuRep.cxx:351
 TringuRep.cxx:352
 TringuRep.cxx:353
 TringuRep.cxx:354
 TringuRep.cxx:355
 TringuRep.cxx:356
 TringuRep.cxx:357
 TringuRep.cxx:358
 TringuRep.cxx:359
 TringuRep.cxx:360
 TringuRep.cxx:361
 TringuRep.cxx:362
 TringuRep.cxx:363
 TringuRep.cxx:364
 TringuRep.cxx:365
 TringuRep.cxx:366
 TringuRep.cxx:367
 TringuRep.cxx:368
 TringuRep.cxx:369
 TringuRep.cxx:370
 TringuRep.cxx:371
 TringuRep.cxx:372
 TringuRep.cxx:373