2011/1/20 Travis Athougies iammisc@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).
Travis.
On Thu, Jan 20, 2011 at 7:27 AM, Matteo Bruni matteo.mystral@gmail.com wrote:
2011/1/20 Travis Athougies iammisc@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?
On 01/21/2011 06:56 AM, Travis Athougies wrote:
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.
On Thu, Jan 20, 2011 at 7:27 AM, Matteo Brunimatteo.mystral@gmail.com wrote:
2011/1/20 Travis Athougiesiammisc@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?
bye michael
2011/1/21 Michael Stefaniuc mstefani@redhat.com:
On 01/21/2011 06:56 AM, Travis Athougies wrote:
On Thu, Jan 20, 2011 at 7:27 AM, Matteo Brunimatteo.mystral@gmail.com wrote:
2011/1/20 Travis Athougiesiammisc@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.
matrix + i will advance by the size of 1 D3DXMATRIX, since matrix is a pointer to a D3DXMATRIX. Michael is right, I thought the code was clearer with the pointer arithmetic, but I now see more people are familiar with the array indexing style.
Travis.
On Fri, Jan 21, 2011 at 8:47 AM, Matteo Bruni matteo.mystral@gmail.com wrote:
2011/1/21 Michael Stefaniuc mstefani@redhat.com:
On 01/21/2011 06:56 AM, Travis Athougies wrote:
On Thu, Jan 20, 2011 at 7:27 AM, Matteo Brunimatteo.mystral@gmail.com wrote:
2011/1/20 Travis Athougiesiammisc@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.
Oh I'm sorry. I now see what you mean, you were talking about the register index parameter to Set*ShaderConstantF? Yes, that should be changed. I will submit updated patches shortly.
Travis.
On Fri, Jan 21, 2011 at 3:22 PM, Travis Athougies iammisc@gmail.com wrote:
matrix + i will advance by the size of 1 D3DXMATRIX, since matrix is a pointer to a D3DXMATRIX. Michael is right, I thought the code was clearer with the pointer arithmetic, but I now see more people are familiar with the array indexing style.
Travis.
On Fri, Jan 21, 2011 at 8:47 AM, Matteo Bruni matteo.mystral@gmail.com wrote:
2011/1/21 Michael Stefaniuc mstefani@redhat.com:
On 01/21/2011 06:56 AM, Travis Athougies wrote:
On Thu, Jan 20, 2011 at 7:27 AM, Matteo Brunimatteo.mystral@gmail.com wrote:
2011/1/20 Travis Athougiesiammisc@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.
-- Travis Athougies
On 01/22/2011 12:22 AM, Travis Athougies wrote:
matrix + i will advance by the size of 1 D3DXMATRIX, since matrix is a pointer to a D3DXMATRIX. Michael is right, I thought the code was clearer with the pointer arithmetic, but I now see more people are familiar with the array indexing style.
Actually the pointer cast draw my attention. Pointer casts are bad. Bad and evil. They serve to make the compiler stfu and for the code reader they are a big WARNING comment "There might be dragons!". And there was a dragon: the cast of a struct pointer to a pointer to its first field. The pointer arithmetic to array conversion I have seen only after you explained it that way to Matteo.
bye michael
On Fri, Jan 21, 2011 at 8:47 AM, Matteo Brunimatteo.mystral@gmail.com wrote:
2011/1/21 Michael Stefaniucmstefani@redhat.com:
On 01/21/2011 06:56 AM, Travis Athougies wrote:
On Thu, Jan 20, 2011 at 7:27 AM, Matteo Brunimatteo.mystral@gmail.com wrote:
2011/1/20 Travis Athougiesiammisc@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.