ROOT logo
// $Id: TringuCam.h 2363 2010-04-06 20:49:16Z 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/.

#ifndef Var1_TringuCam_H
#define Var1_TringuCam_H

#include <Glasses/ZNode.h>
#include <Glasses/Tringula.h>
#include <Stones/TimeMakerClient.h>
#include <Gled/GTime.h>

#include <RnrBase/A_Rnr.h>
#include <Opcode/Opcode.h>

class WSTube;
class ScreenText;
class WGlWidget;

class TringuRep;
class TSPupilInfo;

class Eventor;
class TimeMaker;

class TringuCam : public ZNode,
		  public TimeMakerClient
{
  MAC_RNR_FRIENDS(TringuCam);

protected:
  //=================================================================
  // Top-level-stuff
  //=================================================================

  Bool_t        bKeysVerbose;  // X{GS} 7 Bool(-join=>1)
  Bool_t        bMouseVerbose; // X{GS} 7 Bool()

  //=================================================================
  // Key-handling stuff.
  //=================================================================

public:

  struct ValueInfo;

  struct KeyInfo
  {
    ValueInfo* fValueInfo;
    Bool_t     fIsInc;

    Bool_t  fIsDown;
    Float_t fDesiredValue; // Always positive.
    Float_t fDecayTimeout;

    KeyInfo(ValueInfo* val_info, Bool_t is_inc) :
      fValueInfo(val_info), fIsInc(is_inc),
      fIsDown(false), fDesiredValue(0), fDecayTimeout(0) {}
  };

  struct KeyValueChangeParams
  {
    Float_t fValueAccel;
    Float_t fValueAccelDeltaFactor;
    Float_t fValueDecay;
    Float_t fValueDecayDeltaFactor;
    Float_t fValueDecayTimeout;

    Float_t fDesireIncStep;
    Float_t fDesireIncDeltaFactor; // This should really link to number of keydowns / pressure if had key-velocity info
    Float_t fDesireDecay;
    Float_t fDesireDecayDeltaFactor;
    Float_t fDesireDecayTimeout;

    void SetValueParams(Float_t acc,   Float_t acc_df,
                        Float_t decay, Float_t decay_df,
                        Float_t decay_to)
    {
      fValueAccel = acc;   fValueAccelDeltaFactor = acc_df;
      fValueDecay = decay; fValueDecayDeltaFactor = decay_df;
      fValueDecayTimeout = decay_to;
    }
    void SetDesireParams(Float_t inc_step, Float_t inc_df,
                         Float_t decay,    Float_t decay_df,
                         Float_t decay_to)
    {
      fDesireIncStep = inc_step; fDesireIncDeltaFactor   = inc_df;
      fDesireDecay   = decay;    fDesireDecayDeltaFactor = decay_df;
      fDesireDecayTimeout = decay_to;
    }
  };

  struct ValueInfo
  {
    KeyValueChangeParams* fChangeParams;

    Float_t fValue;
    Float_t fMinValue, fMaxValue;
    Float_t fDecayTimeout;
    KeyInfo fIncKey;
    KeyInfo fDecKey;
    Bool_t  fSustain;
    Bool_t  fSustainSet;
    Float_t fSustainDesire;

    ValueInfo(KeyValueChangeParams* chg_prm=0) :
      fChangeParams(chg_prm),
      fValue(0), fDecayTimeout(0),
      fIncKey(this, true), fDecKey(this, false),
      fSustain(false), fSustainDesire(0)
    {}

    void SetMinMax(Float_t min, Float_t max) { fMinValue = min; fMaxValue = max; }

    void IncValue(Float_t& value, Float_t desire, Float_t step, Float_t delta_fac);
    void DecValue(Float_t& value, Float_t desire, Float_t step, Float_t delta_fac);

    void DecayValue(Float_t& value, Float_t decay, Float_t delta_fac=0);

    void DecayTimeoutOrValue(Float_t& timeout, Float_t& value, Float_t dt,
                             Float_t decay, Float_t delta_fac);

    void ApproachValue(Float_t& value, Float_t desire,
		       Float_t inc_step, Float_t inc_delta_fac,
		       Float_t dec_step, Float_t dec_delta_fac);

    void TimeTick(Float_t dt);
  };

private:
  void _init();

protected:
  KeyValueChangeParams mChgParCameraMove;
  KeyValueChangeParams mChgParCameraRotate;

  ValueInfo mFwdBck;
  ValueInfo mLftRgt;
  ValueInfo mUpDown;

  ValueInfo mSpinUp; // Spin about parent's up axis

  map<Int_t, KeyInfo*> mKeyStateMap;

  ZLink<ScreenText>  mInfoTxt;   // X{GS} L{}


  //=================================================================
  // Mouse-handling stuff.
  //=================================================================

public:
  // On mouse-1 we do:
  enum MouseAction_e { MA_Nothing, MA_RayCollide, MA_AddField, MA_SprayField,
                       MA_AddSource,
                       MA_PickExtendios,
		       MA_NewLandMark
  };

  enum ExpectBeta_e { EB_Nothing, EB_ConnectStaticos };

protected:
  MouseAction_e mMouseAction;   // X{GS} 7 PhonyEnum()
  MouseAction_e mPrevAction;    //!
  ExpectBeta_e  mExpectBeta;    // X{G}  7 PhonyEnum(-const=>1)
  Float_t       mRayLength;     // X{GS} 7 Value(-range=>[   0, 1000, 1,100])

  Bool_t        bMouseDown;

  //=================================================================
  // Other stuff.
  //=================================================================

  ZLink<Tringula>          mTringula;    // X{GS} L{a}

  ZLink<TringuRep>         mTringuRep;   // X{GS} L{a}

  ZLink<TSPupilInfo>       mPupilInfo;   // X{GS} L{a}

  ZLink<Eventor>           mEventor;     // X{GS} L{a}
  ZLink<TimeMaker>         mTimeMaker;   // X{GS} L{a}

  ZLink<ZGlass>            mPrepBeta;    // X{GS} L{a}

  Int_t     mStampInterval;     //  X{GS} 7 Value(-range=>[0,1000])
  Int_t     mStampCount;        //!
  Double_t  mHeight;            //  Height above tringula. X{GS} 7 Value(-range=>[-1e5, 1e5, 1, 100])

  ZPoint    mMouseRayPos;
  ZPoint    mMouseRayDir;

  Opcode::RayCollider    mRayColl;    //!
  Opcode::CollisionFaces mCollFaces;  //!
  Opcode::CollisionFace  mCollFace;   //!
  Opcode::Point          mCollPoint;  //!
  Int_t                  mCollVertex; //! Closest vertex, -1 if no collision.

  TString                mGradName;   //! Current gradient for connect - hack.

  WSTube* make_tube(Statico* stato0, Statico* stato1, const TString& grad_name);

public:
  TringuCam(const Text_t* n="TringuCam", const Text_t* t=0) :
    ZNode(n,t) { _init(); }

  KeyInfo* FindKeyInfo(Int_t key);
  Int_t KeyDown(Int_t key);
  Int_t KeyUp(Int_t key);

  void MouseDown(A_Rnr::Fl_Event& ev);
  void MouseUp();

  void CalculateMouseRayVectors();
  void MouseRayCollide();

  void AddField(Float_t val);

  // TimeMakerClient
  virtual void TimeTick(Double_t t, Double_t dt);

  // Overlay methods

  void ExtendioDetails(Extendio* ext); // X{E} C{1} 7 MCWButt()
  void ExtendioExplode(Extendio* ext); // X{E} C{1} 7 MCWButt()

  void PrepConnectStatos(Statico* stato, Int_t id, const TString& grad); // X{E} C{1} 7 MCWButt()

  void Suspend(); // X{E}
  void Resume();  // X{E}

  void Help(); // X{E}

  // --- Test Menu Functions ---

  void RandomStatico(); // X{E}
  void MakeLandMark();  // X{E}

#include "TringuCam.h7"
  ClassDef(TringuCam, 1);
}; // endclass TringuCam

#endif
 TringuCam.h:1
 TringuCam.h:2
 TringuCam.h:3
 TringuCam.h:4
 TringuCam.h:5
 TringuCam.h:6
 TringuCam.h:7
 TringuCam.h:8
 TringuCam.h:9
 TringuCam.h:10
 TringuCam.h:11
 TringuCam.h:12
 TringuCam.h:13
 TringuCam.h:14
 TringuCam.h:15
 TringuCam.h:16
 TringuCam.h:17
 TringuCam.h:18
 TringuCam.h:19
 TringuCam.h:20
 TringuCam.h:21
 TringuCam.h:22
 TringuCam.h:23
 TringuCam.h:24
 TringuCam.h:25
 TringuCam.h:26
 TringuCam.h:27
 TringuCam.h:28
 TringuCam.h:29
 TringuCam.h:30
 TringuCam.h:31
 TringuCam.h:32
 TringuCam.h:33
 TringuCam.h:34
 TringuCam.h:35
 TringuCam.h:36
 TringuCam.h:37
 TringuCam.h:38
 TringuCam.h:39
 TringuCam.h:40
 TringuCam.h:41
 TringuCam.h:42
 TringuCam.h:43
 TringuCam.h:44
 TringuCam.h:45
 TringuCam.h:46
 TringuCam.h:47
 TringuCam.h:48
 TringuCam.h:49
 TringuCam.h:50
 TringuCam.h:51
 TringuCam.h:52
 TringuCam.h:53
 TringuCam.h:54
 TringuCam.h:55
 TringuCam.h:56
 TringuCam.h:57
 TringuCam.h:58
 TringuCam.h:59
 TringuCam.h:60
 TringuCam.h:61
 TringuCam.h:62
 TringuCam.h:63
 TringuCam.h:64
 TringuCam.h:65
 TringuCam.h:66
 TringuCam.h:67
 TringuCam.h:68
 TringuCam.h:69
 TringuCam.h:70
 TringuCam.h:71
 TringuCam.h:72
 TringuCam.h:73
 TringuCam.h:74
 TringuCam.h:75
 TringuCam.h:76
 TringuCam.h:77
 TringuCam.h:78
 TringuCam.h:79
 TringuCam.h:80
 TringuCam.h:81
 TringuCam.h:82
 TringuCam.h:83
 TringuCam.h:84
 TringuCam.h:85
 TringuCam.h:86
 TringuCam.h:87
 TringuCam.h:88
 TringuCam.h:89
 TringuCam.h:90
 TringuCam.h:91
 TringuCam.h:92
 TringuCam.h:93
 TringuCam.h:94
 TringuCam.h:95
 TringuCam.h:96
 TringuCam.h:97
 TringuCam.h:98
 TringuCam.h:99
 TringuCam.h:100
 TringuCam.h:101
 TringuCam.h:102
 TringuCam.h:103
 TringuCam.h:104
 TringuCam.h:105
 TringuCam.h:106
 TringuCam.h:107
 TringuCam.h:108
 TringuCam.h:109
 TringuCam.h:110
 TringuCam.h:111
 TringuCam.h:112
 TringuCam.h:113
 TringuCam.h:114
 TringuCam.h:115
 TringuCam.h:116
 TringuCam.h:117
 TringuCam.h:118
 TringuCam.h:119
 TringuCam.h:120
 TringuCam.h:121
 TringuCam.h:122
 TringuCam.h:123
 TringuCam.h:124
 TringuCam.h:125
 TringuCam.h:126
 TringuCam.h:127
 TringuCam.h:128
 TringuCam.h:129
 TringuCam.h:130
 TringuCam.h:131
 TringuCam.h:132
 TringuCam.h:133
 TringuCam.h:134
 TringuCam.h:135
 TringuCam.h:136
 TringuCam.h:137
 TringuCam.h:138
 TringuCam.h:139
 TringuCam.h:140
 TringuCam.h:141
 TringuCam.h:142
 TringuCam.h:143
 TringuCam.h:144
 TringuCam.h:145
 TringuCam.h:146
 TringuCam.h:147
 TringuCam.h:148
 TringuCam.h:149
 TringuCam.h:150
 TringuCam.h:151
 TringuCam.h:152
 TringuCam.h:153
 TringuCam.h:154
 TringuCam.h:155
 TringuCam.h:156
 TringuCam.h:157
 TringuCam.h:158
 TringuCam.h:159
 TringuCam.h:160
 TringuCam.h:161
 TringuCam.h:162
 TringuCam.h:163
 TringuCam.h:164
 TringuCam.h:165
 TringuCam.h:166
 TringuCam.h:167
 TringuCam.h:168
 TringuCam.h:169
 TringuCam.h:170
 TringuCam.h:171
 TringuCam.h:172
 TringuCam.h:173
 TringuCam.h:174
 TringuCam.h:175
 TringuCam.h:176
 TringuCam.h:177
 TringuCam.h:178
 TringuCam.h:179
 TringuCam.h:180
 TringuCam.h:181
 TringuCam.h:182
 TringuCam.h:183
 TringuCam.h:184
 TringuCam.h:185
 TringuCam.h:186
 TringuCam.h:187
 TringuCam.h:188
 TringuCam.h:189
 TringuCam.h:190
 TringuCam.h:191
 TringuCam.h:192
 TringuCam.h:193
 TringuCam.h:194
 TringuCam.h:195
 TringuCam.h:196
 TringuCam.h:197
 TringuCam.h:198
 TringuCam.h:199
 TringuCam.h:200
 TringuCam.h:201
 TringuCam.h:202
 TringuCam.h:203
 TringuCam.h:204
 TringuCam.h:205
 TringuCam.h:206
 TringuCam.h:207
 TringuCam.h:208
 TringuCam.h:209
 TringuCam.h:210
 TringuCam.h:211
 TringuCam.h:212
 TringuCam.h:213
 TringuCam.h:214
 TringuCam.h:215
 TringuCam.h:216
 TringuCam.h:217
 TringuCam.h:218
 TringuCam.h:219
 TringuCam.h:220
 TringuCam.h:221
 TringuCam.h:222
 TringuCam.h:223
 TringuCam.h:224
 TringuCam.h:225
 TringuCam.h:226
 TringuCam.h:227
 TringuCam.h:228
 TringuCam.h:229
 TringuCam.h:230
 TringuCam.h:231
 TringuCam.h:232
 TringuCam.h:233
 TringuCam.h:234
 TringuCam.h:235
 TringuCam.h:236
 TringuCam.h:237
 TringuCam.h:238
 TringuCam.h:239
 TringuCam.h:240
 TringuCam.h:241
 TringuCam.h:242
 TringuCam.h:243
 TringuCam.h:244