1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| // Recup/calcul des matrices
D3DXMATRIX world_matrix; pd3dDevice->GetTransform(D3DTS_WORLD,&world_matrix);
D3DXMATRIX view_matrix; pd3dDevice->GetTransform(D3DTS_VIEW,&view_matrix);
D3DXMATRIX projection_matrix; pd3dDevice->GetTransform(D3DTS_PROJECTION, &projection_matrix);
D3DVIEWPORT9 stV;
HRESULT hr = pd3dDevice->GetViewport(&stV);
if (FAILED(hr))
{ LogDXError("_CalculePositionTexte","GetViewPort",hr); return; }
D3DXMATRIX mClip;
mClip._11 = 2.0/stV.Width;
mClip._12=0;
mClip._13=0;
mClip._14=0;
mClip._21 = 0;
mClip._22=2.0/stV.Height;
mClip._23=0;
mClip._24=0;
mClip._31 = 0;
mClip._32=0;
mClip._33=1.0/(stV.MaxZ-stV.MinZ);
mClip._34=0;
mClip._41 = -1-2*(stV.X/stV.Width);
mClip._42=1-2*(stV.Y/stV.Height);
mClip._43=-stV.MinZ/(stV.MaxZ-stV.MinZ);
mClip._44=1;
D3DXMATRIX viewport;
viewport._11 = stV.Width;
viewport._12 = 0;
viewport._13 = 0;
viewport._14 = 0;
viewport._21 = 0;
viewport._22 = -1.0*stV.Height;
viewport._23 = 0;
viewport._24 = 0;
viewport._31 = 0;
viewport._32 = 0;
viewport._33 = 1;
viewport._34 = 0;
viewport._41 = 0;
viewport._42 = stV.Height;
viewport._43 = 0;
viewport._44 = 1;
// Les points a transformer
D3DXVECTOR4 pptD3DCentre;
pptD3DCentre.x = pptCoordCentre->x; pptD3DCentre.y = pptCoordCentre->y; pptD3DCentre.z = pptCoordCentre->z; pptD3DCentre.w = 1;
D3DXVECTOR4 pptD3DMilieu;
pptD3DMilieu.x = pptCoordMilieu->x; pptD3DMilieu.y = pptCoordMilieu->y; pptD3DMilieu.z = pptCoordMilieu->z; pptD3DMilieu.w = 1;
D3DXMatrixMultiply(&tmp_matrix, &viewport, &mClip);
D3DXMatrixMultiply(&calc_matrix, &tmp_matrix, &projection_matrix);
D3DXMatrixMultiply(&tmp_matrix, &calc_matrix, &view_matrix);
D3DXMatrixMultiply(&calc_matrix, &tmp_matrix, &world_matrix);
__TransformePoint(&ptD3DCentreEcran, &pptD3DCentre, &calc_matrix);
__TransformePoint(&ptD3DMileuEcran, &pptD3DMilieu, &calc_matrix);
//------------------------------------------------------------------------------------------------------------------------
// Multiplication de matrice.
__TransformePoint(D3DXVECTOR4* pPointDestination, const D3DXVECTOR4* pPointSource, D3DXMATRIX* pD3DMatrice)
{
ASSERT (pPointDestination!=NULL); ASSERT (pPointSource!=NULL); ASSERT (pPointDestination!=pPointSource);
// S'il n'y a pas de matrice pour la transformation, alors c'est l'identité...
if ( pD3DMatrice == NULL )
{
pPointDestination->x = pPointSource->x;
pPointDestination->y = pPointSource->y;
pPointDestination->z = pPointSource->z;
pPointDestination->w = 1;
return;
}
// Produit ligne colonne
pPointDestination->x = pD3DMatrice->_11*pPointSource->x + pD3DMatrice->_12*pPointSource->y + pD3DMatrice->_13*pPointSource->z + pD3DMatrice->_14;
pPointDestination->y = pD3DMatrice->_21*pPointSource->x + pD3DMatrice->_22*pPointSource->y + pD3DMatrice->_23*pPointSource->z + pD3DMatrice->_24;
pPointDestination->z = pD3DMatrice->_31*pPointSource->x + pD3DMatrice->_32*pPointSource->y + pD3DMatrice->_33*pPointSource->z + pD3DMatrice->_34;
pPointDestination->w = pD3DMatrice->_41*pPointSource->x + pD3DMatrice->_42*pPointSource->y + pD3DMatrice->_43*pPointSource->z + pD3DMatrice->_44;
} |
Partager