00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef ArmageTron_WALL_H
00029 #define ArmageTron_WALL_H
00030
00031
00032 #include "tHeap.h"
00033 #include "eCoord.h"
00034
00035 class eHalfEdge;
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055 class eWall;
00056 class eWallHolder;
00057 class eGameObject;
00058 class eCamera;
00059 class eGrid;
00060
00061 class eWallView:public tHeapElement{
00062 friend class eWall;
00063 protected:
00064 virtual tHeapBase *Heap() const;
00065
00066 #ifdef CAUTION_WALL
00067 eWall *wall;
00068 #endif
00069
00070 int viewer;
00071 public:
00072 eWallView(){}
00073 ~eWallView();
00074
00075 void Set(int view,eWall *mw){
00076 viewer=view;
00077 #ifdef CAUTION_WALL
00078 wall=mw;
00079 #endif
00080 }
00081
00082 REAL Value(){return tHeapElement::Val();}
00083 void SetValue(REAL v);
00084
00085 eWall *Belongs();
00086
00087 };
00088
00089 class eWall: public tReferencable< eWall >{
00090 friend class tReferencable< eWall >;
00091
00092
00093 friend class eWallView;
00094 friend class eWallHolder;
00095
00096 eWallView view[MAX_VIEWERS];
00097 protected:
00098 tCHECKED_PTR(eWallHolder) holder_;
00099 tJUST_CONTROLLED_PTR<eGrid> grid;
00100 REAL len;
00101 int flipped;
00102 public:
00103 int id;
00104
00105 eWall(eGrid *grid);
00106
00107
00108
00109
00110
00111
00112
00113 eHalfEdge* Edge()const;
00114
00115 REAL Len() const {return len;}
00116
00117 void CalcLen();
00118
00119 const eCoord& EndPoint(int i) const;
00120
00121 eCoord Point( REAL a ) const;
00122
00123 eCoord Vec() const;
00124
00125
00126 virtual void Flip(){flipped = 1-flipped;}
00127
00128
00129 virtual bool Splittable() const;
00130
00131
00132 virtual bool Deletable() const;
00133
00134
00135 virtual void Split(eWall *& w1,eWall *& w2,REAL a);
00136
00137
00138 void SplitComplete(eWall *& w1,eWall *& w2,REAL a);
00139
00140
00141 virtual bool Massive() const{return true;}
00142
00143
00144 virtual void PassingGameObject(eGameObject *pass,REAL time,REAL pos,int recursion=1);
00145
00146
00147 virtual void SplitByActive( eWall * oldWall );
00148
00149
00150 virtual void SplitByPassive( eWall * newWall );
00151
00152
00153 virtual bool RunsParallelActive( eWall * oldWall );
00154
00155
00156 virtual bool RunsParallelPassive( eWall * newWall );
00157 #ifndef DEDICATED
00158
00159
00160
00161 virtual void Render(const eCamera *cam){};
00162 #endif
00163
00164
00165 virtual REAL Height() const{return 1;}
00166 virtual REAL BlockHeight() const{return 1;}
00167 virtual REAL SeeHeight() const{return 1;}
00168
00169 inline void BlocksCamera( eCamera * cam, REAL height ) const;
00170
00171 void Insert();
00172 void Remove();
00173
00174 void SetVisHeight(int v,REAL h);
00175
00176 protected:
00177
00178 virtual void OnBlocksCamera( eCamera * cam, REAL height ) const;
00179
00180 virtual ~eWall();
00181 private:
00182 };
00183
00184 class eWallHolder
00185 {
00186 friend class eWall;
00187 public:
00188 void SetWall( eWall* wall );
00189 eWall* GetWall( void ) const;
00190
00191 protected:
00192 eWallHolder();
00193 ~eWallHolder();
00194
00195 private:
00196 tCONTROLLED_PTR( eWall ) wall_;
00197 };
00198
00199
00200 extern tHeap<eWallView> se_wallsVisible[MAX_VIEWERS];
00201
00202
00203
00204
00205
00206
00211
00212
00213 void eWall::BlocksCamera( eCamera * cam, REAL height ) const
00214 {
00215 OnBlocksCamera( cam, height );
00216 }
00217
00218 #endif
00219