Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunk/CNamedObject.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: 11118 byte(s)


1 #include "stdafx.h"
2 #include "CListView.h"
3 #include "CModelInst.h"
4 #include "CEnvPlugin.h"
5 #include "CConfigMode.h"
6 #include "CSceneryMode.h"
7
8 // 内部定数
9 const int SYSTEM_OBJECT_NUM = 4; // システムスイッチ数
10
11 // 外部グローバル
12 extern MAT8 *g_AltMaterial;
13 extern MAT8 g_MatSelect[];
14
15 // 内部グローバル
16 bool g_PreSimulationFlag;
17 CNamedObject g_SystemObject[SYSTEM_OBJECT_NUM];
18
19 // static メンバ
20 CModelInst *CNamedObjectAfterRenderer::ms_CurrentInst;
21 CModelPlugin *CNamedObjectAfterRenderer::ms_CurrentPlugin;
22
23 /*
24 * コンストラクタ
25 */
26 CNamedObjectAfterRenderer::CNamedObjectAfterRenderer(
27 CNamedObject *obj, // 名前付きオブジェクト
28 CPartsInst *parts // パーツインスタンス
29 ){
30 int i;
31 for(i = 0; i<INSTANCE_SWITCH_NUM; i++) m_InstSwitch[i] = g_SystemSwitch[i].GetValue();
32 m_ModelInst = ms_CurrentInst;
33 m_ModelPlugin = ms_CurrentPlugin;
34 m_NamedObject = obj;
35 if(m_PartsInst = parts){
36 m_PartsInstCreation = false;
37 }else{
38 m_PartsInstCreation = true;
39 m_PartsInst = new CPartsInst;
40 *m_PartsInst->GetObject() = *obj->GetPreviewObject();
41 }
42 }
43
44 /*
45 * コピーコンストラクタ
46 */
47 CNamedObjectAfterRenderer::CNamedObjectAfterRenderer(
48 const CNamedObjectAfterRenderer &src // コピー元
49 ){
50 int i;
51 for(i = 0; i<INSTANCE_SWITCH_NUM; i++) m_InstSwitch[i] = src.m_InstSwitch[i];
52 m_ModelInst = src.m_ModelInst;
53 m_ModelPlugin = src.m_ModelPlugin;
54 m_NamedObject = src.m_NamedObject;
55 if(m_PartsInstCreation = src.m_PartsInstCreation)
56 m_PartsInst = src.m_PartsInst ? new CPartsInst(*src.m_PartsInst) : NULL;
57 else m_PartsInst = src.m_PartsInst;
58 }
59
60 /*
61 * デストラクタ
62 */
63 CNamedObjectAfterRenderer::~CNamedObjectAfterRenderer(){
64 if(m_PartsInstCreation) DELETE_V(m_PartsInst);
65 }
66
67 /*
68 * レンダリング
69 */
70 void CNamedObjectAfterRenderer::Render(
71 int mode // 1: noshadow, 2: transparent
72 ){
73 if(m_ModelInst){
74 if(m_ModelInst->GetSelectFlag() && m_ModelInst->IsSelectVisible())
75 g_AltMaterial = &g_MatSelect[m_ModelInst->GetSelectFlag()];
76 m_ModelPlugin->SetSwitch(m_ModelInst);
77 m_ModelPlugin->SetAnimation(m_ModelInst);
78 }
79 int i;
80 for(i = 0; i<INSTANCE_SWITCH_NUM; i++) g_SystemSwitch[i].SetValue(m_InstSwitch[i]);
81 m_NamedObject->RenderAfter(m_PartsInst, mode);
82 g_AltMaterial = NULL;
83 }
84
85 ////////////////////////////////////////////////////////////////////////////////
86 ////////////////////////////////////////////////////////////////////////////////
87
88 // static メンバ
89 int CNamedObject::ms_AfterMode;
90 int CNamedObject::ms_AfterRender;
91 bool CNamedObject::ms_CastShadowDefault;
92 bool CNamedObject::ms_SetMaterial;
93 bool CNamedObject::ms_PartsInstValid;
94 IPartsInst CNamedObject::ms_PartsInst;
95 list<CNamedObjectAfterRenderer> CNamedObject::ms_AfterRenderList;
96 list<CNamedObjectAfterRenderer> CNamedObject::ms_TransRenderList;
97
98 /*
99 * [static]
100 * パーツインスタンス設定
101 */
102 void CNamedObject::SetPartsInst(
103 list<CPartsInst> *pl // パーツインスタンスリスト
104 ){
105 if(ms_PartsInstValid = !!pl){
106 ms_PartsInst = pl->begin();
107 //Debug("----\nCNamedObject::SetPartsInst(): pl->size() = %d\nobjects =", pl->size());
108 //list<CPartsInst>::iterator itr = pl->begin();
109 //for(; itr!=pl->end(); ++itr) Debug(" %p", &*itr);
110 //Debug("\n----\n");
111 }
112 }
113
114 /*
115 * [static]
116 * リスト初期化
117 */
118 void CNamedObject::InitAfterRenderList(){
119 ms_AfterRenderList.clear();
120 ms_TransRenderList.clear();
121 }
122
123 /*
124 * [static]
125 * 全てレンダリング
126 */
127 void CNamedObject::AfterRenderAll(){
128 devBLEND_ALPHA();
129 INamedObjectAfterRenderer inoar;
130 inoar = ms_AfterRenderList.begin();
131 for(; inoar!=ms_AfterRenderList.end(); inoar++) inoar->Render(1);
132 inoar = ms_TransRenderList.begin();
133 for(; inoar!=ms_TransRenderList.end(); inoar++) inoar->Render(2);
134 }
135
136 /*
137 * 読込
138 */
139 CNamedObject::CNamedObject(){
140 m_Mesh = NULL;
141 m_LastObject = &m_PreviewObject;
142 m_CastShadow = ms_CastShadowDefault;
143 }
144
145 /*
146 * 読込
147 */
148 char *CNamedObject::ReadModelInfo(
149 char *str, // 対象文字列
150 CModelPlugin *mpi // モデルプラグイン
151 ){
152 char *tmp;
153 if(!(str = AsgnString(str, "ModelFileName", &m_ModelFileName))) return NULL;
154 if(tmp = AsgnFloat(str, "ModelScale", &m_ModelScale)) str = tmp;
155 else m_ModelScale = 1.0f;
156 if(m_ModelScale<0.0f) m_ModelScale = 0.0f;
157 if(tmp = AsgnYesNo(str, "Turn", &m_Turn)) str = tmp;
158 else m_Turn = false;
159 if(tmp = AsgnYesNo(str, "CastShadow", &m_CastShadow)) str = tmp;
160 else m_CastShadow = ms_CastShadowDefault;
161 if(tmp = m_Customizer.Read(str, mpi, 1)) str = tmp;
162 m_OffList.clear();
163 return str;
164 }
165
166 /*
167 * モデル読込
168 */
169 void CNamedObject::LoadModel(
170 CModelPlugin *mpi // 呼び出し元
171 ){
172 m_Mesh = g_MeshList.Get(FALSE, m_ModelFileName.c_str(), 0, !g_NamedObjectMipMap);
173 mpi->ChDir();
174 m_Customizer.LoadData(mpi);
175 m_Customizer.SetOffList(this);
176 }
177
178 /*
179 * メッシュ設定
180 */
181 void CNamedObject::SetMesh(
182 CObject *obj // オブジェクト
183 ){
184 float asc = -1.0f;
185 CMesh *altmesh = m_Customizer.GetMesh(&asc);
186 if(asc<0.0f) obj->SetMesh(m_Mesh, V3ZERO, m_ModelScale);
187 else obj->SetMesh(altmesh, V3ZERO, asc);
188 }
189
190 /*
191 * 姿勢固定
192 */
193 void CNamedObject::SetPreviewPosture(
194 VEC3 pos, // 位置
195 VEC3 dir, // 方向
196 VEC3 up // アップ
197 ){
198 m_PreviewObject.SetScale(1.0f);
199 m_PreviewObject.SetPos(pos);
200 m_PreviewObject.SetDir(dir, up);
201 }
202
203 /*
204 * 検出判定
205 */
206 void CNamedObject::CheckDetect(){
207 CModelInst::CheckDetect(this, GetParts());
208 }
209
210 /*
211 * レンダリング
212 */
213 void CNamedObject::Render(){
214 CPartsInst *parts = GetParts();
215 CObject *obj = m_LastObject = (parts ? parts->GetObject() : &m_PreviewObject);
216 // CCustomizerBase::SetObject(this);
217 ms_AfterRender = 0;
218 ms_AfterMode = 0;
219 obj->ResetMatFlag();
220 if(ms_SetMaterial) obj->RenderCustom(this); else obj->Render();
221 if(g_ShadowNeeded && ms_AfterRender&1)
222 ms_AfterRenderList.push_back(CNamedObjectAfterRenderer(this, parts));
223 if(ms_AfterRender&2)
224 ms_TransRenderList.push_back(CNamedObjectAfterRenderer(this, parts));
225 if(m_CastShadow) CastShadow(obj);
226 }
227
228 /*
229 * アフターレンダリング
230 */
231 void CNamedObject::RenderAfter(
232 CPartsInst *parts, // パーツインスタンス
233 int mode // 1: noshadow, 2: transparent
234 ){
235 CObject *obj = parts ? parts->GetObject() : &m_PreviewObject;
236 ms_AfterMode = mode;
237 obj->ResetMatFlag(2);
238 // CCustomizerBase::SetObject(this);
239 obj->RenderCustom(this);
240 }
241
242 ////////////////////////////////////////////////////////////////////////////////
243 ////////////////////////////////////////////////////////////////////////////////
244
245 /*
246 * 読込
247 */
248 char *CObjectJoint3D::Read(
249 char *str, // 対象文字列
250 CModelPlugin *mpi // モデルプラグイン
251 ){
252 char *tmp, *eee;
253 string obj;
254 if(!(str = BeginNamedBlock(eee = str, "Joint3D", &obj))) return NULL;
255 if(!(m_Link = FindObjectHybrid(mpi, obj)))
256 throw CSynErr(eee, "%s: \"%s\"", lang(UndefinedObject), obj.c_str());
257 if(!(str = AsgnVector3D(eee = str, "AttachCoord", &m_AttachCoord))) throw CSynErr(eee);
258 if(tmp = AsgnVector3D(eee = str, "LocalCoord", &m_LocalCoord)) str = tmp;
259 else m_LocalCoord = V3ZERO;
260 m_FixCenter = m_LocalCoord!=V3ZERO ? true : false;
261 if(tmp = AsgnString(eee = str, "DirLink", &obj)){
262 str = tmp;
263 if(!(m_DirLink = FindObjectHybrid(mpi, obj)))
264 throw CSynErr(eee, "%s: \"%s\"", lang(UndefinedObject), obj.c_str());
265 }else{
266 m_DirLink = m_Link;
267 }
268 if(tmp = AsgnVector3D(eee = str, "AttachDir", &m_AttachDir)) str = tmp;
269 else m_AttachDir = V3DIR;
270 if(tmp = AsgnString(eee = str, "UpLink", &obj)){
271 str = tmp;
272 if(!(m_UpLink = FindObjectHybrid(mpi, obj)))
273 throw CSynErr(eee, "%s: \"%s\"", lang(UndefinedObject), obj.c_str());
274 }else{
275 m_UpLink = m_Link;
276 }
277 if(tmp = AsgnVector3D(eee = str, "AttachUp", &m_AttachUp)) str = tmp;
278 else m_AttachUp = V3UP;
279 VEC3 right;
280 V3NormAxis(&right, &m_AttachUp, &m_AttachDir);
281 if(!(str = EndBlock(eee = str))) throw CSynErr(eee, ERR_ENDBLOCK);
282 return str;
283 }
284
285 /*
286 * ローカル系をセット
287 */
288 void CObjectJoint3D::SetTurnLocal(){
289 m_Link = m_DirLink = m_UpLink = &g_SystemObject[SYS_OBJ_LOCAL];
290 m_AttachCoord = m_LocalCoord = V3ZERO;
291 m_AttachDir = -V3DIR;
292 m_AttachUp = V3UP;
293 m_FixCenter = false;
294 }
295
296 ////////////////////////////////////////////////////////////////////////////////
297 ////////////////////////////////////////////////////////////////////////////////
298
299 /*
300 * コンストラクタ (旧規格用)
301 */
302 CFreeObject3D::CFreeObject3D(
303 char *objname, // オブジェクト名
304 char *modelname, // モデルファイル名
305 float scale // スケール
306 ){
307 m_ObjectName = objname;
308 m_ModelFileName = modelname;
309 m_ModelScale = scale;
310 m_Turn = false;
311 m_Joint.SetTurnLocal();
312 }
313
314 /*
315 * 読込
316 */
317 char *CFreeObject3D::Read(
318 char *str, // 対象文字列
319 CModelPlugin *mpi // モデルプラグイン
320 ){
321 char *eee;
322 if(!(str = BeginNamedBlock(eee = str, "Object3D", &m_ObjectName))) return NULL;
323 CheckObjectHybrid(eee, mpi, m_ObjectName);
324 if(!(str = ReadModelInfo(eee = str, mpi))) throw CSynErr(eee);
325 if(!(str = m_Joint.Read(eee = str, mpi))) throw CSynErr(eee);
326 if(!(str = EndBlock(eee = str))) throw CSynErr(eee, ERR_ENDBLOCK);
327 mpi->AddPartsNum(1);
328 return str;
329 }
330
331 /*
332 * 姿勢設定
333 */
334 void CFreeObject3D::SetPostureFreeObject(){
335 CObject *obj = GetPartsObject();
336 SetMesh(obj);
337 obj->SetDir(m_Joint.GetDir(), m_Joint.GetUp());
338 obj->SetPos(m_Joint.GetPos());
339 if(m_Joint.m_FixCenter){
340 VEC3 pos;
341 D3DXVec3TransformCoord(&pos,
342 &(-m_Joint.m_LocalCoord/obj->GetScale()), &obj->GetMatrix());
343 obj->SetPos(pos);
344 }
345 IPCustomizerBase ipc = m_OffList.begin();
346 for(; ipc!=m_OffList.end(); ipc++) (*ipc)->ResetOffCustomizer(0);
347 m_Customizer.SetPosture(obj);
348 ipc = m_OffList.begin();
349 for(; ipc!=m_OffList.end(); ipc++){
350 (*ipc)->ResetOffCustomizer(2);
351 (*ipc)->SetPostureCustomizer(obj);
352 }
353 }
354
355 ////////////////////////////////////////////////////////////////////////////////
356 ////////////////////////////////////////////////////////////////////////////////
357
358 /*
359 * システムオブジェクト初期化
360 */
361 void InitSystemObject(){
362 g_SystemObject[SYS_OBJ_WORLD].Init("_WORLD");
363 g_SystemObject[SYS_OBJ_LOCAL].Init("_LOCAL");
364 g_SystemObject[SYS_OBJ_CAMERA].Init("_CAMERA");
365 g_SystemObject[SYS_OBJ_LIGHT].Init("_LIGHT");
366 }
367
368 /*
369 * システムオブジェクトの検索
370 */
371 CNamedObject *FindSystemObject(
372 const string &name // オブジェクト名
373 ){
374 int i;
375 for(i = 0; i<SYSTEM_OBJECT_NUM; i++)
376 if(g_SystemObject[i].Check(name)) return &g_SystemObject[i];
377 return NULL;
378 }
379
380 /*
381 * システムオブジェクト + 指定プラグイン内オブジェクトの検索
382 */
383 CNamedObject *FindObjectHybrid(
384 CModelPlugin *mpi, // モデルプラグイン
385 const string &name // オブジェクト名
386 ){
387 CNamedObject *ret = mpi->FindObject(name);
388 return ret ? ret : FindSystemObject(name);
389 }
390
391 /*
392 * オブジェクト重複チェック
393 */
394 void CheckObjectHybrid(
395 char *eee, // エラー報告位置
396 CModelPlugin *mpi, // モデルプラグイン
397 const string &name // オブジェクト名
398 ){
399 if(FindSystemObject(name))
400 throw CSynErr(eee, "%s: \"%s\"", lang(ReservedObjectName), name.c_str());
401 if(mpi->FindObject(name))
402 throw CSynErr(eee, "%s: \"%s\"", lang(OverlappedObjectName), name.c_str());
403 }

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