Marcus Meissner wrote:
Hi,
I was just fixing this code, but I wonder why floorf(s0->w) is overwritten right next with tmp_f = powf(2.0f, s0->w);
What is the right version?
Ciao, Marcus
void vshader_expp(D3DSHADERVECTOR* d, D3DSHADERVECTOR* s0) { float tmp_f = floorf(s0->w); DWORD tmp_d = 0; tmp_f = powf(2.0f, s0->w); tmp_d = *((DWORD*) &tmp_f) & 0xFFFFFF00;
Hi Marcus,
There is a bug in this function. The proper fix is attached.
Bye, Christian
Index: shader.c =================================================================== RCS file: /home/wine/wine/dlls/d3d8/shader.c,v retrieving revision 1.23 diff -u -r1.23 shader.c --- shader.c 23 Apr 2004 21:28:02 -0000 1.23 +++ shader.c 25 Apr 2004 10:30:16 -0000 @@ -126,12 +126,12 @@
void vshader_expp(D3DSHADERVECTOR* d, D3DSHADERVECTOR* s0) { float tmp_f = floorf(s0->w); - DWORD tmp_d = 0; - tmp_f = powf(2.0f, s0->w); - tmp_d = *((DWORD*) &tmp_f) & 0xFFFFFF00; + DWORD tmp_d;
d->x = powf(2.0f, tmp_f); d->y = s0->w - tmp_f; + tmp_f = powf(2.0f, s0->w); + tmp_d = *((DWORD*) &tmp_f) & 0xFFFFFF00; d->z = *((float*) &tmp_d); d->w = 1.0f; VSTRACE(("executing exp: s0=(%f, %f, %f, %f) => d=(%f, %f, %f, %f)\n",