?? fixedfuncshader.cpp
字號:
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 + -