ROOT logo
// $Id: Tringula.h 2346 2010-01-30 20:03:24Z 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_Tringula_H
#define Var1_Tringula_H

#include <Glasses/ZNode.h>
#include <Stones/ZColor.h>
#include <Stones/TimeMakerClient.h>
#include <Eye/Ray.h>

#include <Opcode/Opcode.h>

#include <TRandom.h>

class ZHashList;
class ZVector;
class RectTerrain;
class TringTvor;
class TriMesh;
class ParaSurf;
class Extendio;
class Statico;
class Dynamico;
class Crawler;
class LandMark;
class Explosion;

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

public:
  enum PrivRayQN_e 
  {
    PRQN_offset = RayNS::RQN_user_0,
    PRQN_extendio_exploding, // followed by streamed ID of Extendio, Explosion
    PRQN_extendio_dying,     // followed by streamed ID of Extendio
    PRQN_extendio_sound      // followed by streamed ID of Extendio and TString naming the effect
  };

  enum EdgeRule_e { ER_Stop, ER_Hold, ER_Bounce, ER_Wrap };

  enum ColorSource_e
  {
    CS_XCoord, CS_YCoord, CS_ZCoord,
    // missing U,V,S Coord
    CS_XNorm,  CS_YNorm,  CS_ZNorm,
    // missing U,V,S Norm
    // fixed
    // external (defined by some function or vertex distribution)
    // shaded (ligt-source, ambient color/level),
  };

  struct PickResult
  {
    Extendio *fExtendio;
    Float_t   fTime;

    PickResult(Extendio* ext, Float_t t) : fExtendio(ext), fTime(t) {}

    bool operator<(const PickResult& o) { return fTime < o.fTime; }
  };

  typedef list<PickResult>           lPickResult_t;
  typedef list<PickResult>::iterator lPickResult_i;

private:
  void _init();

protected:
  ZLink<ParaSurf>    mParaSurf;     //  X{GS} L{aA}
  ZLink<TriMesh>     mMesh;         //  X{GS} L{aA}
  ZColor             mColor;        //  X{GSPRT} 7 ColorButt()
  Float_t            mMaxFlyerH;    //  X{GS}   7 Value(-const=>1,-join=>1)
  Float_t            mMaxCameraH;   //  X{GS}   7 Value()

  ZLink<ZHashList>   mStatos;       //  X{GS} L{} RnrBits{0,0,0,5}
  ZLink<ZHashList>   mDynos;        //  X{GS} L{} RnrBits{0,0,0,5}
  ZLink<ZHashList>   mFlyers;       //  X{GS} L{} RnrBits{0,0,0,5}
  ZLink<ZHashList>   mLandMarks;    //  X{GS} L{} RnrBits{0,0,0,5}
  ZLink<ZHashList>   mTubes;        //  X{GS} L{} RnrBits{0,0,0,5}

  ZLink<ZHashList>   mExplodios;    //  X{GS} L{} RnrBits{0,0,0,5}
  ZLink<ZHashList>   mExplosions;   //  X{GS} L{} RnrBits{0,0,0,5}

  GMutex             mExplosionMutex;             //!
  lpZGlass_t         mFreshExplodingExtendios;    //!
  lpZGlass_t         mFinishedExtendioExplosions; //!
  lpZGlass_t         mFreshExplosions;            //!
  lpZGlass_t         mFinishedExplosions;         //!

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

  EdgeRule_e       mEdgeRule;    //  X{GS} 7 PhonyEnum()

  TRandom          mRndGen;

  ZLink<TriMesh>   mDefStaMesh;  // X{GS} L{}
  ZLink<TriMesh>   mDefDynMesh;  // X{GS} L{}
  ZLink<TriMesh>   mDefFlyMesh;  // X{GS} L{}
  ZLink<TriMesh>   mDefChopMesh; // X{GS} L{}

  Opcode::BipartiteBoxPruner*  mBoxPruner;  //!
  // List-time-stamps for pruning sources.
  TimeStamp_t                  mStatosLTS;  //!
  TimeStamp_t                  mDynosLTS;   //!
  TimeStamp_t                  mFlyersLTS;  //!

  void handle_edge_crossing(Dynamico& D,
                            Opcode::Point& old_pos, Opcode::Point& pos,
                            Int_t plane, Float_t dist);

  Bool_t terrain_height(const Opcode::Point& pos, Float_t& point_h, Float_t& terrain_h);

  Bool_t place_on_terrain(Statico* S, TriMesh* M, Bool_t check_inside,
                          Float_t min_h_above=0);
  Bool_t place_on_terrain(Dynamico* D, Float_t h_above);

  void fill_pruning_list(AList* extendios, Int_t& n, const Opcode::AABB** boxes, void** user_data);
  void fill_pruning_list(AList* extendios, Int_t& n, Int_t l);
  void setup_box_pruner();
  void setup_stato_pruner();
  void setup_dyno_pruner();

  void prepick_extendios(AList* extendios, const Opcode::Ray& ray, Float_t ray_length,
                         lPickResult_t& candidates);

  void delete_lens_if_alive(ZGlass* lens);

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

  virtual void AdEnlightenment();

  // Collision stuff

  Bool_t    RayCollide(const Opcode::Ray& ray, Float_t ray_length,
		       Bool_t cull_p, Bool_t closest_p,
		       Opcode::CollisionFaces& col_faces);

  Float_t   RayCollideClosestHit(const Opcode::Ray& ray, Bool_t cull_p);

  Extendio* PickExtendios(const Opcode::Ray& ray, Float_t ray_length,
			  Float_t* ext_distance = 0);

  void      ResetCollisionStuff(); // X{ED} C{0} 7 MButt()

  Float_t   PlaceAboveTerrain(ZTrans& trans, Float_t height=0, Float_t dh_fac=0);

  Statico* NewStatico(const Text_t* sname=0);
  Statico* RandomStatico(ZVector* mesh_list,
                         Bool_t check_inside=true,
                         Int_t  max_tries   =1000);             // X{E} C{1} 7 MCWButt()

  void      RegisterCrawler(Crawler* d);
  Crawler*  NewDynamico(const Text_t* dname=0);
  Crawler*  RandomDynamico(ZVector* mesh_list,
                           Float_t v_min=-1, Float_t v_max=5,
                           Float_t w_max= 1);                      // X{E} C{1} 7 MCWButt()
  Dynamico* RandomAirplane(Float_t v_min= 2, Float_t v_max=20,
                           Float_t w_max= 1,
                           Float_t h_min_fac=0.3,
                           Float_t h_max_fac=1);                   // X{E} 7 MCWButt()
  Dynamico* RandomChopper (Float_t v_min= 2, Float_t v_max=20,
                           Float_t w_max= 1,
                           Float_t h_min_fac=0.1,
                           Float_t h_max_fac=0.5);                 // X{E} 7 MCWButt()

  LandMark* AddLandMark(TriMesh* mesh, const Float_t* pos);

  Bool_t CheckBoundaries(Dynamico* dyno, Float_t& safety);

  void DoFullBoxPrunning(vector<Opcode::Segment>& its_lines,
			 Bool_t accumulate=false, Bool_t verbose=false);

  void DoSplitBoxPrunning(); // X{E} 7 MCWButt()

  void ExtendioExploding(Extendio* ext);
  void ExtendioExplosionFinished(Explosion* exp);
  void ExplosionStarted(Explosion* exp);
  void ExplosionFinished(Explosion* exp);

  void LaserShot(Extendio* ext, const Opcode::Ray& ray, Float_t power);

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

  // Private Rays
  void EmitExtendioExplodingRay(Extendio* ext, Explosion* exp);
  void EmitExtendioDyingRay(Extendio* ext);
  void EmitExtendioSoundRay(Extendio* ext, const TString& effect);

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

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