2010-03-24 5 views
3

Utilisation de la bibliothèque de D3DX qui est une partie de directX, en particulier DirectX9 dans ce cas, je me demande s'il est sûr d'utiliser la même matrice (ou vecteur, etc.) pour l'entrée et en sortieEst-il prudent d'utiliser les mêmes paramètres pour l'entrée et la sortie dans les fonctions D3DX?

D3DXMATRIX mat; 
D3DXMatrixInverse(&mat, NULL, &mat); 

J'ai En évitant de le faire, en supposant que cela se traduirait par de mauvaises choses quand des parties du tableau sont partiellement écrasées au fur et à mesure que les résultats sont calculés, mais je vois énormément de code autour de ça qui fait exactement cela. Un bref test indique que cela semble fonctionner, donc je suppose que les fonctions D3DX prennent une copie si nécessaire des données d'entrée, ou une autre méthode pour s'assurer que cela fonctionne bien, mais je ne peux pas trouver documenté n'importe où, donc je suis réticent à compter sur le travail.

Existe-t-il une déclaration officielle sur l'utilisation de ces fonctions?

Répondre

3

Oui, c'est. De msdn:

Chacune des fonctions peut prendre le même objet que le passé [en] et renvoyé [out] paramètres

+0

Ah excellent. Pour une raison quelconque, je ne pouvais pas trouver cela. – jcoder

+0

Accepté comme il a le lien définitif. l'autre réponse est bonne aussi, quoique votée en haut – jcoder

+0

Heh J'ai même vérifié ce lien ... évidemment je ne l'ai pas lu assez bien;) – Goz

1

Je suis assez sûr que la réponse est oui. Je ne trouve nulle part où cela est dit à coup sûr cependant ...

Éditer: Feuilletant D3DX9Math.inl il semble que des précautions ont été prises pour s'assurer que vous le pouvez. Par exemple, si nous regardons le code pour D3DXVec3Cross:

D3DXINLINE D3DXVECTOR3* D3DXVec3Cross 
    (D3DXVECTOR3 *pOut, CONST D3DXVECTOR3 *pV1, CONST D3DXVECTOR3 *pV2) 
{ 
    D3DXVECTOR3 v; 

#ifdef D3DX_DEBUG 
    if(!pOut || !pV1 || !pV2) 
     return NULL; 
#endif 

    v.x = pV1->y * pV2->z - pV1->z * pV2->y; 
    v.y = pV1->z * pV2->x - pV1->x * pV2->z; 
    v.z = pV1->x * pV2->y - pV1->y * pV2->x; 

    *pOut = v; 
    return pOut; 
} 

Vous pouvez voir qu'il exécute le produit croisé dans un temporaire, puis, dans la dernière étape, il copie dans le retour. Ce serait bien si c'était indiqué quelque part à coup sûr.

Questions connexes