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