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