#include "MeshRenderer.h" #include void MeshRenderer::SyncMaterialSlots() { if (mesh == nullptr) { _materials.resize(0); } else { _materials.resize(mesh->GetSubmeshCount()); } } std::shared_ptr MeshRenderer::SetMesh(MeshPtr m) { mesh = m; SyncMaterialSlots(); UpdateInputLayouts(); return std::static_pointer_cast(shared_from_this()); } MeshPtr MeshRenderer::GetMesh() { return mesh; } void MeshRenderer::SetMaterial(MaterialPtr material, int id){ SyncMaterialSlots(); _materials[id] = material; UpdateInputLayouts(); } void MeshRenderer::UpdateInputLayouts(){ if (mesh == nullptr) { return; } if (_materials.size() == 0 || _materials[0] == nullptr) { return; } //D3D12_APPEND_ALIGNED_ELEMENT _inputElements.clear(); _inputElements.push_back({ "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }); _inputElements.push_back({ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 16, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }); _inputElements.push_back({ "UV", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 28, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }); _inputElements.push_back({ "UV", 1, DXGI_FORMAT_R32G32_FLOAT, 0, 36, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }); _inputLayoutDesc.NumElements = _inputElements.size(); _inputLayoutDesc.pInputElementDescs = &_inputElements[0]; //auto vs = _materials[0]->GetShader()->GetShader(ShaderType::Vs); //auto hr = mesh->GetDevice()->CreateInputLayout(ied, 4, vs->blob->GetBufferPointer(), vs->blob->GetBufferSize(), &_inputLayout); //assert(hr == S_OK); }