I somehow screwed up and I can't find out what. At the moment the project is supposed to render a simple indexed cube and rotate it around an arbitrary axis.
All I know is that, the camera and cube position is unchanged and (should) render.
I need all the help I can get. Thanks in advance!
Here's the camera class
class Camera
{
private:
D3DXVECTOR3 m_vRight;
D3DXVECTOR3 m_vUp;
D3DXVECTOR3 m_vLook;
D3DXVECTOR3 m_vPos;
D3DXMATRIX m_matProj;
D3DXMATRIX m_matView;
D3DXMATRIX m_matRotate;
public:
Camera();
~Camera();
void Transform();
}
Camera::Camera()
{
m_vRight = D3DXVECTOR3(1.0f, 0.0f, 0.0f);
m_vUp = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
m_vLook = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
m_vPos = D3DXVECTOR3(0.0f, 0.0f, 20.0f);
}
void Camera::Transform()
{
D3DXMATRIX matResult;
// Projection matrix
D3DXMatrixIdentity(&matResult);
D3DXMatrixPerspectiveFovLH(&m_matProj,
D3DX_PI / 4, 800 / 600, 1.0f, 2000.0f);
matResult *= m_matProj;
engine->GetDeviceHandle()->SetTransform(D3DTS_PROJECTION, &matResult);
// View matrix
D3DXMatrixIdentity(&matResult);
D3DXMatrixLookAtLH(&m_matView, &m_vPos, &m_vLook, &m_vUp);
matResult *= m_matView;
engine->GetDeviceHandle()->SetTransform(D3DTS_VIEW, &matResult);
}
Camera::~Camera()
{
//
}
Here's the mesh class
class Mesh
{
private:
LPD3DXMESH m_lpMesh;
LPDIRECT3DVERTEXBUFFER9 m_lpVertexBuffer;
LPDIRECT3DINDEXBUFFER9 m_lpIndexBuffer;
D3DXMATRIX m_matWorld;
public:
Mesh();
~Mesh();
void Draw();
void Transform(D3DXVECTOR3 vRotation, float fTheta);
void CreateBox();
};
void Mesh::Draw()
{
engine->GetDeviceHandle()->SetStreamSource(0, m_lpVertexBuffer, 0, sizeof(VERTEX));
engine->GetDeviceHandle()->SetIndices(m_lpIndexBuffer);
engine->GetDeviceHandle()->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE);
engine->GetDeviceHandle()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12);// 8 vertices, 12 triangles
}
void Mesh::Transform(D3DXVECTOR3 vRotation, float fTheta)
{
D3DXMatrixIdentity(&m_matWorld);
D3DXMATRIX matTranslate;
D3DXMatrixIdentity(&matTranslate);
D3DXMatrixTranslation(&matTranslate, 0.0f, 0.0f, 0.0f);
D3DXMATRIX matScale;
D3DXMatrixIdentity(&matScale);
D3DXMatrixScaling(&matScale, 1.0f, 1.0f, 1.0f);
D3DXMATRIX matRotate;
D3DXMatrixIdentity(&matRotate);
// Rotate on an arbitrary axis
if(vRotation.x != 0.0f || vRotation.y != 0.0f || vRotation.z != 0.0f)
{
float vUnit = sqrtf((vRotation.x * vRotation.x) + (vRotation.y * vRotation.y) + (vRotation.z * vRotation.z));
vRotation.x /= vUnit;
vRotation.y /= vUnit;
vRotation.z /= vUnit;
matRotate._11 = (vRotation.x * vRotation.x) * (1.0f - cos(fTheta)) + cos(fTheta);
matRotate._12 = (vRotation.x * vRotation.y) * (1.0f - cos(fTheta)) - (vRotation.z * sin(fTheta));
matRotate._13 = (vRotation.x * vRotation.z) * (1.0f - cos(fTheta)) + (vRotation.y * sin(fTheta));
matRotate._14 = 0.0f;
matRotate._21 = (vRotation.y * vRotation.x) * (1.0f - cos(fTheta)) + (vRotation.z * sin(fTheta));
matRotate._22 = (vRotation.y * vRotation.y) * (1.0f - cos(fTheta)) + cos(fTheta);
matRotate._23 = (vRotation.y * vRotation.z) * (1.0f - cos(fTheta)) - (vRotation.x * sin(fTheta));
matRotate._24 = 0.0f;
matRotate._31 = (vRotation.z * vRotation.x) * (1.0f - cos(fTheta)) - (vRotation.y * sin(fTheta));
matRotate._32 = (vRotation.z * vRotation.y) * (1.0f - cos(fTheta)) + (vRotation.x * sin(fTheta));
matRotate._33 = (vRotation.z * vRotation.z) * (1.0f - cos(fTheta)) + cos(fTheta);
matRotate._34 = 0.0f;
matRotate._41 = 0.0f;
matRotate._42 = 0.0f;
matRotate._43 = 0.0f;
matRotate._44 = 1.0f;
}
m_matWorld = m_matWorld * matTranslate * matScale * matRotate;
engine->GetDeviceHandle()->SetTransform(D3DTS_WORLD, &m_matWorld);
engine->GetDeviceHandle()->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); // Temp
engine->GetDeviceHandle()->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); // Temp
}
void Mesh::CreateBox()
{
// =====================================================================
// Vertex buffer
// =====================================================================
engine->GetDeviceHandle()->CreateVertexBuffer(sizeof(VERTEX) * 8,
0,
D3DFVF_XYZ | D3DFVF_DIFFUSE,
D3DPOOL_DEFAULT,
&m_lpVertexBuffer,
NULL);
VERTEX *vertices;
m_lpVertexBuffer->Lock(0, sizeof(VERTEX) * 8, (void**)&vertices, 0);
// Closest, top, left
vertices[0].x = -2.0f;
vertices[0].y = -2.0f;
vertices[0].z = 2.0f;
vertices[0].color = 0xFFFFFFFF;
// Closest, top, right
vertices[1].x = 2.0f;
vertices[1].y = -2.0f;
vertices[1].z = 2.0f;
vertices[1].color = 0xFFFFFFFF;
// Closest, bottom, left
vertices[2].x = -2.0f;
vertices[2].y = 2.0f;
vertices[2].z = 2.0f;
vertices[2].color = 0xFFFFFFFF;
// Closest, bottom, right
vertices[3].x = 2.0f;
vertices[3].y = 2.0f;
vertices[3].z = 2.0f;
vertices[3].color = 0xFFFFFFFF;
// Furthest, top, left
vertices[4].x = -2.0f;
vertices[4].y = -2.0f;
vertices[4].z = -2.0f;
vertices[4].color = 0xFFFFFFFF;
// Furthest, top, right
vertices[5].x = 2.0f;
vertices[5].y = -2.0f;
vertices[5].z = -2.0f;
vertices[5].color = 0xFFFFFFFF;
// Furthest, bottom, left
vertices[6].x = -2.0f;
vertices[6].y = 2.0f;
vertices[6].z = -2.0f;
vertices[6].color = 0xFFFFFFFF;
// Furthest, bottom, right
vertices[7].x = 2.0f;
vertices[7].y = 2.0f;
vertices[7].z = -2.0f;
vertices[7].color = 0xFFFFFFFF;
m_lpVertexBuffer->Unlock();
// =====================================================================
// Index buffer
// =====================================================================
engine->GetDeviceHandle()->CreateIndexBuffer(36 * sizeof(WORD),
D3DUSAGE_WRITEONLY,
D3DFMT_INDEX16,
D3DPOOL_MANAGED,
&m_lpIndexBuffer,
0);
WORD *indices;
m_lpIndexBuffer->Lock(0, 36 * sizeof(WORD), (void**)&indices, 0);
// Front
indices[0] = 0; indices[1] = 1; indices[2] = 2;
indices[3] = 1; indices[4] = 3; indices[5] = 2;
// Back
indices[6] = 4; indices[7] = 6; indices[8] = 5;
indices[9] = 6; indices[10] = 7; indices[11] = 5;
// Left
indices[12] = 4; indices[13] = 0; indices[14] = 6;
indices[15] = 2; indices[16] = 6; indices[17] = 0;
// Right
indices[18] = 1; indices[19] = 5; indices[20] = 3;
indices[21] = 7; indices[22] = 3; indices[23] = 5;
// Top
indices[24] = 4; indices[25] = 5; indices[26] = 0;
indices[27] = 1; indices[28] = 0; indices[29] = 5;
// Bottom
indices[30] = 2; indices[31] = 3; indices[32] = 6;
indices[33] = 7; indices[34] = 6; indices[35] = 3;
m_lpIndexBuffer->Unlock();
}
Mesh::~Mesh()
{
//
}