OSDN Git Service

DirectX11 SDK のTutorial07をほとんど真似て立方体を回してみた。
authorSFPGMR <sfpg@git.sourceforge.jp>
Sun, 3 Jul 2011 00:40:20 +0000 (09:40 +0900)
committerSFPGMR <sfpg@git.sourceforge.jp>
Sun, 3 Jul 2011 00:40:20 +0000 (09:40 +0900)
dxgi_test.sln
dxgi_test/application.cpp
dxgi_test/dxgi_test.vcxproj
dxgi_test/dxgi_test.vcxproj.filters
dxgi_test/minitimer.rc [deleted file]
dxgi_test/sf_windows.h
dxgi_test/toplevel_window.cpp
dxgi_test/toplevel_window.h

index 90311ea..6aff14d 100644 (file)
@@ -11,8 +11,8 @@ Global
                Release|x64 = Release|x64
        EndGlobalSection
        GlobalSection(ProjectConfigurationPlatforms) = postSolution
-               {454B96E9-B255-4909-A167-7DFA3E4873A5}.Debug|Win32.ActiveCfg = Debug|x64
-               {454B96E9-B255-4909-A167-7DFA3E4873A5}.Debug|Win32.Build.0 = Debug|x64
+               {454B96E9-B255-4909-A167-7DFA3E4873A5}.Debug|Win32.ActiveCfg = Debug|Win32
+               {454B96E9-B255-4909-A167-7DFA3E4873A5}.Debug|Win32.Build.0 = Debug|Win32
                {454B96E9-B255-4909-A167-7DFA3E4873A5}.Debug|x64.ActiveCfg = Debug|x64
                {454B96E9-B255-4909-A167-7DFA3E4873A5}.Debug|x64.Build.0 = Debug|x64
                {454B96E9-B255-4909-A167-7DFA3E4873A5}.Release|Win32.ActiveCfg = Release|x64
index 19be347..faad57d 100644 (file)
@@ -98,7 +98,8 @@ int application::execute(HINSTANCE hInstance,
         std::wstring(L"DXGI\83e\83X\83g"),std::wstring(L"DXGI\83e\83X\83g")));
   
   // \83\81\83b\83Z\81[\83W\83\8b\81[\83v\82Ì\8eÀ\8ds
-  WPARAM ret = sf::run_message_loop()();
+  //WPARAM ret = sf::run_message_loop()();
+  WPARAM ret = sf::peek_message_loop(boost::bind(&toplevel_window::render,window.get()))();
   return ret;
 }
 
index 98a127f..cca3b9f 100644 (file)
@@ -1,10 +1,18 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
     <ProjectConfiguration Include="Debug|x64">
       <Configuration>Debug</Configuration>
       <Platform>x64</Platform>
     </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
     <ProjectConfiguration Include="Release|x64">
       <Configuration>Release</Configuration>
       <Platform>x64</Platform>
     <CharacterSet>Unicode</CharacterSet>
     <PlatformToolset>Windows7.1SDK</PlatformToolset>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <CharacterSet>Unicode</CharacterSet>
+    <PlatformToolset>Windows7.1SDK</PlatformToolset>
+  </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
     <ConfigurationType>Application</ConfigurationType>
     <UseDebugLibraries>false</UseDebugLibraries>
     <CharacterSet>Unicode</CharacterSet>
     <PlatformToolset>Windows7.1SDK</PlatformToolset>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+    <PlatformToolset>Windows7.1SDK</PlatformToolset>
+  </PropertyGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
   <ImportGroup Label="ExtensionSettings">
   </ImportGroup>
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
     <Import Project="..\SF.props" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+    <Import Project="..\SF.props" />
+  </ImportGroup>
   <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
     <Import Project="..\SF.props" />
   </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+    <Import Project="..\SF.props" />
+  </ImportGroup>
   <PropertyGroup Label="UserMacros" />
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <IncludePath>C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath)</IncludePath>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <IncludePath>C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Include;$(IncludePath)</IncludePath>
+  </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <LibraryPath>C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x64;$(LibraryPath)</LibraryPath>
   </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LibraryPath>C:\Program Files %28x86%29\Microsoft DirectX SDK %28June 2010%29\Lib\x64;$(LibraryPath)</LibraryPath>
+  </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
     <ClCompile>
       <WarningLevel>Level3</WarningLevel>
       <Optimization>Disabled</Optimization>
       <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+      <StructMemberAlignment>Default</StructMemberAlignment>
+      <AdditionalOptions>/Zm110 %(AdditionalOptions)</AdditionalOptions>
+      <DisableLanguageExtensions>false</DisableLanguageExtensions>
+      <FloatingPointModel>Fast</FloatingPointModel>
+      <EnableEnhancedInstructionSet>NotSet</EnableEnhancedInstructionSet>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <TargetMachine>MachineX64</TargetMachine>
+    </Link>
+    <Manifest>
+      <AdditionalManifestFiles>DeclareDPIAware.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>
+    </Manifest>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
       <StructMemberAlignment>16Bytes</StructMemberAlignment>
       <AdditionalOptions>/Zm110 %(AdditionalOptions)</AdditionalOptions>
       <DisableLanguageExtensions>false</DisableLanguageExtensions>
       <OptimizeReferences>true</OptimizeReferences>
     </Link>
   </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level3</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>false</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+    </ClCompile>
+    <Link>
+      <GenerateDebugInformation>true</GenerateDebugInformation>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
   <ItemGroup>
     <ClInclude Include="application.h" />
     <ClInclude Include="audio_base.h" />
     <ClCompile Include="sf_windows.cpp" />
     <ClCompile Include="stdafx.cpp">
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
       <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
     </ClCompile>
     <ClCompile Include="taskbar.cpp" />
     <ClCompile Include="timer.cpp" />
     <ClCompile Include="winmain.cpp" />
   </ItemGroup>
   <ItemGroup>
-    <ResourceCompile Include="minitimer.rc" />
+    <ResourceCompile Include="dxgi_test.rc" />
   </ItemGroup>
   <ItemGroup>
     <None Include="icon1.ico" />
index b75e9c7..9afac51 100644 (file)
     </Filter>
   </ItemGroup>
   <ItemGroup>
-    <ResourceCompile Include="minitimer.rc" />
-  </ItemGroup>
-  <ItemGroup>
     <None Include="icon1.ico">
       <Filter>windows</Filter>
     </None>
   </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="dxgi_test.rc" />
+  </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/dxgi_test/minitimer.rc b/dxgi_test/minitimer.rc
deleted file mode 100644 (file)
index 622e768..0000000
Binary files a/dxgi_test/minitimer.rc and /dev/null differ
index 276d966..8fe16e9 100644 (file)
@@ -70,12 +70,15 @@ _COM_SMARTPTR_TYPEDEF(IDXGIOutput,__uuidof(IDXGIOutput));
 _COM_SMARTPTR_TYPEDEF(ID3D11Device,__uuidof(ID3D11Device));
 _COM_SMARTPTR_TYPEDEF(ID3D11DeviceContext,__uuidof(ID3D11DeviceContext));
 _COM_SMARTPTR_TYPEDEF(ID3D11RenderTargetView,__uuidof(ID3D11RenderTargetView));
+_COM_SMARTPTR_TYPEDEF(ID3D11DepthStencilView,__uuidof(ID3D11DepthStencilView));
 _COM_SMARTPTR_TYPEDEF(ID3D11VertexShader,__uuidof(ID3D11VertexShader));
 _COM_SMARTPTR_TYPEDEF(ID3D11PixelShader,__uuidof(ID3D11PixelShader));
 _COM_SMARTPTR_TYPEDEF(ID3D11InputLayout,__uuidof(ID3D11InputLayout));
 _COM_SMARTPTR_TYPEDEF(ID3D11Buffer,__uuidof(ID3D11Buffer));
 _COM_SMARTPTR_TYPEDEF(ID3D11Texture2D,__uuidof(ID3D11Texture2D));
 _COM_SMARTPTR_TYPEDEF(ID3DBlob,__uuidof(ID3DBlob));
+_COM_SMARTPTR_TYPEDEF(ID3D11ShaderResourceView,__uuidof(ID3D11ShaderResourceView));
+_COM_SMARTPTR_TYPEDEF(ID3D11SamplerState,__uuidof(ID3D11SamplerState));
 
 template <class COM_SMART_PTR > inline void safe_release(COM_SMART_PTR& ptr)
 {
index 9b42497..a26051a 100644 (file)
@@ -180,12 +180,35 @@ std::vector<mode_info> scanline_orders =
       (L"DXGI_MODE_SCALING_CENTERED",L"スケーリングなしを指定します。イメージはディスプレイの中央に配置されます。通常、このフラグは固定ドットピッチ ディスプレイ (LED ディスプレイなど) に使用します。")
       (L"DXGI_MODE_SCALING_STRETCHED",L"拡大スケーリングを指定します。");
 
+struct simple_vertex
+{
+    XMFLOAT3 pos;
+    XMFLOAT2 tex;
+};
+
+struct cb_never_changes
+{
+    XMMATRIX mView;
+};
+
+struct cb_change_on_resize
+{
+    XMMATRIX mProjection;
+};
+
+struct cb_changes_every_frame
+{
+    XMMATRIX mWorld;
+    XMFLOAT4 vMeshColor;
+};
+
 struct toplevel_window::impl : public base_win32_window
 {
 
   impl(const std::wstring& menu_name,const std::wstring& name,bool fit_to_display,float width = 160,float height = 100) 
-    : base_win32_window(menu_name,name,fit_to_display,width,height) , timer_(*this,1000)/*wm_task_bar_create_(0),result_time_(INTERVAL_SEC1),status_(active)*/
+    : base_win32_window(menu_name,name,fit_to_display,width,height) , timer_(*this,1000),icon_(IDI_ICON1),mesh_color_(0.7f, 0.7f, 0.7f, 1.0f),init_(false)/*wm_task_bar_create_(0),result_time_(INTERVAL_SEC1),status_(active)*/
   {
+
     on_render.connect(boost::bind(&impl::render,this));
   };
 
@@ -215,9 +238,12 @@ struct toplevel_window::impl : public base_win32_window
       {
         // バックバッファなどに関係するインターフェースを解放する
         // バックバッファを解放する
-        if(swap_chain_)
+        if(init_)
         {
+          calc_client_size();
+          discard_swap_chain_dependent_resources();
           swap_chain_->ResizeBuffers(0,0,0,DXGI_FORMAT_B8G8R8A8_UNORM,DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH);
+          create_swap_chain_dependent_resources();
         }
         // バックバッファなどに関係するインターフェースを再作成する
 
@@ -242,7 +268,7 @@ struct toplevel_window::impl : public base_win32_window
           paint_struct begin_paint(hwnd);
           //CloseHandle(cb);
           // 描画コードの呼び出し
-          render();
+          //render();
 
         }
 
@@ -321,8 +347,8 @@ struct toplevel_window::impl : public base_win32_window
   
   virtual void create(){
     create_device_independent_resources();
-//    icon_ = create_icon();
-    register_class(this->name_.c_str(),CS_HREDRAW | CS_VREDRAW ,0);
+//    icon_ = ::LoadIconW(HINST_THISCOMPONENT,MAKEINTRESOURCE(IDI_ICON1));
+    register_class(this->name_.c_str(),CS_HREDRAW | CS_VREDRAW ,0,icon_.get());
     create_window();
 
     // 半透明ウィンドウを有効にする。
@@ -334,24 +360,38 @@ struct toplevel_window::impl : public base_win32_window
 
   virtual void discard_device()
   {
-    safe_release(view_);
-    safe_release(texture_);
-    safe_release(render_target_);
+    safe_release(sampler_state_);
+    safe_release(shader_res_view_);
+    safe_release(cb_changes_every_frame_);
+    safe_release(cb_change_on_resize_);
+    safe_release(cb_never_changes_);
+    safe_release(i_buffer_);
+    safe_release(v_buffer_);
+    safe_release(p_shader_);
+    safe_release(input_layout_);
+    safe_release(v_shader_);
+    discard_swap_chain_dependent_resources();
+    //safe_release(render_target_);
     safe_release(swap_chain_);
     safe_release(d3d_context_);
     safe_release(d3d_device_);
     safe_release(adapter_);
   }
 
+  void calc_client_size()
+  {
+    //クライアント領域の現在の幅、高さを求める
+    RECT rc;
+    GetClientRect( hwnd_, &rc );
+    client_width_ = rc.right - rc.left;
+    client_height_ = rc.bottom - rc.top;
+  }
+
   virtual void create_device(){
+    calc_client_size();
     HRESULT hr = S_OK;
-
-    //ウィンドウの現在の幅、高さを求める
-    //RECT rc;
-    //GetClientRect( hwnd_, &rc );
-    //uint32_t width = rc.right - rc.left;
-    //uint32_t height = rc.bottom - rc.top;
-
+    init_ = false;
     // アダプタデバイス情報の取得
     //LARGE_INTEGER version;
     THROW_IFERR(dxgi_factory_->EnumAdapters1(0,&adapter_));
@@ -371,7 +411,7 @@ struct toplevel_window::impl : public base_win32_window
       adapter_,
       D3D_DRIVER_TYPE_UNKNOWN ,
       NULL,
-      D3D11_CREATE_DEVICE_BGRA_SUPPORT,
+      D3D11_CREATE_DEVICE_DEBUG,
       &feature_levels[0],
       feature_levels.size(),
       D3D11_SDK_VERSION,
@@ -384,9 +424,9 @@ struct toplevel_window::impl : public base_win32_window
     // 表示モード
     DXGI_MODE_DESC desired_desc = {} , actual_desc = {};
     // 各色8ビットで符号化なし正規化数
-    desired_desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
-    desired_desc.Height = 480;// 高さ
-    desired_desc.Width = 640;// 幅
+    desired_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+    desired_desc.Height = client_height_;// 高さ
+    desired_desc.Width = client_width_;// 幅
     desired_desc.Scaling = DXGI_MODE_SCALING_CENTERED;// スケーリングなし
     // リフレッシュレートを60Hzを要求する
     desired_desc.RefreshRate.Numerator = 60000;
@@ -403,7 +443,7 @@ struct toplevel_window::impl : public base_win32_window
       desc.BufferUsage                 = DXGI_USAGE_RENDER_TARGET_OUTPUT;
       desc.BufferCount                 = 1;
       desc.OutputWindow                = hwnd_;
     desc.SwapEffect                  = DXGI_SWAP_EFFECT_DISCARD;
//     desc.SwapEffect                        = DXGI_SWAP_EFFECT_;
       desc.Windowed                    = TRUE;
       desc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
 
@@ -411,11 +451,288 @@ struct toplevel_window::impl : public base_win32_window
 
     }
 
+    // スワップチェーン依存リソースの作成
+    create_swap_chain_dependent_resources();
+
+    {
+      // バーテックスシェーダのコンパイル
+      ID3DBlobPtr vsblob,vserrblob;
+      DWORD compile_flag = D3DCOMPILE_ENABLE_STRICTNESS;
+#if defined( DEBUG ) || defined( _DEBUG )
+      compile_flag |= D3DCOMPILE_DEBUG;
+#endif
+      HRESULT hr = D3DX11CompileFromFile( L"Tutorial07.fx", NULL, NULL, "VS", "vs_4_0", 
+         compile_flag, 0, NULL, &vsblob, &vserrblob, NULL );
+      if( FAILED( hr ) )
+      {
+          if( vserrblob != NULL )
+              OutputDebugStringA( (char*)vserrblob->GetBufferPointer() );
+          if( vserrblob ) vserrblob.Release();
+          throw sf::win32_error_exception(hr);
+      }
+
+      // バーテックスシェーダの生成
+      THROW_IFERR(d3d_device_->CreateVertexShader( vsblob->GetBufferPointer(), vsblob->GetBufferSize(), NULL, &v_shader_ ));
+
+      // 入力頂点レイアウトの定義
+      D3D11_INPUT_ELEMENT_DESC
+       layout[] = {
+      { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
+      { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }};
+
+      // 入力頂点レイアウトの生成
+      THROW_IFERR(d3d_device_->CreateInputLayout( layout, 2, vsblob->GetBufferPointer(),
+                                          vsblob->GetBufferSize(), &input_layout_ ));
+      vsblob.Release();
+    }
+
+    // 入力レイアウトの設定
+    d3d_context_->IASetInputLayout( input_layout_ );
+
+    // ピクセル・シェーダーのコンパイル
+    {
+      ID3DBlobPtr psblob,pserror;
+      DWORD compile_flag = D3DCOMPILE_ENABLE_STRICTNESS;
+#if defined( DEBUG ) || defined( _DEBUG )
+      compile_flag |= D3DCOMPILE_DEBUG;
+#endif
+      HRESULT hr = D3DX11CompileFromFile( L"Tutorial07.fx", NULL, NULL, "PS", "ps_4_0", 
+         compile_flag, 0, NULL, &psblob, &pserror, NULL );
+      if( FAILED( hr ) )
+      {
+          if( pserror != NULL )
+              OutputDebugStringA( (char*)pserror->GetBufferPointer() );
+          safe_release(pserror);
+          throw sf::win32_error_exception(hr);
+      }
+
+      // ピクセルシェーダの作成
+      THROW_IFERR(d3d_device_->CreatePixelShader( psblob->GetBufferPointer(), psblob->GetBufferSize(), NULL, &p_shader_ ));
+
+      psblob.Release();
+    }
+
+    // バーテックスバッファの作成
+ // Create vertex buffer
+    simple_vertex vertices[] =
+    {
+        { XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT2( 0.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, 1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, 1.0f, 1.0f ), XMFLOAT2( 1.0f, 1.0f ) },
+        { XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) },
+
+        { XMFLOAT3( -1.0f, -1.0f, -1.0f ), XMFLOAT2( 0.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, -1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT2( 1.0f, 1.0f ) },
+        { XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) },
+
+        { XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT2( 0.0f, 0.0f ) },
+        { XMFLOAT3( -1.0f, -1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) },
+        { XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT2( 1.0f, 1.0f ) },
+        { XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) },
+
+        { XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT2( 0.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, -1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, 1.0f, -1.0f ), XMFLOAT2( 1.0f, 1.0f ) },
+        { XMFLOAT3( 1.0f, 1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) },
+
+        { XMFLOAT3( -1.0f, -1.0f, -1.0f ), XMFLOAT2( 0.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, -1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, 1.0f, -1.0f ), XMFLOAT2( 1.0f, 1.0f ) },
+        { XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT2( 0.0f, 1.0f ) },
+
+        { XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT2( 0.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT2( 1.0f, 0.0f ) },
+        { XMFLOAT3( 1.0f, 1.0f, 1.0f ), XMFLOAT2( 1.0f, 1.0f ) },
+        { XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) },
+    };
+    //std::vector<simple_vertex> vertices = boost::assign::list_of<simple_vertex>
+    //
+    //    ( XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT2( 0.0f, 0.0f ) )
+    //    ( XMFLOAT3( 1.0f, 1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) )
+    //    ( XMFLOAT3( 1.0f, 1.0f, 1.0f ), XMFLOAT2( 1.0f, 1.0f ) )
+    //    ( XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) )
+
+    //    ( XMFLOAT3( -1.0f, -1.0f, -1.0f ), XMFLOAT2( 0.0f, 0.0f ) )
+    //    ( XMFLOAT3( 1.0f, -1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) )
+    //    ( XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT2( 1.0f, 1.0f ) )
+    //    ( XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) )
+
+    //    ( XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT2( 0.0f, 0.0f ) )
+    //    ( XMFLOAT3( -1.0f, -1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) )
+    //    ( XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT2( 1.0f, 1.0f ) )
+    //    ( XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) )
+
+    //    ( XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT2( 0.0f, 0.0f ) )
+    //    ( XMFLOAT3( 1.0f, -1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) )
+    //    ( XMFLOAT3( 1.0f, 1.0f, -1.0f ), XMFLOAT2( 1.0f, 1.0f ) )
+    //    ( XMFLOAT3( 1.0f, 1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) )
+
+    //    ( XMFLOAT3( -1.0f, -1.0f, -1.0f ), XMFLOAT2( 0.0f, 0.0f ) )
+    //    ( XMFLOAT3( 1.0f, -1.0f, -1.0f ), XMFLOAT2( 1.0f, 0.0f ) )
+    //    ( XMFLOAT3( 1.0f, 1.0f, -1.0f ), XMFLOAT2( 1.0f, 1.0f ) )
+    //    ( XMFLOAT3( -1.0f, 1.0f, -1.0f ), XMFLOAT2( 0.0f, 1.0f ) )
+
+    //    ( XMFLOAT3( -1.0f, -1.0f, 1.0f ), XMFLOAT2( 0.0f, 0.0f ) )
+    //    ( XMFLOAT3( 1.0f, -1.0f, 1.0f ), XMFLOAT2( 1.0f, 0.0f ) )
+    //    ( XMFLOAT3( 1.0f, 1.0f, 1.0f ), XMFLOAT2( 1.0f, 1.0f ) )
+    //    ( XMFLOAT3( -1.0f, 1.0f, 1.0f ), XMFLOAT2( 0.0f, 1.0f ) );
+
+    D3D11_BUFFER_DESC bd = {};
+    bd.Usage = D3D11_USAGE_DEFAULT;
+    bd.ByteWidth = sizeof( simple_vertex ) * 24;
+    bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
+    bd.CPUAccessFlags = 0;
+
+    D3D11_SUBRESOURCE_DATA init_data = {};
+    init_data.pSysMem = vertices;
+    THROW_IFERR(d3d_device_->CreateBuffer( &bd, &init_data, &v_buffer_ ));
+
+    // 頂点バッファのセット
+    uint32_t stride = sizeof( simple_vertex );
+    uint32_t offset = 0;
+    d3d_context_->IASetVertexBuffers( 0, 1, &v_buffer_.GetInterfacePtr(), &stride, &offset );
+
+    // インデックスバッファの生成
+    WORD indices[] =
+    {
+        3,1,0,
+        2,1,3,
+
+        6,4,5,
+        7,4,6,
+
+        11,9,8,
+        10,9,11,
+
+        14,12,13,
+        15,12,14,
+
+        19,17,16,
+        18,17,19,
+
+        22,20,21,
+        23,20,22
+    };
+
+    bd.Usage = D3D11_USAGE_DEFAULT;
+    bd.ByteWidth = sizeof( WORD ) * 36;
+    bd.BindFlags = D3D11_BIND_INDEX_BUFFER;
+    bd.CPUAccessFlags = 0;
+    init_data.pSysMem = indices;
+    THROW_IFERR(d3d_device_->CreateBuffer( &bd, &init_data, &i_buffer_ ));
+
+    // インデックスバッファのセット
+    d3d_context_->IASetIndexBuffer( i_buffer_.GetInterfacePtr(), DXGI_FORMAT_R16_UINT, 0 );
+
+    // プリミティブの形態を指定する
+    d3d_context_->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
+
+    // 定数バッファを生成する。
+    bd.Usage = D3D11_USAGE_DEFAULT;
+    bd.ByteWidth = sizeof(cb_never_changes);
+    bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
+    bd.CPUAccessFlags = 0;
+    THROW_IFERR(d3d_device_->CreateBuffer( &bd, NULL, &cb_never_changes_ ));
+    
+    bd.ByteWidth = sizeof(cb_change_on_resize);
+    THROW_IFERR(d3d_device_->CreateBuffer( &bd, NULL, &cb_change_on_resize_ ));
+    
+    bd.ByteWidth = sizeof(cb_changes_every_frame);
+    THROW_IFERR(d3d_device_->CreateBuffer( &bd, NULL, &cb_changes_every_frame_ ));
+
+    // テクスチャのロード
+    THROW_IFERR(D3DX11CreateShaderResourceViewFromFile( d3d_device_, L"SF.dds", NULL, NULL, &shader_res_view_, NULL ));
+
+    // サンプルステートの生成
+    D3D11_SAMPLER_DESC sdesc = {};
+    sdesc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
+    sdesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
+    sdesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
+    sdesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
+    sdesc.ComparisonFunc = D3D11_COMPARISON_NEVER;
+    sdesc.MinLOD = 0;
+    sdesc.MaxLOD = D3D11_FLOAT32_MAX;
+    THROW_IFERR(d3d_device_->CreateSamplerState( &sdesc, &sampler_state_ ));
+
+    // ワールド座標変換行列のセットアップ
+    mat_world_ = XMMatrixIdentity();
+
+    //g_vMeshColor( 0.7f, 0.7f, 0.7f, 1.0f );
+
+
+    // ビュー行列のセットアップ
+    XMVECTOR eye = XMVectorSet( 0.0f, 3.0f, -6.0f, 0.0f );
+    XMVECTOR at = XMVectorSet( 0.0f, 1.0f, 0.0f, 0.0f );
+    XMVECTOR up = XMVectorSet( 0.0f, 1.0f, 0.0f, 0.0f );
+    mat_view_ = XMMatrixLookAtLH( eye, at, up );
+    cb_never_changes cnc;
+    cnc.mView = XMMatrixTranspose( mat_view_ );
+    // 定数バッファに格納
+    d3d_context_->UpdateSubresource( cb_never_changes_, 0, NULL, &cnc, 0, 0 );
+
+    // 投影行列のセットアップ
+    mat_projection_ = XMMatrixPerspectiveFovLH( XM_PIDIV4, client_width_ / client_height_, 0.01f, 100.0f );
+    cb_change_on_resize ccor;
+    ccor.mProjection = XMMatrixTranspose( mat_projection_ );
+    // 定数バッファに格納
+    d3d_context_->UpdateSubresource( cb_change_on_resize_, 0, NULL, &ccor, 0, 0 );
+
+    init_ = true;// 初期化完了
+  }
+
+  void create_swap_chain_dependent_resources()
+  {
     // ビューの作成
     THROW_IFERR(swap_chain_->GetBuffer(0,texture_.GetIID(),(void**)&texture_));
     THROW_IFERR(d3d_device_->CreateRenderTargetView(texture_,0,&view_));
+    texture_.Release();
+
+    // 深度バッファの作成
+    D3D11_TEXTURE2D_DESC depth = {} ;
+    depth.Width = client_width_;
+    depth.Height = client_height_;
+    depth.MipLevels = 1;
+    depth.ArraySize = 1;
+    depth.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
+    depth.SampleDesc.Count = 1;
+    depth.SampleDesc.Quality = 0;
+    depth.Usage = D3D11_USAGE_DEFAULT;
+    depth.BindFlags = D3D11_BIND_DEPTH_STENCIL;
+    depth.CPUAccessFlags = 0;
+    depth.MiscFlags = 0;
+    THROW_IFERR(d3d_device_->CreateTexture2D( &depth, NULL, &depth_texture_ ));
+
+    D3D11_DEPTH_STENCIL_VIEW_DESC dsv = {};
+    dsv.Format = depth.Format;
+    dsv.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
+    dsv.Texture2D.MipSlice = 0;
+    THROW_IFERR(d3d_device_->CreateDepthStencilView( depth_texture_, &dsv, &depth_view_ ));
+
+    // OMステージに登録する
+    d3d_context_->OMSetRenderTargets( 1, &view_.GetInterfacePtr(), depth_view_ );
+  
+    // ビューポートの設定
+    D3D11_VIEWPORT vp;
+    vp.Width = client_width_;
+    vp.Height = client_height_;
+    vp.MinDepth = 0.0f;
+    vp.MaxDepth = 1.0f;
+    vp.TopLeftX = 0;
+    vp.TopLeftY = 0;
+    d3d_context_->RSSetViewports( 1, &vp );
+
   }
 
+  void discard_swap_chain_dependent_resources()
+  {
+    safe_release(depth_view_);
+    safe_release(depth_texture_);
+    safe_release(view_);
+    safe_release(texture_);
+  }
+
+
   virtual void create_device_independent_resources()
   {
 
@@ -456,7 +773,7 @@ struct toplevel_window::impl : public base_win32_window
     //wic_imaging_factory_.CreateInstance(CLSID_WICImagingFactory);
 
     //thunk_proc_ = (WNDPROC)thunk_.getCode();
-    layout_rect_ = D2D1::RectF(0.0f,0.0f,width_,height_);
+    layout_rect_ = D2D1::RectF(0.0f,0.0f,client_width_,client_height_);
     // Text Formatの作成
     THROW_IFERR(write_factory_->CreateTextFormat(
     L"メイリオ",                // Font family name.
@@ -473,12 +790,53 @@ struct toplevel_window::impl : public base_win32_window
 
   void render(){
 
-    static int t = 0;
-    if(swap_chain_)
+    static float t = 0.0f;
+    static DWORD time_start = 0;
+
+    if(init_)
     {
+      // 表示
+      swap_chain_->Present(1,0);
+
+
       float color[4] = { 0.7f, 0.0f, 0.0f, 1.0f };    
+
+      // 描画ターゲットのクリア
       d3d_context_->ClearRenderTargetView(view_,color);
-      swap_chain_->Present(0,0);
+      // 深度バッファのクリア
+      d3d_context_->ClearDepthStencilView( depth_view_, D3D11_CLEAR_DEPTH, 1.0f, 0 );
+
+      DWORD time_count = GetTickCount();
+      if( time_start == 0 )
+          time_start = time_count;
+      t = ( time_count - time_start ) / 1000.0f;
+
+      // Y軸で回転させる
+      mat_world_ = XMMatrixRotationY( t );
+
+      // 色の変更
+      mesh_color_.x = ( sinf( t * 1.0f ) + 1.0f ) * 0.5f;
+      mesh_color_.y = ( cosf( t * 3.0f ) + 1.0f ) * 0.5f;
+      mesh_color_.z = ( sinf( t * 5.0f ) + 1.0f ) * 0.5f;
+
+
+      // 定数更新
+      cb_changes_every_frame cb;
+      cb.mWorld = XMMatrixTranspose( mat_world_ );
+      cb.vMeshColor = mesh_color_;
+      d3d_context_->UpdateSubresource( cb_changes_every_frame_, 0, NULL, &cb, 0, 0 );
+
+      // 立方体の描画
+      d3d_context_->VSSetShader( v_shader_, NULL, 0 );
+      d3d_context_->VSSetConstantBuffers( 0, 1, &cb_never_changes_.GetInterfacePtr() );
+      d3d_context_->VSSetConstantBuffers( 1, 1, &cb_change_on_resize_.GetInterfacePtr() );
+      d3d_context_->VSSetConstantBuffers( 2, 1, &cb_changes_every_frame_.GetInterfacePtr() );
+      d3d_context_->PSSetShader( p_shader_, NULL, 0 );
+      d3d_context_->PSSetConstantBuffers( 2, 1, &cb_changes_every_frame_.GetInterfacePtr() );
+      d3d_context_->PSSetShaderResources( 0, 1, &shader_res_view_.GetInterfacePtr() );
+      d3d_context_->PSSetSamplers( 0, 1, &sampler_state_.GetInterfacePtr() );
+      d3d_context_->DrawIndexed( 36, 0, 0 );
+
     }
 
 //    if (render_target_)
@@ -528,7 +886,7 @@ struct toplevel_window::impl : public base_win32_window
       WS_EX_APPWINDOW | WS_EX_TOPMOST,
       name_.c_str(),
       title_.c_str(),
-      WS_OVERLAPPEDWINDOW ,
+      WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME,
       CW_USEDEFAULT,
       CW_USEDEFAULT,
       static_cast<uint32_t>(dpi_.scale_x(width_)),
@@ -612,7 +970,26 @@ private:
   ID3D11DeviceContextPtr d3d_context_;
   ID3D11Texture2DPtr texture_;
   ID3D11RenderTargetViewPtr view_;
-
+  ID3D11Texture2DPtr depth_texture_;
+  ID3D11DepthStencilViewPtr depth_view_;
+  ID3D11VertexShaderPtr v_shader_;
+  ID3D11InputLayoutPtr input_layout_;
+  ID3D11PixelShaderPtr p_shader_;
+  ID3D11BufferPtr v_buffer_;
+  ID3D11BufferPtr i_buffer_;
+  ID3D11BufferPtr cb_never_changes_;
+  ID3D11BufferPtr cb_change_on_resize_;
+  ID3D11BufferPtr cb_changes_every_frame_;
+  ID3D11ShaderResourceViewPtr shader_res_view_;
+  ID3D11SamplerStatePtr sampler_state_;
+
+  XMMATRIX                            mat_world_;
+  XMMATRIX                            mat_view_;
+  XMMATRIX                            mat_projection_;
+  XMFLOAT4                            mesh_color_;
+
+  float client_width_,client_height_;
+  
   //IDXGISwapChainPtr; 
   ID2D1FactoryPtr factory_;
   ID2D1HwndRenderTargetPtr render_target_;
@@ -621,6 +998,8 @@ private:
   IDWriteTextFormatPtr write_text_format_;
   IDXGISwapChainPtr swap_chain_;
   std::wstring dxgi_info_;
+  icon icon_;
+  bool init_;
 
   D2D1_RECT_F layout_rect_;
   D2D1_SIZE_U icon_size_;
@@ -716,7 +1095,7 @@ private:
 
     return bitmap;
   }
-
+  
   toplevel_window::toplevel_window(const std::wstring& menu_name,const std::wstring& name,bool fit_to_display,float width ,float height)
     : impl_(new impl(menu_name,name,fit_to_display,width,height))
   {
@@ -730,6 +1109,7 @@ private:
   bool toplevel_window::is_show(){return impl_->is_show();};
   void toplevel_window::text(std::wstring& text){impl_->text(text);};
   void toplevel_window::update(){impl_->update();};
+  void toplevel_window::render(){impl_->render();};
 
  toplevel_window_ptr create_toplevel_window
     (
@@ -741,7 +1121,10 @@ private:
     float height
     )
   {
-    toplevel_window* p = new toplevel_window(menu_name,name,fit_to_display,width,height);
+// クライアント領域のサイズからウィンドウサイズを設定
+RECT    rect    = { 0, 0, width, height };
+::AdjustWindowRectEx( &rect, WS_OVERLAPPEDWINDOW & ~WS_THICKFRAME, FALSE, 0 );
+    toplevel_window* p = new toplevel_window(menu_name,name,fit_to_display,rect.right - rect.left,rect.bottom - rect.top);
     p->create();
     p->show();
     p->update();
index be81cd3..bd9c482 100644 (file)
@@ -45,6 +45,7 @@ namespace sf
 
     void text(std::wstring& text);
     void update();
+    void render();
 
   private:
     struct impl;