2010-03-24 5 views
3

Использование библиотеки D3DX, которая является частью DirectX, а именно directx9 в данном случае, мне интересно, если это безопасно использовать ту же матрицу (или вектор и т.д.) для ввода и OuputМожно ли использовать те же параметры для ввода и вывода в функциях D3DX?

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

Я избегая этого, предполагая, что это приведет к плохим вещам, когда части массива будут частично перезаписаны по мере того, как будут вычислены результаты, но я вижу очень много кода, который делает именно это.

Краткий тест показывает, что он работает нормально, поэтому я предполагаю, что функции D3DX берут копию, где необходимо входных данных, или какой-либо другой метод, чтобы гарантировать, что это работает нормально, но я не могу найти его документированным в любом месте, поэтому я неохотно полагаюсь на его работу.

Есть ли официальное заявление об использовании функции, как это?

ответ

3

Да, это так. Из msdn:

Каждая из функций может иметь тот же объект, переданный [в] и вернулся [из] Параметры

+0

Ах отлично. По какой-то причине я не смог найти это. – jcoder

+0

Принимает это, поскольку имеет определенную ссылку. другой ответ тоже хорош, хотя так проголосовали – jcoder

+0

Хех я даже проверил, что ссылка ... очевидно, не читала это достаточно хорошо;) – Goz

1

Я довольно уверен, что ответ утвердительный. Я не могу найти нигде, где это сказано наверняка, однако ...

Редактировать: Перелистывание через D3DX9Math.inl похоже на уходе. Было сделано, чтобы убедиться, что вы можете. Например, если мы посмотрим на код 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; 
} 

Вы можете видеть, что он выполняет декартово произведение в временный, а затем, на заключительном этапе, она копирует его в ответ. Было бы хорошо, если бы это было указано где-то точно.