/** * @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::Primitive::IPrimitiveController *pPrimitiveSphere1 = NULL; Engine::Graphics::Resource::Primitive::IPrimitiveController *pPrimitiveSphere2 = NULL; Kernel::Collision::Sphere sSphere1; Kernel::Collision::Sphere sSphere2; Kernel::Math::Camera CameraTable[Engine::Renderer::Standard::VIEW_TYPE_MAX]; #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, 10.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 ) ); // 半球ライトの空からの色 // ----------------------------------------------------------- // // // ここからが本番 // // // ----------------------------------------------------------- //------------------------------------------------------------ // テキスト用インターフェイスの作成 //------------------------------------------------------------ Engine::Graphics::Simple::ITextRenderer* pText = NULL; pText = pCore->GetGraphicsManager()->CreateTextRenderer(L"MS ゴシック", 16, false, false); // ----------------------------------------------------------- // 描画ステート生成 // ----------------------------------------------------------- Engine::Graphics::State::IRenderState* pState = pCore->GetGraphicsManager()->CreateRenderState(); pState->SetAlphaBlend(Engine::Graphics::State::AB_OPACITY); // 半透明描画 pState->SetCulling(Engine::Graphics::State::CULL_FRONT); // 表面のみ描画 pState->SetDepthTest(Engine::Graphics::State::DT_ENABLE); // 深度テストON pState->SetDepthWrite(Engine::Graphics::State::DW_ENABLE); // 深度書き込みON pState->SetPolygonFill(Engine::Graphics::State::PF_SOLID); // ポリゴン塗りつぶし // ----------------------------------------------------------- // プリミティブのためのマテリアル生成 // ----------------------------------------------------------- Engine::Renderer::Standard::Material::IMaterial* pMaterial; pMaterial = pCore->GetRendererManager()->CreateStandardRendererMaterial(); pMaterial->SetLightEnable(true); pMaterial->SetDiffuse(sVectorS(1.0f, 0.0f, 0.0f, 1.0f)); // ----------------------------------------------------------- // プリミティブ用パラメーター // ----------------------------------------------------------- Engine::Graphics::Resource::Primitive::SParameter Param1(pState, pMaterial); Engine::Graphics::Resource::Primitive::SParameter Param2(pState, pMaterial); // 良く分からんけどもう一回参照カウンタ増やさないと死ぬ pState->AddRef(); pMaterial->AddRef(); // ----------------------------------------------------------- // 球体プリミティブ用意 // ----------------------------------------------------------- const Kernel::Math::Vector3 vPrimitiveSize = Kernel::Math::Vector3(1.0f,1.0f,1.0f); pPrimitiveSphere1 = pCore->GetGraphicsManager()->CreatePrimitiveSphere( vPrimitiveSize, Param1 ); pPrimitiveSphere2 = pCore->GetGraphicsManager()->CreatePrimitiveSphere( vPrimitiveSize, Param2 ); // ----------------------------------------------------------- // 生成したプリミティブをレンダラーに登録する // これ重要! // ----------------------------------------------------------- pRenderer->AddDrawObject(pPrimitiveSphere1, true); pRenderer->AddDrawObject(pPrimitiveSphere2, true); //------------------------------------------------------------ // メインループ // Seleneを利用する上でのメインループの書き方です // ICore::DoEvent()でOSのイベント処理を行います。 //------------------------------------------------------------ static Sint32 nSin = 0; 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->Translation( sVectorS( 0.0f, 0.0f, -10.0f ) ); // フラスタム更新 pCamera->UpdateFrustum(); // ----------------------------------------------------------- // カメラを利用して描画 // pRenderer->AddDrawObjectしたやつを描画するっぽい // ----------------------------------------------------------- pRenderer->SimpleRendering(CameraTable); // ----------------------------------------------------------- // プリミティブ移動処理 // ----------------------------------------------------------- nSin += 10; Kernel::Math::Matrix mMat1; mMat1 = Kernel::Math::MatX::Translation( sVectorS(Kernel::Math::FastSin((nSin & 0xfff)) * 3, 0.0f, 0.0f ) ); pPrimitiveSphere1->SetWorldMatrix( mMat1 ); // ----------------------------------------------------------- // 衝突判定を用意用意 // 生成方法は2通りある // ----------------------------------------------------------- // @Create経由で生成 Kernel::Collision::Sphere::Create( sSphere1, // 格納先 pPrimitiveSphere1->GetDrawObject(0)->GetWorldMatrix().GetPosition(), // 中心位置 1.0f // 半径 ); // A直接値を入れる sSphere2.Center = pPrimitiveSphere2->GetDrawObject(0)->GetWorldMatrix().GetPosition(); sSphere2.Radius = 1.0f; // ----------------------------------------------------------- // 衝突チェック // ----------------------------------------------------------- pText->CacheReset(); if( Kernel::Collision::IsIntersect( sSphere1, sSphere2 ) ) { // --- 衝突していた pText->DrawRequest( Point2DI(SCREEN_SIZE.x >> 1, SCREEN_SIZE.y >> 1), // 描画位置 ColorF(0.8F, 0.8F, 0.8F, 1.0F), // 描画色 L"衝突しました!"); pMaterial->SetDiffuse( sVectorS(1.0f,0.0f,0.0f) ); // 赤 } else { // --- 衝突していない pMaterial->SetDiffuse( sVectorS(1.0f,1.0f,1.0f) ); // 白 } pText->CacheDraw(); //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- // フレームの終了 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- pCore->FrameEnd(); //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- // 画面の更新 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- pCore->GetGraphicsManager()->Present(); } //------------------------------------------------------------ // 終了処理 // 終了時には生成したインターフェイスを解放し、 // 最後にICoreを解放してください。 //------------------------------------------------------------ if ( pRenderer != NULL ) { pRenderer->RemoveDrawObject( pPrimitiveSphere1 ); pRenderer->RemoveDrawObject( pPrimitiveSphere2 ); } SAFE_RELEASE( Param1.pRenderState ); SAFE_RELEASE( Param2.pRenderState ); SAFE_RELEASE( pState ); SAFE_RELEASE(pRenderer); SAFE_RELEASE(pCore); } Selene::FinalizeEngine(); return 0; }