bool CObject3D::InitStaticDeviceObjects(LPDIRECT3DDEVICE9 device) { D3DVERTEXELEMENT9 decl[] = { { 0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0 }, { 0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDWEIGHT, 0 }, { 0, 20, D3DDECLTYPE_SHORT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BLENDINDICES, 0 }, { 0, 24, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 }, { 0, 36, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 }, D3DDECL_END() }; if (FAILED(device->CreateVertexDeclaration(decl, &s_skinVertexDeclaration))) { qCritical("Can't create skin vertex declaration. You must (re)install the lastest DirectX9 runtime on http://www.microsoft.com/en-us/download/details.aspx?id=8109"); return false; } LPD3DXBUFFER code; if (FAILED(D3DXAssembleShaderFromResource(NULL, MAKEINTRESOURCE(IDR_SKINVS), NULL, NULL, 0, &code, NULL))) { qCritical("Can't assemble skin vertex shader from resource. You must (re)install the lastest DirectX9 runtime on http://www.microsoft.com/en-us/download/details.aspx?id=8109"); return false; } if (FAILED(device->CreateVertexShader((DWORD*)code->GetBufferPointer(), &s_skinVS))) { qCritical("Can't create skin vertex shader. You must (re)install the lastest DirectX9 runtime on http://www.microsoft.com/en-us/download/details.aspx?id=8109"); Release(code); return false; } Release(code); s_reflectTexture.SetDevice(device); if (!s_reflectTexture.Load("Model/Texture/etc_reflect.tga")) { qCritical("Can't load Model/Texture/etc_reflect.tga"); return false; } return true; }
//----------------------------------------------------------------------------- // Name: RestoreDeviceObjects() // Desc: Initialize scene objects. //----------------------------------------------------------------------------- HRESULT CMyD3DApplication::RestoreDeviceObjects() { // Restore the fonts m_pFont->RestoreDeviceObjects(); HRESULT hr = S_OK; D3DLIGHT8 light; m_ArcBall.SetWindow( m_d3dsdBackBuffer.Width, m_d3dsdBackBuffer.Height, 2.0f ); if (m_pdeSelected != NULL) SetProjectionMatrix(); m_pd3dDevice->SetRenderState( D3DRS_DITHERENABLE, TRUE ); m_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE ); m_pd3dDevice->SetRenderState( D3DRS_SPECULARENABLE, FALSE ); m_pd3dDevice->SetRenderState( D3DRS_NORMALIZENORMALS, TRUE ); m_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_CW ); m_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE ); m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR ); m_pd3dDevice->SetTextureStageState( 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR ); m_pd3dDevice->SetRenderState( D3DRS_COLORVERTEX, FALSE ); // Create vertex shader for the indexed skinning DWORD dwIndexedVertexDecl1[] = { D3DVSD_STREAM( 0 ), D3DVSD_REG( 0, D3DVSDT_FLOAT3 ), // Position of first mesh D3DVSD_REG( 2, D3DVSDT_D3DCOLOR ), // Blend indices // D3DVSD_REG( 2, D3DVSDT_UBYTE4 ), // Blend indices D3DVSD_REG( 3, D3DVSDT_FLOAT3 ), // Normal D3DVSD_REG( 4, D3DVSDT_FLOAT2 ), // Tex coords D3DVSD_END() }; DWORD dwIndexedVertexDecl2[] = { D3DVSD_STREAM( 0 ), D3DVSD_REG( 0, D3DVSDT_FLOAT3 ), // Position of first mesh D3DVSD_REG( 1, D3DVSDT_FLOAT1 ), // Blend weights D3DVSD_REG( 2, D3DVSDT_D3DCOLOR ), // Blend indices // D3DVSD_REG( 2, D3DVSDT_UBYTE4 ), // Blend indices D3DVSD_REG( 3, D3DVSDT_FLOAT3 ), // Normal D3DVSD_REG( 4, D3DVSDT_FLOAT2 ), // Tex coords D3DVSD_END() }; DWORD dwIndexedVertexDecl3[] = { D3DVSD_STREAM( 0 ), D3DVSD_REG( 0, D3DVSDT_FLOAT3 ), // Position of first mesh D3DVSD_REG( 1, D3DVSDT_FLOAT2 ), // Blend weights D3DVSD_REG( 2, D3DVSDT_D3DCOLOR ), // Blend indices // D3DVSD_REG( 2, D3DVSDT_UBYTE4 ), // Blend indices D3DVSD_REG( 3, D3DVSDT_FLOAT3 ), // Normal D3DVSD_REG( 4, D3DVSDT_FLOAT2 ), // Tex coords D3DVSD_END() }; DWORD dwIndexedVertexDecl4[] = { D3DVSD_STREAM( 0 ), D3DVSD_REG( 0, D3DVSDT_FLOAT3 ), // Position of first mesh D3DVSD_REG( 1, D3DVSDT_FLOAT3 ), // Blend weights D3DVSD_REG( 2, D3DVSDT_D3DCOLOR ), // Blend indices // D3DVSD_REG( 2, D3DVSDT_UBYTE4 ), // Blend indices D3DVSD_REG( 3, D3DVSDT_FLOAT3 ), // Normal D3DVSD_REG( 4, D3DVSDT_FLOAT2 ), // Tex coords D3DVSD_END() }; DWORD* dwIndexedVertexDecl[] = {dwIndexedVertexDecl1, dwIndexedVertexDecl2, dwIndexedVertexDecl3, dwIndexedVertexDecl4}; LPD3DXBUFFER pCode; DWORD bUseSW = D3DUSAGE_SOFTWAREPROCESSING; if (m_d3dCaps.VertexShaderVersion >= D3DVS_VERSION(1, 1)) { bUseSW = 0; } for (DWORD i = 0; i < 4; ++i) { // Assemble the vertex shader file if( FAILED( hr = D3DXAssembleShaderFromResource(NULL, MAKEINTRESOURCE(IDD_SHADER1 + i), 0, NULL, &pCode, NULL ) ) ) return hr; // Create the vertex shader if( FAILED( hr = m_pd3dDevice->CreateVertexShader( dwIndexedVertexDecl[i], (DWORD*)pCode->GetBufferPointer(), &(m_dwIndexedVertexShader[i]) , bUseSW ) ) ) { return hr; } pCode->Release(); } ZeroMemory( &light, sizeof(light) ); light.Type = D3DLIGHT_DIRECTIONAL; light.Diffuse.r = 1.0; light.Diffuse.g = 1.0; light.Diffuse.b = 1.0; light.Specular.r = 0; light.Specular.g = 0; light.Specular.b = 0; light.Ambient.r = 0.25; light.Ambient.g = 0.25; light.Ambient.b = 0.25; light.Direction = D3DXVECTOR3( 0.0f, 0.0f, -1.0f); hr = m_pd3dDevice->SetLight(0, &light ); if (FAILED(hr)) return E_FAIL; hr = m_pd3dDevice->LightEnable(0, TRUE); if (FAILED(hr)) return E_FAIL; // Set Light for vertex shader D3DXVECTOR4 vLightDir( 0.0f, 0.0f, 1.0f, 0.0f ); m_pd3dDevice->SetVertexShaderConstant(1, &vLightDir, 1); return S_OK; }