#include "d3dx9_36_private.h"
-#ifdef _MSC_VER
-#define copysignf(x, y) ((x) < 0.0f ? -fabsf(y) : fabsf(y))
-#endif
-
struct ID3DXMatrixStackImpl
{
ID3DXMatrixStack ID3DXMatrixStack_iface;
s = sinf(rotation / 2.0f);
tmp1 = 1.0f - 2.0f * s * s;
- tmp2 = 2.0 * s * cosf(rotation / 2.0f);
+ tmp2 = 2.0f * s * cosf(rotation / 2.0f);
D3DXMatrixIdentity(out);
out->u.m[0][0] = scaling * tmp1;
TRACE("pout %p, fovy %f, aspect %f, zn %f, zf %f\n", pout, fovy, aspect, zn, zf);
D3DXMatrixIdentity(pout);
- pout->u.m[0][0] = 1.0f / (aspect * tan(fovy/2.0f));
- pout->u.m[1][1] = 1.0f / tan(fovy/2.0f);
+ pout->u.m[0][0] = 1.0f / (aspect * tanf(fovy/2.0f));
+ pout->u.m[1][1] = 1.0f / tanf(fovy/2.0f);
pout->u.m[2][2] = zf / (zf - zn);
pout->u.m[2][3] = 1.0f;
pout->u.m[3][2] = (zf * zn) / (zn - zf);
TRACE("pout %p, fovy %f, aspect %f, zn %f, zf %f\n", pout, fovy, aspect, zn, zf);
D3DXMatrixIdentity(pout);
- pout->u.m[0][0] = 1.0f / (aspect * tan(fovy/2.0f));
- pout->u.m[1][1] = 1.0f / tan(fovy/2.0f);
+ pout->u.m[0][0] = 1.0f / (aspect * tanf(fovy/2.0f));
+ pout->u.m[1][1] = 1.0f / tanf(fovy/2.0f);
pout->u.m[2][2] = zf / (zn - zf);
pout->u.m[2][3] = -1.0f;
pout->u.m[3][2] = (zf * zn) / (zn - zf);
TRACE("pout %p, angle %f\n", pout, angle);
D3DXMatrixIdentity(pout);
- pout->u.m[1][1] = cos(angle);
- pout->u.m[2][2] = cos(angle);
- pout->u.m[1][2] = sin(angle);
- pout->u.m[2][1] = -sin(angle);
+ pout->u.m[1][1] = cosf(angle);
+ pout->u.m[2][2] = cosf(angle);
+ pout->u.m[1][2] = sinf(angle);
+ pout->u.m[2][1] = -sinf(angle);
return pout;
}
TRACE("pout %p, angle %f\n", pout, angle);
D3DXMatrixIdentity(pout);
- pout->u.m[0][0] = cos(angle);
- pout->u.m[2][2] = cos(angle);
- pout->u.m[0][2] = -sin(angle);
- pout->u.m[2][0] = sin(angle);
+ pout->u.m[0][0] = cosf(angle);
+ pout->u.m[2][2] = cosf(angle);
+ pout->u.m[0][2] = -sinf(angle);
+ pout->u.m[2][0] = sinf(angle);
return pout;
}
TRACE("pout %p, angle %f\n", pout, angle);
D3DXMatrixIdentity(pout);
- pout->u.m[0][0] = cos(angle);
- pout->u.m[1][1] = cos(angle);
- pout->u.m[0][1] = sin(angle);
- pout->u.m[1][0] = -sin(angle);
+ pout->u.m[0][0] = cosf(angle);
+ pout->u.m[1][1] = cosf(angle);
+ pout->u.m[0][1] = sinf(angle);
+ pout->u.m[1][0] = -sinf(angle);
return pout;
}
trans.z=0.0f;
}
- rot.w=cos(rotation/2.0f);
+ rot.w=cosf(rotation/2.0f);
rot.x=0.0f;
rot.y=0.0f;
- rot.z=sin(rotation/2.0f);
+ rot.z=sinf(rotation/2.0f);
- sca_rot.w=cos(scalingrotation/2.0f);
+ sca_rot.w=cosf(scalingrotation/2.0f);
sca_rot.x=0.0f;
sca_rot.y=0.0f;
- sca_rot.z=sin(scalingrotation/2.0f);
+ sca_rot.z=sinf(scalingrotation/2.0f);
D3DXMatrixTransformation(pout, &sca_center, &sca_rot, &sca, &rot_center, &rot, &trans);
D3DXQUATERNION* WINAPI D3DXQuaternionInverse(D3DXQUATERNION *pout, const D3DXQUATERNION *pq)
{
- D3DXQUATERNION out;
FLOAT norm;
TRACE("pout %p, pq %p\n", pout, pq);
norm = D3DXQuaternionLengthSq(pq);
- out.x = -pq->x / norm;
- out.y = -pq->y / norm;
- out.z = -pq->z / norm;
- out.w = pq->w / norm;
-
- *pout =out;
+ pout->x = -pq->x / norm;
+ pout->y = -pq->y / norm;
+ pout->z = -pq->z / norm;
+ pout->w = pq->w / norm;
return pout;
}
void WINAPI D3DXQuaternionSquadSetup(D3DXQUATERNION *paout, D3DXQUATERNION *pbout, D3DXQUATERNION *pcout, const D3DXQUATERNION *pq0, const D3DXQUATERNION *pq1, const D3DXQUATERNION *pq2, const D3DXQUATERNION *pq3)
{
D3DXQUATERNION q, temp1, temp2, temp3, zero;
+ D3DXQUATERNION aout, cout;
TRACE("paout %p, pbout %p, pcout %p, pq0 %p, pq1 %p, pq2 %p, pq3 %p\n", paout, pbout, pcout, pq0, pq1, pq2, pq3);
zero.z = 0.0f;
zero.w = 0.0f;
- if ( D3DXQuaternionDot(pq0, pq1) < 0.0f )
+ if (D3DXQuaternionDot(pq0, pq1) < 0.0f)
temp2 = add_diff(&zero, pq0, -1.0f);
else
temp2 = *pq0;
- if ( D3DXQuaternionDot(pq1, pq2) < 0.0f )
- *pcout = add_diff(&zero, pq2, -1.0f);
+ if (D3DXQuaternionDot(pq1, pq2) < 0.0f)
+ cout = add_diff(&zero, pq2, -1.0f);
else
- *pcout = *pq2;
+ cout = *pq2;
- if ( D3DXQuaternionDot(pcout, pq3) < 0.0f )
+ if (D3DXQuaternionDot(&cout, pq3) < 0.0f)
temp3 = add_diff(&zero, pq3, -1.0f);
else
temp3 = *pq3;
D3DXQuaternionInverse(&temp1, pq1);
D3DXQuaternionMultiply(&temp2, &temp1, &temp2);
D3DXQuaternionLn(&temp2, &temp2);
- D3DXQuaternionMultiply(&q, &temp1, pcout);
+ D3DXQuaternionMultiply(&q, &temp1, &cout);
D3DXQuaternionLn(&q, &q);
temp1 = add_diff(&temp2, &q, 1.0f);
temp1.x *= -0.25f;
temp1.z *= -0.25f;
temp1.w *= -0.25f;
D3DXQuaternionExp(&temp1, &temp1);
- D3DXQuaternionMultiply(paout, pq1, &temp1);
+ D3DXQuaternionMultiply(&aout, pq1, &temp1);
- D3DXQuaternionInverse(&temp1, pcout);
+ D3DXQuaternionInverse(&temp1, &cout);
D3DXQuaternionMultiply(&temp2, &temp1, pq1);
D3DXQuaternionLn(&temp2, &temp2);
D3DXQuaternionMultiply(&q, &temp1, &temp3);
temp1.z *= -0.25f;
temp1.w *= -0.25f;
D3DXQuaternionExp(&temp1, &temp1);
- D3DXQuaternionMultiply(pbout, pcout, &temp1);
-
- return;
+ D3DXQuaternionMultiply(pbout, &cout, &temp1);
+ *paout = aout;
+ *pcout = cout;
}
void WINAPI D3DXQuaternionToAxisAngle(const D3DXQUATERNION *pq, D3DXVECTOR3 *paxis, FLOAT *pangle)
{
TRACE("pq %p, paxis %p, pangle %p\n", pq, paxis, pangle);
- paxis->x = pq->x;
- paxis->y = pq->y;
- paxis->z = pq->z;
- *pangle = 2.0f * acos(pq->w);
+ if (paxis)
+ {
+ paxis->x = pq->x;
+ paxis->y = pq->y;
+ paxis->z = pq->z;
+ }
+ if (pangle)
+ *pangle = 2.0f * acosf(pq->w);
}
/*_________________D3DXVec2_____________________*/
D3DXVECTOR4* WINAPI D3DXVec2Transform(D3DXVECTOR4 *pout, const D3DXVECTOR2 *pv, const D3DXMATRIX *pm)
{
+ D3DXVECTOR4 out;
+
TRACE("pout %p, pv %p, pm %p\n", pout, pv, pm);
- pout->x = pm->u.m[0][0] * pv->x + pm->u.m[1][0] * pv->y + pm->u.m[3][0];
- pout->y = pm->u.m[0][1] * pv->x + pm->u.m[1][1] * pv->y + pm->u.m[3][1];
- pout->z = pm->u.m[0][2] * pv->x + pm->u.m[1][2] * pv->y + pm->u.m[3][2];
- pout->w = pm->u.m[0][3] * pv->x + pm->u.m[1][3] * pv->y + pm->u.m[3][3];
+ out.x = pm->u.m[0][0] * pv->x + pm->u.m[1][0] * pv->y + pm->u.m[3][0];
+ out.y = pm->u.m[0][1] * pv->x + pm->u.m[1][1] * pv->y + pm->u.m[3][1];
+ out.z = pm->u.m[0][2] * pv->x + pm->u.m[1][2] * pv->y + pm->u.m[3][2];
+ out.w = pm->u.m[0][3] * pv->x + pm->u.m[1][3] * pv->y + pm->u.m[3][3];
+ *pout = out;
return pout;
}
D3DXVECTOR4* WINAPI D3DXVec3Transform(D3DXVECTOR4 *pout, const D3DXVECTOR3 *pv, const D3DXMATRIX *pm)
{
+ D3DXVECTOR4 out;
+
TRACE("pout %p, pv %p, pm %p\n", pout, pv, pm);
- pout->x = pm->u.m[0][0] * pv->x + pm->u.m[1][0] * pv->y + pm->u.m[2][0] * pv->z + pm->u.m[3][0];
- pout->y = pm->u.m[0][1] * pv->x + pm->u.m[1][1] * pv->y + pm->u.m[2][1] * pv->z + pm->u.m[3][1];
- pout->z = pm->u.m[0][2] * pv->x + pm->u.m[1][2] * pv->y + pm->u.m[2][2] * pv->z + pm->u.m[3][2];
- pout->w = pm->u.m[0][3] * pv->x + pm->u.m[1][3] * pv->y + pm->u.m[2][3] * pv->z + pm->u.m[3][3];
+ out.x = pm->u.m[0][0] * pv->x + pm->u.m[1][0] * pv->y + pm->u.m[2][0] * pv->z + pm->u.m[3][0];
+ out.y = pm->u.m[0][1] * pv->x + pm->u.m[1][1] * pv->y + pm->u.m[2][1] * pv->z + pm->u.m[3][1];
+ out.z = pm->u.m[0][2] * pv->x + pm->u.m[1][2] * pv->y + pm->u.m[2][2] * pv->z + pm->u.m[3][2];
+ out.w = pm->u.m[0][3] * pv->x + pm->u.m[1][3] * pv->y + pm->u.m[2][3] * pv->z + pm->u.m[3][3];
+ *pout = out;
return pout;
}
unsigned short float_32_to_16(const float in)
{
int exp = 0, origexp;
- float tmp = fabs(in);
+ float tmp = fabsf(in);
int sign = (copysignf(1, in) < 0);
unsigned int mantissa;
unsigned short ret;
if (isnan(in)) return (sign ? 0xffff : 0x7fff);
if (in == 0.0f) return (sign ? 0x8000 : 0x0000);
- if (tmp < powf(2, 10))
+ if (tmp < (float)(1u << 10))
{
do
{
tmp *= 2.0f;
exp--;
- } while (tmp < powf(2, 10));
+ } while (tmp < (float)(1u << 10));
}
- else if (tmp >= powf(2, 11))
+ else if (tmp >= (float)(1u << 11))
{
do
{
tmp /= 2.0f;
exp++;
- } while (tmp >= powf(2, 11));
+ } while (tmp >= (float)(1u << 11));
}
exp += 10; /* Normalize the mantissa */
exp = origexp;
/* the 13 extra bits from single precision are used for rounding */
- mantissa = (unsigned int)(tmp * powf(2, 13));
+ mantissa = (unsigned int)(tmp * (1u << 13));
mantissa >>= 1 - exp; /* denormalize */
mantissa -= ~(mantissa >> 13) & 1; /* round half to even */
/* Native d3dx9's D3DXFloat16to32Array lacks support for NaN and Inf. Specifically, e = 16 is treated as a
* regular number - e.g., 0x7fff is converted to 131008.0 and 0xffff to -131008.0. */
-static inline float float_16_to_32(const unsigned short in)
+float float_16_to_32(const unsigned short in)
{
const unsigned short s = (in & 0x8000);
const unsigned short e = (in & 0x7C00) >> 10;
return s;
}
-static void weightedcapintegrale(FLOAT *out, FLOAT order, FLOAT angle)
+static void weightedcapintegrale(FLOAT *out, UINT order, FLOAT angle)
{
FLOAT coeff[3];
out[9] = -sqrtf(70.0f / D3DX_PI) / 8.0f * dir->y * (3.0f * dirxx - diryy);
out[10] = sqrtf(105.0f / D3DX_PI) / 2.0f * dirxy * dir->z;
- out[11] = -sqrtf(42.0 / D3DX_PI) / 8.0f * dir->y * (-1.0f + 5.0f * dirzz);
+ out[11] = -sqrtf(42.0f / D3DX_PI) / 8.0f * dir->y * (-1.0f + 5.0f * dirzz);
out[12] = sqrtf(7.0f / D3DX_PI) / 4.0f * dir->z * (5.0f * dirzz - 3.0f);
- out[13] = sqrtf(42.0 / D3DX_PI) / 8.0f * dir->x * (1.0f - 5.0f * dirzz);
+ out[13] = sqrtf(42.0f / D3DX_PI) / 8.0f * dir->x * (1.0f - 5.0f * dirzz);
out[14] = sqrtf(105.0f / D3DX_PI) / 4.0f * dir->z * (dirxx - diryy);
out[15] = -sqrtf(70.0f / D3DX_PI) / 8.0f * dir->x * (dirxx - 3.0f * diryy);
if (order == 4)
out[20] = 3.0f / (16.0f * sqrtf(D3DX_PI)) * (35.0f * dirzzzz - 30.f * dirzz + 3.0f);
out[21] = 0.375f * sqrtf(10.0f / D3DX_PI) * dirxz * (3.0f - 7.0f * dirzz);
out[22] = 0.375f * sqrtf(5.0f / D3DX_PI) * (dirxx - diryy) * (7.0f * dirzz - 1.0f);
- out[23] = 3.0 * dir->z * out[15];
+ out[23] = 3.0f * dir->z * out[15];
out[24] = 3.0f / 16.0f * sqrtf(35.0f / D3DX_PI) * (dirxxxx - 6.0f * dirxyxy + diryyyy);
if (order == 5)
return out;
out[31] = sqrtf(165.0f / D3DX_PI) / 16.0f * dir->x * (14.0f * dirzz - 21.0f * dirzzzz - 1.0f);
out[32] = sqrtf(1155.0f / D3DX_PI) / 8.0f * dir->z * (dirxx - diryy) * (3.0f * dirzz - 1.0f);
out[33] = sqrtf(770.0f / D3DX_PI) / 32.0f * dir->x * (dirxx - 3.0f * diryy) * (1.0f - 9.0f * dirzz);
- out[34] = 3.0f / 16.0f * sqrtf(385.0f / D3DX_PI) * dir->z * (dirxxxx - 6.0 * dirxyxy + diryyyy);
+ out[34] = 3.0f / 16.0f * sqrtf(385.0f / D3DX_PI) * dir->z * (dirxxxx - 6.0f * dirxyxy + diryyyy);
out[35] = -3.0f/ 32.0f * sqrtf(154.0f / D3DX_PI) * dir->x * (dirxxxx - 10.0f * dirxyxy + 5.0f * diryyyy);
return out;
t = a[4] * b[5] + a[5] * b[4];
out[7] += 0.15607834f * t;
- ta = 0.28209479f * a[0] + 0.09011186 * a[6] - 0.15607835f * a[8];
- tb = 0.28209479f * b[0] + 0.09011186 * b[6] - 0.15607835f * b[8];
+ ta = 0.28209479f * a[0] + 0.09011186f * a[6] - 0.15607835f * a[8];
+ tb = 0.28209479f * b[0] + 0.09011186f * b[6] - 0.15607835f * b[8];
out[5] += ta * b[5] + tb * a[5];
t = a[5] * b[5];
out[0] += 0.28209479f * t;
out[0] += 0.28209480f * t;
out[6] += 0.18022376f * t;
- ta = 0.28209479f * a[0] + 0.09011186 * a[6] + 0.15607835f * a[8];
- tb = 0.28209479f * b[0] + 0.09011186 * b[6] + 0.15607835f * b[8];
+ ta = 0.28209479f * a[0] + 0.09011186f * a[6] + 0.15607835f * a[8];
+ tb = 0.28209479f * b[0] + 0.09011186f * b[6] + 0.15607835f * b[8];
out[7] += ta * b[7] + tb * a[7];
t = a[7] * b[7];
out[0] += 0.28209479f * t;
out[25] = a * 0.7015607357f * in[30] - a * 0.6846531630f * in[32] + a * 0.1976423711f * in[34];
out[26] = -0.5f * in[26] + 0.8660253882f * in[28];
- out[27] = a * 0.5229125023f * in[30] + a * 0.3061861992f * in[32] - a * 0.7954951525 * in[34];
+ out[27] = a * 0.5229125023f * in[30] + a * 0.3061861992f * in[32] - a * 0.7954951525f * in[34];
out[28] = 0.8660253882f * in[26] + 0.5f * in[28];
out[29] = a * 0.4841229022f * in[30] + a * 0.6614378691f * in[32] + a * 0.5728219748f * in[34];
out[30] = -a * 0.7015607357f * in[25] - a * 0.5229125023f * in[27] - a * 0.4841229022f * in[29];