/*---------------------------------------------------------------------------* Project: NintendoWare File: demo.cpp Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Revision: 1 $ *---------------------------------------------------------------------------*/ #include #include "../include/demo.h" #include "../include/SmDef.h" #include "../include/SmInitialFileParser.h" namespace { // メニューに表示する文字列です。 const wchar_t* sMainMenuStrings[] = { L" Pierrot On-Off", L" Robot On-Off", L" Stage On-Off", L" Particle On-Off", }; //---------------------------------------- // コンストラクタ Demo::Demo( GfxCtrl* gfxCtrl, LytCtrl* lytCtrl ) : SmMessage( NULL ), m_GfxCtrl( gfxCtrl ), m_LytCtrl( lytCtrl ), m_Pierrot( NULL ), m_Robot( NULL ), m_Stage( NULL ), m_Stick( NULL ), m_Audience( NULL ), m_Empyrean( NULL ), m_LytTabPanel( NULL ), m_Tab0VisibleBtn( NULL ), m_Tab1VisibleBtn( NULL ), m_Tab2VisibleBtn( NULL ), m_Tab0Tree( NULL ), m_Tab1Tree( NULL ), m_Tab2Tree( NULL ), m_LytPierrotVisibleBtn( NULL ), m_LytRobotVisibleBtn( NULL ), m_LytStageVisibleBtn( NULL ), m_LytStereoOnOffBtn( NULL ), m_EmpyreanVisibleBtn( NULL ), m_CameraCtrlBtn( NULL ), m_TouchPanelCamera( NULL ), m_LevelSlider( NULL ), m_RangeSlider( NULL ), m_StereoLevel( 0.f ), m_StereoRange( 0.f ), m_PierrotSlider( NULL ), m_RobotSlider( NULL ), m_StageMeshSlider( NULL ), m_AudienceSlider( NULL ), m_SmCamera( NULL ), m_LytUpdate( NULL ) { m_CameraBasePos.x = 0.f; m_CameraBasePos.y = 0.f; m_CameraBasePos.z = 0.f; m_CameraBaseTarget.x = 0.f; m_CameraBaseTarget.y = 0.f; m_CameraBaseTarget.z = 0.f; } //---------------------------------------- // デストラクタ Demo::~Demo() { // GFXオブジェクト以外は破棄します。 SM_SAFE_DELETE( m_LytTabPanel ); SM_SAFE_DELETE( m_Tab0VisibleBtn ); SM_SAFE_DELETE( m_Tab1VisibleBtn ); SM_SAFE_DELETE( m_Tab2VisibleBtn ); SM_SAFE_DELETE( m_Tab0Tree ); SM_SAFE_DELETE( m_Tab1Tree ); SM_SAFE_DELETE( m_Tab2Tree ); SM_SAFE_DELETE( m_LytPierrotVisibleBtn ); SM_SAFE_DELETE( m_LytRobotVisibleBtn ); SM_SAFE_DELETE( m_LytStageVisibleBtn ); SM_SAFE_DELETE( m_LytParticleVisibleBtn ); SM_SAFE_DELETE( m_LytAudienceVisibleBtn ); SM_SAFE_DELETE( m_EmpyreanVisibleBtn ); SM_SAFE_DELETE( m_LytStereoOnOffBtn ); SM_SAFE_DELETE( m_CameraCtrlBtn ); SM_SAFE_DELETE( m_TouchPanelCamera ); SM_SAFE_DELETE( m_LevelSlider ); SM_SAFE_DELETE( m_RangeSlider ); SM_SAFE_DELETE( m_PierrotSlider ); SM_SAFE_DELETE( m_RobotSlider ); SM_SAFE_DELETE( m_StageMeshSlider ); SM_SAFE_DELETE( m_AudienceSlider ); SM_SAFE_DELETE( m_ParticleSlider ); } //---------------------------------------- // シーンの初期化 void Demo::InitializeScene() { /* Nw4cデモ、コンテンツ部分が記述されています。 生成されるGfxオブジェクトは、 GfxCtrlクラスを経由して生成されるSmModelクラスからアクセスされます。 */ // Gfxのオブジェクトなどの初期化を行います。 // 天球 m_Empyrean = m_GfxCtrl->CreateModel( NULL, NW_DEMO_FILE_PATH(L"toy_bg.bcmdl"), GfxCtrl::GFX_CTRL_VRAM_B ); m_Empyrean->SetLayerId( 0 ); // 天球はデフォルトで表示しない。 m_Empyrean->SetVisible( true ); // ピエロ m_Pierrot = m_GfxCtrl->CreateModel( NULL, NW_DEMO_FILE_PATH(L"toy_pierrot.bcmdl"), GfxCtrl::GFX_CTRL_VRAM_B ); m_Pierrot->SetLayerId( 5 ); // 追加ピエロ m_AddPierrot = m_GfxCtrl->CreateModel( NULL, NW_DEMO_FILE_PATH(L"toy_audience_pierrot.bcmdl"), GfxCtrl::GFX_CTRL_VRAM_B ); m_AddPierrot->SetVisible( false ); // 複製されたインスタンスを用いて描画。 m_AddPierrot->SetLayerId( 5 ); // ロボット m_Robot = m_GfxCtrl->CreateModel( NULL, NW_DEMO_FILE_PATH(L"toy_rbt.bcmdl"), GfxCtrl::GFX_CTRL_VRAM_B ); m_Robot->SetLayerId( 5 ); // 追加ロボット m_AddRobot = m_GfxCtrl->CreateModel( NULL, NW_DEMO_FILE_PATH(L"toy_audience_rbt.bcmdl"), GfxCtrl::GFX_CTRL_VRAM_B ); m_AddRobot->SetVisible( false ); // 複製されたインスタンスを用いて描画。 m_AddRobot->SetLayerId( 5 ); // ステージ m_Stage = m_GfxCtrl->CreateModel( NULL, NW_DEMO_FILE_PATH(L"stage_mat_fix.bcmdl"), GfxCtrl::GFX_CTRL_VRAM_A ); m_Stage->SetLayerId( 1 ); // ステージ小物 m_StageObject = m_GfxCtrl->CreateModel( NULL, NW_DEMO_FILE_PATH(L"stage_object.bcmdl"), GfxCtrl::GFX_CTRL_VRAM_A ); m_StageObject->SetLayerId( 5 ); m_StageObject->SetVisibleZone( 0.0f ); // 起動時は表示されていません。 // 観客 m_Audience = m_GfxCtrl->CreateModel( NULL, NW_DEMO_FILE_PATH(L"toy_audience.bcmdl"), GfxCtrl::GFX_CTRL_VRAM_A ); m_Audience->SetVisible( false ); // 複製されたインスタンスを用いて描画。 m_Audience->SetLayerId( 5 ); // ライト等 m_GfxCtrl->CreateSceneEnvironment( NW_DEMO_FILE_PATH(L"mrn_rbt_light.bcenv") ); // パーティクル m_Particle = m_GfxCtrl->CreateParticle( NW_DEMO_FILE_PATH(L"paper_storm_particle.bcres") ); m_Particle->SetLayerId( 6 ); // カメラ等 m_GfxCtrl->CreateCamera( NW_DEMO_FILE_PATH(L"cam_ani.bccam") ); // カメラを取得 m_SmCamera = m_GfxCtrl->GetSmCamera(); // カメラの初期視点、注視点を保持 m_SmCamera->GetPosition( &m_CameraBasePos ); m_SmCamera->GetTarget( &m_CameraBaseTarget ); // カメラはパッドで操作されるので、メッセージツリーにつなぐ this->AddChild( m_SmCamera ); { // ピエロのアニメーションをセットする m_Pierrot->SetAnimEvaluatorNo( 0 ); m_Pierrot->SetAnimationFrame( 0.f ); // ロボ位置変更 if ( m_Robot ) { m_Robot->SetAnimEvaluatorNo( 0 ); m_Robot->SetAnimationFrame( 0.f ); } // カメラアニメーションをセット m_SmCamera->SetAnimEvaluatorNo( 0 ); // 観客のアニメーションをセットする m_Audience->SetAnimEvaluatorNo( 0 ); m_Audience->SetAnimationFrame( 0.f ); // ステージのアニメーションをセットする m_Stage->SetAnimEvaluatorNo( 0 ); m_StageObject->SetAnimEvaluatorNo( 0 ); } /* UIはSmMessageクラスを利用したツリー構造で管理されています。 main.cppから、タッチパネルやパッドのメッセージが送信され、 各クラス内ReceveMessageにてメッセージに応じて適切な処理が行われます。 */ // 下画面操作パネルUIの初期化を行います。 { // タブ用レイアウトのファイル構成です。 m_tabResFile.clyt = "tab.bclyt"; m_tabResFile.clan.push_back( "tab_Tag_Tab00.bclan" ); m_tabResFile.clan.push_back( "tab_Tag_Tab01.bclan" ); m_tabResFile.clan.push_back( "tab_Tag_Tab02.bclan" ); #if 0 // 現在未使用 // メニューボタン用レイアウトのファイル構成です。 LytResourceFile menuResFile; menuResFile.clyt = "ctr_demo_layout.bclyt"; menuResFile.clan.push_back( "ctr_demo_layout_Tag_on.bclan" ); menuResFile.clan.push_back( "ctr_demo_layout_Tag_off.bclan" ); menuResFile.clan.push_back( "ctr_demo_layout_Tag_on_hold.bclan" ); SmLayoutResource* menuBtnRes = m_LytCtrl->CreateSmLayoutResource( NW_DEMO_FILE_PATH(L"menu_btn.arc"), menuResFile ); // ボタン用レイアウトのファイル構成です。 LytResourceFile btnResFile; btnResFile.clyt = "push_button.bclyt"; btnResFile.clan.push_back( "push_button_Tag_push_on.bclan" ); btnResFile.clan.push_back( "push_button_Tag_push_off.bclan" ); SmLayoutResource* btnRes = m_LytCtrl->CreateSmLayoutResource( NW_DEMO_FILE_PATH(L"button.arc"), btnResFile ); #endif // ピエロボタン用レイアウトのファイル構成です。 m_btnPierrorResFile.clyt = "push_button.bclyt"; m_btnPierrorResFile.clan.push_back( "push_button_Tag_push_on.bclan" ); m_btnPierrorResFile.clan.push_back( "push_button_Tag_push_off.bclan" ); SmLayoutResource* btnPierrotRes = m_LytCtrl->CreateSmLayoutResource( NW_DEMO_FILE_PATH(L"pierrot_btn.arc"), m_btnPierrorResFile ); // ロボットボタン用レイアウトのファイル構成です。 m_btnRobotResFile.clyt = "push_button.bclyt"; m_btnRobotResFile.clan.push_back( "push_button_Tag_push_on.bclan" ); m_btnRobotResFile.clan.push_back( "push_button_Tag_push_off.bclan" ); SmLayoutResource* btnRobotRes = m_LytCtrl->CreateSmLayoutResource( NW_DEMO_FILE_PATH(L"robot_btn.arc"), m_btnRobotResFile ); // ステージボタン用レイアウトのファイル構成です。 m_btnStageResFile.clyt = "push_button.bclyt"; m_btnStageResFile.clan.push_back( "push_button_Tag_push_on.bclan" ); m_btnStageResFile.clan.push_back( "push_button_Tag_push_off.bclan" ); SmLayoutResource* btnStageRes = m_LytCtrl->CreateSmLayoutResource( NW_DEMO_FILE_PATH(L"stage_btn.arc"), m_btnStageResFile ); // 観客ボタン用レイアウトのファイル構成です。 m_btnAudienceResFile.clyt = "push_button.bclyt"; m_btnAudienceResFile.clan.push_back( "push_button_Tag_push_on.bclan" ); m_btnAudienceResFile.clan.push_back( "push_button_Tag_push_off.bclan" ); SmLayoutResource* btnAudienceRes = m_LytCtrl->CreateSmLayoutResource( NW_DEMO_FILE_PATH(L"audience_btn.arc"), m_btnAudienceResFile ); // パーティクルボタン用レイアウトのファイル構成です。 m_btnParticleResFile.clyt = "push_button.bclyt"; m_btnParticleResFile.clan.push_back( "push_button_Tag_push_on.bclan" ); m_btnParticleResFile.clan.push_back( "push_button_Tag_push_off.bclan" ); SmLayoutResource* btnParticleRes = m_LytCtrl->CreateSmLayoutResource( NW_DEMO_FILE_PATH(L"particle_btn.arc"), m_btnParticleResFile ); // スライダバー用レイアウトのファイル構成です。 m_sliderResFile.clyt = "slider.bclyt"; SmLayoutResource* sliderRes = m_LytCtrl->CreateSmLayoutResource( NW_DEMO_FILE_PATH(L"slider.arc"), m_sliderResFile ); // タブのレイアウトクラスを生成します。 SmLayoutResource* tabPanelRes = m_LytCtrl->CreateSmLayoutResource( NW_DEMO_FILE_PATH(L"tab.arc"), m_tabResFile ); m_LytTabPanel = m_LytCtrl->CreateSmLayout( tabPanelRes ); m_LytTabPanel->SetVisiblePane( "camera_zoom_00", false ); m_LytTabPanel->SetVisiblePane( "camera_zoom_01", false ); // タブ0のオンオフボタンを生成します。 nw::ut::Rect rect = tabPanelRes->GetRect( "Tab_Bounding_00" ); m_Tab0VisibleBtn = new SmButton( rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight() ); this->AddChild( m_Tab0VisibleBtn ); m_Tab0VisibleBtn->SetTarget( this, DEMO_TAB0_VISIBLE_BTN ); m_Tab0VisibleBtn->SetVisible( false ); // タブ1のオンオフボタンを生成します。 rect = tabPanelRes->GetRect( "Tab_Bounding_01" ); m_Tab1VisibleBtn = new SmButton( rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight() ); this->AddChild( m_Tab1VisibleBtn ); m_Tab1VisibleBtn->SetTarget( this, DEMO_TAB1_VISIBLE_BTN ); m_Tab1VisibleBtn->SetSwitch( false ); m_Tab1VisibleBtn->SetVisible( false ); // タブ2のオンオフボタンを生成します。 rect = tabPanelRes->GetRect( "Tab_Bounding_02" ); m_Tab2VisibleBtn = new SmButton( rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight() ); this->AddChild( m_Tab2VisibleBtn ); m_Tab2VisibleBtn->SetTarget( this, DEMO_TAB2_VISIBLE_BTN ); m_Tab2VisibleBtn->SetSwitch( false ); m_Tab2VisibleBtn->SetVisible( false ); // タブ0の中身を生成します。 m_Tab0Tree = new SmMessage( this ); this->AddChild( m_Tab0Tree ); { f32 baseX = 80.f; // ピエロのオンオフボタンを生成します。 m_LytPierrotVisibleBtn = new SmLytButton( m_LytCtrl->CreateSmLayout( btnPierrotRes ), NULL, "push_00_Bounding" ); m_Tab0Tree->AddChild( m_LytPierrotVisibleBtn ); m_LytPierrotVisibleBtn->SetPosition( baseX -120.0f, -50.f ); m_LytPierrotVisibleBtn->SetTarget( this, DEMO_PIERROT_VISIBLE_BTN ); // 追加ピエロの表示数調整スライダーを生成します。 m_PierrotSlider = new SmLytSliderBar( baseX -120, 40, m_LytCtrl->CreateSmLayout( sliderRes ) ); m_Tab0Tree->AddChild( m_PierrotSlider ); m_PierrotSlider->SetTarget( this, DEMO_ADD_PIERROT_NUM_CTRL_SLDR ); m_PierrotSlider->SetParam( 1.f ); // ロボットのオンオフボタンを生成します。 m_LytRobotVisibleBtn = new SmLytButton( m_LytCtrl->CreateSmLayout( btnRobotRes ), NULL, "push_00_Bounding" ); m_Tab0Tree->AddChild( m_LytRobotVisibleBtn ); m_LytRobotVisibleBtn->SetPosition( baseX -80.0f, -50.f ); m_LytRobotVisibleBtn->SetTarget( this, DEMO_ROBOT_VISIBLE_BTN ); // 追加ロボットの表示数調整スライダーを生成します。 m_RobotSlider = new SmLytSliderBar( baseX -80, 40, m_LytCtrl->CreateSmLayout( sliderRes ) ); m_Tab0Tree->AddChild( m_RobotSlider ); m_RobotSlider->SetTarget( this, DEMO_ROBOT_NUM_CTRL_SLDR ); m_RobotSlider->SetParam( 1.f ); // ステージOn-Offボタンを生成します。 m_LytStageVisibleBtn = new SmLytButton( m_LytCtrl->CreateSmLayout( btnStageRes ), NULL, "push_00_Bounding" ); m_LytStageVisibleBtn->SetPosition( baseX -40.0f, -50.f ); m_Tab0Tree->AddChild( m_LytStageVisibleBtn ); m_LytStageVisibleBtn->SetTarget( this, DEMO_STAGE_VISIBLE_BTN ); // ステージ小物のメッシュコントロール用スライダーを生成します。 m_StageMeshSlider = new SmLytSliderBar( baseX -40, 40, m_LytCtrl->CreateSmLayout( sliderRes ) ); m_Tab0Tree->AddChild( m_StageMeshSlider ); m_StageMeshSlider->SetTarget( this, DEMO_STAGE_OBJECT_MESH_CTRL_SLDR ); m_StageMeshSlider->SetParam( 1.f ); // 観客On-Offボタンを生成します。 m_LytAudienceVisibleBtn = new SmLytButton( m_LytCtrl->CreateSmLayout( btnAudienceRes ), NULL, "push_00_Bounding" ); m_LytAudienceVisibleBtn->SetPosition( baseX + 0.0f, -50.f ); m_Tab0Tree->AddChild( m_LytAudienceVisibleBtn ); m_LytAudienceVisibleBtn->SetTarget( this, DEMO_AUDIENCE_VISIBLE_BTN ); // 観客の増減コントロール用スライダーを生成します。 m_AudienceSlider = new SmLytSliderBar( baseX + 0.0f, 40.0f, m_LytCtrl->CreateSmLayout( sliderRes ) ); m_Tab0Tree->AddChild( m_AudienceSlider ); m_AudienceSlider->SetTarget( this, DEMO_AUDIENCE_NUM_CTRL_SLDR ); m_AudienceSlider->SetParam( 1.f ); // パーティクルのオンオフボタンを生成します。 m_LytParticleVisibleBtn = new SmLytButton( m_LytCtrl->CreateSmLayout( btnParticleRes ), NULL, "push_00_Bounding" ); m_Tab0Tree->AddChild( m_LytParticleVisibleBtn ); m_LytParticleVisibleBtn->SetPosition( baseX + 40.0f, -50.0f ); m_LytParticleVisibleBtn->SetTarget( this, DEMO_PARTICLE_VISIBLE_BTN ); // パーティクル制御用スライダーを生成します。 m_ParticleSlider = new SmLytSliderBar( baseX + 40.0f, 40.0f, m_LytCtrl->CreateSmLayout( sliderRes ) ); m_Tab0Tree->AddChild( m_ParticleSlider ); m_ParticleSlider->SetTarget( this, DEMO_PARTICLE_NUM_CTRL_SLDR ); m_ParticleSlider->SetParam( 0.f ); } // 初期状態を無効 m_Tab0Tree->SetEnable( false ); // タブ1の中身を生成します。 m_Tab1Tree = new SmMessage( this ); this->AddChild( m_Tab1Tree ); { #if 0 // タッチパネルカメラ m_TouchPanelCamera = new SmTouchPanelCamera( m_GfxCtrl->GetSmCamera() ); m_Tab1Tree->AddChild( m_TouchPanelCamera ); m_TouchPanelCamera->SetEnable( false ); // カメラ、アニメ/タッチパネルカメラ切り替え m_LytStereoOnOffBtn = new SmLytButton( m_LytCtrl->CreateSmLayout( btnRes ), NULL, "push_00_Bounding" ); m_Tab1Tree->AddChild( m_LytStereoOnOffBtn ); m_LytStereoOnOffBtn->SetPosition( 90.0f, -50.f ); // ステレオ切り替え m_CameraCtrlBtn = new SmLytButton( m_LytCtrl->CreateSmLayout( btnRes ), NULL, "push_00_Bounding" ); m_Tab1Tree->AddChild( m_CameraCtrlBtn ); m_CameraCtrlBtn->SetPosition( 130.0f, -50.f ); m_CameraCtrlBtn->SetTarget( this, DEMO_CAMERA_CTRL_BTN ); // 視差調整スライダ m_LevelSlider = new SmLytSliderBar( 130, 40, m_LytCtrl->CreateSmLayout( sliderRes ) ); m_Tab1Tree->AddChild( m_LevelSlider ); m_RangeSlider = new SmLytSliderBar( 90, 40, m_LytCtrl->CreateSmLayout( sliderRes ) ); m_Tab1Tree->AddChild( m_RangeSlider ); #endif } // 初期状態を無効 m_Tab1Tree->SetEnable( false ); // タブ2の中身を生成します。 m_Tab2Tree = new SmMessage( this ); this->AddChild( m_Tab2Tree ); { #if 0 // 天球オンオフ切り替え m_EmpyreanVisibleBtn = new SmLytButton( m_LytCtrl->CreateSmLayout( btnRes ), NULL, "push_00_Bounding" ); m_Tab2Tree->AddChild( m_EmpyreanVisibleBtn ); m_EmpyreanVisibleBtn->SetPosition( 90.0f, -50.f ); m_EmpyreanVisibleBtn->SetTarget( this, DEMO_EMPYREAN_VISIBLE_BTN ); m_EmpyreanVisibleBtn->SetSwitch( false ); #endif } // 初期状態を有効 m_Tab2Tree->SetEnable( true ); m_LytTabPanel->SetAnimationNo( 2 ); } /* デモの初期状態を記述した初期化ファイル(CmdTree.txt)をロードし、 書かれている内容を実行します。 */ { #if 1 // 乱数 nw::gfx::ParticleRandom random; s32 pierrot_visible = 0; s32 robot_visible = 0; s32 audience_visible = 0; f32 stage_obj_rate = 0.0f; f32 particle_rate = 0.0f; // 初期化ファイル const SmCmd* cmd; SmInitialFileParser* parser = new SmInitialFileParser(); parser->Load( NW_DEMO_FILE_PATH(L"CmdTree.txt") ); for ( u32 i = 0; i < parser->GetCmdNum(); i ++ ) { cmd = parser->GetCmd( i ); // ステージ小物の初期状態を設定します。 if ( strcmp( cmd->GetCommand(), "STAGE_OBJECT" ) == 0 ) { stage_obj_rate = cmd->GetF32( "rate" ); m_StageMeshSlider->SetParam(1.0f - stage_obj_rate); m_StageObject->SetVisibleZone(stage_obj_rate); } // パーティクルの初期状態を設定します。 if ( strcmp( cmd->GetCommand(), "PARTICLE" ) == 0 ) { particle_rate = cmd->GetF32( "rate" ); m_ParticleSlider->SetParam(1.0f - particle_rate); m_Particle->SetVisibleZone(particle_rate); } // 観客オブジェクトの初期状態を設定します。 if ( strcmp( cmd->GetCommand(), "ADD_AUDIENCE" ) == 0 ) { // 観客を複製します。 SmModel* audienceModel = m_Audience->Duplicate(); m_GfxCtrl->AddModel( audienceModel ); // 表示位置を調整します。 f32 x = cmd->GetF32( "tx" ); f32 y = cmd->GetF32( "ty" ); f32 z = cmd->GetF32( "tz" ); audienceModel->SetPosition( x, y, z ); // 表示角度を調整します。 f32 rx = cmd->GetF32( "rx" ); f32 ry = cmd->GetF32( "ry" ); f32 rz = cmd->GetF32( "rz" ); audienceModel->SetRotate( rx, ry, rz ); // アニメーション初期化 audienceModel->SetAnimEvaluatorNo( 0 ); // 表示/非表示 s32 visible = cmd->GetF32( "visible" ); if ( visible != 0 ) { audienceModel->SetVisible( true ); audience_visible++; } else { audienceModel->SetVisible( false ); } m_AudienceArray.push_back( audienceModel ); } // ピエロの追加 if ( strcmp( cmd->GetCommand(), "ADD_PIERROT" ) == 0 ) { // 観客を複製します。 SmModel* pierrotModel = m_AddPierrot->Duplicate(); m_GfxCtrl->AddModel( pierrotModel ); // 表示位置を調整します。 f32 x = cmd->GetF32( "tx" ); f32 y = cmd->GetF32( "ty" ); f32 z = cmd->GetF32( "tz" ); pierrotModel->SetPosition( x, y, z ); // 表示角度を調整します。 f32 rx = cmd->GetF32( "rx" ); f32 ry = cmd->GetF32( "ry" ); f32 rz = cmd->GetF32( "rz" ); pierrotModel->SetRotate( rx, ry, rz ); // アニメーション初期化 pierrotModel->SetAnimEvaluatorNo( 0 ); // 表示/非表示 s32 visible = cmd->GetF32( "visible" ); if ( visible != 0 ) { pierrotModel->SetVisible( true ); pierrot_visible++; } else { pierrotModel->SetVisible( false ); } // インスタンスを保持します。 m_AddPierrotArray.push_back( pierrotModel ); } // ロボットの追加 if ( strcmp( cmd->GetCommand(), "ADD_ROBOT" ) == 0 ) { // 観客を複製します。 SmModel* robotModel = m_AddRobot->Duplicate(); m_GfxCtrl->AddModel( robotModel ); // 表示位置を調整します。 f32 x = cmd->GetF32( "tx" ); f32 y = cmd->GetF32( "ty" ); f32 z = cmd->GetF32( "tz" ); robotModel->SetPosition( x, y, z ); // 表示角度を調整します。 f32 rx = cmd->GetF32( "rx" ); f32 ry = cmd->GetF32( "ry" ); f32 rz = cmd->GetF32( "rz" ); robotModel->SetRotate( rx, ry, rz ); // アニメーション初期化 robotModel->SetAnimEvaluatorNo( 0 ); // 表示/非表示 s32 visible = cmd->GetF32( "visible" ); if ( visible != 0 ) { robotModel->SetVisible( true ); robot_visible++; } else { robotModel->SetVisible( false ); } // インスタンスを保持します。 m_AddRobotArray.push_back( robotModel ); } // 立体視パラメータ初期化 if ( strcmp( cmd->GetCommand(), "STEREO_PARAM" ) == 0 ) { m_StereoLevel = cmd->GetF32( "level" ); m_StereoRange = cmd->GetF32( "range" ); // m_LevelSlider->SetParam( m_StereoLevel ); // m_RangeSlider->SetParam( m_StereoRange ); } // デフォルトカメラの位置を設定する if ( strcmp( cmd->GetCommand(), "DEFAULT_CAMERA" ) == 0 ) { nw::math::VEC3 pos, target; pos.x = cmd->GetF32( "px" ); pos.y = cmd->GetF32( "py" ); pos.z = cmd->GetF32( "pz" ); m_SmCamera->SetPadCameraPosition( &pos ); target.x = cmd->GetF32( "tx" ); target.y = cmd->GetF32( "ty" ); target.z = cmd->GetF32( "tz" ); m_SmCamera->SetPadCameraTarget( &target ); } } // 各追加オブジェクトの表示数でスライダバーの位置を調整します。 f32 sliderParam = static_cast(pierrot_visible)/m_AddPierrotArray.size(); m_PierrotSlider->SetParam(1.0f - sliderParam); sliderParam = static_cast(robot_visible)/m_AddRobotArray.size(); m_RobotSlider->SetParam(1.0f - sliderParam); sliderParam = static_cast(audience_visible)/m_AudienceArray.size(); m_AudienceSlider->SetParam(1.0f - sliderParam); #endif } // シーンの初期化を行います。 m_GfxCtrl->InitializeScene(); } //---------------------------------------- //! フレームの処理を行います。 void Demo::Exec( f32 frame ) { // ピエロのアニメーションを設定します。 m_Pierrot->SetAnimationFrame( frame ); // ロボットのアニメーションを設定します。 m_Robot->SetAnimationFrame( frame ); // カメラのアニメーションを設定します。 m_SmCamera->SetAnimationFrame( frame ); // パーティクルのアニメーションを設定します。 m_Particle->SetAnimationFrame( frame ); // ステージのアニメーションを設定します。 m_Stage->SetAnimationFrame( frame ); // 観客 for ( s32 i = 0; i < m_AudienceArray.size(); i++ ) { m_AudienceArray[i]->SetAnimationFrame( frame ); } // 追加ピエロ for ( s32 i = 0; i < m_AddPierrotArray.size(); i++ ) { m_AddPierrotArray[i]->SetAnimationFrame( frame ); } // 追加ロボット for ( s32 i = 0; i < m_AddRobotArray.size(); i++ ) { m_AddRobotArray[i]->SetAnimationFrame( frame ); } // ライトアニメーション nw::gfx::AnimEvaluator* lightAnim = m_GfxCtrl->GetLightAnimEvaluator(); if (lightAnim) { lightAnim->SetFrame(frame); } } //---------------------------------------- //! リセット処理を行います。 void Demo::Reset() { m_Pierrot->SetAnimationFrame( 0.0f ); m_Robot->SetAnimationFrame( 0.0f ); m_SmCamera->SetAnimationFrame( 0.0f ); m_Particle->SetAnimationFrame( 0.0f ); m_Particle->Reset(); for ( s32 i = 0; i < m_AudienceArray.size(); i++ ) { m_AudienceArray[i]->SetAnimationFrame( 0.0f ); } } //---------------------------------------- //! メッセージを受信します。 bool Demo::ReceveMessage( SmMessageType type, void* object, uint targetId ) { NW_UNUSED_VARIABLE(object); NW_UNUSED_VARIABLE(targetId); bool ret = false; if ( type == SM_MESSAGE_UPDATE_PARAM ) { switch( targetId ) { // タブの切り替えを行います。 case DEMO_TAB0_VISIBLE_BTN: m_LytTabPanel->SetAnimationNo( 0 ); m_Tab0Tree->SetEnable( true ); m_Tab1Tree->SetEnable( false ); m_Tab2Tree->SetEnable( false ); break; case DEMO_TAB1_VISIBLE_BTN: m_LytTabPanel->SetAnimationNo( 1 ); m_Tab0Tree->SetEnable( false ); m_Tab1Tree->SetEnable( true ); m_Tab2Tree->SetEnable( false ); /* m_TouchPanelCamera->SetEnable( !m_CameraCtrlBtn->IsSwitch() ); */ break; case DEMO_TAB2_VISIBLE_BTN: m_LytTabPanel->SetAnimationNo( 2 ); m_Tab0Tree->SetEnable( false ); m_Tab1Tree->SetEnable( false ); m_Tab2Tree->SetEnable( true ); break; // オブジェクト単位での表示/非表示を切り替えます。 case DEMO_PIERROT_VISIBLE_BTN: m_Pierrot->SetVisible( m_LytPierrotVisibleBtn->IsSwitch() ); ret = true; break; case DEMO_ROBOT_VISIBLE_BTN: m_Robot->SetVisible( m_LytRobotVisibleBtn->IsSwitch() ); ret = true; break; case DEMO_STAGE_VISIBLE_BTN: m_Stage->SetVisible( m_LytStageVisibleBtn->IsSwitch() ); ret = true; break; case DEMO_EMPYREAN_VISIBLE_BTN: /* m_Empyrean->SetVisible( m_EmpyreanVisibleBtn->IsSwitch() ); ret = true; */ break; // カメラアニメーションとタッチパネルカメラの切り替えを行います。 case DEMO_CAMERA_CTRL_BTN: /* if ( m_CameraCtrlBtn->IsSwitch() ) { // カメラアニメへ切り替えます。 m_SmCamera->SetPosition( &m_CameraBasePos ); m_SmCamera->SetTarget( &m_CameraBaseTarget ); m_SmCamera->SetAnimEvaluatorNo( 0 ); m_TouchPanelCamera->SetEnable( false ); } else { // タッチパネルカメラへ切り替えます。 m_SmCamera->DetachAnimEvaluator(); m_TouchPanelCamera->SetEnable( true ); } */ break; // メッシュ単位での表示/非表示を切り替えます。 case DEMO_STAGE_OBJECT_MESH_CTRL_SLDR: m_StageObject->SetVisibleZone( 1.0f - m_StageMeshSlider->GetParam() ); break; // 追加ピエロ数をスライダで調整します。 case DEMO_ADD_PIERROT_NUM_CTRL_SLDR: { f32 fparam = m_PierrotSlider->GetParam(); s32 visibleNum = m_AddPierrotArray.size() * (1.0f - m_PierrotSlider->GetParam()); for ( int i = 0; i < m_AddPierrotArray.size(); i++ ) { if ( i < visibleNum ) { m_AddPierrotArray[i]->SetVisible( true ); } else { m_AddPierrotArray[i]->SetVisible( false ); } } } break; // 追加ロボット数をスライダで調整します。 case DEMO_ROBOT_NUM_CTRL_SLDR: { f32 fparam = m_RobotSlider->GetParam(); s32 visibleNum = m_AddRobotArray.size() * (1.0f - m_RobotSlider->GetParam()); for ( int i = 0; i < m_AddRobotArray.size(); i++ ) { if ( i < visibleNum ) { m_AddRobotArray[i]->SetVisible( true ); } else { m_AddRobotArray[i]->SetVisible( false ); } } } break; // 観客数のスライダで調整します。 case DEMO_AUDIENCE_NUM_CTRL_SLDR: { f32 fparam = m_AudienceSlider->GetParam(); s32 visibleNum = m_AudienceArray.size() * (1.0f - m_AudienceSlider->GetParam()); for ( int i = 0; i < m_AudienceArray.size(); i++ ) { if ( i < visibleNum ) { m_AudienceArray[i]->SetVisible( true ); } else { m_AudienceArray[i]->SetVisible( false ); } } } break; // パーティクルのオンオフを行います。 case DEMO_PARTICLE_VISIBLE_BTN: { m_Particle->SetVisible( m_LytParticleVisibleBtn->IsSwitch() ); } break; case DEMO_PARTICLE_NUM_CTRL_SLDR: { m_Particle->SetVisibleZone( 1.0f - m_ParticleSlider->GetParam() ); } break; default: break; } // シーンを更新する。 m_GfxCtrl->TraverseScene(); } // シーンを更新する。 if ( type == SM_MESSAGE_SCENE_UPDATE ) { m_GfxCtrl->TraverseScene(); } // パッドメッセージに対応する if ( type == SM_MESSAGE_PAD_UPDATE ) { if ( m_SmCamera->IsPadCamera() ) { m_LytTabPanel->SetVisiblePane( "camera_zoom_00", true ); m_LytTabPanel->SetVisiblePane( "camera_zoom_01", true ); } else { m_LytTabPanel->SetVisiblePane( "camera_zoom_00", false ); m_LytTabPanel->SetVisiblePane( "camera_zoom_01", false ); } m_LytUpdate = true; } return ret; } } // namespace