| 1 |
#ifndef CRAILWAY_H_INCLUDED |
| 2 |
#define CRAILWAY_H_INCLUDED |
| 3 |
|
| 4 |
#include "CLine.h" |
| 5 |
#include "CTrainSetBuffer.h" |
| 6 |
#include "CRailLink.h" |
| 7 |
|
| 8 |
class CRailTraceCurve; |
| 9 |
class CRailLinkTemp; |
| 10 |
class CPier; |
| 11 |
class CPlatformInst; |
| 12 |
class CScene; |
| 13 |
class CRailPlugin; |
| 14 |
class CTiePlugin; |
| 15 |
class CGirderPlugin; |
| 16 |
class CPierPlugin; |
| 17 |
class CLinePlugin; |
| 18 |
class CPolePlugin; |
| 19 |
class CDetectInfo; |
| 20 |
class CRailWayParentLink; |
| 21 |
|
| 22 |
/* |
| 23 |
* 橋脚位置データ |
| 24 |
*/ |
| 25 |
class CPierPos{ |
| 26 |
public: |
| 27 |
float m_Pos; // 位置 |
| 28 |
CPier *m_Link; // 架線柱 |
| 29 |
public: |
| 30 |
CPierPos(){ m_Pos = 0.0f; m_Link = NULL; } |
| 31 |
CPierPos(float p, CPier *l){ m_Pos = p; m_Link = l; } |
| 32 |
bool operator<(const CPierPos &rhs){ return m_Pos<rhs.m_Pos; } |
| 33 |
void RestoreAddress(); |
| 34 |
char *Read(char *); |
| 35 |
void Save(FILE *); |
| 36 |
}; |
| 37 |
|
| 38 |
// 反復子 |
| 39 |
typedef list<CPierPos>::iterator IPierPos; |
| 40 |
|
| 41 |
/* |
| 42 |
* 架線柱位置データ |
| 43 |
*/ |
| 44 |
class CPolePos{ |
| 45 |
public: |
| 46 |
float m_Pos; // 位置 |
| 47 |
int m_Track; // 軌道番号 |
| 48 |
bool m_Multi; // 複線用リンク |
| 49 |
CPole *m_Link; // 架線柱 |
| 50 |
public: |
| 51 |
CPolePos(){ m_Pos = 0.0f; m_Link = NULL; } |
| 52 |
CPolePos(float p, CPole *l, int t, bool m){ |
| 53 |
m_Pos = p; m_Link = l; m_Track = t; m_Multi = m; |
| 54 |
} |
| 55 |
bool operator<(const CPolePos &rhs){ return m_Pos<rhs.m_Pos; } |
| 56 |
void RestoreAddress(); |
| 57 |
char *Read(char *); |
| 58 |
void Save(FILE *); |
| 59 |
}; |
| 60 |
|
| 61 |
// 反復子 |
| 62 |
typedef list<CPolePos>::iterator IPolePos; |
| 63 |
|
| 64 |
//////////////////////////////////////////////////////////////////////////////// |
| 65 |
//////////////////////////////////////////////////////////////////////////////// |
| 66 |
|
| 67 |
/* |
| 68 |
* レールインスタンス |
| 69 |
*/ |
| 70 |
class CRailWay{ |
| 71 |
friend class CRailWayLink; |
| 72 |
friend class CGroupEndLocator; |
| 73 |
friend class CRailBuildMode; |
| 74 |
private: |
| 75 |
static CRailWay **ms_Root; // 接続ルート |
| 76 |
static float ms_MinDist; // 最小検出距離 |
| 77 |
static CRailWayLink ms_Detect; // 検出情報 |
| 78 |
void *m_OldAdr; // 旧アドレス |
| 79 |
int m_Selected; // 選択フラグ |
| 80 |
vector<float> m_RailMapV; // レールマッピング V 座標 |
| 81 |
vector<float> m_TieMapV; // 枕木マッピング V 座標 |
| 82 |
vector<float> m_GirderMapV; // 橋桁マッピング V 座標 |
| 83 |
vector<float> m_LineMapV; // 架線マッピング V 座標 |
| 84 |
float m_PierPos; // 橋脚設置位置 |
| 85 |
float m_PolePos; // 架線柱位置 |
| 86 |
float m_SegLen; // セグメント長 |
| 87 |
bool m_BuildLine; // 架線設置フラグ |
| 88 |
bool m_WarpDummy; // ワープ用ダミーレール |
| 89 |
bool m_MultiTrackDummy; // 複線用ダミーレール |
| 90 |
int m_DummyTrackNum; // ダミー用軌道数 |
| 91 |
float m_DummyTrackInterval; // ダミー用軌道間隔 |
| 92 |
std::string m_RailBlock; // 閉塞区間 |
| 93 |
int m_SpeedLimit; // 制限速度 |
| 94 |
CRailConnectorLink m_Link[2]; // 接続コネクタ |
| 95 |
list<CRailSplitter> m_SplitList; // 分割点リスト |
| 96 |
CRailWayParentLink *m_Parent; // 親オブジェクト |
| 97 |
CPlatformInst *m_Platform; // プラットフォーム |
| 98 |
CScene *m_Scene; // シーン |
| 99 |
CRailPlugin *m_RailPlugin; // レールプラグイン |
| 100 |
CTiePlugin *m_TiePlugin; // 枕木プラグイン |
| 101 |
CGirderPlugin *m_GirderPlugin; // 橋桁プラグイン |
| 102 |
CPierPlugin *m_PierPlugin; // 橋脚プラグイン |
| 103 |
CLinePlugin *m_LinePlugin; // 架線プラグイン |
| 104 |
CPolePlugin *m_PolePlugin; // 架線柱プラグイン |
| 105 |
list<CPierPos> m_PierList; // 橋脚リスト |
| 106 |
list<CPolePos> m_PoleList; // 架線柱リスト |
| 107 |
list<CGroupEndLocator *> m_GroupEnd; // 編成終端データ |
| 108 |
CRailWay *m_Next; // リスト次 |
| 109 |
public: |
| 110 |
static void SetRoot(CRailWay **r){ ms_Root = r; } |
| 111 |
static void ResetDetect(){ ms_MinDist = -1.0f; } |
| 112 |
static bool IsDetected(){ return ms_MinDist>=0.0f; } |
| 113 |
static float GetMinDist(){ return ms_MinDist; } |
| 114 |
static CRailWayLink GetDetect(){ return ms_Detect; } |
| 115 |
CRailWay(); |
| 116 |
CRailWay(CRailConnectorLink &, CRailConnectorLink &, |
| 117 |
CRailPlugin *, CTiePlugin *, CGirderPlugin *, |
| 118 |
CPierPlugin *ipi = NULL, CLinePlugin *lpi = NULL, CPolePlugin *ppi = NULL, |
| 119 |
list<CRailSplitter> *splist = NULL); |
| 120 |
~CRailWay(); |
| 121 |
CRailWay *Next(){ return m_Next; } |
| 122 |
CRailWay **NextAdr(){ return &m_Next; } |
| 123 |
void *OldAdr(){ return m_OldAdr; } |
| 124 |
int GetSelectFlag(){ return m_Selected; } |
| 125 |
void AddSelectFlag(int s){ m_Selected |= s; } |
| 126 |
CRailWayLink CreateLink(int s){ return CRailWayLink(s, this); } |
| 127 |
CScene *GetScene(){ return m_Scene; } |
| 128 |
CRailPlugin *GetRailPlugin(){ return m_RailPlugin; } |
| 129 |
CTiePlugin *GetTiePlugin(){ return m_TiePlugin; } |
| 130 |
CGirderPlugin *GetGirderPlugin(){ return m_GirderPlugin; } |
| 131 |
CRailWayParentLink *GetParent(){ return m_Parent; } |
| 132 |
void SetParent(CDetectInfo *); |
| 133 |
CPlatformInst *GetPlatform(){ return m_Platform; } |
| 134 |
void SetPlatform(CPlatformInst *pl){ m_Platform = pl; } |
| 135 |
void SetWarpDummy(); |
| 136 |
bool IsMultiTrackDummy(){ return m_MultiTrackDummy; } |
| 137 |
bool IsLinkable(int, VEC3 &); |
| 138 |
float GetSegLen(); |
| 139 |
void Stabilize(); |
| 140 |
void AddSplitter(const CRailSplitter &spl){ m_SplitList.push_back(spl); } |
| 141 |
CRailConnectorLink SplitLink(CRailLinkTemp *, CRailWay **, IRailSplitter); |
| 142 |
void SplitSelect(); |
| 143 |
CRailWay *Delete(); |
| 144 |
void ConnectRailWay(int, CRailWay *, int, CScene *); |
| 145 |
void BranchRailWay(int, CRailWay *, int, CScene *); |
| 146 |
void DisconnectRailWay(int, CScene *); |
| 147 |
bool SetRailBlock(char *rb); |
| 148 |
bool IsRailBlock(){ return !m_RailBlock.empty(); } |
| 149 |
std::string& GetRailBlock(){ return m_RailBlock; } |
| 150 |
bool CheckRailBlock(CTrainGroup *); |
| 151 |
bool SetSpeedLimit(int); |
| 152 |
bool IsSpeedLimit(){ return m_SpeedLimit>=0; } |
| 153 |
int GetSpeedLimit(){ return m_SpeedLimit; } |
| 154 |
void SetMapTemp(); |
| 155 |
void CopyMapTemp(int); |
| 156 |
void CopyMapTempMulti(int, float *, float *, int *, float *, float *, int *); |
| 157 |
CPoleLink GetPoleLink(int); |
| 158 |
void AddPolePos(float p){ m_PolePos += p; } |
| 159 |
void AddPole(float, CPole *, int, bool); |
| 160 |
void InsertPole(float, CPole *, int, bool); |
| 161 |
void DeletePole(CPole *); |
| 162 |
void AddPierPos(float p){ m_PierPos += p; } |
| 163 |
void AddPier(float, CPier *); |
| 164 |
void InsertPier(float, CPier *); |
| 165 |
void DeletePier(CPier *); |
| 166 |
void BuildLine(CPierPlugin *, CLinePlugin *, CPolePlugin *); |
| 167 |
void ShowSegment(); |
| 168 |
void ScanInput(int, VEC3 &, VEC3 &); |
| 169 |
void ScanInputWarp(int, VEC3 &, VEC3 &); |
| 170 |
void TraceRail(int, CRailTraceCurve *); |
| 171 |
void TraceRailSplit(int, CRailTraceCurve *); |
| 172 |
VEC3 GetFirstDir(int); |
| 173 |
void RemoveGroup(); |
| 174 |
void CheckWarpEndScene(CScene *); |
| 175 |
bool IsInsideGroup(int, float); |
| 176 |
bool SetTrain(int, float, CGroupEndLocator *, bool, |
| 177 |
ITrainSetBuffer *, ITrainSetBuffer *, CTrainGroup *, bool, bool); |
| 178 |
int MarchTrain(float *, CGroupEndLocator *, CTrainGroup *, CTrainGroup *); |
| 179 |
bool CheckPlatformExtend(int, CPlatformInst *); |
| 180 |
int GetPlatformState(); |
| 181 |
void UpdateSplitList(); |
| 182 |
void Dump(); |
| 183 |
void Render(); |
| 184 |
void RenderWarp(); |
| 185 |
void RestoreAddress(); |
| 186 |
char *Read(char *); |
| 187 |
char *ReadWarp(char *); |
| 188 |
void Save(FILE *); |
| 189 |
void SaveWarp(FILE *); |
| 190 |
}; |
| 191 |
|
| 192 |
// 反復子 |
| 193 |
typedef list<CRailWay *>::iterator IPRailWay; |
| 194 |
typedef list<list<CRailWay *> >::iterator ILPRailWay; |
| 195 |
typedef list<list<list<CRailWay *> > >::iterator ILLPRailWay; |
| 196 |
|
| 197 |
/* |
| 198 |
* 接続先カント量を求める |
| 199 |
*/ |
| 200 |
inline float CRailWayLink::GetCant(){ |
| 201 |
return m_Side ? -m_Link->m_Link[m_Side].m_Cant : m_Link->m_Link[m_Side].m_Cant; |
| 202 |
} |
| 203 |
|
| 204 |
/* |
| 205 |
* 接続先座標を求める |
| 206 |
*/ |
| 207 |
inline VEC3 CRailWayLink::GetPos(){ |
| 208 |
return m_Link->m_Link[m_Side].GetPos(); |
| 209 |
} |
| 210 |
|
| 211 |
/* |
| 212 |
* 接続先反対座標を求める |
| 213 |
*/ |
| 214 |
inline VEC3 CRailWayLink::GetOppositePos(){ |
| 215 |
return m_Link->m_Link[!m_Side].GetPos(); |
| 216 |
} |
| 217 |
|
| 218 |
/* |
| 219 |
* 最初の分割点までの dir ベクトルを求める |
| 220 |
*/ |
| 221 |
inline VEC3 CRailWayLink::GetFirstDir(){ |
| 222 |
return m_Link->GetFirstDir(m_Side); |
| 223 |
} |
| 224 |
|
| 225 |
/* |
| 226 |
* レール接続一時データ |
| 227 |
*/ |
| 228 |
class CRailLinkTemp{ |
| 229 |
public: |
| 230 |
int m_Side; // サイド |
| 231 |
float m_SumLen; // 積算距離 |
| 232 |
IRailSplitter m_SpliceItr; // スプリット位置 |
| 233 |
VEC3 m_Pos; // 座標 |
| 234 |
VEC3 m_Right; // right |
| 235 |
VEC3 m_Up; // up |
| 236 |
VEC3 m_Dir; // dir |
| 237 |
CRailWay *m_Link; // レール |
| 238 |
public: |
| 239 |
CRailLinkTemp(){ m_Link = NULL; } |
| 240 |
CRailLinkTemp(int, float, VEC3 &, VEC3 &, VEC3 &, VEC3 &, CRailWay *, IRailSplitter); |
| 241 |
CRailConnectorLink SplitLink(CRailWay **wadr){ |
| 242 |
return m_Link->SplitLink(this, wadr, m_SpliceItr); |
| 243 |
} |
| 244 |
void CopyMapTemp(){ m_Link->CopyMapTemp(m_Side); } |
| 245 |
}; |
| 246 |
|
| 247 |
// 外部グローバル |
| 248 |
extern list<list<list<CRailWay *> > > g_MultiTrackRailList; |
| 249 |
extern ILLPRailWay g_MultiTrackSegment; |
| 250 |
extern ILPRailWay g_SingleTrackSegment; |
| 251 |
extern bool g_MultiTrackDummy; |
| 252 |
extern int g_DummyTrackNum; |
| 253 |
extern float g_DummyTrackInterval; |
| 254 |
extern map<std::string, CTrainGroup *> g_RailBlockMap; |
| 255 |
|
| 256 |
// 関数宣言 |
| 257 |
CTrainGroup* GetRailBlockUser(std::string&); |
| 258 |
void SetRailBlockUser(std::string&, CTrainGroup *); |
| 259 |
void ClearRailBlockUser(CTrainGroup *); |
| 260 |
|
| 261 |
#endif |