Безопасно ли использовать одни и те же параметры для входа и выхода в функциях D3DX? - PullRequest
3 голосов
/ 24 марта 2010

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

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

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

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

Есть ли официальное заявление об использовании подобных функций?

Ответы [ 2 ]

3 голосов
/ 24 марта 2010

Да, это так. От MSDN :

Каждая из функций может принимать тот же объект, что и переданные [in] и возвращенные [out] параметры

1 голос
/ 24 марта 2010

Я почти уверен, что ответ - да. Я не могу найти где-нибудь, где это точно сказано, однако ...

Редактировать: пролистывая 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;
}

Вы видите, что он выполняет перекрестное произведение во временное и ТОГДА на последнем этапе копирует его в возврат. Было бы неплохо, если бы об этом было где-то точно сказано.

...