2011/1/21 Michael Stefaniuc <mstef...@redhat.com>: > On 01/21/2011 06:56 AM, Travis Athougies wrote: >> On Thu, Jan 20, 2011 at 7:27 AM, Matteo Bruni<matteo.myst...@gmail.com> >> wrote: >>> >>> 2011/1/20 Travis Athougies<iamm...@gmail.com>: >>>> >>>> + /* D3DXMATRIX is a union, one of whose elements is an >>>> array, so it can be cast to a float pointer */ >>>> + if (is_vertex_shader(This->desc.Version)) >>>> + IDirect3DDevice9_SetVertexShaderConstantF(device, >>>> desc.RegisterIndex + i, (float *)(matrix + i), >>>> + desc.RegisterCount); >>>> + else >>>> + IDirect3DDevice9_SetPixelShaderConstantF(device, >>>> desc.RegisterIndex + i, (float *)(matrix + i), >>>> + desc.RegisterCount); >>> >>> Can't you just pass matrix->m[i] as parameter, instead of that cast? >>> >> >> Uh no. If I were to do that, matrix->m[1] would be the second row, not >> the second matrix. I'm trying to get at the second matrix. To >> illustrate this, suppose the matrix were at 0x8000 (not going to >> happen, but just pretend). matrix->m[1] would be at 0x8010, since >> floats are 4 bytes. However, the next matrix is actually at 0x8040 >> (since sizeof(float) * 16 [the number of elements in the matrix] = >> 64). > > So you want a pointer to the first element of the "i"th matrix, right? > &matrix[i]._11 > No cast, no explicit pointer arithmetic. >
Oh, right, I misread that (and Michael's suggestion is good). But then I would expect the register index to be incremented by desc.RegisterCount at each iteration. RegisterCount is supposedly 4, but what if it is not? This calls for some SetMatrixArray tests.