Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/CRailBuildMode.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 8 - (show annotations) (download) (as text)
Tue Mar 20 10:43:48 2012 UTC (12 years, 1 month ago) by okadu
File MIME type: text/x-c++src
File size: 9177 byte(s)
[okadu] Version 2.13a パッチ
複線バグ修正

1 #include "stdafx.h"
2 #include "CPopMenu.h"
3 #include "CScene.h"
4 #include "CRailPlanCurve.h"
5 #include "CRailDetectCurve.h"
6 #include "CRailBuilder.h"
7 #include "CLine.h"
8 #include "CRailPlugin.h"
9 #include "CTiePlugin.h"
10 #include "CGirderPlugin.h"
11 #include "CPierPlugin.h"
12 #include "CLinePlugin.h"
13 #include "CPolePlugin.h"
14 #include "CRailwayPluginSet.h"
15 #include "CSurfacePlugin.h"
16 #include "CRailBuildMode.h"
17
18 // 外部定数
19 extern const float CORNER_MIN_DIST;
20
21 // 内部グローバル
22 bool g_EnableCant;
23
24 /*
25 * コンストラクタ
26 */
27 CRailBuildMode::CRailBuildMode(){
28 m_Builder = m_LastPos = NULL;
29 ListRailwayPluginSet();
30 }
31
32 /*
33 * デストラクタ
34 */
35 CRailBuildMode::~CRailBuildMode(){
36 DELETE_V(m_Builder);
37 DELETE_V(g_RailwayPluginSetMenu);
38 }
39
40 /*
41 * 設定読込
42 */
43 char *CRailBuildMode::LoadArrowScenerySetting(
44 char *str // 対象文字列
45 ){
46 if(!str) return NULL;
47 return LoadRailwaySetting(str);
48 }
49
50 /*
51 * 設定保存
52 */
53 void CRailBuildMode::SaveArrowScenerySetting(
54 FILE *file // ファイル
55 ){
56 SaveRailwaySetting(file);
57 }
58
59 /*
60 * モードを有効化
61 */
62 void CRailBuildMode::EnterArrowScenery(){
63 ms_ModeLabel = lang(BuildRail);
64 m_Interface.SetChild(&ms_RailWindow);
65 m_Interface.SetChild(&ms_OptionWindow);
66 CRailDetectCurve3D::ResetDetect();
67 EnterRailway(1);
68 }
69
70 /*
71 * モーダル処理
72 */
73 void CRailBuildMode::ModalFuncArrowScenery(){
74 ModalFuncRailwayPluginSet();
75 }
76
77 /*
78 * 入力チェック
79 */
80 void CRailBuildMode::ScanInputArrowScenery(){
81 ScanInputRailway();
82 if(m_ArrowMode){
83 if(!m_Builder){
84 m_ArrowMode = false;
85 return;
86 }
87 g_Scene->ClipAlt(&m_SnapPos, NULL, NULL, GetAltMask());
88 if(GetKey(DIK_SPACE)>=S_PUSH) CRailDetectCurve3D::ResetDetect();
89 else g_Scene->ScanInputRailWay(0, m_SnapPos, V3ZERO, true);
90 if(CRailDetectCurve3D::IsDetected()){
91 if(!m_LastPos->SetLink(R2L(CRailLinkTemp(CRailDetectCurve3D::GetDetect())))){
92 CRailDetectCurve3D::ResetDetect();
93 //Surface()->ClipAlt(&m_SnapPos, NULL, NULL, GetAltMask());
94 m_SnapPos = m_LastPos->SetPos(m_SnapPos, 0);
95 }
96 }else{
97 m_LastPos->SetLink(R2L(CRailLinkTemp()));
98 m_SnapPos = m_LastPos->SetPos(m_SnapPos, GetAltMask());
99 }
100 //if(m_Interface.ScanInput()) break;
101 switch(GetCamera()->ScanInput(2)){
102 case 10: {
103 ADD:
104 CRailBuilder *prev = m_LastPos->GetPrev(), *fin = prev;
105 if(prev && m_LastPos->IsLinkFilled()){
106 fin = m_LastPos;
107 goto BUILD;
108 }
109 if(prev && prev->IsLast()){
110 if(prev!=m_Builder){
111 BUILD:
112 void PushUndoStack();
113 PushUndoStack();
114 int i, pinum = 0, ponum = 0;
115 float pipos = 0.0f, pisum = 0.0f, popos = 0.0f, posum = 0.0f;
116 CRailPlugin *b_rail;
117 CTiePlugin *b_tie;
118 CGirderPlugin *b_girder;
119 CPierPlugin *b_pier;
120 CLinePlugin *b_line;
121 CPolePlugin *b_pole;
122 GetPlugin(&b_rail, &b_tie, &b_girder, &b_pier, &b_line, &b_pole);
123 g_EnableCant = IsCantEnabled();
124 CRailBuilder::ResetDirSum();
125 g_LastPole.resize(ms_TrackNum);
126 g_FinishPole.resize(ms_TrackNum);
127 g_MultiTrackDummy = false;
128 for(i = 0; i<ms_TrackNum; i++)
129 g_LastPole[i] = g_FinishPole[i] = CPoleLink();
130 for(i = 0; i<=ms_TrackNum; i++){
131 if(i==ms_TrackNum){
132 if(!(b_girder && b_girder->IsMultiTrack())
133 && !(b_pier && b_pier->IsMultiTrack())
134 && !(b_pole && b_pole->IsMultiTrack())) break;
135 g_MultiTrackDummy = true;
136 g_DummyTrackNum = ms_TrackNum;
137 g_DummyTrackInterval = ms_TrackInterval;
138 }
139 CRailBuilder::SetTrack(i, ms_TrackNum, ms_TrackInterval, IsLiftRail());
140 CRailConnectorLink con1, con2;
141 CRailLinkTemp link1 = m_Builder->CheckLink()
142 ? m_Builder->GetLink() : CRailLinkTemp();
143 CRailLinkTemp link2 = fin->CheckLink()
144 ? fin->GetLink() : CRailLinkTemp();
145 CRailWay *lway1, *lway2;
146 if(link1.m_Link) con1 = link1.SplitLink(&lway1);
147 if(link2.m_Link) con2 = link2.SplitLink(&lway2);
148 if(b_rail) b_rail->ResetMapTemp();
149 if(b_tie) b_tie->ResetMapTemp();
150 if(b_girder) b_girder->ResetMapTemp();
151 if(b_pier) b_pier->ResetPierPos();
152 if(b_line){
153 b_line->ResetMapTemp();
154 b_line->ResetPolePos();
155 }
156 if(i<ms_TrackNum){
157 if(link1.m_Link){
158 lway1->CopyMapTemp(link1.m_Side);
159 lway1->CopyMapTempMulti(link1.m_Side,
160 &pipos, &pisum, &pinum, &popos, &posum, &ponum);
161 g_LastPole[i] = lway1->GetPoleLink(link1.m_Side);
162 }
163 if(link2.m_Link)
164 g_FinishPole[i] = lway2->GetPoleLink(link2.m_Side);
165 }else{
166 if(pinum){
167 pipos /= pinum;
168 pisum /= pinum;
169 }
170 if(ponum){
171 popos /= ponum;
172 posum /= ponum;
173 }
174 if(b_pier){
175 b_pier->SetPierPos(pipos);
176 if(pinum) b_pier->AddPierPos(pisum);
177 }
178 if(b_line){
179 b_line->SetPolePos(popos);
180 if(ponum) b_line->AddPolePos(posum);
181 }
182 }
183 m_Builder->BuildRail(con1, con2, b_rail, b_tie, b_girder);
184 g_Scene->BuildLine(b_pier, b_line, b_pole);
185 g_MultiTrackDummy = false;
186 }
187 g_Scene->Dump();
188 DELETE_V(m_Builder);
189 m_Builder = m_LastPos = new CRailBuilder(m_SnapPos, NULL);
190 // dump g_MultiTrackRailList
191 /*chdir(g_BaseDir);
192 FILE *file = fopen("MultiTrackRailList.txt", "wt");
193 if(file){
194 ILLPRailWay illpr = g_MultiTrackRailList.begin();
195 for(; illpr!=g_MultiTrackRailList.end(); illpr++){
196 fprintf(file, "list<list<CRailWay *> >{\n");
197 ILPRailWay ilpr = illpr->begin();
198 for(; ilpr!=illpr->end(); ilpr++){
199 fprintf(file, "\tlist<CRailWay *>{\n");
200 IPRailWay ipr = ilpr->begin();
201 for(; ipr!=ilpr->end(); ipr++){
202 fprintf(file, "\t\t%p\n\t\t", *ipr);
203 IPolePos ippo = (*ipr)->m_PoleList.begin();
204 for(; ippo!=(*ipr)->m_PoleList.end(); ippo++)
205 fprintf(file, "%.1f ", ippo->m_Pos);
206 fprintf(file, "\n");
207 }
208 fprintf(file, "\t}\n");
209 }
210 fprintf(file, "}\n");
211 }
212 fclose(file);
213 }*/
214 }
215 }else{
216 if(m_LastPos->IsLinkEmpty() || m_LastPos->IsLinkFilled())
217 m_LastPos = new CRailBuilder(m_SnapPos, m_LastPos);
218 else m_LastPos->PushLink();
219 }
220 break; }
221 case 32:
222 POP:
223 if(!(m_LastPos = m_LastPos->Pop())) m_Builder = NULL;
224 break;
225 case 0:
226 if(GetKey(DIK_ESCAPE)==S_PUSH){
227 m_ArrowMode = false;
228 }else if(GetKey(DIK_RETURN)==S_PUSH){
229 goto ADD;
230 }else if(GetKey(DIK_BACK)==S_PUSH){
231 goto POP;
232 }else if(GetKey(DIK_DELETE)==S_PUSH){
233 if(m_Builder!=m_LastPos){
234 DELETE_V(m_Builder);
235 m_Builder = m_LastPos = new CRailBuilder(m_SnapPos, NULL);
236 }else{
237 DELETE_V(m_Builder);
238 m_LastPos = NULL;
239 }
240 }
241 break;
242 }
243 }else{
244 CRailDetectCurve3D::ResetDetect();
245 if(m_Interface.ScanInput()) return;
246 if(ms_RailWindow.CheckClose()){
247 SetNeutral();
248 return;
249 }
250 switch(GetCamera()->ScanInput(1)){
251 case 12:
252 if(!g_NetworkInitialized){
253 m_ArrowMode = true;
254 g_Cursor.Center();
255 if(!m_Builder) m_Builder = m_LastPos = new CRailBuilder(m_SnapPos, NULL);
256 ReformEditValue();
257 }
258 break;
259 case 0:
260 if(GetKey(DIK_ESCAPE)==S_PUSH){
261 SetNeutral();
262 break;
263 }
264 break;
265 }
266 }
267 }
268
269 /*
270 * レンダリング
271 */
272 void CRailBuildMode::RenderArrowScenery(){
273 if(ms_PhotoMode) return;
274 ms_RailWindow.SetColor(m_ArrowMode ? 0x80ffffff : 0xffffffff);
275 if(m_ArrowMode) CRailDetectCurve3D::RenderLink();
276 DrawGrid();
277 if(m_Builder){
278 CRailPlugin *b_rail = ms_Type[0].GetCheck() ? g_Rail : NULL;
279 CTiePlugin *b_tie = ms_Type[1].GetCheck() ? g_Tie : NULL;
280 CGirderPlugin *b_girder = ms_Type[2].GetCheck() ? g_Girder : NULL;
281 CLineDumpL dump(256);
282 int i;
283 CRailBuilder::ResetDirSum();
284 for(i = 0; i<ms_TrackNum; i++){
285 CRailBuilder::SetTrack(i, ms_TrackNum, ms_TrackInterval, IsLiftRail());
286 m_Builder->Render(&dump, b_rail, b_tie, b_girder, i==ms_TrackNum-1);
287 }
288 }
289 if(m_ArrowMode){
290 char *err, *errs[3] = {
291 NULL, lang(MismatchedTrackNum), lang(MismatchedTrackInterval)};
292 CRailPlugin *b_rail;
293 CTiePlugin *b_tie;
294 CGirderPlugin *b_girder;
295 CPierPlugin *b_pier;
296 CLinePlugin *b_line;
297 CPolePlugin *b_pole;
298 GetPlugin(&b_rail, &b_tie, &b_girder, &b_pier, &b_line, &b_pole);
299 if(b_girder && (err = errs[b_girder->ConfirmMultiTrack(ms_TrackNum, ms_TrackInterval)]))
300 g_StrTex->RenderLeft(TILE_QUAD, TILE_UNIT*5+TILE_QUAD, 0xffffff00, 0xff000000,
301 FlashIn("%s %s", lang(Caution_Girder), err));
302 if(b_pier && (err = errs[b_pier->ConfirmMultiTrack(ms_TrackNum, ms_TrackInterval)]))
303 g_StrTex->RenderLeft(TILE_QUAD, TILE_UNIT*6+TILE_QUAD, 0xffffff00, 0xff000000,
304 FlashIn("%s %s", lang(Caution_Pier), err));
305 if(b_pole && (err = errs[b_pole->ConfirmMultiTrack(ms_TrackNum, ms_TrackInterval)]))
306 g_StrTex->RenderLeft(TILE_QUAD, TILE_UNIT*7+TILE_QUAD, 0xffffff00, 0xff000000,
307 FlashIn("%s %s", lang(Caution_Pole), err));
308 }
309 }
310
311 /*
312 * ビルダーリセット
313 */
314 void CRailBuildMode::ResetBuilder(){
315 DELETE_V(m_Builder);
316 }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26