static void RenderModelOpenGL(bool mirror, Vector4 *pPlane) { Matrix4x4 view_matrix; Matrix4x4 world_matrix = g_Control.GetObjectMatrix(); if ( mirror ) { Vector4 vEye = g_Control.GetCameraPosition(); Vector4 vUp = g_Control.m_vUp; Vector4 vLookAt = g_Control.m_vLookAt; Vector4 mirror_eye = MirrorPoint(vEye, *pPlane); Vector4 mirror_lookat = MirrorPoint(vLookAt, *pPlane); Vector4 mirror_up = MirrorPoint(vUp, *pPlane); view_matrix = GutMatrixLookAtRH(mirror_eye, mirror_lookat, mirror_up); g_mirror_view_matrix = view_matrix; } else { view_matrix = g_Control.GetViewMatrix(); } glMatrixMode(GL_MODELVIEW); Matrix4x4 world_view_matrix = world_matrix * view_matrix; glLoadMatrixf( (float *) &world_view_matrix); g_Model_OpenGL.Render(); }
void RenderModelDX10(bool mirror, Vector4 *pPlane) { ID3D10Device *pDevice = GutGetGraphicsDeviceDX10(); Matrix4x4 view_matrix; Matrix4x4 proj_matrix; Matrix4x4 world_matrix = g_Control.GetObjectMatrix(); if ( mirror ) { Vector4 vEye = g_Control.GetCameraPosition(); Vector4 vUp = g_Control.m_vUp; Vector4 vLookAt = g_Control.m_vLookAt; Vector4 mirror_eye = MirrorPoint(vEye, *pPlane); Vector4 mirror_lookat = MirrorPoint(vLookAt, *pPlane); Vector4 mirror_up = MirrorPoint(vUp, *pPlane); view_matrix = GutMatrixLookAtRH(mirror_eye, mirror_lookat, mirror_up); g_mirror_view_matrix = view_matrix; } else { view_matrix = g_Control.GetViewMatrix(); } // `CGutModel_DX10中有提供一些模擬Fixed Piepline的函式` CGutModel_DX10::SetProjectionMatrix(g_proj_matrix); CGutModel_DX10::SetViewMatrix(view_matrix); CGutModel_DX10::SetWorldMatrix(world_matrix); CGutModel_DX10::UpdateMatrix(); g_Model_DX10.Render(); }
static void RenderModelDX9(bool mirror, Vector4 *pPlane) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); Matrix4x4 view_matrix; Matrix4x4 world_matrix = g_Control.GetObjectMatrix(); if ( mirror ) { Vector4 vEye = g_Control.GetCameraPosition(); Vector4 vUp = g_Control.m_vUp; Vector4 vLookAt = g_Control.m_vLookAt; Vector4 mirror_eye = MirrorPoint(vEye, *pPlane); Vector4 mirror_lookat = MirrorPoint(vLookAt, *pPlane); Vector4 mirror_up = MirrorPoint(vUp, *pPlane); view_matrix = GutMatrixLookAtRH(mirror_eye, mirror_lookat, mirror_up); g_mirror_view_matrix = view_matrix; } else { view_matrix = g_Control.GetViewMatrix(); } device->SetTransform(D3DTS_VIEW, (D3DMATRIX *) &view_matrix); device->SetTransform(D3DTS_WORLD, (D3DMATRIX *) &world_matrix); g_Model_DX9.Render(); }
static void RenderModelDX9(bool mirror, Vector4 *pPlane) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); Matrix4x4 view_matrix; if ( mirror ) { Vector4 vEye = g_Control.GetCameraPosition(); Vector4 vLookAt = g_Control.m_vLookAt; Vector4 vUp = g_Control.m_vUp; Vector4 mirror_eye = MirrorPoint(vEye, *pPlane); Vector4 mirror_lookat = MirrorPoint(vLookAt, *pPlane); Vector4 mirror_up = MirrorVector(vUp, *pPlane); Matrix4x4 temp_matrix = GutMatrixLookAtRH(mirror_eye, mirror_lookat, mirror_up); // 因為是鏡射, 在轉換到鏡頭座標系後要做個左右對調的動作. Matrix4x4 mirror_x; mirror_x.Identity(); mirror_x.Scale(-1.0f, 1.0f, 1.0f); view_matrix = temp_matrix * mirror_x; // 右左對調後, 3角形的頂點排列順序會被反過來. GutSetDX9BackFace(D3DCULL_CCW); } else { view_matrix = g_Control.GetViewMatrix(); device->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); GutSetDX9BackFace(D3DCULL_CW); } Matrix4x4 world_matrix = g_Control.GetObjectMatrix(); device->SetTransform(D3DTS_VIEW, (D3DMATRIX *) &view_matrix); device->SetTransform(D3DTS_WORLD, (D3DMATRIX *) &world_matrix); g_Model_DX9.Render(); GutSetDX9BackFace(D3DCULL_CW); }
static void RenderModelOpenGL(bool mirror, Vector4 *pPlane) { Matrix4x4 view_matrix; if ( mirror ) { Vector4 vEye = g_Control.GetCameraPosition(); Vector4 vLookAt = g_Control.m_vLookAt; Vector4 vUp = g_Control.m_vUp; Vector4 mirror_eye = MirrorPoint(vEye, *pPlane); Vector4 mirror_lookat = MirrorPoint(vLookAt, *pPlane); Vector4 mirror_up = MirrorVector(vUp, *pPlane); Matrix4x4 temp_matrix = GutMatrixLookAtRH(mirror_eye, mirror_lookat, mirror_up); // 因為是鏡射, 在轉換到鏡頭座標系後要做個左右對調的動作. Matrix4x4 mirror_x; mirror_x.Identity(); mirror_x.Scale(-1.0f, 1.0f, 1.0f); view_matrix = temp_matrix * mirror_x; g_mirror_view_matrix = view_matrix; // 右左對調後, 3角形的頂點排列順序會被反過來. glFrontFace(GL_CW); } else { view_matrix = g_Control.GetViewMatrix(); glFrontFace(GL_CCW); } glMatrixMode(GL_MODELVIEW); Matrix4x4 world_view_matrix = g_Control.GetObjectMatrix() * view_matrix; glLoadMatrixf( (float *) &world_view_matrix); g_Model_OpenGL.Render(); glFrontFace(GL_CCW); }