浏览代码

Merge branch 'master' of https://github.com/Unity-Technologies/ScriptableRenderPipeline into mainline

/feature-ReflectionProbeFit
Evgenii Golubev 7 年前
当前提交
1f5d453d
共有 105 个文件被更改,包括 3819 次插入3178 次删除
  1. 999
      ImageTemplates/HDRenderPipeline/Scenes/1xxx_Materials/1202_Lit_DoubleSideNormalMode.unity.png
  2. 8
      SampleScenes/HDTest/AnimTest/Cube.mat
  3. 8
      SampleScenes/HDTest/AnimTest/Sphere.mat
  4. 721
      SampleScenes/HDTest/HDRenderLoopTest/ReflectionProbe-0.exr
  5. 60
      ScriptableRenderPipeline/Core/CoreRP/Editor/CoreEditorUtils.cs
  6. 13
      ScriptableRenderPipeline/Core/CoreRP/Editor/Volume/VolumeComponentEditor.cs
  7. 11
      ScriptableRenderPipeline/Core/CoreRP/ShaderLibrary/API/D3D11.hlsl
  8. 11
      ScriptableRenderPipeline/Core/CoreRP/ShaderLibrary/API/PSSL.hlsl
  9. 11
      ScriptableRenderPipeline/Core/CoreRP/ShaderLibrary/API/Vulkan.hlsl
  10. 11
      ScriptableRenderPipeline/Core/CoreRP/ShaderLibrary/API/XBoxOne.hlsl
  11. 18
      ScriptableRenderPipeline/Core/CoreRP/ShaderLibrary/Common.hlsl
  12. 17
      ScriptableRenderPipeline/Core/CoreRP/ShaderLibrary/GeometricTools.hlsl
  13. 2
      ScriptableRenderPipeline/Core/CoreRP/Shadow/Shadow.cs
  14. 3
      ScriptableRenderPipeline/Core/CoreRP/Volume/VolumeManager.cs
  15. 18
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Camera/HDAdditionalCameraData.cs
  16. 29
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Camera/HDCamera.cs
  17. 15
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/HDAssetFactory.cs
  18. 4
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/HDEditorUtils.cs
  19. 4
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/HDRenderPipelineInspector.Styles.cs
  20. 26
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/HDRenderPipelineInspector.cs
  21. 2
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/HDRenderPipelineMenuItems.cs
  22. 31
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Lighting/HDReflectionProbeEditor.Data.cs
  23. 128
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Lighting/HDReflectionProbeEditor.Drawers.cs
  24. 464
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Lighting/HDReflectionProbeEditor.Handles.cs
  25. 7
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Lighting/HDReflectionProbeEditor.ProbeUtility.cs
  26. 103
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Lighting/HDReflectionProbeEditor.cs
  27. 11
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Material/Lit/BaseLitUI.cs
  28. 5
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Material/Lit/LitUI.cs
  29. 20
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Material/Unlit/BaseUnlitUI.cs
  30. 3
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Sky/SkySettingsEditor.cs
  31. 2
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/HDCustomSamplerId.cs
  32. 41
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/HDRenderPipeline.cs
  33. 78
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/HDRenderPipelineAsset.asset
  34. 22
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/HDRenderPipelineAsset.cs
  35. 9
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/HDStringConstants.cs
  36. 15
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Lighting/HDAdditionalReflectionData.cs
  37. 23
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Lighting/LightDefinition.cs
  38. 78
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Lighting/LightDefinition.cs.hlsl
  39. 2
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Lighting/LightLoop/GlobalLightLoopSettings.cs
  40. 686
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Lighting/LightLoop/LightLoop.cs
  41. 25
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Lighting/LightUtilities.hlsl
  42. 5
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Material/LayeredLit/LayeredLit.shader
  43. 7
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Material/LayeredLit/LayeredLitTessellation.shader
  44. 108
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Material/Lit/Lit.hlsl
  45. 10
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Material/Lit/Lit.shader
  46. 19
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Material/Lit/LitDataMeshModification.hlsl
  47. 12
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Material/Lit/LitTessellation.shader
  48. 92
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Material/Unlit/Unlit.shader
  49. 18
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/RenderPipeline/FrameSettings.cs
  50. 16
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/RenderPipelineResources/DepthDownsample.compute
  51. 3
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/RenderPipelineResources/HDRenderPipelineResources.asset
  52. 4
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/RenderPipelineResources/RenderPipelineResources.cs
  53. 5
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/ShaderPass/VaryingMesh.hlsl
  54. 1
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/ShaderVariables.hlsl
  55. 16
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/AtmosphericScattering/AtmosphericScattering.cs
  56. 4
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/AtmosphericScattering/AtmosphericScattering.cs.hlsl
  57. 4
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/HDRISky/HDRISky.cs
  58. 4
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/ProceduralSky/ProceduralSky.cs
  59. 189
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/SkyManager.cs
  60. 134
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/SkyRenderingContext.cs
  61. 27
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/SkySettings.cs
  62. 26
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/VisualEnvironment.cs
  63. 10
      TestbedPipelines/OnTileDeferredPipeline/Shaders/UnityStandardForwardMobile.cginc
  64. 536
      Tests/GraphicsTests/RenderPipeline/HDRenderPipeline/Scenes/1xxx_Materials/1202_Lit_DoubleSideNormalMode.unity
  65. 880
      Tests/GraphicsTests/RenderPipeline/HDRenderPipeline/Scenes/1xxx_Materials/1205_Lit_Transparent_Refraction.unity
  66. 854
      Tests/GraphicsTests/RenderPipeline/HDRenderPipeline/Scenes/1xxx_Materials/1206_Lit_Transparent_Distortion.unity
  67. 3
      ScriptableRenderPipeline/LightweightPipeline/LWRP/Data/LightweightPipelineAsset.cs
  68. 5
      ScriptableRenderPipeline/LightweightPipeline/LWRP/Editor/ShaderGUI.meta
  69. 4
      ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightPipeline.cs
  70. 2
      ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/LightweightShaderLibrary.meta
  71. 65
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Sky/VisualEnvironmentEditor.cs
  72. 11
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Sky/VisualEnvironmentEditor.cs.meta
  73. 58
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/SkyUpdateContext.cs
  74. 11
      ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/SkyUpdateContext.cs.meta
  75. 8
      ScriptableRenderPipeline/LightweightPipeline/LWRP.meta
  76. 8
      ScriptableRenderPipeline/LightweightPipeline/LWRP/Data.meta
  77. 8
      ScriptableRenderPipeline/LightweightPipeline/LWRP/Editor.meta
  78. 8
      ScriptableRenderPipeline/LightweightPipeline/LWRP/Materials.meta
  79. 8
      ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders.meta
  80. 16
      ScriptableRenderPipeline/LightweightPipeline/LWRP/Editor/LightweightShaderIncludePaths.cs
  81. 11
      ScriptableRenderPipeline/LightweightPipeline/LWRP/Editor/LightweightShaderIncludePaths.cs.meta
  82. 9
      ScriptableRenderPipeline/LightweightPipeline/Editor.meta
  83. 9
      ScriptableRenderPipeline/LightweightPipeline/Shaders.meta
  84. 9
      ScriptableRenderPipeline/LightweightPipeline/Materials.meta
  85. 8
      ScriptableRenderPipeline/LightweightPipeline/Data.meta
  86. 8
      Tests/GraphicsTests/RenderPipeline/LightweightPipeline/Scenes/030_Shader_RenderOrder.meta
  87. 0
      /ScriptableRenderPipeline/Core/CoreRP/com.unity.render-pipelines.core.Runtime.asmdef
  88. 0
      /ScriptableRenderPipeline/Core/CoreRP/com.unity.render-pipelines.core.Runtime.asmdef.meta
  89. 0
      /ScriptableRenderPipeline/HDRenderPipeline/HDRP/com.unity.render-pipelines.high-definition.Runtime.asmdef.meta
  90. 0
      /ScriptableRenderPipeline/HDRenderPipeline/HDRP/com.unity.render-pipelines.high-definition.Runtime.asmdef
  91. 0
      /ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightPipeline.cs.meta
  92. 0
      /ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightPipelineUtils.cs.meta
  93. 0
      /ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightConstantBuffer.cs.meta
  94. 0
      /ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightConstantBuffer.cs
  95. 0
      /ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightPipelineUtils.cs
  96. 0
      /ScriptableRenderPipeline/LightweightPipeline/LWRP/Materials
  97. 0
      /ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightShaderUtils.cs
  98. 0
      /ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightShaderUtils.cs.meta
  99. 0
      /ScriptableRenderPipeline/LightweightPipeline/LWRP/com.unity.render-pipelines.lightweight.Runtime.asmdef

999
ImageTemplates/HDRenderPipeline/Scenes/1xxx_Materials/1202_Lit_DoubleSideNormalMode.unity.png
文件差异内容过多而无法显示
查看文件

8
SampleScenes/HDTest/AnimTest/Cube.mat


m_PrefabInternal: {fileID: 0}
m_Name: Cube
m_Shader: {fileID: 4800000, guid: 6e4ae4064600d784cac1e41a9e6f2e59, type: 3}
m_ShaderKeywords: _ALBEDOAFFECTEMISSIVE_OFF _ALPHACUTOFFENABLE_OFF _BLENDMODE_PRESERVE_SPECULAR_LIGHTING
_DEPTHOFFSETENABLE_OFF _DISTORTIONENABLE_OFF _DOUBLESIDEDENABLE_OFF _EMISSION
_ENABLEMOTIONVECTORFORVERTEXANIMATION_OFF _ENABLESPECULAROCCLUSION_OFF _ENABLEWIND_OFF
_NORMALMAP_TANGENT_SPACE _PREREFRACTIONPASS_OFF _TRANSPARENTBACKFACEENABLE_OFF
_TRANSPARENTDEPTHPOSTPASSENABLE_OFF _TRANSPARENTDEPTHPREPASSENABLE_OFF
m_ShaderKeywords: _BLENDMODE_PRESERVE_SPECULAR_LIGHTING _NORMALMAP_TANGENT_SPACE
m_LightmapFlags: 1
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0

- DistortionVectors
- TransparentDepthPrepass
- TransparentDepthPostPass
- TransparentDepthPostpass
- TransparentBackface
- TransparentBackfaceDebugDisplay
- MOTIONVECTORS

8
SampleScenes/HDTest/AnimTest/Sphere.mat


m_PrefabInternal: {fileID: 0}
m_Name: Sphere
m_Shader: {fileID: 4800000, guid: 6e4ae4064600d784cac1e41a9e6f2e59, type: 3}
m_ShaderKeywords: _ALBEDOAFFECTEMISSIVE_OFF _ALPHACUTOFFENABLE_OFF _BLENDMODE_PRESERVE_SPECULAR_LIGHTING
_DEPTHOFFSETENABLE_OFF _DISTORTIONENABLE_OFF _DOUBLESIDEDENABLE_OFF _EMISSION
_ENABLEMOTIONVECTORFORVERTEXANIMATION_OFF _ENABLESPECULAROCCLUSION_OFF _ENABLEWIND_OFF
_NORMALMAP_TANGENT_SPACE _PREREFRACTIONPASS_OFF _TRANSPARENTBACKFACEENABLE_OFF
_TRANSPARENTDEPTHPOSTPASSENABLE_OFF _TRANSPARENTDEPTHPREPASSENABLE_OFF
m_ShaderKeywords: _BLENDMODE_PRESERVE_SPECULAR_LIGHTING _NORMALMAP_TANGENT_SPACE
m_LightmapFlags: 1
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0

- DistortionVectors
- TransparentDepthPrepass
- TransparentDepthPostPass
- TransparentDepthPostpass
- TransparentBackface
- TransparentBackfaceDebugDisplay
- MOTIONVECTORS

721
SampleScenes/HDTest/HDRenderLoopTest/ReflectionProbe-0.exr


v/1channelschlist7BGRcompressioncompressiondataWindowbox2i�displayWindowbox2i�lineOrderlineOrderpixelAspectRatiofloat�?screenWindowCenterv2fscreenWindowWidthfloat�?Y�u��~@ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ ��~@ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������@��~@ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������`��~@ ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
v/1channelschlist7BGRcompressioncompressiondataWindowbox2i�displayWindowbox2i�lineOrderlineOrderpixelAspectRatiofloat�?screenWindowCenterv2fscreenWindowWidthfloat�?Y�g^��/9f� � �@��@�@@ "B��`�@A� �@ � B0�@���A�� �  ��1��Mn������oW���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������߿�����������������������߿������_���������߿������������������������������������������������ a"��a�q�q� �� �$�I$��(��(��(��0��,� 4� 0�N4�N4�M4�N<ӎ4��<��<8�8�5�<���A@�<9��;?��A?�;AC�?�<?��P<����=A�=A������������?�;AP��������O��P?�>C�<A�C�$??�4C��PC�@@�=>A�P����C�?C��C�TC��P����C��C�4>C�?C�;C�<@�?C�? C�<C�D? A�P������P����P���!���C��C�?
?���0�P����a�O�Đ�Q��C��C��?C�T=C��?C�t?C��?A���� �C�D?C�D?"C��?k?�S�C��?�C��??��C�D?����S������O���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������q�O�}�P�%��5А�%�P�����%�P�!??��>C��? C�?C�t? C��?��<�>;�=C�T<�C�4>A�Q�5AC�=PC��C�??�C��<<;C�<C������C�? C�? C�P���?��C�� �C�� ������P��@�������P�����ŏ����A?C��C�>@�=A�P��PAPP��P��@��PC�;A�;@����C�;C�@��<�<�<�����;���A�?��8�8�@�P@����8�8�8��5N@��4ӎ8�O8�N8�M4��0�M0Ì4�N0�L0� 0� 0� 0��,��(��,��(��(��(��$�I$�H �q�q�q�q�q�q�d_���:�Q�V�<+i+����N��IU�i�N�X.'H����}JDo����>���k}�X�^�X��,E�u�tJĈ�Y���A���X8T���� I���EIU�ă�@]�* e�%�
��A�t� ��Ł��b�AH%b�e
@ �p4��1D �EA((�5��+i���
�ZG�+�g�N�����@kƔ:�K�����A`�
�A��d,
�%A0�� BB䁹! PE�"�c,�(F��*6( ��@ E��`т��[�,�T(���R�e@�Tm�fL`�(Ȁ` !�E�@�B�h��@F6�>��xT��x H�����-#�<F,h�"
��L��J�؀��O�|N�����
X#ik.�鶇�#m0�ɶӾB0&�X��G��=>��a2�X�a��O�zz%�f���l��Be���sJ �#m3���T#mSF�m"���˾�lɱ�)�~l��a���T҇Ѵ�B�ުi�[q K8\ � Z/�,�/, (A}�`P"
��� �,<��C�l�B��e��4zy �'���R�@����(D ���V�����%R����q�ZN�$�P�:Q�P�D��I�T[Ci�;_N�I#(����m�i;����f�T��J��BW�T�� ^� <�`�� �( _���ᲵQ�D�Pɲ0��X"���jEŃ%�"\d2"�@ġ2A�WȈ�,�nE��RK����X���Ň K*�#�J�(��Q�ƒ�!@�2"!P�
��Z�ʄ��pC����D ~P����'�������$BJ�����AY���]�� �ĂW ��4 .(�x�n.��nVHLU�Â�P.dQI�2)2)0U��}� �Ќ�%��*E���%�� ��EՀ�Qi� m.:Ј�ã�#��Ģu��1;�q1���E4���M���N�13��#&%X�G�#X�&XJ��X�:������,K�[?Rږ�>~i��'�Py��Q��`�A���6~<��%��6ad��M����L *m¶� �m��YBM�ii �z��ҧ'iga8bd0��~ ���* _���X�@4�,"R&�� �iyt%А�m�֍6L�f�!Bh��'���Xɣ��D VBe*"�J�V������i;(�J�V��P�)��P�&���)�D��[Ai��*S�#i:�KѴ��miG�����mL��n���2�5@��#˪@�I�*"�B�Ny�k>���}��>���M��-�s��6�C��,(E1�A��.�U�D��G� ����Xˊ.�!b����WJ�J��`�UeBB���F2��|�B*p�bD#`�|$HN& �� �
���Qa`� A� K8` �6 �FP��VA��>���R�42�d84`�DY�4�h*'*0H��p���'��*$�b�9ee����P�'KB��P"&�P`P1`�B"��P�*XTe���Ы����Z*(XXK<4��E��ؔ�T��o�[���������o�[����߀0�x}��@ beg�_����А ՙD��� KIz��ǛN���ͣl�dҔmhL����O>z}c���g��Z4��u�Mhu�M�v���C苌�R\`҄m�|M?Fځ����Лi<��b� U��
A
�մ��S�VMSJ���z�g������4!��€�� ���9�:��⡓�5&�E�M����E ǚ=6�
M��f�Dy �t%� X��Z(����JҴ����R���4̨Y;�[:U+i[H�o�i#h-����&�BEg����l���H�C���l)����~�yh��CT����^ ^�'yXj�� �"�@}hX����GpH�pѦ
e(����ˑ
<P3%*�`�C(Mp�u�eW*&]��B�����x����D�UJUPH>�)&$2� ��,�T�Cig
�e� `��\'������8P �,(ɴ�,�.T��B z) 8T!t�C$�`�ib���A�e%�e_,#p��<�><6�b�F��H��E� �}� EM4�GZx����H�bL!xmP�X K��n�[���u��n�[���u��n�[���u�ϭ��������� �0$�$� 2����Ȋ@ZYV|�h�(~m����,%Y����.�i��OO>zzh���d�T�mKG��&!.��ǧ�[N2]6��F��E���4]
t'��F >���6͙6�16�ӌB�a�����U)TQC��T���}Sp�t�G� ���̩ Ӊ��8��}A
S�X��NЉ�4D��c��B<Ѣ�(Hd3EF 4d��s�L�te ��>����-���Q� ��&����2�����i!D�nq���J�( >���z��ׯ^�z��ׯ^�z��ׯ^�z��ׯ^�z��ׯ^�z��ׯ^�u�b�>���Q�m�m�h����F���c����]���/��ԙ�hS�� NER�^L��'N�:���m:W\|W�V�g�X�"�1���}���efJN�"�"P��P�Xh�E��0TQuEF��!�@,EF�r�«`�h��H4 C�^*, e�B�`��pb3
� bhd �Q�d �@� gA����h\��X�(N��xP�0'Ⱦ �I������I���x*, I`��
iP��K�� E��,��*�iP�SE���d,���D. $��
9�@=���@�J
�� Ȩؠ#� 0D�m�C�$��'�n�Ѓ�+ir��)��S�����O������N���,H
� Y�p~8@�;�H F��q8VA���
VZ�³�E�\`�g�l���gͨN�8��t)�%e$����}+�Y.0&�m:VP˫*&~\`Ml��M�&]dm��K�?ig� �@0� �6͙@0�a�2p@��m�mQG�V�SG��y�M0��΁�C�D��fU��aȝc2�� �'(&�40h4��6<� �:�
 �F�2 DL��N"8����*8��2�n�Y L�JB��N(��ΤhĀ���*6�����>�6��Q�m��O���ʹ_����ґ���0*�2y�A����94��׃g�xJ�Ώ�㦟a�n����|Ē�̯5u��f�G�b%ZDD�aIȋĂ�M,�T�\��hYҢb��|�nU��2΍ F�BBR��Uʉ
�4���2P�p�����B-P�Ié�V8 K8d��`�,
…8��R`��o���&� ����I�ɮ.�,PK0�b��YP�<��g�ʆ�hx0,�`Г���i`س�Cr�bqF��Ԭ@(��X���4d��
,TȢ����P�\2�|�}P��
�-;)��>T����.T|D8Ȍ5.'2$ H5i?l�t��q�3��?y��L��i�>�jL�w�S8������~��,��u�O�q�4ώ�F��F�<����ˡ6ф�O�>0� ���N6�a��#��6`a��wՔT���i垫iB�_YJh K:#��"|�����j���&V1h��
LR ��p��j�/lMG���:��� �g��� Bu �'P�Bu�)(L�D�aK()�QL�F�2��̦u��D��F�4����Ai�GP�:t&�?6�yy����͵����UU�-+Kw�IAIQ�L�B�'N����}3�:Ժ��� �T��k5��a�ҵW /�W���`� ��M 2(T$Y\��.5Ƌ',!* �C�eF��P�Uʃ��4 ,Hd�-V�G��6�H���NP���&�M@H�J�@2�H K8!�f(� :��Xa�G
��h )0<�
'�1�j���,���&(L�K��@� ���b�\��哇���@ �%�,�2�g���T�JY�p��/�
6. �C���EBҡ��46,�ŁPP@X:
���`#�0�h��`�u0E� ؐ�Ň�x|�xF�����$�#�`���>�6ʹm�m@��\t���&T]"���,���&u�T]q��?yg�ɨ}C�U�Y):����'&&�����ѩ.��„%�(>2���
tG�F���'@0�יִ �JS�~�;��ۏ@ZZ�m�.�`7V#lr@��c�h�#'8�fPPO2q���4&X�&X�eA
 ��):��-�2u �@u���N!82�U%�)�L�Bj)L�&TS8�P�FE�6�a��-;�XF�aDm���h�������������+�i�F'}1�U�}��>��߸uZϜugL��4��
�2B�L�7~mg��Zl��ή�a�Յ XYa�ȉ
�,"*�QRD�D�$%+*&*�a0��C�^$<UAQ��"JN�6� �>RB���8 K8�l\�N�t�^0�%B
�G������w�aEcc�`5$�̢��Rc �2��?V2 �cJFB�� E�,�� KK��
I�ɸ.@.�A�Wʐ��*\��*�CB� � E�3A2�4m� N�|�lXD@.#�����A ^#XH�p����m}Bd�m����a#j*(XJ���H�)�GFL���QQP��u��>�FԸ��'�����Xua�*#'Ba��(qA�� �p>�am�P�#J/��g��VҦ�Y��m\��1��!��u�� $@��@����LG�18���6�� Ry��"e��[hu�$�) |�F[:����!:��#�!80t]�%"�M�LE% (�F�fR6�ԕ (m3�L(�������u��u�ʹ\`y�� �X��G-����Ҫ�iB[����򂤠(��@�;���V��O�:�����U�u� A��q*��rē$WT� ��'Z���Q$��"�ˑ&QbK+4L:D�h��`�Q��'#AҠܰ��a`3� ��Ƃr�c*6H1a���4 ���,$HRV�T�% ����%���N�ZY�H@��`� d q�b2b�PHʕ��
����X*$& ���� B����ؠ�Cb��TB2�d��B ��Là�h �1R�İƂA�V, K��H4l#`�D(��D�7* P��R�p0����10�Bpb�������sin#i#i#i5N���d�Z
" (�`�,8 �0,`�#J���B� K��HږQ8�����L��e�]HQ#iU�(����L�q3(>�
�+P�F�8��L�qK�(**YH҆ޛi:���0�2���h���@.�a��6�BU�P�=��*�4�
��}�m�@ZYΈ R�>��:4f��T=!$is#8щ��!>2�ʆ�"���& 2i�JHV4��b ���@��'P�2��DI�B���>�@�B��vѨF�ґF�)�m���eK��J�F�@Zx :��m�X��F�/?@����m������ZX�sJ\tⷝ<��gU՘V˦T���o���XPa�� �� 5�zmwW6�cO�X�+.q��:��#X��@E�(�`LT� �yPز��R�,�М����*l�h�fK'T"  �
Wh�q��0��|Cig8>\�2B%�8,y��@}baYg�"��#N��E��qG��
$,h�$�
h7hTPF��$Ƃu��\YѠ�:�dJZXLU£��$>J��Qq���d+tT����E�(�]�D%D0��F�P� ����l�pL# �&P�F��\#���D+����e��L�F��4��̟}EEK(�QD�
FѴ��L�qE+��QQR⊇БR�fQ8�����č+mCJP.<�
sjLR6h�hшR4�
�m�H H >�ϨV����HMSi�q�J -,�ՔFU�ԓ>����,d`u�
H[4���/�h�G@0����4���JБG2H�CJD�� X����>���'�mI)H�v� H��I藍Y#�OGm�է}K*\R��
� N��6��~^m��%��/?>�C������-,"�����}�N�ζ���V��[� o:��\ �m][̅��f�!k$Wqr$��7�:0��h�h�,Y��f �",D5"M`�D�U���*��)gJ�!�`#J�2�q0���R��l�N@�D�hH.@T> ��&Gig �f'�6�2 �!� ����<>�� 1�N���A�B �A��A��C* I�**�<((H�P��
���B��>�@�:�X)Q�hlX&* łq�cA0x ��ƃ���1 7���C�[ ��b�0���q�A9�BP�A�h���`L�L �>C��� D5 A<5�p��������ё������qK(�L㬢eE3)AAQu�YHҊ2j))�AAH�FБL��UQQHҗ2��,��qEEK)��i]�/մ���R6a�
F�0��!1V�C**V�������)�OѶ��R8����7��FFe���Gc����*��nt��F��i�2�) %L�GѬ�Ԋ�&e�-�!:���g�D����)�G>!F0��hO���,�q+*\H�l6�+
(i#m��Oi�F F�����m�mB<�ywϬm�����`-,B��Xl���8���k+0��e��_V��ꌪy��_3fiu�"���5bee��b�Ş`��6äOx��o�ybK�L��U��A�ؔ�hF4�|p]QRuʙ,�d�A!���H|)|`�q pl�*J��ZY�37>����)�B�aW����
�͌�JC@�#A���a�Ӂ��ua�K�L���(�RW� E��� ��������e��(��(�!�ѩaү0Ma��"��l`y��H\:2���w�!\QX�q�e@ �`-;)����j>k�Cx|1dF ��)U�����q:��8����������m%��L���~�K*((�@�
fQ2������q%!4�8���QD�F�
�&�
%�@0``�G0���E!��_��O}�e�mj)�8���@�+���u�j���>����*N�yI�δy���Pb�a¢��&�Z�J�WPB��GfT�P@��� i$����>�4'̣�UF�;H�GGGGm�u$[V��. Y#J@ZwT Hٶͩ8���wͶ}�mT��g?���U]���%Ӿ��.���Q)N�Զ�+ϑ}�����ڦҸ��u�b�,H�f�k5��`���N�"b�" �&2D��ZXablb��0��Ƞ�h#b��1��\��PX-,�(X(*��z.�l'@H `BR� 0�HT��@ZY��8��(HB ;�>J�"�ψ��eÁ9`5 �A�*FA�`5 �ō �ʁhTl�#�6**X@X
La�6��0t�tp�L2��NX��AS�A@x ��`��F��ãh�mX�1�\%�`�YP�DP�`� @*�����`-:@,���0�7@B�@!h'�C�P @�,�0] ��x��8 K�gPTS���N&q��D⊊����6���<К>�
�/߿~��R4���g8���N&a%)B�
wS2��̧"�
'@0b>ىƎ4�]#M����j�V҄
�Q@� �@ZY�!@���}�
�r�
� �<���ZBX�f�Rb����L������`�#� �}*�(
mhO���1�c��N�$ ���}J�YJ�z:v����QU H���� ��h�����h��
i��H����,��W0���+T���Vi�բ}��Y�O��{l���.2�~;y��(��&�nd���$���`�ʖ6E�$$H�&�q�l,(pQ��bl���,d�d6���Ұ�q�F�
!�ه+��T �h(t����8>D��Za�dd�`��}S�WtX5xdFT2�|�f4��jU£��$h�%�V(l��#DÁ�up��B��H|dH4�A)g�Á���|>\>�Fhm�h��<+,dY�s"� ,�c��,B,�tIi�O��L��`�Z��DA���0�qa�1ĨK�a��+�Am���e[o� �G#����� �mhr9�L!AAP����ߤh�m��68��)D��$}(�FE3(�L�wT(N�꓂���h����6.�a���ߣR��a�d�"~��m ��F�=z:��AB�B���a��&�:M c�(8`�4�Fe:���YJ�ŎNP6��I�>���1�K#B�
4(Чm14c*m�N��Һ�������}B�7�-;���� �l� Pp��I�D�U�����-,"���v�y�������P+L��|+m��R�@qʍ���d�:���_�W"P,(.ˋ(�Ig�&�f�K
�E���L+"U�сRn�& ���F
��p��� �hF�APD�F �l� a�H�9���d# � �`8�p�D�^��!�,
�~���$�@��,��e� �ŁPd(`�1 �HYQP��VT$,��FD2�pPl�9hl�tB ��������Xag�A�x�E� I2a14σ����#@�X"(�`��dX#*�Aք�0��0p( N�h�L P `�� дak��+��>�
�A��:(�#�����&S8�K���00���N��N6���߫i[o߿~�@�����A~���
r)�@�&RL�f8���R�Z��N4a ��,�e��u�������B�oն�V��x�
��|��I�8.e�Ѧ$�@2y�'U}��s���M�@0p����6�WӶ����,��RR"6�C�'�F��f�ь#F0�eK�h��&�􌦢}=;I�J�W6����ZwM�18��E�AA8ٲd ��8��o���X K���T y�̧e��VaY%d��uk>>���\]�3����8��M��}��i�%ڔY��,��e��}bka� VD�7��"�4$�H�d1$�0�<�xNR <tmXڡ��T0�Q !R@h�@ZYˀ��hM�ceK�u��`ȬTLU��A�#!�q���YqP�Y���)Q�� \��k�:(�GEV*$$�X Hń�� �ï`"C���6.����S�.*dQ�s"��4Y��ʾ,B:T��Ӳ� �6 Z�Z� G�Q�Gl����J�x K��(@���7��i#o�+i��m#u�}���߿}k�ߥ&�aem�0�����߿��)�D�R���Y-3��L�őJ��GI�Pq���߿P0���a���!�����R���������)q�b����ғ8��JB�
+ BX��1
�tb��
�ON�l�u=;�''ԣ�F.}�hQӔN�$(�&mHS(F�3i�N�WR0�Zje(ɨ&�U �m �t��GR]dm��Lʅ ! �0��&� 0$p0� ��D��� ���x��y����^� ���?��R�<R�<R�<���\{�Y���h�p��|H@R ��|q�T�6���nx�Lx��@D ́6$<�B�b�J *L�^�C��P��'R��U���"��;^T���$FF��S�T�VB��.d��8{n���Iϧ�P}������ځh��l�`���8ќP$P�H���('�ӠTZ��!������Qz ��T�Sn}S�_T�S��L���eaF 2&�|��F�"$��yx H���"6Xg���Ͳvvvvq�!\T����ioa_�վ����&T�gӺ��J�'����Tk!�\��6�瑮��jն��\JQCiL�&S�H�U/Ԋ�J�3(�H�gTTPPQ2�ċ(�V����IIN�gRS2��,��qh\??@�h�H�F2�����ӌ�|��;.��"WH(acN��d~9!p�#���B�� #��i�fȝX��;if]_���dA�h!X# �W�� 5p&
o@Z�--��W���`uH���C���X���"��@`Ӧ�N�t�"��Ѯ�Fes"#��R�Z5'F�
O)$ٕl+0�gN<�螾�⊏�æ�e���\���˜]� .�������mZ� ��t��KH@��$*F>����YP<��$
jD�*���d̨ ,�2P�`���/x *yP^��B�|,}�A뫺 .,�W}`|���(0�A�N J��ZXثg����6�ٷ�QP����iq"��]�����vS:�鈠�a3�H�G�+ECB��g_J�U��P�K.��*aE�TL�&S8����u�)T4��l�R��̢q:�)�L�fS8��ğ�L�J&S2���"e��H� �\B����:%�]@����M�3<��&f� �G�v�):� &���HYp�#� \���4����4��O�ri\�������D$ 1T A4&(Jx5L @[� AH�pM~�i`[�i��w{����3���#����|��@8�-<$B����@6a9���!t�K���3 P�R�������մM�R�Pb�e)�0��H��i[*H��˲ֽd�m]vX"L2d�JI ��K�LT�8Bm�R`�9t�)D�V��2G��Ay�n�@��DE!�����f�L
�&]!��{u�
���=���o+T�;I�.��Ko0���"��d �b�U(�D�*(Io�[���������o�[��ؿp�?�����X�ۇ�;@D���1����Z\H��Y[HȥN����7D�
GR.���n"Y
�'�@�+�T�$�*r/R�B� (i3��H�g8����V�dԊ�yS �EQQR��Ӳ�J�4�Jg3��))�IL�:
E����m���eHYEB�*5�8�Y���陥��fv]� �]Ó ����p�#����HYRBɆ�LN>l����-,k��������1��a�JD* �a0�(x)�#� ��5��Z��n�x�}���.:�yaӇ�<e� �`ѓl.�e��H>B�#���yԊ�V�*�϶ʃj�TqUQ��e%rI�0�'|�v ؞a�O^\� 2q���x[��i:��a95��D�A��&SD8��Jyu"%l((Y0n�d��j`�2ɂ�� T��.v� �a�����>�=Vˠ�ڰ����� .� �ȬD+e�A�P���������~�_������~�_������~�_��Չ/���2L���f�6ᖏ,h��G�"��U������]u�Ͼ��߸�k+aK*N�IFɶ��Tmd�6�v�T�k$m���B����iŠ�R�V���6��,�ˤU����$���um�T�e����k+���� (�GIL�7�I>�����~}c�d�&��2D�F�4Ѧ���d��ge�6��H�#XH���Y�a�NM8rd�����LD� Y�h}�3,X�bŋ,X�bŋ,X�bŋ,X�bŋ,X�bŋ,X�bŋ+�i��'��&4��(� @��� o
�8�y0<�Io��R,�Z��G�-3A��A�������t�D�@"8
�c� M�S(^@B�HB�䑗H#qC��i�m�$PeJEO6���"ˌ2�jR�•=ZMu�V_Ya�ɮ��FCą�5�u�#� ���9�arC ��0�/Lm@��&�P<eH`���(�L�4�m1��1��*�).����xu��@RU%xӊ����믁<����֯]�D �`�Qrˊ��.0U����k��_��������*�$����…�33;2�������,�GiaY�Z�������'E�,�996
�J.)(Qv���xUbϋ�E%Zibo�m���ěDEI�QŽ�`��&� &L��rRQVH���aeb��6QY%?��JUiAD�7�:�d "u��:��O��Ϭjjq�M�l��-�`��˸vm���Pa����QGp~?98�����>a�+#��GR����@Z_��� �ੰd���� �0�`K��
@O�#�C`-, ^�����N2B0>��p�����Ј����(�_< :��� ȃ�D !\�]�E�0���*(ۯR���/�qw >���>U��T�;y��1k�aaf\d8�Ć��K��u4d WJ>��E�,�y3 �i�@"<�����"����j@�*��
2)�
�i�j�� ��-Vʀ�S
A�j��.�<y����|6iw���<�]`x��|U��+B�����*�����<�A3��6��ξm�� ���Z�-.% 2(�FI:Nӥ�dQ�F�%*ૂ��,T��"��>Q���`Ue�"*M��$,Q��I�M�H��/�Yg �M198�����Ҥ�:�RM���d�_�WIL�'�H�E�,�d �"~~}c��d�&�750ɦ�K�@ѩwM�fm�3J�U�hN�tTG,:������,ry�$L�?��8�Q+�VD��>����R��85xT� �ĨN�A<� (A�-H1��iZ[�Q� O��[���
���c��8 #�����c���lq��#��tHq�c�@��}+����1�ąU�V6�#�)ԄΨV�JU�JeM^|f��8����j��W\�[��]SB䁣%��$�?u�� �хhG�.��px��F�"�� @@���(��`PHi"�M&�$XD@� �I��q+�FT�PQ2\(F�fӺ��>����bD�}�PmK����\�XUr��,�E�J�E -,
�d�����]!�U��d́�i#�^m����T�+
�E�q�WJ�,�UEb�
,(DQ�GEebҤ�tT�I9I���EJ��)(�6�(�^/'$��O>E�ykL���(���M���"�dS��)D�F�RQ�B���:���u�.���d�&�54�����6��H_;34��P���Ǘ8�QM�2m�,�l��T�`����:����}��$ �Z_��D�2��jU! \ ��7V�`Lp$P&~��R����`L��:>x�@=!�\�x����D @���>�"502(��l((�dŠ��*�2���T��][/����<.���.�ˬ�˄�y��
�T:U�CK�G��&GF:��u3ɇS.�J�dB$T�d.#�} n��0�B�C�& ���5CF�I8CR����d�b�Ԇ*U������|N�q2�,0��W��'~��h�rDB�DH�W� -,
�/������D��G�;6��͸uc�T����Z\ZVNU31fJ8*�h�� 0*��"ˊ�-XU�W_p�ťW')"��|�"��&ҲqE"�O�X��2˄⍓�pY�qF�d��(�DE�(�Q��AAAAIIAF���rqd�u (Y>��'\6����'=>D���36D����gԣa#(���EH�2)�]�_B�W�S,��˥�$q�L�Z`G���p�� ��"�& �� �H @/B����H@*�nҴ�&Q� Lˆ K0�t� �Y� H@�`,! B���&N��P�ll
��D �����P�$�nh ���t�Ґ��l}����T}�� ��䮫t��o*}���_�Y[�����$ �&d� �ۯ@;��s(@��F�2�ɋ�i��H&8���т%0�1BB�/Nm(*%4�4Li rs��Ul!��Q�+@��R8��O�����0ņ/}��Yv%Y"�H�&F� f�<��y� H��R$�������Տ8eI���.�g�0�� �@Z�-.%�'(�D��,�g�"5$.��1��U�:2��X���F��,D��W*�"M.,�FE��E�`Y�b"� �/X�^/h�^U�w�Y`U�H��Vs��O8����L�Y '�Y:���в~m�o�Pa�SS��t��V6D�cꏼ����a-��ED�5���tϡ]�^GF�7Ҽ���%�u�FR��� ��LD*j�4 ���@�,!3�B� c������à=
��M<>!p�'0��3=<�
O�p'8����D(_D�T||�1D(�>���w�y���j�%*����
�D;���^~]h}��-�F����"ef~��4�� �+ly:��@%@�@��鄩�R:�c�3�N��_N%� Ӻ؍+����J�q�:�.ueeݸeŞ.�ϐ�X�u�Z�׌>�ƖysK�0��'%i`U���� `�F���&d�y���d}*���� K��T�E"�fE���#M 0`\��Cq��gŖxa��� ,6�d��R(�FJ�M��
4,ȳ"�
4/`����VEY�d�U��ye���4DT�5�����,��L�q,�d��g]?B��~l��M6��N�zy��}��D�EѸ���o�"�to&��a �(@�GR��t���y2���GH�7`-/��2Bp� � `� h�R�j�"����0��8�t��|�0����=@?� l\/4��bh �N ρ����dj6�i�ȇ��N|��2
A�@��UiU�eiվ��A%�*�*|U�u��{ϯ��M��Ļd�e�2��bu蟁�9���)ď$ L �R4x7:
��Pm8)�:D�nl'HRҚJ
)ͧR��[l�jH�+u�q���y�N���u�ރ��e�υw�v�kWyfXK�^HX���R������¤.p����-�2A �duBcP�� K����x�"�̋�Yx`�ec �4.��Ck
�+,��"� �2������0)*HP��"�����^iQFK>T�������-,����Y�g E�(�R%,���m%3)��e%�U��X뇙:��%�K�:njmA��L2aX��
P���4 �y �YF�)D��Ьy�.�`��訖J�*g�Ҭ�����^��>0��A� A�R�R�����3b aX�N���������!ʆC�6 4�����A��΃#o�h'B�� PF�V�'AD�V|"u4BM ��T�U.�>��վ�y�Ս�p:�aѽ��]Z�.D5�3&i־��,��o�0��CɗD%<���(C䑅i�:Q:|2B�P�+ B6���P%P�X�]@�R� �:���_q��ߺ<��;�>�\r�z�$ ,��_\��2`���-,
�/���#�f�.ɖ���p�#��]�������Z\J8*�Gx���fE���YqwE�|ea�Y\b+|]ч��p8�}Xy����ARb�����<(��gJ�Y���|���QҲ���Y�J+x]�� +`Y�U�/��P�3�)�>�
� �i�L8&��p�CMh�F.L��@��<���!e� ��}��H�UѬy���yc�$y-�]H�E�.���`�h��l ��)� �
���.�(� @q�C�'�`���e������l�dq�Q>6h18
g�G�O �!l�Y���.  ��yV�}�C�3(���F�>�#R�Xꤪ@_���*Ը2��>��/.�}��qU��d�avYWh�"�B�{n��Nu8�:�"H R ������D��\��2@'J#!F*�Ctg�L�P�h�b�r(թuB�ζ�o+q3�>�����o}�j6�X���-00�0Iq�B��-,
�H�c����� \��1<��- � X�)� O���^,�Re^(�GJ2)&��"���|������\]������4�y��"|<�@�"tn,���|Q�Rb��|��ˊI�(�g���g�����.��⮍)1��P�g8���N ���X��]6�����Y77:��ЧH�6�<~�tK�]�@��W�~��t�!\�ȕ�$}���&�R�2�Ĭ�}=-#����fK���`�(R B�h�T� b �x�� ��������� ��d�66y�Cf惧�@ :����BC��*Q��D"}3B�@EH�PIH�0%�yX%�a�h�UA�U�լ�yŜ����E���#e��E��ma17J������L�C�Ne��O,xp�DgY>$tYBF�8f��DI�*.��yJ��(}@�w�qX��^!y��@���<��3�Gn2>����"�:D��0E� -,
�/���#��@��BFǙp�fZX��=i�����pY�Bd��dQb�
�/(Ⱥ„KK<(�g�� E^XnXeq��8�}P������D�G)pQ�B"�EU�|�Ţ��x^/�X��ť�|8�>Ȅ�y��l�fS8���$���h���:D�4zB�� Oϸ����]�D�
�����,�T���o�u=KʩB�g�=>�%�)H�BIh�N�:E��Z`X$,�n6pJp)`>�`%@��`��3����Z���80jO6�ƃ.  ���6#BT#J��>���"M
%*(�S�T&B���Hy(S�P6�#���gu��*���a�5,F��R@."�D�vHT���_��� ��i��D%<
Ȅg�:�#a��S���>�N�gR��d*(F�*@�
(��R������ʖT��v���R��t�Ϻ����j]]�2+��B���B..�[}���-,
�d�����y '�? �P]ï�`�#�R�����Z\EdeҎ`��(DR/�\T����t]�wê���<0��h��1��A��#�"B�����F�VU�gK>ZY�u�x�]Xۡ#XBD#�EˈH�_���0�rrbbb]c�L|��&]2ɹv�'B�(WICJ�E�:�tK�y+(�?@����O��O>��J0��~��o��d�
�\G?B�`-/�ag�ą� F����($����6``X�T�����������pJ��FͰxl����@!B�Fed!)���%(R���YP��(}�n�����T>�%%]�FP�`n�� �CI�7�|#}hNE�TI2��UQJ"I�K�&��8�o������tD��DY\ec�qՎ�՝ O��3L���N�WR<���>�v�T]R釕0�������'\|F��"ϼ>�g�a����e�"0�6(8�ˎ��P�\�������.��*<��Sl�|�&[Pz��iq',��`T��%��/�2(ؼ�]rύ.2�a`��o�.2�a�v��ȇ44�q���������C�Ċ,4��i8I
�]�� l9�|"p"dm`��L�J�4a��dĺ��92�ɧO(F�&Q���/ u%
������}#h\@�'�Y:����и��jQҲ���O�7:���~u��,�r������u�{���ZG��ZG���K�
H L2������ H� H� H�g}�`��� ����� U%R��Tm��7�P�
�M��(Ԇ� ���A;�*�8@��*��F�!(H�˪*�:��B����πD.�����h��A-��J���+�H��$�q׾G�in��p׻��w����Jw��Ÿ�����W[�u� ���6���i}v`-?�����Y&�J�Zw�,�e�e3�)i(�F����O#e+��T�5�6��.e 'H�`�&��<ѥ�>icSSK"�d��Ʀ���Z:�֌�ζx��֠-<�;i'^���� K{]�`y(��e�URyK�Ϫ"��K� m�#�WN<�d��Na�՗Sty:���j�j�CGojȸ<��s��2+>����� �.2�!�,�,���� �2K��ZwV����w -?���m&�]; J�j��0�t�$y#(�B�5�2�d��(��Z��ЦB��u�$N2x�'�M�6ə����Lζp��C<D�G<M �_D����Zy�f�N�y�`-,��Z��D��h�����R���uj<���R%-6�P<P�C�M�
�N�m��ی�u8-6q+*+U(��R�H':�A�� �:���"Fy�/���!R �"(E��X"���H�נ-//ؿ�%v"�^�2�������B {�.��ֽM��k��kݭ=Z�EZ���2���w�-?���4�d�$�u3���mt�&e+��F�&Q����l�"����}h<��h:�)��N�icl����|�&�:ى���O�iÍ�h��V31B��p�5�-%���ZX߮������O���LB�d��u�]<���P‚ )n��w��%])�8@��ī�$e ����Vl3R���C ��Vx!�x/yŃ'�`0yheep̒�CB���\2]�A�2_v��������:I�r�'�AQek���T������՟��`y����~f�+��+P�/0�.��b�� �yp�gV��Ë;Y���*˭i.]� K*�H O��êZH�W���t�&��yȘFM�U�"����R�JѬ��k#�l��\:�拺y�+h��&f33114ɉƏ8��i�N������h�'Z�������`��D А�h
r +�P�o� PX0�
Z�A�N��|=�! �|K�O>)�!��>�
`+�@X�\���"���à]8���pN��Vx��}�`x+|t/������>�� J�
����X�����c���i���a�"�K���'�s��JQ+�D�l��(
�B�z�*�����L�TJe(�i[T�U'�tR�ɐ:��o8���O,� ����I(Lk X�'�$��qe��^� K�:
�<�c��f�(�l�c�� D%H�� ��}�o<�6 �e��/�"DY�l�J�hT�)2�$���B��`�h�`��\�@���($X`B*5�"@ �Z���������PT�����N�w�SS,���k YǞ8�,����,ne�.2=ht��1ֈ_|���3.���>bbba�c���&|y��!d��;#��bbac @Z_����GդY-�爛p�����՝X���̞d��AAH�eiD�G��μ~����sD�Y;<��g�:���h�-&�+^�� �
����耡i1��&6�
�8���S T0�F����YP��dl� �� 6Ґ`J�Pv�d����@�K\R��`���k��Lj��E���,e�@eu��,,���� W}��iy&�P��AwS�Y8�1{�\�� ��f�$�\4p�.e�"Rn�'Y�Cd�dL�D�m*&\��&�0ܐ�a�Ptp"��@���±U��-2�$.@Z��Y4��]3��MMJ�'�.����|���p���8��̬]�;���:��F.Ȟ8���F&&&%�2���ɗ�4<�yyyyx��Ë�8bbb�:D�3�#}+��hW>��GY��]c�|���8��f'�99F�$��EBL� �H�wSR�y� �d��/�d�'�Em$��[���:�@ �������B���5J]+
��U'V�2����!&�9D'D
HP�PmHtƒ
$0�� %yZe@\8��.(pΨR��]��:��>vY�Ȯ`�hY�*�h�EYy��}נ-/�L��j����6ʃi���1UI����&R�`PZ����ʜ*E�@}X�E
��%]pB������� $,�@d �@�Nj"ɀ�mM���Q0xyx O���*��d�&���e+��>�OO�;9FE�8���L�<��1ք��ZX�� &9118� ����ǚ�]b 8^]�;"h��� ̺bb�u��Vic33 ��h����ɵ�2i� ;`��G4B�E0��C��6%pH��>���Z0� W6�׏,"$4( ��˸a��`-&��-,!��J9i��� )‰N%Y!�/�e[��Q�B#BD��[� ��J������D�L �lS,�+V���[�p!8�ac���>�=yg���V�,D �X ,��±��/2�+(���`-/!�eԅ���^���r�6�6+]��R��$�>����� �����K$���*����vX�ʅ�үe&t\1*XP�#@� �`ұ��u�-2�� �� O���*���R�>��t�$e3��X�#�(@L���p��#���0D����&&&6���E�� V>8ȝ�� �C!|�}�*�̸bb�m��x�ƞ8��D
K�i���X��778�#�,��vDrk \(<��y��!$q�kx����#!y�g �2�t�W�z҄
���e����up�`+��M�����V�rSi�jP��* P� )B'F�V ��V "���_Ha�H�LD��Bm�!qJ���8���<�K�R���x���af_$M�I�.M��E &�����:���Z\�8ӞR�P�S���R�D�q���hR�Q�xE՝>�3ͼ��,��$Dd�b�g
-.�X@, E����`Kh"��FT�aր�P5�p8�Al�� ���@��������Z��@��<�d,�l���>�ϸ�����Y3Λ�p��&�78��M,vffb�cL�X���&%�/1/// d���B� ��'6L�+V^�}���d�&fd.)2P~r:���A��2�ࠝ�,����8��Pq�� 6B��_.��#쏲a�+�\��_6���N�#�"/i6Wia�b ����� ��q��� T�bGT#?D#J�*��U��H��a�����H�q ^�䁊G����6u�a�l�N��BT��¡���� Y�{d�0I2�TD0a�ay&I��`!
.�݀����S�P��"] 0�aX"R��-������
�x[d,|�����,�H�}��QA@�L�@x(��V(��Al\/xTD(�T � �1��A���U0t�����L4��ˣT��S�P2�ӳ����Y-���2ṩ���N�Δ0���p��&/0D�>� t��}��bu� �t��6�ڂ�����$d��%� (A X���Ĭ�����K�(�c���"(��,���$pӂe���Y!Jm�� �J@�}��b���7>�8�8� Y:#���+vҸ?�4�� O��~ �A�N �'})�@���rH����O>��Z}�J ��y���$��x��7қH�c��uJ�RV�Օ�N
IӺ��U��_s��+>Il �ج�D�H�Vd�0>i�$I��^������!*:P-��H�!�@sLq0����Bl�����N�L}(B� "}���:��.P�F����x&U�Rb@-E�"΋��.��B�Z �!�M ��!�a��@Ze �z�����Q+@�S���P2}��3��6y� �e��|�ˆX556陷 �}�3+p��Y4����ID�:(�GGGGB�:O�2��M6a��L@Z`8y�l�.�����bfĮ�2"��f��G���Ra� _G�qQ;�W�10����
���>� va�ʑ�~�a�P�dIi6Wia!�6v���� $�M��u8��)ĩ�L#@��հ��Rψ�̆FV6#�i�J'q(b�䡂� �]��[����.�������X}��ϱ�"��,�"Y����d ��?v��'$t�e8?N�P|���] :L��[TI(+Z
�,��8� �P�q`v������H�/
*-b���
������!x�ca�������C�!���U8��`-?���eHXHE�@��yc��d��G(6��&]4�v�He�!h�*HH��l��@�%"��H�E�<�䏣�y�����GF� �//i�0����DžK�@���냬��>؝(�$pD�jD4����Ģba�/lD���EDQD�nȎ@�E�0� c�� dzi��,�d� I��o@ZT����i�_z������ �
��,"R�.�'N]00 D��u\�uCjӼ� �<l12 (�+B@�J�p*�H�+��m�^L�n�f�jҺ��n�q5���}��}e��\Y�����,���`��W�{�`-.@A���� lqP}�(�����R���&)Ǒ���2eu�_�p�$J.l�+��I���E P"h�DL C)b�D `�H4�0 $2 �҇�(:�e�<���u�8 L�q������,���JE#��@�'h�p��[:�Ɇ�>]b�.lˣ�8'h��h]IF�*J5�,��t�'�Y+�GF�9�м���/�] ��h��GIi� X}����p�����&<��bfĤ�P�`�X1pH��v�6�x�"��(��F�jЕ���˸]�R���fY|���'�>��l���<v �-?��xhQQuO� J�Q*"It � �O�ʗT=T|�A70���}(CR�P��J�ּ@��WL*�a��8����xu�/�,�y|u��"�ˬ��+�G��Z^A��f�����T�X�9mv�y���h����|Q�C�Aw�� �����
�X97��B%Ap]Pp+x�@,��?X`,|d ��.��BA!V ����Ze[!j����R���&iI:���>vu󯜘(?!d~^e��hu����<�� �y��F�GQ�,�t�'�]"��F�>���N�} (V@�:'�.��� K� Æ:����,%pq���o��'dD�oG ���5d1H"��DPѰ�Xl�7p5P$�GՏ�B� d3.�Vmcs���N~�� I��`-+�N� �������@��p +F�����e��C�d���J}��*ҤJH� Mvl12��QB�N�*N��<�=y��uS� �N<귂��t����j^ae�K2��4D��2I�z�K�]�~����= �8pD�m�&d��+P�ДJi(�Y�l.�ށF�C�Zh
��.����Tliq���Pp�`f2��HY1P�h Ѡ�8�d<: ��
∀#���i�> `-?��R,�}d��$q�V<�ٷ,]Ë�X��/2�}�� �]#�h�D�7�:��T�#}"��OOOP�VR,���
Ю��N�Y�44tttp�uf�3�&"&tq��� ��,"���#p�#d7����Ր��1>"|7XECwXnȑ��g���`Æ/:���H�|�h߀��+���� !������F
) P±��c� Ь�5F�ѵ�M�L\�Xnh3H�A���+y��L*~���>>���^t�����
���+e�=؝j�v+�������l}��iy(<�"�OH �< � �:Z0XCD ��� /tY�A�€A0��)��\�}�C �T�<�+�+$:��0 ),p8�< �ʃ�hpP\-LFA�i�L!j�����P���u�P��Y�g�:��Q�m�N���|�#iH�::E�:�d�#]'���???>�%о����V}���] _>��+=>��\@�����M,@���E�� ���7Č�T�[,&h7�� ��!�1p6"� �>"�����vCV�V�w��#̉ԏ&dԻ��Y:��yy�=i �d{ ��@@@ �@@ � @ @�  � @�����a/��^���>������������������������������������_��������d���?>������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������?��ˋ����*`�#�a�rr r� � $�J(�J(��(��,��0� 0� 4� 0�M8� 8�N4Ӎ4�N<�4�8�A�<�8��@��?�<�=��C��A@�;=A=��������AC��84@�49�����<�@;C�?C��?C�?C�$?C�C�?C�>C�?C�<C�$?@C�;;�@<C�;C����C�A��P��P���%��9����� ���P�9�%���A�����@?C�?C�4?C�D? C��<C��?C�$<C��� P��P������������%���ÐC��?�d>C�$<C�4?
?��?
C��?C��?C�T?C�D?C��?@C�?C��?XC��?C��?C��?C�$?��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������$>C�$?C�����MŐ�e�������P��������=����P����=����ƐA�������C�?C�#�P?��C�$?C�>C�?C��=C�?C��=AA�?�C�?�=C�C�$;C�t?C��?C�?!C��@;AA��;C�;C�>C�<C�T?C��?@���AP�����������C�?C��?C�;A���P�@<A<C�������A��=8��<C��<�A�@�A�@�58��ӎ��=�4�8��@��@�N8� 4�L0� 0� 0� 0� 0� ,��,��,��(��$�I$�$� �� q�q�q�a�a�TW����P����� @WG���[�NTH���ΰ�n��q�=+�im;(H�V� �{l�R��q��[n��^V�2�uL�\��e̗*E *�����
�H�r�(4PT�-.:\x��p���P�� �������� �t��<@Y���@aИ@� �8N �p �@,����P��(
���tx| `1@"���"F���(,&� ��$2S!8��J:ѐ�\Pd&��@2 t82Q��d����� I�
ؠ``�d�8���t�- ����W �A�����e�k��\T0�hT
�b�.��b�t,:`t �0 ���%� �+�� ��� ��%A`�@;��6�<| ���"�������0��G�7�X��ƛi�l����N2��;�����W�IM�m�˒�8��HKi��Gȓ���ERQ��*�f�HYKi #.�:2���m>�w�i��}�іF�u��HӲ�.�&��e�4D�4 `�H 4�� i�A�h�D����Fm3 �Uit���=!D�QED�&�(�f�=)t#M!4��HM2�78�tJ��m*�H��6��WwQ��Z��@����tt+�q:S�����
��Dȓdo�F��"m� ��[]�e^@��I͸���Sqh���M�\��T�������j��t�V��.�RUE�:U��+(L*����.�M�Q�pL��Q���@��eѥBWF�x��wBhN�N�m-��s�!I��Y��z ���.#2PP|f2>/ Tt�uH�0�P�R$lQQD��<(���d�," R\����!�L��2F(��������a����\��� E�4lӢ��K��EM�%��췅e��Y���(!lF�dG�|�->YDu���}��$���F��щ�4���fAA8X}S�1m���A8X�����N"i���4� �8&m mU{Η"i�*��oh�B��H���F�*P 4���b��������&�f���biWNQ���d�d�[,� FFYd #h�c� �4��M#e�"ȋ&4�����Ӎ.ʔJP �%>��ȍ"BN�#IZL�V����,6���%,��t�CF�B���D�a�!����*#d�D,��J�SG�Ab�:t�pO����Lu�H��}�'�x5zw�m����ۏJ�,6��&T�=�i�������թ��;.$_.X(�eD�ULPTYPxT`�uEʇ���UU�
�0�Q�Q ���˙. 2P`P !�`\dGZA%p��#`zB`.��p�p�h�H
�8V(�� E���Р\�dLM 6*q ���� �*�����à�h��:����|e�Ќt@: �XtXxX.)E�a�ł!�Y ����l0 ���� *d4XK'���B1`zh8,�q�0�>A�r\����� pz�
e
��PxhJHx� =h��ɉ@W_�M$i��'KP[i�e��e��=�A",J� ��0���Xe��ђSC��8֐�+e����w� e���F����,�0���`�Oa6�,�Hj���z���fڀ���])F��T��I�jq���6� -���a 3F�2Ɇ�ц4͖0�Ɯiu�iv\@�4F�4��T�ϗBe�HM!4�a ����F�7F�#i
$Mb��b���rY�2�' uTL��� 4i�����!,�2̐���^�ȝP��Y��y"l��ǒ>��yֈ�G�I*�F���v����ң��\���1yRr��T��ʪ����<a)S��EP�F^&|����uё��FS�B�BW�5 � ���.���<u����
l�r1E���<UtPF.ࠌ��B1�#"1��FU%����.L.��0���T� �0,�d%��Ņ�(8Fa����a���BE!x��B�0�#LP�Y�Ħ����L�3�'1E]�o�o���P S�ai Q�*d��Lp��"E�����0m���(#�V@e�/{�j�{�TzŊ
��L��� �a�A}�SHp��[i�� j��}T��^�2�t�%m��4Ț�D0�M� a�j�^��}�͉�V��� �<��3�L���*�ie� P0��2� Q����2�
eS0���"6��M",�ʂɭ.���Ӎ.�H�dL�D�%S'CCJ�2��%i �Wetk��Rɞ��֗b����WwY4He�$�r�J%q%��4�0�L ����Sv��TH� ��LL�W�(i�/P�ou瞉�fQ�q�� �����iL 8���;k�\Լ�Ҫ��R�K�M1Qr�9q��%L*TI`MT¡0���Q�P�LdP �拄��B��h!a�`F4c@�(�� � `�8�LT��;E]fp��a���\t���`�"��J�
�����1@��# ��� p�d����ѐ, "��\8$��HH:���аF"�v,6(� ��Ȱp���/��-X`@�:�2��� ��P�P4�F@�,�h�pTC"�hh@`�5q(
��͹���,��#��Sǁ`| �`��%�#>�A
l|��u�Ƙ2<��ߣ,��=e�M�{�ժ��ނB&m�(!,<�q��c�@�@�
2SGh�vPF�B��籫�� b�g�i��h���.��,0�����&0ћ�|u��j���1��2�e!*HӠB��3hɐ[,�M���4m3FYtƓl�f0����{K��j�R�P}��Ъ��$'�JY )d���%,��R��=)d�WJY�)i�,=��+����� ��<�Ү�ƍ8Y!*(?��� +�BY*'�L�Ae[ {��>���6�#�{ǟx���OY�'�/���~���,=�<�QWK���R\|�˒z�UT�S���*�a@��5%P�R(���Q��ˣ��RP4�Ӄn �*8ᅇ �WY�
1��ۤ�L ��� ED�bn��
�&tt��B��%��td�룧F^(x������>,���>,��b��t0B0��e��KV$ZP���&�T�b� �h軦��,e�qQiP}8�
��x:�XA�9�X����8y� �>l���W_Β�T���δ�[��PG��t��/{�j�{
�<�LNy
vzA2!2T,=�
m�:�F�K4�)��%2¾؛HZq�\i1T�Yi��e��#(8��{꿸&��yF`+�쾫m �u��8Yƍ�f�IAda��i����0�2��0�H�DYAdƔit�P�k.'zeR�,��V�R�MJY)d�iK%,��Ҵ�{.2�R̸�ĭ%e;�Ub�wu�IM,J�TJQ1T��6� p����B�
��H;Ly��i�XP���q���/U����h�U�^
�{�;�)k�����k�,&T]WUYPO.h���PR.2]A�� x\�T%�"TT��Q�q Q� .>`.*���d��@��N2�%���pA���LlLl��4#� ~�WY�$@F(��t�l� ����K ���ȸl]8�0 ���� �H��c+���p�QI��p>�[���,,:*.PPpT��sP�N0 ���GB�n� a�!��F4T�p�x�p�&B!p��p���Wv�n@���@i g�'�����G�'���'�����i��4D&���&�`�c�4i����b=@�(#�T,\i!bQ�&�X�b�Ka���4��g7q�L�&�e a��4ț��H�M'j�f 0�i��׽]�����]gm���U�V)C(l���e�( h�6�{,3d�&��eT�0��# ��iCH��a52�8�D�
����狥.��/CB�����ҧJ�w�a=��q���4�T��p� �2H
�茩��-�Ҩ�DU3�@� N�0�_����!,㬦#l��M��F�Y���2��,�&>��OY����?||���\BW*����G�ʈK�0>]��e�\��A#��L0��@T��C�*�â�K,]�L�T���*�+�+�*����(Tr �����`΀ʬTI!Vk�<�e�"�r1���N:|u8���I�V0l]R�#�*����!.����XQ����Ś�*`��� ԍ�� 
������*h��̟��P�@
H
��x8�F ��"<T�!�I�Ϻ�F}A�l����Q��^t�� 0�R �"i�$�N���Lo~�d�b�ySl1z�:X}���1b�K��Hѱ��6�S��:o@�Hq� 6�0�w*P���.�Y1Te��k�c]�
�[&�)}b�ݸ��ˣ&da��a� �i�,Ѵ� ��h˨Me (QPYAd�S��zW��w����QB��,P�JY ����Bi)d�КB0��ZBY�"i��]"�H�Rx
��2C��<��L��,0�� 0e� ����M�
��NTH�����"d ��F�F�7����d<�W���H��,�츢��Ѯ',���e�D�+�TX���x\�P�S%DF��q��`.6`$.6T��P\T�p
����\���b��LИō��qgF�x�>�(�L`�`| �L'6�7@WY��c���\%TQ`
��"��`uu��# @��@y�Q�=b(
�*��D:�`#.���2�t$0ʆ�DX`TL@Y�� �a�@+����&0��N��pP��D$�a�0ł2�V*�  ���l��C���h$4! h0 <��pN����m���9���p Áӊ ��pH>B� dĈ��cɠ+��0ђ�0��Hp�"�M56h�M@�,ZaΖ�HX�q�*.4Ѥ
���?:��HX���:Y� �2����!H�t�4h��a���L�g8�v�'(�O,h�����O�5]i~�6��X��gD��V˲�2FY��e�Y�ifF4ɦjF�v˦a3�PYCMMe�[R��Omt�J(���'J�V��¬=
�hiZB�ѕCB�T�Vb����F�ct�S.��bgZ@��f��,�%������� d ���eY��!k*^n�Z����lB�1���p>��Av=R��g�j��*����D
��wK�˼��r
��X�|��A��.�R!w�0�s��tT��ˠy��-����jC
�p�Н8F���O]gN5��'KX� �.��m֋�t��E��
���6����O,2|����:8��AŃ(L,0�qaV\0��U0��Q
,,H.�`FiA�QŃ$���IF� �!����0ҁB#/2He�H�FH����G]�o5�!�c���B<N�a��� F�b�����4hݦ�6�V$E����$M$i�,X�T� X��a�F��lN���'i� a��K5:�@�CgC,u9��0���nHl� aƓ.�t��,�w%Z,�T��z��-]ke��v��uK�@��FpM�F�6����&���m&@��# �2���m;� &a��R�������Om�LY3(��J����,!a �&� ���y碰�B�=1�
���SvL�B� �,q�a���4� ����S]a)FXet�2 ��dI���C)^�`��6\z��K�z�u�O{��S\MYa%@ܪ��T�
�U��EAXP\�e�e�K�\dPˌ.$hHJ��L\0\ �F\.0 �4&".�X0`.�]qP`*��? (�8l�e�`���D 0!���*F$`�8X���*(Xрl���P�!��� ���B����B!���pã�2#0��B�%�
�d0L`0�e�"�e���l'T�D$EP��A� �X!-*�q �QQ���90x�F4Dd�!�0݀vې0 p�h �U'��)���y�@���Dqu��4n��0�F��a#LH�i�M����LX�bt��� X�c�,Ĉ�M0��hѶ4� i������I a�I �i�ClHHm@�e�,�w+��bƋw��iW�&�����R����:���T"鎰0�t 1j͋,#ifM2i3� L�u ��2�u�PY��*��;�SӴN�#H�L� )t&�Bi)d# K%,��H��T�QR8�tk$,�x
���8���7:X�L0t���6�1���Q]b�YY�e�ef����V�g��U��k6 g�$������>�<���j�"j�J�*!*�Q����p�yq���yQr�����t��C$�%��<U�� �a��L�A�C+ :4$�l0���$ �9]gL%c@����"�Lu4�uVu w8,���p�d�i����� �tI ��T�0Xa
��FU��L<�32�MR�ˉ
.hزq�a�� "D�P�h� ⡒@���q8��1�sE���\Rj���j
G�DΏ�H�$Βt��Ae�@W_Ͱ�cv��$h�b&�4�~u��$,l����,X��,X�,>�LX�aV)HX�a�L0i�4� Hl�a��&B�ٓ�� $6�  R`Ӆ�a��T.�̳ ����}U�mp���v^�e�����buR��R���J��}�ʹ؛e�a�m2i��YCL��QPY�d
v��V[iJ��ޝ���u�
�B��OJ�d��L�f��L�a4��T4��{N5j�P��s�O�}í�,� 0�C4nѯ����7`+��D�@�d�`�c���<�D�#�SD���m3)މ�����q׶��kU��]y�Ģw�TH��Pʢ��.0\6\`�%G�q��2T"*,T U�L��|����pA�Ap����626P�GL
����E��t6CiW@�Ap��� @hx*�EE*�;@D� ��D�FO��@/��4 E��6�@��d$dt"0 *�b�Y �� � �p ���l�� � �"�e�(�ؘ1.:8���@:�h8P�pPA�a�&��B@\(2ll XX68l�p���Tq(
���܀[��!�2#9VL�LI�)"&�'D�8���nҤ�jn��16-",u��4i
�E�ӱH�*�i�,X�.?#e�f�?6Í1���M0x2��f�`�aƎ�"iJv'IN�Hj���� X`�]Ƙa��*�hӅ�T�uj��N�KPֶ�ޫ��e�q��D�i�\,Q;� ?U��4�g�a��}�ުjf0��nݨ��U5;�m�'i���Di)d̥N���(zbɋ�.���b�-���L�UU���� �]�7HY#)H��lHl�d�������� d ����a�J���@������-�dA]��K6"l�`��`���Eǯ*"R������t�U��K������"� 0�B2�J�R$H3"0T� �d��eI�V0��C�ʊ� F�N� ����� C.���+���c,8� �B�+.�0Ş�����C����HF(��#��R�*��6|aA�%�Jiф�J��,����^*��X��ac�č�\L�V,pӣ���Y�� �Zpe�*�2� �*���췐�����By�1�uO�m
'�@�V`+���RɳM*n��IYJX��7�.l���L$,tL�Ub�#LO �δt��~>�����N4l�,6��L 6i*sf�5� 8� 0e a!�`�@Í0�@Í0d˫kz���R��B�u%��C]hU�}׊42��5J�v���u_m��F�e�4�O���v����,�����]:�����l�N��L.��Di�#I�&,����j��hNӊ\R���]%Ơ+��D�4�s��4���!B�G�Ha�������)������c̔DJ�'"6ʭ�l[Lݶ^
e�i� m�u�`�׬�&.,�R�����UPV.*U¢��D��qB� �qQ� � B�%�*h�P\хʆA�p�wL���h�FE��qt��E��2EB =26A2p��6�L'����$t3�**$�z��q�EŁ��ap�4td#0\\% ��F ���# ��� �acS�Ck��XT�PtUaQ�R"�B�B��`�t�`�pz(��P"�ԕ ��B@�(> ��lHp00J*4B�[]�$m��2�?�A����"
��� TN�"D@���e(�&����i����S�h�N4t�Iؑ�"i
�K� T�? �H�J�B�Ɖ� y���8����q�f����d�gM� �7R��-0�0�; 0e�ChP� 5Hl��a� '4���^T�c*��]Z�U����kݾ��RYP�뭳�4Z�M���p�,>Ҭ�}�o�YBt�2�k&]��r�.Ӎ�Me��2ۋ�q2vZL�&e �P�fS4��ZF��v�n�d�&]:
��OL�j��B�RHl�d�v:i�����
��D���l���4b���c�����<Bݑj�h�ï��p��a��X��d|�ʐ��!*�p�Q2����R`|��Ɋ�0NU8�1��%.�q��‘rb��60�����,�i@И�˩4Tm�m���`+��Ęw[t�I@ b�e�=@��N:���,��Ba�D�.�Ҙl�C���\�Qb�� �� ,]�%���B\�tFF+H,��8�@�0㣧>|n0|ap��j4�!R:�0��feϙTˀ
�@Wv[�d �##<��3ʓ��(|�FHY�����0��Ͱx0��DŽ��JҒ�G�u��R � �a
�= ���l�NxL�E�� y͡q�c'�RX�`���,u��Ά�m� �’�0�.���@t���6�� $%HmZ�jիp��^�թ/]jU��}���RQH�L$,�0�f�e2͖{�lM�O������ꭴ�®8����T��]�.8Ȓ;%ь#2���ZnݵQ�n�d�4&��Y�5 �U� +�� $,ū !`�F�a ���a�I ��2���`XThC` r�1���v>`@�8�TO^�<�tx�����.�v_���s�����+���WG����� 0 p����:�� ������H�4�>|�p��*$#Df��2`x���i���LN�>��� �H��i1�H�Hȁ*G��^P����.�I�!A +�
��ʊ�"� ���d\ϩ{���T|�Vx
#���7·�Aд��д�(t鶃��dt-��@&�D�
�L�R'>��d fQ4H�F����^��:�U�� �T��T�uOA2����D�ਪ㪊�]`R��Ej���AD��:�c�0"lB\��b�Ř ����W\UpNf8�Y�U&��T��T�����f8��q�FU4�^6��u��ZT�c3+�*2񲃢c��1ƇE�P~���A�FDƜ#N�B팸,0�d��%?�iTt��NM��K%���.L�ץ]"��D���ttJ�F��P��� �� �y����Xp��.~É�.}��uî�\���Ç����������0"0�l �O�@���u�x
����`*B!������:�8~|6}c��ϪN�z@^��s
��,|�� ,�#j�&QP RY�UN T��������TJ-��%W���7D��MH�1X_�����0t�b`vzx�GV:��t(:�FYLH�fDi�6@���:��R��k$I�4@�W��!u��:�A�RB�א^���P��J�*���!t��gV���)�?���
��m���a���*��NG@"����W\K�aI� 60(*����fffff.���qq��8�ۃ1��c1��K��.3��iq��K� � <7hr70�Ґ�p���H8&dң��$ �\3��^��ʜ,K%��9%��d����j:E��D�%(�&u�:٤m�WF�!q ��~}T??H� ���,Ç�:���W?:���ϼ��vE�"�EB �2 A��@c�9���BJ`.  ���������� @� �8&X>
'A ��h��T�����O���DJ� 鉒)`x�
���HJ� H�*�'��JSh�ϦN�J@Z6��{����R���.]p�D�*.T�qqE�B��{����`L8.p+<��I:�BӠQ���Dq�r��eSd�B�UZe 2�S�AA:������q�ouC����1����O{�v��N���a07��*���@�TT���/]`R�(�����'�'�� ��', xv8!��W�+�%���Gt�ʦT������y�ʣ1xニ�Bꍸ6��fi���80�Ӄ� 81,R4�a��7!�Cj���� �\1hp��`�����8�
'��t���u�$�.}���GGH�;-�U
�蔠��T���>�B�
T�����~~~~��8Ç�~}�ށVa�
��������!4P0 x@d@�j(��¼w���� �&�6̈́�D@�P�8|6}����>����2�T�$ ϔD �u-ID$U J���P RZɭ�8��=UK�����;t�� �X�0*��ĬT
������<�a )RP��rpzuc�Q;h��8�eY%L��ɖJF�t�4����Y2�q N�'u8����,��B·�t>Q�C�VRR��?�x�����%U(<$���<������tm0�&�PN�l�}p��}�(
��u�Yc ��a�1x�NY�g�����T^i�N ./h��n �3\i��ۃ- Ɣ�86�i�}����F\\Z0�m�s.Tq��1�G 8�¡uƗs��=�Bȗ>����N*K&q
��k#�Y%2���"�*��ys��]��*�D+���z�T���&*l��Ϫ}S�`��>��O�r��h�@`
�fK���>N��@`�pp� 0
��Eր���?����' ��.!A���M>@�� �"���$���R����R�"DQ$FH�:�
��D��)�a�Dѵ,���6��� ���Kb�W\TH\HX�\LTL�Qq@�\l���{�[�g��`��Ӏg%��S`ܜ ����J"'J�8�2cɄ,�B�S���@�2��<d�(fR2m�m&P�9�������:]�/m�<-�{�5�X��9� T��
�X4XȤu�J������U �J�,���X��,|��P��� w���.��ʦb�
,YaX��0��]Q� �32���� .3hf6��c1ƆK�e���q����# ��,�vţ ���5*4�p�]����#O��'b��N U���'l����%Y%"��Q�"���(��J!(x���.y�� �z � z
�POϽ�AA>��O�~��\>�+�z �@W`E]0#2��*��� �LJ �@��$E]a^����l5䡒R���
�c��HF�)`q��`6�|8����
�H��27Ԋ�Ȟ�'J�e
� Ӻ�4���Ŕ�t%{�Ak�T'R��XN$�`^$�L�TL��&
�-��<�������dBf²t� �zciUFm*���Vd�E���J�R��ά�@���=��ʴ"ugDN,���� RQ������$^&>Ua1⊔Ya�� +�
yO���
���D� ��<��,>�w���.� �pY���.����P*X��p�a�3 �.aqxۃ1����.6��anj�,H4�>����cj��Wx��-����N4�а�CEB��$R4�����b�s�N��y9DN#u%+��L��U DtER*�VaV9A@�͠��q
�(([>�
�\�H�Y#�d�8�
P�<��PPP@W`<�p�s�pP�eG@�p �|�0� E.��+���]���@3�A A��A���Cˆ�P��2$���T�I�D>x��"R��0.�qBt��@���D�%���i3`>(L�U�y��VV�/Y��xnԊ �`T\��EJ�p��ˊ��}O�q���� �F D�ܔ�2t��)ī2q02Lu+��� �d�'R�rShĒ�#�Q�q���z���Bd���G 6��Iu�R�^˕��Dʁ��b��.P��K:(2Z���NQ_����'<�Ю�y�]�x�28
��u�����p�aqa"�
,*ࢃ33331w��4eSM�pf6��mq��%�1.p�P�C�,�TuI���� *R6�Q�#m F��.8�iq����ذ� ��)'l��ޅTK0�'XU�
�BQ�EQ)aV>���6yéϕ>U�O8��ys˜�q��D˓8ys�q�����QS!�/ F���q���|4��#Ƞ+�+�W��3�F#y(@B� ���(�7� �z }*�A
g�&T�iC�.% Q�F Q����PZ�F�d�& �P�8〽3����r��%U�Bg����u޸.tT'(��N��� ������xx����bD!�(IRR�#u!
!$������
UQ�%(�B��>����l<۬�S�6�Qb�JtB��{ԇ�N-
�aiGJET�
J8&�\<YR��<������N>T��yvAac��$����W\E�3xà �0�ۂ��6,謰����&fU4Pf0�ʣM8i����2ْ��*0�ӆWT˃K�4h��e�%G1�da�W(e��Ş4����ؠ�b�N���6���k&]%���P=���R¬*§�<��Ϊ|���6��'Ԡ{��d��� �h�bY�y��8rryrb�'�<�����р����h���A0��.� �%h�̀�WV��Z�0�u���� Ft�������$��f' Q��0j��0� ��, !@P�%�1:P�)20���B�O�6O�%m+�6���$hF�U R��ަ�"��\PH���QҢ��LYp�c"�8z����-�� � N0<
 "�!hɒ���H�"$LtGR���8�:JN�a"r�� ���S�R ���;��(���"t���� #���;�R���*���Q�C�\�`���H
��5�+W����ɗ<���4vyIƘ{N�]!,w���.陘�Ӄ� �R2PQ�Uń�Ef30�Æ�*4��E�����.0�% <�fW2���WRep�#j���#q����<`Li�.�T��J�\��?���X�\���B���J�
�(,X�{
�B����ԝU���*u��@���(�}s˞\��I��b�s���P*��S�g':\�|�ǟ\򓯀����2T�ZeQа1 6���h�$� +�+�W�� ��RFX�'#T�/%x�%"2t.��(ތ0��B � P�J�]m�C�T�ҩF%��zp���\R�L����h$z�ԕxm�xOu`�H��R�����,(x������X�: (BL~��"��(��#��h�4#eJq������@��>�T!��C�Ul<�8�:��,�,iWCՖ�� [YХ:���CʉB�T�
�..�HB(��u�O)�������d���;>���(^��
��u��fc�FU\l��s"B���:,��ŔpʣJ�*4���.eQx�^iq�M8a�4����#N .0��Q��]sg�TZe��C-�LE�h��#�b���d��H����K�q�%�S8��%�T�S����8��ؠy��I�'\�GK�.vr}�
�Ru�Z>�+ϮFٹג����'*u���{ U��W_��,:`H�Fd ��ma�= �p
����*�ҀJ�3��+���]�����i����J �&$�`6DrpxlR.�� "#D�Rt XFm "Pё%U)�@���.�8�#2u-Jv���Cj\i�.4҅�iH
[z���%bk.T
���0&��(X��{�� ����p)&P!h��4eQ"�Dh�HJ��'h�ĉK$��##B ) �e)2KN��̡P��5T%N
��I��XQW[}:f�⫁�a5�Yr�i(��A�@O,6(ࡒ��*r����Ϯ}í�*vx��)AD�����]qt��3�85(R34(*ႆ"��\Q@��6i��L�..�*�\^e���&�1Tґ�L�4��� 0�� �aS�#sl���T�\��\�\�O�b}s�,n�Ƭ�IHY�J'.��t���p��띓�}ôaS�l�D뛝�;'\�S��'>��䋝h��G�'(}�u��@���ϸʼn�����B��.�F���6!��a
��@%�@WXW������PL��D���8l̈́D�X #zP�5Q���0B�JP�UQ�Ъ� J��u)�$�B4/JR�a�] ��ڐ���Q��UV Vz�2�t�pI���� �IQ/��¦���I�HQ :���%�"U!"'SH�b���]V�Tab'�Ѹ�y9D�֭JP,�*q��:�Z�'A��R[(�P㫅k6T-�(*��X��A��B%����)�?���'�;>�'ggg�>������W\L6*ч �\�]Q�ƣJ���,(���΋,]qFEb�T^/��ʢ�N �0��L�0�e&\2�� 14�%L�4�ӆW1hb1y��"�1��K�p�f(���e�IH�'X�q%�X�'p�S����bv}ruδnu�"��\���777'p�c�͖:�:�l*}ssrw��U��#�
��B0��N6�< @l���
��$�%� 0�⋭]���
x � `����04��dd`���B�`-ͅԈF�u)2Pv��@� �
��D��(Z��P�O%J�(ӡd�:E M�l��ԥP�JG��9�T�����T��B�F� \H�`|P����{�=p 3���N$��|y� �O`D�
��@l�� �RT��!P"А�Hh�Jy8Z��@P�d:��!t�'N�@
��J㎉:�J7���l�D�듮(����UUThL0*xX4( Z���Mb����м� ��
���\���h]i�
��uĪB��������F�x�AGEtY�E�,�M�� 8/�ŗ��82ѥ�S�̔(a���4es+�LM2.��c�xӃ��h��� *a_�b�I���IL�u��]3�Q.��ĥ�.�v,I�>�;�ʝy�����h�*x�2r"�m<��/B�uɤ�N��#:X���K l��4�ⓅO���+] K*\<e�DN����x!t6! �'�E]a^����� F���p!:����H<�LL�����GR��.�dch�"e:P�W�U8>��B��'m8F�fA��IA�7BT�Rڐ�MHF����H�P�UJ�bk �� �D�����IC䭡'>�c�6|�l:��2�%Y �D!�K0ad�j�J�p�*��U(P�d����:��k�B�p���v�Jpr낁@���"j•UR��*T\:�Ġ+�
yO����!�δu�<��gg�bŋL@W�+�"jETÆU2�à �.f6P�.������b�GE*)�E�3T^/4��a��� <���LL�es.\i�.�40����a�EL<��W0����Bw �F�jwS��N2�[��y� �:�'�>��ϸN���^N���my�3�$HJ,?�G��P#,F� �"1��$".qva狒�8T������W_� P.a8�L0 #(А��(8`������ � ��ր���Ƹtp5OΨ6���L�:��h�TNT�ZtҒ%(��/FF�f��,�H�'�D�8��,����>�!2���ԁU�.������/T�@��T��F($Ub�������ľ��� �`܌0D� � �l|>}V�G��`�%�#F�"T ���
��h@֔�9t����u*�N�y� �� 8��u�@��u
�*p&T�N�%WtH�f��R�VZ&8(��qwE�� +�
T�����Nq��\��|���(zz}v�����W\WlÆfU3p�a�1��c�XV+R*���Q�U��TY� ���ƞ6�� �4��fa��y�D̸4���*�p�a�ך*0ɖ�)�*eI����K"zEҽ�
�e�K�HY狝��vyS�1>��O*u�Z8���o6&N*N�*�Qb ��g�(F&A8���ARd$RQb13�4��p�1bG䋓5]
E�:4!X`-(
�(J �Y�?]a^�����'��8�"8��FN�@����1�N�Ξ .�u��=�6���d4��Bԡ��P)R�!ed�+��ԇ*]]m��Լ"(�p�����
�k.]��r����h����O�>��#�"#av��>B� �5�#U� ��´e�)h„���d��pt�΃�P�R�p��ppӮ�Ge�\(uPz�P��������У���<����L�ˆ=a�� \�C�%q �����
눒c1fL.a�O\qq�ƣP�l���e��p�QaW\XYS*a�e&bˋ)�lYqx�b�x��ˉLL*b.��&"�w��lT���ˋ�/���B�B�
�Y إ{�"]�X�e���h
�*x��
�\��ד*p�1c��\�RW ���M@���e�$��4B�b2�ʼn�\���x�1bi+�m5]�{���]Z�<��� W����#��ǿ��ր��-]Z�<�,p5�R��HӅi��:B݂4` HHQTd�@v&%h!@u * �1�����$
S'vq��N���މJu Q�P�
��HqJ7ZP��w*����,�R�|��Ae���K((%�{��@W\�&O�f8�B@"< �i@J]#A5�R3��P8ڔ��P�CMʊ�L��A�1� C���#a�@\��1��l ��l�l ���1�8h:�A8���\��/@Wb�I�@W��At�R��JP����N�u�ʥ]�ON:U�4��L�gR�"�UF�G�z5P�,yry<�O'���&T�S��}� �Y��P.u�˜y�"w�T���+��6&@��q����� ��燡艑�!�P�:\4.у���L*� C��L-p=����B��0����b'�b9���D���R���;]a��$�����06��#PQ0�Q$"o`����FF�IyTa�n"%F�'�.��e���sn:��6��
�\)� \(�(v�X��)R�
�(!U� ,�x���(��@�UD��
��:@�)B
h@
(g�4���Jm����%�]0��JR��UKn��A5�%wJ�IE�(m��.��$
��.�\G�i�#��:��)��0 �S�€ˁt� ǵ`+��C������eJ5Q*�Ǘ=D�P�.��#EO<���zE =3��J��j�R��TtK0��I����瞀�<�u����Y���çV:��Ӯ�(qI��܀���4B�
���?�"p���>�Q��:F��I
l�bV�
�.N�;d%����.W
�B����2!�) TE!y���l⬱]6u������P�$w����8(4
L��0���VFJ�2bfA�ciD���R8��`��R��Pt��B��p8�e[H�(6��'� JS�*�Gҝ+�:��Ku�R�E�9r��Y`6,P�� ��˕t��_��׀$у�b�@��s�a�D"#�9 B�V�F�YC �2��2���j^��T����((R$,$�$,&dXl�
@�\MP� ��R��!�Fp\�|҆��t G�tL4�qX
��0�w����L�%�Ϭt��Y
��H,�I
�@�;��L�UKeK+��Y%%"��GD���<�����(}I4�q�C<� � ��z}� �:���r��"�.#*B�tLA
� ���n��8N��I�6�4��Ԓ%\�B9�m��G��‚�Q@�����:X,\-\D��JI:���*��g`+� �''�����% $HU ��Dh�JD��f�*�����K$i3GT=��HmD��)l�B�(Y8�j�!Qp@�W�P�Q���C�u��TBQ��UUP�Ղҕë,T:%-��W^A8�r fH�8&�> : � IԶ �e@X͠v�F��L(u�A⫪ VtH�tH�* ����
��Q�J ���%��H8�0�H�A�a�� �5`+��A w����D�7�Q�zX(��5(�Y��ĘU �Ҫ���ކ�V))D�
XY�XX��'���T*}d0���Jt맧���:yrw�p��׀���c�4F��Z�ZX**���g�X��e']'*N�#dr)3d�H�r%����U6P��Ʉ��*�b"�!您�����mӰ� ��;]6u��WT���>� � �H
���/0@ Ȅ��n���ɒ�����ʔ��n���T$ɂ����bt��)2Eғ$q2p#�J��B6�S�NL�f�r�iJ�(U�[a���uMe�Y‚K ���F*Qab�e(\�\H������� �pzNb@rDX������N�0�F����H�H��2�=�S��=U@NV**$,\�,L*6( ���0 ��� �l
a0F�6�^�/Aq�� �D@c��@Wd��2����l�FX]��B�'�u�*�U��+0�M��(�ŇP�B�*J�yt0��,A8�<��u�A==aV9<��N8zu秬:zNP��]>�u��RH""�ˈa�$�<��Ǔ<�LۧJTۦ�&�X��ӓӫ�X�BUM��Ν�X�@��`�tLB���q��e� ��8���S ���;]a�^��0���<�Y�4K#�(���R�"(��%���q#I �.��"��=!GR�,�}��'zqwTU���8 q�*^�B����*�-UR��ްv�C���UaIP��K���1S`�N�� �
P�Ȓ��BP��R�Zn,�+iJ�x��t��uP����k�*
ʅ%�
�����`6��É�xl�+��FX&#���q'Հ�ʲ2HZ����PLQ*�D�*%щ�Q�T
�z[K�Y�(�R�J5�.�JI�P8�s��R�S��Ъyc�>��
PN.t���y秧�C=&�pꓥ`+���\B�B%I�X����<�瓪J���� �#y�S��T�S��(H��*N��I�%RN����s��p���ʐ��8L�,@WM�|upC��t�@W��pZ~D Ղh�(3HL�tdHA�"D��22u���t�I
&:��8�� ����Ѩ��ӔP�@%6��\iHԨp����JwUX�@6.&�U�r˔t��@J\�W���]xDF ����LJғ$:� IDiVi#`N��"��4v�'*�N�u�LT�@(,$Yp'JJd4`hLЙqP���`�e(l�M��7� 6�D����:'HՀ�ʧ'-]������Tj��Y"�މ2"�T$D$Җ]L��j�����u!F(�ac͢X��T�P�ǝa�Ub~}�]��<T��T����u
��aI��������.AN�A>����P��t�bS���#h�L�G6��I�NXۇ����\@�:�&�6P��g��*}��8� b�%i!�
鳰���&@W����� X]�4��!DQ0� ё"(���ɏ&zbteP�"(�F��"J�$I���y=8��S�۸Qp@�Ԉ���r���uHZQe�ҏT,V�ug�^P@U���_�����0)�ғ��UB$(��BѪ�"D
��x,�2pl��u�uUbK, �z�ܤ�:2ᐠ���໢�Y�F�dh�\C�� �2�p���� xa��V�*|'@W���Y2� �u�O�*��*�zeR�"�^�de,��ѕED�%Ѭ��s�!��y�I�=�PϺys� p����'t�M&�N8��Jm �:�h
�����S��pړj��ۤ�%Ǖ�m�(�D��X��k�����aE$��'�<�)�άL��NC���S���H&p��2H
���}�� ������j���˻]f;����A���9 iIR����L�d>���P2y�r���A�'S>�����"h�p�H�rd-�'L�.��(��p:�B� �p}Bu)�yEW�UeO�Xp��PC**$4%�{��@W\�m���LD<x!������մ @�l�(T}�!�'KL벲�Dē
..���<�`� ��&.X��F@��[����\� �{ @ � -����?>��/W� ��� Ǖ�������*�d�L,}S͞p�gW@�#�J�7Q��J:2��GD�*W�u �VC@����9<��@�����D�(yReM�M&�O�M:���6��,@W`���t�ӒwN6BP�@��䥇�<z"T�9�a���%y rF�*<��͓6P���!h�N����:�p� ��Å�
2H�1�
鳰�lh��+���� �S�����,��#��,R�2�cl��2jRd$�*�#/LH���*��(ȅ:̇�,�<ۯ7pyʑ��ͽ�.T���]P��� VTL>Qe�"N ��<S��Sh�:�T�:D� j���UYI]@
HWt�N�h������VT�u`j��0nUH�7�eA��#hӣAh¢��Pp�(���B`jX4N�j�WeI��,j�����GH�5Q� �R�cʡi!D�n�zE�*����K#]��$Y"��Ua�8�;�],����@�7@���8�Ë�I\&y����>��ر]��:$xH���8�3�k�ɜ%h�X�L��*q��Q荒!b��%,"yC�Y b K�F��ʜ�(rq��>�a�"������w�]6u���s�Z�Y��W������5<D#`!m)����̽2�����@>�7`y
��&ɏ&Y)Ġ���D�:��Gzv�EK��*A9Ɣ��3����"�N�'�)�\��WY8��0R,�q��{�+�QN�B|
���@��Y�T�L4N�ćӁ$�7��`dU�K,Yp2 ,�����*h�C�P(L"�L��A4h�) �����\Bp$�`-IB@Ç�@"`+��3h +����f^��VB�%O���^��d��zJWR*�d�#�R��t�F�7�u*�*�p��('(\D�TT*��T�瓠]�ӎ*M&�p���.}:KP���NP�μ�g^F��I�&\���)bg�%,=Tz=�H!,=�� \��B�"d�=�XUذ���'��>\D�"F +���WXD@%��W��� �)ד��R������ɴ�ĩ�IU�V'��*���D,��J��*�@�u��2mh}�T�[U����)z�ꂎ�Y]8T��TU�0������.".��1E���ב���:T�<`L�<F�@z�t �-8;L�`Vh��M�.
� AUV��Ie�u� C.
�AR���i(Єac+ ��\`  ����-B P=�`+��G|w���2��(�!R�t�I\f���"U!DeP���Va�T�R�}c�1@��듸rqS���NM�qRw��F�:��w�N�>�'�.p��ζqîq'����1@�:�^u�^tL��2���6X�D��ĥ�ԏG�6����T�q���m��"�'"h��W�y��6t���`�fG�%�m��:�t���]R �nr`�z��M���  ��f8 < ��H���z��(����S��%8� @�"��):C)N&� �GBJ�)h�b鎦#P�@ �i�%mf�2�%)��뎬��:���J�-r�A��D� �Ć
����]rABrp���I>:`�B��<6��a
#��K��N�U���T�P��� (LTp� ����'�A �q��A(�CA � ��J4�0���(x� �@ 
�LvI�L@W��кXR�Jj5S)L�b��F�5(ʢ{0����Y���E�=8���*N�:�gg'9998��H��#��"9*�y��=�s�O�:�<��x��
���'p��rb�7�B�}Q��Ț!N#\��9Q�����D\~>�A��r2"��"T�RE$���E6���g%�DX�rc��g`+�&�+̠����� ٣�G�Dm��>�d�R*������y2�ǐ�����LD�`�3Ѕi�F#� *�+QPT�R���P P�;SxV�c��]P��.�tP<(�@��B�|u�@xT��*�)B�������$��҂�WQ&�p6���r��n *�x(����(��dU@�52��j0��h4��;T�7\h�) C-��`��D�����j�WeZ4��
����>��uF\fʩl���
#�u�,.�d+$] ������I�*N����ד.L��k�p��#D������{"�T�C͞Ru��\��v�:�a2w ����6X��12 �E�T��D��~F�}Q�G�"(6?TF���4�L�$l���m��Sr'��H�;�@P��8�3$�`+�ξ��O��p1�
���'�C�� Q� S$*��6HF�M)*@RFH�T(�U�j"T+�6�
4�Ѭ���Q�>���u e K�B�׺� WD����$)YUV\�X��`5�]aQr�{�+�n8���M�*t-:C`����
P#R�2Q2�H(D��Հ�:��YH
��kEÉ&&hh$PT#Xh��;�a�&Ah�#��ud
A�G������?�9A���U�+]���as�R=*�S�*͛*�KH�5P�����N�d�����瞟T�ⓊO*vp��ל���J&F�3�ː͸LP�θÄꓼ�ÈW99A8���@W`8��N�H�"����? �H!�a��������JH$&OG� �  G�@��
�*@���*nN���q�D�,"p@�F�t��
� �
�'�+���lDY
%��J�c�^��DFЪ����hތFè�l*�}"�D�BB�0�:�.��U8R�E�1E풩A�+4]uPt��R��a��(R���e���� ���X&���]y"&\�>BT�;<��fN��U:��Qac����$���LiC`�*�M�PU*���a%�<]R��R`�!e�APj��]H�:lh+p.! ) �� �>d
B0VՀ�ʩj������e��N�dtK#U"��D�:::*B��BQ��=��=hC>Q �g^JT�m��6X���䥉�%NqRf͸H�Y3���S���L�3��m�������\���&��[#y�"H"����Q >�*, �Py� D C �G��G�A T�RH��O&�Nм��P,pT��� +��@/c{> ��@@�@��
� ����H�@�������@@@@ �h����P�y�i����(��eu��q��!B�
Me���ض����}���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������]������߭7��c^�|�Q�q�r rrI$�I$�I$��(��(��,��,��,��0�M4� 4�N8� 4�O8��5�4Ӎ8��4�@��8�@��A;�A���<A;A�A���@@;C��@����?<;AC�=C�<C� ��;=A�C�?C�4��P�O���AŐ<? C�4>A?A;C���P�P��??�@��<C��A����@���������m����A���}���P��y���]�O� P�U��P����C��C�$?�D?%C�?%@=?���?��?C��?C�<C��?C��?C��? ?�?C��?C�4<C�4?C�?C�d=C��?&C�d?C��?7C��?C��?C�4?JC�4?
C�4?���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������??��C���?��?
C�D?C�d?C�D?C��?!C�T?C�?C�?C�?C��? C��?C�;C���?��?=C���5���;<��O�P?��C�?%C�t?C��@;@����C��?#C��?C�?C��?C�?
C�c�C�?C�?
C�?C�?C�3�C�=�P�<C�=@;?�4?@P�� �������A?C�;AC��A�=;�C��C��A�A@�=�� @��=�=���8�A�<��@���<��<��@��<�N�P<�8�4��4Ӎ4��8ӌ0�L0� 0� 0�L0� 0� 0��,��(��(�J(�J$� $� �� ��a�q�a�a�w����J��)E)E'��O��2��h΢
����ǃh��F�3HУ
�#y�#�L�3L��6�d�XYQ�+ ���@*V.LDX�0+&p��U�.�����X>\�.:d:�j\h��E��@\�Ȉ�!��.2E�%�C��$R���4`��?����(��0� (�� (�� (�� ��p� 0 *HH���2�xh�i`E�рÁ(p�`��2`\��d",x\$(�B\E8..�!�8h .�� _ �B�冋!���%���q1�`�.����D F�����Fb�]���bdFC ,�� �D�[i�8,8Y3P � ��P �V�<H@5GB�L8&D�C���GQ@Q_�0@�(#,��J�0it��0F���9$����H�#,W�42F� R%���<���4a ) Xq��#6h���I# B6���9�����3Bis��B6� �� 3&˟ye�t�%�(]b�f�֝T��zZ�2�s Ѯ����:u��L�3/����}2͹���'NI����T�۲�W#i �8���j�����eQ��fK%U#� "$��6�@QwP�^�ˮF�P,���${X`����,��$J�Q")�2&�&i�50������0LQ�D�L&ra+څ�(�Z.ڢ5��ӸF�-,L�`L�0��W K *X..��tł����
�XPZXt�e�Ld��"�d�:e�E�V�"��P�@�4.# �L<h< L@QY��9���M�UT`5����8�AQ��. �hh���(F�J"N]9t�%���]9v�)D-�JlUifE�FY���,|X����DE�Q�b�'�*�G���4H��b���F�S�`�RɀZ������@j$
�:��h/8��y��!�ȃI��Q_͕#Hhe�#,�) �m���XR��P�aë�N�9e��ucK�XRY��]�X��F�6��,X�0@�'M8�:Å(�&� 0È,���Wf��'Y�id&�] g]&�����rˬ�0V������f�:v�ޢ����3ʠ ;d�3���^���{��}����2�����e:�4��Ҳ��&EiT�j�vVi��&r,�ժ�.���"UL4V��×�eq��FUs .m�2�ʮ������OEa(J iH�4���)�6}�ТȓF�0%&@���#�d�zfYdz(��z�����뮀�22�� �1bh�,�J&..\h� L�,6X��ˢ,. ��J\"2�e� ̈K�X!&d4᥃�x�C@�4!P��faDPVu� ��Y��` d�*���l˯$U�xT,`8`8 ��@�8�hF� �A1B4|�HM)��B�\#&���t"���N�YAa�� �q`ذ��г� ���@�EAx���\<�B���@, ���DJd&2p�Bd��`y3P@��$� '#�S��$-��"�DDl��t����`���+�X�)&�
Q�ew�2:��'H����h��Xx凰���sIchͬ:�Xp����
�`�e�\�e�4@2�cf�@`�/@�K�����i�KI�뮖\�����.�h
+@��uN6�$I^�r_v�4r$l�etoF��o�]�f,�^���s���fR�N�T�Ҳ��$��2�J����]��zw�rzzz��cꤡz�W����2Ň *A@���l�d���Wq�$��������h�D%m�h��TF8��H��/LL�`��=�����)��Z�U
�=Q���W�
�(X.&�`��e��ɗ�� �Ke�2�NX0.�q9vˏp��y���.�+��l�q�P�A���"�* �`6��PZ���Π#2>�e�i�l署m�N���&�da��k�!2|�"$COd�chƖ.��qC�N�b�L4d]�� dU(�"�,�YB�K�U…�� `4P��� �Q� �U�m�T�v �2H���E�M��h$ ¢��p���X;8#=8#ED�U,���̛F���aFL
V#e����BXua3�zoaƌ�^�t��X�KG"gGQ��^F�� Bɱ�4f���NYw�� yT) ��`���YzF��4� �,���],��Qκ��(���a
%��m���i�v�h������]���F����&e2ϦY2Ͻ��}���N�juR���e���zFP���B����ܞ���ޝ���df���e�]����4`��.h��H@[����=�
*�2��'Lj�(�#!Fm�2递F�aJc��F�c�Ѽ d�=5%3�4�#P��T��"�s�����F˙&�s%�Ra��'e�� &2B��K�3!���!�D́��B4�!!sE�"��L#, C�� XFC��@(lF �B��0DA ��� p"�"@� �T� #�=)xȰ�Q�J��| �A�p ��1��A��
S ���#�`��qF.v���b��i�����Å�b��Xh�T6* �L ��� ���0u��`/ ��\@�" ���pb6d#2��#� (�@Q&j8�� B@H�$A�$!9�ID<��"4BD��Q_ͣY!�F]��N��YB��,�6����]b8�l�m
åM.�رa�MGQ�du�,�0��F]s�aëM�@t�ck/a�1��BYq� ��au̽:FW&�E�Ld�"�]uԆz������&7߻��e����3���2a1VL�e3/���{���1d�^�W�2���L�uS��"e�,��v��"� !:���FR2���۷J�v��ex
.�r�,8��� yƦ�`�� ����������� Ҳ�L��G��/M:$F�0Z�邶J�-zW�/L��W�"m���A-� x�pT�"aIg,�l�\YB�B�.�� I�\.2����e���2&2ْ-�Ph��CfƦN '$��(,h�e6�PVt���#<e�ެ���Z&��OLH��A��N\��#'��F]�&K"x�.�]���M(�R�.�UJ2,L�"Ʌҋ��r�B��c������h���Sa��3�i��4�6�p��K@]E�M�6$�# ���f�:iV�!d�`(��4�åP�FX�v#�� 0m�l�Q��y��z�O�F�5X��U����D�*�X��<��M.����K F�d�0�����as���뮅"�K3BYs�F�Ld���eK��JvS��g@Q[\��~�Km2���������i�����{���%����NM��:t��U;I�N�v�};G�%Y�tK�Fݷ6��{v��O�a!�
.�i(Kew��6���H54t�#�����S�QXJ�:1��&>��P=C���鞍
`PF�D Ӽ/i�v��T�7�*�%U�Ϻ �,��ŕr��KK�Ա�h�I��ad��&AXȀ�"�# �X 2ِ��92Nd� F�h�c!)��>"@x24��L �`��h��QYӂ0 p36����$�#�l������Q$��4J"�������!چA���4&"숄#D������L#Q`ȹ��E�DXl�� �62,, 0 C��0\& ���`�6��|i��f44 �"�����j �it 4'q�@P�x'4U��pJFy3k�����0��V#H�������Xт1U΢L|��^��hIb�����e�4�i)x�.\d�SF\уl�0�!�W0�����0�<��as���������뮀} �Wd�g0X�r��&��I�,��k@QZ�I����L��K4�b�m2���i��in��e}���2G�L繧�U}��zD����̟Y�c-��}��}���&�3tu �5��Ň�,A6ȥ!�G����,��#$�F����0�$a[-�@��;O!L���ny��4��eT�BS\�#(� -T/qP��bayf� K'.<Y���8��FG��,8Y�G ̎��H4D]��e�,%�ê"�+A���ᡐ�@�X6����fN�)2e-�s�z�h��[*��a�a��](�]8Æ�2���6!�p�A�/�����
r��4M���lY9t��J]9D�pi(¥R�0��A"p�a��� �N4��8l�b̀#�E�M�����1������҄!I�H���l+l�pW�K�0@�F �����a!�hӢL�Жb�%���I(�IF��'f��%#�'<�#н"K�u�&�`��F���4��BH�]v]v]uΡH��+ Y��d�$Ѩ�.�yFI�s��Em|�c ����겫*�����ʬ�������sLߴΫ/r�o~���$���Y{�a�E�����e��^���r6M�m�NbFT�&��<L�ܻ����%On��K�(J6p�����h�4�vA�D H�0�I#L���w��[�n���,���w]=QUL�*�L���� � �K�!��^, 2���7K�L� ��`�� ]2�!)�1 �C ,����Q�E �P�(J �P0�C`D����50Q�n6�Ef,\� �1�^2
�ĖPP���O{ņFFA�ȸhp������,C���&Ah��L!�pZ.�6A6 �d:��D�B�xX<](��pbT6\ c��p�A�ذ��@L�`^�hH��.  L�U ��2 �������)��8e3P ` �`v�#p����9�G8)<��(��Q�E]Ǝ�4`��%M= �d #&��Q&BY��4�@�J��F�J�دb��$CB�!T �&�9�,0@� ! 4�$!�^��s�e�H:����뮹��fFRY�κ���%�&�E�&�RPVv��0L�u��z�E�ci�U�VU��*���/��+��+�n{L�'�i���X�f5����w=EI٤3E�h�Eͤb�ͬ��)0m�՘�*8����X
+L,F���2t��$���$LB��HS��M��7�!�8���٨��9�S�o��j���*F��U,���B�b�,).�#�T2<]凋<��y��3"s-��44hj6p�e�a) ���F��CB�L��
+;��3]P�"I��6���yd�* �2PaQ��KU2"XD�h��fJ L��Qy��-\!hB�B�BT�j�(�v��.�U �]��-l��b� (!pFPD�q���Cn&�� C��<�P�]���b��&Q��.� CI�D� � J#Kn��h����:�u�D��D��i��ޑ�;�v뮧e�ZY T�i)��J��d��9� Q�
���X2�� F�����&�:� �at�Y̮�t,�κ��sɥ,���K+Epx���}E~���s�0��쬺�\��F���s���6N��M9��ڭ2���e�&ˤ�&��s�:�:�+�ex
.�d�{ �jm�l�a &�#,)H�����S�QXJ�Q�i�N�0,�"di�#�e+IѼIL����^��K ����R�6�(��]Uk�(�^�e\�eA\��������XB]C"# v2!,�p��Q.!.ɐ^4�Z2 F¡�fe� �ȰJ ��� �% ���:�%AH����n�ΰ`.̘�)Q��
�����=;�T�Ȱ�l�0�H6�@�6� ��7&. L�����u� �!� �#bCB��N.6\�`�w ɒ.&���Aq���q��:.ѷ C$�@�4�� �&��8>\#,%Nh
.��C�49�8����@;�i^q!�!�9DQ�(�㬑�����Oe��Uw9֊�,&x����^��]B��K,Ws]�=���$�%�H��)d�6M6�\���8�y����]� �de%�׮2�’�I�R��F�V�U��Z�β��*�ΔW��UeY���c�U�>�h������h��:�Β'}�s���[Q��),a�R�I5�{��u�#l�s�(���:��+�q�X]� #HjŇ�����QX�c�ѣ4�:A�ךL�Ǔ#�y4é���{"d���[���s\�TJ�X�⒇ViU�r�ʖ*�yq� �� �ˉ '2(H4F4���!�#*�!Pl�H�i`�a�p�b��0d<�B24�v��X��P�BB�(\`�76I��8X�4��2H *fYQ��eF�.LDX�r� �4L<�yPځ�A�yQ CJ��X�uV.�beT&*H��9e��  6�q�A��U �4H"��,��a�C�cm��Rb���Fa����@�d���LNp-9<&H�������L��@�iÇR G�{���/^��r��wv�ZXRY!�=�Q'd�)e�02†�4��Hh�њ�e4,�,Ʉ��e{&,��ԔX�e*d�U$�
��uU����c�*[Y���UeFM&L��ʲ.�4������˪�R�T�5��s�.�r��$�V�4M�r�$I�k)(ʑS
T��z�m�%Q�.��s�(��BY��&��:��b5�0��h�,D����*{pU�e @�Ly1D��&H���xɑ#a��$�"4 '�F�ߥ��.��'�+UPNX�ĺɖZQe@�T�@ʫ,ꌕ��&@�23!��e�#@d��6 �a���q��`�l C@��11�0��d�A��PB�� P> l�Ef�P �`/@`
�XaP `>�bE�ɍ d ���0p�h*4 �d%��AD (`B\����â���t<�T<* ����B�Ĩd���Be��eA�.� D��0&��A��h#�t%�hK�� ]0�.�U4��R��2f�`49A`$���
����4���iA�#��N�H
+��*�������)F��9:�&�N���{����&X{��4v�X`�͓@��ȓ�s.@��Ck0h��\��� *�m�L'e
� 2a��&X�Ō
�&T��l�QRdܪ�V�V����&���VJ4�^�,��,�a�9VV0�V]UeK:Mgn����$�&��IR�T�E q5�*�9Ĥ��8�Ĥ��eG��Rd�h��H.9E�NX�,R5��Xu�JB��i?���X
+L��i�=:2$ʦL��S=0�J����&{�~�b���ӵf��ӪAU��X��� ��Q�QʚT��\1 ��B����v��#iF͍� *6D5"3.2��q�Ȩh�J,!E�'��F�1Eh4 � /Z*d�b�����8X����ꈓEF�2.4X�a�F��.*\���zʼn���m�UT\��B�©��E��P��ҖLYau
�*����U�Щ �@��J�yb�� 82l�˴��
.�m��:�9�X��d����̠N�b�ME@�Q��Ȥ�6�ބ��d,ߡ,)*8�3�"h�r9�G#�Ț9]�=��{KH����W%.�:"l�@Y3��MX\�SkY#��] (VH�^�a��2Q�����HQaQ����(�OT��2�9Oh��QrJ�e�d�
�Y��U�l���b��],a�]$�G�iRE%Q� *L��*�NU�^JUb� <X�)*�Y)6�8�(�F�(�B�BH�+�9d��m!Y+HV����OEa(J8�tj�F����$�
0��^�Hх��Z�#�ӭ4�����X������*��/XUgEV�VMAeA���Xd�$,�p��)� L�"��p6 �O2 ��� ��C@�h@�+�P�! �!F�(H"q��x��2`�؀|��b��@j�y8d���,Ha@�eP��c-�S%���҂ b4���
��&�u����6�}�����Th��`�iQ�`ШЪ�$.
�d:�-2Y����A�h �����`xl%|qE�i3U�3@8��
������P�*:��Ӆ��'B�2x
+�i� ;}�
�Q�u�s��@u#���u˽�,Wr�)���0mΚHu�\��\�4e� H|���Xц .aV,M����]u�@����&��U*���Ы�n��M&2����4Y���A{�4�*������J�2�UV,c,�6]U!c��t��]tTeG�h�5S,�����T�%(�FI=Z�b��V��� �VQ���IYzG@Qw̄Iuy� !e
E��D��IU>����,�����d�e5}�L@�U�oL��J���_�H^��C|���eO��Sщ��#TbmV����*v��EX0(X�\4�Ƞ�cBa��bA�bQ�Мi)��łXhdZ`��b!"0�N����f�ܸ �9����5ӒQ�=R�b���A���F �4T�ȩ���64T��� ���� �&��T�%��.YVˬ,�rť��(��d���b�!��\�G
��JE�m��U 32��$e6P04 �pLP��� ���B�������W�֑����o��cL'f�%�V#F�^���w����� �Gs�E)���*F�̙ sI.@�D�DL�b5�0��+15@��d �eseu*ELX�aSd�+!,�RPV�V&�a�M"m����T ��;��v�i ������6\�Yrl�aV�{��ԪҎ(�J��"�VFN���,�de�&�s+2�+,/TU�d�:�� (���S��4!��+!Y�[h���3]�"�*��`�!��2�3�C@[ @�x� � �V�<�x���S�UH
,�������QG����+E>�S�<:�C�# W�0��ATF����("��+"66s���EP� ����]�""4@�Ͳ'D��XH�8�� <��Hi����m�n�i��q'��� \�� �� �X!,2LN��98H��� ��'�,�.8nF.S���
s�c��p1<�ء+!>m�����O�����+P��
")N�d� ��$���Ȟ�:4�ӀW%@�4j�X�`�bn˔xd����T4.���x
+t� :�����sssnT��D 
��B�,@Q�(�+��]��T�A�ҡ�j���TeaYf�Tl�](�aB��ɋEҗL0�h�Y�ї F#�p�B��2Hd�Ļ�#�w��h\���� ���ӡm���9$M!*��PW����q #�HÎ�6�$��$�
�X�Ɩ7!>>����F�"&9�4maCC���Hi�Ԇ�555:����>.>��PW��\��=$dO0 #M��}�Z��`�� %�(�*�Q�� �v #��@q"����dD�bjhH�2"dA�܄8����z1&ш��m���= u;э�F!B��Ċ' �U���T"zrA ��E�7r��j�I�&4U����\�O�$p��#�˼����1��˶|-aC�I����r���|���BM�ӡ����%m�V�l=肔�4#l����E]E �JH*p�PV*�<^�������ȉ������;*>Hr9i�
/��T�,�,�n�4pj4�ʡ�j�Ŋ�ś�&]R��h�a�.�b�ՕJ.��]�VF\1YQ����&��1�JE�T]�v�\�C?�B�1&lн ٰ�M �I>��N*BHۈS,iƖh}Q��f��p�� HK��"hya�A1;��IM&>Q�J
�I
a�d�M,FL�ƤM@Q_�����0� �p� ��T �b�L�r����_��o���"�X�1]!�p0�%]�P>�~h�Ph�@���\xQ!N�t����͡6�P�sG����zEс�E�N�04i��T� +�{�p��� ���ā��ʦX2����!<%:� �
���!9ZFH��prpHF�Vh
r0�����P�8��`��><| G�����'Q N�*$�Q��T�^�ӧH�;�Y2g�mB@��B�.X�ʕQ9Q��o2.����:|�����J�x�#��9��(T�C��e�
/��c�� �]�.1 ��*pm�D�q���0�-
�lZ^.H���3$3lf]���8Z,TV.��\��C1uF#-�œ�lZ+x�Y�I�UAyg�x��L�g��h�@�/<�Q*����a�8H�RƋ�@�K��2>����x�ƙy��$b� �Uw�N�x�)�6���O'<��N�6L��b&��9!Z��
�.J&
���X<�<���~ R��0 CpV`(�����;���@�k�˶�0#N> �> ȉ%�q �������tchތB���)\�}���m�W$�$�8��A�9��p��8;|:�#��pyG�ya��[��Ǟ:uS��8��
�� ]��j�*�
�N���`':������ ��(x>�L�X�a3oJ)JI◷�N>�f�'�<J�IEI� T(L-- ����'�����E���<R��q㬏<������Fn��Eq(��qb�3111����0�`�;óK˥.Ъav�TP]�� �2��ŕqv����^�"�,�] �af�k(RQ�Ɇ%��6,T���/��\��٢U$ ����8��ϪĎF��2%E/"N;"hy1��GYXv)N'l���>��G�m�,Q%a��FM�P�ϴ~�To?!Jq�&�������� *" �!0h8x�@a
0\D�A�@� ��
*�%T�����|���ˉ�EĨ� PaXD��)4���3�!Y$����! ��dH�6N� �F�tbtL"(��aJUҁ�!�G�>�a*��(G+��Q�(*�N�.��ʼn
�
�EOt�|C�1N�# ���) ! ��pH�u��5�� Ā+:3a���E �â�͜�3���H�4�N��B��'H�I��ir��������;�r��$�e
���0�ʈ��L<,���'OP����㥅ǖ�$!p�P��qBr%M,�����Y�vL<��<���Ì8:�ʡ����a� �6Ђ*1.�Y8��^.H`��q����xƒ1�qv��p�E�UB�
�UE�.��e�3(0�x�����f�r&�= �4�Ǔ���h�#��*DL���I��"T��}Q�G��HPz5O�y�m J}�}V,9�ͣN�Tv "l���>��HB�扚��������4�Aس���9Б��*ɀ���
+
�_��� �N�z��h�6�H�b$�@��rlB��P���E��Qч�zAV҈Zr`�JA'��m��Q�䓇jCOP�e�j����*9��%�yYP�g
���p��"�#�.#������yZ=
HU8�M� �@#@����>:��;(H�b�4ݡ��J)KhR��/ǭ��H��p��c��Lx����ɖ+E`O����J���=4����XP�t� S�g (��W��11L30���8ÌLC-\p}QA�>�>Ld����,�]����.��Eӌ<a��ƒPa�eK����w J�˴*��ʣ1�uER�E���I�A@Yc��s^���U7"T���ӈ�"h�S��X܈���6�%>�/>��=��>� �������Ъy�*�mg�>��؞&��x
+�I(`T����!�a�@ ��������������_��k���$�� ������p1#y��� �B㨎, tHq)��&�dC ��J%<�D�5� +��>�!%B��� ?D}�oN�_}�{��E(,LɋQET�(���%������x����HA�'�� ̌,!*B�@�<�P�/8��@D�$ Ζ#B
�2�HR�-�}�4Sh�D ǹ���`����
U'�L�=�r��( �qB�`(� ������>��W (@��ǜ)LÍ�#T��
/�Ģ1��# �Tĺa���� �4�\ �"��1�A���.��q�£..L�2�ʌ�a0�f#
�p��S���b�x�Z.��C �f#.qwp����
�z%P8�3�Β#�8����� �HSX��&��:����>���g�@���m ��Ŋ5X�i
�X�U6,�J��@����P��W��rBuT�X6C͇��L�����<D6GEaV������!."aB0���DK�#ϸ�l�=p=8��mplmC�1���-�IH6��m+ҍ�zQJQG%���͒l8�<i��j�6P>M���9�j<��io���I(B:D�0�"��#��ȤF)�B��DaAǜ
WN�.@�`ub1:�G�{F�&LF��ozrj�H�� 7����4�U�T��)�� u��Tt�h
+~K���>����@���d�Q�#T����(��WnjE�&&&a�����4h6�e��!��n*HT>�eA���,�RB� 8YAe��EIP]�t���.1$-ZU�ES 6,غ�����p¥����艣L��Wr�:����' �&"h�$J���4i�&�ȉU �O�g�H�5P�Q��y1�N�ŋby�Xz&X���B��X��Q�O)E&,T�5�� ��`�1 ����
A ���p��EZS�UH
,�PV`�h�!��&'�KϏ�f���q)�N8$@zt0"���<&\��� �0�`t S�y�Q>:��)ġRUҁ�*�� J0�
R$���P�<�M��ۚ{ޥEF �DTYQ�P8�@�� �t�|��`��@��z@��r:<<�@�! �
�������I�5��df� hL�t@�F:|-BD��HR�$@�-{o<���L}"��ݺKm��{���T���*L��2L�P��
�J�)E`N��']���
��U@QC�d��<z=!F������#
�4\��"�u�h���2�e��8�7 ��� Ê��T4TY�X�U�͋�T�b�P�c ��T^.�w
�YŜ�Y(�B�
˨/�l�����6�QFI �*���*A54T�S�ر"h�R&� ,:��G��m*T�}V,O�ʼn�������}Vŋ+�:��X�B����T���E6NP��"c��B��F��0h��*&��'�@QXU�����@�@yD�m����8�<�H}��r���ƎE�: ȕ: M�: ��@>U�.FF�cI\�:��m3iIi��N{�~��yU
I�LmW�Q�F�qo��2 ���$�G���d�rD2�"Q����<#U=>� �$&�4��/H<���x���:�:B$�x�e@��C���|1Q���[&<��&�NZ��������*5P�y��tX�B�)�=�
/�Ī"��4/0��F#.1T�a1�h�i0qP�!�qP�p�0�a���&,�fŞ,�T����Te�鋓l�a�V�����L.�t�Ҍ�\�����Q_��N�2#L|��Wqc�� p��I��nuS����>Ѥ+�b�#�Q*|��O���w�b}��!e%c�<���d+UrLN�uV��s��b����.URd� �. ��%�ӁPX!�>�^����_���
�B@q�<�c�R6� ��l�bu)���`\P�'���:�h�`DC���
O���P�<x�5e�^� @|�
f�"Jf�����AN������BNT�0=(*M�
* �X��K���#���=���z:XN
c��'A��|B�~F|�FB C�I� �xNL��-�gQ�Bq=L�bhϣ4�$ޑ N����I���yG����IpQ��)eAʢ�$P�����N,4-E`N�$����6���D��؊�(&D�2(
/�ıᆋ���(2���C q���Z � Ê� 8:L:�t�q��`�A� ,.,HT��2�P�bї 8e9rc)��U--,��t��h]�팧TT�vE�k��*��%Q����]˸����#l��:ѹ�N�>�6� �HhhhlO�ʼn�Xz5Q�������,X�*Î=���L� '�>���W�(yWJ*<0��9 �A�+Y��@(O�QXU�����@xh�$�+��l�B��'��3��)��ǞxP�2"Np�g�A��>0.|:��:��Cɞ�m3��sB�Nm�����Pl���T:�j��8�x��}���8����ሔLLtF>���RH�-!LlJG ���N�}#i�9 �D��$r1��L)N�L�S��3ν퐴I�ӏɦ�� UN���r���$:�bC�͋@QX�_����O�uV'I1@�5�p`�b��)@Q�(�*�,�d�8���<^,LaS3/0�3332�0�#1�F��C��hi��q��e�L2��C1U ˒N0م�-p�c �E�p�r�eE�lZ*����U�hQ���Ϊm�&�I�*jD�֘��B���4�U��<��PϪ�}�,N�y�X�i%���V(J�s�&�a�O�}���N}S�#V���1QRI��
��p���(�h���ZD�V���UH
/���7@D #�h�ƒ˜\
XX���t|R} �I�pxLx���Iq*��XC�� +����'B�Ȃ֏4BdI�)�&&����i8CiӴ����(�E@�T�#*���EI�+*w�{�/�C�j���PQ��)dx���' ��9N%�1�'.Х &:�J��0HΣ�<�d춉"4�N=4�$��L��'��;M�u���EU診���*�B���B�V��w����ŋD�� `�����
/�ĢB�,��b�TaR�x�q�� �L����8��4�iPҡ�y��9 *xyP�A�Tl��� �.�d��e�2��K���# ��PY��p��� ET-����2���3<L�dd��B���y�H�*95>��T@��!X���CB��ʼn�O�}T+1bmb&�ذ�'�i�)^�Ȟ�d3�в��6��F��t�"��=A*����rB�pÃ����:J$����E���`a"�
��>8���τL6�J}��F|$]��S���&: N̓3s�ɇ0 ϶�X���Be��=0�fӇӽ�ox����ڊ�$���I ���d��뎪:F:���3�A��sB����4q⃢e� >�d ��y Џ��H�„���2SOMNM8`�F�֢t�x�U"��P�J�yBTP}V�BM:�B�Š(� �/���
� �U��h�Ssl���֎�0_�
+�4�E[PV���
�.���I��30ᖌ�Ma������C�ڡ�rh9&Lxȩv� �'&]�2�.3 ̼3 ���� �p�b͗N.�e����4�&���N�d�@����ϴFX�ñ���DI ��ɞU �G�b}���>���T���b���y���U���F���B��=�"y��(���MW,�x$�K*0�. D �>8��S>��U�T�������#��D �@����nxP�D,l����������A�/<���� ����� ���<��G�(��@R2u��2)ϴ�ہU��OIBD���*�1��? @,��c��p(
�A���`;�!@���
A��' �\x �����Cc�A�����0x��EH
� �(��0t��t��U2e�2�S{ޕ��ZILʪ�,Q"�U�(P��@�QUd̕���'O�w��� ,N�uS�,nu�%H�7!\r��EqU)V�<��6.���]��<ˌ���˃M���cOxr��F��9ë �"TiQCB��B͌F#-�^�a�f��.��U8��ӆ�cI�_�OB�!t/DM��N��2��BP�d-h�Hh\���>�L}�3��b�G�B�'UbŇ�T󘞱>�L��dOF����>� 43��Q_���<�0Q��1V��ц��� �
��
+
�_���HYFF���<�
6�(>s�3��'\%a������-� ���A��TIR�vS�ԋ!��L!O���$����� &P$Y
��UB�б"��&4%���Ƈ�::'PN�c�Qs�܌}#i��9�7�FI��D��}�<R�VD��NqK�J)}�ԩ��L����>��
VmR� ,��(� �/���ꦧU:ѹ�����l�F���Q�(�*��qf��a9u^,��������2тA��qu�U.��0��0�9h6�:��A�j��4h8�z(]C �h2HaQ� �*�f�%�^d<X>�q��!����Cf|�J
��]��B�$J�^��lj1B�Đϓ]�P�ذ㪱b�آsu3,�>��h�G�>�dϪ�!�O<��&b���0��R�<�xw��7��x�
,{���H
(��Q� (�����N@L�L���@�!� O�!B���|R�;BB� (Gς��c�"K�N��I�40)`#!>��>>@� hM$ ��zS���&��h�m�*�l�"nX�BB�U�UQbCeL��-�{��@Q\�*���� p����6��f�@�s@l:8l E'�UP
�h�q:FӪQB�Vp ����F@�XhXL�F@) ���S��>PA�@�l\: �@�����d���g��vI�X
,RA��(���m�ܙ�ː9�6~}��O����|�h�G��'�'Sh��X���M͸��rH$n q�3M�D��*8Ѧ��O"�HB�RB���W���h�3K�*(hr(Tqa2�w I S� Y�'�䂅B�D���q��p�H�J��J�^LJЕ�3�
�E(��T�$*��6�6Ws � �=E6n��:�7E����%��0�4d(�! D�C��|R}LJд�� ��18'8H���0��c��F��2���#�z@��� �R��B��pR��x��TT\�@��D…����⤊}�W�� �+*:
�E���C`�O#o6�`���;=*HNI�9P��$�H(ʠ���q�������J��Vhh�<@ ����! m dt:Pl�اtUh�����L��BH�
�O�9��<���B� !h���~u�'+��5�]S���ӝUrf���"LD��$)��!h}bHZ!TR�����. dyR�$��4n�D�����XP��N�Ȥ��r'��x�P�8�� �
�J�kAt¸Z�`�JLJ��Q-&$�G#�CB���d}
&q;�O�x�ٷ�QW�/�7�@Q��� %@M$ DF��"B�†���D@�!`��pT8$8��C�����!Ft$H�0<|gǐ�Fq�D���ؐ�7���DI�s�΢�
�P
2���H��P�'*\���
+� ����Ġ;��<�bpP
�RF���`08,FF� �fS��L�&IUq7�&.*��d�J�ʊ�PhM��@ȀF��A��C��!B�dB
��@y�D��YVLf�����%$ː�b}DI��9�Q�<��0�XN�s��0L뎹v���G��z���6���*ni�%MHI"$B� #K4F�o4TP�&�"T�������|�܉Q���9qaKBeD�KC� ��B��q3B�#��$'$(� K�
�+ I� ��eCbH��
d}SH�S�X�1�g�<�X
)�pV(�t����'*���k�ABi��s N�P��R���I
�"�7@�����9�`}D!q�O�iI�
н�~�:0� l����I@z�OU ��e�G
m`|�b�QV�}�W�x(($��D��$p�'�ip;�<J
*� +�p�L�6���2t�c�pQ$�tH�@Q,�`H,P� �@�N�p�n��u�N"h
&��B� ��?�E�B�����9$�f���D�S�D�0���*����h��Xh�26�Hdm � T����9 h�1�c��,>���J�,>��ñ��u㬚Xu�KM2h����cpX�MGV�D�*������`��j�|}�H�jF��Xq
��N8�����5B�B�CcB��d�V�Y�"Tu�G^BM����$���6��(�C����f�]�o������%H.�G��hH �@
Dž��<8�*� >0xt�)�Ը��'�`��1�R><���v|��hH�HHP��<D�R��24�S���{��ŮP�"����*T`�b���Ka�{�� (�@#���$: �$P ���(I� �@���BC�� � �h�IS�m�����@I**Y@`�eB2���a�\4�D�PA@��U�����  >@�p$��#k�#;9E�F�������TH�i���O�TM&��θ��{ ���T�F�6���ʚhR� ���Ǥ1KD/"L����is���?<��$F��Q��=�F�PW��q;�����eB�`�b��0�P��4���l� �<�SmP���È�:�ֈS���h���H^���"Ñ�GY@>.i�k
"L���YME7n��8t������O�zϸ�� @��Ӫ�)>��S��U�pLzlJt��!װ#aV����N�*B���
���%� $N<�:q�������5�9Q�E
�T�<$�`�a�|��J��H(Pp��%M��S@�F��� ��� �98��9$��p�G��{��(�T,LTˊ�`��)�)�0p(���=���x.H ��D�0��(��H������b��#�(�Dneȓ�H�DM y�q�h��wNvm���)a���X��)�2%��<��(����P����v��6�S͡h�CD�'�fڀ������2)&:Ƞ�b�c�!>q�g;6��dD�MMH�<�+�a��b�uQv͖*,%N$XJ������l��9d���B�ٷ�QW�.@5_���@x�c�Oω��
�&>
� N�|P|���<8p� N��1�I:%:��*�Q�%\�`q>F�+h�U!���D�>L�g[���{���z�I�K*UB�Z�(\B��Ex|J�ap��P&�HPdRG@�":> HH��Bu8$�L�����u *N ���LLU��⥛ �6X2X��� @��K�@���%�%@ H `� @��H�#� ��@QeQ�W'E����Y�H�[4m�iμ�3�Oׯ:㳳�<�w0H�G8�����6����"�$�:Шy�D�LÑ&B��yׯ]�D������q�NFX����
”� T��<q9Č9���$J�$D���\jD���*i�3���y�1>���X� Đ��9�G"gd�F��0��l��t�89E����E�Fq hsL8:r���>��� �Qq)׮$btHmC�s�Qǜ
���*F�A+(R�J��-=�$�h��H�|����Ɖ��!QE qA0����Ey
D�€~D��u(�����>(CD�P�Z�D�{�N��� �O �<�`-$%s�
K��Q`r0"X��'����� A�DH$ � �H40O��*�ɵ�(����d)н gҡJy��/]�לT�DrN4p� Dn8��4��S���8��*)y��}9�7�N��NF�TnD�6h(S���e�ѹ$-�P�f��'qrqA"�x�1�k�톘(rrD�L<�� �@��A�Ɯ�DIȚ:���q��Ϫ��c�B�!r�w�GY�5 Hq�,X|����
*���*����b8
,�pV`&����"!�9��X<�и��W.|J�'D���&�&\&`J�'� N��`JtN�.8��p�  NJy �C�A�T XN�9 m6���"{ܑ��~�rE�T��I(�P�}c%��}�H
+�Ќ�^�*��PJ �@6���Ђ���n`�ABɀ@��iڵt�"��TYR��&�������b��`@V � � @9�`�@"��ph5�1��0�� N�
�����&4����
�m Sʡ*�{^yU�ב���-�*F����q�G^G8Q
T@��'>�
G3f�$m�U#�$�����m�m�((([AE�H)NBX��p :�6ͪ)h�@��S,F��alj�x�█�#$i �SL��:����4���l|4'x�q’C�&�M�Ѫ���Sf�(�#��������B�P�>�F�UqIs�s��N�(F�p-<����:0��3s�s<%<��:���Q�����)t��N�l6��R���6ۜl���r��9BdK(��Ey�����
�D*(<�d�TxT�=<�Jɂ��d)DQ8>�h*�P�u���'$K2X�E����y������R �2P��2�vA��h�8 M�YT�'E���� zi
d /<��K�*�ם$t��9�H�I�q #n8ѹ��SN}
*H �*��Ҡ(}:�{6i��h\��[F�[F�l�ˑ�B�*!R��>.C&XO�#Jx� �c�L@���ќ��($'�d��1箘Ԇu�B��d}��F��"h�g�#Xr'�GYd�,X�z{�(�����;��H�Q���8 �~��20��88��>&`Ή��l/!��3��v�\lLt��xN|�!Bq��� �e�$
R J��� [Oi����$���om�PX�bLT���YT��FK}����)b��
Px�Nl|��p(��'J B��&Hy������R�ae@ު�*��@�&2T�c"�q !2���2B`� &��pn@d T$`�`=l�3�(�������Ҋ�zW!z
I�W��ʰ��iw/#,G#ew�6��NB��GU8�Fh���hJ�iH
"z7#N��=%�6��Ȕe�ގ�̨��QD�Q@Q`�:Tz'�0uS�"&jji���+�4h���C]���q����:����X|\��&�8ꦤm�C��O�#��i (�'f�l��x�4�(���|d�@<mR19����tRu���B$7! �=p��%��+��T:1`u�l��
'%4�쐥zR��M��om�os�$�+�!-(DM:�����dKJ��W���
��T�< �##�*l(;:!mT�ɂ�ԁj[c��Ų���i4�*=PīʅU,�DdH2*2�� �!���@������p�@J ҀA��E�F=E���b��Uw1^�w0��{]�U#s"Tۈ� *>�C�d�6�N�2�@��P�@�C� (����bʼn��9�%�Q��q��m TM�j��ri�lj�O(mb&�MH�4��ShǜFL�U�=bF� �2ŗLDL��iuH�4���q�N�D��Gc����r8��H�IIE7m��QT��>~f�
�_�?� �����Y�!�ZF � (���K6�HB�8� Wȸ`p��� P��
O$�8��N"iP(�h�t��'L�RD�y�ޙ��u�ꊒ�®0�d�(�@��}�Ԁ��"��7��%�f���#� M�&l0:
�HP���1JC�*�dV䭧T�ʀ��*���6*\�JL\�p�F�������t0�34�Q�0�>�M�pp�`U ( �-��(�L��V����K"N���:��b��s�T��Xy�F�M*n>ѥ�� h�t- N}1����}�͠(�)��q�18Q�0�'����'��S�<�y螉�M�j��r@ХS���ʼn֎�9]9֗h�ȉX�c��������#"Q��FD����GZ"T��sr&����D���9*m��$e�@QM������ �����`y������b�tR}��D�!�����8.P�Tu�B�h�2�M2�#�܌��%N��jb��)TN'��Cw�=�‹�Uą*��D�P�V�Y�}�W���0xl�N>��A�ȇΧ:@�D"t*2'e�G98��į% J�PFP��i)P���
"*&,\,.���ˆ�!ԦAр��6�p���e!8#�@QeS�@N����AB���T�ر>M�0���8L݉�N<��r$�D�8�d*�U HZ@�%���&Ϲ��9#Еa�9�0�'�S�m h>��F��$̒D�5 (��&�H�ر=B�(>�g�A^zx���'99<�m0H���M�i���T����Kϴ�A� U���IH��E6m�U�8B0�;�Q���� �pF##,F�B1k�C�� �pJ"�����# �y�B���g�a����8�'Dq��D�(L�1$�ӂ�TM�m��ӽ��鷨�AR����D�(�,M�F��Ex0O�
��A��V:�2tJtNt1b|��������1#(S9��u�QĜ�&��X����c����a��FD#!a�j"l@ C`R�� �@��� `c�>� �!@�1w@QeS�<�
/���(���{:�,O&]�ӱb��'mb%H�!��G?B�P��T.B���\����@�2������====D�%O��� Nz��&����Ea�mD�ꫧb� Ϫ�B��Ӡi
t�EEGe���<� 5ܻGY<I ��"T����H��'4>�֐���(���QXR�p'�Q����R"%Ljɜ��F):�1��M<�`=���Ħϲi�F�HRRGFi��LDբ$�&4��<��[s�_y<yiQ��*@VL�V�����(�'�>"q��H������GEO�F2��M9(e3�2�iE�p��p��Ɍ(�c���y��RE�F^0\eP�Ạ̈2�`|���� 1���۠(���:���􂧉i м�4k��֍ȕ:Ѵ�m�n:�֏$D�:(�������\�9�2���Q4��-#P�#�<���=<�� U�I�mT%*���G�Βh���ʗF2�w��\&$7<i����(4��#
�S����ê�x}�q�D
�ɇZT�rw\�=�u%��(BpQ�`)��N � �@��@�@@�@@�
��
@BD��H�` �D I�&�@d��" �mQ�"�#�A�"K��'b*ob��랁������œ~�0����DD!R@+4��DU"k� 0@)ɂ���b� :D�"�B� �}q�yK<3�X�ڽ�����g���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������ͪjtQ�rq� �� �$�I$��$��(��,��,��,� 0� 0�L0� 4�N4�4�M8�N4�N8��8��4��4��8�M4Í<�N4�N<Ӎ8��8Ӎ8Í8�M4ӎ<ӎ8�N8�M8��8��<ӏ<�8�N<��8ӏ4��@Ӎ4��<��<��8��4��<��<��8�P@��<�<��@��<��<��@��<@�9O@���<��@��@�<��A�=�<<;9�A>?�����;=@=<�A�A<��A�@�=�<��<�<���==@=���<���<��C�<�A�A�==��@�=��@�������A����=�C�����AC�;C�=<���C�4@?C�D=C�;C�=C�?@�C��AA�?�#�C�<A��<;@��A>A�AP������C�;A�8���A�C��?���<<@���� ���P��� �O��������AC�<=���PA��P�� ���?C�?C��?C�?C�$�=�����ƐC���%�����������P��P���P��C��? C�?C��;C�?A�C��=A��C��?A?C�?C��? C��?�C��?C�?4C�D??�4?C�?]C�?C��?C�?C��?�������!���eÐ�������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������C���P�M��5��AŐ�)����������)��� ���AƐ����P�=�� ����@?AC�D?C��?C�T�5�P�A���9�=���P� Ő��P�-�I��!�)P�P�P�������Q�P�!�� ���� �C�<C�$?C��;C�4?@?@�APC�<������;<�<���;<��<���A<<C�AP�A@��@�<�����@�=�C�C�C�<?�A�@�?�AC���?�@�@�@<<A�@?C��@@<AC��A���@@��?�<���@�A�A���AA�C��C�@���?�?��AC�@���;?���A;AA���<���=<��<�<�=@�?��A�=;@�<��<<��<����@�@�����<�<��=�@@�=A@�@��<��A�@�A�=�<�8�<=@��<��=<�AA�<�<��@�A ���@��@�=�9��A�A9�9�<��<��@��<�@��9�8��8��<�N<��5�A�<����=�<�@�<��<�����@�<�=�=�8�8�����<��<�<�@��<��<��8�8�@��<��<�@�<���<��8�8��<��8��8��@��@�<��8��8��N<� 4��4��8�O8��4��4��8�N4�M4�L4�M4�L4�M4�N0� 4�L4� 0� 0� ,��0� ,��,��,��(��(��(��(��(�I$�I$�I � � �q�q�a�a�\��� �+�j��G �=���?r������0��:q����%<H��q�׃fFCH^�y��.���Xj�[���Ň+�t\�Cn8������g�u��H�+�GiD�3��)d�v�,e!��#2&��H���1'��ZK��p1Xu+��=�+Ea-.�`�!�R��(�)���H ��� �`�P�R�@����G���G���G�N���D8� �$jԯ\~��3�J|���11 ���"�����%$��h)pu6H$���N%��Y А����1Fe��&���Aة-$C �HTH Z,��K����A�P i8Ԙ$DA�` ��:�Ip�� ��D`�F��P�a��Hh6�+��?������������������4����?�����B��o�� ?�p�:V��P. /!��X�ðHF���n�����^�| 5�Ŏ 3v��7V�{�4fꕏ{�M�������������4h�}i1�֤��Dj�=����������q"�
V�`���1:Tifn�4p٥mSj�[R��$����B��);�ТXD} �Y��~�&��#8m���;X�}�7���}���B��G�}���u�퐶�"̸��Y;;e��]!h��\>x�� G���%B���%?#F��Dm=�L�0m�H`Y���0.� ���`��uSGH+?���`Y�Dz��J��A���X�y��W�/<����V>��8zh�j�٧5�ɻLf̦#V�)�֓�u�֎Zu�VU�n�+*c6!u�R������gK�E�%c��K����1�Y�� ��q�(�|IFT�I+*b1�f��
��S8j1/@��H,X� ����b��+B*�!�%gƈI�N�����$��"���C�6������ [(��0$@D�$�!D��F���iy�����#qsד� YDRLB����%�'6+�- M��W���J�x\�Q18�pXR�Z��Pb���m�k���]RZ�G�19�ۮ 0Bpۋl�5-4���|��p�jjW��4h�`Ѻ� ���b
��>��������-q �kՒ+>��8p�dg �S#Tѥ5Sj�L�+�:�"tH�#!l�ӴH�Q:L�������{��0Z�l}�ϡ����ПB������:�t(�#!@�'���e��<��e�YBBJN��T���I$L}�BbDĩ���' �i�ZRZ����K�#D,T��q�.)6�������@�BT B���ҏR ^��%Ӂ��G���KJn�Gbp�I�P�& ��`�z,X�5t�s�Zr���$g������@D�$d#�A�(&�q�8IDS�Od�Ģ� Ȍ!Po�$�71��.�'tx��]V��ckܬtr��.��n�v8�r�q���&�4�8�e��/�n���� ֚dqFF�JF;d��"�B�8��+���:��V��pa�++E�H�0 �D$�H�F"�)Hs�tj��#���ΘpyB��;}.'@,A�u�X�$'"BH�-,eD��EtEB���4:4 H���'F��A�i Ȍ���vJD�Y#�
��1@TЌF2%N��s$J�R`�T�'-xt%���aȰK'<L3'6.���#��,݀1*��S��΄:2 P0�� H��p�1���3^>^��]qg����F&/� D"q�I0��Z�(DC"s�%�H��h@���H�F)Ŗ�Yx��������K���\�
�����O �D���Y�i�����`2PPa�T��˦n�q��G��Fn�Z��BuM�￾��������Fh���p�|�׻zRsD�uŷ���Is�W+>���v��J�KJZR�gSV�4�$d��JB�$�(I[:���i�k`Y���^��9Xr����v,�����J}����J��У|����$��u3�HP2�,����P<�ϟ>�.$$L���mGQ6��T��B��) �y�-�8���V���fP�0F�V�Z�̹q�q��~�4������E���0��.f �����`�'t�4�O6d��B+T�XE�-� 0 �ر ��!��&!b<Č- �[�^�.Of������-��# "u!x#y(k��&H�WA��!J��B�W(9^�y���ֺ�Ӆ���ո����î�\?1�4�i��Pɥ���:ѳG欨e3MNJѴ���ӑ�e3&��Du�+Ec�v$��lK��ϗ�� %��FEC)hȵ��T2`0F5pE< 5�� b v@�1DJ<&> 묺�O�t�"R�# Z,ZPJ\������D�"B�%̕�'b|���Hԑ�X""<D���Б1DL�R2�����bZR���aB1$h����Ed�)*,�#F�D��F����f���������� � ~�%bE�$R��z�T:������^:.���ˇl�6E%�����H+0�*�+D:�1��X � �6ЇLj�wD;�ކ�0���l>C�H�dB�]^*���!� �
�EV��aZ*�Y^-��ur�%�L����Z� �N,{��2e���4>����i]T������Q�7�Ff��*ԗ�h�i�ZLh��5���-q ��,^���I��J�������X����#D���V�[D��H�@|� 5��k�kS"HP����V��YCB��$�)I#X�����B��HQ�i
3�l�a�.2�L���Yq � O=HD�&�6�萑6D��*2��I� �&�i��B��mƛM��p"`wB�Ø�6�\勉R����{�������`Va����h�H@5WN`؅Xf��d��pl 1H��A!zP�L@L"MH*�"/cV�s']�y��A�Zd��GՔ ���0�FdF"� 6Q!�cTa a�'���DB!�2�e4�c�W�(OuBf�:�x�X�����b���Xv,8����d�!d7����2���#" �2֐���Ւr0�d�q�"�e���TJ��0���V��C�+ ��1 �� H4%!е��0J�4d��ߍCf�3�2A�������w���������"�HP*� @ } �HI���?v�`���d�LIFD�,��(`���!�u, "!�`w.��(���όІ) ̜<��A- ZH���ie�TE$�Q$fұ�%���!&)�K
���2��BL1��:�QQ@�J- ���P?��G�r*l�h����( �
Cq@�0 ��ɨ~0& H��6��2&b��0؀�'�JC�0�( �a��5ih6K�)�|�^5g1MC`�[ Y���5A�A5H � jr ��X��̀�@5�6��s����a �? � ��7P��V&@������dV@-<UpY`=^. �,�.�-�r�VZ*�(��>'�DC�}�U�lMtC�!�!� |�Ș�o��Ģ�?���%`��Ƅ#�A9��ش�^t[lTtWtUX��]q����j[� 4'Z���I�&����������Ժ�d)���3���ЭJ�S%KzRw�.`�i3�X�S�Q�Zn�bd�M-��-�H��BT) L�J(R�$i H�-C�geDC�Nн ڡ{M�!F�;V[#m�I>�#HQ�m
S����
S��[D�셲ϲӌ�i��ϰ@��%�2TdHQ4LL��$%-,"mD�"Xӄ�7B�lR���y^�*�@P(AK�6��<�H �=��/� @� ����Q��>$�(l�l�i�El�#!�Bu�<�θ�0B���Q�׺M!D`��HI� r�BCB$���� ׂ �Փ� � JJ0�x$�I�p'9B(:�@w a�:HJ�F�JL�&Z�i:���8.��B���a�J���12@�XD�.k9 �v ڜ� Y�Zf���֜����b�Y�{������l<���<��WQ4L9i�0���' ��B҄��#�$�f+TT"� \�uF�Y)ʂ��]>�#�T�,@�U+���N�j�9�飹�������3Oh�}��W�j�*V��im�̒R��b4��#Nʑ���(��/+b\dVx`h4l��h��خ4-���)��
���3�hC-`���Y�¦B�(���,H�A =��t��qB2S���8PX1���(F1p��E��\����9\��h�r"�9�D�dD�R""3�H�h�����؟�%.-* Σ�� μ���$��Q��F������� ��� -��U��8DlFfRArA#R����0��Ax����*@��Ni�"PN��P���p%�ǎ6��r�r�� P��%3' I�,�MNɈ=e��H&@���T aiS�E !�z���� �x(��^`�fBł <��6R�J��\t���� �5�Njl�O<��]����q�=�J"����P�^+&� �:':&�؛b&Ũ��Y�ЁJ^!�؂F'DC�")4) ��LlOb'�
�M�V)4nZ�˦�{� �0Z�դ�o{���G��J�jk������SL�-H� ,m3��ͦ���tܹŪK�6���Ů�y[��^ɥSIS)i5SjP�i�d���P���I��H�%��*1 � Y��y�'�:��}������$�HR�����h������!F�
D��>��j�-��h���Z>���,<��쐺��쒥D�*2g�%@�E-"ZB����$��'�H�i��B�6��,ב4��tOZ*�"�Bl>���b�Q9~& �!zJ����ˣ���E� �~7x��\l\hTlU@.!EօV�T"�i��R�x��EP��8�X����q�T��G��hH�Rf�JL�{������ �=% ��qY�u��`,s!\�I5�NAN�8� AƢ�w�7P�f���.���j�! 1a�<!�4'ݝ\cP��e�@��R�RqA�*�J `D�ȸܬ;�+�<�h�����R����YV����8��',st��ܚ;��_rz�^FM=��e5{@F�F����e��4Dl$����Z2���TED�9X�\�� h>. ����F�a�dc&# �RI��K�c�s�Bd1@� ����������g�?���������(�I� `�!��;� f!��,�-!�KIO��K,CK�`ؔ:��t")8�h���XĬdN�A�!r��P� ��H��+"�"q̔<2FF���b#��
C��0��������(�ba �lJ�Pȝ��#��x < 5�
��v�b�n� ���Ԃ)A�3������b�����@+��*T���1L�P^��q�����
4�p���^9
�ȴjx�X9�5����P��ᠪ�� U����k@~��AN���  �$0`|@4A}�� P��E��D����/@����������}�+DJ�NF!P� ��E$b!��D�TloP�hEE��L�VX=t~��>x�����X\,��n��b��@!�
�L""�D:),"��10�@'�'�*�6/n��I�ޙ��JLh��wX4�#�}�������x�i83����3����� 7Z��ޤ������uI�돱`n�ڦ�6������,(�J�����)�Ѳ�ֈ¨(����} ���=� J���y!�Z'B� ����B�
47�$X}c�B�:b'gd-"F� KϟB��Ǩ(@uE�%�KH� ��D�4�" IqI� �Ze�h�`���| 5�vȲ�XhTx��Nx}��D�Ph?�]��xo��ԏ��9x� n���m �q�m�q�Q�Q�e�U`��D�P
��D�!��x�Ѐ�)�n�T���Q���BP`@qkV���@ڃ��$��,q6��8m���� < T��
WV�Ԍ�"��5 r�S����Y�&�+z`�,J�7W� HX&+]kκ!���#d7�qy��FZBbR0e協��i(X��^P�@X�V�p+Z\���iT/qרY7ub���:���P�y��wqa�Uϸ�t�����
j�o�ȫ��WIjќ�gQ�%��uP����QK���"h�1[�EΗ64V6`\�l\#).)!-'���FK�� ��� >V^����:���:���:���:���:���:���ExT���8J%��Z3��as��Rƒģ���b�aYB�¢�
�J�P�!`|��ϔ�$&$!!'B� 9�������-*K���+��&.-!)�hjXV���d����2LR��RA�m"�f���!�h����ؔ�,�M���� �2c2C �� Ʉ"e�D���uJ#p�9^�7=0_�5 �VT�Չ�j�js��i�͂�@#1 1��P�$7L&(q0����n&Dp�Ѱ�� �k���
\�3�s��~\^�ٷ^���������cŢ�B�SB)!���1�R&4"��D׈��a�\�x�����?B:x����� �1�e��"�����!/�� �Bz�hB#�5h�&ΈdbdA�!�'���XmIk��E��`��-׾���=�_ZN�������-����~�����,��27��'}��K{o{��=�&m���מq��ijU��m��r�蒐�}b$d��<C� �QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQZJ��F.�%(J�IQ��B�"i��B��hR�FO$l��D��IV�L�*$���J�) h�EB����$T,�\LLY"l�����l�)&�H�"l��)3Ȑ��F���o�f��
��E��bs���b�N�!���|�~|{LJ�N�h���E�����b,�.�V .��E���Af):*���T��� �<x�c�8hD�8h�d� ���90/�S��$"[�Fm)X��t��*>
� h��ġH:PJA�@�� C`�/�#t��p^�X4/6V��`���A�z���+`�jv.16u��d���x����H�@�H�D�%��(*$H��C�`�XE�b1�a �+%�k�t�b���l��.�U9J���;�T8�Ws��ac#���P�_?"F0��O�}�X���R��fI�<�20�F] ����,�bH|h%�6�H�q�d�lѰ�= �L2c "`��.C!H`TX��G���P,��(h� 4x�����hFɃ�H
�X+�H ^ĸ�fP�Q� ��C�@7c,�%%����x+ )(�H2,J�4X3, �`̠1 D����%�A*"+"m!���F%#
pq$��(SKš�R
���4a�4 N���98�JRq�1ь�U��B66��|&���(�?�_��������Ϳ��������E�P���A�
f���,����vl'( � ��B�b��2�H DA��E�q��08'#�P��� ��E�`� �@/�"��_���`��� Jc��$/L!S�+V84 �A|��F�B>�5� �|�P�l<�gn� h0��� �� ��D$ GV����9x���ƅ���,E&�gEE$"zaV(�)�,1��2b�L$��� �=l~|�>B9���?^_0``|�x}�щ�B�NhNlOX&D:A�PZ+��,����w[F���{�Q�o`ңK����������iůu���d����#Z������m3�V�`�I����L���"`�ڕ���W�TH�#BLB�+Ny `@|��|��ʍ�J\(F1�4t�}�&#4B��ȑ�D��h�hd��t�*�R�z$h��FJ0DN�$h�OB� FYD�H��!)X��WJV�%&JM"h���$M6�Hy $N�#^��6w��_7�o�(4![D��8N���r����#�����H(M��G�4?tv�������u�u�u�u�e(���A��f�� �S� �#ǘ�5l��HbZ�H���P�T�|#�Xv,pj�a��f������P�6�P�$y�\͐����!�b��5��������*�Uc⪪�Uy��r�\�,,D���Y��tL:yx���E�
,�>"�!�DH3">J��JB0&@Jh�h�.��:�"�Mj�غ����H�e%��ֺ�s�����\e��p�E�d��� T̛��ѭ�*���F��Sm'�#��.x�`�Ѣ����Ʊ�AK'��0&'->3B3<T�`������Y��
��e)hr-:Z�2�lV:Z���' F%
�(',VXX1l�bHy a��JϱBZHt���HP}�B�6$E$N�*ByIQ�P�H�pи�@؉�B)J�����)R' KQ�JZLt����d#ea���P,׀�5@bsTA��,�)�t�Dz������Q���r|�L4Z�L8:�@���
C�����>�/����Hɰ���0�����c�t��E#BAH�Y��p�h?�> T@ 8p����3�� x�BJ0��c����]��W�p�-�1i��B�b�ThQ� Eţ��ay��S)�ݓ6Nf36L`�L0y{#�H1����:A�� �� �o7�d �P� �
Q�
-�JL���2���Z�*G�ꡃ�{������T���u���J����ޙ#�l��E�u�w�4ZL�[�>��b�����v�H��Z%l��H�N�%�;��� 5���J�#(F�(�(���425��I!� >�hR�6�NLJ� ��P�$2D�TIQ$!X��6P�$`E@�)� �%JLL["l��&�Z)l��&���!"h��HID�M�t�z-�C4cXkȨ蠴Mx�hNx�X'�.<~�x��cև���nj���[:>& ������68tqG�]lp��W��J��v��9�� ��Z2'M[=�e��@< ��*�� 9�`�F0�����c�́������B��B��sUg���������f��6r�5�9T�jU����a2������6�h.X��/ Zz㬼-�`�!]��Э"(>s��� %.D5#-B`�# N����ծ�l����u��m���v\m�.��c ��e�{6�D�Rh���o����nP��$L��x� ¤wQ�k+F���P�.`5�Єj���( 8�hJ%)� 9� �LR�h �����,ց$*` ���@�^���$�b ����X�, �H%p�H(�D���` C�=����YXȭ���8t%�= a(q%�1",D%"-D�2�A�H%,F$��Ap�ID#�P�I,@L#��{�T!�Б�Q�0�F4&� ��� HGD`� hk�B"�^/�!50P-)0V��V�( :�E� B�����A��Z�i�#�ab5�HMF�/6�:l,���\25Nb�7��&T��8�N^�y���6 ccAyh1�� ��!��
�0c rA���� �� �V�q �/�����?�)�7X/�����U�ش�uh���7t�Q�9���MW�8h�É6ZhᓦN��9��`���H�L&N4At�0t�� �'4B^|z��`�a �*�'�$��h���F�W���u�wԌ6��|М}8m4����Z���J�������t̝jK�`�Ŭ{�����A{i��=��+��թ^��:��|�����IQ��v���]�jt��F��#%3:w}��u 1"rdi� �У>�#hd�td�$ȉГ�"F���`�)��Ȩ�\@�)�W�!)l��WJ["l�j2dd���ɒ��#$d�i5
�6���#�����&,n��
��9y��R�� �S'L�0p��e����( �6`���(��@��@��/�7zgN'/N���3�jޝ��v�I�g(�Q���R�V�<�L��@����j�x% ƍ������j�p���@k4l�̤ cV'!�h�0p�-V+%mX���\R��}K��ղ�^X�P������ ,]\*��]{"�ز)t��x�"%�Z��
�K� $'^'�DD'#p�D�i^����3dE/m��Yt9�B�rƝkϬ�a��R���5|9��y�ۉu���2��f�3%�l�m 9;Ys*Q�4����em8�k,�0iqCG�-#p�H20�N�FcS�R����J#Ć%��(Q�N���;p�� 5�:LB�2���bR�20!&,KP8Ĵ����ce),�lJ��E,d��b�ĭ����R�S����������#'#�&E#(!ZP3*t�hV�PБ�`�b�@ؕ�0�Lt�������<����a9�"�c��X{t2�E �Y�d / ���@���B%;)E�EU 
)em���
��4휊�����"�� ȲlBl/2d,�1H^�����ӑ&&�&��2`>5i0�2�B%i#���� ! @{F�|��rX��C0."A�x�������_h[�� �R���"�u��FLMX͙3��l�;&���-6�6�<��)��d��&.�:c �c1t�a0�L%��d��ѵ�/p~��fG�^AdR"�� ��j�͢��a��h � J�#-�6��X�6��h�6�^5��4V�RѢz:m&'�yrQ�h�;��˝#B0LV��`��`���do(�l���gF'uˤ-���E!lp��U�lw>�A9)�(�H�����F���<��y"�t�mJ$l����H�*$�R�JJh�*$�-�y��CA>� �*2�IR�:L���&�d�I��6D��d�$��B�,��,i�x�i8���'EWG�&����dу��M��̝2t�Õ&� ҏ�0Bh���T� LZ1lţ%��Y�bt��/R}+�(� �Q��9F��u�U�g(ӌ<�bL tl 0��(`�� p�BLRg�0'�>P����V�|�/�E� ]BѰ~9���'���@b͛(���l�r�a+7V,�6R�Q�c��+�����v ��\������Р:��֏2LB D���I@TD��d"9�T"*#$e�FDTFȋ!b�V/R��[m�rq��i�ez�R��У,aw��n�-��ܮ��0�PH����H`ٴJ�Ԍ��YF�ɢdaFd�{h��}�F��\Ȭ9�D4 Q��l�PkD�� @#ȃ�0��2�)����:|��O Y��#� �� "��Ee +`B�����،���1�`�Pb��R"��XR��P�C��#��RPg Fd���hB��u!'% )q ����EmY ��&��ȸ3 rC��9XH�D����"`�&� �0�.-@�a�1� �Q�ч�B� �PO:d"�_����������W?����\���g���3���<W�z�w���x(7Z,,1N!S�(�Ӄ92P,*6T�a(���(0Ӂ|�7�� �'�dž��L��`�$�$⩐2��
$���)� ����؜�0���2CAh�/f"��*�E����@KU�j&�@l�,���R�?6 $`�0���c��(��:�����r�rN9Jj�ٓ���i6q+Զ���w��5d�j�ˆ��f�9�GL^b����/1t�fx�^�{���5Z��'�&n\1��fɣ!�0ͱ��`�����͢��YrR�#WJ�'x� �6��g�cX�5��F�x�6t���t�V�m:\���o.HT��1Z������FN]$t�§��ѣC5�m ^].t��wQ#!h��)
=�F�yy�,ֶ�ZT��*�FJ���ѫ�ѓ�B��"F��ѓ�'�m4H�#D��`�$d�"F��B���[B�dH
D�,�D�)1l��i24d��ɑ�4L����p�D�!援� �F��'�f��)6��2�M��2�L�5`px��:u&i��8Xh��)�B��ţT�(4j�F�0R�]U=1jr��h�+F��i�\�t � ��ظ�)�J@��o�t �>r� � #a(�b���' ��X7*Z73���$�8 ]9g)S JԶ/�>�[Ry8��z������n���}c��� ��ζ,/:�\b��q��m��N΋�>*��*�����M����+H���hW!>B*�bF-�Dn�n8�a�ۡ�����{�����ĝl=8u���{���08b2��<PD�Q-����se�;��;2B�u#e���P�ˌ���6DĈ#EgA�NuF��+ 1��`�5dj%�� Q�V2(�J@(�� }�'�@�[��X�:K��� �X�[�1(�)�^X�,%'�F��JHd�����a���å��/B���+LQ��"����en
�c4+�F#K���Fd�'� �����9i3� ����% ��`�Q�Jƀ!A��x��P,�u0���b�v'"�V �VŴ���ZL,�Ms�NE��'��
��
�P/$`�n������T�Nj��Y��ʈ+������k� ��� �� P���� ���|��(8ੀڄaa����I����ݱ�C�ݱ�_B>hu ��l�VM�6d�p�j����8l����wN\8@p�ٓ9�ݴ��d&S)��ÆLיLϚ2c2y��Ĭ���Ù��hᛆѫ�M�F���WK�4hh�h��h� �0JV�[cg�ch�6��h�4h�OF�ry=Ϭ'� �HI�F�wJ��#*l`NN��F��`�O)<0Z$�� �gF�43B]'t`�ys��"JB�"p
0#{�ȠY��{ކB��`�u���IF���th�O.��N�1=
TI%D���N��N4� m2��W�ZJ����I�Ȑ�H�&F[&JL���&��&F�H� $��<F��X� �h2���f��LיL�S9���4`e4^g2q#�i��6?��1l~��)�d �f-��j�ɣ&��J�B�,�u=b��i�Ӷ��������:�t�fO9&6Zs2JBfzy�iP�`�aP��&ī��7}R3q������b#al�+�C��s��ٲs��Ԇ��,�0R �,\�r���hT�)�R(\�*��`�{K�0 �.:����^�kh�( �D�,�F|5P�+BX�n��� )^I�<JZH ���v�'X,z��h�S��V�ON����?ww�h�� 0θ��ge���n�}�g2P��J��ftl�tBRщPq*
qPr+>�G'�V$#(.#�q�!$$BHahx&����7�@��� 5�G
���(W�),l������Ń� D���(% �!��$%��bt�hJ�%K����Ȅ9��yb!%��L�(h<"�#��,�9��B#!�8�\İ;X�K"!@VZ.��`H��bg� ��1�)�b�@p���@(��ray�L�_�[j���
��T� ����0���1�
��C���ЮPVO�-�����ͻ0��W���=_|6�k�a�;nz���1Tf�.��ձRb�/*�T=A����3RyH��4M��'�������R��]/t�v�/�� ����J խNb�[5/4<j>4MG����M
� ������1��Sɍ��Z��p ��0�� (�
0(0� Pa�����r�����C�$#�#��(��f����Jɻ&��l�i�5c)9i)��͜8��R|ґ�g^�������f�G��g5p����G �2�L�<��FS8���hɔ��n��F�w��].'�\�f�Ѳ��X�O'���t�O'�%Ʊ�m+i��'� �'��OGFmƋ��!SM<�aC��ՉK�)����4hj��� ��m��*ZB�+D��� �u�ky�$k�%'FŦ+߽��!� $l��y<���� �%@�d��H�'Zeh�8�Ci� ���RbY*2��V�-D���M�4R�22gI��y22)5�ć�d��'Q6Ӂ�C$-�4�y2�M�N�L��05d�A��6*8l������ ����P�6@����̚3Zj�=KuuN�F��j��ҧm][��1ur��(ZrLj0H���˩ ��<�`kP ���F��J
�(�R�P����|2`d)�\V�h���NJN�':�v�����pt���y;�w,qiz�We���u�؋��tq�nvȼ���� �,��� hO!�%Q.$�<B8D���� mV.�z�86W!<J�&�W� �d+�n�L�˄τ˄˄��&L�b���ʰ�4�ЗX��P2N�fW�X���<�h kG0.ekF]�l ��F|`̝PQQ�$�#���\5b$��F@{�����f����uȁ�'V�@�P��-׺����E�%#b�%�R�`̕��"Sĥ��:X0(bPRX���Y�2֎�I#��+%n���Q�!���G)��d�:5#h����y1Z9R3�4� �$!@Л�F���,�S�f�a"@Q.��P��t ����ށ[�OH��&V�
)���Q��@��_:��~�*&�L����I�u3��ɕ )�hz���_��`�>���A��{! �\x��B��A_
�Džx��E�  IΜ )X':r,(z�e�V
X�!4��f�ӊ��"���SI2�P*�R���r�4�'H�{u�\r���s�M��\�� &�� � ��� [x [�%ն��|�;��& @0�S@<cǎ1�#�"�\�җ�8V���� L�壚VS����vMf�Y�֙y�f��q�N[L󕦯4y��h���&�g2i6`n٫�.��lѺ�S�S)��IQI6hՀw�.;�\`\`���FPFظTa4xK ��h3^f�6�̈́�L!0��4���̓J�%�i�����tT �,���,�(N�hP�n�Q�"���r�
b0�-
RP�$ �H�`�~�7��nN€�O� r�I@��1���,�/+m��ǫ ��'��˥���FкO$h�N��)BD)IL�EBNJZJ0D��z),��C�g�e�˚�%��Yb2Te(J&JL�KdM%@���J�E$��I�d��'��#d��(Th&�������C�����^@� ��x k�
��p��8���wS���~���p���S�C: )�CɁ&�����V:P� ��^ �~ �0('�5��'G����\
�H>j��U���V�6 X,e�����+Z���t�����b �hA �2n�i��7��h����͏�9-9X?J@� 1l���1�� �9{�M6dѲB��+T���z���եV�si�WXN��]sk֯B��׮@��B�eLI����M .l�l �- 7!A�t[D}��8��HЈ���@�� E� CPn\ > g��.�[�.>� W�^%p49pk���=xepo�fp5�<p0��,��`��������S�7?�������g�?�9�?���Q��h)U@6*���)�)�0���P�fʅ�*�ON>J x�|�PRd�5�&�(,Tf�D���1H��J��^�yQ��=Qµ:����2��+uk�� !�� �&DM�5@ND=�`�'�SK�)x
�B��xz ��� ~�AF0��� F�˓,�*&��`��"���"�⤪�RU�*8T,:�X]tMZ�a��N�����`)Vl�����>t2�'Q�D�zd����C@�����/��� /�O���_�D���.]>Bz��k?����6p�FSN'JjFR.p,��k� R)#��I^Jč�#�G�$����w�:L|���n�K)y[���K�+p�P�K�R�Td�r�����o+�6#8\�se��Z�seq����#�X�i��`Ҧ��R�ji���,1>l��?t�rzj��U=+��g��䌤>���$e5555#��ޝ驝MO8���e3͙8�>j��)�<��6r���=`z;`���Π"t�|���HB-��@�XP����*�^��S��*)�i��JΪ.T�X�UP�Cc�Q!ԣeu"J� ���[
�6�LҝL�0b�:�=-:�0<�aذ f.� �+C�g�����M0! #���*���/��0�������rB=< Θ
���Gf���T*:��Q�����b�x����Ǫ*�\t��@^��
�������󫎘�����N���|��܆���$P,�܇���8h�ÊFR8��Ԏ(e5SaEl�v Y��,��#y6$��$p�M$t��$�ѸQ(�:�y-$�n#^R��[%�� �<���J��oK\.yse����+���V�W-`Z��ѓ��I\d�k%����ڪvT�����8h�ĎR+X⚪wU�P�ZjF�jjFR8��Jjw��u3�(<�r��bjgT�����􌛯6q4�y��É����_�}�]:��(�&>��`�� �ࠂ�H�jht�;5 ���u2C�'@U��� �@VK�@�����b���Px,h���k�d�.BR0�R�^щ%!�XʀbJáHm��@C,J �2F�<�@HC�E@��C�/%�Ȥ �0������-���>
��ÅN'0LI�:��Xc�7V�A���(2P��|�#���,T��E&�V(H�%KNUNGg Τ�_Z�%�/qQ�З���,X<3]�!V�xJ�6��IP���� ϒ� Y )�$�>��?C��U���(�>�tnGdc�=��D�/� $��uQ��AQ��5��
ԋ]Zr�@�7n��h����b���m��Ţ ��b�����W��c":|�_�@B���|��%(`Y� �d'������͏&�q5U{+�3
Hh�"
(<1`4@��_��2#���ˡ��?:ǃe��� �!���� �gCbdC�� ��m I�Up��\讼U<)<U�d���?:� ���h7��E��P��dR\`�AN�,����URI�#:H���)�J3��I���D��l�I�'d��w
�-l��'Jc Z��K%n��4��-^4�V�c3����F �,�:\��%��K�O��]-s��6�����Τdٓ#ƓGT�\�ښ� צz�TML���>�Ď6qMH�jji��SST�MH�#' �55554����( �H��p��g �@�`�:�qZ����$��a$�Y@��L8�*!�@�����BM
�a����� ��J22����xh��,�͌B1*@T�Ȍ�tD�r'`R��a�Z򀺖�Rb�A����#��,��ē1�[�W �H�倷J�˕�
X@(`Y���4h���Se)�PZ��q�����*���FR�H�;� 4�Kn���R�1\uHu9���% ^�<�<�<�:�=�z����yu������ �����g�|;�{!ݗ�}���dC������������hz��_�Hh��c4�S�z�%���2�z�����V�:��eP�뮏�e���� ��u���,8�z7b������bB:!:tv���������馍$q#*Z�֗�V!B� ��@#�L����Y� k�Rl~ �N�M�o\������>�!"��dB0D!��Q�L�� ��'���Qe��Xb+����o� 7� �T Y��EW� E���B�����蓕���:�{LPȤgIX��F�o(��Dġ҉C�V�C�%l�<�N�C%R���Ѥ�W-p`|�0d`�S%l ^V�s�"+c�HFl�,��8V�����󏾶��SG,�4i4tҦ���uC�%��<��jg�e+��MUPʆSSM�H�G �Hx���H�5#���i�����2���$`�����f���R*-d�.Bb� q��� �K�Hd�U
x/p��L" !P�P�PJ�TX$���J8X%�� �C���Ĥ8��̈��2�,��������-eA�� �<4P��`�9�8TK�|�ؤ IPv�c`���8��I�#�l`�d���a�1 ���m Y������{�1���]���N����zǂ��������\�7����4�'pF����<l7R U)R��P����9��*L�)Pf�UN^����EU&�W�6N.�9R+g+�����ҐS��\�
א�m��6p����b�s��8�Fy��4F�R,�"$h��HH{l�p�h6E��C\z����4��^F�]A�\N��A�E � � �Q��e1���,/X�hY�9X9Xp����������\Z�K�n�+<u�,h��b|�ж#!Z$:�����2!U��ŵ'
�N����j�>+�-7Zr�`,Tt݋��w֧Z�����������Y�3� ���%�:�F��N�s��Fh 3!1 ���!F|K>L�]��2Ѕ���� 4h���W����� �q�4���d
�.��hk2��6D؈dR�� M���G�|�C� ̉�2!X�
�D:(�"ˢ��� 1Yx�؎�R@߇��d>��A�!��
LD�C�0,���$ZOFu��(hdL�"����;�%��&!F�Z��l��)��d쓲T�T�Z�r�\d��0`Y,�[2Z��3��-xɡѣ#K�.<0p�0d��o,��% G�}kJ�Hɳ&��S�Vʧ��uA�M%uA����0MR�j�UU6�zjFR8��gM�N�cɩ�(NMM6d��w8�z�=J� ��qC���94
=�@L`����Y�Ml5!�K�H�A34��&�10���A�t�`�Ht+�In�&:��BMA5(VP����{��1� �(Հ�~V
�`��W*A�l��׃��1����GF��TlFrX� Є�$� $�Q�R�i�%8����-��r��^��������'p�B�%��#��(��TH0 Qb��h�0) ��h�/�5�a�TBP�� Cdb��6K������)"* IH�+�Q�+cW���ag�-
��2F�,�f0,�1�I�ĝ!*�+
T�T0Zű��V��X���(���HTl�W=X������jP��z��^��������+�Î���S�C�!�] 7�@�{!�����'HĶ^C�� H������T"����-�ؘ���4IHh�� TLAH�Ꞩ�c�Kk��=a���
�LP8/��8b���e��=����ǗZ0e� � �&�l������!T =S+A�X�@�g��������X�p
u�%���up+��S�M����B:���\���2Zd+
Ao%@ ����!�ȉy.�Fȁw,%��Q04J��
B 0C����dѥ�X4µ���8� B�q��z��ȈdWlW��]�w[�?dx���H.�$ @��S�+�+,[V �� GN U`�ش��t[pp�]���"��めXl@/Ά�a�xo�+bk�tNr�*��k�*r� Z#"!b��4GIJ�3l X#y+�E�Γ�[)�:S)yS�J,`T��
�r�[�F �K%����:N�l������ .`Y,������4��Y:��[� 6dٔ�U1T�OURꖕ=C�]T�'<��P��TTҪ�8�����2iH���/ML�jjjy�֚����+�2������MN��AIx�؜؆hM�-���qu�i�y�R'��15H�b��Y��_tn����e&G������]4p� �Lj �� �-�[�G����pxt�z� � 4l����@�J 9`�|
H�;� | X
��J�(%F��4
؊�ɉ��XY ����s' i8�N����"�1�0q%��(K�(F�� �$F6Ch ��j���K-x�=�+���R�#,� �I) ��4$H 1�ѐd������0��ǟb���|(�0Yt��<
Z�Grz�:�*j�%l�l���[=�Hݾ���k`��Nh`�������@�/����x���;�Abٺ���U�(\��6�I���*4V�A����2P�I���+4V��̓2ٻk��� b�uL�^���եR i֠T��3�W���^3��� k(P:F��Ĥ$,���x�V !Y �!P:
!j��*�Xl|9L-��<�xp*��<��@���c� � R�`�u�ң�N�9R'�J�*�냅�NW�tN�u��D#�\ݳ���Q,h��_d��'����ZXf��F��\���Z�
V���2�e������*gOd��Hς�<D�sD��q�!ea0Y1i��V� ��>NN ��d�9@rF�0�FnDZDy w P0`������q���� L–i ��V�XV��ŗ���H1�����e2� ,2y�#�n1��
�����Bˢ�x���m�u�v/<^\/�8x�x_b9�#w���`!c����lB�!��Y���`���FrN��$,P�i�Ȥ���%p��s��Q��S)��N�K�^R��J(p��r�FL�K%�80p�X��k�^Z�4���Q��FKK�4Z�ɢ����g��-N����R2lɫn*z��z�R����T�5+������UUP��T2���Ԏ2i8h���8�ӆ ��-�i����`��*z��Ӻ"by ��D��z�I�
Ђt@� B�!��s��2&<LlD<PpRhC��D�D,TZ'4&�(/O�� ̈&D"��Z`.EȲذ�TtYpt�x�|�|������s
�.����֌�2Jx�К�4�t
-���[��BܬȔ@#yH�"�4�'�"b�p�V�h�Vt�X*yP�D� �K%I^J(����a�5���CP`xlҕ�ẎX�^\�G�B�Y,��K�9Ҁ�(h�-edši��b�d2є 6I�� ��B*{R eajp"�%C�#% @�J��<^����u�=��-�\H�z�F�/%TC��@o]$\}��ܺu�w^�!�_�p�X!v)Z@FrH�b��^���h�v�=��y�NZ���$&����
��l�c��X�.Z�ir�U����j���K:��F�]R$���XV[�, W�gp<�b�0��0�=``�^�b:���t�0�^ :Yt�w=>Y{?a�@�М�RD(��� ����Z19N��%!�JCS�� �Ld��F���7YTr�����Wp�zh��M��с�S�fξq!Zac4�8:�
bS���{I�O!H��lZʐ��<�4+T���`�Yi��6���.`�-�з=� K'�B�ӈCE'�@����\�.HЄZ�
�&9& �2��|>BJt'P��1X�,XF&�=n��0,�3�P���Ry���
�L �fB~p>@���"�c����2 |����FN�6j����FM �/bh����Y��c�aj,8-E&�������x�����������\tn����:x��ᑼS$\�*0. � ���d]<�vX;�E䠓�KD (� ���8A8#$@��:������ 9��)b�t9�D����%t�����ZhU�
�*ЫB�B� 8��p����� �p��Y�D�DkA�A�ER��Ы%��%L�:��&$n�1":��&$n"�<���n��R��Č
(^N�6��)^W+���,�F/�\�������4lx���ђ�s%����ו�,����6�$d�lɲ���uq��Z��m�g�uK�,`��ǜX�k���iq� 0i�O�y��q���@��^��go����<���̞>��0imc"�"z�5h�R"�䂓6(6)�C Ή�DƄK��"�VtV��M�Р�S#"�"!�I�E�Y�I�B!Z��Ⳃ�����Y@.׋m�������$ijo��𭒖�V!P ���9����\
������eD'��0�x�0�B\4 "�p�A��$�"I0n�� $IA�'R1�(#21�{%J�,P�����:��<VK��2 1�L �P#��(�$�,�(�aȜ A8�R#��ea')˂�5 ��4�0�@�_�����a�4���r
4 � 0�4ME�`SAt�8 ����2����Y²�-��Զb�E�.�6��z����$u�!�굆��-N|��Ξ��1d���+>}�/i�
y�L�gP�2H�o���G@A�RDc�"�7S��
�E��� @ǮP�x��Pm*5V7Tn�SRl�\Rf�6ԙ���\��Qbu�����צZ*�X���m��X��� ,\`��6o:|�'�S�Β!!:3<D|�� ����cM�T0W� XD8W�0/18,�p,� 1�i�/L� � �H;8Lp=P&� &\��a�ī�E��/q:�x��P^�2��5"�,V����jcr��o.(Y=B�2���HI�FC�QH���*5 ���&���uF˕8�ū`�q��M�Z����^Tu��Ȉ�GH��F�
Z�)".B��$#�Z��RPiIF�aѠ��*B �b����%!�D6D9�N �5�o���:��u�%�>��
���8`F@�� ���\*EH�IAtͳE�� ��y��V.2h���l���'Jɴ�y� ������Ń��_x������������;x�����c���ӣ���M��Q^+�Uf�"�~�H.�n�x��ȲtVdQ�����dG̏����Uƌ�2g�6�N^n|� |�����}�mH���#��x��Ѽ\lo�.2^�{#�GGm�2Ac��V�Q*p�X�%��":F�R#�r7��8L�iCgJX��&>J�:�VI�)d�V�c� �J�-td�b��x��#K��4k.d���E��K�-t��K�%��@I�i#&��r�!����z׭z��׶����,>�
�,q� �m�X!`��}���q G�@D��}��|���F���@��<��}�M�$���xT�K�V�[x�Ȧ�����}x�����^��Y�^,F� N �bۃ� � �@dz���t��ຼ\��}� � �̞?#�FEg�����r�v�1�5�����1���)� h3A��[��E�CĂ�B���E:"� � b+%#�㥢�K�E�v�����lI���A��_#:L" �F�b�b��!�X�hp � �����PĜB��-Ek���b��X�F��-�H��p\��c�^�t=� �4 sg������_қ�+X�ֽ�=[b��\�{b��U�,X.��b.):�Rby�M��DՄ*|�DLb�,�c�0�b�?�T�C `|M!{"���!
ÿ�Z )Q��h��ӱN#'"XX��Kז7V0Vꡊ�*�elT��*Du/R6VuX����^�K^�xw^�Hvq��������{�0� �X���cHO���u�A������(C����� ���0 �a�.�w������!���J��p�!��P�3�1`���+/:��تb���W�Cu�7HVHW�{�n�u��O$eֈ��HB����H^y׆�Sʂ䥴�u^�`]V:�]�/b�q�^�x�\�1�]�e�����%dBahD�O�3쐇 ,� �g��h�Q@�T��TAB!����옌�/E*�C�2�@��9X��������?��H����xM�
P�G��,L���Nxަ�Lޝ����hɫ��w�:p�3*X�:��V'��IH��G��mX�����c�3lՑ��=\><At����B@b=��Dئ� 6=ž
$!�V,�-�,<Yt\��2:j��ft�f������b��fM��f�|���&R�� �����-$c���5�g���;lr�~��x���C� ��ю����l�p���d�N�$n�1"z)��6$�I]Fx��=�X��'bPt��-�y<�X��d��d�xɢ�l�[-��e��%�-�� e�,��:Y��(d�Z5#7t�pҦԺ���՞V��U�m��Vy���k�B���6��}�̾��д�"��}��>���}�$(Z>���8���q�Mx��D�
��
�H��-G� f��8:�����M�j�x�t�v������{��9dn���_d]��0pс��Q�CvE�EW��1��`ʁ|��d2�DŽ��S�A� 3AO�<�mB�
�$M���C �62 q��0� ht.�ḁ8�N�É:bp�R( I��dBQ!�0]��bp��jZ ��;��*���kc��dJ�ea�Y
�r���eak,���t`�I�����; `Y��y���Q0�@*@6T�]5����� ��2R���B�ٰ��+`�[�qb�k�� �i%\���.P��嫂���ƋX� ��0-u�Z��c>�X'^�2� 'A>���!d�(I�X���IM��eiH �<��1R�U��ruΪ8V��^�#a��"�� ԃ0��MQ����8R�����^�� ԩ K�֯^��i�-`��,C5�O:����:��^�H^|�'BRt����`�xl�Ca�Ja��0� 8d"d�rB��E����A���#���e ��^�hd0P�� �yz�\^�`3n���,!*X��: ���1 M��8}���Bu{$�:BHu��2�Ȉ��ӛ�H�B��6�勌B�<u3�be�تu�B������t��,�<�Hϐ�%B��HH�H΄Ny -��¼�G,2,Łn#)D��t!���� J���"��G$�H� h>P��� ��| �W�\�(���R�IP�gU�SǓ�N�[��� �����zJ� �*^���c�N�����:hB^����#�G����G�W�/2d�j���{�������K�X� �����c\[���s��i����U�hBj�jFL�. �A��Y0<o7��j��#�Q�C���+L�9X�鏛<����7�����1��L��04�Y�;o�Ъ(yD��S���K]+d���LH���ؒH�̓2N�;�JNt��v(��'�ѱ+�<�咳�g�])�:0^2��2x�屜`t`�e.d��2�JT�k�_��m>���ㆍ�6:��n�^���Vy�WR��ͺ��6�q�,q�8���}�̾���/���|�Ϡ}�Y$�m��e��^Gx�� gG��]/��f|�挙�4<j����3� R2lɪ�f 9:��d���ˢ�[���:^=pz�z�����`�{F�x���~7x���$�0������)�
@��R����-�<����%i�3q�����#b��C��#��JG�Γ���' ��,1Fy�!�"��G�g��ѰF.�(F!�%b��P�-<4#7���%b�j��P��baQ `�\��V)z1����PVQ͋q{2�`%P)�@L��|4Z�C(H�[P�8��r�}Q�ŕ,�ԽP���e��͸�[RB؞�ƒ��"W:���� OT��-V"X'u�I�������!
��授�ΐ���3��"C��(Չ�tH���;҉
�PV���J�TX��c��6�h�[��ިFT��![bC���W�5��Z�[�1`X=�sb�%��%�u����������C������u>���� hX�`���6X��PED��7x�r RB�16<p��#�(b�3�:�6 ޼'��'�X�
�l��A�u���-;�y�n�օ ���7�2� { �|t� oo!��n/� �ly���X�h�Z�p��p�\���EWO.�,.�|n���<�������c���t�D*Zį#�,eO-�#�:Ї@B�?�HND����Z�`����+����υ<,`f� HP���B&�e3�\}k �=�\u�:���\�m�q[-Դ�5-�q;�Χ:��RuMI�ǔ�) ��H'��O��=d/d �3!0���.3y��2��`Y�n-�O����e��n��q�݉��+�n��&��L\0y�f3l�j����MY1d�?d�y�F�0d�ŋU�Bl�|Ɍ|ᛆ�G�4;t���y��I��?����V#p��k���S'd�N��� �R'H��R6$�7��Hĕz5��)y\�W+u%lKV��Y,t��L���L�R�;%��'d��LKe�-��,t���F L�l�s!;` ��o�
;ˆ�O �A-d7B\�&�kt&Pj\����n�M� �a7xN 8�g* �!:d'N`�NZ �A� �g�>�C>�τ���� �!>< �a;d'�|'l�b�N� �g�>��2� %�� �:^���lLؙ�2�O�:`���l�+�O<��jf ]H���&ΛL���/<:<>^@t|Ɂ��H��ۃ��. 8Ahx��倿Njˀ�@�0 ����UB hpR@ �-!`�#��p�J4&9hh )p`��:�R\C!��V��lVd�9Xe���I�da�P3# Y��0��D�10И0�H���
C,�9�r�,h ��0F �Fa����,�QHr* 9P�� ���Z �huFVJ4FD�*8k�^;Uz�k`���� �)�� %Ef��� ՃPf�XPj��F͋� ՃLl���Z��U04qb����&ԛ�\�z��W+e�n%>���e�ũ�� X� �Z>��נy���ȉȋ��^y�ŇP�1�)�!�"�~� �vn R�T'�*Ԡ�@��ʹj�U��J�L֦Z:Pj�Z�EC��6 �i�5^�z��\H���\��`r���X6�v+�
C�:��^̅�xR^y菡:���H�Zd �m�(� �W���1�,n ��(�/�)0N�`*� f�Q�v��BV�`�bU���[��Ku�]M^�b�� j �Y=>�����$�w�"��h������Ǒ��Z�i��N �ױ:x��1�ίmի�;�a[{�@��J}�JP�8} $�'X�#Ν%d�D�"3E��1�Hb�2�+���A��R"dE���t �
D�p�+E`AԨ* k�����_�� x����R �i\R���p�.ٟ��{�+V�q˖�r�mKJi�'eMMS5�TԽK�1QPt��G ^b� #�GLJkH���G���3� ���3p���&O1v������ �
W>/�2p�bt�b�����fMl��I����jx� �\3h��i��m�L�6y���8?d��ۆ�08p��FL[ 4>p� H�Ӄ���æ��fl��$��
�,���'^R�:��G�Q<��)��'I^D�,��N��i[ѝFIJY(<T�d��7 eGJd��I������c l�Tt���KVĭ����P������OTt�8 ���9)x���F��_�,� �6�BtB �5G�p�&�Bn��*��g8��ם �3��|3���φ|3����@��-�-Р��C>�> yН2�Na9����\`�{%�0���j�����FL�N�:g7�����Φu+�����N��j�с��N�:�����������-�d��:8<;��x�㷄(���� �0s�&�YS+��U:���:C%u����F%+��F�K�%e�I+bV����ܤ�9�4�ș�FĬH�I H�&1$�� $%�Y H�1:1���Z&/*��$��`�,t�X(t�U&>K͇^��t���=��D"��"����=@����u[��ިXR�aq3�E���ر�^(�b�UN�H�us}���^)��� ����� ��b%�E���/( 'P���|D����'H0NN��O%԰L$*b�b����XX�ե�]l`����u"*� ��ָ$�b�q\��R�\���8�q^��6#fX�ObtKz�����<>�,�(����t����P2��\T8K����������bŀnU)2��Y�A���H�p��%�^z�oִ� ���A�[`ɂ�ePS��@
HW/uc l޾ٗX��bˤ`��l� ��`o8�����^(�uh���E��O o@�Wu��Մp�'�Ou�ˬ��y y����:d�^�/"^�|��#� �F&�*
�P��ԌD��Lt�7�O��R�ЁTs��e����I�*)�cq���Z��O��m��8����-��˕�6�c*]X}C�պ�ݷ�qcOSSR�sƧ̞hɔ~����L������f3��f�����0,�u���0�0���<�i2��5:i6p�l|ٓF��3t�Ӈ�<��U���O[ �g1dͳy���wM��G��8hɣ��6��0<f���@��-2?XAd���
*p��Ǖ(y;���:T�� ��u#�lHؑI"�H��I�P��N�\��n�+yd�ҥ�gJX�M(bO(:O(\Xt���l�[-�-t�Z�k��V!Rl*��x�O�t�(탆�8΅1�s��:��:��p ;�S��d SaThxU d ��7@�8U�vY$�;.:XU^�U^W@Ω8��;M��`� �Aۃ�i��«e�v\
�*����0��雦��8l�zWR<����y�4���&�I���%<����R�Ht������əL�W�^�zgN^`���x������b዆L�0/$�.#���,��V�(?@�-L�������#(&IO�� HxU���Y��,�98�H�� �~H4&"$���*9 �J9$�/&."I Hϒ��1��`F\R"��RFV��T��B����ej�éX\ʃ�a `v, �`r'ZJ\G�w��^��Er �I��X�M����u�W�j��0Rh�6�)`��Pn*9Z���Qbu��N�.�`����c!V��᮹;��-t4�`�� �������6/<��^B���&B1@FySD���� h�@���b�rj�#t���) �5 ���Fj�-N�=-N���UA���Z�8ꗮqRБ8�k� +�=�K�D�Z�\Z�f1^�y���N� �/<��<vu��&d��LjO}��" � �!�p�B Hs���B6�*�W ؘ�Fct��,�L��X6���W��J�B�KX�q�� �us<�T�:�K�zO<�n��8� -�u�=k��'�D|��������Dh�mj��W-^ y��1b��!}����^|�נ> ��e��C���N���d��$�D$��h/ #@6#-) P�N��dJ"2��! B��$�Q8Ad�QP"�(� H@��5��Q�qE%��q���!�y��<� ��������e�c*���g�8�նζ��n+�z�����bl|�g0<`ɔ�_/��b���]4p�e2�MWM�ͅ^{�}���fgM&�15y���I��̛8lɳ���'8y��y��5�,�-1<jɢW ��zV�!8`h|�m6�/4dڑ�i��g�6��dL[2^�t�|FAs���J�(��S)�>N�;$��(<U%>D�ȤgI$R6$rY�Hġ�]ҷ��%t��D��YҶ��F����A�w
W��V|�S*:N��JΕ�Z�d���f�A:=p:�Ƭ t*���l�@а>t�0bps�����7�
[�B��9���\ �`�2��_׃�|���:o�S�E:+���Z�A�tfA�l*0�£Y�0L���S��S�>{���υ=�s�NN�b��T�'�9p���$`�nt�i8�<r��)O��px݊GS������N�<���H��jU����c������4t��7M2^`ك�-�q W��|A���mZ��P0@���������8\|h���Z��Z¶$��\$NH�"�c����*7INQ%6$y�ȌȎ��H� D.����KbǕ E�+J^X+����J�R�`�X�X����,�73�O`�����:�^X��qY�"��*��ب�z�uM������ �
�ծ��1X,,�[uP�Ŷ.�/.�-�<�R`�DK��,/`�Wu�¦xR{�O�<'�zy�D:&?�h �A��!��Si�����e,U�*W'�$ӡR0Z��[{eʜT3X�X�������8����+ć`X\W�^%/:����Ł�D��:$���Q�/Oy��ײ4e�DV]=���(��Av��,�E���Ι5L� ��M���� � 6 �ά �M0 e�ֆ���h^�@���LS��˝`�E+.R�� ��>�"5���?Er�0dl���XD20��!p����d""�c��\ 0^Ă��GS����װ���מ�xvu����Y�y���#��O=��D,��d���(KаB7@J�C��rV$b$��Q\��AX���S)bN"JO�b����(��� 9K)O'{jXݞi���:�X����/u���q��U{�+k�^ʪڪ����*�N�:��U�R�7y���W �jɼ��I��i���6S)��R��f��?�*��3:l��ӓ�̚M�4��⑓��&̛2q7t�zFSR2q8�6>l��y�&n��j�=^fى�wM�b�_ ��a�%��8m0d�8�[ �bс�F � �&\N|��Y�N����t���k������$�H�$y1�n��J�9�LI(ؓ<��Y,��9�v$�(d��c�岅���&u�L��4��E��6Q� P �e���K���<��6
��U�VB
�Z�}��H��������,D ���@
ɠ��R�TD@��t�RP'gAG�pa8(��E#�(2`{^ � �''�7�������< }�N�@����'��>�3`���B��Υ:���R8bl���WNN���j鳆��H�3ұHu+�R:����S���uEK�1H�gS1Lu==;�d#��� ԗ�a5t�������Fl��@����$O������*��!\�U� q�sqC��x _�X�����߄Qž+��4��������
` Ѕ�fǻ���,���,���,��O��8 P!�P�.���o�������!�r;Pr�rp&�ѠV���P���NB9�K Ն��e���V��-J��a�b���8���8�Å���`���@O��b����̢d#Lj�*:��t@F�`�� ��??����c������������
� X�
Ѩ�H 8�n�UPb��A�A�:�Aj��k�(EP����ֶ�t�$�L�d����NB$���OГ�䅤a?$�0Д �0�N �`��0ᄌ�f���� (K���!��:���lP��*�f����5U�4��U�(e5#)6q#'�J��i�J,qYՕU�TʶU�R꣪تb���*��`��b�GV�\���z�����Pꓪ���'��:��.)r��uӮ�e�8I'��O%y3�����DW��#86�M��cF�+x���G�� 8\��Ise�ѡ"d���<���e{,&R�`Y���Y� a�S� cp,���59Hjn鹩��sCw���͇f��16:j;7y�2�g
�͕Vl۫M��Fްٺ�e��p�y��W�:��X�v鵙��c��4!u��&���2�?a�y�PP"Bz.����@j.V RC�Br�š@uc��]T5�W �aEm��Ō(L�:#lj�&:�4OB ��=$��$��V�jFC�PkC0� 8M�4��j�<��g`Y��ՄI�o����n*uK�UUUV8��ӆ�)���Jy*���:��gUU����WV�SOT�MK�X�:��g�^���TT:��������ʳʙT�N(uS�j��f���^E`2p0e��qh(hB��(�p!GX��:�B��R�
Z�q
DF��t ��r�!f���8l�!�Gp8z�(�pQ���)�l*L@�)a�1daPh �R���p�0,�PWK�z4 (����җ�;���'c������@�D�� @�\8 a�� �a�`� �`.)E�pf�Ԁ-F���IR���X��Τ́�M�X^*���/L�1R�<H��`$p: @��T�[A�����5���)��p77�������nѸ�nM�BAp�8 ��e�#��uQ����U j�Um*�ejV�X��ubVظ����+ձ��\ˋ�
�\v��"��#B-�#{�"<,�"i��� `Y��q9�b�QH^����&CU�+���9[7��S��mc�I�e���&�&����>H1%�&.@� i 2A���$b@�d��3� ��8��u�H����d �6�m ��d"�"��%�����pMdLx�O��X~_1^@���«uh�.4,EgE����D,�)�""c� ���t> �/K���5� 2@��D04G �8yf�������V��SSSR�6q+���gLuec-۷WRucո����:�Ť+X�yC�=i�����Z�w�uEk*QQQTʇ�u���U:��_�L��4�@�S%l r�5��Z `����<([|�7�Ā��d ���px<���,�H@o\z��@��p| � M����@�:���2.x@� ��!��6���Z�Y���A|�1 ���z6BfC���/���<`b�&��1b^!� � �`Ԝ�6S��O5 �c��r��m�B�@&/ i�㐳�B�f��-�� �5!�+Vy�G�@e��0��2 Y���bvl`p�����H&�5��j/��2M��񳆃���+uY���EOTd�ꌛuq��+LםTf´Ƀ, �8��ǶfŊ� �/uٕ�&mO�zC�:lt�F��C�,א>����y�����Y��� ?FN���4�[�2d �e*:� QBP?� @�XD��B�?JГ_�.'�LĘ��G��$��N�0<ćH�-40�%����3@̂A��+�c;�1��u�p��t[�M
���o����M���<��Q|�9������X;tr|rF;���\Z,�,�D�)��v�
��Q���p��#h}�߇�k�`P�� ~����N�jjgR2qH�FM�6d� ��f�2d�b��X�<�������ԌT�����������(�q3�)L���j������2����*u[�Y�� )@�/�^rܔ�h
P<�@!w#i'�D�r�A�!��"0R ƀ���y�;�@����4�2�p^���xU�@y]��(�0F�Y���:d�
oO@�F P��� 03�l�Y��W�U0]���D����PJF"��[L9xOGB^ �@�����a��nn����^ME�@D���}J;H ���j�b�� �a��^H"��LK���^LE�p����6��2��p�n75�1 �X�\J�#�j i`Y�l{����������������̿�8q�F&���l F�F�٘j���[1L�T�]6��
��Յ�Q��mI��U��%T�i���z��̘,`���H�b� �b�����s��K!:PBFx.�Ȑ���HP���%!�1��k�.1x>�B'�#��Ѩ�4$�Rl�n����+�m�+�
L���X�̠��O�}�JГ��@N�Ih��"Bq,�%�a�1 �Q%HIC�H2���Bz%�0’a0 �.� �G�i�����Aξc�, 5����ų��"��ۂ��a�]�M����&:JA�dG�����u28�W����?�H'�m"��]��3Jfx���� ���- b{B� ᲀ!�0�,���MMT�ji�3�P=#��4j�W��rڊj�TUNu5=Ct�)�\J�wR�jꇦ>���F�4���̤mEEK�WVyS******)��| 5� ��
0N�@�@�O�e,?*�D Ux��K+�-$Ȩ%� GD G���`�6 ��$&�.� q�������+�1!����#ǁ��WJZP%�9'�� �X(���U�X
��k`�K���@���J��Hb�%��f�� �� �4\f$��2t�5G,���=dva}���Jr�M8br&���3C��"�q8��A s1�&�����~ �1����QEA�q���Ť�Et� �R#P�b��/F�9Z�$ ��e��f��>hA4>n>4��L�� HLų�BɻA�T���U*z�U*�X`�� *� ]T@X�����+�0p�� 8�����A{�Lΰ��:dB�&{$��Ai�_a�y�8��K�Xf �R'Xŋ�����X/b 9����B�|+$-���!`t���!�D��(�Dx�y:��Z�5堷ʔ��X��.�2X$\�H��@���t A,0z��v�Z^�W����/Eز�T�� �EFw N��8A��Y�AbAp�y�������"���"��ua� n���JEɪ\9tݓ7:r�Y�#�1y���r8l��Y�jX)@��驧 &zG��5Bk2<��U/QR��L��
�R�zG��sP���>�ӗTS���Ǔ8��u�H҇N&q[�*�z�
^���̦e)��@�_�壷��<QR,2b�;ҽ;�f� �%qC'3�WZ1���R�\q�T��n��2�GU�ܘٓ"2�K�0l�ӊG�j�I��"�\\*�+e�f��� �<��B$ �%⁐A��@# ����Bt?0�@�_7b�rlÑh��"��]�^j.�� �dш�`A��jt�X0 al�:9 &��ӪN@J �GiHM��p�f,��1�B, ��a��x���<�'o�����w�����w�����w���0<�� 1��p|�\5�љ D��Ɉ�At�x�STh��F��%&ʞ��X���A
ӕ�jӅ��+DՉ�X���Z��\X�D1ms�X�M^��4|W:Ջ(YТB��B(�2T_`���t,��mH�M1l.�0Vr�j�*J�+KV1$`���_`�D���e��вy�$!�(B�� �#e�Fa�Z ��lV��:�����#�A����86�r ��%�`d�T 4�_�N��������^�(Ev��t�YR>Td����y�� L\3p� �ɣG �.�X#�����ӃƋ� S�ML���^���q+�T��B��<pF7dv� 6Q�\�f��eSi���O&��q7dݓV�^r�Y�N�zgT�Ty3�O����e1���>��U��H�gP��L}3)*IL�[�������*^����f��� /L����^x��^x�D��x��6Q�&d�Y(h��L�e�8KD�-�n�%`G&bV�K����'@Ih��B�&��T����^v��@�JAk �0����|�/ ���4�HH!| � ��9��l� �l� �r�ah݉���iȴp|�T5>l(�:j*�6M�
Fg�EcEiL��LALy(�3���,L�]351p�nf|���t�.�*7�f�:ŋ 簳���{=��g����{=��g����{=��g���xe��vC�s���7���O��d��D�M�I���LUT*!T^����h�eX�c֘,�1Zu����X�W=��^^�s 3�WY0� ��0<�&/{&$4_a�yG��k� 3q;��8����r��X �u�q^�����)�,�����\dhB����/&E'�C������$)&F2(<FD4"*.!ID��Pk >�'�m��N d>�2prF/27l]>-!�)�cyz�6� f��5bm7t��c�7�̚/�8`ᣆ͚�4<l�тUʪ��n�zc��N�;j\X���W�<���'#�f�=���gggggggggggggggggggggggggggggggggggggggggggggggggg�d��l�FS<᳇�4l|ݓV�ZH�UES�N��z�jw���d��ÚW�0T}c�2���jU�'�R���ǔ�:������8e2��eED 63���`��X���N��&t��Y��ѸP�� Ѳ��Z&�:D�"�l �"�.)d��v��+XOF}�^�G�6�#�V�\�VU1�.x����&�୸,H-Z�kT����^�x�/ �A� �c�3�!�����nndr:9�Ӑ� fa�l/�H6N�f+��$2���f/�M��@� &����8���0zR������- G���A�R����n����E"i��Dk�����l>v����f�<� 4x!���8 �!�P'� ��`,�4MB�>��������P\T�()6Vd�UVb�.��S�J��Zn��j����+H+��(mB�W�?b�r�˗� ����>t���R.��bG� �g�HH�c�`��?�������{����w�����c����f,����hG�a=�����Z��,1Z�c���,�zPu�9�(g�HBLB2"�8ԝ98�L"��2 �XԈ#�CB�����4 `�0 B�1%�� �@%H$f:�� r��0_�i���Za�b������w�+�X�+��ݑl�ʼn�������4\j�����#�^����8f�9������6h��:eG��X��q�l�`����<ۊ֭^��P/v�| 6I��:� 5��y��驧3��8y�fk�1R�I�*uI�+US�===<敔󚇨z�
���̤i3'(zD)V%��uC��N�fS0L}+��Lʗ�z�U9�y!�P�N�[��JN��F����OE#>��7 eL��e �F�%+�)t��.��C���%DfK�-#,yS���c��ϴ� D-1zv�������D 4� *SDªR3p�/d~�G�B�@t|� �p�6�]6�\9�H7Jy �j�Ax��QhՉ��ht�+3�؜�M�� �Hh���D��H�r�&�6J���;'
S�C����b٣&���c�0v���Y��!�'��&��fã9������BSE5&j���K�&<��3��z������� 8�i�1^}X��U���px���� �0u�L]:|�B��.���� ��Ͻ��!�k�!�gT��C�E�ò�i���*^���-_���C�ē����d:�{!��@��F �3���2NJ�����p�'`N�� �FGK P�� �����2��JA@�Hi�停zм�_dY�q������r���c�Sv&�X��7�17��d�����GL�2i3�^�� \SR�é��������+������{(\:z�Ň�=�sH|�i6q#)9t���͏�,Pʪ����֧zgT�L�E��\OJ�˧.�qC�=S*���e%D��I�;�jiP�v �Ny#�0J�+i�LyC��R�,��!p�Z��3t��w��u7 $n��%�%���,J����'��[�$8$2%:$:Z�[E.<��+�*d��+N�e��q�l��n�: @�Q���+f�~$�8�""��� ̍��l88X�z�8G�$� �Qlݓqh�6 EÉ��f"��􃴂i���9x�P�9�s����'P��)�����aѺu�e�c�"SQp�9��a͇w��a�����\<$@��B���æB��~4�O�D9U8�X��P���KӘ�T�:��@�Rd���e"Y�� �)1Z���ub���W-b!�`��]u�y�:|��Z>&@��S���c�ZD��1�f�1�� �)@J�4��@3
�)e�w:��XΝf��� S� L�MϓV|��'�1Cї�ND0&���!&(�T��$��X� �C�iaXt+.'b0Y�EZ��G��� $8h�V�� ��1q��"�ų�� ��d��lBf�� �ӓ�W��NN��9^m6Xpx��vM�5������2�����Z�u����b���q��_]y�[ue��P�͍b���vHɤҙԌ��͘%p����UR�IՌ��qA�'�/J�+)'�p����J��wTTS2���j�N7�ԽM;쩧q*�&d����T�K�8��k�I�씶V�L�R�s#��%y3c�.#<K(��T�Y���jĕCh��Jl8��h���3>3>V�I�yS��<���3�n"�i�X�cTD����6 ,q�A@��oώCp~��?1%�Lt�)���M�􃴬R�NN��]H:3p�nj�Q���|݁����x�#�G��0H�zd��*L��t��-T��wL��"����9<p�܈��xl[�by��,�C CG� ��M �R�@p��+�M0Vj��s'US�NAWN^��r
��/T�d�G�Ypz��NJζ=cb:\up��/uא:txt�zt���O��H]d~��a�y,R�q�� ��X&i�( ��C{���.�� �߆9 ��6y�@f �� ��x���1�$d�#�s��9C��;�F.�� �)),D2:2h�yr�G > 4�����p|0b@dx����cw��� ����9>��Jc�����]IJ���fN\9^m8p����V=1��u��uq�����`���`㌞u����, >F}� !?͋b�ι�wT�k��8���4Bnx�"��eI�ONuUC��OOMOR}===;���O6�e#g$�2�l�g�X�rɻ�X%Br�vM�j�9�FR�n��)L�ÉV��_�"�6H�A�� ��5Z2tF@6"V�[cV�q�g�9/��DS�SbSch١���� �-p`�[�,yd��)$l�h�H�m2�$Lo\� ��� ���
��  ��h�E�P�1����Ax[ E��x�^ )&N>J���'����vr�A�A
r=9y��hƢ��X�Ń0� ��ӑ���6 ����RLf�p��0���A��%�seg#�� ��fr;H �i�aѨ6���_���� =�N�� 5���w�-���~5��X4 ���/(0 d�9Ji��FIЧ2V(�09 QɂqIY�w�1R,*6Vr�uCŪF�C��'+B��*�&�8� 0y�B�y��:vH���!�.@L�bg�G��;�`�w�����ޫ���z^Ǟ��^�=���w�w������l�(�����T�'^���N*b���V�.N�� �ecϒ��� R!�- A!jt"Ia 8$�����fN���4N6F��(� AXt+JIJ����A��hr' Xv��85��(al�sxB?��>���@d8>�]3h���T�US�MNu;�RҰLy+ӽM9�쩥u*Ó�k���T6�������c{�W=}�q֮u��m�PH݁fİ=�\���TΦ�2jѫI�:����&���������eK��OONꇥp��Ç �2���NO'^pɫ�.�6���6�ͩ�7t��Z9p偵%*ӆ`Y��R)#���-��8��WW�� 1�h��`����4��H�$86ll��\���b�����;��'@K#d��TM��h��'��L�>t��+�3'
�w��
�(`���%M�b��x�@p�"L\ �C��Cĩ�'d���Ӓ
JB�ӑ�F'&)ؤ29:hbht̀jɨ���sT���L���)�j�+MN��
'z��T��R<���F)$u!)���&���a�0=}�ӧ�Y� @l��� 2�0���)�5J�se �3J�9�W�0N�%���ՐU��������M�V8\�õά�<�t��Go<���2@u�PGgX�9ώO�>:@�����a�y�qX�B�A�KkCQ偈��s�C![0�b�a�u�C$������ ��`�#\HdD$a��HC�u"y s"<�H":L4Ft�� AA\���Ҳ��JHʏ�)@4p`�E��3�??���@�La0�����1``��4&.'X�������s�N��b����T�P�u�j(^���+qk�\q��Z}i�̸���p��؞�e}ۭ��Av��HW�| 6��{�Y�f��#X�w�>��vMZm��U8����'�T8���.'��������e+)\6@������d��כ<�zvN�h���T�p|��oJ�Zv �4��k��n�I\'`V�Z��Y��e �Y,pg�-P1d�j��i2O22ph��yk"+�+@0`Z���'��)<��S(�F�,���E!h���.}��U� �@E���W��hm%҆�Ȯ^ѐ�d#�<�iP/�A�s%��������P9�7���.J?8��F�ɀ�6�2Ԏԗ�N�]01J@J�1���N,Nd�j�%Nf���
��&H?L�0� ��xl��t������}�,�#�%�d!��e�h�L/NL���)��O� ���<��X������8���]Y��5Y���NU��i<�#a�JU�q����� ^��Ϻ롿v� ��u
H���c�"%!�7;U��g�g7o�6�;vevv�?��������۳�1^�z�R�;v(ݾ�O�݊=}�_�ŮÇ�)�X�hf/J�ŊV8�ckW�b #,W�c�Ɖ�� 1��JPj"+"@���4 �h��� Q�R� �%.$>J4$ Db))18�N3'JQ���Ƥ�hĒ�}�Pfp
��d� k�ӌ�eS1�<���L�0�02>`����OMP�;��SS�MPuI�Pʇ`���6��(qc�V�>��.0^�s�=�,O8��b��v��̅î5!e��P@�a����kۄ�Py3�4n�j�ʙT��U-R�5J��Ԭ�q3�R�OOON�zVNi2�aÇ �Bp�Tͦe3&���:n�i���08>r��' �@��) Y�X"^E%q��rgIY*��b�C$� ��:4tiI�+li-d���·I�,l�����8X�J��CEu��(h��TN�y��.��{���[aa{`� ���?��Ҋg/9���'�
f�s�#ӄ�MNA8<r@9t��r���%)�Zs$Τ46bllnĂrAt���+)L/2R�j���T�S,8���
�*ޡ��(q1�#L�"4��L�4 6 ��:x� 5��d��|Ad~;�//0N��#ә�!9/Vu8�-(�KҎ�ӏԎӽ(�[ԎձR;\�æ��Jm��<��s�+N��������tn����ן!�:B�!����C��4$t�ӬG�O::t룇^����E�']؝tR`�����C�ӬC���Ӭ]���W�щ�CIӮ�d��B��� c�t4{�ju���Ѱd.�a�v�u�{�)Z�X�k�%�V�ְtl����|;\��,�^}�,�����χ�'��O $4[LPV��dr0�Hx�8��%HΑ �r�B���I��':H�vIؕ-�#�1���@<��J&/3d͓��&' �<ґJ��^���zZf)��b��� TV�]]uuuus�>ۊO� Z�j��r����1{3��{6]fu��.!qHO!`��,��`؞���k��#)9y�IO�z�lV2��ji���8n᳆�<�y�'3f��j��㗜��×�2p���&M�pє��L�(��/t�� O0Hѵ#�6p��Gi)���wΊgE�c"�p<? ��y��t6�����xj���r>��ed"��<k�'xWOp�V�@t!��Ȏ�@��b�A�� ���&t �0��ž �B/A�� ��x0H0H0HBP��+(�1WBt�c Bt���#u$R)"�W P�1����T��v��&K\-d��兤e�K�(��8R���ťN8N�S%NQ��†ɞP�����y�]z�Yaaaa�n��

60
ScriptableRenderPipeline/Core/CoreRP/Editor/CoreEditorUtils.cs


using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;

}
return group.isExpanded;
}
static readonly GUIContent[] k_DrawVector6Slider_LabelPositives =
{
new GUIContent("+X"),
new GUIContent("+Y"),
new GUIContent("+Z"),
};
static readonly GUIContent[] k_DrawVector6Slider_LabelNegatives =
{
new GUIContent("-X"),
new GUIContent("-Y"),
new GUIContent("-Z"),
};
const int k_DrawVector6Slider_LabelSize = 60;
const int k_DrawVector6Slider_FieldSize = 80;
public static void DrawVector6Slider(GUIContent label, SerializedProperty positive, SerializedProperty negative, Vector3 min, Vector3 max)
{
GUILayout.BeginVertical();
EditorGUILayout.LabelField(label);
++EditorGUI.indentLevel;
var rect = GUILayoutUtility.GetRect(0, float.MaxValue, EditorGUIUtility.singleLineHeight, EditorGUIUtility.singleLineHeight);
var v = positive.vector3Value;
EditorGUI.BeginChangeCheck();
v = DrawVector3Slider(rect, k_DrawVector6Slider_LabelPositives, v, min, max);
if (EditorGUI.EndChangeCheck())
positive.vector3Value = v;
GUILayout.Space(EditorGUIUtility.standardVerticalSpacing);
rect = GUILayoutUtility.GetRect(0, float.MaxValue, EditorGUIUtility.singleLineHeight, EditorGUIUtility.singleLineHeight);
v = negative.vector3Value;
EditorGUI.BeginChangeCheck();
v = DrawVector3Slider(rect, k_DrawVector6Slider_LabelNegatives, v, min, max);
if (EditorGUI.EndChangeCheck())
negative.vector3Value = v;
--EditorGUI.indentLevel;
GUILayout.EndVertical();
}
static Vector3 DrawVector3Slider(Rect rect, GUIContent[] labels, Vector3 value, Vector3 min, Vector3 max)
{
// Use a corrected width due to the hacks used for layouting the slider properly below
rect.width -= 20;
var fieldWidth = rect.width / 3f;
for (var i = 0; i < 3; ++i)
{
var c = new Rect(rect.x + fieldWidth * i, rect.y, fieldWidth, rect.height);
var labelRect = new Rect(c.x, c.y, k_DrawVector6Slider_LabelSize, c.height);
var sliderRect = new Rect(labelRect.x + labelRect.width, c.y, c.width - k_DrawVector6Slider_LabelSize - k_DrawVector6Slider_FieldSize + 45, c.height);
var fieldRect = new Rect(sliderRect.x + sliderRect.width - 25, c.y, k_DrawVector6Slider_FieldSize, c.height);
EditorGUI.LabelField(labelRect, labels[i]);
value[i] = GUI.HorizontalSlider(sliderRect, value[i], min[i], max[i]);
value[i] = EditorGUI.FloatField(fieldRect, value[i]);
}
return value;
}
public static void RemoveMaterialKeywords(Material material)

13
ScriptableRenderPipeline/Core/CoreRP/Editor/Volume/VolumeComponentEditor.cs


using (new EditorGUILayout.HorizontalScope())
{
// Override checkbox
var overrideRect = GUILayoutUtility.GetRect(17f, 17f, GUILayout.ExpandWidth(false));
overrideRect.yMin += 4f;
overrideRect.xMin += EditorGUI.indentLevel * 15f;
DrawOverrideCheckbox(overrideRect, property.overrideState);
DrawOverrideCheckbox(property);
// Property
using (new EditorGUI.DisabledScope(!property.overrideState.boolValue))

}
}
void DrawOverrideCheckbox(Rect rect, SerializedProperty property)
protected void DrawOverrideCheckbox(SerializedDataParameter property)
var overrideRect = GUILayoutUtility.GetRect(17f, 17f, GUILayout.ExpandWidth(false));
overrideRect.yMin += 4f;
overrideRect.xMin += EditorGUI.indentLevel * 15f;
property.boolValue = GUI.Toggle(rect, property.boolValue, CoreEditorUtils.GetContent("|Override this setting for this volume."), CoreEditorStyles.smallTickbox);
property.overrideState.boolValue = GUI.Toggle(overrideRect, property.overrideState.boolValue, CoreEditorUtils.GetContent("|Override this setting for this volume."), CoreEditorStyles.smallTickbox);
GUI.color = oldColor;
}
}

11
ScriptableRenderPipeline/Core/CoreRP/ShaderLibrary/API/D3D11.hlsl


#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))
#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))
#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)
#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))
#define PLATFORM_SUPPORT_GATHER
#define GATHER_TEXTURE2D(textureName, samplerName, coord2, offset) textureName.Gather(samplerName, coord2, offset)
#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index), offset)
#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)
#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)
#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)
#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2, offset) textureName.GatherRed(samplerName, coord2, offset)
#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2, offset) textureName.GatherGreen(samplerName, coord2, offset)
#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2, offset) textureName.GatherBlue(samplerName, coord2, offset)

11
ScriptableRenderPipeline/Core/CoreRP/ShaderLibrary/API/PSSL.hlsl


#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))
#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))
#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)
#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))
#define PLATFORM_SUPPORT_GATHER
#define GATHER_TEXTURE2D(textureName, samplerName, coord2, offset) textureName.Gather(samplerName, coord2, offset)
#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index), offset)
#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)
#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)
#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)
#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2, offset) textureName.GatherRed(samplerName, coord2, offset)
#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2, offset) textureName.GatherGreen(samplerName, coord2, offset)
#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2, offset) textureName.GatherBlue(samplerName, coord2, offset)

11
ScriptableRenderPipeline/Core/CoreRP/ShaderLibrary/API/Vulkan.hlsl


#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))
#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))
#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)
#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))
#define PLATFORM_SUPPORT_GATHER
#define GATHER_TEXTURE2D(textureName, samplerName, coord2, offset) textureName.Gather(samplerName, coord2, offset)
#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index), offset)
#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)
#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)
#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)
#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2, offset) textureName.GatherRed(samplerName, coord2, offset)
#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2, offset) textureName.GatherGreen(samplerName, coord2, offset)
#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2, offset) textureName.GatherBlue(samplerName, coord2, offset)

11
ScriptableRenderPipeline/Core/CoreRP/ShaderLibrary/API/XBoxOne.hlsl


#define LOAD_TEXTURE3D(textureName, unCoord3) textureName.Load(int4(unCoord3, 0))
#define LOAD_TEXTURE3D_LOD(textureName, unCoord3, lod) textureName.Load(int4(unCoord3, lod))
#define GATHER_TEXTURE2D(textureName, samplerName, coord2) textureName.Gather(samplerName, coord2)
#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index))
#define PLATFORM_SUPPORT_GATHER
#define GATHER_TEXTURE2D(textureName, samplerName, coord2, offset) textureName.Gather(samplerName, coord2, offset)
#define GATHER_TEXTURE2D_ARRAY(textureName, samplerName, coord2, index) textureName.Gather(samplerName, float3(coord2, index), offset)
#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherRed(samplerName, coord2)
#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherGreen(samplerName, coord2)
#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2) textureName.GatherBlue(samplerName, coord2)
#define GATHER_RED_TEXTURE2D(textureName, samplerName, coord2, offset) textureName.GatherRed(samplerName, coord2, offset)
#define GATHER_GREEN_TEXTURE2D(textureName, samplerName, coord2, offset) textureName.GatherGreen(samplerName, coord2, offset)
#define GATHER_BLUE_TEXTURE2D(textureName, samplerName, coord2, offset) textureName.GatherBlue(samplerName, coord2, offset)

18
ScriptableRenderPipeline/Core/CoreRP/ShaderLibrary/Common.hlsl


float2 ComputeNormalizedDeviceCoordinates(float3 position, float4x4 clipSpaceTransform = k_identity4x4)
{
float4 positionCS = mul(clipSpaceTransform, float4(position, 1.0));
float2 positionNDC = positionCS.xy * (rcp(positionCS.w) * 0.5) + 0.5;
positionNDC.y = 1.0 - positionNDC.y;
// Our clip space is correct, but the NDC is flipped.
// Conceptually, it should be (positionNDC.y = 1.0 - positionNDC.y), but this is more efficient.
positionCS.y = -positionCS.y;
return positionNDC;
return positionCS.xy * (rcp(positionCS.w) * 0.5) + 0.5;
float4 positionCS = float4(positionNDC * 2.0 - 1.0, deviceDepth, 1.0);
positionNDC.y = 1.0 - positionNDC.y;
// Our clip space is correct, but the NDC is flipped.
// Conceptually, it should be (positionNDC.y = 1.0 - positionNDC.y), but this is more efficient.
positionCS.y = -positionCS.y;
return float4(positionNDC * 2.0 - 1.0, deviceDepth, 1.0);
return positionCS;
}
float3 ComputeViewSpacePosition(float2 positionNDC, float deviceDepth, float4x4 invProjMatrix)

17
ScriptableRenderPipeline/Core/CoreRP/ShaderLibrary/GeometricTools.hlsl


return edgesOutside;
}
// Returns 'true' if a triangle defined by 3 vertices is back-facing.
// 'epsilon' is the (negative) value of dot(N, V) below which we cull the triangle.
// 'winding' can be used to change the order: pass 1 for (p0 -> p1 -> p2), or -1 for (p0 -> p2 -> p1).
bool CullTriangleBackFace(float3 p0, float3 p1, float3 p2, float epsilon, float3 viewPos, float winding)
bool CullTriangleBackFaceView(float3 p0, float3 p1, float3 p2, float epsilon, float3 V, float winding)
float3 N = cross(edge1, edge2);
float3 V = viewPos - p0;
float3 N = cross(edge1, edge2);
float NdotV = dot(N, V) * winding;
// Optimize:

// NdotV < Epsilon * sqrt(dot(N, N) * dot(V, V))
return NdotV < epsilon * sqrt(dot(N, N) * dot(V, V));
}
// Returns 'true' if a triangle defined by 3 vertices is back-facing.
// 'epsilon' is the (negative) value of dot(N, V) below which we cull the triangle.
// 'winding' can be used to change the order: pass 1 for (p0 -> p1 -> p2), or -1 for (p0 -> p2 -> p1).
bool CullTriangleBackFace(float3 p0, float3 p1, float3 p2, float epsilon, float3 viewPos, float winding)
{
float3 V = viewPos - p0;
return CullTriangleBackFaceView(p0, p1, p2, epsilon, V, winding);
}
#endif // UNITY_GEOMETRICTOOLS_INCLUDED

2
ScriptableRenderPipeline/Core/CoreRP/Shadow/Shadow.cs


}
else
vp = invvp = Matrix4x4.identity; // should never happen, though
if (cameraRelativeRendering)
{
Vector3 camPosWS = camera.transform.position;

m_TmpSplits[key.faceIdx].z -= camPosWS.z;
}
}
// write :(
ce.current.shadowAlgo = shadowAlgo;
m_EntryCache[ceIdx] = ce;

3
ScriptableRenderPipeline/Core/CoreRP/Volume/VolumeManager.cs


foreach (var volume in kvp.Value)
{
if (!volume.enabled)
continue;
T component;
if (volume.TryGet(out component) && component.active)
return true;

18
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Camera/HDAdditionalCameraData.cs


};
public RenderingPath renderingPath;
[Tooltip("Layer Mask used for the volume interpolation for this camera.")]
public LayerMask volumeLayerMask = -1;
public FrameSettings serializedFrameSettings = new FrameSettings(); // Serialize frameSettings
public FrameSettings serializedFrameSettings = new FrameSettings(); // Serialize frameSettings
// Not serialized, not visible
FrameSettings m_FrameSettings = new FrameSettings();

}
bool isRegisterDebug = false;
Camera m_camera;
string m_CameraRegisterName;
bool m_IsDebugRegistered = false;
Camera m_camera;
string m_CameraRegisterName;
if (!isRegisterDebug)
if (!m_IsDebugRegistered)
isRegisterDebug = true;
m_IsDebugRegistered = true;
if (isRegisterDebug)
if (m_IsDebugRegistered)
isRegisterDebug = false;
m_IsDebugRegistered = false;
}
}

29
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Camera/HDCamera.cs


public Vector4[] frustumPlaneEquations;
public Camera camera;
public uint taaFrameIndex;
public Vector4 viewParam;
public PostProcessRenderContext postprocessRenderContext;
public Matrix4x4 viewProjMatrix

isFirstFrame = false;
const uint taaFrameCount = 8;
taaFrameIndex = taaEnabled ? (uint)Time.renderedFrameCount % taaFrameCount : 0;
taaFrameIndex = taaEnabled ? (uint)Time.renderedFrameCount % taaFrameCount : 0;
}
else
{

nonJitteredProjMatrix = gpuNonJitteredProj;
cameraPos = pos;
screenSize = new Vector4(camera.pixelWidth, camera.pixelHeight, 1.0f / camera.pixelWidth, 1.0f / camera.pixelHeight);
viewParam = new Vector4(viewMatrix.determinant, 0.0f, 0.0f, 0.0f);
if (ShaderConfig.s_CameraRelativeRendering != 0)
{

}
// Near, far.
frustumPlaneEquations[4] = new Vector4( camera.transform.forward.x, camera.transform.forward.y, camera.transform.forward.z, -Vector3.Dot(camera.transform.forward, relPos) - camera.nearClipPlane);
frustumPlaneEquations[5] = new Vector4(-camera.transform.forward.x, -camera.transform.forward.y, -camera.transform.forward.z, Vector3.Dot(camera.transform.forward, relPos) + camera.farClipPlane);
// We need to switch forward direction based on handness (Reminder: Regular camera have a negative determinant in Unity and reflection probe follow DX convention and have a positive determinant)
Vector3 forward = viewParam.x < 0.0f ? camera.transform.forward : -camera.transform.forward;
frustumPlaneEquations[4] = new Vector4( forward.x, forward.y, forward.z, -Vector3.Dot(forward, relPos) - camera.nearClipPlane);
frustumPlaneEquations[5] = new Vector4(-forward.x, -forward.y, -forward.z, Vector3.Dot(forward, relPos) + camera.farClipPlane);
m_LastFrameActive = Time.frameCount;
}

cmd.SetGlobalMatrix(HDShaderIDs._NonJitteredViewProjMatrix, nonJitteredViewProjMatrix);
cmd.SetGlobalMatrix(HDShaderIDs._ViewProjMatrix, viewProjMatrix);
cmd.SetGlobalMatrix(HDShaderIDs._InvViewProjMatrix, viewProjMatrix.inverse);
cmd.SetGlobalVector(HDShaderIDs._ViewParam, viewParam);
cmd.SetGlobalVector(HDShaderIDs._InvProjParam, invProjParam);
cmd.SetGlobalVector(HDShaderIDs._ScreenSize, screenSize);
cmd.SetGlobalMatrix(HDShaderIDs._PrevViewProjMatrix, prevViewProjMatrix);

// Does not modify global settings. Used for shadows, low res. rendering, etc.
public void OverrideGlobalParams(Material material)
{
material.SetMatrix(HDShaderIDs._ViewMatrix, viewMatrix);
material.SetMatrix(HDShaderIDs._InvViewMatrix, viewMatrix.inverse);
material.SetMatrix(HDShaderIDs._ProjMatrix, projMatrix);
material.SetMatrix(HDShaderIDs._InvProjMatrix, projMatrix.inverse);
material.SetMatrix(HDShaderIDs._NonJitteredViewProjMatrix, nonJitteredViewProjMatrix);
material.SetMatrix(HDShaderIDs._ViewProjMatrix, viewProjMatrix);
material.SetMatrix(HDShaderIDs._InvViewProjMatrix, viewProjMatrix.inverse);
material.SetVector(HDShaderIDs._InvProjParam, invProjParam);
material.SetVector(HDShaderIDs._ScreenSize, screenSize);
material.SetMatrix(HDShaderIDs._PrevViewProjMatrix, prevViewProjMatrix);
material.SetVectorArray(HDShaderIDs._FrustumPlanes, frustumPlaneEquations);
material.SetInt(HDShaderIDs._TaaFrameIndex, (int)taaFrameIndex);
}
// TODO: We should set all the value below globally and not let it under the control of Unity,
// Need to test that because we are not sure in which order these value are setup, but we need to have control on them, or rename them in our shader.
// For now, apply it for all our compute shader to make it work

cmd.SetComputeVectorParam(cs, HDShaderIDs.unity_OrthoParams, Shader.GetGlobalVector(HDShaderIDs.unity_OrthoParams));
cmd.SetComputeVectorParam(cs, HDShaderIDs._ProjectionParams, Shader.GetGlobalVector(HDShaderIDs._ProjectionParams));
cmd.SetComputeVectorParam(cs, HDShaderIDs._ViewParam, Shader.GetGlobalVector(HDShaderIDs._ViewParam));
cmd.SetComputeVectorParam(cs, HDShaderIDs._ScreenParams, Shader.GetGlobalVector(HDShaderIDs._ScreenParams));
cmd.SetComputeVectorParam(cs, HDShaderIDs._ZBufferParams, Shader.GetGlobalVector(HDShaderIDs._ZBufferParams));
cmd.SetComputeVectorParam(cs, HDShaderIDs._WorldSpaceCameraPos, Shader.GetGlobalVector(HDShaderIDs._WorldSpaceCameraPos));

15
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/HDAssetFactory.cs


get { return HDEditorUtils.GetHDRenderPipelinePath() + "RenderPipelineResources/HDRenderPipelineResources.asset"; }
}
static string s_DefaultMaterialPath
{
get { return HDEditorUtils.GetHDRenderPipelinePath() + "RenderPipelineResources/DefaultHDMaterial.mat"; }
}
static string s_DefaultShaderPath
{
get { return HDEditorUtils.GetHDRenderPipelinePath() + "Material/Lit/Lit.shader"; }
}
class DoCreateNewAssetHDRenderPipeline : ProjectWindowCallback.EndNameEditAction
{
public override void Action(int instanceId, string pathName, string resourceFile)

// Load default renderPipelineResources / Material / Shader
newAsset.renderPipelineResources = AssetDatabase.LoadAssetAtPath<RenderPipelineResources>(s_RenderPipelineResourcesPath);
newAsset.defaultDiffuseMaterial = AssetDatabase.LoadAssetAtPath<Material>(s_DefaultMaterialPath);
newAsset.defaultShader = AssetDatabase.LoadAssetAtPath<Shader>(s_DefaultShaderPath);
AssetDatabase.CreateAsset(newAsset, pathName);
ProjectWindowUtil.ShowCreatedAsset(newAsset);
}

string HDRenderPipelinePath = HDEditorUtils.GetHDRenderPipelinePath();
string PostProcessingPath = HDEditorUtils.GetPostProcessingPath();
string CorePath = HDEditorUtils.GetCorePath();
newAsset.defaultDiffuseMaterial = Load<Material>(HDRenderPipelinePath + "RenderPipelineResources/DefaultHDMaterial.mat");
newAsset.defaultShader = Load<Shader>(HDRenderPipelinePath + "Material/Lit/Lit.shader");
newAsset.debugDisplayLatlongShader = Load<Shader>(HDRenderPipelinePath + "Debug/DebugDisplayLatlong.Shader");
newAsset.debugViewMaterialGBufferShader = Load<Shader>(HDRenderPipelinePath + "Debug/DebugViewMaterialGBuffer.Shader");

4
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/HDEditorUtils.cs


{
var srpPath = GetScriptableRenderPipelinePath();
if (srpPath != null)
return Path.Combine(srpPath, "ScriptableRenderPipeline/Core/CoreRP");
return Path.Combine(srpPath, "ScriptableRenderPipeline/Core/CoreRP/");
return "Packages/com.unity.render-pipelines.core/";
return "Packages/com.unity.render-pipelines.core/CoreRP/";
}
public static bool ResetMaterialKeywords(Material material)

4
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/HDRenderPipelineInspector.Styles.cs


{
public readonly GUIContent defaults = new GUIContent("Defaults");
public readonly GUIContent renderPipelineResources = new GUIContent("Render Pipeline Resources", "Set of resources that need to be loaded when creating stand alone");
public readonly GUIContent defaultDiffuseMaterial = new GUIContent("Default Diffuse Material", "Material to use when creating objects");
public readonly GUIContent defaultShader = new GUIContent("Default Shader", "Shader to use when creating materials");
public readonly GUIContent settingsLabel = new GUIContent("Settings");

public readonly GUIContent pointCookieSize = new GUIContent("Point Cookie Size");
public readonly GUIContent reflectionCubemapSize = new GUIContent("Reflection Cubemap Size");
public readonly GUIContent reflectionCacheCompressed = new GUIContent("Compress Reflection Probe Cache");
public readonly GUIContent skyReflectionSize = new GUIContent("Sky Reflection Size");
public readonly GUIContent skyLightingOverride = new GUIContent("Sky Lighting Override Mask", "This layer mask will define in which layers the sky system will look for sky settings volumes for lighting override.");
public readonly GUIContent defaultFrameSettings = new GUIContent("Default Frame Settings");

26
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/HDRenderPipelineInspector.cs


public sealed partial class HDRenderPipelineInspector : HDBaseEditor<HDRenderPipelineAsset>
{
SerializedProperty m_RenderPipelineResources;
SerializedProperty m_DefaultDiffuseMaterial;
SerializedProperty m_DefaultShader;
// Global Frame Settings
// Global Render settings

SerializedProperty m_ReflectionCubemapSize;
// Commented out until we have proper realtime BC6H compression
//SerializedProperty m_ReflectionCacheCompressed;
SerializedProperty m_SkyReflectionSize;
SerializedProperty m_SkyLightingOverrideLayerMask;
// FrameSettings
// LightLoop settings

void InitializeProperties()
{
m_RenderPipelineResources = properties.Find("m_RenderPipelineResources");
m_DefaultDiffuseMaterial = properties.Find("m_DefaultDiffuseMaterial");
m_DefaultShader = properties.Find("m_DefaultShader");
// Global FrameSettings
// Global Render settings

m_ReflectionCubemapSize = properties.Find(x => x.renderPipelineSettings.lightLoopSettings.reflectionCubemapSize);
// Commented out until we have proper realtime BC6H compression
//m_ReflectionCacheCompressed = properties.Find(x => x.globalFrameSettings.lightLoopSettings.reflectionCacheCompressed);
m_SkyReflectionSize = properties.Find(x => x.renderPipelineSettings.lightLoopSettings.skyReflectionSize);
m_SkyLightingOverrideLayerMask = properties.Find(x => x.renderPipelineSettings.lightLoopSettings.skyLightingOverrideLayerMask);
// FrameSettings
// LightLoop settings

EditorGUILayout.PropertyField(m_ReflectionCubemapSize, s_Styles.reflectionCubemapSize);
// Commented out until we have proper realtime BC6H compression
//EditorGUILayout.PropertyField(m_ReflectionCacheCompressed, s_Styles.reflectionCacheCompressed);
EditorGUILayout.PropertyField(m_SkyReflectionSize, s_Styles.skyReflectionSize);
EditorGUILayout.PropertyField(m_SkyLightingOverrideLayerMask, s_Styles.skyLightingOverride);
if (EditorGUI.EndChangeCheck())
{
HackSetDirty(hdAsset); // Repaint

void SettingsUI(HDRenderPipelineAsset hdAsset)
{
EditorGUILayout.LabelField(s_Styles.settingsLabel, EditorStyles.boldLabel);
EditorGUI.indentLevel++;
GlobalRenderSettingsUI(hdAsset);
GlobalShadowSettingsUI(hdAsset);
GlobalLightLoopSettingsUI(hdAsset);

RendereringSettingsUI(hdAsset);
LightLoopSettingsUI(hdAsset);
EditorGUI.indentLevel--;
EditorGUILayout.Space();
EditorGUILayout.PropertyField(m_SubsurfaceScatteringSettings, s_Styles.sssSettings);
}
protected override void OnEnable()

serializedObject.Update();
EditorGUILayout.LabelField(s_Styles.defaults, EditorStyles.boldLabel);
EditorGUI.indentLevel++;
EditorGUILayout.PropertyField(m_DefaultDiffuseMaterial, s_Styles.defaultDiffuseMaterial);
EditorGUILayout.PropertyField(m_DefaultShader, s_Styles.defaultShader);
EditorGUI.indentLevel--;
EditorGUILayout.Space();
EditorGUILayout.PropertyField(m_SubsurfaceScatteringSettings, s_Styles.sssSettings);
EditorGUILayout.Space();
SettingsUI(m_Target);

2
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/HDRenderPipelineMenuItems.cs


volume.isGlobal = true;
volume.Add<HDShadowSettings>(true);
var visualEnv = volume.Add<VisualEnvironment>(true);
visualEnv.skyType.value = SkyType.ProceduralSky;
visualEnv.skyType.value = SkySettings.GetUniqueID<ProceduralSky>();
visualEnv.fogType.value = FogType.Exponential;
volume.Add<ProceduralSky>(true);
volume.Add<ExponentialFog>(true);

31
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Lighting/HDReflectionProbeEditor.Data.cs


{
internal class SerializedReflectionProbe
{
internal ReflectionProbe target;
internal HDAdditionalReflectionData targetData;
internal SerializedObject so;
internal SerializedProperty mode;

internal SerializedProperty timeSlicingMode;
internal SerializedProperty intensityMultiplier;
internal SerializedProperty blendDistance;
internal SerializedProperty legacyBlendDistance;
internal SerializedProperty boxSize;
internal SerializedProperty boxOffset;
internal SerializedProperty resolution;

internal SerializedProperty boxReprojectionVolumeSize;
internal SerializedProperty boxReprojectionVolumeCenter;
internal SerializedProperty sphereReprojectionVolumeRadius;
internal SerializedProperty blendDistancePositive;
internal SerializedProperty blendDistanceNegative;
internal SerializedProperty blendNormalDistancePositive;
internal SerializedProperty blendNormalDistanceNegative;
internal SerializedProperty boxSideFadePositive;
internal SerializedProperty boxSideFadeNegative;
target = (ReflectionProbe)so.targetObject;
targetData = target.GetComponent<HDAdditionalReflectionData>();
mode = so.FindProperty("m_Mode");
customBakedTexture = so.FindProperty("m_CustomBakedTexture");

intensityMultiplier = so.FindProperty("m_IntensityMultiplier");
blendDistance = so.FindProperty("m_BlendDistance");
boxSize = so.FindProperty("m_BoxSize");
boxOffset = so.FindProperty("m_BoxOffset");
resolution = so.FindProperty("m_Resolution");

nearClip = so.FindProperty("m_NearClip");
farClip = so.FindProperty("m_FarClip");
boxProjection = so.FindProperty("m_BoxProjection");
legacyBlendDistance = so.FindProperty("m_BlendDistance");
influenceShape = addso.Find((HDAdditionalReflectionData d) => d.influenceShape);
influenceSphereRadius = addso.Find((HDAdditionalReflectionData d) => d.influenceSphereRadius);

sphereReprojectionVolumeRadius = addso.Find((HDAdditionalReflectionData d) => d.sphereReprojectionVolumeRadius);
dimmer = addso.Find((HDAdditionalReflectionData d) => d.dimmer);
blendDistancePositive = addso.Find((HDAdditionalReflectionData d) => d.blendDistancePositive);
blendDistanceNegative = addso.Find((HDAdditionalReflectionData d) => d.blendDistanceNegative);
blendNormalDistancePositive = addso.Find((HDAdditionalReflectionData d) => d.blendNormalDistancePositive);
blendNormalDistanceNegative = addso.Find((HDAdditionalReflectionData d) => d.blendNormalDistanceNegative);
boxSideFadePositive = addso.Find((HDAdditionalReflectionData d) => d.boxSideFadePositive);
boxSideFadeNegative = addso.Find((HDAdditionalReflectionData d) => d.boxSideFadeNegative);
}
}

public void ClearOperation(Operation op) { operations &= ~op; }
public void AddOperation(Operation op) { operations |= op; }
public BoxBoundsHandle boxInfluenceBoundsHandle = new BoxBoundsHandle();
public BoxBoundsHandle boxProjectionBoundsHandle = new BoxBoundsHandle();
public BoxBoundsHandle boxInfluenceHandle = new BoxBoundsHandle();
public BoxBoundsHandle boxProjectionHandle = new BoxBoundsHandle();
public SphereBoundsHandle influenceSphereHandle = new SphereBoundsHandle();
public SphereBoundsHandle projectionSphereHandle = new SphereBoundsHandle();
public BoxBoundsHandle boxBlendNormalHandle = new BoxBoundsHandle();
public SphereBoundsHandle sphereInfluenceHandle = new SphereBoundsHandle();
public SphereBoundsHandle sphereProjectionHandle = new SphereBoundsHandle();
public SphereBoundsHandle sphereBlendNormalHandle = new SphereBoundsHandle();
public Matrix4x4 oldLocalSpace = Matrix4x4.identity;
public bool HasAndClearOperation(Operation op)

128
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Lighting/HDReflectionProbeEditor.Drawers.cs


static readonly CED.IDrawer k_InfluenceVolumeSection = CED.FoldoutGroup(
"Influence volume settings",
(s, p, o) => p.blendDistance,
(s, p, o) => p.blendDistancePositive,
CED.Action(Drawer_DistanceBlend),
CED.FadeGroup(
(s, p, o, i) => s.GetShapeFaded((ReflectionInfluenceShape)i),
false,

p.resolution.intValue = renderPipelineAsset.GetRenderPipelineSettings().lightLoopSettings.reflectionCubemapSize;
EditorGUILayout.LabelField(CoreEditorUtils.GetContent("Resolution"), CoreEditorUtils.GetContent(p.resolution.intValue.ToString()));
EditorGUILayout.PropertyField(p.shadowDistance);
EditorGUILayout.PropertyField(p.cullingMask);
EditorGUILayout.PropertyField(p.useOcclusionCulling);
EditorGUILayout.PropertyField(p.nearClip);
EditorGUILayout.PropertyField(p.farClip);
EditorGUILayout.PropertyField(p.shadowDistance, CoreEditorUtils.GetContent("Shadow Distance"));
EditorGUILayout.PropertyField(p.cullingMask, CoreEditorUtils.GetContent("Culling Mask"));
EditorGUILayout.PropertyField(p.useOcclusionCulling, CoreEditorUtils.GetContent("Use Occlusion Culling"));
EditorGUILayout.PropertyField(p.nearClip, CoreEditorUtils.GetContent("Near Clip"));
EditorGUILayout.PropertyField(p.farClip, CoreEditorUtils.GetContent("Far Clip"));
}
static void Drawer_AdditionalSettings(UIState s, SerializedReflectionProbe p, Editor owner)

if (p.so.targetObjects.Length == 1)
{
var probe = (ReflectionProbe)p.so.targetObject;
var probe = p.target;
if (probe.mode == ReflectionProbeMode.Custom && probe.customBakedTexture != null)
{
var cubemap = probe.customBakedTexture as Cubemap;

{
if (p.mode.intValue == (int)ReflectionProbeMode.Realtime)
{
EditorGUILayout.HelpBox("Baking of this reflection probe should be initiated from the scripting API because the type is 'Realtime'", MessageType.Info);
EditorGUILayout.HelpBox("Refresh of this reflection probe should be initiated from the scripting API because the type is 'Realtime'", MessageType.Info);
if (!QualitySettings.realtimeReflectionProbes)
EditorGUILayout.HelpBox("Realtime reflection probes are disabled in Quality Settings", MessageType.Warning);

{
var mode = (int)data;
var probe = p.so.targetObject as ReflectionProbe;
var probe = p.target;
if (mode == 0)
{
BakeCustomReflectionProbe(probe, false, true);

GUILayout.ExpandWidth(true)))
{
var probe = (ReflectionProbe)p.so.targetObject;
var probe = p.target;
BakeCustomReflectionProbe(probe, true, true);
ResetProbeSceneTextureInMaterial(probe);
GUIUtility.ExitGUI();

case ReflectionProbeMode.Baked:
{
GUI.enabled = ((ReflectionProbe)p.so.targetObject).enabled;
GUI.enabled = p.target.enabled;
// Bake button in non-continous mode
if (ButtonWithDropdownList(

},
GUILayout.ExpandWidth(true)))
{
var probe = (ReflectionProbe)p.so.targetObject;
var probe = p.target;
BakeReflectionProbeSnapshot(probe);
ResetProbeSceneTextureInMaterial(probe);
GUIUtility.ExitGUI();

}
#region Influence Volume
static void Drawer_DistanceBlend(UIState s, SerializedReflectionProbe p, Editor owner)
{
EditorGUILayout.Slider(p.blendDistance, 0, CalculateMaxBlendDistance(s, p, owner), CoreEditorUtils.GetContent("Blend Distance|Area around the probe where it is blended with other probes. Only used in deferred probes."));
EditorGUI.BeginChangeCheck();
}
var maxBlendDistance = CalculateBoxMaxBlendDistance(s, p, owner);
CoreEditorUtils.DrawVector6Slider(
CoreEditorUtils.GetContent("Blend Distance|Area around the probe where it is blended with other probes. Only used in deferred probes."),
p.blendDistancePositive, p.blendDistanceNegative, Vector3.zero, maxBlendDistance);
CoreEditorUtils.DrawVector6Slider(
CoreEditorUtils.GetContent("Blend Normal Distance|Area around the probe where the normals influence the probe. Only used in deferred probes."),
p.blendNormalDistancePositive, p.blendNormalDistanceNegative, Vector3.zero, maxBlendDistance);
CoreEditorUtils.DrawVector6Slider(
CoreEditorUtils.GetContent("Face fade|Fade faces of the cubemap."),
p.boxSideFadePositive, p.boxSideFadeNegative, Vector3.zero, Vector3.one);
EditorGUILayout.Space();
EditorGUI.BeginChangeCheck();
EditorGUILayout.PropertyField(p.boxSize, CoreEditorUtils.GetContent("Box Size|The size of the box in which the reflections will be applied to objects. The value is not affected by the Transform of the Game Object."));
EditorGUILayout.PropertyField(p.boxOffset, CoreEditorUtils.GetContent("Box Offset|The center of the box in which the reflections will be applied to objects. The value is relative to the position of the Game Object."));

{
var center = p.boxOffset.vector3Value;
var size = p.boxSize.vector3Value;
if (ValidateAABB((ReflectionProbe)p.so.targetObject, ref center, ref size))
if (ValidateAABB(p.target, ref center, ref size))
{
p.boxOffset.vector3Value = center;
p.boxSize.vector3Value = size;

static void Drawer_InfluenceSphereSettings(UIState s, SerializedReflectionProbe p, Editor owner)
{
var maxBlendDistance = CalculateSphereMaxBlendDistance(s, p, owner);
var blendDistance = p.blendDistancePositive.vector3Value.x;
EditorGUI.BeginChangeCheck();
blendDistance = EditorGUILayout.Slider(CoreEditorUtils.GetContent("Blend Distance|Area around the probe where it is blended with other probes. Only used in deferred probes."), blendDistance, 0, maxBlendDistance);
if (EditorGUI.EndChangeCheck())
{
p.blendDistancePositive.vector3Value = Vector3.one * blendDistance;
p.blendDistanceNegative.vector3Value = Vector3.one * blendDistance;
}
var blendNormalDistance = p.blendNormalDistancePositive.vector3Value.x;
EditorGUI.BeginChangeCheck();
blendNormalDistance = EditorGUILayout.Slider(CoreEditorUtils.GetContent("Blend Normal Distance|Area around the probe where the normals influence the probe. Only used in deferred probes."), blendNormalDistance, 0, maxBlendDistance);
if (EditorGUI.EndChangeCheck())
{
p.blendNormalDistancePositive.vector3Value = Vector3.one * blendNormalDistance;
p.blendNormalDistanceNegative.vector3Value = Vector3.one * blendNormalDistance;
}
EditorGUILayout.PropertyField(p.influenceSphereRadius, CoreEditorUtils.GetContent("Radius"));
EditorGUILayout.PropertyField(p.boxProjection, CoreEditorUtils.GetContent("Sphere Projection|Sphere projection causes reflections to appear to change based on the object's position within the probe's sphere, while still using a single probe as the source of the reflection. This works well for reflections on objects that are moving through enclosed spaces such as corridors and rooms. Setting sphere projection to False and the cubemap reflection will be treated as coming from infinitely far away. Note that this feature can be globally disabled from Graphics Settings -> Tier Settings"));
}

static readonly EditMode.SceneViewEditMode[] k_Toolbar_SceneViewEditModes =
{
EditMode.SceneViewEditMode.ReflectionProbeBox,
//EditMode.SceneViewEditMode.GridBox,
EditMode.SceneViewEditMode.GridBox,
EditMode.SceneViewEditMode.Collider,
EditMode.SceneViewEditMode.ReflectionProbeOrigin
};
static GUIContent[] s_Toolbar_Contents = null;

{
return s_Toolbar_Contents ?? (s_Toolbar_Contents = new []
{
EditorGUIUtility.IconContent("EditCollider", "|Modify the influence volume of the reflection probe."),
//EditorGUIUtility.IconContent("PreMatCube", "|Modify the projection volume of the reflection probe."),
EditorGUIUtility.IconContent("EditCollider", "|Modify the extents of the reflection probe. (SHIFT+1)"),
EditorGUIUtility.IconContent("PreMatCube", "|Modify the influence volume of the reflection probe. (SHIFT+2)"),
EditorGUIUtility.IconContent("SceneViewOrtho", "|Modify the influence normal volume of the reflection probe. (SHIFT+3)"),
EditorGUIUtility.IconContent("MoveTool", "|Move the selected objects.")
});
}

GUI.changed = false;
var oldEditMode = EditMode.editMode;
Func<Bounds> getBounds = () =>
{
var bounds = new Bounds();
foreach (var targetObject in p.so.targetObjects)
{
var rp = (ReflectionProbe)targetObject;
var b = rp.bounds;
bounds.Encapsulate(b);
}
return bounds;
};
EditMode.DoInspectorToolbar(k_Toolbar_SceneViewEditModes, toolbar_Contents, getBounds, owner);
EditMode.DoInspectorToolbar(k_Toolbar_SceneViewEditModes, toolbar_Contents, GetBoundsGetter(p), owner);
//if (GUILayout.Button(EditorGUIUtility.IconContent("Navigation", "|Fit the reflection probe volume to the surrounding colliders.")))
// s.AddOperation(Operation.FitVolumeToSurroundings);

switch (EditMode.editMode)
{
case EditMode.SceneViewEditMode.ReflectionProbeOrigin:
s.UpdateOldLocalSpace((ReflectionProbe)p.so.targetObject);
s.UpdateOldLocalSpace(p.target);
break;
}
}

}
static Func<Bounds> GetBoundsGetter(SerializedReflectionProbe p)
{
return () =>
{
var bounds = new Bounds();
foreach (var targetObject in p.so.targetObjects)
{
var rp = (ReflectionProbe)targetObject;
var b = rp.bounds;
bounds.Encapsulate(b);
}
return bounds;
};
}
#endregion
#region Mode Specific Settings

}
#endregion
static float CalculateMaxBlendDistance(UIState s, SerializedReflectionProbe p, Editor o)
static float CalculateSphereMaxBlendDistance(UIState s, SerializedReflectionProbe p, Editor o)
var shape = (ReflectionInfluenceShape)p.influenceShape.intValue;
switch (shape)
{
case ReflectionInfluenceShape.Sphere:
return p.influenceSphereRadius.floatValue * 0.5f;
default:
case ReflectionInfluenceShape.Box:
{
var size = p.boxSize.vector3Value;
var v = Mathf.Min(size.x, Mathf.Min(size.y, size.z));
return v * 0.5f;
}
}
return p.influenceSphereRadius.floatValue;
}
static Vector3 CalculateBoxMaxBlendDistance(UIState s, SerializedReflectionProbe p, Editor o)
{
return p.boxSize.vector3Value * 0.5f;
}
static MethodInfo k_EditorGUI_ButtonWithDropdownList = typeof(EditorGUI).GetMethod("ButtonWithDropdownList", BindingFlags.Static | BindingFlags.NonPublic, null, CallingConventions.Any, new [] { typeof(GUIContent), typeof(string[]), typeof(GenericMenu.MenuFunction2), typeof(GUILayoutOption[]) }, new ParameterModifier[0]);

464
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Lighting/HDReflectionProbeEditor.Handles.cs


using System;
using UnityEditor.IMGUI.Controls;
using UnityEditorInternal;
using UnityEngine;
using UnityEngine.Experimental.Rendering;

{
partial class HDReflectionProbeEditor
{
internal static Color k_GizmoReflectionProbe = new Color(0xFF / 255f, 0xE5 / 255f, 0x94 / 255f, 0x20 / 255f);
internal static Color k_GizmoReflectionProbeDisabled = new Color(0x99 / 255f, 0x89 / 255f, 0x59 / 255f, 0x10 / 255f);
internal static Color k_GizmoHandleReflectionProbe = new Color(0xFF / 255f, 0xE5 / 255f, 0xAA / 255f, 0xFF / 255f);
enum InfluenceType
{
Standard,
Normal
}
internal static Color k_GizmoThemeColorExtent = new Color(255f / 255f, 229f / 255f, 148f / 255f, 80f / 255f);
internal static Color k_GizmoThemeColorExtentFace = new Color(255f / 255f, 229f / 255f, 148f / 255f, 45f / 255f);
internal static Color k_GizmoThemeColorInfluenceBlend = new Color(83f / 255f, 255f / 255f, 95f / 255f, 75f / 255f);
internal static Color k_GizmoThemeColorInfluenceBlendFace = new Color(83f / 255f, 255f / 255f, 95f / 255f, 17f / 255f);
internal static Color k_GizmoThemeColorInfluenceNormalBlend = new Color(0f / 255f, 229f / 255f, 255f / 255f, 80f / 255f);
internal static Color k_GizmoThemeColorInfluenceNormalBlendFace = new Color(0f / 255f, 229f / 255f, 255f / 255f, 36f / 255f);
internal static Color k_GizmoThemeColorProjection = new Color(0x00 / 255f, 0xE5 / 255f, 0xFF / 255f, 0x20 / 255f);
internal static Color k_GizmoThemeColorProjectionFace = new Color(0x00 / 255f, 0xE5 / 255f, 0xFF / 255f, 0x20 / 255f);
internal static Color k_GizmoThemeColorDisabled = new Color(0x99 / 255f, 0x89 / 255f, 0x59 / 255f, 0x10 / 255f);
internal static Color k_GizmoThemeColorDisabledFace = new Color(0x99 / 255f, 0x89 / 255f, 0x59 / 255f, 0x10 / 255f);
void OnSceneGUI()
{

BakeRealtimeProbeIfPositionChanged(s, p, o);
DoShortcutKey(p, o);
if (!s.sceneViewEditing)
return;

switch (EditMode.editMode)
{
// Influence editing
if (p.influenceShape.enumValueIndex == 0)
Handle_InfluenceBoxEditing(s, p, o);
if (p.influenceShape.enumValueIndex == 1)
Handle_InfluenceSphereEditing(s, p, o);
Handle_InfluenceEditing(s, p, o);
// Influence fade editing
if (p.influenceShape.enumValueIndex == 0)
Handle_ProjectionBoxEditing(s, p, o);
if (p.influenceShape.enumValueIndex == 1)
Handle_ProjectionSphereEditing(s, p, o);
Handle_InfluenceFadeEditing(s, p, o, InfluenceType.Standard);
break;
// Influence normal fade editing
case EditMode.SceneViewEditMode.Collider:
Handle_InfluenceFadeEditing(s, p, o, InfluenceType.Normal);
// Origin editing
case EditMode.SceneViewEditMode.ReflectionProbeOrigin:
Handle_OriginEditing(s, p, o);
break;

Repaint();
void BakeRealtimeProbeIfPositionChanged(UIState s, SerializedReflectionProbe sp, Editor o)
static void Handle_InfluenceFadeEditing(UIState s, SerializedReflectionProbe sp, Editor o, InfluenceType influenceType)
if (Application.isPlaying
|| ((ReflectionProbeMode)sp.mode.intValue) != ReflectionProbeMode.Realtime)
BoxBoundsHandle blendBox;
SphereBoundsHandle sphereHandle;
Vector3 probeBlendDistancePositive, probeBlendDistanceNegative;
Color color;
switch (influenceType)
m_PositionHash = 0;
return;
default:
case InfluenceType.Standard:
{
blendBox = s.boxBlendHandle;
sphereHandle = s.sphereBlendHandle;
probeBlendDistancePositive = sp.targetData.blendDistancePositive;
probeBlendDistanceNegative = sp.targetData.blendDistanceNegative;
color = k_GizmoThemeColorInfluenceBlend;
break;
}
case InfluenceType.Normal:
{
blendBox = s.boxBlendNormalHandle;
sphereHandle = s.sphereBlendNormalHandle;
probeBlendDistancePositive = sp.targetData.blendNormalDistancePositive;
probeBlendDistanceNegative = sp.targetData.blendNormalDistanceNegative;
color = k_GizmoThemeColorInfluenceNormalBlend;
break;
}
var hash = 0;
for (var i = 0; i < sp.so.targetObjects.Length; i++)
{
var p = (ReflectionProbe)sp.so.targetObjects[i];
var tr = p.GetComponent<Transform>();
hash ^= tr.position.GetHashCode();
}
if (hash != m_PositionHash)
var mat = Handles.matrix;
var col = Handles.color;
Handles.matrix = GetLocalSpace(sp.target);
switch ((ReflectionInfluenceShape)sp.influenceShape.enumValueIndex)
m_PositionHash = hash;
for (var i = 0; i < sp.so.targetObjects.Length; i++)
case ReflectionInfluenceShape.Box:
var p = (ReflectionProbe)sp.so.targetObjects[i];
p.RenderProbe();
}
}
}
blendBox.center = sp.target.center - (probeBlendDistancePositive - probeBlendDistanceNegative) * 0.5f;
blendBox.size = sp.target.size - probeBlendDistancePositive - probeBlendDistanceNegative;
static void Handle_InfluenceBoxEditing(UIState s, SerializedReflectionProbe sp, Editor o)
{
var p = (ReflectionProbe)sp.so.targetObject;
Handles.color = k_GizmoThemeColorExtent;
EditorGUI.BeginChangeCheck();
Handles.color = color;
blendBox.DrawHandle();
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(sp.target, "Modified Reflection Probe Influence");
Undo.RecordObject(sp.targetData, "Modified Reflection Probe Influence");
using (new Handles.DrawingScope(GetLocalSpace(p)))
{
s.boxInfluenceBoundsHandle.center = p.center;
s.boxInfluenceBoundsHandle.size = p.size;
s.boxBlendHandle.center = p.center;
s.boxBlendHandle.size = p.size - Vector3.one * p.blendDistance * 2;
var center = sp.target.center;
var influenceSize = sp.target.size;
EditorGUI.BeginChangeCheck();
s.boxInfluenceBoundsHandle.DrawHandle();
var influenceChanged = EditorGUI.EndChangeCheck();
EditorGUI.BeginChangeCheck();
s.boxBlendHandle.DrawHandle();
if (influenceChanged || EditorGUI.EndChangeCheck())
var diff = 2 * (blendBox.center - center);
var sum = influenceSize - blendBox.size;
var positive = (sum - diff) * 0.5f;
var negative = (sum + diff) * 0.5f;
var blendDistancePositive = Vector3.Max(Vector3.zero, Vector3.Min(positive, influenceSize));
var blendDistanceNegative = Vector3.Max(Vector3.zero, Vector3.Min(negative, influenceSize));
probeBlendDistancePositive = blendDistancePositive;
probeBlendDistanceNegative = blendDistanceNegative;
ApplyConstraintsOnTargets(s, sp, o);
EditorUtility.SetDirty(sp.target);
EditorUtility.SetDirty(sp.targetData);
}
break;
}
case ReflectionInfluenceShape.Sphere:
Undo.RecordObject(p, "Modified Reflection Probe AABB");
var center = s.boxInfluenceBoundsHandle.center;
var influenceSize = s.boxInfluenceBoundsHandle.size;
var blendSize = s.boxBlendHandle.size;
ValidateAABB(p, ref center, ref influenceSize);
var blendDistance = influenceChanged
? p.blendDistance
: ((influenceSize.x - blendSize.x) * 0.5f + (influenceSize.y - blendSize.y) * 0.5f + (influenceSize.z - blendSize.z) * 0.5f) / 3;
p.center = center;
p.size = influenceSize;
p.blendDistance = Mathf.Max(blendDistance, 0);
EditorUtility.SetDirty(p);
sphereHandle.center = sp.target.center;
sphereHandle.radius = Mathf.Clamp(sp.targetData.influenceSphereRadius - probeBlendDistancePositive.x, 0, sp.targetData.influenceSphereRadius);
Handles.color = k_GizmoThemeColorExtent;
EditorGUI.BeginChangeCheck();
Handles.color = color;
sphereHandle.DrawHandle();
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(sp.target, "Modified Reflection influence volume");
Undo.RecordObject(sp.targetData, "Modified Reflection influence volume");
var influenceRadius = sp.targetData.influenceSphereRadius;
var blendRadius = sphereHandle.radius;
var blendDistance = Mathf.Clamp(influenceRadius - blendRadius, 0, influenceRadius);
probeBlendDistancePositive = Vector3.one * blendDistance;
probeBlendDistanceNegative = probeBlendDistancePositive;
ApplyConstraintsOnTargets(s, sp, o);
EditorUtility.SetDirty(sp.target);
EditorUtility.SetDirty(sp.targetData);
}
break;
}
Handles.matrix = mat;
Handles.color = col;
static void Handle_ProjectionBoxEditing(UIState s, SerializedReflectionProbe sp, Editor o)
{
var p = (ReflectionProbe)sp.so.targetObject;
var reflectionData = p.GetComponent<HDAdditionalReflectionData>();
using (new Handles.DrawingScope(GetLocalSpace(p)))
switch (influenceType)
s.boxProjectionBoundsHandle.center = reflectionData.boxReprojectionVolumeCenter;
s.boxProjectionBoundsHandle.size = reflectionData.boxReprojectionVolumeSize;
EditorGUI.BeginChangeCheck();
s.boxProjectionBoundsHandle.DrawHandle();
if (EditorGUI.EndChangeCheck())
default:
case InfluenceType.Standard:
Undo.RecordObject(reflectionData, "Modified Reflection Probe AABB");
var center = s.boxProjectionBoundsHandle.center;
var size = s.boxProjectionBoundsHandle.size;
ValidateAABB(p, ref center, ref size);
reflectionData.boxReprojectionVolumeCenter = center;
reflectionData.boxReprojectionVolumeSize = size;
EditorUtility.SetDirty(reflectionData);
sp.targetData.blendDistancePositive = probeBlendDistancePositive;
sp.targetData.blendDistanceNegative = probeBlendDistanceNegative;
break;
}
case InfluenceType.Normal:
{
sp.targetData.blendNormalDistancePositive = probeBlendDistancePositive;
sp.targetData.blendNormalDistanceNegative = probeBlendDistanceNegative;
break;
static void Handle_InfluenceSphereEditing(UIState s, SerializedReflectionProbe sp, Editor o)
static void Handle_InfluenceEditing(UIState s, SerializedReflectionProbe sp, Editor o)
var p = (ReflectionProbe)sp.so.targetObject;
var reflectionData = p.GetComponent<HDAdditionalReflectionData>();
using (new Handles.DrawingScope(GetLocalSpace(p)))
var mat = Handles.matrix;
var col = Handles.color;
Handles.matrix = GetLocalSpace(sp.target);
switch ((ReflectionInfluenceShape)sp.influenceShape.enumValueIndex)
s.influenceSphereHandle.center = p.center;
s.influenceSphereHandle.radius = reflectionData.influenceSphereRadius;
s.sphereBlendHandle.center = p.center;
s.sphereBlendHandle.radius = Mathf.Min(reflectionData.influenceSphereRadius - p.blendDistance * 2, reflectionData.influenceSphereRadius);
EditorGUI.BeginChangeCheck();
s.influenceSphereHandle.DrawHandle();
var influenceChanged = EditorGUI.EndChangeCheck();
EditorGUI.BeginChangeCheck();
s.sphereBlendHandle.DrawHandle();
if (influenceChanged || EditorGUI.EndChangeCheck())
case ReflectionInfluenceShape.Box:
Undo.RecordObject(reflectionData, "Modified Reflection influence volume");
var center = p.center;
var influenceRadius = s.influenceSphereHandle.radius;
var blendRadius = influenceChanged
? Mathf.Max(influenceRadius - p.blendDistance * 2, 0)
: s.sphereBlendHandle.radius;
s.boxInfluenceHandle.center = sp.target.center;
s.boxInfluenceHandle.size = sp.target.size;
var radius = Vector3.one * influenceRadius;
ValidateAABB(p, ref center, ref radius);
influenceRadius = radius.x;
var blendDistance = Mathf.Max(0, (influenceRadius - blendRadius) * 0.5f);
Handles.color = k_GizmoThemeColorExtent;
EditorGUI.BeginChangeCheck();
s.boxInfluenceHandle.DrawHandle();
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(sp.target, "Modified Reflection Probe AABB");
Undo.RecordObject(sp.targetData, "Modified Reflection Probe AABB");
reflectionData.influenceSphereRadius = influenceRadius;
p.blendDistance = blendDistance;
EditorUtility.SetDirty(p);
EditorUtility.SetDirty(reflectionData);
}
}
}
var center = s.boxInfluenceHandle.center;
var size = s.boxInfluenceHandle.size;
static void Handle_ProjectionSphereEditing(UIState s, SerializedReflectionProbe sp, Editor o)
{
var p = (ReflectionProbe)sp.so.targetObject;
var reflectionData = p.GetComponent<HDAdditionalReflectionData>();
ValidateAABB(sp.target, ref center, ref size);
using (new Handles.DrawingScope(GetLocalSpace(p)))
{
s.projectionSphereHandle.center = p.center;
s.projectionSphereHandle.radius = reflectionData.sphereReprojectionVolumeRadius;
sp.target.center = center;
sp.target.size = size;
ApplyConstraintsOnTargets(s, sp, o);
EditorGUI.BeginChangeCheck();
s.projectionSphereHandle.DrawHandle();
if (EditorGUI.EndChangeCheck())
EditorUtility.SetDirty(sp.target);
EditorUtility.SetDirty(sp.targetData);
}
break;
}
case ReflectionInfluenceShape.Sphere:
Undo.RecordObject(reflectionData, "Modified Reflection Probe projection volume");
var center = s.projectionSphereHandle.center;
var radius = s.projectionSphereHandle.radius;
//ValidateAABB(ref center, ref radius);
reflectionData.sphereReprojectionVolumeRadius = radius;
EditorUtility.SetDirty(reflectionData);
s.sphereInfluenceHandle.center = sp.target.center;
s.sphereInfluenceHandle.radius = sp.targetData.influenceSphereRadius;
Handles.color = k_GizmoThemeColorExtent;
EditorGUI.BeginChangeCheck();
s.sphereInfluenceHandle.DrawHandle();
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(sp.target, "Modified Reflection Probe AABB");
Undo.RecordObject(sp.targetData, "Modified Reflection Probe AABB");
var center = sp.target.center;
var influenceRadius = s.sphereInfluenceHandle.radius;
var radius = Vector3.one * influenceRadius;
ValidateAABB(sp.target, ref center, ref radius);
influenceRadius = radius.x;
sp.targetData.influenceSphereRadius = influenceRadius;
ApplyConstraintsOnTargets(s, sp, o);
EditorUtility.SetDirty(sp.target);
EditorUtility.SetDirty(sp.targetData);
}
break;
Handles.matrix = mat;
Handles.color = col;
}
static void Handle_OriginEditing(UIState s, SerializedReflectionProbe sp, Editor o)

static void RenderGizmo(ReflectionProbe reflectionProbe, GizmoType gizmoType)
{
var e = GetEditorFor(reflectionProbe);
if (e == null)
if (e == null || !e.sceneViewEditing)
if (e.sceneViewEditing && EditMode.editMode == EditMode.SceneViewEditMode.ReflectionProbeBox)
switch (EditMode.editMode)
var oldColor = Gizmos.color;
Gizmos.color = k_GizmoReflectionProbe;
Gizmos.matrix = GetLocalSpace(reflectionProbe);
if (reflectionData.influenceShape == ReflectionInfluenceShape.Box)
Gizmos.DrawCube(reflectionProbe.center, -1f * reflectionProbe.size);
if (reflectionData.influenceShape == ReflectionInfluenceShape.Sphere)
Gizmos.DrawSphere(reflectionProbe.center, reflectionData.influenceSphereRadius);
Gizmos.matrix = Matrix4x4.identity;
Gizmos.color = oldColor;
// Influence editing
case EditMode.SceneViewEditMode.ReflectionProbeBox:
Gizmos_Influence(reflectionProbe, reflectionData, e, true);
break;
// Influence fade editing
case EditMode.SceneViewEditMode.GridBox:
Gizmos_InfluenceFade(reflectionProbe, reflectionData, e, InfluenceType.Standard, true);
break;
// Influence normal fade editing
case EditMode.SceneViewEditMode.Collider:
Gizmos_InfluenceFade(reflectionProbe, reflectionData, e, InfluenceType.Normal, true);
break;
}
}

Color oldColor = Gizmos.color;
Gizmos.color = reflectionProbe.isActiveAndEnabled ? k_GizmoReflectionProbe : k_GizmoReflectionProbeDisabled;
if (reflectionData.influenceShape == ReflectionInfluenceShape.Box)
{
DrawBoxInfluenceGizmo(reflectionProbe, oldColor);
}
if (reflectionData.influenceShape == ReflectionInfluenceShape.Sphere)
{
DrawSphereInfluenceGizmo(reflectionProbe, oldColor, reflectionData);
}
if (reflectionData.useSeparateProjectionVolume)
{
DrawReprojectionVolumeGizmo(reflectionProbe, reflectionData);
}
Gizmos.color = oldColor;
Gizmos_Influence(reflectionProbe, reflectionData, null, false);
Gizmos_InfluenceFade(reflectionProbe, reflectionData, null, InfluenceType.Standard, false);
Gizmos_InfluenceFade(reflectionProbe, reflectionData, null, InfluenceType.Normal, false);
ChangeVisibility(reflectionProbe, true);
}

ChangeVisibility(reflectionProbe, false);
}
static void DrawBoxInfluenceGizmo(ReflectionProbe reflectionProbe, Color oldColor)
static void Gizmos_InfluenceFade(ReflectionProbe p, HDAdditionalReflectionData a, Editor e, InfluenceType type, bool isEdit)
Gizmos.matrix = GetLocalSpace(reflectionProbe);
Gizmos.DrawWireCube(reflectionProbe.center, reflectionProbe.size);
if (reflectionProbe.blendDistance > 0)
var col = Gizmos.color;
var mat = Gizmos.matrix;
Vector3 boxCenterOffset;
Vector3 boxSizeOffset;
float sphereRadiusOffset;
Color color;
switch (type)
Gizmos.color = new Color(Gizmos.color.r, Gizmos.color.g, Gizmos.color.b, 0.3f);
Gizmos.DrawWireCube(reflectionProbe.center, new Vector3(reflectionProbe.size.x - reflectionProbe.blendDistance * 2, reflectionProbe.size.y - reflectionProbe.blendDistance * 2, reflectionProbe.size.z - reflectionProbe.blendDistance * 2));
default:
case InfluenceType.Standard:
{
boxCenterOffset = a.boxBlendCenterOffset;
boxSizeOffset = a.boxBlendSizeOffset;
sphereRadiusOffset = a.sphereBlendRadiusOffset;
color = isEdit ? k_GizmoThemeColorInfluenceBlendFace : k_GizmoThemeColorInfluenceBlend;
break;
}
case InfluenceType.Normal:
{
boxCenterOffset = a.boxBlendNormalCenterOffset;
boxSizeOffset = a.boxBlendNormalSizeOffset;
sphereRadiusOffset = a.sphereBlendNormalRadiusOffset;
color = isEdit ? k_GizmoThemeColorInfluenceNormalBlendFace : k_GizmoThemeColorInfluenceNormalBlend;
break;
}
Gizmos.matrix = Matrix4x4.identity;
Gizmos.color = oldColor;
}
static void DrawSphereInfluenceGizmo(ReflectionProbe reflectionProbe, Color oldColor, HDAdditionalReflectionData reflectionData)
{
Gizmos.matrix = GetLocalSpace(reflectionProbe);
Gizmos.DrawWireSphere(reflectionProbe.center, reflectionData.influenceSphereRadius);
if (reflectionProbe.blendDistance > 0)
Gizmos.matrix = GetLocalSpace(p);
switch (a.influenceShape)
Gizmos.color = new Color(Gizmos.color.r, Gizmos.color.g, Gizmos.color.b, 0.3f);
Gizmos.DrawWireSphere(reflectionProbe.center, reflectionData.influenceSphereRadius - 2 * reflectionProbe.blendDistance);
case ReflectionInfluenceShape.Box:
{
Gizmos.color = color;
if (isEdit)
Gizmos.DrawCube(p.center + boxCenterOffset, p.size + boxSizeOffset);
else
Gizmos.DrawWireCube(p.center + boxCenterOffset, p.size + boxSizeOffset);
break;
}
case ReflectionInfluenceShape.Sphere:
{
Gizmos.color = color;
if (isEdit)
Gizmos.DrawSphere(p.center, a.influenceSphereRadius + sphereRadiusOffset);
else
Gizmos.DrawWireSphere(p.center, a.influenceSphereRadius + sphereRadiusOffset);
break;
}
Gizmos.matrix = Matrix4x4.identity;
Gizmos.color = oldColor;
Gizmos.matrix = mat;
Gizmos.color = col;
static void DrawReprojectionVolumeGizmo(ReflectionProbe reflectionProbe, HDAdditionalReflectionData reflectionData)
static void Gizmos_Influence(ReflectionProbe p, HDAdditionalReflectionData a, Editor e, bool isEdit)
Color reprojectionColor = new Color(Color.cyan.r, Color.cyan.g, Color.cyan.b, 0.3f);
Gizmos.color = reprojectionColor;
Gizmos.matrix = GetLocalSpace(reflectionProbe);
if (reflectionData.influenceShape == ReflectionInfluenceShape.Box)
{
Gizmos.DrawWireCube(reflectionData.boxReprojectionVolumeCenter, reflectionData.boxReprojectionVolumeSize);
}
if (reflectionData.influenceShape == ReflectionInfluenceShape.Sphere)
var col = Gizmos.color;
var mat = Gizmos.matrix;
Gizmos.matrix = GetLocalSpace(p);
switch (a.influenceShape)
Gizmos.DrawWireSphere(reflectionProbe.center, reflectionData.sphereReprojectionVolumeRadius);
case ReflectionInfluenceShape.Box:
{
Gizmos.color = isEdit ? k_GizmoThemeColorExtentFace : k_GizmoThemeColorExtent;
if (isEdit)
Gizmos.DrawCube(p.center, p.size);
else
Gizmos.DrawWireCube(p.center, p.size);
break;
}
case ReflectionInfluenceShape.Sphere:
{
Gizmos.color = k_GizmoThemeColorExtentFace;
if (isEdit)
Gizmos.DrawSphere(p.center, a.influenceSphereRadius);
else
Gizmos.DrawWireSphere(p.center, a.influenceSphereRadius);
break;
}
Gizmos.matrix = Matrix4x4.identity;
Gizmos.matrix = mat;
Gizmos.color = col;
}
static void DrawVerticalRay(Transform transform)

7
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Lighting/HDReflectionProbeEditor.ProbeUtility.cs


var a = (HDAdditionalReflectionData)m_AdditionalDataSerializedObject.targetObjects[i];
InitializeProbe(p, a);
}
// For an unknown reason, newly created probes sometype have the type "Quad" (value = 1)
// This type of probe is not supported by Unity since 5.4
// But we need to force it here so it does not bake into a 2D texture but a Cubemap
serializedObject.Update();
serializedObject.FindProperty("m_Type").intValue = 0;
serializedObject.ApplyModifiedProperties();
}

103
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Lighting/HDReflectionProbeEditor.cs


using UnityEngine;
using UnityEngine.Experimental.Rendering;
using UnityEngine.Experimental.Rendering.HDPipeline;
using UnityEngine.Rendering;
using UnityEngine.SceneManagement;
namespace UnityEditor.Experimental.Rendering

public override void OnInspectorGUI()
{
//InspectColorsGUI();
// Set the legacy blend distance to 0 so the legacy culling system use the probe extent
p.legacyBlendDistance.floatValue = 0;
//k_InfluenceNormalVolumeSection.Draw(s, p, this);
k_SeparateProjectionVolumeSection.Draw(s, p, this);
k_CaptureSection.Draw(s, p, this);
k_AdditionalSection.Draw(s, p, this);

serializedObject.ApplyModifiedProperties();
HideAdditionalComponents(false);
DoShortcutKey(p, this);
}
static void PerformOperations(UIState s, SerializedReflectionProbe p, HDReflectionProbeEditor o)

}
}
void BakeRealtimeProbeIfPositionChanged(UIState s, SerializedReflectionProbe sp, Editor o)
{
if (Application.isPlaying
|| ((ReflectionProbeMode)sp.mode.intValue) != ReflectionProbeMode.Realtime)
{
m_PositionHash = 0;
return;
}
var hash = 0;
for (var i = 0; i < sp.so.targetObjects.Length; i++)
{
var p = (ReflectionProbe)sp.so.targetObjects[i];
var tr = p.GetComponent<Transform>();
hash ^= tr.position.GetHashCode();
}
if (hash != m_PositionHash)
{
m_PositionHash = hash;
for (var i = 0; i < sp.so.targetObjects.Length; i++)
{
var p = (ReflectionProbe)sp.so.targetObjects[i];
p.RenderProbe();
}
}
}
static Matrix4x4 GetLocalSpace(ReflectionProbe probe)
{
var t = probe.transform.position;

{
return editMode == EditMode.SceneViewEditMode.ReflectionProbeBox || editMode == EditMode.SceneViewEditMode.Collider || editMode == EditMode.SceneViewEditMode.GridBox ||
editMode == EditMode.SceneViewEditMode.ReflectionProbeOrigin;
}
static void InspectColorsGUI()
{
EditorGUILayout.LabelField("Color Theme", EditorStyles.largeLabel);
k_GizmoThemeColorExtent = EditorGUILayout.ColorField("Extent", k_GizmoThemeColorExtent);
k_GizmoThemeColorExtentFace = EditorGUILayout.ColorField("Extent Face", k_GizmoThemeColorExtentFace);
k_GizmoThemeColorInfluenceBlend = EditorGUILayout.ColorField("Influence Blend", k_GizmoThemeColorInfluenceBlend);
k_GizmoThemeColorInfluenceBlendFace = EditorGUILayout.ColorField("Influence Blend Face", k_GizmoThemeColorInfluenceBlendFace);
k_GizmoThemeColorInfluenceNormalBlend = EditorGUILayout.ColorField("Influence Normal Blend", k_GizmoThemeColorInfluenceNormalBlend);
k_GizmoThemeColorInfluenceNormalBlendFace = EditorGUILayout.ColorField("Influence Normal Blend Face", k_GizmoThemeColorInfluenceNormalBlendFace);
k_GizmoThemeColorProjection = EditorGUILayout.ColorField("Projection", k_GizmoThemeColorProjection);
k_GizmoThemeColorProjectionFace = EditorGUILayout.ColorField("Projection Face", k_GizmoThemeColorProjectionFace);
k_GizmoThemeColorDisabled = EditorGUILayout.ColorField("Disabled", k_GizmoThemeColorDisabled);
k_GizmoThemeColorDisabledFace = EditorGUILayout.ColorField("Disabled Face", k_GizmoThemeColorDisabledFace);
EditorGUILayout.Space();
}
static void BakeCustomReflectionProbe(ReflectionProbe probe, bool usePreviousAssetPath, bool custom)

{
var renderer = p.GetComponent<Renderer>();
renderer.sharedMaterial.SetTexture(_Cubemap, p.texture);
}
static void ApplyConstraintsOnTargets(UIState s, SerializedReflectionProbe sp, Editor o)
{
switch ((ReflectionInfluenceShape)sp.influenceShape.enumValueIndex)
{
case ReflectionInfluenceShape.Box:
{
var maxBlendDistance = CalculateBoxMaxBlendDistance(s, sp, o);
sp.targetData.blendDistancePositive = Vector3.Min(sp.targetData.blendDistancePositive, maxBlendDistance);
sp.targetData.blendDistanceNegative = Vector3.Min(sp.targetData.blendDistanceNegative, maxBlendDistance);
sp.targetData.blendNormalDistancePositive = Vector3.Min(sp.targetData.blendNormalDistancePositive, maxBlendDistance);
sp.targetData.blendNormalDistanceNegative = Vector3.Min(sp.targetData.blendNormalDistanceNegative, maxBlendDistance);
break;
}
case ReflectionInfluenceShape.Sphere:
{
var maxBlendDistance = Vector3.one * CalculateSphereMaxBlendDistance(s, sp, o);
sp.targetData.blendDistancePositive = Vector3.Min(sp.targetData.blendDistancePositive, maxBlendDistance);
sp.targetData.blendDistanceNegative = Vector3.Min(sp.targetData.blendDistanceNegative, maxBlendDistance);
sp.targetData.blendNormalDistancePositive = Vector3.Min(sp.targetData.blendNormalDistancePositive, maxBlendDistance);
sp.targetData.blendNormalDistanceNegative = Vector3.Min(sp.targetData.blendNormalDistanceNegative, maxBlendDistance);
break;
}
}
}
static readonly KeyCode[] k_ShortCutKeys =
{
KeyCode.Alpha1,
KeyCode.Alpha2,
KeyCode.Alpha3,
};
static void DoShortcutKey(SerializedReflectionProbe p, Editor o)
{
var evt = Event.current;
if (evt.type != EventType.KeyDown || !evt.shift)
return;
for (var i = 0; i < k_ShortCutKeys.Length; ++i)
{
if (evt.keyCode == k_ShortCutKeys[i])
{
var mode = EditMode.editMode == k_Toolbar_SceneViewEditModes[i]
? EditMode.SceneViewEditMode.None
: k_Toolbar_SceneViewEditModes[i];
EditMode.ChangeEditMode(mode, GetBoundsGetter(p)(), o);
evt.Use();
break;
}
}
}
}
}

11
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Material/Lit/BaseLitUI.cs


{
protected static class StylesBaseLit
{
public static GUIContent doubleSidedNormalModeText = new GUIContent("Normal mode", "This will modify the normal base on the selected mode. None: untouch, Mirror: Mirror the normal with vertex normal plane, Flip: Flip the normal");
public static GUIContent doubleSidedNormalModeText = new GUIContent("Normal mode", "This will modify the normal base on the selected mode. Mirror: Mirror the normal with vertex normal plane, Flip: Flip the normal");
public static GUIContent depthOffsetEnableText = new GUIContent("Enable Depth Offset", "EnableDepthOffset on this shader (Use with heightmap)");
// Displacement mapping (POM, tessellation, per vertex)

public enum DoubleSidedNormalMode
{
None,
Mirror,
Flip
Flip,
Mirror
}
public enum TessellationMode

DoubleSidedNormalMode doubleSidedNormalMode = (DoubleSidedNormalMode)material.GetFloat(kDoubleSidedNormalMode);
switch (doubleSidedNormalMode)
{
case DoubleSidedNormalMode.None:
material.SetVector("_DoubleSidedConstants", new Vector4(1.0f, 1.0f, 1.0f, 0.0f));
break;
case DoubleSidedNormalMode.Mirror: // Mirror mode (in tangent space)
material.SetVector("_DoubleSidedConstants", new Vector4(1.0f, 1.0f, -1.0f, 0.0f));
break;

5
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Material/Lit/LitUI.cs


EditorGUILayout.LabelField(StylesBaseUnlit.TransparencyInputsText, EditorStyles.boldLabel);
++EditorGUI.indentLevel;
var isPrePass = material.HasProperty(kPreRefractionPass) && material.GetFloat(kPreRefractionPass) > 0.0;
var isPrepass = material.HasProperty(kPreRefractionPass) && material.GetFloat(kPreRefractionPass) > 0.0;
&& !isPrePass)
&& !isPrepass)
{
m_MaterialEditor.ShaderProperty(refractionMode, Styles.refractionModeText);
var mode = (Lit.RefractionMode)refractionMode.floatValue;

++EditorGUI.indentLevel;
m_MaterialEditor.ShaderProperty(thicknessMultiplier, Styles.refractionThicknessMultiplierText);
thicknessMultiplier.floatValue = Mathf.Max(thicknessMultiplier.floatValue, 0);
--EditorGUI.indentLevel;
m_MaterialEditor.TexturePropertySingleLine(Styles.transmittanceColorText, transmittanceColorMap, transmittanceColor);

20
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Material/Unlit/BaseUnlitUI.cs


public static GUIContent distortionBlurScaleText = new GUIContent("Distortion Blur Scale", "Distortion Blur Scale");
public static GUIContent distortionBlurRemappingText = new GUIContent("Distortion Blur Remapping", "Distortion Blur Remapping");
public static GUIContent transparentPrePassText = new GUIContent("Pre Refraction Pass", "Render objects before the refraction pass");
public static GUIContent transparentPrepassText = new GUIContent("Pre Refraction Pass", "Render objects before the refraction pass");
public static string advancedText = "Advanced Options";
}

if (enableFogOnTransparent != null)
m_MaterialEditor.ShaderProperty(enableFogOnTransparent, StylesBaseUnlit.enableTransparentFogText);
if (preRefractionPass != null)
m_MaterialEditor.ShaderProperty(preRefractionPass, StylesBaseUnlit.transparentPrePassText);
m_MaterialEditor.ShaderProperty(preRefractionPass, StylesBaseUnlit.transparentPrepassText);
EditorGUI.indentLevel--;
}

{
material.SetOverrideTag("RenderType", "Transparent");
material.SetInt("_ZWrite", 0);
var isPrePass = material.HasProperty(kPreRefractionPass) && material.GetFloat(kPreRefractionPass) > 0.0f;
material.renderQueue = (int)(isPrePass ? HDRenderQueue.PreRefraction : HDRenderQueue.Transparent);
var isPrepass = material.HasProperty(kPreRefractionPass) && material.GetFloat(kPreRefractionPass) > 0.0f;
material.renderQueue = (int)(isPrepass ? HDRenderQueue.PreRefraction : HDRenderQueue.Transparent);
if (material.HasProperty(kBlendMode))
{

material.SetShaderPassEnabled(HDShaderPassNames.s_GBufferDebugDisplayStr, true);
material.SetShaderPassEnabled(HDShaderPassNames.s_MotionVectorsStr, enablePass);
material.SetShaderPassEnabled(HDShaderPassNames.s_DistortionVectorsStr, distortionEnable); // note: use distortionEnable
material.SetShaderPassEnabled(HDShaderPassNames.s_TransparentDepthPrePassStr, enablePass);
material.SetShaderPassEnabled(HDShaderPassNames.s_TransparentDepthPrepassStr, enablePass);
material.SetShaderPassEnabled(HDShaderPassNames.s_TransparentDepthPostPassStr, enablePass);
material.SetShaderPassEnabled(HDShaderPassNames.s_TransparentDepthPostpassStr, enablePass);
material.SetShaderPassEnabled(HDShaderPassNames.s_MetaStr, enablePass);
material.SetShaderPassEnabled(HDShaderPassNames.s_ShadowCasterStr, enablePass);
}

bool depthWriteEnable = (material.GetFloat(kTransparentDepthPrepassEnable) > 0.0f) && ((SurfaceType)material.GetFloat(kSurfaceType) == SurfaceType.Transparent);
if (depthWriteEnable)
{
material.SetShaderPassEnabled(HDShaderPassNames.s_TransparentDepthPrePassStr, true);
material.SetShaderPassEnabled(HDShaderPassNames.s_TransparentDepthPrepassStr, true);
material.SetShaderPassEnabled(HDShaderPassNames.s_TransparentDepthPrePassStr, false);
material.SetShaderPassEnabled(HDShaderPassNames.s_TransparentDepthPrepassStr, false);
}
}

if (depthWriteEnable)
{
material.SetShaderPassEnabled(HDShaderPassNames.s_TransparentDepthPostPassStr, true);
material.SetShaderPassEnabled(HDShaderPassNames.s_TransparentDepthPostpassStr, true);
material.SetShaderPassEnabled(HDShaderPassNames.s_TransparentDepthPostPassStr, false);
material.SetShaderPassEnabled(HDShaderPassNames.s_TransparentDepthPostpassStr, false);
}
}

3
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Sky/SkySettingsEditor.cs


{
public abstract class SkySettingsEditor : VolumeComponentEditor
{
SerializedDataParameter m_SkyResolution;
SerializedDataParameter m_SkyExposure;
SerializedDataParameter m_SkyMultiplier;
SerializedDataParameter m_SkyRotation;

{
var o = new PropertyFetcher<SkySettings>(serializedObject);
m_SkyResolution = Unpack(o.Find(x => x.resolution));
m_SkyExposure = Unpack(o.Find(x => x.exposure));
m_SkyMultiplier = Unpack(o.Find(x => x.multiplier));
m_SkyRotation = Unpack(o.Find(x => x.rotation));

protected void CommonSkySettingsGUI()
{
PropertyField(m_SkyResolution);
PropertyField(m_SkyExposure);
PropertyField(m_SkyMultiplier);
PropertyField(m_SkyRotation);

2
ScriptableRenderPipeline/HDRenderPipeline/HDRP/HDCustomSamplerId.cs


ForwardPassName,
ForwardTransparentDepthPrepass,
RenderForwardError,
TransparentDepthPostPass,
TransparentDepthPostpass,
ObjectsVelocity,
CameraVelocity,
GaussianPyramidColor,

41
ScriptableRenderPipeline/HDRenderPipeline/HDRP/HDRenderPipeline.cs


ShaderPassName[] m_DepthOnlyAndDepthForwardOnlyPassNames = { HDShaderPassNames.s_DepthForwardOnlyName, HDShaderPassNames.s_DepthOnlyName };
ShaderPassName[] m_DepthForwardOnlyPassNames = { HDShaderPassNames.s_DepthForwardOnlyName };
ShaderPassName[] m_DepthOnlyPassNames = { HDShaderPassNames.s_DepthOnlyName };
ShaderPassName[] m_TransparentDepthPrePassNames = { HDShaderPassNames.s_TransparentDepthPrePassName };
ShaderPassName[] m_TransparentDepthPostPassNames = { HDShaderPassNames.s_TransparentDepthPostPassName };
ShaderPassName[] m_TransparentDepthPrepassNames = { HDShaderPassNames.s_TransparentDepthPrepassName };
ShaderPassName[] m_TransparentDepthPostpassNames = { HDShaderPassNames.s_TransparentDepthPostpassName };
ShaderPassName[] m_ForwardErrorPassNames = { HDShaderPassNames.s_AlwaysName, HDShaderPassNames.s_ForwardBaseName, HDShaderPassNames.s_DeferredName, HDShaderPassNames.s_PrepassBaseName, HDShaderPassNames.s_VertexName, HDShaderPassNames.s_VertexLMRGBMName, HDShaderPassNames.s_VertexLMName };
ShaderPassName[] m_SinglePassName = new ShaderPassName[1];

using (new ProfilingSample(cmd, "Volume Update", GetSampler(CustomSamplerId.VolumeUpdate)))
{
// TODO: Transform & layer should be configurable per camera
VolumeManager.instance.Update(camera.transform, -1);
LayerMask layerMask = -1;
if(additionalCameraData != null)
{
layerMask = additionalCameraData.volumeLayerMask;
}
else
{
// Temporary hack. For scene view, by default, we don't want to have the lighting override layers in the current sky.
// This is arbitrary and should be editable in the scene view somehow.
if(camera.cameraType == CameraType.SceneView)
{
layerMask = (-1 & ~m_Asset.renderPipelineSettings.lightLoopSettings.skyLightingOverrideLayerMask);
}
}
VolumeManager.instance.Update(camera.transform, layerMask);
}
}

InitAndClearBuffer(hdCamera, enableBakeShadowMask, cmd);
RenderDepthPrepass(m_CullResults, hdCamera, renderContext, cmd, true);
RenderDepthPrepass(m_CullResults, hdCamera, renderContext, cmd);
RenderObjectsVelocity(m_CullResults, hdCamera, renderContext, cmd);

RenderForwardError(m_CullResults, camera, renderContext, cmd, ForwardPass.Transparent);
// Fill depth buffer to reduce artifact for transparent object during postprocess
RenderTransparentDepthPostPass(m_CullResults, camera, renderContext, cmd, ForwardPass.Transparent);
RenderTransparentDepthPostpass(m_CullResults, camera, renderContext, cmd, ForwardPass.Transparent);
PushFullScreenDebugTexture(cmd, m_CameraColorBuffer, camera, renderContext, FullScreenDebugMode.NanTracker);

// Forward only renderer: We always render everything
// Deferred renderer: We render a depth prepass only if engine request it. We can decide if we render everything or only opaque alpha tested object.
// Forward opaque with deferred renderer (DepthForwardOnly pass): We always render everything
void RenderDepthPrepass(CullResults cull, HDCamera hdCamera, ScriptableRenderContext renderContext, CommandBuffer cmd, bool hasDecals)
void RenderDepthPrepass(CullResults cull, HDCamera hdCamera, ScriptableRenderContext renderContext, CommandBuffer cmd)
{
// In case of deferred renderer, we can have forward opaque material. These materials need to be render in the depth buffer to correctly build the light list.
// And they will tag the stencil to not be lit during the deferred lighting pass.

using (new ProfilingSample(cmd, addAlphaTestedOnly ? "Depth Prepass alpha test" : "Depth Prepass", GetSampler(CustomSamplerId.DepthPrepass)))
{
CoreUtils.SetRenderTarget(cmd, m_CameraDepthStencilBufferRT);
if (hasDecals || (addFullDepthPrepass && !addAlphaTestedOnly)) // Always true in case of forward rendering, use in case of deferred rendering if requesting a full depth prepass
if (m_FrameSettings.enableDBuffer || (addFullDepthPrepass && !addAlphaTestedOnly)) // Always true in case of forward rendering, use in case of deferred rendering if requesting a full depth prepass
{
// We render first the opaque object as opaque alpha tested are more costly to render and could be reject by early-z (but not Hi-z as it is disable with clip instruction)
// This is handled automatically with the RenderQueue value (OpaqueAlphaTested have a different value and thus are sorted after Opaque)

}
}
if (m_FrameSettings.enableTransparentPrePass)
if (m_FrameSettings.enableTransparentPrepass)
RenderTransparentRenderList(cull, camera, renderContext, cmd, m_TransparentDepthPrePassNames);
RenderTransparentRenderList(cull, camera, renderContext, cmd, m_TransparentDepthPrepassNames);
}
}
}

}
}
void RenderTransparentDepthPostPass(CullResults cullResults, Camera camera, ScriptableRenderContext renderContext, CommandBuffer cmd, ForwardPass pass)
void RenderTransparentDepthPostpass(CullResults cullResults, Camera camera, ScriptableRenderContext renderContext, CommandBuffer cmd, ForwardPass pass)
if (!m_FrameSettings.enableTransparentPostPass)
if (!m_FrameSettings.enableTransparentPostpass)
using (new ProfilingSample(cmd, "Render Transparent Depth Post ", GetSampler(CustomSamplerId.TransparentDepthPostPass)))
using (new ProfilingSample(cmd, "Render Transparent Depth Post ", GetSampler(CustomSamplerId.TransparentDepthPostpass)))
RenderTransparentRenderList(cullResults, camera, renderContext, cmd, m_TransparentDepthPostPassNames);
RenderTransparentRenderList(cullResults, camera, renderContext, cmd, m_TransparentDepthPostpassNames);
}
}

78
ScriptableRenderPipeline/HDRenderPipeline/HDRP/HDRenderPipelineAsset.asset


m_EditorClassIdentifier:
m_RenderPipelineResources: {fileID: 11400000, guid: 3ce144cff5783da45aa5d4fdc2da14b7,
type: 2}
defaultFrameSettings:
lightingSettings:
enableShadow: 1
enableSSR: 1
enableSSAO: 1
enableSSSAndTransmission: 1
diffuseGlobalDimmer: 1
specularGlobalDimmer: 1
renderSettings:
enableForwardRenderingOnly: 1
enableDepthPrepassWithDeferredRendering: 0
enableAlphaTestOnlyInDeferredPrepass: 0
enableTransparentPrePass: 1
enableMotionVectors: 1
enableDBuffer: 1
enableAtmosphericScattering: 1
enableRoughRefraction: 1
enableTransparentPostPass: 1
enableDistortion: 1
enablePostprocess: 1
enableStereo: 0
enableAsyncCompute: 0
enableOpaqueObjects: 1
enableTransparentObjects: 1
enableMSAA: 0
enableMaterialDisplayDebug: 0
enableShadowMask: 0
serializedFrameSettings:
enableShadow: 1
enableSSR: 1
enableSSAO: 1
enableSSSAndTransmission: 1
diffuseGlobalDimmer: 1
specularGlobalDimmer: 1
enableForwardRenderingOnly: 0
enableDepthPrepassWithDeferredRendering: 0
enableAlphaTestOnlyInDeferredPrepass: 0
enableTransparentPrePass: 1
enableMotionVectors: 1
enableObjectMotionVectors: 1
enableDBuffer: 1
enableAtmosphericScattering: 1
enableRoughRefraction: 1
enableTransparentPostPass: 1
enableDistortion: 1
enablePostprocess: 1
enableStereo: 0
enableAsyncCompute: 0
enableOpaqueObjects: 1
enableTransparentObjects: 1
enableMSAA: 0
enableShadowMask: 0
lightLoopSettings:
enableTileAndCluster: 1
enableComputeLightEvaluation: 1

enableBigTilePrepass: 1
isFptlEnabled: 1
m_globalFrameSettings: {fileID: 0}
m_sssSettings: {fileID: 0}
renderPipelineSettings:
supportShadowMask: 1
supportSSR: 1
supportSSAO: 1
supportSSSAndTransmission: 1
supportDBuffer: 0
supportMSAA: 0
supportAsyncCompute: 0
lightLoopSettings:
spotCookieSize: 128
cookieTexArraySize: 16
pointCookieSize: 512
cubeCookieTexArraySize: 16
reflectionProbeCacheSize: 128
reflectionCubemapSize: 128
reflectionCacheCompressed: 0
skyReflectionSize: 256
skyLightingOverrideLayerMask:
serializedVersion: 2
m_Bits: 256
shadowInitParams:
shadowAtlasWidth: 4096
shadowAtlasHeight: 4096
sssSettings: {fileID: 0}
m_DefaultDiffuseMaterial: {fileID: 2100000, guid: 73c176f402d2c2f4d929aa5da7585d17,
type: 2}
m_DefaultShader: {fileID: 4800000, guid: 6e4ae4064600d784cac1e41a9e6f2e59, type: 3}

22
ScriptableRenderPipeline/HDRenderPipeline/HDRP/HDRenderPipelineAsset.cs


[SerializeField]
public SubsurfaceScatteringSettings sssSettings;
// Default Material / Shader
[SerializeField]
Material m_DefaultDiffuseMaterial;
[SerializeField]
Shader m_DefaultShader;
public Material defaultDiffuseMaterial
{
get { return m_DefaultDiffuseMaterial; }
set { m_DefaultDiffuseMaterial = value; }
}
public Shader defaultShader
{
get { return m_DefaultShader; }
set { m_DefaultShader = value; }
}
return m_DefaultShader;
return m_RenderPipelineResources.defaultShader;
return m_DefaultDiffuseMaterial;
return m_RenderPipelineResources.defaultDiffuseMaterial;
}
public override Material GetDefaultParticleMaterial()

9
ScriptableRenderPipeline/HDRenderPipeline/HDRP/HDStringConstants.cs


public static readonly string s_SRPDefaultUnlitStr = "SRPDefaultUnlit";
public static readonly string s_MotionVectorsStr = "MotionVectors";
public static readonly string s_DistortionVectorsStr = "DistortionVectors";
public static readonly string s_TransparentDepthPrePassStr = "TransparentDepthPrepass";
public static readonly string s_TransparentDepthPrepassStr = "TransparentDepthPrepass";
public static readonly string s_TransparentDepthPostPassStr = "TransparentDepthPostpass";
public static readonly string s_TransparentDepthPostpassStr = "TransparentDepthPostpass";
public static readonly string s_MetaStr = "Meta";
public static readonly string s_ShadowCasterStr = "ShadowCaster";

public static readonly ShaderPassName s_SRPDefaultUnlitName = new ShaderPassName(s_SRPDefaultUnlitStr);
public static readonly ShaderPassName s_MotionVectorsName = new ShaderPassName(s_MotionVectorsStr);
public static readonly ShaderPassName s_DistortionVectorsName = new ShaderPassName(s_DistortionVectorsStr);
public static readonly ShaderPassName s_TransparentDepthPrePassName = new ShaderPassName(s_TransparentDepthPrePassStr);
public static readonly ShaderPassName s_TransparentDepthPrepassName = new ShaderPassName(s_TransparentDepthPrepassStr);
public static readonly ShaderPassName s_TransparentDepthPostPassName = new ShaderPassName(s_TransparentDepthPostPassStr);
public static readonly ShaderPassName s_TransparentDepthPostpassName = new ShaderPassName(s_TransparentDepthPostpassStr);
// Legacy name
public static readonly ShaderPassName s_AlwaysName = new ShaderPassName("Always");

public static readonly int _NonJitteredViewProjMatrix = Shader.PropertyToID("_NonJitteredViewProjMatrix");
public static readonly int _ViewProjMatrix = Shader.PropertyToID("_ViewProjMatrix");
public static readonly int _InvViewProjMatrix = Shader.PropertyToID("_InvViewProjMatrix");
public static readonly int _ViewParam = Shader.PropertyToID("_ViewParam");
public static readonly int _InvProjParam = Shader.PropertyToID("_InvProjParam");
public static readonly int _ScreenSize = Shader.PropertyToID("_ScreenSize");
public static readonly int _PrevViewProjMatrix = Shader.PropertyToID("_PrevViewProjMatrix");

15
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Lighting/HDAdditionalReflectionData.cs


public Vector3 boxReprojectionVolumeCenter = Vector3.zero;
public float maxSearchDistance = 8.0f;
public Texture previewCubemap;
public Vector3 blendDistancePositive = Vector3.zero;
public Vector3 blendDistanceNegative = Vector3.zero;
public Vector3 blendNormalDistancePositive = Vector3.zero;
public Vector3 blendNormalDistanceNegative = Vector3.zero;
public Vector3 boxSideFadePositive = Vector3.one;
public Vector3 boxSideFadeNegative = Vector3.one;
public Vector3 boxBlendCenterOffset { get { return (blendDistanceNegative - blendDistancePositive) * 0.5f; } }
public Vector3 boxBlendSizeOffset { get { return -(blendDistancePositive + blendDistanceNegative); } }
public Vector3 boxBlendNormalCenterOffset { get { return (blendNormalDistanceNegative - blendNormalDistancePositive) * 0.5f; } }
public Vector3 boxBlendNormalSizeOffset { get { return -(blendNormalDistancePositive + blendNormalDistanceNegative); } }
public float sphereBlendRadiusOffset { get { return -blendDistancePositive.x; } }
public float sphereBlendNormalRadiusOffset { get { return -blendNormalDistancePositive.x; } }
}
}

23
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Lighting/LightDefinition.cs


using UnityEngine;
using UnityEngine;
namespace UnityEngine.Experimental.Rendering.HDPipeline
{

public int envIndex;
public Vector3 up;
public float blendDistance; // blend transition outside the volume
public float dimmer;
public Vector3 innerDistance; // equivalent to volume scale
public Vector3 influenceExtents; // extents of the env light
public float dimmer;
public float unused1;
public Vector3 blendDistancePositive; //+X,+Y,+Z
public float unused2;
public Vector3 blendDistanceNegative; //-X,-Y,-Z
public float unused3;
public Vector3 blendNormalDistancePositive; //+X,+Y,+Z
public float unused4;
public Vector3 blendNormalDistanceNegative; //-X,-Y,-Z
public float unused5;
public Vector3 boxSideFadePositive; //+X,+Y,+Z
public float unused6;
public Vector3 boxSideFadeNegative; //-X,-Y,-Z
public float unused7;
};
// Usage of StencilBits.Lighting on 2 bits.

78
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Lighting/LightDefinition.cs.hlsl


float3 forward;
int envIndex;
float3 up;
float blendDistance;
float dimmer;
float3 innerDistance;
float3 influenceExtents;
float dimmer;
float unused1;
float3 blendDistancePositive;
float unused2;
float3 blendDistanceNegative;
float unused3;
float3 blendNormalDistancePositive;
float unused4;
float3 blendNormalDistanceNegative;
float unused5;
float3 boxSideFadePositive;
float unused6;
float3 boxSideFadeNegative;
float unused7;
};
//

{
return value.up;
}
float GetBlendDistance(EnvLightData value)
float GetDimmer(EnvLightData value)
return value.blendDistance;
return value.dimmer;
}
float3 GetRight(EnvLightData value)
{

{
return value.minProjectionDistance;
}
float3 GetInnerDistance(EnvLightData value)
float3 GetInfluenceExtents(EnvLightData value)
return value.innerDistance;
return value.influenceExtents;
}
float GetUnused0(EnvLightData value)
{

{
return value.offsetLS;
}
float GetDimmer(EnvLightData value)
float GetUnused1(EnvLightData value)
{
return value.unused1;
}
float3 GetBlendDistancePositive(EnvLightData value)
return value.dimmer;
return value.blendDistancePositive;
}
float GetUnused2(EnvLightData value)
{
return value.unused2;
}
float3 GetBlendDistanceNegative(EnvLightData value)
{
return value.blendDistanceNegative;
}
float GetUnused3(EnvLightData value)
{
return value.unused3;
}
float3 GetBlendNormalDistancePositive(EnvLightData value)
{
return value.blendNormalDistancePositive;
}
float GetUnused4(EnvLightData value)
{
return value.unused4;
}
float3 GetBlendNormalDistanceNegative(EnvLightData value)
{
return value.blendNormalDistanceNegative;
}
float GetUnused5(EnvLightData value)
{
return value.unused5;
}
float3 GetBoxSideFadePositive(EnvLightData value)
{
return value.boxSideFadePositive;
}
float GetUnused6(EnvLightData value)
{
return value.unused6;
}
float3 GetBoxSideFadeNegative(EnvLightData value)
{
return value.boxSideFadeNegative;
}
float GetUnused7(EnvLightData value)
{
return value.unused7;
}

2
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Lighting/LightLoop/GlobalLightLoopSettings.cs


public int reflectionProbeCacheSize = 128;
public int reflectionCubemapSize = 128;
public bool reflectionCacheCompressed = false;
public SkyResolution skyReflectionSize = SkyResolution.SkyResolution256;
public LayerMask skyLightingOverrideLayerMask = 0;
}
}

686
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Lighting/LightLoop/LightLoop.cs


using UnityEngine.Rendering;
using System.Collections.Generic;
using System;
using UnityEngine.Assertions;
namespace UnityEngine.Experimental.Rendering.HDPipeline
{

public const int k_MaxEnvLightsOnScreen = 64;
public const int k_MaxShadowOnScreen = 16;
public const int k_MaxCascadeCount = 4; //Should be not less than m_Settings.directionalLightCascadeCount;
static readonly Vector3 k_BoxCullingExtentThreshold = Vector3.one * 0.01f;
// Static keyword is required here else we get a "DestroyBuffer can only be call in main thread"
static ComputeBuffer s_DirectionalLightDatas = null;

FrameSettings m_FrameSettings = null;
RenderPipelineResources m_Resources = null;
// this defualt additionalLightData is use for lights that don't have any (like preview light)
HDAdditionalLightData defaultHDAdditionalLightData = new HDAdditionalLightData();
HDAdditionalReflectionData defaultHDAdditionalReflectionData = new HDAdditionalReflectionData();
// Following is an array of material of size eight for all combination of keyword: OUTPUT_SPLIT_LIGHTING - LIGHTLOOP_TILE_PASS - SHADOWS_SHADOWMASK - USE_FPTL_LIGHTLIST/USE_CLUSTERED_LIGHTLIST - DEBUG_DISPLAY
Material[] m_deferredLightingMaterial;

{
for (int shadowMask = 0; shadowMask < 2; ++shadowMask)
{
for (int debugDisplay = 0; debugDisplay < 2; ++debugDisplay)
{
for (int debugDisplay = 0; debugDisplay < 2; ++debugDisplay)
{
int index = GetDeferredLightingMaterialIndex(outputSplitLighting, lightLoopTilePass, shadowMask, debugDisplay);
m_deferredLightingMaterial[index] = CoreUtils.CreateEngineMaterial(m_Resources.deferredShader);

directionalLightData.up = light.light.transform.up * 2 / Mathf.Max(additionalData.shapeHeight, 0.001f);
directionalLightData.positionWS = light.light.transform.position;
directionalLightData.color = GetLightColor(light);
// Caution: This is bad but if additionalData == defaultHDAdditionalLightData it mean we are trying to promote legacy lights, which is the case for the preview for example, so we need to multiply by PI as legacy Unity do implicit divide by PI for direct intensity.
// So we expect that all light with additionalData == defaultHDAdditionalLightData are currently the one from the preview, light in scene MUST have additionalData
directionalLightData.color *= (defaultHDAdditionalLightData == additionalData) ? Mathf.PI : 1.0f;
directionalLightData.diffuseScale = additionalData.affectDiffuse ? diffuseDimmer : 0.0f;
directionalLightData.specularScale = additionalData.affectSpecular ? specularDimmer : 0.0f;
directionalLightData.shadowIndex = directionalLightData.cookieIndex = -1;

public bool GetEnvLightData(CommandBuffer cmd, Camera camera, VisibleReflectionProbe probe)
{
var additionalData = probe.probe.GetComponent<HDAdditionalReflectionData>();
var additionalData = GetHDAdditionalReflectionData(probe);
var influenceBlendDistancePositive = Vector3.one * probe.blendDistance;
var influenceBlendDistanceNegative = Vector3.one * probe.blendDistance;
// For now we won't display real time probe when rendering one.
// TODO: We may want to display last frame result but in this case we need to be careful not to update the atlas before all realtime probes are rendered (for frame coherency).

// CAUTION: localToWorld is the transform for the widget of the reflection probe. i.e the world position of the point use to do the cubemap capture (mean it include the local offset)
envLightData.positionWS = probe.localToWorld.GetColumn(3);
envLightData.boxSideFadePositive = Vector3.one;
envLightData.boxSideFadeNegative = Vector3.one;
if (additionalData != null)
{
envLightData.minProjectionDistance = 0;
switch (additionalData.influenceShape)
{
case ReflectionInfluenceShape.Box:
{
envLightData.envShapeType = EnvShapeType.Box;
break;
}
case ReflectionInfluenceShape.Sphere:
envLightData.envShapeType = EnvShapeType.Sphere;
extents = Vector3.one * additionalData.influenceSphereRadius;
break;
}
if (probe.boxProjection == 0)
envLightData.minProjectionDistance = 65504.0f;
envLightData.dimmer = additionalData.dimmer;
}
else
envLightData.minProjectionDistance = 0;
switch (additionalData.influenceShape)
if (probe.boxProjection == 0)
case ReflectionInfluenceShape.Box:
// If user request to have no projection, then setup a high number for minProjectionDistance
// this will mimic infinite shape projection
envLightData.minProjectionDistance = 65504.0f;
envLightData.boxSideFadePositive = additionalData.boxSideFadePositive;
envLightData.boxSideFadeNegative = additionalData.boxSideFadeNegative;
break;
else
{
envLightData.envShapeType = EnvShapeType.Box;
envLightData.minProjectionDistance = 0.0f;
}
case ReflectionInfluenceShape.Sphere:
envLightData.envShapeType = EnvShapeType.Sphere;
extents = Vector3.one * additionalData.influenceSphereRadius;
break;
}
if (probe.boxProjection == 0)
envLightData.minProjectionDistance = 65504.0f;
envLightData.dimmer = 1;
}
envLightData.dimmer = additionalData.dimmer;
envLightData.blendNormalDistancePositive = additionalData.blendNormalDistancePositive;
envLightData.blendNormalDistanceNegative = additionalData.blendNormalDistanceNegative;
influenceBlendDistancePositive = additionalData.blendDistancePositive;
influenceBlendDistanceNegative = additionalData.blendDistanceNegative;
// remove scale from the matrix (Scale in this matrix is use to scale the widget)
envLightData.right = probe.localToWorld.GetColumn(0);

// So we let the current UI but we assume blendDistance is an inside factor instead
// Blend distance can't be larger than the max radius
// probe.bounds.extents is BoxSize / 2
float maxBlendDist = Mathf.Min(probe.bounds.extents.x, Mathf.Min(probe.bounds.extents.y, probe.bounds.extents.z));
float blendDistance = Mathf.Min(maxBlendDist, probe.blendDistance);
envLightData.innerDistance = extents - new Vector3(blendDistance, blendDistance, blendDistance);
var blendDistancePositive = Vector3.Min(probe.bounds.extents, influenceBlendDistancePositive);
var blendDistanceNegative = Vector3.Min(probe.bounds.extents, influenceBlendDistanceNegative);
envLightData.influenceExtents = extents;
envLightData.blendDistance = blendDistance;
envLightData.blendDistancePositive = blendDistancePositive;
envLightData.blendDistanceNegative = blendDistanceNegative;
m_lightList.envLights.Add(envLightData);

public void GetEnvLightVolumeDataAndBound(VisibleReflectionProbe probe, LightVolumeType lightVolumeType, Matrix4x4 worldToView)
{
var add = GetHDAdditionalReflectionData(probe);
var bnds = probe.bounds;
var boxOffset = probe.center; // reflection volume offset relative to cube map capture point
var blendDistance = probe.blendDistance;
var centerOffset = probe.center; // reflection volume offset relative to cube map capture point
var mat = probe.localToWorld;
Vector3 vx = mat.GetColumn(0);

vz.Normalize();
// C is reflection volume center in world space (NOT same as cube map capture point)
var e = bnds.extents; // 0.5f * Vector3.Max(-boxSizes[p], boxSizes[p]);
var C = vx * boxOffset.x + vy * boxOffset.y + vz * boxOffset.z + vw;
var combinedExtent = e + new Vector3(blendDistance, blendDistance, blendDistance);
var influenceExtents = probe.bounds.extents; // 0.5f * Vector3.Max(-boxSizes[p], boxSizes[p]);
var centerWS = vx * centerOffset.x + vy * centerOffset.y + vz * centerOffset.z + vw;
// transform to camera space (becomes a left hand coordinate frame in Unity since Determinant(worldToView)<0)
vx = worldToView.MultiplyVector(vx);

var Cw = worldToView.MultiplyPoint(C);
bound.center = Cw;
bound.boxAxisX = combinedExtent.x * vx;
bound.boxAxisY = combinedExtent.y * vy;
bound.boxAxisZ = combinedExtent.z * vz;
bound.scaleXY.Set(1.0f, 1.0f);
bound.radius = combinedExtent.magnitude;
var centerVS = worldToView.MultiplyPoint(centerWS);
lightVolumeData.lightPos = Cw;
lightVolumeData.lightAxisX = vx;
lightVolumeData.lightAxisY = vy;
lightVolumeData.lightAxisZ = vz;
var delta = combinedExtent - e;
lightVolumeData.boxInnerDist = e;
lightVolumeData.boxInvRange.Set(1.0f / delta.x, 1.0f / delta.y, 1.0f / delta.z);
switch (lightVolumeType)
{
case LightVolumeType.Sphere:
{
lightVolumeData.lightPos = centerVS;
lightVolumeData.radiusSq = add.influenceSphereRadius * add.influenceSphereRadius;
lightVolumeData.lightAxisX = vx;
lightVolumeData.lightAxisY = vy;
lightVolumeData.lightAxisZ = vz;
bound.center = centerVS;
bound.boxAxisX = vx * add.influenceSphereRadius;
bound.boxAxisY = vy * add.influenceSphereRadius;
bound.boxAxisZ = vz * add.influenceSphereRadius;
bound.scaleXY.Set(1.0f, 1.0f);
bound.radius = add.influenceSphereRadius;
break;
}
case LightVolumeType.Box:
{
bound.center = centerVS;
bound.boxAxisX = influenceExtents.x * vx;
bound.boxAxisY = influenceExtents.y * vy;
bound.boxAxisZ = influenceExtents.z * vz;
bound.scaleXY.Set(1.0f, 1.0f);
bound.radius = influenceExtents.magnitude;
// The culling system culls pixels that are further
// than a threshold to the box influence extents.
// So we use an arbitrary threshold here (k_BoxCullingExtentOffset)
lightVolumeData.lightPos = centerVS;
lightVolumeData.lightAxisX = vx;
lightVolumeData.lightAxisY = vy;
lightVolumeData.lightAxisZ = vz;
lightVolumeData.boxInnerDist = influenceExtents - k_BoxCullingExtentThreshold;
lightVolumeData.boxInvRange.Set(1.0f / k_BoxCullingExtentThreshold.x, 1.0f / k_BoxCullingExtentThreshold.y, 1.0f / k_BoxCullingExtentThreshold.z);
break;
}
}
public int GetCurrentShadowCount()
{
return m_ShadowRequests.Count;

{
return (int)m_ShadowMgr.GetShadowMapCount();
return (m_ShadowMgr == null) ? 0 : (int)m_ShadowMgr.GetShadowMapCount();
}
public void UpdateCullingParameters(ref ScriptableCullingParameters cullingParams)

{
using (new ProfilingSample(cmd, "Prepare Lights For GPU"))
{
// If any light require it, we need to enabled bake shadow mask feature
m_enableBakeShadowMask = false;
// If any light require it, we need to enabled bake shadow mask feature
m_enableBakeShadowMask = false;
m_lightList.Clear();
m_lightList.Clear();
Vector3 camPosWS = camera.transform.position;
Vector3 camPosWS = camera.transform.position;
// Note: Light with null intensity/Color are culled by the C++, no need to test it here
if (cullResults.visibleLights.Count != 0 || cullResults.visibleReflectionProbes.Count != 0)
{
// 0. deal with shadows
// Note: Light with null intensity/Color are culled by the C++, no need to test it here
if (cullResults.visibleLights.Count != 0 || cullResults.visibleReflectionProbes.Count != 0)
m_FrameId.frameCount++;
// get the indices for all lights that want to have shadows
m_ShadowRequests.Clear();
m_ShadowRequests.Capacity = cullResults.visibleLights.Count;
int lcnt = cullResults.visibleLights.Count;
for (int i = 0; i < lcnt; ++i)
// 0. deal with shadows
VisibleLight vl = cullResults.visibleLights[i];
if (vl.light.shadows == LightShadows.None)
continue;
m_FrameId.frameCount++;
// get the indices for all lights that want to have shadows
m_ShadowRequests.Clear();
m_ShadowRequests.Capacity = cullResults.visibleLights.Count;
int lcnt = cullResults.visibleLights.Count;
for (int i = 0; i < lcnt; ++i)
{
VisibleLight vl = cullResults.visibleLights[i];
if (vl.light.shadows == LightShadows.None)
continue;
AdditionalShadowData asd = vl.light.GetComponent<AdditionalShadowData>();
if (asd != null && asd.shadowDimmer > 0.0f)
m_ShadowRequests.Add(i);
}
// pass this list to a routine that assigns shadows based on some heuristic
uint shadowRequestCount = (uint)m_ShadowRequests.Count;
//TODO: Do not call ToArray here to avoid GC, refactor API
int[] shadowRequests = m_ShadowRequests.ToArray();
int[] shadowDataIndices;
m_ShadowMgr.ProcessShadowRequests(m_FrameId, cullResults, camera, ShaderConfig.s_CameraRelativeRendering != 0, cullResults.visibleLights,
ref shadowRequestCount, shadowRequests, out shadowDataIndices);
AdditionalShadowData asd = vl.light.GetComponent<AdditionalShadowData>();
if (asd != null && asd.shadowDimmer > 0.0f)
m_ShadowRequests.Add(i);
}
// pass this list to a routine that assigns shadows based on some heuristic
uint shadowRequestCount = (uint)m_ShadowRequests.Count;
//TODO: Do not call ToArray here to avoid GC, refactor API
int[] shadowRequests = m_ShadowRequests.ToArray();
int[] shadowDataIndices;
m_ShadowMgr.ProcessShadowRequests(m_FrameId, cullResults, camera, ShaderConfig.s_CameraRelativeRendering != 0, cullResults.visibleLights,
ref shadowRequestCount, shadowRequests, out shadowDataIndices);
// update the visibleLights with the shadow information
m_ShadowIndices.Clear();
for (uint i = 0; i < shadowRequestCount; i++)
{
m_ShadowIndices.Add(shadowRequests[i], shadowDataIndices[i]);
// update the visibleLights with the shadow information
m_ShadowIndices.Clear();
for (uint i = 0; i < shadowRequestCount; i++)
{
m_ShadowIndices.Add(shadowRequests[i], shadowDataIndices[i]);
}
}
// 1. Count the number of lights and sort all lights by category, type and volume - This is required for the fptl/cluster shader code
// If we reach maximum of lights available on screen, then we discard the light.
// Lights are processed in order, so we don't discards light based on their importance but based on their ordering in visible lights list.
int directionalLightcount = 0;
int punctualLightcount = 0;
int areaLightCount = 0;
// 1. Count the number of lights and sort all lights by category, type and volume - This is required for the fptl/cluster shader code
// If we reach maximum of lights available on screen, then we discard the light.
// Lights are processed in order, so we don't discards light based on their importance but based on their ordering in visible lights list.
int directionalLightcount = 0;
int punctualLightcount = 0;
int areaLightCount = 0;
int lightCount = Math.Min(cullResults.visibleLights.Count, k_MaxLightsOnScreen);
var sortKeys = new uint[lightCount];
int sortCount = 0;
int lightCount = Math.Min(cullResults.visibleLights.Count, k_MaxLightsOnScreen);
var sortKeys = new uint[lightCount];
int sortCount = 0;
for (int lightIndex = 0, numLights = cullResults.visibleLights.Count; (lightIndex < numLights) && (sortCount < lightCount); ++lightIndex)
{
var light = cullResults.visibleLights[lightIndex];
for (int lightIndex = 0, numLights = cullResults.visibleLights.Count; (lightIndex < numLights) && (sortCount < lightCount); ++lightIndex)
{
var light = cullResults.visibleLights[lightIndex];
// Light should always have additional data, however preview light right don't have, so we must handle the case by assigning defaultHDAdditionalLightData
var additionalData = GetHDAdditionalLightData(light);
// We only process light with additional data
var additionalData = light.light.GetComponent<HDAdditionalLightData>();
LightCategory lightCategory = LightCategory.Count;
GPULightType gpuLightType = GPULightType.Point;
LightVolumeType lightVolumeType = LightVolumeType.Count;
// Debug.Assert(additionalData == null, "Missing HDAdditionalData on a light - Should have been create by HDLightEditor");
if (additionalData.lightTypeExtent == LightTypeExtent.Punctual)
{
lightCategory = LightCategory.Punctual;
if (additionalData == null)
return false;
switch (light.lightType)
{
case LightType.Spot:
if (punctualLightcount >= k_MaxPunctualLightsOnScreen)
continue;
switch (additionalData.spotLightShape)
{
case SpotLightShape.Cone:
gpuLightType = GPULightType.Spot;
lightVolumeType = LightVolumeType.Cone;
break;
case SpotLightShape.Pyramid:
gpuLightType = GPULightType.ProjectorPyramid;
lightVolumeType = LightVolumeType.Cone;
break;
case SpotLightShape.Box:
gpuLightType = GPULightType.ProjectorBox;
lightVolumeType = LightVolumeType.Box;
break;
default:
Debug.Assert(false, "Encountered an unknown SpotLightShape.");
break;
}
break;
LightCategory lightCategory = LightCategory.Count;
GPULightType gpuLightType = GPULightType.Point;
LightVolumeType lightVolumeType = LightVolumeType.Count;
case LightType.Directional:
if (directionalLightcount >= k_MaxDirectionalLightsOnScreen)
continue;
gpuLightType = GPULightType.Directional;
// No need to add volume, always visible
lightVolumeType = LightVolumeType.Count; // Count is none
break;
if (additionalData.lightTypeExtent == LightTypeExtent.Punctual)
{
lightCategory = LightCategory.Punctual;
case LightType.Point:
if (punctualLightcount >= k_MaxPunctualLightsOnScreen)
continue;
gpuLightType = GPULightType.Point;
lightVolumeType = LightVolumeType.Sphere;
break;
switch (light.lightType)
default:
Debug.Assert(false, "Encountered an unknown LightType.");
break;
}
}
else
case LightType.Spot:
if (punctualLightcount >= k_MaxPunctualLightsOnScreen)
continue;
switch (additionalData.spotLightShape)
{
case SpotLightShape.Cone:
gpuLightType = GPULightType.Spot;
lightVolumeType = LightVolumeType.Cone;
break;
case SpotLightShape.Pyramid:
gpuLightType = GPULightType.ProjectorPyramid;
lightVolumeType = LightVolumeType.Cone;
break;
case SpotLightShape.Box:
gpuLightType = GPULightType.ProjectorBox;
lightVolumeType = LightVolumeType.Box;
break;
default:
Debug.Assert(false, "Encountered an unknown SpotLightShape.");
break;
}
break;
lightCategory = LightCategory.Area;
case LightType.Directional:
if (directionalLightcount >= k_MaxDirectionalLightsOnScreen)
continue;
gpuLightType = GPULightType.Directional;
// No need to add volume, always visible
lightVolumeType = LightVolumeType.Count; // Count is none
break;
switch (additionalData.lightTypeExtent)
{
case LightTypeExtent.Rectangle:
if (areaLightCount >= k_MaxAreaLightsOnScreen)
continue;
gpuLightType = GPULightType.Rectangle;
lightVolumeType = LightVolumeType.Box;
break;
case LightType.Point:
if (punctualLightcount >= k_MaxPunctualLightsOnScreen)
continue;
gpuLightType = GPULightType.Point;
lightVolumeType = LightVolumeType.Sphere;
break;
case LightTypeExtent.Line:
if (areaLightCount >= k_MaxAreaLightsOnScreen)
continue;
gpuLightType = GPULightType.Line;
lightVolumeType = LightVolumeType.Box;
break;
default:
Debug.Assert(false, "Encountered an unknown LightType.");
break;
default:
Debug.Assert(false, "Encountered an unknown LightType.");
break;
}
}
else
{
lightCategory = LightCategory.Area;
switch (additionalData.lightTypeExtent)
{
case LightTypeExtent.Rectangle:
if (areaLightCount >= k_MaxAreaLightsOnScreen)
continue;
gpuLightType = GPULightType.Rectangle;
lightVolumeType = LightVolumeType.Box;
break;
uint shadow = m_ShadowIndices.ContainsKey(lightIndex) ? 1u : 0;
// 5 bit (0x1F) light category, 5 bit (0x1F) GPULightType, 5 bit (0x1F) lightVolume, 1 bit for shadow casting, 16 bit index
sortKeys[sortCount++] = (uint)lightCategory << 27 | (uint)gpuLightType << 22 | (uint)lightVolumeType << 17 | shadow << 16 | (uint)lightIndex;
}
case LightTypeExtent.Line:
if (areaLightCount >= k_MaxAreaLightsOnScreen)
continue;
gpuLightType = GPULightType.Line;
lightVolumeType = LightVolumeType.Box;
break;
CoreUtils.QuickSort(sortKeys, 0, sortCount - 1); // Call our own quicksort instead of Array.Sort(sortKeys, 0, sortCount) so we don't allocate memory (note the SortCount-1 that is different from original call).
default:
Debug.Assert(false, "Encountered an unknown LightType.");
break;
}
}
// TODO: Refactor shadow management
// The good way of managing shadow:
// Here we sort everyone and we decide which light is important or not (this is the responsibility of the lightloop)
// we allocate shadow slot based on maximum shadow allowed on screen and attribute slot by bigger solid angle
// THEN we ask to the ShadowRender to render the shadow, not the reverse as it is today (i.e render shadow than expect they
// will be use...)
// The lightLoop is in charge, not the shadow pass.
// For now we will still apply the maximum of shadow here but we don't apply the sorting by priority + slot allocation yet
m_CurrentSunLight = null;
m_CurrentSunLightShadowIndex = -1;
uint shadow = m_ShadowIndices.ContainsKey(lightIndex) ? 1u : 0;
// 5 bit (0x1F) light category, 5 bit (0x1F) GPULightType, 5 bit (0x1F) lightVolume, 1 bit for shadow casting, 16 bit index
sortKeys[sortCount++] = (uint)lightCategory << 27 | (uint)gpuLightType << 22 | (uint)lightVolumeType << 17 | shadow << 16 | (uint)lightIndex;
}
// 2. Go through all lights, convert them to GPU format.
// Create simultaneously data for culling (LigthVolumeData and rendering)
var worldToView = WorldToCamera(camera);
CoreUtils.QuickSort(sortKeys, 0, sortCount - 1); // Call our own quicksort instead of Array.Sort(sortKeys, 0, sortCount) so we don't allocate memory (note the SortCount-1 that is different from original call).
for (int sortIndex = 0; sortIndex < sortCount; ++sortIndex)
{
// In 1. we have already classify and sorted the light, we need to use this sorted order here
uint sortKey = sortKeys[sortIndex];
LightCategory lightCategory = (LightCategory)((sortKey >> 27) & 0x1F);
GPULightType gpuLightType = (GPULightType)((sortKey >> 22) & 0x1F);
LightVolumeType lightVolumeType = (LightVolumeType)((sortKey >> 17) & 0x1F);
int lightIndex = (int)(sortKey & 0xFFFF);
// TODO: Refactor shadow management
// The good way of managing shadow:
// Here we sort everyone and we decide which light is important or not (this is the responsibility of the lightloop)
// we allocate shadow slot based on maximum shadow allowed on screen and attribute slot by bigger solid angle
// THEN we ask to the ShadowRender to render the shadow, not the reverse as it is today (i.e render shadow than expect they
// will be use...)
// The lightLoop is in charge, not the shadow pass.
// For now we will still apply the maximum of shadow here but we don't apply the sorting by priority + slot allocation yet
m_CurrentSunLight = null;
m_CurrentSunLightShadowIndex = -1;
var light = cullResults.visibleLights[lightIndex];
// 2. Go through all lights, convert them to GPU format.
// Create simultaneously data for culling (LigthVolumeData and rendering)
var worldToView = WorldToCamera(camera);
m_enableBakeShadowMask = m_enableBakeShadowMask || IsBakedShadowMaskLight(light.light);
for (int sortIndex = 0; sortIndex < sortCount; ++sortIndex)
{
// In 1. we have already classify and sorted the light, we need to use this sorted order here
uint sortKey = sortKeys[sortIndex];
LightCategory lightCategory = (LightCategory)((sortKey >> 27) & 0x1F);
GPULightType gpuLightType = (GPULightType)((sortKey >> 22) & 0x1F);
LightVolumeType lightVolumeType = (LightVolumeType)((sortKey >> 17) & 0x1F);
int lightIndex = (int)(sortKey & 0xFFFF);
// Light should always have additional data, however preview light right don't have, so we must handle the case by assigning defaultHDAdditionalLightData
var additionalLightData = GetHDAdditionalLightData(light);
var additionalShadowData = light.light.GetComponent<AdditionalShadowData>(); // Can be null
var light = cullResults.visibleLights[lightIndex];
// Directional rendering side, it is separated as it is always visible so no volume to handle here
if (gpuLightType == GPULightType.Directional)
{
if (GetDirectionalLightData(cmd, shadowSettings, gpuLightType, light, additionalLightData, additionalShadowData, lightIndex))
{
directionalLightcount++;
m_enableBakeShadowMask = m_enableBakeShadowMask || IsBakedShadowMaskLight(light.light);
// We make the light position camera-relative as late as possible in order
// to allow the preceding code to work with the absolute world space coordinates.
if (ShaderConfig.s_CameraRelativeRendering != 0)
{
// Caution: 'DirectionalLightData.positionWS' is camera-relative after this point.
int n = m_lightList.directionalLights.Count;
DirectionalLightData lightData = m_lightList.directionalLights[n - 1];
lightData.positionWS -= camPosWS;
m_lightList.directionalLights[n - 1] = lightData;
}
}
continue;
}
var additionalLightData = light.light.GetComponent<HDAdditionalLightData>();
var additionalShadowData = light.light.GetComponent<AdditionalShadowData>(); // Can be null
Vector3 lightDimensions = new Vector3(); // X = length or width, Y = height, Z = range (depth)
// Directional rendering side, it is separated as it is always visible so no volume to handle here
if (gpuLightType == GPULightType.Directional)
{
if (GetDirectionalLightData(cmd, shadowSettings, gpuLightType, light, additionalLightData, additionalShadowData, lightIndex))
// Punctual, area, projector lights - the rendering side.
if (GetLightData(cmd, shadowSettings, camera, gpuLightType, light, additionalLightData, additionalShadowData, lightIndex, ref lightDimensions))
directionalLightcount++;
switch (lightCategory)
{
case LightCategory.Punctual:
punctualLightcount++;
break;
case LightCategory.Area:
areaLightCount++;
break;
default:
Debug.Assert(false, "TODO: encountered an unknown LightCategory.");
break;
}
// Then culling side. Must be call in this order as we pass the created Light data to the function
GetLightVolumeDataAndBound(lightCategory, gpuLightType, lightVolumeType, light, m_lightList.lights[m_lightList.lights.Count - 1], lightDimensions, worldToView);
// Caution: 'DirectionalLightData.positionWS' is camera-relative after this point.
int n = m_lightList.directionalLights.Count;
DirectionalLightData lightData = m_lightList.directionalLights[n - 1];
// Caution: 'LightData.positionWS' is camera-relative after this point.
int n = m_lightList.lights.Count;
LightData lightData = m_lightList.lights[n - 1];
m_lightList.directionalLights[n - 1] = lightData;
m_lightList.lights[n - 1] = lightData;
continue;
Vector3 lightDimensions = new Vector3(); // X = length or width, Y = height, Z = range (depth)
// Punctual, area, projector lights - the rendering side.
if (GetLightData(cmd, shadowSettings, camera, gpuLightType, light, additionalLightData, additionalShadowData, lightIndex, ref lightDimensions))
{
switch (lightCategory)
{
case LightCategory.Punctual:
punctualLightcount++;
break;
case LightCategory.Area:
areaLightCount++;
break;
default:
Debug.Assert(false, "TODO: encountered an unknown LightCategory.");
break;
}
// Sanity check
Debug.Assert(m_lightList.directionalLights.Count == directionalLightcount);
Debug.Assert(m_lightList.lights.Count == areaLightCount + punctualLightcount);
// Then culling side. Must be call in this order as we pass the created Light data to the function
GetLightVolumeDataAndBound(lightCategory, gpuLightType, lightVolumeType, light, m_lightList.lights[m_lightList.lights.Count - 1], lightDimensions, worldToView);
m_punctualLightCount = punctualLightcount;
m_areaLightCount = areaLightCount;
// We make the light position camera-relative as late as possible in order
// to allow the preceding code to work with the absolute world space coordinates.
if (ShaderConfig.s_CameraRelativeRendering != 0)
{
// Caution: 'LightData.positionWS' is camera-relative after this point.
int n = m_lightList.lights.Count;
LightData lightData = m_lightList.lights[n - 1];
lightData.positionWS -= camPosWS;
m_lightList.lights[n - 1] = lightData;
}
}
}
// Redo everything but this time with envLights
int envLightCount = 0;
// Sanity check
Debug.Assert(m_lightList.directionalLights.Count == directionalLightcount);
Debug.Assert(m_lightList.lights.Count == areaLightCount + punctualLightcount);
int probeCount = Math.Min(cullResults.visibleReflectionProbes.Count, k_MaxEnvLightsOnScreen);
sortKeys = new uint[probeCount];
sortCount = 0;
m_punctualLightCount = punctualLightcount;
m_areaLightCount = areaLightCount;
for (int probeIndex = 0, numProbes = cullResults.visibleReflectionProbes.Count; (probeIndex < numProbes) && (sortCount < probeCount); probeIndex++)
{
VisibleReflectionProbe probe = cullResults.visibleReflectionProbes[probeIndex];
HDAdditionalReflectionData additional = probe.probe.GetComponent<HDAdditionalReflectionData>();
// Redo everything but this time with envLights
int envLightCount = 0;
// probe.texture can be null when we are adding a reflection probe in the editor
if (probe.texture == null || envLightCount >= k_MaxEnvLightsOnScreen)
continue;
int probeCount = Math.Min(cullResults.visibleReflectionProbes.Count, k_MaxEnvLightsOnScreen);
sortKeys = new uint[probeCount];
sortCount = 0;
// Work around the culling issues. TODO: fix culling in C++.
if (probe.probe == null || !probe.probe.isActiveAndEnabled)
continue;
for (int probeIndex = 0, numProbes = cullResults.visibleReflectionProbes.Count; (probeIndex < numProbes) && (sortCount < probeCount); probeIndex++)
{
VisibleReflectionProbe probe = cullResults.visibleReflectionProbes[probeIndex];
// Work around the data issues.
if (probe.localToWorld.determinant == 0)
{
Debug.LogError("Reflection probe " + probe.probe.name + " has an invalid local frame and needs to be fixed.");
continue;
}
// probe.texture can be null when we are adding a reflection probe in the editor
if (probe.texture == null || envLightCount >= k_MaxEnvLightsOnScreen)
continue;
LightVolumeType lightVolumeType = LightVolumeType.Box;
if (additional != null && additional.influenceShape == ReflectionInfluenceShape.Sphere)
lightVolumeType = LightVolumeType.Sphere;
++envLightCount;
// Work around the culling issues. TODO: fix culling in C++.
if (probe.probe == null || !probe.probe.isActiveAndEnabled)
continue;
float boxVolume = 8 * probe.bounds.extents.x * probe.bounds.extents.y * probe.bounds.extents.z;
float logVolume = Mathf.Clamp(256 + Mathf.Log(boxVolume, 1.1f), 0, 8191); // Allow for negative exponents
// Work around the data issues.
if (probe.localToWorld.determinant == 0)
{
Debug.LogError("Reflection probe " + probe.probe.name + " has an invalid local frame and needs to be fixed.");
continue;
// 13 bit volume, 3 bit LightVolumeType, 16 bit index
sortKeys[sortCount++] = (uint)logVolume << 19 | (uint)lightVolumeType << 16 | ((uint)probeIndex & 0xFFFF); // Sort by volume
// TODO: Support LightVolumeType.Sphere, currently in UI there is no way to specify a sphere influence volume
LightVolumeType lightVolumeType = probe.boxProjection != 0 ? LightVolumeType.Box : LightVolumeType.Box;
++envLightCount;
float boxVolume = 8 * probe.bounds.extents.x * probe.bounds.extents.y * probe.bounds.extents.z;
float logVolume = Mathf.Clamp(256 + Mathf.Log(boxVolume, 1.1f), 0, 8191); // Allow for negative exponents
// 13 bit volume, 3 bit LightVolumeType, 16 bit index
sortKeys[sortCount++] = (uint)logVolume << 19 | (uint)lightVolumeType << 16 | ((uint)probeIndex & 0xFFFF); // Sort by volume
}
// Not necessary yet but call it for future modification with sphere influence volume
CoreUtils.QuickSort(sortKeys, 0, sortCount - 1); // Call our own quicksort instead of Array.Sort(sortKeys, 0, sortCount) so we don't allocate memory (note the SortCount-1 that is different from original call).
// Not necessary yet but call it for future modification with sphere influence volume
CoreUtils.QuickSort(sortKeys, 0, sortCount - 1); // Call our own quicksort instead of Array.Sort(sortKeys, 0, sortCount) so we don't allocate memory (note the SortCount-1 that is different from original call).
for (int sortIndex = 0; sortIndex < sortCount; ++sortIndex)
{
// In 1. we have already classify and sorted the light, we need to use this sorted order here
uint sortKey = sortKeys[sortIndex];
LightVolumeType lightVolumeType = (LightVolumeType)((sortKey >> 16) & 0x3);
int probeIndex = (int)(sortKey & 0xFFFF);
for (int sortIndex = 0; sortIndex < sortCount; ++sortIndex)
{
// In 1. we have already classify and sorted the light, we need to use this sorted order here
uint sortKey = sortKeys[sortIndex];
LightVolumeType lightVolumeType = (LightVolumeType)((sortKey >> 16) & 0x3);
int probeIndex = (int)(sortKey & 0xFFFF);
VisibleReflectionProbe probe = cullResults.visibleReflectionProbes[probeIndex];
VisibleReflectionProbe probe = cullResults.visibleReflectionProbes[probeIndex];
if (GetEnvLightData(cmd, camera, probe))
{
GetEnvLightVolumeDataAndBound(probe, lightVolumeType, worldToView);
if (GetEnvLightData(cmd, camera, probe))
{
GetEnvLightVolumeDataAndBound(probe, lightVolumeType, worldToView);
// We make the light position camera-relative as late as possible in order
// to allow the preceding code to work with the absolute world space coordinates.
if (ShaderConfig.s_CameraRelativeRendering != 0)
{
// Caution: 'EnvLightData.positionWS' is camera-relative after this point.
int n = m_lightList.envLights.Count;
EnvLightData envLightData = m_lightList.envLights[n - 1];
envLightData.positionWS -= camPosWS;
m_lightList.envLights[n - 1] = envLightData;
// We make the light position camera-relative as late as possible in order
// to allow the preceding code to work with the absolute world space coordinates.
if (ShaderConfig.s_CameraRelativeRendering != 0)
{
// Caution: 'EnvLightData.positionWS' is camera-relative after this point.
int n = m_lightList.envLights.Count;
EnvLightData envLightData = m_lightList.envLights[n - 1];
envLightData.positionWS -= camPosWS;
m_lightList.envLights[n - 1] = envLightData;
}
}
}
}
m_lightCount = m_lightList.lights.Count + m_lightList.envLights.Count;
Debug.Assert(m_lightList.bounds.Count == m_lightCount);
Debug.Assert(m_lightList.lightVolumes.Count == m_lightCount);
m_lightCount = m_lightList.lights.Count + m_lightList.envLights.Count;
Debug.Assert(m_lightList.bounds.Count == m_lightCount);
Debug.Assert(m_lightList.lightVolumes.Count == m_lightCount);
UpdateDataBuffers();
UpdateDataBuffers();
m_maxShadowDistance = shadowSettings.maxShadowDistance;
m_maxShadowDistance = shadowSettings.maxShadowDistance;
return m_enableBakeShadowMask;
}
return m_enableBakeShadowMask;
}
}
void VoxelLightListGeneration(CommandBuffer cmd, Camera camera, Matrix4x4 projscr, Matrix4x4 invProjscr, RenderTargetIdentifier cameraDepthBufferRT)

// These two buffers have been set in Rebuild()
s_ConvexBoundsBuffer.SetData(m_lightList.bounds);
s_LightVolumeDataBuffer.SetData(m_lightList.lightVolumes);
}
HDAdditionalReflectionData GetHDAdditionalReflectionData(VisibleReflectionProbe probe)
{
var add = probe.probe.GetComponent<HDAdditionalReflectionData>();
if (add == null)
{
add = defaultHDAdditionalReflectionData;
add.blendDistancePositive = Vector3.one * probe.blendDistance;
add.blendDistanceNegative = add.blendDistancePositive;
add.influenceShape = ReflectionInfluenceShape.Box;
}
return add;
}
HDAdditionalLightData GetHDAdditionalLightData(VisibleLight light)
{
var add = light.light.GetComponent<HDAdditionalLightData>();
if (add == null)
{
add = defaultHDAdditionalLightData;
}
return add;
}
void PushGlobalParams(Camera camera, CommandBuffer cmd)

25
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Lighting/LightUtilities.hlsl


EnvLightData InitSkyEnvLightData(int envIndex)
{
EnvLightData output;
output.envShapeType = ENVSHAPETYPE_SKY;
output.envIndex = envIndex;
output.forward = float3(0.0, 0.0, 1.0);
output.up = float3(0.0, 1.0, 0.0);
output.right = float3(1.0, 0.0, 0.0);
output.positionWS = float3(0.0, 0.0, 0.0);
output.offsetLS = float3(0.0, 0.0, 0.0);
output.innerDistance = float3(0.0, 0.0, 0.0);
output.blendDistance = 1.0;
output.dimmer = 1.0;
output.envShapeType = ENVSHAPETYPE_SKY;
output.envIndex = envIndex;
output.forward = float3(0.0, 0.0, 1.0);
output.up = float3(0.0, 1.0, 0.0);
output.right = float3(1.0, 0.0, 0.0);
output.positionWS = float3(0.0, 0.0, 0.0);
output.offsetLS = float3(0.0, 0.0, 0.0);
output.influenceExtents = float3(0.0, 0.0, 0.0);
output.blendDistancePositive = float3(0.0, 0.0, 0.0);
output.blendDistanceNegative = float3(0.0, 0.0, 0.0);
output.blendNormalDistancePositive = float3(0.0, 0.0, 0.0);
output.blendNormalDistanceNegative = float3(0.0, 0.0, 0.0);
output.boxSideFadePositive = float3(0.0, 0.0, 0.0);
output.boxSideFadeNegative = float3(0.0, 0.0, 0.0);
output.dimmer = 1.0;
return output;
}

5
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Material/LayeredLit/LayeredLit.shader


[ToggleOff] _EnableBlendModePreserveSpecularLighting("Enable Blend Mode Preserve Specular Lighting", Float) = 1.0
[ToggleOff] _DoubleSidedEnable("Double sided enable", Float) = 0.0
[Enum(None, 0, Mirror, 1, Flip, 2)] _DoubleSidedNormalMode("Double sided normal mode", Float) = 1
[Enum(Flip, 0, Mirror, 1)] _DoubleSidedNormalMode("Double sided normal mode", Float) = 1
[HideInInspector] _DoubleSidedConstants("_DoubleSidedConstants", Vector) = (1, 1, -1, 0)
[Enum(Subsurface Scattering, 0, Standard, 1)] _MaterialID("MaterialId", Int) = 1 // MaterialId.RegularLighting

SubShader
{
Pass
// Caution: The outline selection in the editor use the vertex shader/hull/domain shader of the first pass declare. So it should not bethe meta pass.
Pass
{
Name "GBuffer" // Name is not used
Tags { "LightMode" = "GBuffer" } // This will be only for opaque object based on the RenderQueue index

7
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Material/LayeredLit/LayeredLitTessellation.shader


[ToggleOff] _EnableBlendModePreserveSpecularLighting("Enable Blend Mode Preserve Specular Lighting", Float) = 1.0
[ToggleOff] _DoubleSidedEnable("Double sided enable", Float) = 0.0
[Enum(None, 0, Mirror, 1, Flip, 2)] _DoubleSidedNormalMode("Double sided normal mode", Float) = 1
[Enum(Flip, 0, Mirror, 1)] _DoubleSidedNormalMode("Double sided normal mode", Float) = 1
[Enum(None, 0, Vertex displacement, 1, Pixel displacement, 2, Tessellation displacement, 3)] _DisplacementMode("DisplacementMode", Int) = 0
[Enum(None, 0, Tessellation displacement, 3)] _DisplacementMode("DisplacementMode", Int) = 3
[ToggleOff] _DisplacementLockObjectScale("displacement lock object scale", Float) = 1.0
[ToggleOff] _DisplacementLockTilingScale("displacement lock tiling scale", Float) = 1.0
[ToggleOff] _DepthOffsetEnable("Depth Offset View space", Float) = 0.0

SubShader
{
Pass
// Caution: The outline selection in the editor use the vertex shader/hull/domain shader of the first pass declare. So it should not bethe meta pass.
Pass
{
Name "GBuffer" // Name is not used
Tags { "LightMode" = "GBuffer" } // This will be only for opaque object based on the RenderQueue index

108
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Material/Lit/Lit.hlsl


#define ENVMAP_FEATURE_PERFACEINFLUENCE
#define ENVMAP_FEATURE_INFLUENCENORMAL
#define ENVMAP_FEATURE_PERFACEFADE
//-----------------------------------------------------------------------------
// SurfaceData and BSDFData
//-----------------------------------------------------------------------------

float hitDistanceFromPosition = depthFromPosition / dot(-V, rayWS);
return positionWS + rayWS * hitDistanceFromPosition;
}
//------------------------------------------------------------------------------------
// Little helper to share code between sphere and box.
// These function will fade the mask of a reflection volume based on normal orientation compare to direction define by the center of the reflection volume.
//-----------------------------------------------------------------------------
float InfluenceFadeNormalWeight(float3 normal, float3 centerToPos)
{
// Start weight from 0.6f (1 fully transparent) to 0.2f (fully opaque).
return saturate((-1.0f / 0.4f) * dot(normal, centerToPos) + (0.6f / 0.4f));
}
//-----------------------------------------------------------------------------

{
// 1. First process the projection
float3 dirLS = mul(R, worldToLocal);
float sphereOuterDistance = lightData.innerDistance.x + lightData.blendDistance;
float dist = SphereRayIntersectSimple(positionLS, dirLS, sphereOuterDistance);
dist = max(dist, lightData.minProjectionDistance); // Setup projection to infinite if requested (mean no projection shape)
float sphereOuterDistance = lightData.influenceExtents.x;
float projectionDistance = SphereRayIntersectSimple(positionLS, dirLS, sphereOuterDistance);
projectionDistance = max(projectionDistance, lightData.minProjectionDistance); // Setup projection to infinite if requested (mean no projection shape)
R = (positionWS + dist * R) - lightData.positionWS;
R = (positionWS + projectionDistance * R) - lightData.positionWS;
dist = SphereRayIntersectSimple(positionLS, dirLS, sphereOuterDistance);
coatR = (positionWS + dist * coatR) - lightData.positionWS;
projectionDistance = SphereRayIntersectSimple(positionLS, dirLS, sphereOuterDistance);
coatR = (positionWS + projectionDistance * coatR) - lightData.positionWS;
// 2. Process the influence
float distFade = max(length(positionLS) - lightData.innerDistance.x, 0.0);
weight = saturate(1.0 - distFade / max(lightData.blendDistance, 0.0001)); // avoid divide by zero
// 2. Process the position influence
float lengthPositionLS = length(positionLS);
float sphereInfluenceDistance = lightData.influenceExtents.x - lightData.blendDistancePositive.x;
float distFade = max(lengthPositionLS - sphereInfluenceDistance, 0.0);
float alpha = saturate(1.0 - distFade / max(lightData.blendDistancePositive.x, 0.0001)); // avoid divide by zero
#if defined(ENVMAP_FEATURE_INFLUENCENORMAL)
// 3. Process the normal influence
float insideInfluenceNormalVolume = lengthPositionLS <= (lightData.influenceExtents.x - lightData.blendNormalDistancePositive.x) ? 1.0 : 0.0;
float insideWeight = InfluenceFadeNormalWeight(bsdfData.normalWS, normalize(positionWS - lightData.positionWS));
alpha *= insideInfluenceNormalVolume ? 1.0 : insideWeight;
#endif
weight = alpha;
// 1. First process the projection
float3 boxOuterDistance = lightData.innerDistance + float3(lightData.blendDistance, lightData.blendDistance, lightData.blendDistance);
float dist = BoxRayIntersectSimple(positionLS, dirLS, -boxOuterDistance, boxOuterDistance);
dist = max(dist, lightData.minProjectionDistance); // Setup projection to infinite if requested (mean no projection shape)
float3 boxOuterDistance = lightData.influenceExtents;
float projectionDistance = BoxRayIntersectSimple(positionLS, dirLS, -boxOuterDistance, boxOuterDistance);
projectionDistance = max(projectionDistance, lightData.minProjectionDistance); // Setup projection to infinite if requested (mean no projection shape)
R = (positionWS + dist * R) - lightData.positionWS;
R = (positionWS + projectionDistance * R) - lightData.positionWS;
// TODO: add distance based roughness

dirLS = mul(coatR, worldToLocal);
dist = BoxRayIntersectSimple(positionLS, dirLS, -boxOuterDistance, boxOuterDistance);
coatR = (positionWS + dist * coatR) - lightData.positionWS;
projectionDistance = BoxRayIntersectSimple(positionLS, dirLS, -boxOuterDistance, boxOuterDistance);
coatR = (positionWS + projectionDistance * coatR) - lightData.positionWS;
// Influence volume
// 2. Process the position influence
float distFade = DistancePointBox(positionLS, -lightData.innerDistance, lightData.innerDistance);
weight = saturate(1.0 - distFade / max(lightData.blendDistance, 0.0001)); // avoid divide by zero
#if defined(ENVMAP_FEATURE_PERFACEINFLUENCE) || defined(ENVMAP_FEATURE_INFLUENCENORMAL) || defined(ENVMAP_FEATURE_PERFACEFADE)
// Distance to each cube face
float3 negativeDistance = boxOuterDistance + positionLS;
float3 positiveDistance = boxOuterDistance - positionLS;
#endif
#if defined(ENVMAP_FEATURE_PERFACEINFLUENCE)
// Influence falloff for each face
float3 negativeFalloff = negativeDistance / max(0.0001, lightData.blendDistanceNegative);
float3 positiveFalloff = positiveDistance / max(0.0001, lightData.blendDistancePositive);
// Fallof is the min for all faces
float influenceFalloff = min(
min(min(negativeFalloff.x, negativeFalloff.y), negativeFalloff.z),
min(min(positiveFalloff.x, positiveFalloff.y), positiveFalloff.z));
float alpha = saturate(influenceFalloff);
#else
float distFace = DistancePointBox(positionLS, -lightData.influenceExtents + lightData.blendDistancePositive.x, lightData.influenceExtents - lightData.blendDistancePositive.x);
float alpha = saturate(1.0 - distFace / max(lightData.blendDistancePositive.x, 0.0001));
#endif
#if defined(ENVMAP_FEATURE_INFLUENCENORMAL)
// 3. Process the normal influence
// Calculate a falloff value to discard normals pointing outward the center of the environment light
float3 belowPositiveInfluenceNormalVolume = positiveDistance / max(0.0001, lightData.blendNormalDistancePositive);
float3 aboveNegativeInfluenceNormalVolume = negativeDistance / max(0.0001, lightData.blendNormalDistanceNegative);
float insideInfluenceNormalVolume = all(belowPositiveInfluenceNormalVolume >= 1.0) && all(aboveNegativeInfluenceNormalVolume >= 1.0) ? 1.0 : 0;
float insideWeight = InfluenceFadeNormalWeight(bsdfData.normalWS, normalize(positionWS - lightData.positionWS));
alpha *= insideInfluenceNormalVolume ? 1.0 : insideWeight;
#endif
#if defined(ENVMAP_FEATURE_PERFACEFADE)
// 4. Fade specific cubemap faces
// For each axes (both positive and negative ones), we want to fade from the center of one face to another
// So we normalized the sample direction (R) and use its component to fade for each axis
// We consider R.x as cos(X) and then fade as angle from 60°(=acos(1/2)) to 75°(=acos(1/4))
// For positive axes: axisFade = (R - 1/4) / (1/2 - 1/4)
// <=> axisFace = 4 * R - 1;
R = normalize(R);
float3 faceFade = saturate((4 * R - 1) * lightData.boxSideFadePositive) + saturate((-4 * R - 1) * lightData.boxSideFadeNegative);
alpha *= saturate(faceFade.x + faceFade.y + faceFade.z);
#endif
weight = alpha;
}
// Smooth weighting

10
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Material/Lit/Lit.shader


[ToggleOff] _EnableBlendModePreserveSpecularLighting("Enable Blend Mode Preserve Specular Lighting", Float) = 1.0
[ToggleOff] _DoubleSidedEnable("Double sided enable", Float) = 0.0
[Enum(None, 0, Mirror, 1, Flip, 2)] _DoubleSidedNormalMode("Double sided normal mode", Float) = 1
[Enum(Flip, 0, Mirror, 1)] _DoubleSidedNormalMode("Double sided normal mode", Float) = 1
[HideInInspector] _DoubleSidedConstants("_DoubleSidedConstants", Vector) = (1, 1, -1, 0)
[Enum(UV0, 0, Planar, 4, TriPlanar, 5)] _UVBase("UV Set for base", Float) = 0

SubShader
{
// Caution: The outline selection in the editor use the vertex shader/hull/domain shader of the first pass declare. So it should not bethe meta pass.
Pass
{
Name "GBuffer" // Name is not used

ENDHLSL
}
// Caution: Order of pass mater. It should be:
// TransparentDepthPrepass, TransparentBackface, Forward/ForwardOnly, TransparentDepthPostpass
Pass
{
Name "TransparentDepthPrepass"

ENDHLSL
}
// Caution: Order is important: TransparentBackface, then Forward/ForwardOnly
Pass
{
Name "TransparentBackface"

Pass
{
Name "TransparentDepthPostPass"
Tags { "LightMode" = "TransparentDepthPostPass" }
Name "TransparentDepthPostpass"
Tags { "LightMode" = "TransparentDepthPostpass" }
Cull[_CullMode]
ZWrite On

19
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Material/Lit/LitDataMeshModification.hlsl


input.uv3,
#else
float2(0.0, 0.0),
#endif
#endif
#endif
#endif
#ifdef _VERTEX_WIND
float3 rootWP = mul(GetObjectToWorldMatrix(), float4(0, 0, 0, 1)).xyz;
ApplyWindDisplacement(positionWS, normalWS, rootWP, _Stiffness, _Drag, _ShiverDrag, _ShiverDirectionality, _InitialBend, input.color.a, time);

// For tessellation we want to process tessellation factor always from the point of view of the camera (to be consistent and avoid Z-fight).
// For the culling part however we want to use the current view (shadow view).
// Thus the following code play with both.
float frustumEps = -maxDisplacement;
float frustumEps = -maxDisplacement; // "-" Expected parameter for CullTriangleEdgesFrustum
// TODO: the only reason I test the near plane here is that I am not sure that the product of other tessellation factors
// (such as screen-space/distance-based) results in the tessellation factor of 1 for the geometry behind the near plane.
// If that is the case (and, IMHO, it should be), we shouldn't have to test the near plane here.

if (_TessellationBackFaceCullEpsilon > -1.0) // Is back-face culling enabled ?
{
// Handle transform mirroring (like negative scaling)
// Note: We don't need to handle handness of view matrix here as the backface is perform in worldspace
// note2: When we have an orthogonal matrix (cascade shadow map), we need to use the direction of the light.
// Otherwise we use only p0 instead of the mean of P0, p1,p2 to save ALU as with tessellated geomerty it is rarely needed and user can still control _TessellationBackFaceCullEpsilon.
faceCull = CullTriangleBackFace(p0, p1, p2, _TessellationBackFaceCullEpsilon, GetCurrentViewPosition(), winding); // Use shadow view
faceCull = CullTriangleBackFaceView(p0, p1, p2, _TessellationBackFaceCullEpsilon, GetWorldSpaceNormalizeViewDir(p0), winding); // Use shadow view
}
#endif

input.texCoord3,
#else
float2(0.0, 0.0),
#endif
#endif
#endif
#endif
);
#endif // _TESSELLATION_DISPLACEMENT
}

12
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Material/Lit/LitTessellation.shader


[ToggleOff] _EnableBlendModePreserveSpecularLighting("Enable Blend Mode Preserve Specular Lighting", Float) = 1.0
[ToggleOff] _DoubleSidedEnable("Double sided enable", Float) = 0.0
[Enum(None, 0, Mirror, 1, Flip, 2)] _DoubleSidedNormalMode("Double sided normal mode", Float) = 1
[Enum(Flip, 0, Mirror, 1)] _DoubleSidedNormalMode("Double sided normal mode", Float) = 1
[HideInInspector] _DoubleSidedConstants("_DoubleSidedConstants", Vector) = (1, 1, -1, 0)
[Enum(UV0, 0, Planar, 4, TriPlanar, 5)] _UVBase("UV Set for base", Float) = 0

[Enum(Subsurface Scattering, 0, Standard, 1, Anisotropy, 2, ClearCoat, 3, Specular Color, 4)] _MaterialID("MaterialId", Int) = 1 // MaterialId.RegularLighting
[Enum(None, 0, Vertex displacement, 1, Pixel displacement, 2, Tessellation displacement, 3)] _DisplacementMode("DisplacementMode", Int) = 0
[Enum(None, 0, Tessellation displacement, 3)] _DisplacementMode("DisplacementMode", Int) = 3
[ToggleOff] _DisplacementLockObjectScale("displacement lock object scale", Float) = 1.0
[ToggleOff] _DisplacementLockTilingScale("displacement lock tiling scale", Float) = 1.0
[ToggleOff] _DepthOffsetEnable("Depth Offset View space", Float) = 0.0

SubShader
{
// Caution: The outline selection in the editor use the vertex shader/hull/domain shader of the first pass declare. So it should not bethe meta pass.
Pass
{
Name "GBuffer" // Name is not used

ENDHLSL
}
// Caution: Order of pass mater. It should be:
// TransparentDepthPrepass, TransparentBackface, Forward/ForwardOnly, TransparentDepthPostpass
Pass
{
Name "TransparentDepthPrepass"

ENDHLSL
}
// Caution: Order is important: TransparentBackface, then Forward/ForwardOnly
Pass
{
Name "TransparentBackface"

Pass
{
Name "TransparentDepthPostPass"
Tags { "LightMode" = "TransparentDepthPostPass" }
Name "TransparentDepthPostpass"
Tags { "LightMode" = "TransparentDepthPostpass" }
Cull[_CullMode]
ZWrite On

92
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Material/Unlit/Unlit.shader


SubShader
{
// Extracts information for lightmapping, GI (emission, albedo, ...)
// This pass it not used during regular rendering.
Pass
{
Name "META"
Tags{ "LightMode" = "Meta" }
Cull Off
HLSLPROGRAM
// Lightmap memo
// DYNAMICLIGHTMAP_ON is used when we have an "enlighten lightmap" ie a lightmap updated at runtime by enlighten.This lightmap contain indirect lighting from realtime lights and realtime emissive material.Offline baked lighting(from baked material / light,
// both direct and indirect lighting) will hand up in the "regular" lightmap->LIGHTMAP_ON.
#define SHADERPASS SHADERPASS_LIGHT_TRANSPORT
#include "../../Material/Material.hlsl"
#include "ShaderPass/UnlitSharePass.hlsl"
#include "UnlitData.hlsl"
#include "../../ShaderPass/ShaderPassLightTransport.hlsl"
ENDHLSL
}
Pass
{
Name "Distortion" // Name is not used
Tags { "LightMode" = "DistortionVectors" } // This will be only for transparent object based on the RenderQueue index
Blend [_DistortionSrcBlend] [_DistortionDstBlend], [_DistortionBlurSrcBlend] [_DistortionBlurDstBlend]
BlendOp Add, [_DistortionBlurBlendOp]
ZTest [_ZTestMode]
ZWrite off
Cull [_CullMode]
HLSLPROGRAM
#define SHADERPASS SHADERPASS_DISTORTION
#include "../../Material/Material.hlsl"
#include "ShaderPass/UnlitDistortionPass.hlsl"
#include "UnlitData.hlsl"
#include "../../ShaderPass/ShaderPassDistortion.hlsl"
ENDHLSL
}
// Caution: The outline selection in the editor use the vertex shader/hull/domain shader of the first pass declare. So it should not bethe meta pass.
// Unlit shader always render in forward
Pass

#include "ShaderPass/UnlitSharePass.hlsl"
#include "UnlitData.hlsl"
#include "../../ShaderPass/ShaderPassForwardUnlit.hlsl"
ENDHLSL
}
// Extracts information for lightmapping, GI (emission, albedo, ...)
// This pass it not used during regular rendering.
Pass
{
Name "META"
Tags{ "LightMode" = "Meta" }
Cull Off
HLSLPROGRAM
// Lightmap memo
// DYNAMICLIGHTMAP_ON is used when we have an "enlighten lightmap" ie a lightmap updated at runtime by enlighten.This lightmap contain indirect lighting from realtime lights and realtime emissive material.Offline baked lighting(from baked material / light,
// both direct and indirect lighting) will hand up in the "regular" lightmap->LIGHTMAP_ON.
#define SHADERPASS SHADERPASS_LIGHT_TRANSPORT
#include "../../Material/Material.hlsl"
#include "ShaderPass/UnlitSharePass.hlsl"
#include "UnlitData.hlsl"
#include "../../ShaderPass/ShaderPassLightTransport.hlsl"
ENDHLSL
}
Pass
{
Name "Distortion" // Name is not used
Tags { "LightMode" = "DistortionVectors" } // This will be only for transparent object based on the RenderQueue index
Blend [_DistortionSrcBlend] [_DistortionDstBlend], [_DistortionBlurSrcBlend] [_DistortionBlurDstBlend]
BlendOp Add, [_DistortionBlurBlendOp]
ZTest [_ZTestMode]
ZWrite off
Cull [_CullMode]
HLSLPROGRAM
#define SHADERPASS SHADERPASS_DISTORTION
#include "../../Material/Material.hlsl"
#include "ShaderPass/UnlitDistortionPass.hlsl"
#include "UnlitData.hlsl"
#include "../../ShaderPass/ShaderPassDistortion.hlsl"
ENDHLSL
}

18
ScriptableRenderPipeline/HDRenderPipeline/HDRP/RenderPipeline/FrameSettings.cs


public static string kEnableSSSAndTransmission = "Enable SSS and Transmission";
public static string kForwardOnly = "Forward Only";
public static string kDeferredDepthPrePass = "Deferred Depth Prepass";
public static string kDeferredDepthPrepass = "Deferred Depth Prepass";
public static string kDeferredDepthPrepassATestOnly = "Deferred Depth Prepass ATest Only";
public static string KEnableTransparentPrepass = "Enable Transparent Prepass";

public bool enableDepthPrepassWithDeferredRendering = false;
public bool enableAlphaTestOnlyInDeferredPrepass = false;
public bool enableTransparentPrePass = true;
public bool enableTransparentPrepass = true;
public bool enableTransparentPostPass = true;
public bool enableTransparentPostpass = true;
public bool enableDistortion = true;
public bool enablePostprocess = true;

frameSettings.enableDepthPrepassWithDeferredRendering = this.enableDepthPrepassWithDeferredRendering;
frameSettings.enableAlphaTestOnlyInDeferredPrepass = this.enableAlphaTestOnlyInDeferredPrepass;
frameSettings.enableTransparentPrePass = this.enableTransparentPrePass;
frameSettings.enableTransparentPrepass = this.enableTransparentPrepass;
frameSettings.enableTransparentPostPass = this.enableTransparentPostPass;
frameSettings.enableTransparentPostpass = this.enableTransparentPostpass;
frameSettings.enableDistortion = this.enableDistortion;
frameSettings.enablePostprocess = this.enablePostprocess;

aggregate.enableDepthPrepassWithDeferredRendering = frameSettings.enableDepthPrepassWithDeferredRendering;
aggregate.enableAlphaTestOnlyInDeferredPrepass = frameSettings.enableAlphaTestOnlyInDeferredPrepass;
aggregate.enableTransparentPrePass = frameSettings.enableTransparentPrePass;
aggregate.enableTransparentPrepass = frameSettings.enableTransparentPrepass;
aggregate.enableTransparentPostPass = frameSettings.enableTransparentPostPass;
aggregate.enableTransparentPostpass = frameSettings.enableTransparentPostpass;
aggregate.enableDistortion = camera.cameraType == CameraType.Reflection ? false : frameSettings.enableDistortion;
// Planar and real time cubemap doesn't need post process and render in FP16

DebugMenuManager.instance.AddDebugItem<bool>(menuName, kDeferredDepthPrepassATestOnly, () => frameSettings.enableDepthPrepassWithDeferredRendering, (value) => frameSettings.enableDepthPrepassWithDeferredRendering = (bool)value);
DebugMenuManager.instance.AddDebugItem<bool>(menuName, KEnableTransparentPrepass, () => frameSettings.enableAlphaTestOnlyInDeferredPrepass, (value) => frameSettings.enableAlphaTestOnlyInDeferredPrepass = (bool)value);
DebugMenuManager.instance.AddDebugItem<bool>(menuName, KEnableTransparentPrepass, () => frameSettings.enableTransparentPrePass, (value) => frameSettings.enableTransparentPrePass = (bool)value);
DebugMenuManager.instance.AddDebugItem<bool>(menuName, KEnableTransparentPrepass, () => frameSettings.enableTransparentPrepass, (value) => frameSettings.enableTransparentPrepass = (bool)value);
DebugMenuManager.instance.AddDebugItem<bool>(menuName, kEnableTransparentPostpass, () => frameSettings.enableTransparentPostPass, (value) => frameSettings.enableTransparentPostPass = (bool)value);
DebugMenuManager.instance.AddDebugItem<bool>(menuName, kEnableTransparentPostpass, () => frameSettings.enableTransparentPostpass, (value) => frameSettings.enableTransparentPostpass = (bool)value);
DebugMenuManager.instance.AddDebugItem<bool>(menuName, kEnableDistortion, () => frameSettings.enableDistortion, (value) => frameSettings.enableDistortion = (bool)value);
DebugMenuManager.instance.AddDebugItem<bool>(menuName, kEnablePostprocess, () => frameSettings.enablePostprocess, (value) => frameSettings.enablePostprocess = (bool)value);

16
ScriptableRenderPipeline/HDRenderPipeline/HDRP/RenderPipelineResources/DepthDownsample.compute


// Downsample the block
float2 offset = float2(threadUL) * 2.0f + 1.0f;
float4 depths = _Source.GatherRed(sampler_PointClamp, offset * _SrcSize.zw, 0.0);
#if defined(PLATFORM_SUPPORT_GATHER)
float4 depths = GATHER_RED_TEXTURE2D(_Source, sampler_PointClamp, offset * _SrcSize.zw, 0.0);
#else
// Downsample the block
float p00 = SAMPLE_TEXTURE2D_LOD(_Source, sampler_PointClamp, (offset) * _SrcSize.zw, 0.0).x;
float p10 = SAMPLE_TEXTURE2D_LOD(_Source, sampler_PointClamp, (offset + float2(1.0, 0.0)) * _SrcSize.zw, 0.0).x;
float p01 = SAMPLE_TEXTURE2D_LOD(_Source, sampler_PointClamp, (offset + float2(0.0, 1.0)) * _SrcSize.zw, 0.0).x;
float p11 = SAMPLE_TEXTURE2D_LOD(_Source, sampler_PointClamp, (offset + float2(1.0, 1.0)) * _SrcSize.zw, 0.0).x;
float4 depths = float4(p00, p10, p01, p11);
#endif
// Select the nearest sample
#if UNITY_REVERSED_Z
float minDepth = max(min(depths.x, depths.y), max(depths.z, depths.w));
#else
#endif
// Write to the final target
_Result[dispatchThreadId] = minDepth;

3
ScriptableRenderPipeline/HDRenderPipeline/HDRP/RenderPipelineResources/HDRenderPipelineResources.asset


m_Script: {fileID: 11500000, guid: 8b6f86e1523e69a4282e92d393be89a4, type: 3}
m_Name: HDRenderPipelineResources
m_EditorClassIdentifier:
defaultDiffuseMaterial: {fileID: 2100000, guid: 73c176f402d2c2f4d929aa5da7585d17,
type: 2}
defaultShader: {fileID: 4800000, guid: 6e4ae4064600d784cac1e41a9e6f2e59, type: 3}
debugDisplayLatlongShader: {fileID: 4800000, guid: c1d1d149a043a5349ba367da6c2051ba,
type: 3}
debugViewMaterialGBufferShader: {fileID: 4800000, guid: 439949ea1bfa91b4ba0d04269fcde33d,

4
ScriptableRenderPipeline/HDRenderPipeline/HDRP/RenderPipelineResources/RenderPipelineResources.cs


{
public class RenderPipelineResources : ScriptableObject
{
// Default Material / Shader
public Material defaultDiffuseMaterial;
public Shader defaultShader;
// Debug
public Shader debugDisplayLatlongShader;
public Shader debugViewMaterialGBufferShader;

5
ScriptableRenderPipeline/HDRenderPipeline/HDRP/ShaderPass/VaryingMesh.hlsl


#ifdef VARYINGS_NEED_TANGENT_TO_WORLD
float4 tangentWS = float4(input.interpolators2.xyz, input.interpolators2.w > 0.0 ? 1.0 : -1.0); // must not be normalized (mikkts requirement)
// Normalize normalWS vector but keep the renormFactor to apply it to bitangent and tangent
float3 unnormalizedNormalWS = input.interpolators1.xyz;
float renormFactor = 1.0 / length(unnormalizedNormalWS);

#if defined(VARYINGS_NEED_CULLFACE) && SHADER_STAGE_FRAGMENT
output.isFrontFace = IS_FRONT_VFACE(input.cullFace, true, false);
// Handle handness of the view matrix (In Unity view matrix default to a determinant of -1)
// when we render a cubemap the view matrix handness is flipped (due to convention used for cubemap) we have a determinant of +1
output.isFrontFace = _ViewParam.x < 0.0 ? output.isFrontFace : !output.isFrontFace;
#endif
return output;

1
ScriptableRenderPipeline/HDRenderPipeline/HDRP/ShaderVariables.hlsl


float4x4 _InvViewProjMatrix;
float4x4 _InvViewMatrix;
float4x4 _InvProjMatrix;
float4 _ViewParam; // .x = ViewMatrix determinant
float4 _InvProjParam;
float4 _ScreenSize; // {w, h, 1/w, 1/h}
float4 _FrustumPlanes[6]; // {(a, b, c) = N, d = -dot(N, P)} [L, R, T, B, N, F]

16
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/AtmosphericScattering/AtmosphericScattering.cs


Exponential
}
[GenerateHLSL]
public enum FogColorMode
{
ConstantColor,
SkyColor,
}
[Serializable]
public sealed class FogTypeParameter : VolumeParameter<FogType>
{

}
}
[GenerateHLSL]
public enum FogColorMode
{
ConstantColor,
SkyColor,
}
}
}

4
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/AtmosphericScattering/AtmosphericScattering.cs.hlsl


#ifndef ATMOSPHERICSCATTERING_CS_HLSL
#define ATMOSPHERICSCATTERING_CS_HLSL
//
// UnityEngine.Experimental.Rendering.HDPipeline.AtmosphericScatteringSettings+FogType: static fields
// UnityEngine.Experimental.Rendering.HDPipeline.FogType: static fields
//
#define FOGTYPE_NONE (0)
#define FOGTYPE_LINEAR (1)

// UnityEngine.Experimental.Rendering.HDPipeline.AtmosphericScatteringSettings+FogColorMode: static fields
// UnityEngine.Experimental.Rendering.HDPipeline.FogColorMode: static fields
//
#define FOGCOLORMODE_CONSTANT_COLOR (0)
#define FOGCOLORMODE_SKY_COLOR (1)

4
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/HDRISky/HDRISky.cs


namespace UnityEngine.Experimental.Rendering.HDPipeline
{
[DisallowMultipleComponent]
[SkyUniqueID((int)SkyType.HDRISky)]
public override SkyRenderer GetRenderer()
public override SkyRenderer CreateRenderer()
{
return new HDRISkyRenderer(this);
}

4
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/ProceduralSky/ProceduralSky.cs


namespace UnityEngine.Experimental.Rendering.HDPipeline
{
[DisallowMultipleComponent]
[SkyUniqueID((int)SkyType.ProceduralSky)]
public class ProceduralSky : SkySettings
{
public ClampedFloatParameter sunSize = new ClampedFloatParameter(0.04f, 0.0f, 1.0f);

public ColorParameter groundColor = new ColorParameter(new Color(0.369f, 0.349f, 0.341f, 1.0f));
public BoolParameter enableSunDisk = new BoolParameter(true);
public override SkyRenderer GetRenderer()
public override SkyRenderer CreateRenderer()
{
return new ProceduralSkyRenderer(this);
}

189
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/SkyManager.cs


using UnityEngine.Rendering;
using System;
using System;
using System.Linq;
using System.Reflection;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using UnityEngine.Rendering;
namespace UnityEngine.Experimental.Rendering.HDPipeline
{

Material m_BlitCubemapMaterial;
Material m_OpaqueAtmScatteringMaterial;
int m_LastFrameUpdated = -1;
bool m_UpdateRequired =false;
bool m_UpdateRequired = false;
bool m_NeedUpdateRealtimeEnv = false;
bool m_NeedUpdateBakingSky = false;

SkyRenderingContext m_VisualSky;
// This is optional and is used only to compute ambient probe and sky reflection for
SkyUpdateContext m_VisualSky = new SkyUpdateContext();
// This is optional and is used only to compute ambient probe and sky reflection
SkyRenderingContext m_LightingOverrideSky;
SkyUpdateContext m_LightingOverrideSky = new SkyUpdateContext();
SkyRenderingContext m_BakingSky;
SkyUpdateContext m_BakingSky = new SkyUpdateContext();
public Texture skyReflection
// The sky rendering contexts holds the render textures used by the sky system.
// We need to have a separate one for the baking sky because we have to keep it alive regardless of the visual/override sky (because it's set in the lighting panel skybox material).
SkyRenderingContext m_BakingSkyRenderingContext;
SkyRenderingContext m_SkyRenderingContext;
// This interpolation volume stack is used to interpolate the lighting override separately from the visual sky.
// If a sky setting is present in this volume then it will be used for lighting override.
VolumeStack m_LightingOverrideVolumeStack;
LayerMask m_LightingOverrideLayerMask = -1;
static Dictionary<int, Type> m_SkyTypesDict = null;
public static Dictionary<int, Type> skyTypesDict { get { if (m_SkyTypesDict == null) UpdateSkyTypes(); return m_SkyTypesDict; } }
public Texture skyReflection { get { return m_SkyRenderingContext.reflectionTexture; } }
SkySettings GetSkySetting(VolumeStack stack)
get
var visualEnv = stack.GetComponent<VisualEnvironment>();
int skyID = visualEnv.skyType;
Type skyType;
if(m_SkyTypesDict.TryGetValue(skyID, out skyType))
if (m_LightingOverrideSky.skySettings != null)
return m_LightingOverrideSky.reflectionTexture;
else
return m_VisualSky.reflectionTexture;
return (SkySettings)stack.GetComponent(skyType);
}
else
{
return null;
void UpdateCurrentSkySettings()
static void UpdateSkyTypes()
SkySettings newSkySettings = null;
var visualEnv = VolumeManager.instance.stack.GetComponent<VisualEnvironment>();
switch (visualEnv.skyType.value)
if(m_SkyTypesDict == null)
case SkyType.HDRISky:
m_SkyTypesDict = new Dictionary<int, Type>();
var skyTypes = CoreUtils.GetAllAssemblyTypes().Where(t => t.IsSubclassOf(typeof(SkySettings)) && !t.IsAbstract);
foreach(Type skyType in skyTypes)
{
var uniqueIDs = skyType.GetCustomAttributes(typeof(SkyUniqueID), false);
if(uniqueIDs.Length == 0)
newSkySettings = VolumeManager.instance.stack.GetComponent<HDRISky>();
break;
Debug.LogWarningFormat("Missing attribute SkyUniqueID on class {0}. Class won't be registered as an available sky.", skyType);
case SkyType.ProceduralSky:
else
newSkySettings = VolumeManager.instance.stack.GetComponent<ProceduralSky>();
break;
int uniqueID = ((SkyUniqueID)uniqueIDs[0]).uniqueID;
if(uniqueID == 0)
{
Debug.LogWarningFormat("0 is a reserved SkyUniqueID and is used in class {0}. Class won't be registered as an available sky.", skyType);
continue;
}
Type value;
if(m_SkyTypesDict.TryGetValue(uniqueID, out value))
{
Debug.LogWarningFormat("SkyUniqueID {0} used in class {1} is already used in class {2}. Class won't be registered as an available sky.", uniqueID, skyType, value);
continue;
}
m_SkyTypesDict.Add(uniqueID, skyType);
}
}
m_VisualSky.skySettings = newSkySettings;
void UpdateCurrentSkySettings(HDCamera camera)
{
m_VisualSky.skySettings = GetSkySetting(VolumeManager.instance.stack);
m_LightingOverrideSky.skySettings = null;
UpdateRenderData();
// Update needs to happen before testing if the component is active other internal data structure are not properly updated yet.
VolumeManager.instance.Update(m_LightingOverrideVolumeStack, camera.camera.transform, m_LightingOverrideLayerMask);
if(VolumeManager.instance.IsComponentActiveInMask<VisualEnvironment>(m_LightingOverrideLayerMask))
{
SkySettings newSkyOverride = GetSkySetting(m_LightingOverrideVolumeStack);
if(m_LightingOverrideSky.skySettings != null && newSkyOverride == null)
{
// When we switch from override to no override, we need to make sure that the visual sky will actually be properly re-rendered.
// Resetting the visual sky hash will ensure that.
m_VisualSky.skyParametersHash = -1;
}
m_LightingOverrideSky.skySettings = newSkyOverride;
}
else
{
m_LightingOverrideSky.skySettings = null;
}
}
// Sets the global MIP-mapped cubemap '_SkyTexture' in the shader.

cmd.SetGlobalFloat(HDShaderIDs._SkyTextureMipCount, mipCount);
}
public void UpdateRenderData()
{
m_BakingSky.RebuildTextures();
m_VisualSky.RebuildTextures();
m_LightingOverrideSky.RebuildTextures();
m_LastFrameUpdated = -1;
}
// For now, both these rendering context will allocate render textures
// In theory, when we have a lighting override we don't need any cubemaps from the visual sky so we could avoid allocating them
m_VisualSky = new SkyRenderingContext(true, iblFilterGGX);
m_LightingOverrideSky = new SkyRenderingContext(true, iblFilterGGX);
// Here we don't need convolution supports because this sky will never need to generate it (only sky cubemap for GI system)
m_BakingSky = new SkyRenderingContext(false, iblFilterGGX);
m_BakingSkyRenderingContext = new SkyRenderingContext(iblFilterGGX, (int)hdAsset.renderPipelineSettings.lightLoopSettings.skyReflectionSize, false);
m_SkyRenderingContext = new SkyRenderingContext(iblFilterGGX, (int)hdAsset.renderPipelineSettings.lightLoopSettings.skyReflectionSize, true);
m_LightingOverrideVolumeStack = VolumeManager.instance.CreateStack();
m_LightingOverrideLayerMask = hdAsset.renderPipelineSettings.lightLoopSettings.skyLightingOverrideLayerMask;
}
public void Cleanup()

m_BakingSky.Cleanup();
m_VisualSky.Cleanup();
m_LightingOverrideSky.Cleanup();
m_BakingSkyRenderingContext.Cleanup();
m_SkyRenderingContext.Cleanup();
return m_VisualSky.IsValid();
return m_VisualSky.IsValid() || m_LightingOverrideSky.IsValid();
}

if (Shader.GetGlobalTexture(HDShaderIDs._SkyTexture) == null)
cmd.SetGlobalTexture(HDShaderIDs._SkyTexture, CoreUtils.magentaCubeTexture);
if (m_LastFrameUpdated == Time.frameCount)
return;
if (m_NeedUpdateBakingSky)
// Testing the current skybox material is because we have to make sure that additive scene loading or even some user script haven't altered it.
if (m_NeedUpdateBakingSky || (RenderSettings.skybox != m_StandardSkyboxMaterial))
m_StandardSkyboxMaterial.SetTexture("_Tex", m_BakingSky.cubemapRT);
RenderSettings.skybox = m_StandardSkyboxMaterial; // Setup this material as the default to be use in RenderSettings
RenderSettings.ambientIntensity = intensity;
RenderSettings.ambientMode = AmbientMode.Skybox; // Force skybox for our HDRI
RenderSettings.reflectionIntensity = intensity;
RenderSettings.customReflection = null;
m_StandardSkyboxMaterial.SetTexture("_Tex", m_BakingSkyRenderingContext.cubemapRT);
RenderSettings.skybox = m_StandardSkyboxMaterial; // Setup this material as the default to be use in RenderSettings
RenderSettings.ambientIntensity = intensity;
RenderSettings.ambientMode = AmbientMode.Skybox; // Force skybox for our HDRI
RenderSettings.reflectionIntensity = intensity;
RenderSettings.customReflection = null;
DynamicGI.UpdateEnvironment();
DynamicGI.UpdateEnvironment();
m_NeedUpdateBakingSky = false;
m_NeedUpdateBakingSky = false;
// Moreover we still need Async readback from texture in command buffers first.
UpdateCurrentSkySettings();
UpdateSkyTypes();
UpdateCurrentSkySettings(camera);
m_NeedUpdateBakingSky = m_BakingSky.UpdateEnvironment(camera, sunLight, m_UpdateRequired, cmd);
if (m_LightingOverrideSky.IsValid())
{
m_NeedUpdateRealtimeEnv = m_LightingOverrideSky.UpdateEnvironment(camera, sunLight, m_UpdateRequired, cmd);
}
else
{
m_NeedUpdateRealtimeEnv = m_VisualSky.UpdateEnvironment(camera, sunLight, m_UpdateRequired, cmd);
}
m_NeedUpdateBakingSky = m_BakingSkyRenderingContext.UpdateEnvironment(m_BakingSky, camera, sunLight, m_UpdateRequired, cmd);
SkyUpdateContext currentSky = m_LightingOverrideSky.IsValid() ? m_LightingOverrideSky : m_VisualSky;
m_NeedUpdateRealtimeEnv = m_SkyRenderingContext.UpdateEnvironment(currentSky, camera, sunLight, m_UpdateRequired, cmd);
m_LastFrameUpdated = Time.frameCount;
SetGlobalSkyTexture(cmd);
if (IsSkyValid())

public void RenderSky(HDCamera camera, Light sunLight, RenderTargetIdentifier colorBuffer, RenderTargetIdentifier depthBuffer, CommandBuffer cmd)
{
m_VisualSky.RenderSky(camera, sunLight, colorBuffer, depthBuffer, cmd);
m_SkyRenderingContext.RenderSky(m_VisualSky, camera, sunLight, colorBuffer, depthBuffer, cmd);
}
public void RenderOpaqueAtmosphericScattering(CommandBuffer cmd)

return null;
}
int resolution = (int)m_VisualSky.skySettings.resolution.value;
RenderTexture skyCubemap = m_SkyRenderingContext.cubemapRT;
int resolution = skyCubemap.width;
var tempRT = new RenderTexture(resolution * 6, resolution, 0, RenderTextureFormat.ARGBHalf, RenderTextureReadWrite.Linear)
{

int offset = 0;
for (int i = 0; i < 6; ++i)
{
UnityEngine.Graphics.SetRenderTarget(m_VisualSky.cubemapRT, 0, (CubemapFace)i);
UnityEngine.Graphics.SetRenderTarget(skyCubemap, 0, (CubemapFace)i);
temp.ReadPixels(new Rect(0, 0, resolution, resolution), offset, 0);
temp.Apply();
offset += resolution;

134
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/SkyRenderingContext.cs


{
internal class SkyRenderingContext
{
SkySettings m_SkySettings;
SkyRenderer m_Renderer;
RenderTexture m_SkyboxCubemapRT;
RenderTexture m_SkyboxGGXCubemapRT;
RenderTexture m_SkyboxMarginalRowCdfRT;

Matrix4x4[] m_faceCameraInvViewProjectionMatrix = new Matrix4x4[6];
bool m_SupportsConvolution = false;
bool m_SupportsMIS = false;
int m_SkyParametersHash = -1;
float m_CurrentUpdateTime = 0.0f;
int m_UpdatedFramesRequired = 1; // The first frame after the scene load is currently not rendered correctly
bool m_SupportsConvolution = false;
bool m_NeedUpdate = true;
public SkySettings skySettings
{
get { return m_SkySettings; }
set
{
if (m_SkySettings == value)
return;
if (m_Renderer != null)
{
m_Renderer.Cleanup();
m_Renderer = null;
}
m_SkyParametersHash = -1;
m_SkySettings = value;
m_UpdatedFramesRequired = 1;
if (value != null)
{
m_Renderer = value.GetRenderer();
m_Renderer.Build();
}
}
}
public SkyRenderer renderer { get { return m_Renderer; } }
public SkyRenderingContext(bool supportsConvolution, IBLFilterGGX filterGGX)
public SkyRenderingContext(IBLFilterGGX filterGGX, int resolution, bool supportsConvolution)
m_SupportsConvolution = supportsConvolution;
m_SupportsConvolution = supportsConvolution;
RebuildTextures(resolution);
public void RebuildTextures()
public void RebuildTextures(int resolution)
int resolution = 256;
bool useMIS = false;
// Parameters not set yet. We need them for the resolution.
if (skySettings != null)
{
resolution = (int)skySettings.resolution.value;
useMIS = skySettings.useMIS;
}
if(updateNeeded)
if (updateNeeded)
{
CoreUtils.Destroy(m_SkyboxCubemapRT);
CoreUtils.Destroy(m_SkyboxGGXCubemapRT);

}
if (!useMIS && (m_SkyboxConditionalCdfRT != null))
if (!m_SupportsMIS && (m_SkyboxConditionalCdfRT != null))
{
CoreUtils.Destroy(m_SkyboxConditionalCdfRT);
CoreUtils.Destroy(m_SkyboxMarginalRowCdfRT);

{
m_SkyboxCubemapRT = new RenderTexture(resolution, resolution, 0, RenderTextureFormat.ARGBHalf, RenderTextureReadWrite.Linear)
{
hideFlags = HideFlags.DontSave,
dimension = TextureDimension.Cube,
useMipMap = true,
autoGenerateMips = false, // We will generate regular mipmap for filtered importance sampling manually

{
m_SkyboxGGXCubemapRT = new RenderTexture(resolution, resolution, 0, RenderTextureFormat.ARGBHalf, RenderTextureReadWrite.Linear)
{
hideFlags = HideFlags.DontSave,
dimension = TextureDimension.Cube,
useMipMap = true,
autoGenerateMips = false,

}
if (useMIS && (m_SkyboxConditionalCdfRT == null))
if (m_SupportsMIS && (m_SkyboxConditionalCdfRT == null))
{
// Temporary, it should be dependent on the sky resolution
int width = (int)LightSamplingParameters.TextureWidth;

m_SkyboxMarginalRowCdfRT = new RenderTexture(height + 1, 1, 0, RenderTextureFormat.RFloat, RenderTextureReadWrite.Linear)
{
hideFlags = HideFlags.DontSave,
useMipMap = false,
autoGenerateMips = false,
enableRandomWrite = true,

// TODO: switch the format to R16 (once it's available) to save some bandwidth.
m_SkyboxConditionalCdfRT = new RenderTexture(width, height, 0, RenderTextureFormat.RFloat, RenderTextureReadWrite.Linear)
{
hideFlags = HideFlags.DontSave,
useMipMap = false,
autoGenerateMips = false,
enableRandomWrite = true,

m_CubemapScreenSize = new Vector4((float)resolution, (float)resolution, 1.0f / (float)resolution, 1.0f / (float)resolution);
if(updateNeeded)
if (updateNeeded)
m_UpdatedFramesRequired = 1; // Special case. Even if update mode is set to OnDemand, we need to regenerate the environment after destroying the texture.
m_NeedUpdate = true; // Special case. Even if update mode is set to OnDemand, we need to regenerate the environment after destroying the texture.
public void RebuildSkyMatrices(int resolution)
{

m_faceCameraInvViewProjectionMatrix[i] = HDUtils.GetViewProjectionMatrix(lookAt, cubeProj).inverse;
}
}
public bool IsValid()
{
return m_Renderer != null && m_Renderer.IsValid();
}
public void Cleanup()
{
CoreUtils.Destroy(m_SkyboxCubemapRT);

if (m_Renderer != null)
m_Renderer.Cleanup();
void RenderSkyToCubemap()
void RenderSkyToCubemap(SkyUpdateContext skyContext)
{
for (int i = 0; i < 6; ++i)
{

m_BuiltinParameters.depthBuffer = BuiltinSkyParameters.nullRT;
CoreUtils.SetRenderTarget(m_BuiltinParameters.commandBuffer, m_SkyboxCubemapRT, ClearFlag.None, 0, (CubemapFace)i);
m_Renderer.RenderSky(m_BuiltinParameters, true);
skyContext.renderer.RenderSky(m_BuiltinParameters, true);
}
// Generate mipmap for our cubemap

void RenderCubemapGGXConvolution()
void RenderCubemapGGXConvolution(SkyUpdateContext skyContext)
if (skySettings.useMIS)
if (skyContext.skySettings.useMIS && m_SupportsMIS)
m_IBLFilterGGX.FilterCubemapMIS(m_BuiltinParameters.commandBuffer, m_SkyboxCubemapRT, m_SkyboxGGXCubemapRT, m_SkyboxConditionalCdfRT, m_SkyboxMarginalRowCdfRT);
else
m_IBLFilterGGX.FilterCubemap(m_BuiltinParameters.commandBuffer, m_SkyboxCubemapRT, m_SkyboxGGXCubemapRT);

public bool UpdateEnvironment(HDCamera camera, Light sunLight, bool updateRequired, CommandBuffer cmd)
public bool UpdateEnvironment(SkyUpdateContext skyContext, HDCamera camera, Light sunLight, bool updateRequired, CommandBuffer cmd)
if (IsValid())
if (skyContext.IsValid())
m_CurrentUpdateTime += Time.deltaTime;
skyContext.currentUpdateTime += Time.deltaTime;
m_BuiltinParameters.commandBuffer = cmd;
m_BuiltinParameters.sunLight = sunLight;

int sunHash = 0;
if (sunLight != null)
sunHash = (sunLight.GetHashCode() * 23 + sunLight.transform.position.GetHashCode()) * 23 + sunLight.transform.rotation.GetHashCode();
int skyHash = sunHash * 23 + m_SkySettings.GetHashCode();
int skyHash = sunHash * 23 + skyContext.skySettings.GetHashCode();
bool forceUpdate = (updateRequired || m_UpdatedFramesRequired > 0);
bool forceUpdate = (updateRequired || skyContext.updatedFramesRequired > 0 || m_NeedUpdate);
(m_SkySettings.updateMode == EnvironementUpdateMode.OnChanged && skyHash != m_SkyParametersHash) ||
(m_SkySettings.updateMode == EnvironementUpdateMode.Realtime && m_CurrentUpdateTime > m_SkySettings.updatePeriod))
(skyContext.skySettings.updateMode == EnvironementUpdateMode.OnChanged && skyHash != skyContext.skyParametersHash) ||
(skyContext.skySettings.updateMode == EnvironementUpdateMode.Realtime && skyContext.currentUpdateTime > skyContext.skySettings.updatePeriod))
RenderSkyToCubemap();
RenderSkyToCubemap(skyContext);
if(m_SupportsConvolution)
if (m_SupportsConvolution)
RenderCubemapGGXConvolution();
RenderCubemapGGXConvolution(skyContext);
m_SkyParametersHash = skyHash;
m_CurrentUpdateTime = 0.0f;
m_UpdatedFramesRequired--;
skyContext.skyParametersHash = skyHash;
skyContext.currentUpdateTime = 0.0f;
skyContext.updatedFramesRequired--;
m_NeedUpdate = false;
#if UNITY_EDITOR
#if UNITY_EDITOR
m_SkyboxCubemapRT.imageContentsHash = new Hash128((uint)m_SkySettings.GetHashCode(), 0, 0, 0);
#endif
m_SkyboxCubemapRT.imageContentsHash = new Hash128((uint)skyContext.skySettings.GetHashCode(), 0, 0, 0);
#endif
if (m_SkyParametersHash != 0)
if (skyContext.skyParametersHash != 0)
if(m_SupportsConvolution)
if (m_SupportsConvolution)
m_SkyParametersHash = 0;
skyContext.skyParametersHash = 0;
result = true;
}
}

public void RenderSky(HDCamera camera, Light sunLight, RenderTargetIdentifier colorBuffer, RenderTargetIdentifier depthBuffer, CommandBuffer cmd)
public void RenderSky(SkyUpdateContext skyContext, HDCamera camera, Light sunLight, RenderTargetIdentifier colorBuffer, RenderTargetIdentifier depthBuffer, CommandBuffer cmd)
if (IsValid())
if (skyContext.IsValid())
{
using (new ProfilingSample(cmd, "Sky Pass"))
{

m_BuiltinParameters.colorBuffer = colorBuffer;
m_BuiltinParameters.depthBuffer = depthBuffer;
m_Renderer.SetRenderTargets(m_BuiltinParameters);
m_Renderer.RenderSky(m_BuiltinParameters, false);
skyContext.renderer.SetRenderTargets(m_BuiltinParameters);
skyContext.renderer.RenderSky(m_BuiltinParameters, false);
}
}
}

27
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/SkySettings.cs


namespace UnityEngine.Experimental.Rendering.HDPipeline
{
[Serializable]
public sealed class SkyResolutionParameter : VolumeParameter<SkyResolution>
// This class is used to associate a unique ID to a sky class.
// This is needed to be able to automatically register sky classes and avoid collisions and refactoring class names causing data compatibility issues.
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public sealed class SkyUniqueID : Attribute
public SkyResolutionParameter(SkyResolution val, bool overrideState = false)
: base(val, overrideState)
{
public readonly int uniqueID;
public SkyUniqueID(int uniqueID)
{
this.uniqueID = uniqueID;
}
}

public FloatParameter exposure = new FloatParameter(0.0f);
[Tooltip("Intensity multiplier for the sky.")]
public MinFloatParameter multiplier = new MinFloatParameter(1.0f, 0.0f);
[Tooltip("Resolution of the environment lighting generated from the sky.")]
public SkyResolutionParameter resolution = new SkyResolutionParameter(SkyResolution.SkyResolution256);
[Tooltip("Specify how the environment lighting should be updated.")]
public EnvUpdateParameter updateMode = new EnvUpdateParameter(EnvironementUpdateMode.OnChanged);
[Tooltip("If environment update is set to realtime, period in seconds at which it is updated (0.0 means every frame).")]

// TODO: Fixme once we switch to .Net 4.6+
//>>>
hash = hash * 23 + ((int)resolution.value).GetHashCode(); // Enum.GetHashCode generates garbage on .NET 3.5... Wtf !?
hash = hash * 23 + ((int)updateMode.value).GetHashCode();
//<<<

}
public static int GetUniqueID<T>()
{
var uniqueIDs = typeof(T).GetCustomAttributes(typeof(SkyUniqueID), false);
if (uniqueIDs.Length == 0)
return -1;
else
return ((SkyUniqueID)uniqueIDs[0]).uniqueID;
}
public abstract SkyRenderer GetRenderer();
public abstract SkyRenderer CreateRenderer();
}
}

26
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/VisualEnvironment.cs


namespace UnityEngine.Experimental.Rendering.HDPipeline
{
// This enum is just here to centralize UniqueID values for skies provided with HDRP
public enum SkyType
{
HDRISky = 1,
ProceduralSky = 2
}
public SkyTypeParameter skyType = new SkyTypeParameter(SkyType.None);
public IntParameter skyType = new IntParameter(0);
public FogTypeParameter fogType = new FogTypeParameter(FogType.None);
public void PushFogShaderParameters(CommandBuffer cmd, FrameSettings frameSettings)

break;
}
}
}
}
// TODO instead of hardcoding this, we need to generate the information from the existing sky currently implemented.
public enum SkyType
{
None,
HDRISky,
ProceduralSky
}
[Serializable]
public sealed class SkyTypeParameter : VolumeParameter<SkyType>
{
public SkyTypeParameter(SkyType value, bool overrideState = false)
: base(value, overrideState)
{
}
}
}

10
TestbedPipelines/OnTileDeferredPipeline/Shaders/UnityStandardForwardMobile.cginc


#define CUBEMAPFACE_NEGATIVE_Z 5
#if defined(SHADER_API_D3D11)
# include "ShaderLibrary/API/D3D11.hlsl"
# include "CoreRP/ShaderLibrary/API/D3D11.hlsl"
# include "ShaderLibrary/API/PSSL.hlsl"
# include "CoreRP/ShaderLibrary/API/PSSL.hlsl"
# include "ShaderLibrary/API/D3D11.hlsl"
# include "ShaderLibrary/API/D3D11_1.hlsl"
# include "CoreRP/ShaderLibrary/API/D3D11.hlsl"
# include "CoreRP/ShaderLibrary/API/D3D11_1.hlsl"
#include "ShaderLibrary/API/Validate.hlsl"
#include "CoreRP/ShaderLibrary/API/Validate.hlsl"
#include "../../Fptl/Shadow.hlsl"
struct VertexOutputForwardNew

536
Tests/GraphicsTests/RenderPipeline/HDRenderPipeline/Scenes/1xxx_Materials/1202_Lit_DoubleSideNormalMode.unity


--- !u!104 &2
RenderSettings:
m_ObjectHideFlags: 0
serializedVersion: 8
serializedVersion: 9
m_Fog: 0
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
m_FogMode: 3

m_ReflectionIntensity: 1
m_CustomReflection: {fileID: 0}
m_Sun: {fileID: 0}
m_IndirectSpecularColor: {r: 0.3661533, g: 0.3847445, b: 0.42534745, a: 1}
m_IndirectSpecularColor: {r: 0.36615217, g: 0.3847425, b: 0.4253455, a: 1}
m_UseRadianceAmbientProbe: 0
--- !u!157 &3
LightmapSettings:
m_ObjectHideFlags: 0

m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 1206394792}
- {fileID: 1463840387}
- {fileID: 1350281944}
m_Father: {fileID: 0}

v_Value: {x: 0, y: 0, z: 0, w: 0}
c_Value: {r: 0, g: 0, b: 0, a: 0}
i_Value_Max: 0
f_Value_Max: 2
f_Value_Max: 1
count: 3
count: 2
offset: 1.5
rotation: {x: 0, y: 0, z: 0}
scale: 1

m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 195823280}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: -1.5, y: 0, z: 0}
m_LocalPosition: {x: -1, y: 0, z: 0}
- {fileID: 1221386889}
- {fileID: 1969001307}
- {fileID: 552617596}
- {fileID: 1492725334}
- {fileID: 321102322}
m_Father: {fileID: 0}
m_RootOrder: 3
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}

m_Script: {fileID: 11500000, guid: c6c2871f720b2af4e9210febdac74517, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Version: 1
shadowResolution: 512
shadowDimmer: 1
shadowFadeDistance: 10000

affectSpecular: 1
lightTypeExtent: 0
spotLightShape: 0
shapeLength: 0.5
shapeHeight: 0.5
aspectRatio: 1
shapeRadius: 0
maxSmoothness: 1

m_Father: {fileID: 0}
m_RootOrder: 4
m_LocalEulerAnglesHint: {x: 0, y: -45, z: 0}
--- !u!21 &386129247
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_Name: DoubleSideNormalTest(Clone)(Clone)
m_Shader: {fileID: 4800000, guid: 6e4ae4064600d784cac1e41a9e6f2e59, type: 3}
m_ShaderKeywords: _BLENDMODE_PRESERVE_SPECULAR_LIGHTING _DOUBLESIDED_ON _NORMALMAP
_NORMALMAP_TANGENT_SPACE
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses:
- DistortionVectors
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _AnisotropyMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BaseColorMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BentNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _BentNormalMapOS:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DistortionVectorMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissiveColorMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _HeightMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MaskMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _NormalMap:
m_Texture: {fileID: 2800000, guid: 6c9639b085103f447815e2965a30810a, type: 3}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _NormalMapOS:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecularColorMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SubsurfaceRadiusMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _TangentMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _TangentMapOS:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ThicknessMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _TransmittanceColorMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _AORemapMax: 1
- _AORemapMin: 0
- _ATDistance: 1
- _AlbedoAffectEmissive: 0
- _AlphaCutoff: 0.5
- _AlphaCutoffEnable: 0
- _AlphaCutoffPostpass: 0.5
- _Anisotropy: 0
- _BlendMode: 0
- _CoatCoverage: 1
- _CoatIOR: 0.5
- _CullMode: 0
- _CullModeForward: 2
- _Cutoff: 0.5
- _DepthOffsetEnable: 0
- _DetailAlbedoScale: 1
- _DetailNormalScale: 1
- _DetailSmoothnessScale: 1
- _DisplacementLockObjectScale: 1
- _DisplacementLockTilingScale: 1
- _DisplacementMode: 0
- _DistortionBlendMode: 0
- _DistortionBlurBlendMode: 0
- _DistortionBlurDstBlend: 1
- _DistortionBlurRemapMax: 1
- _DistortionBlurRemapMin: 0
- _DistortionBlurScale: 1
- _DistortionBlurSrcBlend: 1
- _DistortionDepthTest: 0
- _DistortionDstBlend: 1
- _DistortionEnable: 0
- _DistortionScale: 1
- _DistortionSrcBlend: 1
- _DistortionVectorBias: -1
- _DistortionVectorScale: 2
- _DoubleSidedEnable: 1
- _DoubleSidedNormalMode: 2
- _Drag: 1
- _DstBlend: 0
- _EmissiveColorMode: 1
- _EmissiveIntensity: 0
- _EnableBlendModePreserveSpecularLighting: 1
- _EnableFogOnTransparent: 1
- _EnableSpecularOcclusion: 0
- _EnableWind: 0
- _HeightAmplitude: 0.02
- _HeightCenter: 0.5
- _HeightMax: 1
- _HeightMin: -1
- _IOR: 1
- _InitialBend: 1
- _InvTilingScale: 1
- _LinkDetailsWithBase: 1
- _MaterialID: 1
- _Metallic: 0
- _NormalMapSpace: 0
- _NormalScale: 1
- _PPDLodThreshold: 5
- _PPDMaxSamples: 15
- _PPDMinSamples: 5
- _PPDPrimitiveLength: 1
- _PPDPrimitiveWidth: 1
- _PreRefractionPass: 0
- _RefractionMode: 0
- _ShiverDirectionality: 0.5
- _ShiverDrag: 0.2
- _Smoothness: 0.5
- _SmoothnessRemapMax: 1
- _SmoothnessRemapMin: 0
- _SrcBlend: 1
- _StencilRef: 2
- _Stiffness: 1
- _SubsurfaceProfile: 0
- _SubsurfaceRadius: 1
- _SurfaceType: 0
- _TexWorldScale: 1
- _Thickness: 1
- _ThicknessMultiplier: 1
- _TransparentBackfaceEnable: 0
- _TransparentDepthPostpassEnable: 0
- _UVBase: 0
- _UVDetail: 0
- _ZTestMode: 8
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _DoubleSidedConstants: {r: -1, g: -1, b: -1, a: 0}
- _EmissionColor: {r: 1, g: 1, b: 1, a: 1}
- _EmissiveColor: {r: 0, g: 0, b: 0, a: 1}
- _InvPrimScale: {r: 1, g: 1, b: 0, a: 0}
- _SpecularColor: {r: 1, g: 1, b: 1, a: 1}
- _ThicknessRemap: {r: 0, g: 1, b: 0, a: 0}
- _TransmittanceColor: {r: 1, g: 1, b: 1, a: 1}
- _UVDetailsMappingMask: {r: 1, g: 0, b: 0, a: 0}
- _UVMappingMask: {r: 1, g: 0, b: 0, a: 0}
--- !u!1 &552617595
--- !u!1 &321102321
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}

- component: {fileID: 552617596}
- component: {fileID: 552617598}
- component: {fileID: 552617597}
- component: {fileID: 321102322}
- component: {fileID: 321102324}
- component: {fileID: 321102323}
m_Name: DoubleSidePlane__DoubleSidedNormalMode_2.00
m_Name: DoubleSidePlane__DoubleSidedNormalMode_1.00
--- !u!4 &552617596
--- !u!4 &321102322
m_GameObject: {fileID: 552617595}
m_GameObject: {fileID: 321102321}
m_LocalPosition: {x: 3, y: 0, z: 0}
m_LocalPosition: {x: 1.5, y: 0, z: 0}
m_RootOrder: 2
m_RootOrder: 1
--- !u!23 &552617597
--- !u!23 &321102323
m_GameObject: {fileID: 552617595}
m_GameObject: {fileID: 321102321}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1

m_ReflectionProbeUsage: 1
m_RenderingLayerMask: 4294967295
m_Materials:
- {fileID: 386129247}
- {fileID: 1222758656}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0

m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
--- !u!33 &552617598
--- !u!33 &321102324
m_GameObject: {fileID: 552617595}
m_GameObject: {fileID: 321102321}
m_Mesh: {fileID: 4300000, guid: 0661b78617a8d1f48adef7e6b4af05bd, type: 3}
--- !u!114 &649692730
MonoBehaviour:

fogType:
m_OverrideState: 1
m_Value: 0
--- !u!21 &1093412843
--- !u!21 &1222758656
Material:
serializedVersion: 6
m_ObjectHideFlags: 0

stringTagMap: {}
disabledShaderPasses:
- DistortionVectors
- TransparentDepthPrepass
- TransparentDepthPostpass
- TransparentBackface
- TransparentBackfaceDebugDisplay
- MOTIONVECTORS
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:

- _AlphaCutoff: 0.5
- _AlphaCutoffEnable: 0
- _AlphaCutoffPostpass: 0.5
- _AlphaCutoffPrepass: 0.5
- _CullModeForward: 2
- _CullModeForward: 0
- _Cutoff: 0.5
- _DepthOffsetEnable: 0
- _DetailAlbedoScale: 1

- _DistortionVectorBias: -1
- _DistortionVectorScale: 2
- _DoubleSidedEnable: 1
- _DoubleSidedNormalMode: 0
- _DoubleSidedNormalMode: 1
- _Drag: 1
- _DstBlend: 0
- _EmissiveColorMode: 1

- _EnableMotionVectorForVertexAnimation: 0
- _EnableSpecularOcclusion: 0
- _EnableWind: 0
- _HeightAmplitude: 0.02

- _SmoothnessRemapMin: 0
- _SrcBlend: 1
- _StencilRef: 2
- _StencilRefMV: 128
- _StencilWriteMask: 7
- _StencilWriteMaskMV: 128
- _Stiffness: 1
- _SubsurfaceProfile: 0
- _SubsurfaceRadius: 1

- _ThicknessMultiplier: 1
- _TransparentBackfaceEnable: 0
- _TransparentDepthPostpassEnable: 0
- _TransparentDepthPrepassEnable: 0
- _UVBase: 0
- _UVDetail: 0
- _ZTestMode: 8

- _Color: {r: 1, g: 1, b: 1, a: 1}
- _DoubleSidedConstants: {r: 1, g: 1, b: 1, a: 0}
- _DoubleSidedConstants: {r: 1, g: 1, b: -1, a: 0}
- _EmissionColor: {r: 1, g: 1, b: 1, a: 1}
- _EmissiveColor: {r: 0, g: 0, b: 0, a: 1}
- _InvPrimScale: {r: 1, g: 1, b: 0, a: 0}

- _UVDetailsMappingMask: {r: 1, g: 0, b: 0, a: 0}
- _UVMappingMask: {r: 1, g: 0, b: 0, a: 0}
--- !u!1 &1206394791
--- !u!1 &1350281943
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}

- component: {fileID: 1206394792}
- component: {fileID: 1206394794}
- component: {fileID: 1206394793}
- component: {fileID: 1350281944}
- component: {fileID: 1350281946}
- component: {fileID: 1350281945}
m_Name: New Text (7)
m_Name: New Text (10)
--- !u!4 &1206394792
--- !u!4 &1350281944
m_GameObject: {fileID: 1206394791}
m_GameObject: {fileID: 1350281943}
m_LocalPosition: {x: -1.5, y: 1, z: 0}
m_LocalPosition: {x: -1, y: 1, z: 0}
m_RootOrder: 0
m_RootOrder: 1
--- !u!102 &1206394793
--- !u!102 &1350281945
m_GameObject: {fileID: 1206394791}
m_Text: None
m_GameObject: {fileID: 1350281943}
m_Text: Flip
m_OffsetZ: 0
m_CharacterSize: 0.1
m_LineSpacing: 1

m_Color:
serializedVersion: 2
rgba: 4294967295
--- !u!23 &1206394794
--- !u!23 &1350281946
m_GameObject: {fileID: 1206394791}
m_GameObject: {fileID: 1350281943}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1

m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
--- !u!1 &1221386888
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
serializedVersion: 5
m_Component:
- component: {fileID: 1221386889}
- component: {fileID: 1221386891}
- component: {fileID: 1221386890}
m_Layer: 0
m_Name: DoubleSidePlane__DoubleSidedNormalMode_0.00
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1221386889
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1221386888}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 195823282}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!23 &1221386890
MeshRenderer:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1221386888}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RenderingLayerMask: 4294967295
m_Materials:
- {fileID: 1093412843}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 0
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
--- !u!33 &1221386891
MeshFilter:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1221386888}
m_Mesh: {fileID: 4300000, guid: 0661b78617a8d1f48adef7e6b4af05bd, type: 3}
--- !u!1 &1350281943
--- !u!1 &1463840386
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}

- component: {fileID: 1350281944}
- component: {fileID: 1350281946}
- component: {fileID: 1350281945}
- component: {fileID: 1463840387}
- component: {fileID: 1463840389}
- component: {fileID: 1463840388}
m_Name: New Text (10)
m_Name: New Text (9)
--- !u!4 &1350281944
--- !u!4 &1463840387
m_GameObject: {fileID: 1350281943}
m_GameObject: {fileID: 1463840386}
m_LocalPosition: {x: 1.5, y: 1, z: 0}
m_LocalPosition: {x: 0.5, y: 1, z: 0}
m_RootOrder: 2
m_RootOrder: 0
--- !u!102 &1350281945
--- !u!102 &1463840388
m_GameObject: {fileID: 1350281943}
m_Text: Flip
m_GameObject: {fileID: 1463840386}
m_Text: Mirror
m_OffsetZ: 0
m_CharacterSize: 0.1
m_LineSpacing: 1

m_Color:
serializedVersion: 2
rgba: 4294967295
--- !u!23 &1350281946
--- !u!23 &1463840389
m_GameObject: {fileID: 1350281943}
m_GameObject: {fileID: 1463840386}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1

m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
--- !u!1 &1463840386
--- !u!1 &1492725333
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}

- component: {fileID: 1463840387}
- component: {fileID: 1463840389}
- component: {fileID: 1463840388}
- component: {fileID: 1492725334}
- component: {fileID: 1492725336}
- component: {fileID: 1492725335}
m_Name: New Text (9)
m_Name: DoubleSidePlane__DoubleSidedNormalMode_0.00
--- !u!4 &1463840387
--- !u!4 &1492725334
m_GameObject: {fileID: 1463840386}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 1, z: 0}
m_GameObject: {fileID: 1492725333}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_Father: {fileID: 103750789}
m_RootOrder: 1
m_Father: {fileID: 195823282}
m_RootOrder: 0
--- !u!102 &1463840388
TextMesh:
serializedVersion: 3
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1463840386}
m_Text: Mirror
m_OffsetZ: 0
m_CharacterSize: 0.1
m_LineSpacing: 1
m_Anchor: 4
m_Alignment: 1
m_TabSize: 4
m_FontSize: 16
m_FontStyle: 0
m_RichText: 1
m_Font: {fileID: 12800000, guid: 306d620c715872046bf76568b7f382d4, type: 3}
m_Color:
serializedVersion: 2
rgba: 4294967295
--- !u!23 &1463840389
--- !u!23 &1492725335
m_GameObject: {fileID: 1463840386}
m_GameObject: {fileID: 1492725333}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1

m_ReflectionProbeUsage: 1
m_RenderingLayerMask: 4294967295
m_Materials:
- {fileID: 2100000, guid: 306d620c715872046bf76568b7f382d4, type: 3}
- {fileID: 1590950923}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0

m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
--- !u!33 &1492725336
MeshFilter:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1492725333}
m_Mesh: {fileID: 4300000, guid: 0661b78617a8d1f48adef7e6b4af05bd, type: 3}
--- !u!1 &1527785485
GameObject:
m_ObjectHideFlags: 0

m_Father: {fileID: 0}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!21 &1789764152
--- !u!21 &1590950923
Material:
serializedVersion: 6
m_ObjectHideFlags: 0

_NORMALMAP_TANGENT_SPACE
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_DoubleSidedGI: 1
- TransparentDepthPrepass
- TransparentDepthPostpass
- TransparentBackface
- TransparentBackfaceDebugDisplay
- MOTIONVECTORS
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:

- _AlphaCutoff: 0.5
- _AlphaCutoffEnable: 0
- _AlphaCutoffPostpass: 0.5
- _AlphaCutoffPrepass: 0.5
- _CullModeForward: 2
- _CullModeForward: 0
- _Cutoff: 0.5
- _DepthOffsetEnable: 0
- _DetailAlbedoScale: 1

- _DistortionVectorBias: -1
- _DistortionVectorScale: 2
- _DoubleSidedEnable: 1
- _DoubleSidedNormalMode: 1
- _DoubleSidedNormalMode: 0
- _Drag: 1
- _DstBlend: 0
- _EmissiveColorMode: 1

- _EnableMotionVectorForVertexAnimation: 0
- _EnableSpecularOcclusion: 0
- _EnableWind: 0
- _HeightAmplitude: 0.02

- _SmoothnessRemapMin: 0
- _SrcBlend: 1
- _StencilRef: 2
- _StencilRefMV: 128
- _StencilWriteMask: 7
- _StencilWriteMaskMV: 128
- _Stiffness: 1
- _SubsurfaceProfile: 0
- _SubsurfaceRadius: 1

- _ThicknessMultiplier: 1
- _TransparentBackfaceEnable: 0
- _TransparentDepthPostpassEnable: 0
- _TransparentDepthPrepassEnable: 0
- _UVBase: 0
- _UVDetail: 0
- _ZTestMode: 8

- _Color: {r: 1, g: 1, b: 1, a: 1}
- _DoubleSidedConstants: {r: 1, g: 1, b: -1, a: 0}
- _DoubleSidedConstants: {r: -1, g: -1, b: -1, a: 0}
- _EmissionColor: {r: 1, g: 1, b: 1, a: 1}
- _EmissiveColor: {r: 0, g: 0, b: 0, a: 1}
- _InvPrimScale: {r: 1, g: 1, b: 0, a: 0}

m_Script: {fileID: 11500000, guid: c6c2871f720b2af4e9210febdac74517, type: 3}
m_Name:
m_EditorClassIdentifier:
m_Version: 1
shadowResolution: 512
shadowDimmer: 1
shadowFadeDistance: 10000

affectSpecular: 1
lightTypeExtent: 0
spotLightShape: 0
shapeLength: 0.5
shapeHeight: 0.5
aspectRatio: 1
shapeRadius: 0
maxSmoothness: 1

m_Father: {fileID: 0}
m_RootOrder: 5
m_LocalEulerAnglesHint: {x: 45, y: 0, z: 0}
--- !u!1 &1969001306
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
serializedVersion: 5
m_Component:
- component: {fileID: 1969001307}
- component: {fileID: 1969001309}
- component: {fileID: 1969001308}
m_Layer: 0
m_Name: DoubleSidePlane__DoubleSidedNormalMode_1.00
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1969001307
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1969001306}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 1.5, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children: []
m_Father: {fileID: 195823282}
m_RootOrder: 1
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!23 &1969001308
MeshRenderer:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1969001306}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RenderingLayerMask: 4294967295
m_Materials:
- {fileID: 1789764152}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 0
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
--- !u!33 &1969001309
MeshFilter:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1969001306}
m_Mesh: {fileID: 4300000, guid: 0661b78617a8d1f48adef7e6b4af05bd, type: 3}

880
Tests/GraphicsTests/RenderPipeline/HDRenderPipeline/Scenes/1xxx_Materials/1205_Lit_Transparent_Refraction.unity
文件差异内容过多而无法显示
查看文件

854
Tests/GraphicsTests/RenderPipeline/HDRenderPipeline/Scenes/1xxx_Materials/1206_Lit_Transparent_Distortion.unity
文件差异内容过多而无法显示
查看文件

3
ScriptableRenderPipeline/LightweightPipeline/LWRP/Data/LightweightPipelineAsset.cs


public class LightweightPipelineAsset : RenderPipelineAsset
{
private const int PACKAGE_MANAGER_PATH_INDEX = 1;
public static readonly string[] m_SearchPaths = {"Assets", "Packages/com.unity.render-pipelines.lightweight"};
// Default values set when a new LightweightPipeline asset is created

// There's currently an issue that prevents FindAssets from find resources withing the package folder.
if (resourceAsset == null)
{
string path = "Packages/com.unity.render-pipelines.lightweight/Data/LightweightPipelineResource.asset";
string path = m_SearchPaths[PACKAGE_MANAGER_PATH_INDEX] + "/LWRP/Data/LightweightPipelineResource.asset";
resourceAsset = AssetDatabase.LoadAssetAtPath<LightweightPipelineResource>(path);
}

5
ScriptableRenderPipeline/LightweightPipeline/LWRP/Editor/ShaderGUI.meta


fileFormatVersion: 2
guid: c8b417f54d2314549995022591d5454f
guid: e2eccaf646dce46a69c0224eb55c61a2
timeCreated: 1496821940
licenseType: Pro
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

4
ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightPipeline.cs


private ShadowSliceData[] m_ShadowSlices = new ShadowSliceData[kMaxCascades];
// Pipeline pass names
private static readonly ShaderPassName m_DepthPrePass = new ShaderPassName("DepthOnly");
private static readonly ShaderPassName m_DepthPrepass = new ShaderPassName("DepthOnly");
private static readonly ShaderPassName m_LitPassName = new ShaderPassName("LightweightForward");
private static readonly ShaderPassName m_UnlitPassName = new ShaderPassName("SRPDefaultUnlit"); // Renders all shaders without a lightmode tag

context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
var opaqueDrawSettings = new DrawRendererSettings(m_CurrCamera, m_DepthPrePass);
var opaqueDrawSettings = new DrawRendererSettings(m_CurrCamera, m_DepthPrepass);
opaqueDrawSettings.sorting.flags = SortFlags.CommonOpaque;
var opaqueFilterSettings = new FilterRenderersSettings(true)

2
ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders/LightweightShaderLibrary.meta


fileFormatVersion: 2
guid: 37244f7798708ba449e9893ad27f77f5
guid: 2de5b472450204ae2853db2cb6a2540a
folderAsset: yes
DefaultImporter:
externalObjects: {}

65
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Sky/VisualEnvironmentEditor.cs


using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.Experimental.Rendering.HDPipeline;
using UnityEditor.Experimental.Rendering;
namespace UnityEditor.Experimental.Rendering.HDPipeline
{
[VolumeComponentEditor(typeof(VisualEnvironment))]
public class VisualEnvironmentEditor : VolumeComponentEditor
{
SerializedDataParameter m_SkyType;
SerializedDataParameter m_FogType;
List<GUIContent> m_SkyClassNames = null;
List<int> m_SkyUniqueIDs = null;
public override void OnEnable()
{
base.OnEnable();
var o = new PropertyFetcher<VisualEnvironment>(serializedObject);
m_SkyType = Unpack(o.Find(x => x.skyType));
m_FogType = Unpack(o.Find(x => x.fogType));
}
void UpdateSkyIntPopupData()
{
if(m_SkyClassNames == null)
{
m_SkyClassNames = new List<GUIContent>();
m_SkyUniqueIDs = new List<int>();
// Add special "None" case.
m_SkyClassNames.Add(new GUIContent("None"));
m_SkyUniqueIDs.Add(0);
var skyTypesDict = SkyManager.skyTypesDict;
foreach (KeyValuePair<int, Type> kvp in skyTypesDict)
{
m_SkyClassNames.Add(new GUIContent(kvp.Value.Name.ToString()));
m_SkyUniqueIDs.Add(kvp.Key);
}
}
}
public override void OnInspectorGUI()
{
UpdateSkyIntPopupData();
using (new EditorGUILayout.HorizontalScope())
{
DrawOverrideCheckbox(m_SkyType);
using (new EditorGUI.DisabledScope(!m_SkyType.overrideState.boolValue))
{
EditorGUILayout.IntPopup(m_SkyType.value, m_SkyClassNames.ToArray(), m_SkyUniqueIDs.ToArray(), new GUIContent("Sky Type"));
}
}
PropertyField(m_FogType);
}
}
}

11
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Editor/Sky/VisualEnvironmentEditor.cs.meta


fileFormatVersion: 2
guid: 42645a46defc138458b68060eda4785a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

58
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/SkyUpdateContext.cs


using UnityEngine.Rendering;
using System;
namespace UnityEngine.Experimental.Rendering.HDPipeline
{
internal class SkyUpdateContext
{
SkySettings m_SkySettings;
SkyRenderer m_Renderer;
public int skyParametersHash = -1;
public float currentUpdateTime = 0.0f;
public int updatedFramesRequired = 1; // The first frame after the scene load is currently not rendered correctly
public SkySettings skySettings
{
get { return m_SkySettings; }
set
{
if (m_SkySettings == value)
return;
if (m_Renderer != null)
{
m_Renderer.Cleanup();
m_Renderer = null;
}
skyParametersHash = -1;
m_SkySettings = value;
updatedFramesRequired = 1;
currentUpdateTime = 0.0f;
if (value != null)
{
m_Renderer = value.CreateRenderer();
m_Renderer.Build();
}
}
}
public SkyRenderer renderer { get { return m_Renderer; } }
public bool IsValid()
{
// We need to check m_SkySettings in addition to the renderer because it can be "nulled" when destroying the volume containing the settings (as it's a ScriptableObject) without the context knowing about it.
return m_Renderer != null && m_Renderer.IsValid() && m_SkySettings != null;
}
public void Cleanup()
{
if (m_Renderer != null)
m_Renderer.Cleanup();
}
}
}

11
ScriptableRenderPipeline/HDRenderPipeline/HDRP/Sky/SkyUpdateContext.cs.meta


fileFormatVersion: 2
guid: 7f0f3fd17c0272440b8aab72eb5068be
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

8
ScriptableRenderPipeline/LightweightPipeline/LWRP.meta


fileFormatVersion: 2
guid: 5f9e9e863e5d34a5ab12de3834516604
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

8
ScriptableRenderPipeline/LightweightPipeline/LWRP/Data.meta


fileFormatVersion: 2
guid: d59f1663563e245fabce035da7cecd75
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

8
ScriptableRenderPipeline/LightweightPipeline/LWRP/Editor.meta


fileFormatVersion: 2
guid: 53c20613ce8ac478dba8507359e02516
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

8
ScriptableRenderPipeline/LightweightPipeline/LWRP/Materials.meta


fileFormatVersion: 2
guid: 7f10efc5458aa44a2928a72c38807544
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

8
ScriptableRenderPipeline/LightweightPipeline/LWRP/Shaders.meta


fileFormatVersion: 2
guid: 248877dd7078443d6b51abf21ee7d52a
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

16
ScriptableRenderPipeline/LightweightPipeline/LWRP/Editor/LightweightShaderIncludePaths.cs


using System.IO;
namespace UnityEditor.Experimental.Rendering.LightweightPipeline
{
static class LightweightIncludePaths
{
[ShaderIncludePath]
public static string[] GetPaths()
{
return new[]
{
Path.GetFullPath("Packages/com.unity.render-pipelines.lightweight/LWRP/Shaders"),
};
}
}
}

11
ScriptableRenderPipeline/LightweightPipeline/LWRP/Editor/LightweightShaderIncludePaths.cs.meta


fileFormatVersion: 2
guid: cd920abe23764ecc804601f00b93c770
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

9
ScriptableRenderPipeline/LightweightPipeline/Editor.meta


fileFormatVersion: 2
guid: 316ed34724625cb47b31136769381b57
folderAsset: yes
timeCreated: 1484576996
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

9
ScriptableRenderPipeline/LightweightPipeline/Shaders.meta


fileFormatVersion: 2
guid: 81841919e91d4b24ba3a6ca4a5167bce
folderAsset: yes
timeCreated: 1490023078
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

9
ScriptableRenderPipeline/LightweightPipeline/Materials.meta


fileFormatVersion: 2
guid: bc5fccbcb91216745b747fafd8514a24
folderAsset: yes
timeCreated: 1496317987
licenseType: Pro
DefaultImporter:
userData:
assetBundleName:
assetBundleVariant:

8
ScriptableRenderPipeline/LightweightPipeline/Data.meta


fileFormatVersion: 2
guid: 96a897191a3b552429d819147e6a36a4
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

8
Tests/GraphicsTests/RenderPipeline/LightweightPipeline/Scenes/030_Shader_RenderOrder.meta


fileFormatVersion: 2
guid: f78229abd339e4d49b6e0e29fd79df0c
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

/ScriptableRenderPipeline/Core/com.unity.render-pipelines.core.Runtime.asmdef → /ScriptableRenderPipeline/Core/CoreRP/com.unity.render-pipelines.core.Runtime.asmdef

/ScriptableRenderPipeline/Core/com.unity.render-pipelines.core.Runtime.asmdef.meta → /ScriptableRenderPipeline/Core/CoreRP/com.unity.render-pipelines.core.Runtime.asmdef.meta

/ScriptableRenderPipeline/HDRenderPipeline/com.unity.render-pipelines.high-definition.Runtime.asmdef.meta → /ScriptableRenderPipeline/HDRenderPipeline/HDRP/com.unity.render-pipelines.high-definition.Runtime.asmdef.meta

/ScriptableRenderPipeline/HDRenderPipeline/com.unity.render-pipelines.high-definition.Runtime.asmdef → /ScriptableRenderPipeline/HDRenderPipeline/HDRP/com.unity.render-pipelines.high-definition.Runtime.asmdef

/ScriptableRenderPipeline/LightweightPipeline/LightweightPipeline.cs.meta → /ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightPipeline.cs.meta

/ScriptableRenderPipeline/LightweightPipeline/LightweightPipelineUtils.cs.meta → /ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightPipelineUtils.cs.meta

/ScriptableRenderPipeline/LightweightPipeline/LightweightConstantBuffer.cs.meta → /ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightConstantBuffer.cs.meta

/ScriptableRenderPipeline/LightweightPipeline/LightweightConstantBuffer.cs → /ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightConstantBuffer.cs

/ScriptableRenderPipeline/LightweightPipeline/LightweightPipelineUtils.cs → /ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightPipelineUtils.cs

/ScriptableRenderPipeline/LightweightPipeline/Materials → /ScriptableRenderPipeline/LightweightPipeline/LWRP/Materials

/ScriptableRenderPipeline/LightweightPipeline/LightweightShaderUtils.cs → /ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightShaderUtils.cs

/ScriptableRenderPipeline/LightweightPipeline/LightweightShaderUtils.cs.meta → /ScriptableRenderPipeline/LightweightPipeline/LWRP/LightweightShaderUtils.cs.meta

/ScriptableRenderPipeline/LightweightPipeline/com.unity.render-pipelines.lightweight.Runtime.asmdef → /ScriptableRenderPipeline/LightweightPipeline/LWRP/com.unity.render-pipelines.lightweight.Runtime.asmdef

部分文件因为文件数量过多而无法显示

正在加载...
取消
保存