⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zfxd3d_init.cpp

📁 This is a book introduce some tech about Game Engine 3D
💻 CPP
📖 第 1 页 / 共 2 页
字号:
   m_d3dpp.BackBufferCount        = 1;
   m_d3dpp.BackBufferFormat       = D3DFMT_X8R8G8B8;
   m_d3dpp.EnableAutoDepthStencil = TRUE;
   m_d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
   m_d3dpp.MultiSampleType        = D3DMULTISAMPLE_NONE;
   m_d3dpp.SwapEffect             = D3DSWAPEFFECT_DISCARD;
   m_bStencil = false;

   // windowed mode
   m_d3dpp.hDeviceWindow     = hwnd = m_hWnd[0];
   m_d3dpp.BackBufferWidth   = GetSystemMetrics(SM_CXSCREEN);
   m_d3dpp.BackBufferHeight  = GetSystemMetrics(SM_CYSCREEN);

   // create direct3d device
   hr = m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, 
                             D3DDEVTYPE_HAL,
                             hwnd, 
                             D3DCREATE_HARDWARE_VERTEXPROCESSING, 
                             &m_d3dpp, 
                             &m_pDevice);
   
   // create additional swap chains if wished and possible
   if ( (m_nNumhWnd > 0) && m_bWindowed) {
      for (UINT i=0; i<m_nNumhWnd; i++) {
         m_d3dpp.hDeviceWindow = m_hWnd[i];
         m_pDevice->CreateAdditionalSwapChain(&m_d3dpp, &m_pChain[i]);
         }
      }

   if(FAILED(hr)) {
      Log("error: IDirect3D::CreateDevice()");
      return ZFX_CREATEDEVICE;
      }

   Log("initialized (online and ready)");
   m_pDevice->GetDeviceCaps(&g_xDevice.d3dCaps);

   m_bRunning        = true;
   m_bIsSceneRunning = false;
   m_dwWidth         = m_d3dpp.BackBufferWidth;
   m_dwHeight        = m_d3dpp.BackBufferHeight;
   
   return ZFX_OK;
   } // InitWindowed
/*----------------------------------------------------------------*/


/**
 * Start the API with values from dialogbox.
 */
HRESULT ZFXD3D::Go(void) {
   ZFXCOMBOINFO   xCombo;
   HRESULT        hr;
   HWND           hwnd;

   // build main direct3d object
   if (m_pD3D) {
      m_pD3D->Release();
      m_pD3D = NULL;
      }
   m_pD3D = Direct3DCreate9( D3D_SDK_VERSION );
   if(!m_pD3D) {
      Log("error: Direct3DCreate8()\n");
      return ZFX_CREATEAPI;
      }

   // find the appropriate combo
   for (UINT i=0; i<g_xDevice.nNumCombo; i++) {
      if ( (g_xDevice.d3dCombo[i].bWindowed  == m_bWindowed)
        && (g_xDevice.d3dCombo[i].d3dDevType == g_xDevice.d3dDevType)
        && (g_xDevice.d3dCombo[i].fmtAdapter == g_fmtA)
        && (g_xDevice.d3dCombo[i].fmtBackBuffer == g_fmtB) ) 
         {
         xCombo = g_xDevice.d3dCombo[i];
         break;
         }
      }

   // prepare present parameters structure
   ZeroMemory(&m_d3dpp, sizeof(m_d3dpp));
   m_d3dpp.Windowed               = m_bWindowed;
   m_d3dpp.BackBufferCount        = 1;
   m_d3dpp.BackBufferFormat       = g_Dspmd.Format;
   m_d3dpp.EnableAutoDepthStencil = TRUE;
   m_d3dpp.AutoDepthStencilFormat = xCombo.fmtDepthStencil;
   m_d3dpp.MultiSampleType        = xCombo.msType;
   m_d3dpp.SwapEffect             = D3DSWAPEFFECT_DISCARD;

   // stencil buffer active?
   if (  (xCombo.fmtDepthStencil == D3DFMT_D24S8)
      || (xCombo.fmtDepthStencil == D3DFMT_D24X4S4)
      || (xCombo.fmtDepthStencil == D3DFMT_D15S1) )
      m_bStencil = true;
   else
      m_bStencil = false;

   // fullscreen mode
   if (!m_bWindowed) {
      m_d3dpp.hDeviceWindow     = hwnd = m_hWndMain;
      m_d3dpp.BackBufferWidth   = g_Dspmd.Width;
      m_d3dpp.BackBufferHeight  = g_Dspmd.Height;
      ShowCursor(FALSE);
      }
   // windowed mode
   else {
      m_d3dpp.hDeviceWindow     = hwnd = m_hWnd[0];
      m_d3dpp.BackBufferWidth   = GetSystemMetrics(SM_CXSCREEN);
	   m_d3dpp.BackBufferHeight  = GetSystemMetrics(SM_CYSCREEN);
      }

   // create direct3d device
   hr = m_pD3D->CreateDevice(g_xDevice.nAdapter, g_xDevice.d3dDevType,
                             hwnd, xCombo.dwBehavior, 
                             &m_d3dpp, &m_pDevice);

   // create additional swap chains if wished and possible
   if ( (m_nNumhWnd > 0) && m_bWindowed) {
      for (UINT i=0; i<m_nNumhWnd; i++) {
         m_d3dpp.hDeviceWindow = m_hWnd[i];
         m_pDevice->CreateAdditionalSwapChain(&m_d3dpp, &m_pChain[i]);
         }
      }

   m_pEnum->~ZFXD3DEnum();
   m_pEnum = NULL;

   if(FAILED(hr)) {
      Log("error: IDirect3D::CreateDevice() \n");
      return ZFX_CREATEDEVICE;
      }

   Log("everything initialized smoothly... \n");

   m_bRunning        = true;
   m_bIsSceneRunning = false;

   return ZFX_OK;
   } // Go
/*----------------------------------------------------------------*/


/**
 * write outputstring to attribut outputstream if exists
 * -> IN: FILE - pointer to logfile stream or NULL
 */
void ZFXD3D::Log(char *chString, ...) {

   char ch[256];
   char *pArgs;
   
   pArgs = (char*) &chString + sizeof(chString);
   vsprintf(ch, chString, pArgs) ;
   fprintf(m_pLog, ch);
   
   #ifdef _DEBUGFLUSH_
   fflush(m_pLog);
   #endif
   }
/*----------------------------------------------------------------*/
 

/**
 * Callback function to handle the device/mode selection dialog
 */
BOOL CALLBACK ZFXD3D::DlgProc(HWND hDlg, UINT message, 
                              WPARAM wParam, LPARAM lParam) {
   DIBSECTION dibSection;
   BOOL       bWnd=FALSE;
   
   // get handles
   HWND hFULL       = GetDlgItem(hDlg, IDC_FULL);
   HWND hWND        = GetDlgItem(hDlg, IDC_WND);
   HWND hADAPTER    = GetDlgItem(hDlg, IDC_ADAPTER);
   HWND hMODE       = GetDlgItem(hDlg, IDC_MODE);
   HWND hADAPTERFMT = GetDlgItem(hDlg, IDC_ADAPTERFMT);
   HWND hBACKFMT    = GetDlgItem(hDlg, IDC_BACKFMT);
   HWND hDEVICE     = GetDlgItem(hDlg, IDC_DEVICE);
   
   switch (message) {
      
      // preselect windowed
      case WM_INITDIALOG: {
         SendMessage(hWND, BM_SETCHECK, BST_CHECKED, 0);
         this->m_pEnum->Enum(hADAPTER, hMODE, hDEVICE, 
                             hADAPTERFMT, hBACKFMT,
                             hWND, hFULL, m_pLog);
         
         return TRUE;
         }
         
      // draw zfx logo
      case WM_PAINT: {
         if (g_hBMP) {
            GetObject(g_hBMP, sizeof(DIBSECTION), &dibSection);
            HDC      hdc = GetDC(hDlg);
            HDRAWDIB hdd = DrawDibOpen();
            DrawDibDraw(hdd, hdc, 50, 10, 95, 99, 
                        &dibSection.dsBmih,
                        dibSection.dsBm.bmBits, 0, 0, 
                        dibSection.dsBmih.biWidth, 
                        dibSection.dsBmih.biHeight, 0);
            DrawDibClose(hdd);
            ReleaseDC(hDlg, hdc);
            }
         } break;

      // control changed
      case WM_COMMAND: {
         switch (LOWORD(wParam)) {
            
            // okay button => read selections
            case IDOK: {
               m_bWindowed = SendMessage(hFULL, BM_GETCHECK, 0, 0) != BST_CHECKED;
               m_pEnum->GetSelections(&g_xDevice, &g_Dspmd, &g_fmtA, &g_fmtB);
               GetWindowText(hADAPTER, m_chAdapter, 256);
               EndDialog(hDlg, 1);
               return TRUE;
               } break;
               
            // cancel button
            case IDCANCEL: {
               EndDialog(hDlg, 0);
               return TRUE;
               } break;

               
            case IDC_ADAPTER: {
               if(HIWORD(wParam)==CBN_SELCHANGE)
                  m_pEnum->ChangedAdapter();
               } break;


            case IDC_DEVICE: {
               if(HIWORD(wParam)==CBN_SELCHANGE) {
                  m_pEnum->ChangedDevice();
                  }
               } break;

            case IDC_ADAPTERFMT: {
               if(HIWORD(wParam)==CBN_SELCHANGE)
                  m_pEnum->ChangedAdapterFmt();
               } break;


            case IDC_FULL: case IDC_WND: {
               m_pEnum->ChangedWindowMode();
               } break;
             
            } // switch [CMD]
         } break; // case [CMD]
      } // switch [MSG]
   return FALSE;
   }
/*----------------------------------------------------------------*/




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -