ROOT logo
// $Id: Extendio.h 2379 2010-05-26 20:38:45Z 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_Extendio_H
#define Var1_Extendio_H

#include <Glasses/ZGlass.h>
#include <Glasses/TriMesh.h>
#include <Stones/SVars.h>
#include <Stones/HTrans.h>
#include <Stones/TimeMakerClient.h>
#include <Stones/ZColor.h>

#include <Opcode/Opcode.h>

class TringTvor;
class Tringula;

class Extendio : public ZGlass,
                 public TimeMakerClient
{
  MAC_RNR_FRIENDS(Extendio);

public:
  enum DebugBits_e
  {
    DB_GravData = 1
  };

  class CollisionSegments : public vector<Opcode::Segment>
  {
  private:
    Opcode::Point           mCenter;

  protected:
    void calculate_center();

  public:
    CollisionSegments() { InvalidateDerivedQuantities(); }

    void Clear() { clear(); InvalidateDerivedQuantities(); }

    // Call if derived quantities have been used and new segments are
    // added afterwards.
    void InvalidateDerivedQuantities() { mCenter.SetNotUsed(); }

    const Opcode::Point& RefCenter()
    { if (mCenter.IsNotUsed()) calculate_center(); return mCenter; }
  };

private:
  void _init();

protected:
  Tringula       *mTringula;     //! X{g}

  ZLink<TriMesh>  mMesh;         //  X{GS} L{}
  ZLink<ZImage>   mTexture;      //  X{GS} L{} RnrBits{4,0,5,0}

  ZColor          mColor;        //  X{GSPR} 7 ColorButt()

  SMinMaxVarF     mHitPoints;    //  X{G} 7 ValOut()
  Bool_t          bExploding;    //  X{G} 7 BoolOut()

  HTransF         mTrans;        //  Transform from current master
  Opcode::AABB    mAABB;         //! Enclosing bbox in parent frame
  HTransF*        mLastTransPtr; //!
  Opcode::AABB*   mLastAABBPtr;  //!

  UChar_t         mDebugBits;    //!

public:
  Extendio(const Text_t* n="Extendio", const Text_t* t=0);
  virtual ~Extendio();

  virtual void SetTringula(Tringula* tring);

  virtual void TakeDamage(Float_t damage);

  const HTransF&        RefTrans()     const { return  mTrans; }
  const HTransF&        RefLastTrans() const { return *mLastTransPtr; }
  const Opcode::AABB&   RefAABB()      const { return  mAABB; }
  const Opcode::AABB&   RefLastAABB()  const { return *mLastAABBPtr; }

  HTransF&        ref_trans()       { return  mTrans; }        // Use wisely.
  HTransF&        ref_last_trans()  { return *mLastTransPtr; } // Use wisely.
  Opcode::AABB&   ref_aabb()        { return  mAABB; }
  Opcode::AABB&   ref_last_aabb()   { return *mLastAABBPtr; }

  Opcode::Point&  ref_pos()         { return * (Opcode::Point*) mTrans.PtrPos(); }

  void            update_aabb()     { mMesh->ref_mesh_bbox().Rotate(mTrans, mAABB); }

  virtual void update_last_data() {}

  Opcode::Model*          get_opc_model()   { return mMesh->GetOPCModel();  }
  Opcode::MeshInterface*  get_opc_mesh_if() { return mMesh->GetOPCMeshIf(); }

  TringTvor*              get_tring_tvor()  { return mMesh->GetTTvor(); }

  // --- Debug bits ---

  Bool_t GetDebugBit(DebugBits_e b) const { return TESTBIT(mDebugBits, b); }
  void   SetDebugBit(DebugBits_e b)       { SETBIT(mDebugBits, b); }
  void   ClearDebugBit(DebugBits_e b)     { CLRBIT(mDebugBits, b); }

  // --- Intersection utilities ---

  Float_t height_above_terrain(const Opcode::Point& down_dir);
  Int_t   collide_with_tringula(CollisionSegments& segments);

  static bool intersect_triangle(TringTvor* TT0, TringTvor* TT1,
                                 HTransF  & HT0, HTransF  & HT1,
                                 Int_t    tidx0, Int_t     tidx1,
                                 Opcode::Segment& segment,
                                 const Text_t* debug_prefix=0);

  static int  intersect_extendios(Extendio* ext0, Extendio* ext1,
                                  Opcode::AABBTreeCollider& collider,
                                  vector<Opcode::Segment> & segments,
                                  const Text_t* debug_prefix=0);

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

#endif
 Extendio.h:1
 Extendio.h:2
 Extendio.h:3
 Extendio.h:4
 Extendio.h:5
 Extendio.h:6
 Extendio.h:7
 Extendio.h:8
 Extendio.h:9
 Extendio.h:10
 Extendio.h:11
 Extendio.h:12
 Extendio.h:13
 Extendio.h:14
 Extendio.h:15
 Extendio.h:16
 Extendio.h:17
 Extendio.h:18
 Extendio.h:19
 Extendio.h:20
 Extendio.h:21
 Extendio.h:22
 Extendio.h:23
 Extendio.h:24
 Extendio.h:25
 Extendio.h:26
 Extendio.h:27
 Extendio.h:28
 Extendio.h:29
 Extendio.h:30
 Extendio.h:31
 Extendio.h:32
 Extendio.h:33
 Extendio.h:34
 Extendio.h:35
 Extendio.h:36
 Extendio.h:37
 Extendio.h:38
 Extendio.h:39
 Extendio.h:40
 Extendio.h:41
 Extendio.h:42
 Extendio.h:43
 Extendio.h:44
 Extendio.h:45
 Extendio.h:46
 Extendio.h:47
 Extendio.h:48
 Extendio.h:49
 Extendio.h:50
 Extendio.h:51
 Extendio.h:52
 Extendio.h:53
 Extendio.h:54
 Extendio.h:55
 Extendio.h:56
 Extendio.h:57
 Extendio.h:58
 Extendio.h:59
 Extendio.h:60
 Extendio.h:61
 Extendio.h:62
 Extendio.h:63
 Extendio.h:64
 Extendio.h:65
 Extendio.h:66
 Extendio.h:67
 Extendio.h:68
 Extendio.h:69
 Extendio.h:70
 Extendio.h:71
 Extendio.h:72
 Extendio.h:73
 Extendio.h:74
 Extendio.h:75
 Extendio.h:76
 Extendio.h:77
 Extendio.h:78
 Extendio.h:79
 Extendio.h:80
 Extendio.h:81
 Extendio.h:82
 Extendio.h:83
 Extendio.h:84
 Extendio.h:85
 Extendio.h:86
 Extendio.h:87
 Extendio.h:88
 Extendio.h:89
 Extendio.h:90
 Extendio.h:91
 Extendio.h:92
 Extendio.h:93
 Extendio.h:94
 Extendio.h:95
 Extendio.h:96
 Extendio.h:97
 Extendio.h:98
 Extendio.h:99
 Extendio.h:100
 Extendio.h:101
 Extendio.h:102
 Extendio.h:103
 Extendio.h:104
 Extendio.h:105
 Extendio.h:106
 Extendio.h:107
 Extendio.h:108
 Extendio.h:109
 Extendio.h:110
 Extendio.h:111
 Extendio.h:112
 Extendio.h:113
 Extendio.h:114
 Extendio.h:115
 Extendio.h:116
 Extendio.h:117
 Extendio.h:118
 Extendio.h:119
 Extendio.h:120
 Extendio.h:121
 Extendio.h:122
 Extendio.h:123
 Extendio.h:124
 Extendio.h:125
 Extendio.h:126
 Extendio.h:127
 Extendio.h:128
 Extendio.h:129
 Extendio.h:130