IZ_BOOL CBillboard::Render( izanagi::graph::CGraphicsDevice* device, izanagi::sample::CSampleCamera& camera) { izanagi::math::SMatrix44 mtx; izanagi::math::SMatrix44::SetUnit(mtx); // 軸と並行になる向きにする izanagi::math::SMatrix44::GetRotByX(mtx, IZ_DEG2RAD(-90.0f)); // カメラに正対するようにする izanagi::math::SMatrix44 inv; { izanagi::math::SMatrix44::Copy(inv, camera.GetParam().mtxW2V); // 移動成分は消す inv.m[3][0] = inv.m[3][1] = inv.m[3][2] = 0.0f; // 逆行列にすることで、カメラのW2Vマトリクスと打ち消しあうようにする izanagi::math::SMatrix44::Inverse(inv, inv); } izanagi::math::SMatrix44::Mul(mtx, mtx, inv); m_Shader->Begin(device, 0, IZ_FALSE); { if (m_Shader->BeginPass(0)) { _SetShaderParam( m_Shader, "g_mL2W", (void*)&mtx, sizeof(mtx)); _SetShaderParam( m_Shader, "g_mW2C", (void*)&camera.GetParam().mtxW2C, sizeof(camera.GetParam().mtxW2C)); // シェーダ設定 m_Shader->CommitChanges(device); m_Rect->Draw(device); } } m_Shader->End(device); return IZ_TRUE; }
IZ_BOOL CBillboardYAxis::Render( izanagi::graph::CGraphicsDevice* device, izanagi::sample::CSampleCamera& camera) { izanagi::math::SMatrix44 mtx; izanagi::math::SMatrix44::SetUnit(mtx); izanagi::math::SMatrix44::RotByX(mtx, mtx, IZ_DEG2RAD(-90.0f)); izanagi::math::SVector4 dir = camera.GetDir(); if (dir.x == 0.0f) { } else { IZ_FLOAT deg = IZ_RAD2DEG(::atan2(dir.z, dir.x)); izanagi::math::SMatrix44::RotByY(mtx, mtx, -1.0f * IZ_DEG2RAD(deg) + IZ_MATH_PI1_2); } m_Shader->Begin(device, 0, IZ_FALSE); { if (m_Shader->BeginPass(0)) { _SetShaderParam( m_Shader, "g_mL2W", (void*)&mtx, sizeof(mtx)); _SetShaderParam( m_Shader, "g_mW2C", (void*)&camera.GetParam().mtxW2C, sizeof(camera.GetParam().mtxW2C)); // シェーダ設定 m_Shader->CommitChanges(device); m_Rect->Draw(device); } } m_Shader->End(device); return IZ_TRUE; }