/** * @file * @brief マップを描画 * @date 2009-09-16 Selene ver 1.11にて適当なサンプルソース(Sample.cpp)にコピペ動作確認 */ /*--------------------------------------------------------------------------*/ /* Include */ /*--------------------------------------------------------------------------*/ #include /*--------------------------------------------------------------------------*/ /* WinMain */ /*--------------------------------------------------------------------------*/ int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) { // ----------------------------------------------------------- // // はじめのお約束作業 // めんどうなのでコメント削除 // // ----------------------------------------------------------- using namespace Selene; const Point2DI SCREEN_SIZE( 1024, 576 ); Engine::ICore* pCore = NULL; Engine::Renderer::Standard::IRenderer* pRenderer = NULL; Engine::Renderer::Standard::SParameter RendererParameter; Engine::Graphics::Resource::STM::IModelController *pMapModel = NULL; Kernel::Math::Camera CameraTable[Engine::Renderer::Standard::VIEW_TYPE_MAX]; Engine::File::IFile* pFile; #if defined(SLN_DEVELOP) if ( !Selene::InitializeEngine( L"Selene.Develop.dll" ) ) #elif defined(SLN_DEBUG) if ( !Selene::InitializeEngine( L"Selene.Debug.dll" ) ) #else // SLN_DEBUG if ( !Selene::InitializeEngine( L"Selene.dll" ) ) #endif { return 1; } pCore = Selene::CreateCore(); if ( !pCore->Initialize( L"Selene Sample Program", SCREEN_SIZE, true, true ) ) { return 1; } if ( !pCore->CreateGraphicsManager() ) { return 1; } if ( !pCore->CreateRendererManager() ) { return 1; } //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-==-=-=-= // ファイルマネージャーの生成 // ファイル読み込みを行うためのエンジンを初期化 pCore->CreateFileManager(); // 暗号解除用プラグイン // ファイルを暗号化してパックしてある場合に // 暗号解除に利用するプラグインと解除用のパスワードを指定 // 暗号化はデータの中身を隠す目的としては有用だが // 当然読み込み速度を犠牲にするので使いどころに注意。 // pCore->GetFileManager()->SetCryptPlugin( L"Plugin/File/Crypt.dll", "Sample-Password" ); // ファイル読み込み対象のパスのリスト // 指定ディレクトリ以下を順に検索していく // // Sample/ の Data/test.dat と SampleNew/ の /Data/test.dat があった場合は // 後に指定した方が検索対象として登録される。 // リリース後にパッチ等でデータの差し替え尾を行う場合に // 古い方のデータを変更せずソースの変更もなしで差し替える事が可能 // const wchar_t* pFilePathList[] = { L"../../Media", // 最初に検索するディレクトリ NULL, // NULLで検索終了 }; pCore->GetFileManager()->UpdateRootPath( pFilePathList ); pRenderer = pCore->GetRendererManager()->CreateStandardRenderer(); RendererParameter.UseProgrammableShader = true; // 利用可能ならシェーダーを使って描画 RendererParameter.Effect.IsFog = false; // フォグの有無 RendererParameter.Effect.IsScattering = false; // スキャッタリングの有無 RendererParameter.Effect.IsDepthOfField = false; // 被写界深度処理の有無 RendererParameter.Effect.IsHighDynamicRange = false; // HDRレンダリングの有無 RendererParameter.Effect.IsSoftParticle = false; // ソフトパーティクルの有無 RendererParameter.Effect.IsMotionBlur = false; // モーションブラーの有無 RendererParameter.Effect.IsAmbientOcclusion = false; // アンビエント隠蔽 RendererParameter.Effect.ShadowType = Engine::Renderer::Standard::SHADOW_MAP_DISABLE; // 影マップの種類 pRenderer->Initialize( RendererParameter ); pRenderer->CreateView( Engine::Renderer::Standard::VIEW_TYPE_01, RectI(0,0,SCREEN_SIZE.x,SCREEN_SIZE.y), true, ColorF(0.5f,0.8f,0.5f,1.0f), true ); pRenderer->SetParameter_MainLight( sVectorS( 0.5f, 2.0f,-2.0f ), // 平行光源の位置 sVectorS( 0.0f, 0.0f, 0.0f ), // 平行光源のターゲット位置 sVectorS( 0.8f, 0.8f, 0.8f ), // 平行光源の色 sVectorS( 0.4f, 0.4f, 0.4f ), // 半球ライトの地面からの照り返し sVectorS( 0.2f, 0.2f, 0.2f ) ); // 半球ライトの空からの色 // ----------------------------------------------------------- // // // ここからが本番 // // // ----------------------------------------------------------- // ファイルの読み込みを行う対象のディレクトリへ移動 pCore->GetFileManager()->SetCurrentPath( L"Map" ); // ファイルの読み込みを行う // このメソッドは読み込みが完了するまで関数から戻りません pFile = pCore->GetFileManager()->OpenSyncFile( L"Kaidan.stm" ); if ( pFile != NULL && pFile->IsLoaded() ) { // ファイルからテクスチャを生成する pMapModel = pCore->GetGraphicsManager()->CreateMap( pFile->GetData(), // データのポインタ pFile->GetSize(), // データのサイズ pFile->GetFileName() // データの名称(内部で同一名称のファイルを使いまわすようにしています) ); SAFE_RELEASE( pFile ); } else { SLN_ASSERT( pFile, "ファイルの読みこみに失敗しました\n" ); } // ----------------------------------------------------------- // 生成したプリミティブをレンダラーに登録する // これ重要! // ----------------------------------------------------------- pRenderer->AddDrawObject(pMapModel, true); //------------------------------------------------------------ // メインループ // Seleneを利用する上でのメインループの書き方です // ICore::DoEvent()でOSのイベント処理を行います。 //------------------------------------------------------------ static float fCameraAngleY = 0.0f; while(pCore->DoEvent(60)) { //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- // 画面のクリア //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- pCore->GetGraphicsManager()->Clear(true, false, ColorF(0.7f,0.7f,0.7f)); //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- // フレームの開始 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- pCore->FrameBegin(); //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- // カメラの設定 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- // パースペクティブ行列 Kernel::Math::Camera *pCamera = &CameraTable[Engine::Renderer::Standard::VIEW_TYPE_01]; pCamera->PerspectiveFovLH( Kernel::Math::DegToPi( 45 ), toF(SCREEN_SIZE.x)/toF(SCREEN_SIZE.y), 0.1f, 2000.0f ); pCamera->LookAt( sVectorS( 0.0f, 7.0f, -15.0f ), // 位置 sVectorS( 0.0f, 0.0f, 0.0f ), // 注視位置 sVectorS( 0.0f, 0.0f, 1.0f ) ); // 上向き角度 // 回転 pCamera->SetWorldMatrix( pCamera->GetViewMatrixInverse() * Kernel::Math::MatX::RotationY( fCameraAngleY ) ); fCameraAngleY += 0.01f; // フラスタム更新 pCamera->UpdateFrustum(); // ----------------------------------------------------------- // カメラを利用して描画 // pRenderer->AddDrawObjectしたやつを描画するっぽい // ----------------------------------------------------------- pRenderer->SimpleRendering(CameraTable); //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- // フレームの終了 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- pCore->FrameEnd(); //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- // 画面の更新 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- pCore->GetGraphicsManager()->Present(); } //------------------------------------------------------------ // 終了処理 // 終了時には生成したインターフェイスを解放し、 // 最後にICoreを解放してください。 //------------------------------------------------------------ if ( pRenderer != NULL ) { pRenderer->RemoveDrawObject( pMapModel ); } SAFE_RELEASE(pRenderer); SAFE_RELEASE(pCore); Selene::FinalizeEngine(); return 0; }