3
0

MorphTargetInputBuffers.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <Atom/Feature/SkinnedMesh/SkinnedMeshInputBuffers.h>
  9. #include <SkinnedMesh/SkinnedMeshOutputStreamManager.h>
  10. #include <Atom/RPI.Reflect/ResourcePoolAssetCreator.h>
  11. #include <Atom/RPI.Reflect/Buffer/BufferAssetCreator.h>
  12. #include <Atom/RPI.Reflect/Model/ModelAssetCreator.h>
  13. #include <Atom/RPI.Reflect/Model/ModelLodAssetCreator.h>
  14. #include <Atom/RPI.Public/Shader/ShaderResourceGroup.h>
  15. #include <Atom/RPI.Public/Model/Model.h>
  16. #include <Atom/RHI/Factory.h>
  17. #include <AzCore/std/algorithm.h>
  18. #include <AzCore/Math/PackedVector3.h>
  19. namespace AZ
  20. {
  21. namespace Render
  22. {
  23. MorphTargetInputBuffers::MorphTargetInputBuffers(const RPI::BufferAssetView& bufferAssetView, const AZStd::string& bufferNamePrefix)
  24. {
  25. m_vertexDeltaBuffer = RPI::Buffer::FindOrCreate(bufferAssetView.GetBufferAsset());
  26. if (m_vertexDeltaBuffer)
  27. {
  28. AZ::RHI::Ptr<AZ::RHI::BufferView> bufferView = RHI::Factory::Get().CreateBufferView();
  29. {
  30. bufferView->SetName(Name(bufferNamePrefix + "MorphTargetVertexDeltaView"));
  31. [[maybe_unused]] RHI::ResultCode resultCode = bufferView->Init(*m_vertexDeltaBuffer->GetRHIBuffer(), bufferAssetView.GetBufferViewDescriptor());
  32. AZ_Error("MorphTargetInputBuffers", resultCode == RHI::ResultCode::Success, "Failed to initialize buffer view for morph target.");
  33. }
  34. m_vertexDeltaBufferView = bufferView;
  35. }
  36. }
  37. void MorphTargetInputBuffers::SetBufferViewsOnShaderResourceGroup(const Data::Instance<RPI::ShaderResourceGroup>& perInstanceSRG)
  38. {
  39. // Set the delta buffer
  40. RHI::ShaderInputBufferIndex srgIndex = perInstanceSRG->FindShaderInputBufferIndex(Name{ "m_vertexDeltas" });
  41. AZ_Error("MorphTargetInputBuffers", srgIndex.IsValid(), "Failed to find shader input index for 'm_positionDeltas' in the skinning compute shader per-instance SRG.");
  42. [[maybe_unused]] bool success = perInstanceSRG->SetBufferView(srgIndex, m_vertexDeltaBufferView.get());
  43. AZ_Error("MorphTargetInputBuffers", success, "Failed to bind buffer view for vertex deltas");
  44. }
  45. } // namespace Render
  46. }// namespace AZ