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