1 /*---------------------------------------------------------------------------*
2 Project: NintendoWare
3 File: demo.cpp
4
5 Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc. All rights reserved.
6
7 These coded instructions, statements, and computer programs contain proprietary
8 information of Nintendo and/or its licensed developers and are protected by
9 national and international copyright laws. They may not be disclosed to third
10 parties or copied or duplicated in any form, in whole or in part, without the
11 prior written consent of Nintendo.
12
13 The content herein is highly confidential and should be handled accordingly.
14
15 $Revision: $
16 *---------------------------------------------------------------------------*/
17 #include <nw/demo/demo_Utility.h>
18 #include "../include/demo.h"
19 #include "../include/SmDef.h"
20 #include "../include/SmInitialFileParser.h"
21
22 namespace
23 {
24
25 //----------------------------------------
26 // コンストラクタ
Demo(GfxCtrl * gfxCtrl,LytCtrl * lytCtrl)27 Demo::Demo( GfxCtrl* gfxCtrl, LytCtrl* lytCtrl )
28 : SmMessage( NULL ),
29 m_GfxCtrl( gfxCtrl ),
30 m_LytCtrl( lytCtrl ),
31 m_Pierrot( NULL ),
32 m_Robot( NULL ),
33 m_Stage( NULL ),
34 m_Stick( NULL ),
35 m_Audience( NULL ),
36 m_Empyrean( NULL ),
37 m_LytTabPanel( NULL ),
38 m_Tab0VisibleBtn( NULL ),
39 m_Tab1VisibleBtn( NULL ),
40 m_Tab2VisibleBtn( NULL ),
41 m_Tab0Tree( NULL ),
42 m_Tab1Tree( NULL ),
43 m_Tab2Tree( NULL ),
44 m_LytPierrotVisibleBtn( NULL ),
45 m_LytRobotVisibleBtn( NULL ),
46 m_LytStageVisibleBtn( NULL ),
47 m_LytStereoOnOffBtn( NULL ),
48 m_EmpyreanVisibleBtn( NULL ),
49 m_CameraCtrlBtn( NULL ),
50 m_TouchPanelCamera( NULL ),
51 m_LevelSlider( NULL ),
52 m_RangeSlider( NULL ),
53 m_StereoLevel( 0.f ),
54 m_StereoRange( 0.f ),
55 m_PierrotSlider( NULL ),
56 m_RobotSlider( NULL ),
57 m_StageMeshSlider( NULL ),
58 m_AudienceSlider( NULL ),
59 m_SmCamera( NULL ),
60 m_LytUpdate( NULL )
61 {
62 m_CameraBasePos.x = 0.f;
63 m_CameraBasePos.y = 0.f;
64 m_CameraBasePos.z = 0.f;
65 m_CameraBaseTarget.x = 0.f;
66 m_CameraBaseTarget.y = 0.f;
67 m_CameraBaseTarget.z = 0.f;
68 }
69
70
71 //----------------------------------------
72 // デストラクタ
~Demo()73 Demo::~Demo()
74 {
75 // GFXオブジェクト以外は破棄します。
76 SM_SAFE_DELETE( m_LytTabPanel );
77 SM_SAFE_DELETE( m_Tab0VisibleBtn );
78 SM_SAFE_DELETE( m_Tab1VisibleBtn );
79 SM_SAFE_DELETE( m_Tab2VisibleBtn );
80 SM_SAFE_DELETE( m_Tab0Tree );
81 SM_SAFE_DELETE( m_Tab1Tree );
82 SM_SAFE_DELETE( m_Tab2Tree );
83
84 SM_SAFE_DELETE( m_LytPierrotVisibleBtn );
85 SM_SAFE_DELETE( m_LytRobotVisibleBtn );
86 SM_SAFE_DELETE( m_LytStageVisibleBtn );
87 SM_SAFE_DELETE( m_LytParticleVisibleBtn );
88 SM_SAFE_DELETE( m_LytAudienceVisibleBtn );
89 SM_SAFE_DELETE( m_EmpyreanVisibleBtn );
90
91 SM_SAFE_DELETE( m_LytStereoOnOffBtn );
92 SM_SAFE_DELETE( m_CameraCtrlBtn );
93 SM_SAFE_DELETE( m_TouchPanelCamera );
94
95 SM_SAFE_DELETE( m_LevelSlider );
96 SM_SAFE_DELETE( m_RangeSlider );
97
98 SM_SAFE_DELETE( m_PierrotSlider );
99 SM_SAFE_DELETE( m_RobotSlider );
100 SM_SAFE_DELETE( m_StageMeshSlider );
101 SM_SAFE_DELETE( m_AudienceSlider );
102 SM_SAFE_DELETE( m_ParticleSlider );
103 }
104
105
106 //----------------------------------------
107 // シーンの初期化
108 void
InitializeScene()109 Demo::InitializeScene()
110 {
111 /*
112 Nw4cデモ、コンテンツ部分が記述されています。
113 生成されるGfxオブジェクトは、
114 GfxCtrlクラスを経由して生成されるSmModelクラスからアクセスされます。
115 */
116
117 // Gfxのオブジェクトなどの初期化を行います。
118
119 // 天球
120 m_Empyrean = m_GfxCtrl->CreateModel( NULL, NW_DEMO_FILE_PATH(L"ToyBg.bcmdl"), GfxCtrl::GFX_CTRL_VRAM_B );
121 m_Empyrean->SetLayerId( 0 );
122
123 // 天球はデフォルトで表示しない。
124 m_Empyrean->SetVisible( true );
125
126 // ピエロ
127 m_Pierrot = m_GfxCtrl->CreateModel( NULL, NW_DEMO_FILE_PATH(L"ToyPierrot.bcmdl"), GfxCtrl::GFX_CTRL_VRAM_B );
128 m_Pierrot->SetLayerId( 5 );
129
130 // バックダンサーピエロ
131 m_AddPierrot = m_GfxCtrl->CreateModel( NULL, NW_DEMO_FILE_PATH(L"ToyPierrotBackDancer.bcmdl"), GfxCtrl::GFX_CTRL_VRAM_B );
132 m_AddPierrot->SetVisible( false ); // 複製されたインスタンスを用いて描画。
133 m_AddPierrot->SetLayerId( 5 );
134
135 // ロボット
136 m_Robot = m_GfxCtrl->CreateModel( NULL, NW_DEMO_FILE_PATH(L"ToyRobot.bcmdl"), GfxCtrl::GFX_CTRL_VRAM_B );
137 m_Robot->SetLayerId( 5 );
138
139 // バックダンサーロボット
140 m_AddRobot = m_GfxCtrl->CreateModel( NULL, NW_DEMO_FILE_PATH(L"ToyRobotBackDancer.bcmdl"), GfxCtrl::GFX_CTRL_VRAM_B );
141 m_AddRobot->SetVisible( false ); // 複製されたインスタンスを用いて描画。
142 m_AddRobot->SetLayerId( 5 );
143
144 // ステージ
145 m_Stage = m_GfxCtrl->CreateModel( NULL, NW_DEMO_FILE_PATH(L"ToyStageMatFix.bcmdl"), GfxCtrl::GFX_CTRL_VRAM_A );
146 m_Stage->SetLayerId( 1 );
147
148 // ステージ小物
149 m_StageObject = m_GfxCtrl->CreateModel( NULL, NW_DEMO_FILE_PATH(L"ToyStageObj.bcmdl"), GfxCtrl::GFX_CTRL_VRAM_A );
150 m_StageObject->SetLayerId( 5 );
151 m_StageObject->SetVisibleZone( 0.0f ); // 起動時は表示されていません。
152
153 // 観客
154 m_Audience = m_GfxCtrl->CreateModel( NULL, NW_DEMO_FILE_PATH(L"ToyAudience.bcmdl"), GfxCtrl::GFX_CTRL_VRAM_A );
155 m_Audience->SetVisible( false ); // 複製されたインスタンスを用いて描画。
156 m_Audience->SetLayerId( 5 );
157
158 // ライト等
159 m_GfxCtrl->CreateSceneEnvironment( NW_DEMO_FILE_PATH(L"ToyMrnRbtLight.bcenv") );
160
161 // パーティクル
162 m_Particle = m_GfxCtrl->CreateParticle( NW_DEMO_FILE_PATH(L"ToyParticle.bcres"), GfxCtrl::GFX_CTRL_VRAM_B );
163 m_Particle->SetLayerId( 6 );
164
165 // カメラ等
166 m_GfxCtrl->CreateCamera( NW_DEMO_FILE_PATH(L"ToyCamAni.bccam") );
167
168 // カメラを取得
169 m_SmCamera = m_GfxCtrl->GetSmCamera();
170
171 // カメラの初期視点、注視点を保持
172 m_SmCamera->GetPosition( &m_CameraBasePos );
173 m_SmCamera->GetTarget( &m_CameraBaseTarget );
174
175 // カメラはパッドで操作されるので、メッセージツリーにつなぐ
176 this->AddChild( m_SmCamera );
177
178 {
179 // ピエロのアニメーションをセットする
180 m_Pierrot->SetAnimEvaluatorNo( 0 );
181 m_Pierrot->SetAnimationFrame( 0.f );
182
183 // ロボ位置変更
184 if ( m_Robot )
185 {
186 m_Robot->SetAnimEvaluatorNo( 0 );
187 m_Robot->SetAnimationFrame( 0.f );
188 }
189
190 // カメラアニメーションをセット
191 m_SmCamera->SetAnimEvaluatorNo( 0 );
192
193 // 観客のアニメーションをセットする
194 m_Audience->SetAnimEvaluatorNo( 0 );
195 m_Audience->SetAnimationFrame( 0.f );
196
197 // ステージのアニメーションをセットする
198 m_Stage->SetAnimEvaluatorNo( 0 );
199 m_StageObject->SetAnimEvaluatorNo( 0 );
200 }
201
202
203 /*
204 UIはSmMessageクラスを利用したツリー構造で管理されています。
205 main.cppから、タッチパネルやパッドのメッセージが送信され、
206 各クラス内ReceveMessageにてメッセージに応じて適切な処理が行われます。
207 */
208
209 // 下画面操作パネルUIの初期化を行います。
210 {
211 // メインウインドウレイアウトのファイル構成です。
212 m_tabResFile.clyt = "Main.bclyt";
213 m_tabResFile.clan.push_back( "Main_Tab00.bclan" );
214 m_tabResFile.clan.push_back( "Main_Tab01.bclan" );
215 m_tabResFile.clan.push_back( "Main_Tab02.bclan" );
216
217 // ピエロボタン用レイアウトのファイル構成です。
218 m_btnPierrorResFile.clyt = "Button.bclyt";
219 m_btnPierrorResFile.clan.push_back( "Button_ButtonOn.bclan" );
220 m_btnPierrorResFile.clan.push_back( "Button_ButtonOff.bclan" );
221 SmLayoutResource* btnPierrotRes = m_LytCtrl->CreateSmLayoutResource( NW_DEMO_FILE_PATH(L"LayoutPierrotButton.arc"), m_btnPierrorResFile );
222
223 // ロボットボタン用レイアウトのファイル構成です。
224 m_btnRobotResFile.clyt = "Button.bclyt";
225 m_btnRobotResFile.clan.push_back( "Button_ButtonOn.bclan" );
226 m_btnRobotResFile.clan.push_back( "Button_ButtonOff.bclan" );
227 SmLayoutResource* btnRobotRes = m_LytCtrl->CreateSmLayoutResource( NW_DEMO_FILE_PATH(L"LayoutRobotButton.arc"), m_btnRobotResFile );
228
229 // ステージボタン用レイアウトのファイル構成です。
230 m_btnStageResFile.clyt = "Button.bclyt";
231 m_btnStageResFile.clan.push_back( "Button_ButtonOn.bclan" );
232 m_btnStageResFile.clan.push_back( "Button_ButtonOff.bclan" );
233 SmLayoutResource* btnStageRes = m_LytCtrl->CreateSmLayoutResource( NW_DEMO_FILE_PATH(L"LayoutStageButton.arc"), m_btnStageResFile );
234
235 // 観客ボタン用レイアウトのファイル構成です。
236 m_btnAudienceResFile.clyt = "Button.bclyt";
237 m_btnAudienceResFile.clan.push_back( "Button_ButtonOn.bclan" );
238 m_btnAudienceResFile.clan.push_back( "Button_ButtonOff.bclan" );
239 SmLayoutResource* btnAudienceRes = m_LytCtrl->CreateSmLayoutResource( NW_DEMO_FILE_PATH(L"LayoutAudienceButton.arc"), m_btnAudienceResFile );
240
241 // パーティクルボタン用レイアウトのファイル構成です。
242 m_btnParticleResFile.clyt = "Button.bclyt";
243 m_btnParticleResFile.clan.push_back( "Button_ButtonOn.bclan" );
244 m_btnParticleResFile.clan.push_back( "Button_ButtonOff.bclan" );
245 SmLayoutResource* btnParticleRes = m_LytCtrl->CreateSmLayoutResource( NW_DEMO_FILE_PATH(L"LayoutParticleButton.arc"), m_btnParticleResFile );
246
247 // スライダバー用レイアウトのファイル構成です。
248 m_sliderResFile.clyt = "Slider.bclyt";
249 SmLayoutResource* sliderRes = m_LytCtrl->CreateSmLayoutResource( NW_DEMO_FILE_PATH(L"LayoutSlider.arc"), m_sliderResFile );
250
251 // メインウインドウのレイアウトクラスを生成します。
252 SmLayoutResource* tabPanelRes = m_LytCtrl->CreateSmLayoutResource( NW_DEMO_FILE_PATH(L"LayoutMain.arc"), m_tabResFile );
253 m_LytTabPanel = m_LytCtrl->CreateSmLayout( tabPanelRes );
254 m_LytTabPanel->SetVisiblePane( "CameraZoomIn", false );
255 m_LytTabPanel->SetVisiblePane( "CameraZoomOut", false );
256
257 // タブ0のオンオフボタンを生成します。
258 nw::ut::Rect rect = tabPanelRes->GetRect( "TabBounding00" );
259 m_Tab0VisibleBtn = new SmButton( rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight() );
260 this->AddChild( m_Tab0VisibleBtn );
261 m_Tab0VisibleBtn->SetTarget( this, DEMO_TAB0_VISIBLE_BTN );
262 m_Tab0VisibleBtn->SetVisible( false );
263
264 // タブ1のオンオフボタンを生成します。
265 rect = tabPanelRes->GetRect( "TabBounding01" );
266 m_Tab1VisibleBtn = new SmButton( rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight() );
267 this->AddChild( m_Tab1VisibleBtn );
268 m_Tab1VisibleBtn->SetTarget( this, DEMO_TAB1_VISIBLE_BTN );
269 m_Tab1VisibleBtn->SetSwitch( false );
270 m_Tab1VisibleBtn->SetVisible( false );
271
272 // タブ2のオンオフボタンを生成します。
273 rect = tabPanelRes->GetRect( "TabBounding02" );
274 m_Tab2VisibleBtn = new SmButton( rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight() );
275 this->AddChild( m_Tab2VisibleBtn );
276 m_Tab2VisibleBtn->SetTarget( this, DEMO_TAB2_VISIBLE_BTN );
277 m_Tab2VisibleBtn->SetSwitch( false );
278 m_Tab2VisibleBtn->SetVisible( false );
279
280
281 // タブ0の中身を生成します。
282 m_Tab0Tree = new SmMessage( this );
283 this->AddChild( m_Tab0Tree );
284 {
285 f32 baseX = 80.f;
286
287 // ピエロのオンオフボタンを生成します。
288 m_LytPierrotVisibleBtn = new SmLytButton( m_LytCtrl->CreateSmLayout( btnPierrotRes ), NULL, "ButtonBounding" );
289 m_Tab0Tree->AddChild( m_LytPierrotVisibleBtn );
290 m_LytPierrotVisibleBtn->SetPosition( baseX -120.0f, -50.f );
291 m_LytPierrotVisibleBtn->SetTarget( this, DEMO_PIERROT_VISIBLE_BTN );
292
293 // 追加ピエロの表示数調整スライダーを生成します。
294 m_PierrotSlider = new SmLytSliderBar( baseX -120, 40, m_LytCtrl->CreateSmLayout( sliderRes ) );
295 m_Tab0Tree->AddChild( m_PierrotSlider );
296 m_PierrotSlider->SetTarget( this, DEMO_ADD_PIERROT_NUM_CTRL_SLDR );
297 m_PierrotSlider->SetParam( 1.f );
298
299
300 // ロボットのオンオフボタンを生成します。
301 m_LytRobotVisibleBtn = new SmLytButton( m_LytCtrl->CreateSmLayout( btnRobotRes ), NULL, "ButtonBounding" );
302 m_Tab0Tree->AddChild( m_LytRobotVisibleBtn );
303 m_LytRobotVisibleBtn->SetPosition( baseX -80.0f, -50.f );
304 m_LytRobotVisibleBtn->SetTarget( this, DEMO_ROBOT_VISIBLE_BTN );
305
306 // 追加ロボットの表示数調整スライダーを生成します。
307 m_RobotSlider = new SmLytSliderBar( baseX -80, 40, m_LytCtrl->CreateSmLayout( sliderRes ) );
308 m_Tab0Tree->AddChild( m_RobotSlider );
309 m_RobotSlider->SetTarget( this, DEMO_ROBOT_NUM_CTRL_SLDR );
310 m_RobotSlider->SetParam( 1.f );
311
312
313 // ステージOn-Offボタンを生成します。
314 m_LytStageVisibleBtn = new SmLytButton( m_LytCtrl->CreateSmLayout( btnStageRes ), NULL, "ButtonBounding" );
315 m_LytStageVisibleBtn->SetPosition( baseX -40.0f, -50.f );
316 m_Tab0Tree->AddChild( m_LytStageVisibleBtn );
317 m_LytStageVisibleBtn->SetTarget( this, DEMO_STAGE_VISIBLE_BTN );
318
319 // ステージ小物のメッシュコントロール用スライダーを生成します。
320 m_StageMeshSlider = new SmLytSliderBar( baseX -40, 40, m_LytCtrl->CreateSmLayout( sliderRes ) );
321 m_Tab0Tree->AddChild( m_StageMeshSlider );
322 m_StageMeshSlider->SetTarget( this, DEMO_STAGE_OBJECT_MESH_CTRL_SLDR );
323 m_StageMeshSlider->SetParam( 1.f );
324
325
326 // 観客On-Offボタンを生成します。
327 m_LytAudienceVisibleBtn = new SmLytButton( m_LytCtrl->CreateSmLayout( btnAudienceRes ), NULL, "ButtonBounding" );
328 m_LytAudienceVisibleBtn->SetPosition( baseX + 0.0f, -50.f );
329 m_Tab0Tree->AddChild( m_LytAudienceVisibleBtn );
330 m_LytAudienceVisibleBtn->SetTarget( this, DEMO_AUDIENCE_VISIBLE_BTN );
331
332 // 観客の増減コントロール用スライダーを生成します。
333 m_AudienceSlider = new SmLytSliderBar( baseX + 0.0f, 40.0f, m_LytCtrl->CreateSmLayout( sliderRes ) );
334 m_Tab0Tree->AddChild( m_AudienceSlider );
335 m_AudienceSlider->SetTarget( this, DEMO_AUDIENCE_NUM_CTRL_SLDR );
336 m_AudienceSlider->SetParam( 1.f );
337
338
339 // パーティクルのオンオフボタンを生成します。
340 m_LytParticleVisibleBtn = new SmLytButton( m_LytCtrl->CreateSmLayout( btnParticleRes ), NULL, "ButtonBounding" );
341 m_Tab0Tree->AddChild( m_LytParticleVisibleBtn );
342 m_LytParticleVisibleBtn->SetPosition( baseX + 40.0f, -50.0f );
343 m_LytParticleVisibleBtn->SetTarget( this, DEMO_PARTICLE_VISIBLE_BTN );
344
345 // パーティクル制御用スライダーを生成します。
346 m_ParticleSlider = new SmLytSliderBar( baseX + 40.0f, 40.0f, m_LytCtrl->CreateSmLayout( sliderRes ) );
347 m_Tab0Tree->AddChild( m_ParticleSlider );
348 m_ParticleSlider->SetTarget( this, DEMO_PARTICLE_NUM_CTRL_SLDR );
349 m_ParticleSlider->SetParam( 0.f );
350 }
351 // 初期状態を無効
352 m_Tab0Tree->SetEnable( false );
353
354
355 // タブ1の中身を生成します。
356 m_Tab1Tree = new SmMessage( this );
357 this->AddChild( m_Tab1Tree );
358 // 初期状態を無効
359 m_Tab1Tree->SetEnable( false );
360
361 // タブ2の中身を生成します。
362 m_Tab2Tree = new SmMessage( this );
363 this->AddChild( m_Tab2Tree );
364 // 初期状態を有効
365 m_Tab2Tree->SetEnable( true );
366 m_LytTabPanel->SetAnimationNo( 2 );
367 }
368
369 /*
370 デモの初期状態を記述した初期化ファイル(CmdTree.txt)をロードし、
371 書かれている内容を実行します。
372 */
373 {
374 s32 pierrot_visible = 0;
375 s32 robot_visible = 0;
376 s32 audience_visible = 0;
377
378 f32 stage_obj_rate = 0.0f;
379 f32 particle_rate = 0.0f;
380
381 // 初期化ファイル
382 const SmCmd* cmd;
383 SmInitialFileParser* parser = new SmInitialFileParser();
384 parser->Load( NW_DEMO_FILE_PATH(L"CmdTree.txt") );
385
386 for ( u32 i = 0; i < parser->GetCmdNum(); i ++ )
387 {
388 cmd = parser->GetCmd( i );
389
390 // ステージ小物の初期状態を設定します。
391 if ( strcmp( cmd->GetCommand(), "STAGE_OBJECT" ) == 0 )
392 {
393 stage_obj_rate = cmd->GetF32( "rate" );
394 m_StageMeshSlider->SetParam(1.0f - stage_obj_rate);
395 m_StageObject->SetVisibleZone(stage_obj_rate);
396 }
397
398 // パーティクルの初期状態を設定します。
399 if ( strcmp( cmd->GetCommand(), "PARTICLE" ) == 0 )
400 {
401 particle_rate = cmd->GetF32( "rate" );
402 m_ParticleSlider->SetParam(1.0f - particle_rate);
403 m_Particle->SetVisibleZone(particle_rate);
404 }
405
406 // 観客オブジェクトの初期状態を設定します。
407 if ( strcmp( cmd->GetCommand(), "ADD_AUDIENCE" ) == 0 )
408 {
409 // 観客を複製します。
410 SmModel* audienceModel = m_Audience->Duplicate();
411 m_GfxCtrl->AddModel( audienceModel );
412
413 // 表示位置を調整します。
414 f32 x = cmd->GetF32( "tx" );
415 f32 y = cmd->GetF32( "ty" );
416 f32 z = cmd->GetF32( "tz" );
417 audienceModel->SetPosition( x, y, z );
418
419 // 表示角度を調整します。
420 f32 rx = cmd->GetF32( "rx" );
421 f32 ry = cmd->GetF32( "ry" );
422 f32 rz = cmd->GetF32( "rz" );
423 audienceModel->SetRotate( rx, ry, rz );
424
425 // アニメーション初期化
426 audienceModel->SetAnimEvaluatorNo( 0 );
427
428 // 表示/非表示
429 s32 visible = cmd->GetF32( "visible" );
430 if ( visible != 0 )
431 {
432 audienceModel->SetVisible( true );
433 audience_visible++;
434 }
435 else
436 {
437 audienceModel->SetVisible( false );
438 }
439
440 m_AudienceArray.push_back( audienceModel );
441 }
442
443 // ピエロの追加
444 if ( strcmp( cmd->GetCommand(), "ADD_PIERROT" ) == 0 )
445 {
446 // 観客を複製します。
447 SmModel* pierrotModel = m_AddPierrot->Duplicate();
448 m_GfxCtrl->AddModel( pierrotModel );
449
450 // 表示位置を調整します。
451 f32 x = cmd->GetF32( "tx" );
452 f32 y = cmd->GetF32( "ty" );
453 f32 z = cmd->GetF32( "tz" );
454 pierrotModel->SetPosition( x, y, z );
455
456 // 表示角度を調整します。
457 f32 rx = cmd->GetF32( "rx" );
458 f32 ry = cmd->GetF32( "ry" );
459 f32 rz = cmd->GetF32( "rz" );
460 pierrotModel->SetRotate( rx, ry, rz );
461
462 // アニメーション初期化
463 pierrotModel->SetAnimEvaluatorNo( 0 );
464
465 // 表示/非表示
466 s32 visible = cmd->GetF32( "visible" );
467 if ( visible != 0 )
468 {
469 pierrotModel->SetVisible( true );
470 pierrot_visible++;
471 }
472 else
473 {
474 pierrotModel->SetVisible( false );
475 }
476
477 // インスタンスを保持します。
478 m_AddPierrotArray.push_back( pierrotModel );
479 }
480
481 // ロボットの追加
482 if ( strcmp( cmd->GetCommand(), "ADD_ROBOT" ) == 0 )
483 {
484 // 観客を複製します。
485 SmModel* robotModel = m_AddRobot->Duplicate();
486 m_GfxCtrl->AddModel( robotModel );
487
488 // 表示位置を調整します。
489 f32 x = cmd->GetF32( "tx" );
490 f32 y = cmd->GetF32( "ty" );
491 f32 z = cmd->GetF32( "tz" );
492 robotModel->SetPosition( x, y, z );
493
494 // 表示角度を調整します。
495 f32 rx = cmd->GetF32( "rx" );
496 f32 ry = cmd->GetF32( "ry" );
497 f32 rz = cmd->GetF32( "rz" );
498 robotModel->SetRotate( rx, ry, rz );
499
500 // アニメーション初期化
501 robotModel->SetAnimEvaluatorNo( 0 );
502
503 // 表示/非表示
504 s32 visible = cmd->GetF32( "visible" );
505 if ( visible != 0 )
506 {
507 robotModel->SetVisible( true );
508 robot_visible++;
509 }
510 else
511 {
512 robotModel->SetVisible( false );
513 }
514
515 // インスタンスを保持します。
516 m_AddRobotArray.push_back( robotModel );
517 }
518
519 // 立体視パラメータ初期化
520 if ( strcmp( cmd->GetCommand(), "STEREO_PARAM" ) == 0 )
521 {
522 m_StereoLevel = cmd->GetF32( "level" );
523 m_StereoRange = cmd->GetF32( "range" );
524 // m_LevelSlider->SetParam( m_StereoLevel );
525 // m_RangeSlider->SetParam( m_StereoRange );
526 }
527
528 // デフォルトカメラの位置を設定する
529 if ( strcmp( cmd->GetCommand(), "DEFAULT_CAMERA" ) == 0 )
530 {
531 nw::math::VEC3 pos, target;
532 pos.x = cmd->GetF32( "px" );
533 pos.y = cmd->GetF32( "py" );
534 pos.z = cmd->GetF32( "pz" );
535 m_SmCamera->SetPadCameraPosition( &pos );
536
537 target.x = cmd->GetF32( "tx" );
538 target.y = cmd->GetF32( "ty" );
539 target.z = cmd->GetF32( "tz" );
540 m_SmCamera->SetPadCameraTarget( &target );
541 }
542 }
543
544 // 各追加オブジェクトの表示数でスライダバーの位置を調整します。
545 f32 sliderParam = static_cast<f32>(pierrot_visible)/m_AddPierrotArray.size();
546 m_PierrotSlider->SetParam(1.0f - sliderParam);
547
548 sliderParam = static_cast<f32>(robot_visible)/m_AddRobotArray.size();
549 m_RobotSlider->SetParam(1.0f - sliderParam);
550
551 sliderParam = static_cast<f32>(audience_visible)/m_AudienceArray.size();
552 m_AudienceSlider->SetParam(1.0f - sliderParam);
553 }
554
555 // シーンの初期化を行います。
556 m_GfxCtrl->InitializeScene();
557 }
558
559
560 //----------------------------------------
561 //! フレームの処理を行います。
562 void
Exec(f32 frame)563 Demo::Exec( f32 frame )
564 {
565 // ピエロのアニメーションを設定します。
566 m_Pierrot->SetAnimationFrame( frame );
567
568 // ロボットのアニメーションを設定します。
569 m_Robot->SetAnimationFrame( frame );
570
571 // カメラのアニメーションを設定します。
572 m_SmCamera->SetAnimationFrame( frame );
573
574 // パーティクルのアニメーションを設定します。
575 m_Particle->SetAnimationFrame( frame );
576
577 // ステージのアニメーションを設定します。
578 m_Stage->SetAnimationFrame( frame );
579
580 // 観客
581 for ( s32 i = 0; i < m_AudienceArray.size(); i++ )
582 {
583 m_AudienceArray[i]->SetAnimationFrame( frame );
584 }
585
586 // 追加ピエロ
587 for ( s32 i = 0; i < m_AddPierrotArray.size(); i++ )
588 {
589 m_AddPierrotArray[i]->SetAnimationFrame( frame );
590 }
591
592 // 追加ロボット
593 for ( s32 i = 0; i < m_AddRobotArray.size(); i++ )
594 {
595 m_AddRobotArray[i]->SetAnimationFrame( frame );
596 }
597
598 // ライトアニメーション
599 nw::gfx::AnimEvaluator* lightAnim = m_GfxCtrl->GetLightAnimEvaluator();
600 if (lightAnim)
601 {
602 lightAnim->SetFrame(frame);
603 }
604 }
605
606
607 //----------------------------------------
608 //! リセット処理を行います。
609 void
Reset()610 Demo::Reset()
611 {
612 m_Pierrot->SetAnimationFrame( 0.0f );
613 m_Robot->SetAnimationFrame( 0.0f );
614 m_SmCamera->SetAnimationFrame( 0.0f );
615 m_Particle->SetAnimationFrame( 0.0f );
616 m_Particle->Reset();
617 for ( s32 i = 0; i < m_AudienceArray.size(); i++ )
618 {
619 m_AudienceArray[i]->SetAnimationFrame( 0.0f );
620 }
621 }
622
623
624
625 //----------------------------------------
626 //! メッセージを受信します。
627 bool
ReceveMessage(SmMessageType type,void * object,uint targetId)628 Demo::ReceveMessage( SmMessageType type, void* object, uint targetId )
629 {
630 NW_UNUSED_VARIABLE(object);
631 NW_UNUSED_VARIABLE(targetId);
632
633 bool ret = false;
634 bool updateTree = false;
635
636 if ( type == SM_MESSAGE_UPDATE_PARAM )
637 {
638 switch( targetId )
639 {
640 // タブの切り替えを行います。
641 case DEMO_TAB0_VISIBLE_BTN:
642 m_LytTabPanel->SetAnimationNo( 0 );
643 m_Tab0Tree->SetEnable( true );
644 m_Tab1Tree->SetEnable( false );
645 m_Tab2Tree->SetEnable( false );
646 break;
647 case DEMO_TAB1_VISIBLE_BTN:
648 m_LytTabPanel->SetAnimationNo( 1 );
649 m_Tab0Tree->SetEnable( false );
650 m_Tab1Tree->SetEnable( true );
651 m_Tab2Tree->SetEnable( false );
652 /*
653 m_TouchPanelCamera->SetEnable( !m_CameraCtrlBtn->IsSwitch() );
654 */
655 break;
656 case DEMO_TAB2_VISIBLE_BTN:
657 m_LytTabPanel->SetAnimationNo( 2 );
658 m_Tab0Tree->SetEnable( false );
659 m_Tab1Tree->SetEnable( false );
660 m_Tab2Tree->SetEnable( true );
661 break;
662
663
664 // オブジェクト単位での表示/非表示を切り替えます。
665 case DEMO_PIERROT_VISIBLE_BTN:
666 m_Pierrot->SetVisible( m_LytPierrotVisibleBtn->IsSwitch() );
667 updateTree = true;
668 ret = true;
669 break;
670 case DEMO_ROBOT_VISIBLE_BTN:
671 m_Robot->SetVisible( m_LytRobotVisibleBtn->IsSwitch() );
672 updateTree = true;
673 ret = true;
674 break;
675 case DEMO_STAGE_VISIBLE_BTN:
676 m_Stage->SetVisible( m_LytStageVisibleBtn->IsSwitch() );
677 updateTree = true;
678 ret = true;
679 break;
680
681 case DEMO_EMPYREAN_VISIBLE_BTN:
682 /*
683 m_Empyrean->SetVisible( m_EmpyreanVisibleBtn->IsSwitch() );
684 ret = true;
685 */
686 break;
687
688 // メッシュ単位での表示/非表示を切り替えます。
689 case DEMO_STAGE_OBJECT_MESH_CTRL_SLDR:
690 m_StageObject->SetVisibleZone( 1.0f - m_StageMeshSlider->GetParam() );
691 updateTree = true;
692 ret = true;
693 break;
694
695 // 追加ピエロ数をスライダで調整します。
696 case DEMO_ADD_PIERROT_NUM_CTRL_SLDR:
697 {
698 f32 fparam = m_PierrotSlider->GetParam();
699 s32 visibleNum = m_AddPierrotArray.size() * (1.0f - m_PierrotSlider->GetParam());
700
701 for ( int i = 0; i < m_AddPierrotArray.size(); i++ )
702 {
703 if ( i < visibleNum )
704 {
705 m_AddPierrotArray[i]->SetVisible( true );
706 }
707 else
708 {
709 m_AddPierrotArray[i]->SetVisible( false );
710 }
711 }
712 updateTree = true;
713 ret = true;
714 }
715 break;
716
717 // 追加ロボット数をスライダで調整します。
718 case DEMO_ROBOT_NUM_CTRL_SLDR:
719 {
720 f32 fparam = m_RobotSlider->GetParam();
721 s32 visibleNum = m_AddRobotArray.size() * (1.0f - m_RobotSlider->GetParam());
722
723 for ( int i = 0; i < m_AddRobotArray.size(); i++ )
724 {
725 if ( i < visibleNum )
726 {
727 m_AddRobotArray[i]->SetVisible( true );
728 }
729 else
730 {
731 m_AddRobotArray[i]->SetVisible( false );
732 }
733 }
734 updateTree = true;
735 ret = true;
736 }
737 break;
738
739 // 観客数のスライダで調整します。
740 case DEMO_AUDIENCE_NUM_CTRL_SLDR:
741 {
742 f32 fparam = m_AudienceSlider->GetParam();
743 s32 visibleNum = m_AudienceArray.size() * (1.0f - m_AudienceSlider->GetParam());
744
745 for ( int i = 0; i < m_AudienceArray.size(); i++ )
746 {
747 if ( i < visibleNum )
748 {
749 m_AudienceArray[i]->SetVisible( true );
750 }
751 else
752 {
753 m_AudienceArray[i]->SetVisible( false );
754 }
755 }
756 updateTree = true;
757 ret = true;
758 }
759 break;
760
761 // パーティクルのオンオフを行います。
762 case DEMO_PARTICLE_VISIBLE_BTN:
763 m_Particle->SetVisible( m_LytParticleVisibleBtn->IsSwitch() );
764 updateTree = true;
765 ret = true;
766 break;
767
768 case DEMO_PARTICLE_NUM_CTRL_SLDR:
769 m_Particle->SetVisibleZone( 1.0f - m_ParticleSlider->GetParam() );
770 updateTree = true;
771 ret = true;
772 break;
773
774 default:
775 break;
776 }
777
778 // シーンを更新する。
779 m_GfxCtrl->TraverseScene();
780 }
781
782 // シーンを更新する。
783 if ( type == SM_MESSAGE_SCENE_UPDATE || updateTree )
784 {
785 m_GfxCtrl->TraverseScene();
786 }
787
788 // パッドメッセージに対応する
789 if ( type == SM_MESSAGE_PAD_UPDATE )
790 {
791 if ( m_SmCamera->IsPadCamera() )
792 {
793 m_LytTabPanel->SetVisiblePane( "CameraZoomIn", true );
794 m_LytTabPanel->SetVisiblePane( "CameraZoomOut", true );
795 }
796 else
797 {
798 m_LytTabPanel->SetVisiblePane( "CameraZoomIn", false );
799 m_LytTabPanel->SetVisiblePane( "CameraZoomOut", false );
800 }
801
802 m_LytUpdate = true;
803 }
804
805 return ret;
806 }
807
808 } // namespace
809