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

📄 fixedfuncshader.cpp

📁 activate your member account after checking your files. If
💻 CPP
📖 第 1 页 / 共 4 页
字号:

         SAFE_RELEASE(pBackBuffer);
      }

      if(m_Mode == FFS_MODE_BOTH)
      {
         m_pd3dDevice->SetViewport(&vp);
      }

      if(m_bShowSettingsText)
      {
         RenderSettings(&m_scenestate);
      }

      // End the scene.
      m_pd3dDevice->EndScene();
   }

   return S_OK;
}

//-----------------------------------------------------------------------------
// Name: InitDeviceObjects()
// Desc: Initialize scene objects.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InitDeviceObjects()
{
   LPDIRECT3DVERTEXBUFFER9 pMeshSourceVB;
   LPDIRECT3DINDEXBUFFER9  pMeshSourceIB;
   D3DVERTEX*              pSrc;
   D3DVERTEX*              pDst;
	HRESULT					   hr;

   // Restore the font
   m_pFont->InitDeviceObjects(m_pd3dDevice);
   m_pFontSmall->InitDeviceObjects(m_pd3dDevice);

   if(FAILED(m_pObject->Create(m_pd3dDevice, _T(m_strMeshFilename))))
   {
      return D3DAPPERR_MEDIANOTFOUND;
   }

   m_pObject->SetFVF(m_pd3dDevice, D3DVERTEX::FVF);

   m_dwNumVertices  = m_pObject->GetSysMemMesh()->GetNumVertices();
   m_dwNumFaces     = m_pObject->GetSysMemMesh()->GetNumFaces();

   m_pd3dDevice->CreateVertexBuffer(m_dwNumVertices * sizeof(D3DVERTEX),
                                      D3DUSAGE_WRITEONLY, 0, D3DPOOL_MANAGED,
                                      &m_pMeshVB, NULL);
   m_pd3dDevice->CreateIndexBuffer(m_dwNumFaces * 3 * sizeof(WORD),
                                      D3DUSAGE_WRITEONLY,
                                      D3DFMT_INDEX16, D3DPOOL_MANAGED,
                                      &m_pMeshIB, NULL);

   // Copy vertices for mesh
   m_pObject->GetSysMemMesh()->GetVertexBuffer(&pMeshSourceVB);
   m_pMeshVB->Lock(0, 0, (void**)&pDst, 0);
   pMeshSourceVB->Lock(0, 0, (void**)&pSrc, 0);
   memcpy(pDst, pSrc, m_dwNumVertices * sizeof(D3DVERTEX));
   pMeshSourceVB->Unlock();
   pMeshSourceVB->Release();

   hr = D3DXComputeBoundingSphere((D3DXVECTOR3*)pDst, m_pObject->GetSysMemMesh()->GetNumVertices(), 
                                    D3DXGetFVFVertexSize(m_pObject->GetSysMemMesh()->GetFVF()), &m_vObjectCenter, 
                                    &m_fObjectRadius);

   m_pMeshVB->Unlock();

   // Copy indices for mesh
   m_pObject->GetSysMemMesh()->GetIndexBuffer(&pMeshSourceIB);
   m_pMeshIB->Lock(0, 0, (void**)&pDst, 0);
   pMeshSourceIB->Lock(0, 0, (void**)&pSrc, 0);
   memcpy(pDst, pSrc, 3 * m_dwNumFaces * sizeof(WORD));
   m_pMeshIB->Unlock();
   pMeshSourceIB->Unlock();
   pMeshSourceIB->Release();

   //set up tweening. Must have second mesh name be same as first,
   //but ending with a "2" instead of a "1"
   //example: dolphin1.x, dolphin2.x
   if(!m_scenestate.m_bInited)
   {
      m_scenestate.m_bTweening = false;
   }
   char *num;
   if(m_scenestate.m_bTweening)
   {
      num = strstr(m_strMeshFilename, "1.");
      if(num == NULL)
      {
         m_scenestate.m_bTweening = false;
      }
   }
   if(m_scenestate.m_bTweening)
   {
      *num = '2';
      if(FAILED(m_pObject2->Create(m_pd3dDevice, _T(m_strMeshFilename))))
      {
         return D3DAPPERR_MEDIANOTFOUND;
      }
      *num = '1';

      m_pObject2->SetFVF(m_pd3dDevice, D3DVERTEX::FVF);

      m_pd3dDevice->CreateVertexBuffer(m_dwNumVertices * sizeof(D3DVERTEX),
                                      D3DUSAGE_WRITEONLY, 0, D3DPOOL_MANAGED,
                                      &m_pMesh2VB, NULL);

      // Copy vertices for mesh
      m_pObject2->GetSysMemMesh()->GetVertexBuffer(&pMeshSourceVB);
      m_pMesh2VB->Lock(0, 0, (void**)&pDst, 0);
      pMeshSourceVB->Lock(0, 0, (void**)&pSrc, 0);
      memcpy(pDst, pSrc, m_dwNumVertices * sizeof(D3DVERTEX));
      m_pMesh2VB->Unlock();
      pMeshSourceVB->Unlock();
      pMeshSourceVB->Release();

      D3DVERTEXELEMENT9 declMesh[] =
      {
         { 0,  0, D3DDECLTYPE_FLOAT3,   D3DDECLMETHOD_DEFAULT,  D3DDECLUSAGE_POSITION, 0}, 
         { 0, 12, D3DDECLTYPE_FLOAT3,   D3DDECLMETHOD_DEFAULT,  D3DDECLUSAGE_NORMAL,   0}, 
         { 0, 24, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT,  D3DDECLUSAGE_COLOR,    0}, 
         { 0, 28, D3DDECLTYPE_FLOAT2,   D3DDECLMETHOD_DEFAULT,  D3DDECLUSAGE_TEXCOORD, 0}, 

         { 1,  0, D3DDECLTYPE_FLOAT3,   D3DDECLMETHOD_DEFAULT,  D3DDECLUSAGE_POSITION, 1}, 
         { 1, 12, D3DDECLTYPE_FLOAT3,   D3DDECLMETHOD_DEFAULT,  D3DDECLUSAGE_NORMAL,   1}, 
         { 1, 24, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT,  D3DDECLUSAGE_COLOR,    1}, 
         { 1, 28, D3DDECLTYPE_FLOAT2,   D3DDECLMETHOD_DEFAULT,  D3DDECLUSAGE_TEXCOORD, 1}, 
         D3DDECL_END()
      };
   
      if(FAILED(hr = m_pd3dDevice->CreateVertexDeclaration(declMesh, &m_pVertexDeclarationTween)))
      {
         return hr;
      }
   }

   //vertex declaration
   D3DVERTEXELEMENT9 declMesh[] =
   {
      { 0,  0, D3DDECLTYPE_FLOAT3,   D3DDECLMETHOD_DEFAULT,  D3DDECLUSAGE_POSITION, 0}, 
      { 0, 12, D3DDECLTYPE_FLOAT3,   D3DDECLMETHOD_DEFAULT,  D3DDECLUSAGE_NORMAL,   0}, 
      { 0, 24, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT,  D3DDECLUSAGE_COLOR,    0}, 
      { 0, 28, D3DDECLTYPE_FLOAT2,   D3DDECLMETHOD_DEFAULT,  D3DDECLUSAGE_TEXCOORD, 0}, 
      D3DDECL_END()
   };

   if(FAILED(hr = m_pd3dDevice->CreateVertexDeclaration(declMesh, &m_pVertexDeclaration)))
   {
      return hr;
   }
   return S_OK;
}

//-----------------------------------------------------------------------------
// Name: InitDiff()
// Desc: Initializes textures needed for diff
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InitDiff()
{
   HRESULT hr;

   if(m_bDiffInit)
   {
      return S_OK;
   }

   //create/init textures for diff
   hr = D3DXCreateTexture(m_pd3dDevice, m_iWidth, m_iHeight, 1, 
            D3DUSAGE_RENDERTARGET, m_d3dsdBackBuffer.Format, D3DPOOL_DEFAULT, &m_pTexture1);
   if(FAILED(hr))
   {
      return E_FAIL;
   }

   hr = m_pTexture1->GetSurfaceLevel(0, &m_pTextureSurface1);
   if(FAILED(hr))
   {
      return E_FAIL;
   }

   hr = D3DXCreateTexture(m_pd3dDevice, m_iWidth, m_iHeight, 1, 
            D3DUSAGE_RENDERTARGET, m_d3dsdBackBuffer.Format, D3DPOOL_DEFAULT, &m_pTexture2);
   if(FAILED(hr))
   {
      return E_FAIL;
   }

   hr = m_pTexture2->GetSurfaceLevel(0, &m_pTextureSurface2);
   if(FAILED(hr))
   {
      return E_FAIL;
   }

   hr = D3DXCreateTexture(m_pd3dDevice, m_iWidth, m_iHeight, 1, 
            D3DUSAGE_DYNAMIC, m_d3dsdBackBuffer.Format, D3DPOOL_SYSTEMMEM, &m_pTexture3);
   if(FAILED(hr))
   {
      return E_FAIL;
   }

   hr = m_pTexture3->GetSurfaceLevel(0, &m_pTextureSurface3);
   if(FAILED(hr))
   {
      return E_FAIL;
   }

   hr = m_pd3dDevice->CreateVertexBuffer(4 * sizeof(D3DVERTEX),
           D3DUSAGE_WRITEONLY, D3DVERTEX::FVF, D3DPOOL_MANAGED, &m_pQuadVB , NULL);
   if(FAILED(hr))
   {
      return E_FAIL;
   } 

   //set up quad covering entire screen (for diff rendering)
   D3DVERTEX *v;
   m_pQuadVB->Lock(0, 0, (void **) &v, 0);

   v[0].px = -(m_iWidth/2.f);
   v[0].py = -(m_iHeight/2.f);
   v[0].pz = 0.0f;
   v[0].c = 0xFFFFFFFF;
   v[0].tu = 0.f; v[0].tv = 1.f;
    
   v[1].px = -(m_iWidth/2.f);
   v[1].py = +(m_iHeight/2.f);
   v[1].pz = 0.0f;
   v[1].c = 0xFFFFFFFF;
   v[1].tu = 0.f; v[1].tv = 0.f;
    
   v[2].px = +(m_iWidth/2.f);
   v[2].py = +(m_iHeight/2.f);
   v[2].pz = 0.0f;
   v[2].c = 0xFFFFFFFF;
   v[2].tu = 1.f; v[2].tv = 0.f;

   v[3].px = +(m_iWidth/2.f);
   v[3].py = -(m_iHeight/2.f);
   v[3].pz = 0.0f;
   v[3].c = 0xFFFFFFFF;
   v[3].tu = 1.f; v[3].tv = 1.f;

   m_pQuadVB->Unlock();

   m_bDiffInit = true;
   return S_OK;
}

//-----------------------------------------------------------------------------
// Name: ReleaseDiff()
// Desc: Releases textures needed for diff
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::ReleaseDiff()
{
   if(!m_bDiffInit)
   {
      return S_OK;
   }

   SAFE_RELEASE(m_pTextureSurface1);
   SAFE_RELEASE(m_pTextureSurface2);
   SAFE_RELEASE(m_pTextureSurface3);
   SAFE_RELEASE(m_pTexture1);
   SAFE_RELEASE(m_pTexture2);
   SAFE_RELEASE(m_pTexture3);

   SAFE_RELEASE(m_pQuadVB);

   m_bDiffInit = false;
   return S_OK;
}

//-----------------------------------------------------------------------------
// Name: D3DUtil_InitMaterial()
// Desc: Initializes a D3DMATERIAL9 structure, setting the diffuse and ambient
//       colors. It does not set emissive or specular colors.
// PVS:  This is from an older D3DUtil file
//-----------------------------------------------------------------------------
VOID D3DUtil_InitMaterial(D3DMATERIAL9& mtrl, FLOAT r, FLOAT g, FLOAT b,
                           FLOAT a)
{
    ZeroMemory(&mtrl, sizeof(D3DMATERIAL9));
    mtrl.Specular.r = mtrl.Diffuse.r = mtrl.Ambient.r = r;
    mtrl.Specular.g = mtrl.Diffuse.g = mtrl.Ambient.g = g;
    mtrl.Specular.b = mtrl.Diffuse.b = mtrl.Ambient.b = b;
    mtrl.Specular.a = mtrl.Diffuse.a = mtrl.Ambient.a = a;
}

//-----------------------------------------------------------------------------
// Name: RestoreDeviceObjects()
// Desc: Initialize scene objects.
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::RestoreDeviceObjects()
{
	HRESULT hr;

   m_pFont->RestoreDeviceObjects();
   m_pFontSmall->RestoreDeviceObjects();

   // Restore device-memory objects for the mesh
   m_pObject->RestoreDeviceObjects(m_pd3dDevice);

   if(FAILED(hr = D3DXCreateCubeTextureFromFile(m_pd3dDevice, "Data\\LobbyCube.dds", &m_pCubeMap)))
   {
      return hr;
   }

   //init shader
   LPD3DXBUFFER pBufferErrors = NULL;
   if(FAILED(hr = D3DXCreateEffectFromFile(m_pd3dDevice, "Effects\\FixedFuncShader.fx", 
	        NULL, NULL, D3DXSHADER_DEBUG, NULL, &m_pEffect, &pBufferErrors)))
   {
      return hr;
   }
   if(FAILED(hr = m_pEffect->ValidateTechnique(m_pEffect->GetTechniqueByName("basic"))))
   {
      return hr;
   }
   if(FAILED(m_pEffect->ValidateTechnique(m_pEffect->GetTechniqueByName("basic_with_shader"))))
   {
      return hr;
   }
   if(FAILED(m_pEffect->ValidateTechnique(m_pEffect->GetTechniqueByName("technique_diff"))))
   {
      return hr;
   }


   m_pEffect->OnResetDevice();

   // Set miscellaneous render states
   m_pd3dDevice->SetRenderState(D3DRS_DITHERENABLE,    FALSE);
   m_pd3dDevice->SetRenderState(D3DRS_SPECULARENABLE,  FALSE);
   m_pd3dDevice->SetRenderState(D3DRS_ZENABLE,         TRUE);
   m_pd3dDevice->SetRenderState(D3DRS_NORMALIZENORMALS,TRUE);

   m_iWidth  = m_d3dsdBackBuffer.Width;
   m_iHeight = m_d3dsdBackBuffer.Height;

   m_pd3dDevice->SetRenderState(D3DRS_AMBIENT, 0xFFFFFFFF);

   // Set the world matrix
   D3DXMatrixTranslation(&m_matWorld, -m_vObjectCenter.x,
                                      -m_vObjectCenter.y,
                                      -m_vObjectCenter.z);

   m_pd3dDevice->SetTransform(D3DTS_WORLD,  &m_matWorld);

   // Set the projection matrix
   FLOAT fAspect = ((FLOAT)m_iWidth/2) / m_iHeight;
   D3DXMatrixPerspectiveFovLH(&m_matProj, D3DX_PI/4, fAspect, 
                                m_fObjectRadius/64.0f, m_fObjectRadius*200.0f);
   m_pd3dDevice->SetTransform(D3DTS_PROJECTION, &m_matProj);

   D3DXMatrixTranslation(&m_matViewTrans, 0,0,3.0f * m_fObjectRadius);
   D3DXMatrixIdentity(&m_matViewRot);
   D3DXMatrixMultiply(&m_matView, &m_matViewRot, &m_matViewTrans);
   m_pd3dDevice->SetTransform(D3DTS_VIEW, &m_matView);

   m_scenestate.Set(m_pd3dDevice, m_pEffect);

   // Set the ArcBall parameters
   m_ArcBall.SetWindow(m_iWidth, m_iHeight, 1.0f);
   m_ArcBall.SetTranslationRadius(m_fObjectRadius);
   D3DXMatrixIdentity(&m_matArcBall);

   m_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
   m_pd3dDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
   m_pd3dDevice->SetRenderState(D3DRS_COLORVERTEX, FALSE);

   //to do the diff
   if(m_Mode == FFS_MODE_DIFF)
   {
      if(FAILED(InitDiff()))
      {
         return E_FAIL;
      }
   }

   //handle command line options
   if(m_bLoadState)
   {
      m_bLoadState = false;
      LoadFullState();
   }
   return S_OK;
}

//-----------------------------------------------------------------------------
// Name: InvalidateDeviceObjects()
// Desc:
//-----------------------------------------------------------------------------
HRESULT CMyD3DApplication::InvalidateDeviceObjects()
{
   if(m_pFont != NULL)
   {
      m_pFont->InvalidateDeviceObjects();
   }
   if(m_pFontSmall != NULL)
   {
      m_pFontSmall->InvalidateDeviceObjects();
   }
   if(m_pObject != NULL)
   {
      m_pObject->InvalidateDeviceObjects();
   }

   if(m_pEffect != NULL)
   {
	   m_pEffect->OnLostDevice();
   }

   SAFE_RELEASE(m_pEffect);
   SAFE_RELEASE(m_pCubeMap);

   if(m_Mode == FFS_MODE_DIFF)
   {

⌨️ 快捷键说明

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