Okay this is a hard question. I'm creating a cube and a pyramid in one vertex array. My problem is to rotate only pyramid vertex not the cube vertex but I don't know any function that can rotate some vertex. If I try to rotate the vertex I'll get pyramid and cube rotated.
First thought - ensure the vertices for the pyramid and cube occupy separate non-overlapping ranges in the array. When rotating the pyramid vertices, only tell DirectX about that range of the array (use the base pointer and size of the range rather than the full array).
Will now check the DirectX APIs...
EDIT
Confirmed. The key function is...
D3DXVECTOR4 * D3DXVec4TransformArray(D3DXVECTOR4 * pOut,
UINT OutStride,
CONST D3DXVECTOR4* pV,
UINT VStride,
CONST D3DXMATRIX* pM,
UINT n
);
In C++, a subrange of an array is in many ways an array in its own right, or more to the point, it's mostly just a block of memory with no indication within itself of where its bounds are. So you just pass in a different pV
and a different n
to indicate the subrange you want to apply the transform to, and as far as the function is concerned, that is the whole array. You'll probably need to copy the untransformed part separately - a job for memcpy, I expect.
The stride values are normally just the size of a vector plus any alignment padding, but it's possible to "lie" about this too, and transform e.g. every third vector in the array.
Either
- put the cube and the pyramid in different vertex arrays and use different transforms to render each array
or
- apply the rotations in a vertex shader, and pass in some auxiliary per-vertex info which lets the vertex shader decide whether each vertex should be treated as part of the cube or the pyramid (ie apply different transforms in each case). This'd be a bit like using a "blend weight" to do "vertex blending"; except you're only interested in the binary case.