3
0

SkinnedMeshShaderOptionsCache.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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/SkinnedMeshShaderOptionsCache.h>
  9. #include <Atom/RPI.Public/Shader/Shader.h>
  10. namespace AZ
  11. {
  12. namespace Render
  13. {
  14. void CachedSkinnedMeshShaderOptions::SetShader(Data::Instance<RPI::Shader> shader)
  15. {
  16. m_shader = shader;
  17. // Cache the different possible indices and values so they are efficent to set later
  18. const RPI::ShaderOptionGroupLayout* layout = m_shader->GetAsset()->GetShaderOptionGroupLayout();
  19. m_skinningMethodOptionIndex = layout->FindShaderOptionIndex(AZ::Name("o_skinningMethod"));
  20. m_skinningMethodLinearSkinningValue = layout->FindValue(m_skinningMethodOptionIndex, AZ::Name("SkinningMethod::LinearSkinning"));
  21. m_skinningMethodDualQuaternionValue = layout->FindValue(m_skinningMethodOptionIndex, AZ::Name("SkinningMethod::DualQuaternion"));
  22. m_applyMorphTargetOptionIndex = layout->FindShaderOptionIndex(AZ::Name("o_applyMorphTargets"));
  23. m_applyMorphTargetFalseValue = layout->FindValue(m_applyMorphTargetOptionIndex, AZ::Name("false"));
  24. m_applyMorphTargetTrueValue = layout->FindValue(m_applyMorphTargetOptionIndex, AZ::Name("true"));
  25. SkinnedMeshShaderOptionNotificationBus::Event(this, &SkinnedMeshShaderOptionNotificationBus::Events::OnShaderReinitialized, this);
  26. }
  27. void CachedSkinnedMeshShaderOptions::ConnectToShaderReinitializedEvent(SkinnedMeshShaderOptionNotificationBus::Handler& shaderReinitializedEventHandler)
  28. {
  29. shaderReinitializedEventHandler.BusConnect(this);
  30. }
  31. RPI::ShaderOptionGroup CachedSkinnedMeshShaderOptions::CreateShaderOptionGroup(const SkinnedMeshShaderOptions& shaderOptions) const
  32. {
  33. RPI::ShaderOptionGroup shaderOptionGroup = m_shader->CreateShaderOptionGroup();
  34. switch (shaderOptions.m_skinningMethod)
  35. {
  36. case SkinningMethod::DualQuaternion:
  37. shaderOptionGroup.SetValue(m_skinningMethodOptionIndex, m_skinningMethodDualQuaternionValue);
  38. break;
  39. case SkinningMethod::LinearSkinning:
  40. default:
  41. shaderOptionGroup.SetValue(m_skinningMethodOptionIndex, m_skinningMethodLinearSkinningValue);
  42. }
  43. if (shaderOptions.m_applyMorphTargets)
  44. {
  45. shaderOptionGroup.SetValue(m_applyMorphTargetOptionIndex, m_applyMorphTargetTrueValue);
  46. }
  47. else
  48. {
  49. shaderOptionGroup.SetValue(m_applyMorphTargetOptionIndex, m_applyMorphTargetFalseValue);
  50. }
  51. shaderOptionGroup.SetUnspecifiedToDefaultValues();
  52. return shaderOptionGroup;
  53. }
  54. } // namespace Render
  55. } // namespace AZ