SkinnedMeshStatsCollector.cpp 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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 <SkinnedMesh/SkinnedMeshFeatureProcessor.h>
  9. #include <SkinnedMesh/SkinnedMeshStatsCollector.h>
  10. #include <Atom/RPI.Public/Scene.h>
  11. namespace AZ
  12. {
  13. namespace Render
  14. {
  15. SkinnedMeshStatsCollector::SkinnedMeshStatsCollector(SkinnedMeshFeatureProcessor* featureProcessor)
  16. : m_featureProcessor(featureProcessor)
  17. {
  18. AZ_Assert(m_featureProcessor, "Attempting to create a SkinnedMeshStatsCollector without an associated SkinnedMeshFeatureProcessor.");
  19. AZ_Assert(m_featureProcessor->GetParentScene(), "SkinnedMeshFeatureProcessor does not have a parent scene");
  20. SkinnedMeshStatsRequestBus::Handler::BusConnect(m_featureProcessor->GetParentScene()->GetId());
  21. }
  22. SkinnedMeshSceneStats SkinnedMeshStatsCollector::GetSceneStats()
  23. {
  24. m_sceneStats.skinnedMeshRenderProxyCount = m_featureProcessor->m_renderProxies.size();
  25. for (const SkinnedMeshRenderProxy& renderProxy : m_featureProcessor->m_renderProxies)
  26. {
  27. for (uint32_t lodIndex = 0; lodIndex < renderProxy.GetLodCount(); ++lodIndex)
  28. {
  29. for (const AZStd::unique_ptr<SkinnedMeshDispatchItem>& dispatchItem : renderProxy.GetDispatchItems(lodIndex))
  30. {
  31. AddDispatchItemToSceneStats(dispatchItem);
  32. }
  33. }
  34. }
  35. // Clear all the stats collection before returning the results so we are not
  36. // unnecessarily holding onto any references to resources
  37. SkinnedMeshSceneStats results = m_sceneStats;
  38. ResetAllStats();
  39. return results;
  40. }
  41. void SkinnedMeshStatsCollector::ResetAllStats()
  42. {
  43. m_sceneStats = SkinnedMeshSceneStats();
  44. m_sceneBoneTransforms.clear();
  45. }
  46. void SkinnedMeshStatsCollector::AddDispatchItemToSceneStats(const AZStd::unique_ptr<SkinnedMeshDispatchItem>& dispatchItem)
  47. {
  48. m_sceneStats.dispatchItemCount++;
  49. AddBonesToSceneStats(dispatchItem->GetBoneTransforms());
  50. AddVerticesToSceneStats(aznumeric_cast<size_t>(dispatchItem->GetVertexCount()));
  51. }
  52. void SkinnedMeshStatsCollector::AddBonesToSceneStats(const Data::Instance<RPI::Buffer>& boneTransformBuffer)
  53. {
  54. // Oftentimes, different lods and sub-meshes of the same model share the same bone transforms. Use a set to ensure we're not duplicating bone count
  55. const auto& iter = m_sceneBoneTransforms.find(boneTransformBuffer.get());
  56. if (iter == m_sceneBoneTransforms.end())
  57. {
  58. m_sceneBoneTransforms.insert(boneTransformBuffer.get());
  59. if (boneTransformBuffer && boneTransformBuffer->GetBufferView())
  60. {
  61. m_sceneStats.boneCount += aznumeric_cast<size_t>(boneTransformBuffer->GetBufferView()->GetDescriptor().m_elementCount);
  62. }
  63. }
  64. }
  65. void SkinnedMeshStatsCollector::AddVerticesToSceneStats(size_t vertexCount)
  66. {
  67. // This counts the number of skinned vertices
  68. m_sceneStats.vertexCount += vertexCount;
  69. }
  70. } // namespace Render
  71. } // namespace AZ