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