図0014a
void CubeObjectGroup::OnUpdate() {
if (m_CubeObjectVec.size() >= m_MaxInstance) {
throw BaseException(
L"インスタンス上限を超えてます",
L"if(m_CubeObjectVec.size() >= m_MaxInstance)",
L"CubeObjectGroup::OnUpdate()"
);
}
float ElapsedTime = App::GetApp()->GetElapsedTime();
for (auto& v : m_CubeObjectVec) {
v.m_Posision += v.m_Velocity * ElapsedTime;
Quat QtSpan(v.m_QuaternionRot, v.m_QuaternionVelocity * ElapsedTime);
v.m_Quaternion *= QtSpan;
v.m_Quaternion.normalize();
if (v.m_Posision.length() >= 2.0f) {
v.Refresh();
}
}
//デバイスの取得
auto Dev = App::GetApp()->GetDeviceResources();
auto pDx11Device = Dev->GetD3DDevice();
auto pID3D11DeviceContext = Dev->GetD3DDeviceContext();
//インスタンスバッファにマップ
D3D11_MAP mapType = D3D11_MAP_WRITE_DISCARD;
D3D11_MAPPED_SUBRESOURCE mappedBuffer;
//行列のマップ
if (FAILED(pID3D11DeviceContext->Map(m_MatrixBuffer.Get(), 0, mapType, 0, &mappedBuffer))) {
// Map失敗
throw BaseException(
L"行列のMapに失敗しました。",
L"if(FAILED(pID3D11DeviceContext->Map()))",
L"CubeObjectGroup::OnUpdate()"
);
}
//行列の変更
auto* matrices = (Mat4x4*)mappedBuffer.pData;
Mat4x4 World;
for (size_t i = 0; i < m_CubeObjectVec.size(); i++) {
//ワールド行列の決定
World.affineTransformation(
m_CubeObjectVec[i].m_Scale, //スケーリング
Vec3(0, 0, 0), //回転の中心(重心)
m_CubeObjectVec[i].m_Quaternion, //回転角度
m_CubeObjectVec[i].m_Posision //位置
);
//転置する
World.transpose();
matrices[i] = World;
}
//アンマップ
pID3D11DeviceContext->Unmap(m_MatrixBuffer.Get(), 0);
}
void CubeObjectGroup::OnDraw() {
auto Dev = App::GetApp()->GetDeviceResources();
auto pD3D11DeviceContext = Dev->GetD3DDeviceContext();
auto RenderState = Dev->GetRenderState();
//ストライドとオフセット
//形状の頂点バッファと行列バッファを設定
UINT stride[2] = { sizeof(VertexPositionNormalTexture), sizeof(Mat4x4) };
UINT offset[2] = { 0, 0 };
ID3D11Buffer* pBuf[2] = { m_CubeMesh->GetVertexBuffer().Get(), m_MatrixBuffer.Get() };
pD3D11DeviceContext->IASetVertexBuffers(0, 2, pBuf, stride, offset);
//インデックスバッファのセット
pD3D11DeviceContext->IASetIndexBuffer(m_CubeMesh->GetIndexBuffer().Get(),
DXGI_FORMAT_R16_UINT, 0);
//描画方法(3角形)
pD3D11DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
//シェーダの設定
pD3D11DeviceContext->VSSetShader(VSPNTInstance::GetPtr()->GetShader(), nullptr, 0);
pD3D11DeviceContext->PSSetShader(PSPNTStatic::GetPtr()->GetShader(), nullptr, 0);
//インプットレイアウトの設定
pD3D11DeviceContext->IASetInputLayout(VSPNTInstance::GetPtr()->GetInputLayout());
//ブレンドステート
//透明処理しない
pD3D11DeviceContext->OMSetBlendState(RenderState->GetOpaque(), nullptr, 0xffffffff);
//デプスステンシルステート
pD3D11DeviceContext->OMSetDepthStencilState(RenderState->GetDepthDefault(), 0);
//テクスチャとサンプラーの設定
ID3D11ShaderResourceView* pNull[1] = { 0 };
pD3D11DeviceContext->PSSetShaderResources(0, 1,
m_TextureResource->GetShaderResourceView().GetAddressOf());
ID3D11SamplerState* pSampler = RenderState->GetLinearClamp();
pD3D11DeviceContext->PSSetSamplers(0, 1, &pSampler);
//ラスタライザステート(表面描画)
pD3D11DeviceContext->RSSetState(RenderState->GetCullBack());
//ビュー行列の決定
Mat4x4 View, Proj;
View = XMMatrixLookAtLH(Vec3(0, 2.0, -5.0f), Vec3(0, 0, 0), Vec3(0, 1.0f, 0));
//転置する
View.transpose();
//射影行列の決定
float w = static_cast<float>(App::GetApp()->GetGameWidth());
float h = static_cast<float>(App::GetApp()->GetGameHeight());
Proj = XMMatrixPerspectiveFovLH(XM_PIDIV4, w / h, 1.0f, 100.0f);
//転置する
Proj.transpose();
//コンスタントバッファの準備
PNTStaticConstantBuffer sb;
sb.World = Mat4x4(); //ワールド行列はダミー
sb.View = View;
sb.Projection = Proj;
//ライティング
Vec4 LightDir(0.5f, -1.0f, 0.5f, 0.0f);
LightDir.normalize();
sb.LightDir = LightDir;
//ディフューズ
sb.Diffuse = Col4(1.0f, 1.0f, 1.0f, 1.0f);
//エミッシブ加算。
sb.Emissive = Col4(0.4f, 0.4f, 0.4f, 0);
//コンスタントバッファの更新
pD3D11DeviceContext->UpdateSubresource(CBPNTStatic::GetPtr()->GetBuffer(),
0, nullptr, &sb, 0, 0);
//コンスタントバッファの設定
ID3D11Buffer* pConstantBuffer = CBPNTStatic::GetPtr()->GetBuffer();
ID3D11Buffer* pNullConstantBuffer = nullptr;
//頂点シェーダに渡す
pD3D11DeviceContext->VSSetConstantBuffers(0, 1, &pConstantBuffer);
//ピクセルシェーダに渡す
pD3D11DeviceContext->PSSetConstantBuffers(0, 1, &pConstantBuffer);
//描画
pD3D11DeviceContext->DrawIndexedInstanced(m_CubeMesh->GetNumIndicis(),
m_CubeObjectVec.size(), 0, 0, 0);
//後始末
Dev->InitializeStates();
}