Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/CPierPlugin.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations) (download) (as text)
Sun Aug 15 01:53:13 2010 UTC (13 years, 9 months ago) by okadu
File MIME type: text/x-c++src
File size: 6926 byte(s)


1 #include "stdafx.h"
2 #include "CRailPlugin.h"
3 #include "CTiePlugin.h"
4 #include "CGirderPlugin.h"
5 #include "CPierPlugin.h"
6 #include "CPierSelectMode.h"
7 #include "CRailBuildMode.h"
8
9 // 外部定数
10 extern const float RAIL_PREV_LEN;
11 extern const float RAIL_SEG_MAX;
12 extern const float TAPER_DIV_RATIO;
13
14 // 外部グローバル
15 extern bool g_RailMipMap;
16
17 /*
18 * [static]
19 * プレビュー
20 */
21 void CPierPlugin::RenderPreview(){
22 if(!ms_PreviewState || !g_Pier) return;
23 if(g_Pier){
24 devSetLighting(TRUE);
25 bool multi = CRailwayMode::IsMultiTrack();
26 int tnum = multi ? CRailwayMode::GetTrackNum() : 1;
27 float tint = multi ? CRailwayMode::GetTrackInterval() : 0.0f;
28 int j;
29 for(j = g_Pier->IsMultiTrack() ? tnum : 0; j<=tnum; j++){
30 float x = (j-(tnum-1)*0.5f)*tint;
31 if(j==tnum){
32 if(!g_Pier->IsMultiTrack()) break;
33 x = 0.0f;
34 }
35 VEC3 p1;
36 float tmp = -RAIL_PREV_LEN;
37 while(true){
38 p1 = VEC3(x, 0.0f, tmp)-(
39 (g_Rail ? g_Rail->m_Height : 0.0f)+
40 (g_Tie ? g_Tie->m_Height : 0.0f)+
41 (g_Girder ? g_Girder->m_Height : 0.0f))*V3UP;
42 g_Pier->Preview(p1, 20.0f);
43 if(tmp>RAIL_PREV_LEN) break;
44 tmp += g_Pier->m_Interval;
45 }
46 }
47 }
48 }
49
50 /*
51 * ロード
52 */
53 bool CPierPlugin::Load(){
54 char *str = m_Script, *tmp, *eee;
55 if(!ChDir() || !m_Script) return false;
56 try{
57 if(!(str = BeginBlock(eee = str, "PierInfo"))) throw CSynErr(eee);
58 if(tmp = AsgnInteger(eee = str, "TrackNum", &m_TrackNum)) str = tmp;
59 else m_TrackNum = 1;
60 if(m_TrackNum<1){
61 throw CSynErr(eee, lang(InvalidTrackNum));
62 }else if(m_TrackNum>1){
63 if(!(str = AsgnFloat(eee = str, "TrackInterval", &m_TrackInterval))) throw CSynErr(eee);
64 }
65 string tdir;
66 if(tmp = AsgnIdentifier(eee = str, "Direction", &tdir)){
67 str = tmp;
68 if(tdir=="Down") m_Direction = false;
69 else if(tdir=="Up") m_Direction = true;
70 else throw CSynErr(eee);
71 }else{
72 m_Direction = false;
73 }
74 if(!(str = AsgnFloat(eee = str, "Interval", &m_Interval))) throw CSynErr(eee);
75 if(tmp = AsgnFloat(eee = str, "Offset", &m_Offset)) str = tmp;
76 else m_Offset = 0.0f;
77 if(!(str = AsgnFloat(eee = str, "BuildMinAlt", &m_BuildMinAlt))) throw CSynErr(eee);
78 m_TaperX = m_TaperY = m_TaperZ = 0.0f;
79 if(tmp = AsgnFloat(str, "TaperX", &m_TaperX)) str = tmp;
80 if(tmp = AsgnFloat(str, "TaperY", &m_TaperY)) str = tmp;
81 if(tmp = AsgnFloat(str, "TaperZ", &m_TaperZ)) str = tmp;
82 if(m_TaperX<0.0f) m_TaperX = 0.0f;
83 if(m_TaperY<0.0f) m_TaperX = 0.0f;
84 if(m_TaperZ<0.0f) m_TaperX = 0.0f;
85 if(!(str = EndBlock(eee = str))) throw CSynErr(eee, ERR_ENDBLOCK);
86
87 if(!(str = BeginBlock(eee = str, "Joint"))) throw CSynErr(eee);
88 if(!(str = AsgnString(eee = str, "ModelFileName", &m_JointFile))) throw CSynErr(eee);
89 if(tmp = AsgnFloat(eee = str, "ModelScale", &m_JointScale)) str = tmp;
90 else m_JointScale = 1.0f;
91 if(!(str = AsgnVector3D(eee = str, "JointToHeadLocal", &m_JointToHeadLocal))) throw CSynErr(eee);
92 if(!(str = EndBlock(eee = str))) throw CSynErr(eee, ERR_ENDBLOCK);
93
94 if(!(str = BeginBlock(eee = str, "Head"))) throw CSynErr(eee);
95 if(!(str = AsgnString(eee = str, "ModelFileName", &m_HeadFile))) throw CSynErr(eee);
96 if(tmp = AsgnFloat(eee = str, "ModelScale", &m_HeadScale)) str = tmp;
97 else m_HeadScale = 1.0f;
98 if(!(str = AsgnVector3D(eee = str, "HeadToPierLocal", &m_HeadToPierLocal))) throw CSynErr(eee);
99 if(!(str = EndBlock(eee = str))) throw CSynErr(eee, ERR_ENDBLOCK);
100
101 if(!(str = BeginBlock(eee = str, "Base"))) throw CSynErr(eee);
102 if(!(str = AsgnString(eee = str, "ModelFileName", &m_BaseFile))) throw CSynErr(eee);
103 if(tmp = AsgnFloat(eee = str, "ModelScale", &m_BaseScale)) str = tmp;
104 else m_BaseScale = 1.0f;
105 if(!(str = AsgnVector3D(eee = str, "BaseToPierLocal", &m_BaseToPierLocal))) throw CSynErr(eee);
106 if(!(str = EndBlock(eee = str))) throw CSynErr(eee, ERR_ENDBLOCK);
107
108 if(!(str = ReadProfile(eee = str))) throw CSynErr(eee);
109
110 if(*(eee = str)) throw CSynErr(eee);
111 }
112 catch(CSynErr err){
113 HandleError(&err);
114 return false;
115 }
116 LoadData();
117 m_JointMesh = g_MeshList.Get(FALSE, m_JointFile.c_str(), 0, !g_RailMipMap);
118 ChDir();
119 m_HeadMesh = g_MeshList.Get(FALSE, m_HeadFile.c_str(), 0, !g_RailMipMap);
120 ChDir();
121 m_BaseMesh = g_MeshList.Get(FALSE, m_BaseFile.c_str(), 0, !g_RailMipMap);
122 ChDir();
123 m_JointObject.SetMesh(m_JointMesh, V3ZERO, m_JointScale);
124 m_HeadObject.SetMesh(m_HeadMesh, V3ZERO, m_HeadScale);
125 m_BaseObject.SetMesh(m_BaseMesh, V3ZERO, m_BaseScale);
126 DELETE_A(m_Buffer);
127 return true;
128 }
129
130 /*
131 * プレビュー設定
132 */
133 void CPierPlugin::SetPreview(){
134 ms_PreviewState = true;
135 g_Pier = this;
136 string desc = g_Pier->GetBasicInfo();
137 if(m_TrackNum>1) desc += FlashIn("\n%s: %d\n%s: %.3f [m]",
138 lang(TrackNum), m_TrackNum, lang(Interval), m_TrackInterval);
139 desc += "\n"+g_Pier->GetDescription();
140 g_PierSelectMode->SetProperty((char *)desc.c_str());
141 }
142
143 /*
144 * プレビュー
145 */
146 void CPierPlugin::Preview(
147 VEC3 pos, // 位置
148 float plen // 橋脚部長さ
149 ){
150 VEC3 hpos = pos+m_JointToHeadLocal;
151 VEC3 top = hpos+m_HeadToPierLocal;
152 VEC3 bottom = top-V3UP*plen;
153 VEC3 bpos = bottom-m_BaseToPierLocal;
154 VEC3 begin, end, right, up = V3DIR, dir;
155 if(m_Direction){
156 begin = bottom;
157 end = top;
158 right = -V3RIGHT;
159 dir = V3UP;
160 }else{
161 begin = top;
162 end = bottom;
163 right = V3RIGHT;
164 dir = -V3UP;
165 }
166 m_JointObject.SetPos(pos);
167 m_JointObject.SetDir(V3DIR, V3UP);
168 m_JointObject.Render();
169 CastShadow(&m_JointObject);
170 m_HeadObject.SetPos(hpos);
171 m_HeadObject.SetDir(V3DIR, V3UP);
172 m_HeadObject.Render();
173 CastShadow(&m_HeadObject);
174 float tsx = 1.0f+plen*m_TaperX, tsy = 1.0f+plen*m_TaperY;
175 m_BaseObject.SetPos(bpos);
176 m_BaseObject.SetDir(V3DIR, V3UP);
177 m_BaseObject.SetScale(tsx, 1.0f, tsy);
178 m_BaseObject.Render();
179 CastShadow(&m_BaseObject);
180 devResetMatrix();
181 devResetMaterial();
182 ResetMapTemp();
183 int i, div = 1+Round(((tsx>tsy ? tsx : tsy)-1.0f)/TAPER_DIV_RATIO);
184 int smax = Round(2.0f*plen/RAIL_SEG_MAX);
185 if(div<smax) div = smax;
186 VEC3 tr1, tu1, tr2, tu2;
187 if(m_Direction){
188 tr1 = right*tsx; tu1 = up*tsy;
189 tr2 = right; tu2 = up;
190 }else{
191 tr1 = right; tu1 = up;
192 tr2 = right*tsx; tu2 = up*tsy;
193 }
194 float divarea = plen/div;
195 for(i = 0; i<div; i++){
196 float q12 = (float)i/div, q11 = 1.0f-q12;
197 float q22 = (float)(i+1)/div, q21 = 1.0f-q22;
198 VEC3 p1 = q11*begin+q12*end, r1 = q11*tr1+q12*tr2, u1 = q11*tu1+q12*tu2;
199 VEC3 p2 = q21*begin+q22*end, r2 = q21*tr1+q22*tr2, u2 = q21*tu1+q22*tu2;
200 Dump(p1, r1, u1, p1, r1, u1, p2, r2, u2, p2, r2, u2, divarea, 7);
201 }
202 if(plen<=0.0f || !HasInterval() && !g_ShadowNeeded) return;
203 Render(begin, tr1, tu1, dir, begin, tr1, tu1,
204 end, tr2, tu2, dir, end, tr2, tu2, 3, plen);
205 }
206
207 /*
208 * 橋脚距離加算
209 */
210 void CPierPlugin::AddPierPos(
211 float len // 距離
212 ){
213 m_PierPos -= len;
214 while(m_PierPos<=0.0f) m_PierPos += m_Interval;
215 }

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