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