Parcourir la source

Upgrading PopcornFx assets from version 19.x to 2.20.2

Signed-off-by: AMZN-Gene <[email protected]>
AMZN-Gene il y a 6 mois
Parent
commit
f31ce1714a
100 fichiers modifiés avec 7112 ajouts et 3815 suppressions
  1. 1 1
      PopcornFX/Editor/AnimationTracks/Circle.pkcf
  2. 1 1
      PopcornFX/Editor/AnimationTracks/PingPong.pkcf
  3. 2 2
      PopcornFX/Editor/Presets/Effects/Basic.pkfx
  4. 2 2
      PopcornFX/Editor/Presets/Effects/FX_Simple.pkfx
  5. 585 0
      PopcornFX/Library/PopcornFXCore/Materials/Billboard_AnimatedMasked.pkma
  6. 166 0
      PopcornFX/Library/PopcornFXCore/Materials/Billboard_Distortion.pkma
  7. 206 0
      PopcornFX/Library/PopcornFXCore/Materials/Billboard_Opaque.pkma
  8. 214 0
      PopcornFX/Library/PopcornFXCore/Materials/Billboard_Transparent.pkma
  9. 185 0
      PopcornFX/Library/PopcornFXCore/Materials/Decal_Default.pkma
  10. 0 116
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Billboard/Billboard_Diffuse.pkma
  11. 0 116
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Billboard/Billboard_Distortion.pkma
  12. 0 116
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Billboard/Billboard_Emissive.pkma
  13. 0 102
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Billboard/Billboard_Opaque.pkma
  14. 0 116
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Billboard/Billboard_Tinted.pkma
  15. 0 81
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Decal/Decal_Diffuse.pkma
  16. 0 93
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Mesh/Mesh_Emissive.pkma
  17. 0 111
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Mesh/Mesh_Opaque.pkma
  18. 0 105
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Mesh/Mesh_Tinted.pkma
  19. 0 129
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_CorrectDeformation_Diffuse.pkma
  20. 0 129
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_CorrectDeformation_Distortion.pkma
  21. 0 129
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_CorrectDeformation_Emissive.pkma
  22. 0 110
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_CorrectDeformation_Opaque.pkma
  23. 0 129
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_CorrectDeformation_Tinted.pkma
  24. 0 128
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_Diffuse.pkma
  25. 0 128
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_Distortion.pkma
  26. 0 128
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_Emissive.pkma
  27. 0 104
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_Opaque.pkma
  28. 0 128
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_Tinted.pkma
  29. 0 128
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Triangle/Triangle_Distortion.pkma
  30. 0 128
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Triangle/Triangle_Emissive.pkma
  31. 0 128
      PopcornFX/Library/PopcornFXCore/Materials/Experimental/Triangle/Triangle_Tinted.pkma
  32. 1275 16
      PopcornFX/Library/PopcornFXCore/Materials/Interface/Default.pkri
  33. 5 9
      PopcornFX/Library/PopcornFXCore/Materials/Interface/Legacy.pkri
  34. 0 392
      PopcornFX/Library/PopcornFXCore/Materials/Interface/MeshAnim.pkri
  35. 1 1
      PopcornFX/Library/PopcornFXCore/Materials/Interface/SkeletalAnimationTexture.pkri
  36. 19 19
      PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Animated_Mesh.pkma
  37. 19 19
      PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Default_Billboard.pkma
  38. 10 10
      PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Default_Decal.pkma
  39. 9 9
      PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Default_Light.pkma
  40. 19 19
      PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Default_Mesh.pkma
  41. 22 22
      PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Default_Ribbon.pkma
  42. 6 6
      PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Default_Sound.pkma
  43. 10 10
      PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Default_Triangle.pkma
  44. 16 16
      PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Distortion_Billboard.pkma
  45. 19 19
      PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Distortion_Ribbon.pkma
  46. 18 18
      PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Opaque_Billboard.pkma
  47. 21 21
      PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Opaque_Ribbon.pkma
  48. 10 10
      PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Opaque_Triangle.pkma
  49. 18 18
      PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Transparent_Mesh.pkma
  50. 8 8
      PopcornFX/Library/PopcornFXCore/Materials/Light_Default.pkma
  51. 603 0
      PopcornFX/Library/PopcornFXCore/Materials/Mesh_AnimatedMasked.pkma
  52. 191 0
      PopcornFX/Library/PopcornFXCore/Materials/Mesh_Emissive.pkma
  53. 209 0
      PopcornFX/Library/PopcornFXCore/Materials/Mesh_Opaque.pkma
  54. 196 0
      PopcornFX/Library/PopcornFXCore/Materials/Mesh_Tinted.pkma
  55. 577 0
      PopcornFX/Library/PopcornFXCore/Materials/Ribbon_AnimatedMasked.pkma
  56. 186 0
      PopcornFX/Library/PopcornFXCore/Materials/Ribbon_CorrectDeformation_Distortion.pkma
  57. 220 0
      PopcornFX/Library/PopcornFXCore/Materials/Ribbon_CorrectDeformation_Opaque.pkma
  58. 233 0
      PopcornFX/Library/PopcornFXCore/Materials/Ribbon_CorrectDeformation_Transparent.pkma
  59. 178 0
      PopcornFX/Library/PopcornFXCore/Materials/Ribbon_Distortion.pkma
  60. 208 0
      PopcornFX/Library/PopcornFXCore/Materials/Ribbon_Opaque.pkma
  61. 226 0
      PopcornFX/Library/PopcornFXCore/Materials/Ribbon_Transparent.pkma
  62. 6 6
      PopcornFX/Library/PopcornFXCore/Materials/Sound_Default.pkma
  63. 38 39
      PopcornFX/Library/PopcornFXCore/Materials/Triangle_Distortion.pkma
  64. 23 17
      PopcornFX/Library/PopcornFXCore/Materials/Triangle_Opaque.pkma
  65. 26 32
      PopcornFX/Library/PopcornFXCore/Materials/Triangle_Transparent.pkma
  66. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/Decal_Default.vert
  67. 0 26
      PopcornFX/Library/PopcornFXCore/Shaders/Experimental/includes/FeatureEmissive.h
  68. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Default_Billboard.frag
  69. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Default_Decal.frag
  70. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Default_Decal.vert
  71. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Default_Light.frag
  72. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Default_Light.vert
  73. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Default_Mesh.frag
  74. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Default_Ribbon.frag
  75. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Default_Triangle.frag
  76. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Distortion_Billboard.frag
  77. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Distortion_Ribbon.frag
  78. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Opaque_Billboard.frag
  79. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Opaque_Ribbon.frag
  80. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Opaque_Triangle.frag
  81. 483 0
      PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Particle_Master.frag
  82. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Transparent_Mesh.frag
  83. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/Light_Default.frag
  84. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/Light_Default.vert
  85. 18 2
      PopcornFX/Library/PopcornFXCore/Shaders/Noise_Billboard.frag
  86. 129 453
      PopcornFX/Library/PopcornFXCore/Shaders/Particle_Master.frag
  87. 93 0
      PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureAlphaMasks.h
  88. 44 0
      PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureAtlas.h
  89. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureDecal.h
  90. 17 3
      PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureDiffuse.h
  91. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureDistortion.h
  92. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureDithering.h
  93. 37 0
      PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureEmissive.h
  94. 165 0
      PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureFastLit.h
  95. 1 3
      PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureRibbonCorrectDeformation.h
  96. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureSoftParticles.h
  97. 0 0
      PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureTint.h
  98. 26 4
      PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureTransformUVs.h
  99. 80 0
      PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureTransformedNoises.h
  100. 32 0
      PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureUVDistortions.h

+ 1 - 1
PopcornFX/Editor/AnimationTracks/Circle.pkcf

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 COvenBakeConfig_Mesh	$82362157
 {
 	ImportGeometry = false;

+ 1 - 1
PopcornFX/Editor/AnimationTracks/PingPong.pkcf

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 COvenBakeConfig_Mesh	$A6D04D13
 {
 	ImportGeometry = false;

+ 2 - 2
PopcornFX/Editor/Presets/Effects/Basic.pkfx

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:a6031d7a91e44abfa582803a5b1a3c5cc2fe2a5e411fbd5762e05e91f8c7e598
-size 29711
+oid sha256:eb428a82c4337fc614344743ab47e80be529ca6f4a8bae8741f689d455548941
+size 30110

+ 2 - 2
PopcornFX/Editor/Presets/Effects/FX_Simple.pkfx

@@ -1,3 +1,3 @@
 version https://git-lfs.github.com/spec/v1
-oid sha256:f3cf633d4789320ee029c0771b9a0b188cb0fab43e42a2908a65bf033d48e62c
-size 31034
+oid sha256:bb7a0379e5dc790ec875e8ca953cf27a910e52768fe6a2aed1725db4729cc846
+size 31455

+ 585 - 0
PopcornFX/Library/PopcornFXCore/Materials/Billboard_AnimatedMasked.pkma

@@ -0,0 +1,585 @@
+Version = 2.20.1.21979;
+CParticleRendererMaterial	$6B70D015
+{
+	RendererFeatures = {
+		"$82290D6B",
+		"$CDDE3020",
+		"$BF53D1F0",
+		"$6E070218",
+		"$F9AE8557",
+		"$F3990E53",
+		"$3FD07EA7",
+		"$3576B2F9",
+		"$1CE37377",
+		"$3AB53997",
+		"$28002A64",
+		"$41E01F70",
+		"$923923FE",
+		"$2B0AD5F2",
+		"$B05415BE",
+		"$8320D509",
+	};
+	NodeGraph = "$AEEAC0BC";
+}
+CRHIMaterialShaders	$00269EC3
+{
+	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
+}
+CParticleRendererFeatureDesc	$82290D6B
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "GeometryBillboard";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$BF53D1F0
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "UVDistortions";
+}
+CParticleRendererFeatureDesc	$6E070218
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "AlphaMasks";
+}
+CParticleRendererFeatureDesc	$F9AE8557
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Dissolve";
+}
+CParticleRendererFeatureDesc	$F3990E53
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Emissive";
+	EnabledByDefault = true;
+}
+CParticleRendererFeatureDesc	$3FD07EA7
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EmissiveRamp";
+}
+CParticleRendererFeatureDesc	$3576B2F9
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Diffuse";
+}
+CParticleRendererFeatureDesc	$1CE37377
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "DiffuseRamp";
+}
+CParticleRendererFeatureDesc	$3AB53997
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TransformUVs";
+}
+CParticleRendererFeatureDesc	$28002A64
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Atlas";
+}
+CParticleRendererFeatureDesc	$41E01F70
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "NormalWrap";
+}
+CParticleRendererFeatureDesc	$923923FE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "NormalBend";
+}
+CParticleNodeGraph	$AEEAC0BC
+{
+	CustomName = "Adapter";
+	Nodes = {
+		"$E504EFC1",
+		"$D3876154",
+		"$F49EE630",
+		"$9F8BB69C",
+		"$4C51ECC9",
+		"$94651F86",
+		"$3289E38A",
+		"$4F4FB4C8",
+		"$A8422023",
+		"$11034A04",
+		"$BD48066E",
+		"$35B7B22B",
+		"$6D1635CB",
+		"$04557757",
+		"$091D719D",
+		"$A27E3C22",
+	};
+	WorkspacePosition = int2(-89, -134);
+	WorkspaceZoom = -6;
+	HasExplicitWorkspaceCoords = true;
+}
+CParticleNodeTemplateExport	$E504EFC1
+{
+	InputPins = {
+		"$3287C09A",
+	};
+	OutputPins = {
+		"$F2DD9FD2",
+	};
+	WorkspacePosition = int2(-242, 1012);
+	ExportedName = "UVDistortions";
+	ExportedType = bool;
+	Type = Input;
+	InputType = Property;
+}
+CParticleNodePinIn	$3287C09A
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$E504EFC1";
+}
+CParticleNodePinOut	$F2DD9FD2
+{
+	SelfName = "Value";
+	Owner = "$E504EFC1";
+}
+CParticleNodeTemplateExport	$D3876154
+{
+	InputPins = {
+		"$0A05BF26",
+	};
+	OutputPins = {
+		"$1DA22B07",
+	};
+	WorkspacePosition = int2(-242, 1232);
+	ExportedName = "UVDistortions.Distortion1AnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+}
+CParticleNodePinIn	$0A05BF26
+{
+	SelfName = "DefaultValue";
+	Owner = "$D3876154";
+	ConnectedPins = {
+		"$6B06B431",
+	};
+}
+CParticleNodePinOut	$1DA22B07
+{
+	SelfName = "Value";
+	Owner = "$D3876154";
+	ConnectedPins = {
+		"$FDA1FA61",
+	};
+}
+CParticleNodeTemplateExport	$F49EE630
+{
+	InputPins = {
+		"$FDA1FA61",
+	};
+	WorkspacePosition = int2(726, 1232);
+	ExportedName = "UVDistortions.Distortion1AnimationCursor";
+	ExportedType = float;
+	Type = Output;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+}
+CParticleNodePinIn	$FDA1FA61
+{
+	SelfName = "Value";
+	Owner = "$F49EE630";
+	ConnectedPins = {
+		"$1DA22B07",
+	};
+}
+CParticleNodeTemplateExport	$9F8BB69C
+{
+	InputPins = {
+		"$AC686F18",
+	};
+	OutputPins = {
+		"$B203BF85",
+	};
+	WorkspacePosition = int2(-242, 1452);
+	ExportedName = "UVDistortions.Distortion2AnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+}
+CParticleNodePinIn	$AC686F18
+{
+	SelfName = "DefaultValue";
+	Owner = "$9F8BB69C";
+	ConnectedPins = {
+		"$6B06B431",
+	};
+}
+CParticleNodePinOut	$B203BF85
+{
+	SelfName = "Value";
+	Owner = "$9F8BB69C";
+	ConnectedPins = {
+		"$7EDFBAE0",
+	};
+}
+CParticleNodeTemplateExport	$4C51ECC9
+{
+	InputPins = {
+		"$7EDFBAE0",
+	};
+	WorkspacePosition = int2(726, 1452);
+	ExportedName = "UVDistortions.Distortion2AnimationCursor";
+	ExportedType = float;
+	Type = Output;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+}
+CParticleNodePinIn	$7EDFBAE0
+{
+	SelfName = "Value";
+	Owner = "$4C51ECC9";
+	ConnectedPins = {
+		"$B203BF85",
+	};
+}
+CParticleNodeTemplateExport	$94651F86
+{
+	InputPins = {
+		"$039267BA",
+	};
+	OutputPins = {
+		"$22EE2377",
+	};
+	WorkspacePosition = int2(-242, 550);
+	ExportedName = "AlphaMasks.Mask1AnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+}
+CParticleNodePinIn	$039267BA
+{
+	SelfName = "DefaultValue";
+	Owner = "$94651F86";
+	ConnectedPins = {
+		"$6B06B431",
+	};
+}
+CParticleNodePinOut	$22EE2377
+{
+	SelfName = "Value";
+	Owner = "$94651F86";
+	ConnectedPins = {
+		"$26AA6089",
+	};
+}
+CParticleNodeTemplateExport	$3289E38A
+{
+	InputPins = {
+		"$26AA6089",
+	};
+	WorkspacePosition = int2(726, 550);
+	ExportedName = "AlphaMasks.Mask1AnimationCursor";
+	ExportedType = float;
+	Type = Output;
+	CategoryName = {
+		"@eng:TransformedNoises",
+	};
+}
+CParticleNodePinIn	$26AA6089
+{
+	SelfName = "Value";
+	Owner = "$3289E38A";
+	ConnectedPins = {
+		"$22EE2377",
+	};
+}
+CParticleNodeTemplateExport	$4F4FB4C8
+{
+	InputPins = {
+		"$E0AB4712",
+	};
+	OutputPins = {
+		"$326FAF5A",
+	};
+	WorkspacePosition = int2(-242, 748);
+	ExportedName = "AlphaMasks.Mask2AnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+}
+CParticleNodePinIn	$E0AB4712
+{
+	SelfName = "DefaultValue";
+	Owner = "$4F4FB4C8";
+	ConnectedPins = {
+		"$6B06B431",
+	};
+}
+CParticleNodePinOut	$326FAF5A
+{
+	SelfName = "Value";
+	Owner = "$4F4FB4C8";
+	ConnectedPins = {
+		"$16ECE803",
+	};
+}
+CParticleNodeTemplateExport	$A8422023
+{
+	InputPins = {
+		"$16ECE803",
+	};
+	WorkspacePosition = int2(726, 770);
+	ExportedName = "AlphaMasks.Mask2AnimationCursor";
+	ExportedType = float;
+	Type = Output;
+	CategoryName = {
+		"@eng:TransformedNoises",
+	};
+}
+CParticleNodePinIn	$16ECE803
+{
+	SelfName = "Value";
+	Owner = "$A8422023";
+	ConnectedPins = {
+		"$326FAF5A",
+	};
+}
+CParticleRendererFeatureDesc	$2B0AD5F2
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Lit";
+}
+CParticleRendererFeatureDesc	$B05415BE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Transparent";
+	Mandatory = true;
+}
+CParticleNodeTemplate	$11034A04
+{
+	InputPins = {
+		"$78DD36A5",
+	};
+	OutputPins = {
+		"$6B06B431",
+	};
+	WorkspacePosition = int2(-946, 990);
+	SubGraphFilePath = "Library/PopcornFXCore/Templates/Core.pkfx";
+	SubGraphName = "self.age";
+}
+CParticleNodePinIn	$78DD36A5
+{
+	SelfName = "Scale";
+	Type = float;
+	Visible = false;
+	Owner = "$11034A04";
+	BaseType = float;
+	ValueF = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinOut	$6B06B431
+{
+	SelfName = "Age";
+	Type = float;
+	Owner = "$11034A04";
+	BaseType = float;
+	ConnectedPins = {
+		"$039267BA",
+		"$E0AB4712",
+		"$0A05BF26",
+		"$AC686F18",
+	};
+}
+CParticleNodePinOut	$D3A7D4C3
+{
+	SelfName = "Value";
+}
+CParticleNodePinOut	$FAC1ADF5
+{
+	SelfName = "Value";
+}
+CParticleRendererFeatureDesc	$8320D509
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "FastLit";
+}
+CParticleRendererFeatureDesc	$CDDE3020
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "ComputeVelocity";
+	Mandatory = true;
+}
+CParticleNodeTemplateExport	$BD48066E
+{
+	Description = {
+		"@eng:Billboard center in world coordinates",
+	};
+	InputPins = {
+		"$BFD0B1AC",
+	};
+	OutputPins = {
+		"$783072AE",
+	};
+	WorkspacePosition = int2(-264, 286);
+	ExportedName = "General.Position";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Input;
+	VisibleByDefault = true;
+	TransformSpace = World;
+	TransformMode = Position;
+	CategoryName = {
+		"@eng:General",
+	};
+}
+CParticleNodePinIn	$BFD0B1AC
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$BD48066E";
+}
+CParticleNodePinOut	$783072AE
+{
+	SelfName = "Value";
+	Owner = "$BD48066E";
+	ConnectedPins = {
+		"$1068C12E",
+	};
+}
+CParticleNodeTemplate	$35B7B22B
+{
+	InputPins = {
+		"$1068C12E",
+	};
+	OutputPins = {
+		"$360DEAC4",
+	};
+	WorkspacePosition = int2(220, 286);
+	SubGraphFilePath = "Library/PopcornFXCore/Templates/Core.pkfx";
+	SubGraphName = "PreviousFrameValue";
+}
+CParticleNodePinIn	$1068C12E
+{
+	SelfName = "Value";
+	Owner = "$35B7B22B";
+	ConnectedPins = {
+		"$783072AE",
+	};
+}
+CParticleNodePinOut	$360DEAC4
+{
+	SelfName = "Value";
+	Owner = "$35B7B22B";
+	ConnectedPins = {
+		"$00258513",
+	};
+}
+CParticleNodeTemplateExport	$6D1635CB
+{
+	InputPins = {
+		"$00258513",
+	};
+	WorkspacePosition = int2(704, 286);
+	ExportedName = "ComputeVelocity.PreviousPosition";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Output;
+	TransformSpace = World;
+	TransformMode = Position;
+}
+CParticleNodePinIn	$00258513
+{
+	SelfName = "Value";
+	Owner = "$6D1635CB";
+	ConnectedPins = {
+		"$360DEAC4",
+	};
+}
+CParticleNodeTemplateExport	$04557757
+{
+	InputPins = {
+		"$4727D7E7",
+	};
+	OutputPins = {
+		"$8BCEFFE8",
+	};
+	WorkspacePosition = int2(-286, -330);
+	ExportedName = "Dissolve";
+	ExportedType = bool;
+	Type = Input;
+	InputType = Property;
+}
+CParticleNodePinIn	$4727D7E7
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$04557757";
+}
+CParticleNodePinOut	$8BCEFFE8
+{
+	SelfName = "Value";
+	Owner = "$04557757";
+}
+CParticleNodeTemplateExport	$091D719D
+{
+	Description = {
+		"@eng:[0, inf] value that acts as the alpha threshold value for the dissolve. With a dissolve softness of zero, every pixel that has an alpha value less than the animation cursor value will be discarded.",
+	};
+	InputPins = {
+		"$7A7426DB",
+	};
+	OutputPins = {
+		"$200A6D2B",
+	};
+	WorkspacePosition = int2(-286, -110);
+	ExportedName = "Dissolve.DissolveAnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:Dissolve",
+	};
+	DefaultValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$7A7426DB
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$091D719D";
+}
+CParticleNodePinOut	$200A6D2B
+{
+	SelfName = "Value";
+	Owner = "$091D719D";
+	ConnectedPins = {
+		"$6BC09BB4",
+	};
+}
+CParticleNodeTemplateExport	$A27E3C22
+{
+	Description = {
+		"@eng:[0, inf] value that acts as the alpha threshold value for the dissolve. With a dissolve softness of zero, every pixel that has an alpha value less than the animation cursor value will be discarded.",
+	};
+	InputPins = {
+		"$6BC09BB4",
+	};
+	WorkspacePosition = int2(704, -110);
+	ExportedName = "Dissolve.DissolveAnimationCursor";
+	ExportedType = float;
+	Type = Output;
+	CategoryName = {
+		"@eng:Dissolve",
+	};
+	DefaultValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$6BC09BB4
+{
+	SelfName = "Value";
+	Owner = "$A27E3C22";
+	ConnectedPins = {
+		"$200A6D2B",
+	};
+}

+ 166 - 0
PopcornFX/Library/PopcornFXCore/Materials/Billboard_Distortion.pkma

@@ -0,0 +1,166 @@
+Version = 2.20.1.21979;
+CParticleRendererMaterial	$6B70D015
+{
+	RendererFeatures = {
+		"$191F1761",
+		"$12002A67",
+		"$D857A09F",
+		"$5F3F8D5F",
+		"$CAD62F46",
+		"$1DB717AE",
+		"$EAC726E3",
+		"$0FEA2C5F",
+		"$8F800045",
+	};
+	NodeGraph = "$0237457E";
+}
+CParticleRendererFeatureDesc	$191F1761
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "GeometryBillboard";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$D857A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EnableRendering";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$5F3F8D5F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Transparent";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$CAD62F46
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Atlas";
+}
+CParticleRendererFeatureDesc	$1DB717AE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "BasicTransformUVs";
+}
+CParticleRendererFeatureDesc	$EAC726E3
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TransformUVs";
+}
+CRHIMaterialShaders	$00269EC3
+{
+	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
+}
+CParticleRendererFeatureDesc	$0FEA2C5F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Distortion";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$8F800045
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Tint";
+}
+CParticleNodeGraph	$0237457E
+{
+	CustomName = "Adapter";
+	Nodes = {
+		"$671A9EAA",
+		"$AC2FB11B",
+		"$05D57E83",
+	};
+	WorkspaceZoom = -4;
+}
+CParticleRendererFeatureDesc	$12002A67
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "ComputeVelocity";
+	Mandatory = true;
+}
+CParticleNodeTemplateExport	$671A9EAA
+{
+	Description = {
+		"@eng:Billboard center in world coordinates",
+	};
+	InputPins = {
+		"$FB3E7353",
+	};
+	OutputPins = {
+		"$4D48A543",
+	};
+	WorkspacePosition = int2(-572, -44);
+	ExportedName = "General.Position";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Input;
+	VisibleByDefault = true;
+	TransformSpace = World;
+	TransformMode = Position;
+	CategoryName = {
+		"@eng:General",
+	};
+}
+CParticleNodePinIn	$FB3E7353
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$671A9EAA";
+}
+CParticleNodePinOut	$4D48A543
+{
+	SelfName = "Value";
+	Owner = "$671A9EAA";
+	ConnectedPins = {
+		"$AA3947BC",
+	};
+}
+CParticleNodeTemplate	$AC2FB11B
+{
+	InputPins = {
+		"$AA3947BC",
+	};
+	OutputPins = {
+		"$A782424F",
+	};
+	WorkspacePosition = int2(-88, -44);
+	SubGraphFilePath = "Library/PopcornFXCore/Templates/Core.pkfx";
+	SubGraphName = "PreviousFrameValue";
+}
+CParticleNodePinIn	$AA3947BC
+{
+	SelfName = "Value";
+	Owner = "$AC2FB11B";
+	ConnectedPins = {
+		"$4D48A543",
+	};
+}
+CParticleNodePinOut	$A782424F
+{
+	SelfName = "Value";
+	Owner = "$AC2FB11B";
+	ConnectedPins = {
+		"$BEB3F81C",
+	};
+}
+CParticleNodeTemplateExport	$05D57E83
+{
+	InputPins = {
+		"$BEB3F81C",
+	};
+	WorkspacePosition = int2(396, -44);
+	ExportedName = "ComputeVelocity.PreviousPosition";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Output;
+	TransformSpace = World;
+	TransformMode = Position;
+}
+CParticleNodePinIn	$BEB3F81C
+{
+	SelfName = "Value";
+	Owner = "$05D57E83";
+	ConnectedPins = {
+		"$A782424F",
+	};
+}

+ 206 - 0
PopcornFX/Library/PopcornFXCore/Materials/Billboard_Opaque.pkma

@@ -0,0 +1,206 @@
+Version = 2.20.1.21979;
+CParticleRendererMaterial	$6B70D015
+{
+	RendererFeatures = {
+		"$191F1761",
+		"$1965E97D",
+		"$D857A09F",
+		"$0EBD49BE",
+		"$3D324B43",
+		"$D851A09F",
+		"$EA3837ED",
+		"$4B933A29",
+		"$35A36C4E",
+		"$7FB4AB5F",
+		"$1098ED35",
+		"$CAD62F46",
+		"$1DB717AE",
+		"$EAC726E3",
+		"$4D2256A5",
+	};
+	NodeGraph = "$09FB01D9";
+}
+CParticleRendererFeatureDesc	$191F1761
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "GeometryBillboard";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$D857A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EnableRendering";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$3D324B43
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Diffuse";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$D851A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "DiffuseRamp";
+}
+CParticleRendererFeatureDesc	$EA3837ED
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Lit";
+}
+CParticleRendererFeatureDesc	$4B933A29
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "NormalBend";
+}
+CParticleRendererFeatureDesc	$35A36C4E
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Emissive";
+}
+CParticleRendererFeatureDesc	$7FB4AB5F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EmissiveRamp";
+}
+CParticleRendererFeatureDesc	$1098ED35
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "AlphaRemap";
+}
+CParticleRendererFeatureDesc	$CAD62F46
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Atlas";
+}
+CParticleRendererFeatureDesc	$1DB717AE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "BasicTransformUVs";
+}
+CParticleRendererFeatureDesc	$EAC726E3
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TransformUVs";
+}
+CRHIMaterialShaders	$00269EC3
+{
+	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
+}
+CParticleRendererFeatureDesc	$0EBD49BE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Opaque";
+	Mandatory = true;
+}
+CParticleNodeGraph	$09FB01D9
+{
+	CustomName = "Adapter";
+	Nodes = {
+		"$E77669E8",
+		"$C4E4E48D",
+		"$DAB8D703",
+	};
+	WorkspaceZoom = -4;
+}
+CParticleNodePinOut	$33311BAE
+{
+	SelfName = "Value";
+}
+CParticleRendererFeatureDesc	$4D2256A5
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "FastLit";
+}
+CParticleRendererFeatureDesc	$1965E97D
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "ComputeVelocity";
+	Mandatory = true;
+}
+CParticleNodeTemplateExport	$E77669E8
+{
+	Description = {
+		"@eng:Billboard center in world coordinates",
+	};
+	InputPins = {
+		"$5CBFAD42",
+	};
+	OutputPins = {
+		"$31142BCB",
+	};
+	WorkspacePosition = int2(-572, -44);
+	ExportedName = "General.Position";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Input;
+	VisibleByDefault = true;
+	TransformSpace = World;
+	TransformMode = Position;
+	CategoryName = {
+		"@eng:General",
+	};
+}
+CParticleNodePinIn	$5CBFAD42
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$E77669E8";
+}
+CParticleNodePinOut	$31142BCB
+{
+	SelfName = "Value";
+	Owner = "$E77669E8";
+	ConnectedPins = {
+		"$4FEBCE12",
+	};
+}
+CParticleNodeTemplate	$C4E4E48D
+{
+	InputPins = {
+		"$4FEBCE12",
+	};
+	OutputPins = {
+		"$D2D64555",
+	};
+	WorkspacePosition = int2(-88, -44);
+	SubGraphFilePath = "Library/PopcornFXCore/Templates/Core.pkfx";
+	SubGraphName = "PreviousFrameValue";
+}
+CParticleNodePinIn	$4FEBCE12
+{
+	SelfName = "Value";
+	Owner = "$C4E4E48D";
+	ConnectedPins = {
+		"$31142BCB",
+	};
+}
+CParticleNodePinOut	$D2D64555
+{
+	SelfName = "Value";
+	Owner = "$C4E4E48D";
+	ConnectedPins = {
+		"$B3E0C62C",
+	};
+}
+CParticleNodeTemplateExport	$DAB8D703
+{
+	InputPins = {
+		"$B3E0C62C",
+	};
+	WorkspacePosition = int2(396, -44);
+	ExportedName = "ComputeVelocity.PreviousPosition";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Output;
+	TransformSpace = World;
+	TransformMode = Position;
+}
+CParticleNodePinIn	$B3E0C62C
+{
+	SelfName = "Value";
+	Owner = "$DAB8D703";
+	ConnectedPins = {
+		"$D2D64555",
+	};
+}

+ 214 - 0
PopcornFX/Library/PopcornFXCore/Materials/Billboard_Transparent.pkma

@@ -0,0 +1,214 @@
+Version = 2.20.1.21979;
+CParticleRendererMaterial	$6B70D015
+{
+	RendererFeatures = {
+		"$191F1761",
+		"$01BAF94F",
+		"$D857A09F",
+		"$5F3F8D5F",
+		"$3D324B43",
+		"$D851A09F",
+		"$EA3837ED",
+		"$C5F9C9BF",
+		"$4B933A29",
+		"$35A36C4E",
+		"$7FB4AB5F",
+		"$1098ED35",
+		"$EA331F29",
+		"$CAD62F46",
+		"$1DB717AE",
+		"$EAC726E3",
+		"$939CF4EC",
+	};
+	NodeGraph = "$D95B8AC1";
+}
+CParticleRendererFeatureDesc	$191F1761
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "GeometryBillboard";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$D857A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EnableRendering";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$5F3F8D5F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Transparent";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$3D324B43
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Diffuse";
+}
+CParticleRendererFeatureDesc	$D851A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "DiffuseRamp";
+}
+CParticleRendererFeatureDesc	$EA3837ED
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Lit";
+}
+CParticleRendererFeatureDesc	$C5F9C9BF
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "NormalWrap";
+}
+CParticleRendererFeatureDesc	$4B933A29
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "NormalBend";
+}
+CParticleRendererFeatureDesc	$35A36C4E
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Emissive";
+	EnabledByDefault = true;
+}
+CParticleRendererFeatureDesc	$7FB4AB5F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EmissiveRamp";
+}
+CParticleRendererFeatureDesc	$1098ED35
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "AlphaRemap";
+}
+CParticleRendererFeatureDesc	$EA331F29
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "SoftParticles";
+}
+CParticleRendererFeatureDesc	$CAD62F46
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Atlas";
+}
+CParticleRendererFeatureDesc	$1DB717AE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "BasicTransformUVs";
+}
+CParticleRendererFeatureDesc	$EAC726E3
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TransformUVs";
+}
+CRHIMaterialShaders	$00269EC3
+{
+	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
+}
+CParticleRendererFeatureDesc	$939CF4EC
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "FastLit";
+}
+CParticleNodeGraph	$D95B8AC1
+{
+	CustomName = "Adapter";
+	Nodes = {
+		"$B3A7E192",
+		"$48785299",
+		"$8AB1028B",
+	};
+	WorkspaceZoom = -4;
+}
+CParticleRendererFeatureDesc	$01BAF94F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "ComputeVelocity";
+	Mandatory = true;
+}
+CParticleNodeTemplateExport	$B3A7E192
+{
+	Description = {
+		"@eng:Billboard center in world coordinates",
+	};
+	InputPins = {
+		"$F6987F5C",
+	};
+	OutputPins = {
+		"$13AA435C",
+	};
+	WorkspacePosition = int2(-572, -44);
+	ExportedName = "General.Position";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Input;
+	VisibleByDefault = true;
+	TransformSpace = World;
+	TransformMode = Position;
+	CategoryName = {
+		"@eng:General",
+	};
+}
+CParticleNodePinIn	$F6987F5C
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$B3A7E192";
+}
+CParticleNodePinOut	$13AA435C
+{
+	SelfName = "Value";
+	Owner = "$B3A7E192";
+	ConnectedPins = {
+		"$0B413693",
+	};
+}
+CParticleNodeTemplate	$48785299
+{
+	InputPins = {
+		"$0B413693",
+	};
+	OutputPins = {
+		"$0CFC6437",
+	};
+	WorkspacePosition = int2(-88, -44);
+	SubGraphFilePath = "Library/PopcornFXCore/Templates/Core.pkfx";
+	SubGraphName = "PreviousFrameValue";
+}
+CParticleNodePinIn	$0B413693
+{
+	SelfName = "Value";
+	Owner = "$48785299";
+	ConnectedPins = {
+		"$13AA435C",
+	};
+}
+CParticleNodePinOut	$0CFC6437
+{
+	SelfName = "Value";
+	Owner = "$48785299";
+	ConnectedPins = {
+		"$457C5EEB",
+	};
+}
+CParticleNodeTemplateExport	$8AB1028B
+{
+	InputPins = {
+		"$457C5EEB",
+	};
+	WorkspacePosition = int2(396, -44);
+	ExportedName = "ComputeVelocity.PreviousPosition";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Output;
+	TransformSpace = World;
+	TransformMode = Position;
+}
+CParticleNodePinIn	$457C5EEB
+{
+	SelfName = "Value";
+	Owner = "$8AB1028B";
+	ConnectedPins = {
+		"$0CFC6437",
+	};
+}

+ 185 - 0
PopcornFX/Library/PopcornFXCore/Materials/Decal_Default.pkma

@@ -0,0 +1,185 @@
+Version = 2.20.1.21979;
+CParticleRendererMaterial	$6B70D015
+{
+	RendererFeatures = {
+		"$191F1761",
+		"$308C8FDE",
+		"$D857A09F",
+		"$0F57EEAC",
+		"$3D324B43",
+		"$D851A09F",
+		"$35A36C4E",
+		"$7FB4AB5F",
+		"$5A9EEFD8",
+		"$CAD62F46",
+		"$1DB717AE",
+		"$EAC726E3",
+	};
+	NodeGraph = "$9E1FA7C1";
+}
+CParticleRendererFeatureDesc	$191F1761
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "GeometryDecal";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$D857A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EnableRendering";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$3D324B43
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Diffuse";
+	EnabledByDefault = true;
+}
+CParticleRendererFeatureDesc	$D851A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "DiffuseRamp";
+}
+CParticleRendererFeatureDesc	$35A36C4E
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Emissive";
+}
+CParticleRendererFeatureDesc	$7FB4AB5F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EmissiveRamp";
+}
+CParticleRendererFeatureDesc	$CAD62F46
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Atlas";
+}
+CParticleRendererFeatureDesc	$1DB717AE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "BasicTransformUVs";
+}
+CParticleRendererFeatureDesc	$EAC726E3
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TransformUVs";
+}
+CRHIMaterialShaders	$00269EC3
+{
+	VertexShader = "Library/PopcornFXCore/Shaders/Decal_Default.vert";
+	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
+}
+CParticleRendererFeatureDesc	$0F57EEAC
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Decal";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$5A9EEFD8
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "AlphaRemap";
+}
+CParticleNodeGraph	$9E1FA7C1
+{
+	CustomName = "Adapter";
+	Nodes = {
+		"$5B64747F",
+		"$C184247A",
+		"$EABE99F1",
+	};
+	WorkspaceZoom = -4;
+}
+CParticleRendererFeatureDesc	$308C8FDE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "ComputeVelocity";
+	Mandatory = true;
+}
+CParticleNodeTemplateExport	$5B64747F
+{
+	Description = {
+		"@eng:Billboard center in world coordinates",
+	};
+	InputPins = {
+		"$3EF040D5",
+	};
+	OutputPins = {
+		"$23DAFBCD",
+	};
+	WorkspacePosition = int2(-572, -44);
+	ExportedName = "General.Position";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Input;
+	VisibleByDefault = true;
+	TransformSpace = World;
+	TransformMode = Position;
+	CategoryName = {
+		"@eng:General",
+	};
+}
+CParticleNodePinIn	$3EF040D5
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$5B64747F";
+}
+CParticleNodePinOut	$23DAFBCD
+{
+	SelfName = "Value";
+	Owner = "$5B64747F";
+	ConnectedPins = {
+		"$12B18407",
+	};
+}
+CParticleNodeTemplate	$C184247A
+{
+	InputPins = {
+		"$12B18407",
+	};
+	OutputPins = {
+		"$6B1F8BEC",
+	};
+	WorkspacePosition = int2(-88, -44);
+	SubGraphFilePath = "Library/PopcornFXCore/Templates/Core.pkfx";
+	SubGraphName = "PreviousFrameValue";
+}
+CParticleNodePinIn	$12B18407
+{
+	SelfName = "Value";
+	Owner = "$C184247A";
+	ConnectedPins = {
+		"$23DAFBCD",
+	};
+}
+CParticleNodePinOut	$6B1F8BEC
+{
+	SelfName = "Value";
+	Owner = "$C184247A";
+	ConnectedPins = {
+		"$1067BBF3",
+	};
+}
+CParticleNodeTemplateExport	$EABE99F1
+{
+	InputPins = {
+		"$1067BBF3",
+	};
+	WorkspacePosition = int2(396, -44);
+	ExportedName = "ComputeVelocity.PreviousPosition";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Output;
+	TransformSpace = World;
+	TransformMode = Position;
+}
+CParticleNodePinIn	$1067BBF3
+{
+	SelfName = "Value";
+	Owner = "$EABE99F1";
+	ConnectedPins = {
+		"$6B1F8BEC",
+	};
+}

+ 0 - 116
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Billboard/Billboard_Diffuse.pkma

@@ -1,116 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1761",
-		"$D857A09F",
-		"$5F3F8D5F",
-		"$3D324B43",
-		"$D851A09F",
-		"$EA3837ED",
-		"$C5F9C9BF",
-		"$4B933A29",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$1098ED35",
-		"$EA331F29",
-		"$CAD62F46",
-		"$1DB717AE",
-		"$EAC726E3",
-		"$0FEA2C5F",
-		"$8F800045",
-	};
-}
-CParticleRendererFeatureDesc	$191F1761
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryBillboard";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$5F3F8D5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Transparent";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$EA3837ED
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$C5F9C9BF
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalWrap";
-}
-CParticleRendererFeatureDesc	$4B933A29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalBend";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1098ED35
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}
-CParticleRendererFeatureDesc	$EA331F29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "SoftParticles";
-}
-CParticleRendererFeatureDesc	$CAD62F46
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Atlas";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0FEA2C5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Distortion";
-}
-CParticleRendererFeatureDesc	$8F800045
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Tint";
-}

+ 0 - 116
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Billboard/Billboard_Distortion.pkma

@@ -1,116 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1761",
-		"$D857A09F",
-		"$5F3F8D5F",
-		"$3D324B43",
-		"$D851A09F",
-		"$EA3837ED",
-		"$C5F9C9BF",
-		"$4B933A29",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$1098ED35",
-		"$EA331F29",
-		"$CAD62F46",
-		"$1DB717AE",
-		"$EAC726E3",
-		"$0FEA2C5F",
-		"$8F800045",
-	};
-}
-CParticleRendererFeatureDesc	$191F1761
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryBillboard";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$5F3F8D5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Transparent";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$EA3837ED
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$C5F9C9BF
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalWrap";
-}
-CParticleRendererFeatureDesc	$4B933A29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalBend";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1098ED35
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}
-CParticleRendererFeatureDesc	$EA331F29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "SoftParticles";
-}
-CParticleRendererFeatureDesc	$CAD62F46
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Atlas";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0FEA2C5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Distortion";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$8F800045
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Tint";
-}

+ 0 - 116
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Billboard/Billboard_Emissive.pkma

@@ -1,116 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1761",
-		"$D857A09F",
-		"$5F3F8D5F",
-		"$3D324B43",
-		"$D851A09F",
-		"$EA3837ED",
-		"$C5F9C9BF",
-		"$4B933A29",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$1098ED35",
-		"$EA331F29",
-		"$CAD62F46",
-		"$1DB717AE",
-		"$EAC726E3",
-		"$0FEA2C5F",
-		"$8F800045",
-	};
-}
-CParticleRendererFeatureDesc	$191F1761
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryBillboard";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$5F3F8D5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Transparent";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$EA3837ED
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$C5F9C9BF
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalWrap";
-}
-CParticleRendererFeatureDesc	$4B933A29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalBend";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1098ED35
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}
-CParticleRendererFeatureDesc	$EA331F29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "SoftParticles";
-}
-CParticleRendererFeatureDesc	$CAD62F46
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Atlas";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0FEA2C5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Distortion";
-}
-CParticleRendererFeatureDesc	$8F800045
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Tint";
-}

+ 0 - 102
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Billboard/Billboard_Opaque.pkma

@@ -1,102 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1761",
-		"$D857A09F",
-		"$0EBD49BE",
-		"$3D324B43",
-		"$D851A09F",
-		"$EA3837ED",
-		"$4B933A29",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$1098ED35",
-		"$CAD62F46",
-		"$1DB717AE",
-		"$EAC726E3",
-	};
-	NodeGraph = "$09FB01D9";
-}
-CParticleRendererFeatureDesc	$191F1761
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryBillboard";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$EA3837ED
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$4B933A29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalBend";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1098ED35
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}
-CParticleRendererFeatureDesc	$CAD62F46
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Atlas";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0EBD49BE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Opaque";
-	Mandatory = true;
-}
-CParticleNodeGraph	$09FB01D9
-{
-	CustomName = "Adapter";
-	WorkspaceZoom = -4;
-}
-CParticleNodePinOut	$33311BAE
-{
-	SelfName = "Value";
-}

+ 0 - 116
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Billboard/Billboard_Tinted.pkma

@@ -1,116 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1761",
-		"$D857A09F",
-		"$5F3F8D5F",
-		"$3D324B43",
-		"$D851A09F",
-		"$EA3837ED",
-		"$C5F9C9BF",
-		"$4B933A29",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$1098ED35",
-		"$EA331F29",
-		"$CAD62F46",
-		"$1DB717AE",
-		"$EAC726E3",
-		"$0FEA2C5F",
-		"$8F800045",
-	};
-}
-CParticleRendererFeatureDesc	$191F1761
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryBillboard";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$5F3F8D5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Transparent";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$EA3837ED
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$C5F9C9BF
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalWrap";
-}
-CParticleRendererFeatureDesc	$4B933A29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalBend";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1098ED35
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}
-CParticleRendererFeatureDesc	$EA331F29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "SoftParticles";
-}
-CParticleRendererFeatureDesc	$CAD62F46
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Atlas";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0FEA2C5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Distortion";
-}
-CParticleRendererFeatureDesc	$8F800045
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Tint";
-	Mandatory = true;
-}

+ 0 - 81
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Decal/Decal_Diffuse.pkma

@@ -1,81 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1761",
-		"$D857A09F",
-		"$0F57EEAC",
-		"$3D324B43",
-		"$D851A09F",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$5A9EEFD8",
-		"$CAD62F46",
-		"$1DB717AE",
-		"$EAC726E3",
-	};
-}
-CParticleRendererFeatureDesc	$191F1761
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryDecal";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$CAD62F46
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Atlas";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	VertexShader = "Library/PopcornFXCore/Shaders/Experimental/Decal_Default.vert";
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0F57EEAC
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Decal";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$5A9EEFD8
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}

+ 0 - 93
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Mesh/Mesh_Emissive.pkma

@@ -1,93 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1761",
-		"$D857A09F",
-		"$008ACB56",
-		"$93540081",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$337C6546",
-		"$1DB717AE",
-		"$EAC726E3",
-		"$1BCA2B7D",
-		"$B040E9CD",
-		"$862F644E",
-		"$98B9ED49",
-	};
-}
-CParticleRendererFeatureDesc	$191F1761
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryMesh";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$1BCA2B7D
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TextureRepeat";
-}
-CParticleRendererFeatureDesc	$B040E9CD
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "MeshAtlas";
-}
-CParticleRendererFeatureDesc	$862F644E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "UseVertexColors";
-}
-CParticleRendererFeatureDesc	$93540081
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Transparent";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$98B9ED49
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "SoftParticles";
-}
-CParticleRendererFeatureDesc	$337C6546
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Atlas";
-}
-CParticleRendererFeatureDesc	$008ACB56
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Culling";
-	Mandatory = true;
-}

+ 0 - 111
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Mesh/Mesh_Opaque.pkma

@@ -1,111 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1761",
-		"$D857A09F",
-		"$D8481107",
-		"$A357A567",
-		"$3D324B43",
-		"$D851A09F",
-		"$EA3837ED",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$CB4D3C7E",
-		"$1098ED35",
-		"$1DB717AE",
-		"$EAC726E3",
-		"$1BCA2B7D",
-		"$B040E9CD",
-		"$862F644E",
-	};
-}
-CParticleRendererFeatureDesc	$191F1761
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryMesh";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$EA3837ED
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1098ED35
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$A357A567
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Opaque";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$1BCA2B7D
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TextureRepeat";
-}
-CParticleRendererFeatureDesc	$B040E9CD
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "MeshAtlas";
-}
-CParticleRendererFeatureDesc	$862F644E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "UseVertexColors";
-}
-CParticleRendererFeatureDesc	$CB4D3C7E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Atlas";
-}
-CParticleRendererFeatureDesc	$D8481107
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Culling";
-	Mandatory = true;
-}

+ 0 - 105
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Mesh/Mesh_Tinted.pkma

@@ -1,105 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1761",
-		"$D857A09F",
-		"$57E15DDC",
-		"$93540081",
-		"$B9161D10",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$0A9DCEA3",
-		"$1DB717AE",
-		"$EAC726E3",
-		"$1BCA2B7D",
-		"$B040E9CD",
-		"$862F644E",
-		"$98B9ED49",
-		"$F36FE1CF",
-	};
-}
-CParticleRendererFeatureDesc	$191F1761
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryMesh";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$1BCA2B7D
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TextureRepeat";
-}
-CParticleRendererFeatureDesc	$B040E9CD
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "MeshAtlas";
-}
-CParticleRendererFeatureDesc	$862F644E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "UseVertexColors";
-}
-CParticleRendererFeatureDesc	$93540081
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Transparent";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$98B9ED49
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "SoftParticles";
-}
-CParticleRendererFeatureDesc	$F36FE1CF
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Tint";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$B9161D10
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$0A9DCEA3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Atlas";
-}
-CParticleRendererFeatureDesc	$57E15DDC
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Culling";
-	Mandatory = true;
-}

+ 0 - 129
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_CorrectDeformation_Diffuse.pkma

@@ -1,129 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1492",
-		"$D857A09F",
-		"$5F3F8D5F",
-		"$DCD8A7E7",
-		"$3D324B43",
-		"$D851A09F",
-		"$EA3837ED",
-		"$C5F9C9BF",
-		"$4B933A29",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$1098ED35",
-		"$EA331F29",
-		"$1DB717AE",
-		"$EAC726E3",
-		"$0FEA2C5F",
-		"$DCD8B8C4",
-		"$8F800045",
-		"$860D8229",
-	};
-}
-CParticleRendererFeatureDesc	$191F1492
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryRibbon";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$5F3F8D5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Transparent";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$EA3837ED
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$C5F9C9BF
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalWrap";
-}
-CParticleRendererFeatureDesc	$4B933A29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalBend";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1098ED35
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}
-CParticleRendererFeatureDesc	$EA331F29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "SoftParticles";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0FEA2C5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Distortion";
-}
-CParticleRendererFeatureDesc	$8F800045
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Tint";
-}
-CParticleRendererFeatureDesc	$DCD8B8C4
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "CustomTextureU";
-}
-CParticleRendererFeatureDesc	$DCD8A7E7
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "CorrectDeformation";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$860D8229
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TextureRepeat";
-}

+ 0 - 129
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_CorrectDeformation_Distortion.pkma

@@ -1,129 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1492",
-		"$D857A09F",
-		"$5F3F8D5F",
-		"$DCD8A7E7",
-		"$3D324B43",
-		"$D851A09F",
-		"$EA3837ED",
-		"$C5F9C9BF",
-		"$4B933A29",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$1098ED35",
-		"$EA331F29",
-		"$1DB717AE",
-		"$EAC726E3",
-		"$0FEA2C5F",
-		"$DCD8B8C4",
-		"$8F800045",
-		"$860D8229",
-	};
-}
-CParticleRendererFeatureDesc	$191F1492
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryRibbon";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$5F3F8D5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Transparent";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$EA3837ED
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$C5F9C9BF
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalWrap";
-}
-CParticleRendererFeatureDesc	$4B933A29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalBend";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1098ED35
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}
-CParticleRendererFeatureDesc	$EA331F29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "SoftParticles";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0FEA2C5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Distortion";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$8F800045
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Tint";
-}
-CParticleRendererFeatureDesc	$DCD8B8C4
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "CustomTextureU";
-}
-CParticleRendererFeatureDesc	$DCD8A7E7
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "CorrectDeformation";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$860D8229
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TextureRepeat";
-}

+ 0 - 129
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_CorrectDeformation_Emissive.pkma

@@ -1,129 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1492",
-		"$D857A09F",
-		"$5F3F8D5F",
-		"$DCD8A7E7",
-		"$3D324B43",
-		"$D851A09F",
-		"$EA3837ED",
-		"$C5F9C9BF",
-		"$4B933A29",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$1098ED35",
-		"$EA331F29",
-		"$1DB717AE",
-		"$EAC726E3",
-		"$0FEA2C5F",
-		"$DCD8B8C4",
-		"$8F800045",
-		"$860D8229",
-	};
-}
-CParticleRendererFeatureDesc	$191F1492
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryRibbon";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$5F3F8D5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Transparent";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$EA3837ED
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$C5F9C9BF
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalWrap";
-}
-CParticleRendererFeatureDesc	$4B933A29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalBend";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1098ED35
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}
-CParticleRendererFeatureDesc	$EA331F29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "SoftParticles";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0FEA2C5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Distortion";
-}
-CParticleRendererFeatureDesc	$8F800045
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Tint";
-}
-CParticleRendererFeatureDesc	$DCD8B8C4
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "CustomTextureU";
-}
-CParticleRendererFeatureDesc	$DCD8A7E7
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "CorrectDeformation";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$860D8229
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TextureRepeat";
-}

+ 0 - 110
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_CorrectDeformation_Opaque.pkma

@@ -1,110 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191A1915",
-		"$D857A09F",
-		"$0EBD49BE",
-		"$3D324B43",
-		"$D851A09F",
-		"$EA3837ED",
-		"$4B933A29",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$1098ED35",
-		"$1DB717AE",
-		"$D2F84E07",
-		"$DCD8B8C4",
-		"$DCD8A7E7",
-		"$860D8229",
-	};
-}
-CParticleRendererFeatureDesc	$191A1915
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryRibbon";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$EA3837ED
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$4B933A29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalBend";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1098ED35
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0EBD49BE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Opaque";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$DCD8B8C4
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "CustomTextureU";
-}
-CParticleRendererFeatureDesc	$DCD8A7E7
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "CorrectDeformation";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D2F84E07
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CParticleRendererFeatureDesc	$860D8229
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TextureRepeat";
-}

+ 0 - 129
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_CorrectDeformation_Tinted.pkma

@@ -1,129 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1492",
-		"$D857A09F",
-		"$5F3F8D5F",
-		"$DCD8A7E7",
-		"$3D324B43",
-		"$D851A09F",
-		"$EA3837ED",
-		"$C5F9C9BF",
-		"$4B933A29",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$1098ED35",
-		"$EA331F29",
-		"$1DB717AE",
-		"$EAC726E3",
-		"$0FEA2C5F",
-		"$DCD8B8C4",
-		"$8F800045",
-		"$860D8229",
-	};
-}
-CParticleRendererFeatureDesc	$191F1492
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryRibbon";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$5F3F8D5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Transparent";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$EA3837ED
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$C5F9C9BF
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalWrap";
-}
-CParticleRendererFeatureDesc	$4B933A29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalBend";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1098ED35
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}
-CParticleRendererFeatureDesc	$EA331F29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "SoftParticles";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0FEA2C5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Distortion";
-}
-CParticleRendererFeatureDesc	$8F800045
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Tint";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$DCD8B8C4
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "CustomTextureU";
-}
-CParticleRendererFeatureDesc	$DCD8A7E7
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "CorrectDeformation";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$860D8229
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TextureRepeat";
-}

+ 0 - 128
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_Diffuse.pkma

@@ -1,128 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1492",
-		"$D857A09F",
-		"$5F3F8D5F",
-		"$3D324B43",
-		"$D851A09F",
-		"$EA3837ED",
-		"$C5F9C9BF",
-		"$4B933A29",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$1098ED35",
-		"$EA331F29",
-		"$CAD62F46",
-		"$1DB717AE",
-		"$EAC726E3",
-		"$0FEA2C5F",
-		"$8F800045",
-		"$DCD8B8C4",
-		"$860D8229",
-	};
-}
-CParticleRendererFeatureDesc	$191F1492
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryRibbon";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$5F3F8D5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Transparent";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$EA3837ED
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$C5F9C9BF
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalWrap";
-}
-CParticleRendererFeatureDesc	$4B933A29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalBend";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1098ED35
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}
-CParticleRendererFeatureDesc	$EA331F29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "SoftParticles";
-}
-CParticleRendererFeatureDesc	$CAD62F46
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Atlas";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0FEA2C5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Distortion";
-}
-CParticleRendererFeatureDesc	$8F800045
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Tint";
-}
-CParticleRendererFeatureDesc	$DCD8B8C4
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "CustomTextureU";
-}
-CParticleRendererFeatureDesc	$860D8229
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TextureRepeat";
-}

+ 0 - 128
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_Distortion.pkma

@@ -1,128 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1492",
-		"$D857A09F",
-		"$5F3F8D5F",
-		"$3D324B43",
-		"$D851A09F",
-		"$EA3837ED",
-		"$C5F9C9BF",
-		"$4B933A29",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$1098ED35",
-		"$EA331F29",
-		"$CAD62F46",
-		"$1DB717AE",
-		"$EAC726E3",
-		"$0FEA2C5F",
-		"$8F800045",
-		"$DCD8B8C4",
-		"$860D8229",
-	};
-}
-CParticleRendererFeatureDesc	$191F1492
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryRibbon";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$5F3F8D5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Transparent";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$EA3837ED
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$C5F9C9BF
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalWrap";
-}
-CParticleRendererFeatureDesc	$4B933A29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalBend";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1098ED35
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}
-CParticleRendererFeatureDesc	$EA331F29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "SoftParticles";
-}
-CParticleRendererFeatureDesc	$CAD62F46
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Atlas";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0FEA2C5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Distortion";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$8F800045
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Tint";
-}
-CParticleRendererFeatureDesc	$DCD8B8C4
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "CustomTextureU";
-}
-CParticleRendererFeatureDesc	$860D8229
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TextureRepeat";
-}

+ 0 - 128
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_Emissive.pkma

@@ -1,128 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1492",
-		"$D857A09F",
-		"$5F3F8D5F",
-		"$3D324B43",
-		"$D851A09F",
-		"$EA3837ED",
-		"$C5F9C9BF",
-		"$4B933A29",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$1098ED35",
-		"$EA331F29",
-		"$CAD62F46",
-		"$1DB717AE",
-		"$EAC726E3",
-		"$0FEA2C5F",
-		"$8F800045",
-		"$DCD8B8C4",
-		"$860D8229",
-	};
-}
-CParticleRendererFeatureDesc	$191F1492
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryRibbon";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$5F3F8D5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Transparent";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$EA3837ED
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$C5F9C9BF
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalWrap";
-}
-CParticleRendererFeatureDesc	$4B933A29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalBend";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1098ED35
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}
-CParticleRendererFeatureDesc	$EA331F29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "SoftParticles";
-}
-CParticleRendererFeatureDesc	$CAD62F46
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Atlas";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0FEA2C5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Distortion";
-}
-CParticleRendererFeatureDesc	$8F800045
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Tint";
-}
-CParticleRendererFeatureDesc	$DCD8B8C4
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "CustomTextureU";
-}
-CParticleRendererFeatureDesc	$860D8229
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TextureRepeat";
-}

+ 0 - 104
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_Opaque.pkma

@@ -1,104 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191A1915",
-		"$D857A09F",
-		"$0EBD49BE",
-		"$3D324B43",
-		"$D851A09F",
-		"$EA3837ED",
-		"$4B933A29",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$1098ED35",
-		"$CAD62F46",
-		"$1DB717AE",
-		"$EAC726E3",
-		"$DCD8B8C4",
-		"$860D8229",
-	};
-}
-CParticleRendererFeatureDesc	$191A1915
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryRibbon";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$EA3837ED
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$4B933A29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalBend";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1098ED35
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}
-CParticleRendererFeatureDesc	$CAD62F46
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Atlas";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0EBD49BE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Opaque";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$DCD8B8C4
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "CustomTextureU";
-}
-CParticleRendererFeatureDesc	$860D8229
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TextureRepeat";
-}

+ 0 - 128
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Ribbon/Ribbon_Tinted.pkma

@@ -1,128 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1492",
-		"$D857A09F",
-		"$5F3F8D5F",
-		"$3D324B43",
-		"$D851A09F",
-		"$EA3837ED",
-		"$C5F9C9BF",
-		"$4B933A29",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$1098ED35",
-		"$EA331F29",
-		"$CAD62F46",
-		"$1DB717AE",
-		"$EAC726E3",
-		"$0FEA2C5F",
-		"$8F800045",
-		"$DCD8B8C4",
-		"$860D8229",
-	};
-}
-CParticleRendererFeatureDesc	$191F1492
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryRibbon";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$5F3F8D5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Transparent";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$EA3837ED
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$C5F9C9BF
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalWrap";
-}
-CParticleRendererFeatureDesc	$4B933A29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalBend";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1098ED35
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}
-CParticleRendererFeatureDesc	$EA331F29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "SoftParticles";
-}
-CParticleRendererFeatureDesc	$CAD62F46
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Atlas";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0FEA2C5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Distortion";
-}
-CParticleRendererFeatureDesc	$8F800045
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Tint";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$DCD8B8C4
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "CustomTextureU";
-}
-CParticleRendererFeatureDesc	$860D8229
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TextureRepeat";
-}

+ 0 - 128
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Triangle/Triangle_Distortion.pkma

@@ -1,128 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1761",
-		"$D857A09F",
-		"$5F3F8D5F",
-		"$3D324B43",
-		"$D851A09F",
-		"$EA3837ED",
-		"$C5F9C9BF",
-		"$4B933A29",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$1098ED35",
-		"$EA331F29",
-		"$1DB717AE",
-		"$EAC726E3",
-		"$0FEA2C5F",
-		"$8F800045",
-		"$FD189ED3",
-		"$DA06D7A4",
-		"$860D8229",
-	};
-}
-CParticleRendererFeatureDesc	$191F1761
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryTriangle";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$5F3F8D5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Transparent";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$EA3837ED
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$C5F9C9BF
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalWrap";
-}
-CParticleRendererFeatureDesc	$4B933A29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalBend";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1098ED35
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}
-CParticleRendererFeatureDesc	$EA331F29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "SoftParticles";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0FEA2C5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Distortion";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$8F800045
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Tint";
-}
-CParticleRendererFeatureDesc	$FD189ED3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TriangleCustomNormals";
-}
-CParticleRendererFeatureDesc	$DA06D7A4
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TriangleCustomUVs";
-}
-CParticleRendererFeatureDesc	$860D8229
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TextureRepeat";
-}

+ 0 - 128
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Triangle/Triangle_Emissive.pkma

@@ -1,128 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1761",
-		"$D857A09F",
-		"$5F3F8D5F",
-		"$3D324B43",
-		"$D851A09F",
-		"$EA3837ED",
-		"$C5F9C9BF",
-		"$4B933A29",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$1098ED35",
-		"$EA331F29",
-		"$1DB717AE",
-		"$EAC726E3",
-		"$0FEA2C5F",
-		"$8F800045",
-		"$FD189ED3",
-		"$DA06D7A4",
-		"$860D8229",
-	};
-}
-CParticleRendererFeatureDesc	$191F1761
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryTriangle";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$5F3F8D5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Transparent";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$EA3837ED
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$C5F9C9BF
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalWrap";
-}
-CParticleRendererFeatureDesc	$4B933A29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalBend";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1098ED35
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}
-CParticleRendererFeatureDesc	$EA331F29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "SoftParticles";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0FEA2C5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Distortion";
-}
-CParticleRendererFeatureDesc	$8F800045
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Tint";
-}
-CParticleRendererFeatureDesc	$FD189ED3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TriangleCustomNormals";
-}
-CParticleRendererFeatureDesc	$DA06D7A4
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TriangleCustomUVs";
-}
-CParticleRendererFeatureDesc	$860D8229
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TextureRepeat";
-}

+ 0 - 128
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Triangle/Triangle_Tinted.pkma

@@ -1,128 +0,0 @@
-Version = 2.19.0.20559;
-CParticleRendererMaterial	$6B70D015
-{
-	RendererFeatures = {
-		"$191F1761",
-		"$D857A09F",
-		"$5F3F8D5F",
-		"$3D324B43",
-		"$D851A09F",
-		"$EA3837ED",
-		"$C5F9C9BF",
-		"$4B933A29",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$1098ED35",
-		"$EA331F29",
-		"$1DB717AE",
-		"$EAC726E3",
-		"$0FEA2C5F",
-		"$8F800045",
-		"$FD189ED3",
-		"$DA06D7A4",
-		"$860D8229",
-	};
-}
-CParticleRendererFeatureDesc	$191F1761
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryTriangle";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$D857A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EnableRendering";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$5F3F8D5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Transparent";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$3D324B43
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
-}
-CParticleRendererFeatureDesc	$D851A09F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
-}
-CParticleRendererFeatureDesc	$EA3837ED
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Lit";
-}
-CParticleRendererFeatureDesc	$C5F9C9BF
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalWrap";
-}
-CParticleRendererFeatureDesc	$4B933A29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "NormalBend";
-}
-CParticleRendererFeatureDesc	$35A36C4E
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-}
-CParticleRendererFeatureDesc	$7FB4AB5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
-}
-CParticleRendererFeatureDesc	$1098ED35
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "AlphaRemap";
-}
-CParticleRendererFeatureDesc	$EA331F29
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "SoftParticles";
-}
-CParticleRendererFeatureDesc	$1DB717AE
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
-}
-CParticleRendererFeatureDesc	$EAC726E3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
-}
-CRHIMaterialShaders	$00269EC3
-{
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0FEA2C5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Distortion";
-}
-CParticleRendererFeatureDesc	$8F800045
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Tint";
-	Mandatory = true;
-}
-CParticleRendererFeatureDesc	$FD189ED3
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TriangleCustomNormals";
-}
-CParticleRendererFeatureDesc	$DA06D7A4
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TriangleCustomUVs";
-}
-CParticleRendererFeatureDesc	$860D8229
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TextureRepeat";
-}

+ 1275 - 16
PopcornFX/Library/PopcornFXCore/Materials/Interface/Experimental.pkri → PopcornFX/Library/PopcornFXCore/Materials/Interface/Default.pkri

@@ -1,7 +1,7 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CEngineRendererInterface	$6B70D015
 {
-	InterfaceName = "Experimental material features";
+	InterfaceName = "Default features";
 	RendererFeatures = {
 		"$D6EEA348",
 		"$81861AB7",
@@ -18,6 +18,7 @@ CEngineRendererInterface	$6B70D015
 		"$1838F4AE",
 		"$52697627",
 		"$123456AC",
+		"$877C71C6",
 		"$D857A09F",
 		"$047497F3",
 		"$D6BEA348",
@@ -42,6 +43,10 @@ CEngineRendererInterface	$6B70D015
 		"$0E3ACA6C",
 		"$61D82A82",
 		"$2E50A861",
+		"$92603AB6",
+		"$658C0852",
+		"$B2A34B8E",
+		"$AC4D205A",
 	};
 }
 CParticleRendererFeature	$81861AB7
@@ -599,11 +604,6 @@ CParticleNodeTemplateExport	$353B08E3
 		"CameraDistance",
 		"ByCustomValue",
 	};
-	PinRules = Rule1;
-	RuleResult = Hidden;
-	DependentProperty = "Transparent.Type";
-	RuleFunction = Lower;
-	RuleValue = "2";
 }
 CParticleNodePinIn	$353B08EF
 {
@@ -628,12 +628,9 @@ CParticleNodeTemplateExport	$9AA9404E
 	CategoryName = {
 		"@eng:Transparent",
 	};
-	PinRules = Rule1_OR_Rule2;
+	PinRules = Rule1;
 	RuleResult = Hidden;
 	DependentProperty = "Transparent.SortMode";
-	DependentProperty2 = "Transparent.Type";
-	RuleFunction2 = Lower;
-	RuleValue2 = "2";
 }
 CParticleNodePinIn	$9AA9404F
 {
@@ -891,7 +888,7 @@ CParticleNodeTemplateExport	$BDABEA0C
 		"$2496386F",
 	};
 	ExportedName = "Distortion.DistortionColor";
-	ExportedType = float4;
+	ExportedType = float3;
 	Semantic = Color;
 	Type = Input;
 	CategoryName = {
@@ -1771,6 +1768,9 @@ CParticleNodeTemplateExport	$6CCCA72B
 		"@eng:Lit",
 	};
 	DefaultValueData = "Library/PopcornFXCore/Materials/DefaultTextures/NMap_Flat.dds";
+	PinRules = Rule1;
+	DependentProperty = "FastLit";
+	RuleFunction = Greater;
 }
 CParticleNodePinIn	$6CCCA72E
 {
@@ -1799,6 +1799,9 @@ CParticleNodeTemplateExport	$C7760456
 	HasMax = true;
 	UseSlider = true;
 	MaxValueF4 = float4(1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00);
+	PinRules = Rule1;
+	DependentProperty = "FastLit";
+	RuleFunction = Greater;
 }
 CParticleNodePinIn	$FF012345
 {
@@ -1829,6 +1832,9 @@ CParticleNodeTemplateExport	$C7760457
 	DefaultValueF4 = float4(1.0000000e+00, 5.0000000e-01, 5.0000000e-01, 5.0000000e-01);
 	MinValueF4 = float4(0.0000000e+00, 4.9999997e-02, 4.9999997e-02, 4.9999997e-02);
 	MaxValueF4 = float4(1.0000000e+00, 1.0000000e+00, 1.0000000e+00, 1.0000000e+00);
+	PinRules = Rule1;
+	DependentProperty = "FastLit";
+	RuleFunction = Greater;
 }
 CParticleNodePinIn	$FF012346
 {
@@ -1853,6 +1859,9 @@ CParticleNodeTemplateExport	$43290D5D
 		"@eng:Lit",
 	};
 	DefaultValueData = "Library/PopcornFXCore/Materials/DefaultTextures/White.dds";
+	PinRules = Rule1;
+	DependentProperty = "FastLit";
+	RuleFunction = Greater;
 }
 CParticleNodePinIn	$43290FFF
 {
@@ -1975,6 +1984,11 @@ CRHIRenderingSettings	$6DF50834
 		"$DD26542E",
 		"$A2DFDBD4",
 		"$E2B7FC43",
+		"$4C221782",
+		"$AEC066F0",
+		"$DDA74FDA",
+		"$BACDFB61",
+		"$DC5BC92F",
 	};
 }
 CRHIRenderingFeature	$EA67A6E3
@@ -2071,6 +2085,8 @@ CRHIRenderingFeature	$7FCFBFA6
 	UseUV = true;
 	PropertiesAsShaderConstants = {
 		"RotateUV",
+		"FlipU",
+		"FlipV",
 	};
 }
 CRHIRenderingFeature	$0B924B6C
@@ -2271,6 +2287,7 @@ CParticleRendererFeature	$52697627
 	Feature = "$256FAC76";
 	Properties = {
 		"$CB2631EB",
+		"$75B2AAF6",
 	};
 }
 CParticleNodeTemplateExport	$256FAC76
@@ -2299,7 +2316,7 @@ CParticleNodePinOut	$122F1C88
 CParticleNodeTemplateExport	$CB2631EB
 {
 	Description = {
-		"@eng:1D texture map used tor for diffuse color remap.\\nSampled with the <c>Red<c> channel of the <c>DiffuseMap</c> texture.",
+		"@eng:2D texture map used tor for diffuse color remap.\\nSampled with the <c>Red<c> channel of the <c>DiffuseMap</c> texture as the U axis coordinate.\\n It will sample the <c>Alpha</c> channel instead if the AlphaMasks feature is enabled with the AnimatedMasks material. Sampling on the V axis is done by the RampVAxis attribute.",
 	};
 	InputPins = {
 		"$7042442B",
@@ -2409,7 +2426,7 @@ CParticleNodeTemplateExport	$9D2B1A2F
 		"$F94B139E",
 	};
 	ExportedName = "Emissive.EmissiveColor";
-	ExportedType = float3;
+	ExportedType = float4;
 	Semantic = Color;
 	Type = Input;
 	CategoryName = {
@@ -2423,6 +2440,7 @@ CParticleRendererFeature	$55289D1E
 	Feature = "$EC84D339";
 	Properties = {
 		"$89E0DDB2",
+		"$87EA141D",
 	};
 }
 CParticleNodeTemplateExport	$EC84D339
@@ -2451,7 +2469,7 @@ CParticleNodePinOut	$14978373
 CParticleNodeTemplateExport	$89E0DDB2
 {
 	Description = {
-		"@eng:1D texture map used tor for emissive color remap.\\nSampled with the <c>Red<c> channel of the <c>EmissiveMap</c> texture.",
+		"@eng:2D texture map used tor for emissive color remap.\\nSampled with the <c>Red<c> channel of the <c>EmissiveMap</c> texture as the U axis coordinate. Sampling on the V axis is done with Ramp V Axis.",
 	};
 	InputPins = {
 		"$7E054BB9",
@@ -3129,6 +3147,7 @@ CParticleRendererFeature	$23F9C093
 	Feature = "$183B52A9";
 	Properties = {
 		"$D9B8D88C",
+		"$890A2ABA",
 		"$9A821802",
 		"$272AD0C9",
 		"$3235C787",
@@ -3166,6 +3185,7 @@ CRHIRenderingFeature	$1749C465
 		"UVRotate",
 		"UVScale",
 		"RGBOnly",
+		"RotationCenter",
 	};
 }
 CParticleNodeTemplateExport	$D9B8D88C
@@ -4001,6 +4021,9 @@ CParticleNodeTemplateExport	$5928161E
 		"Solid",
 		"Transparent",
 	};
+	PinRules = Rule1;
+	DependentProperty = "FastLit";
+	RuleFunction = Greater;
 }
 CParticleNodePinIn	$AAD9158D
 {
@@ -4316,7 +4339,7 @@ CParticleNodeTemplateExport	$CE2F5487
 	HasMax = true;
 	UseSlider = true;
 	MaxValueF4 = float4(1.0000000e+00, 1.0000000e+00, 0.0000000e+00, 0.0000000e+00);
-	BaseVisibility = Disabled;
+	BaseVisibility = Hidden;
 	RuleResult = Visible;
 	DependentProperty = "Opaque.Type";
 	RuleValue = "2";
@@ -4509,3 +4532,1239 @@ CParticleNodePinOut	$2D0B75A0
 	SelfName = "Value";
 	Owner = "$FA60E0CE";
 }
+CParticleNodeTemplateExport	$890A2ABA
+{
+	InputPins = {
+		"$7909085C",
+	};
+	OutputPins = {
+		"$875729E3",
+	};
+	ExportedName = "TransformUVs.RotationCenter";
+	ExportedType = float2;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:TransformUVs",
+	};
+	DefaultValueF4 = float4(5.0000000e-01, 5.0000000e-01, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$7909085C
+{
+	SelfName = "DefaultValue";
+	Owner = "$890A2ABA";
+}
+CParticleNodePinOut	$875729E3
+{
+	SelfName = "Value";
+	Owner = "$890A2ABA";
+}
+CParticleNodeTemplateExport	$75B2AAF6
+{
+	Description = {
+		"@eng:Per-particle V axis coordinate that samples the Ramp Map.",
+	};
+	InputPins = {
+		"$53FE6244",
+	};
+	OutputPins = {
+		"$E135F748",
+	};
+	ExportedName = "DiffuseRamp.RampVAxis";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:DiffuseRamp",
+	};
+	HasMin = true;
+	HasMax = true;
+	DefaultValueF4 = float4(5.0000000e-01, 1.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+	MaxValueF4 = float4(1.0000000e+00, 1.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$53FE6244
+{
+	SelfName = "DefaultValue";
+	Owner = "$75B2AAF6";
+}
+CParticleNodePinOut	$E135F748
+{
+	SelfName = "Value";
+	Owner = "$75B2AAF6";
+}
+CParticleNodeTemplateExport	$87EA141D
+{
+	Description = {
+		"@eng:Per-particle V axis coordinate that samples the Ramp Map.",
+	};
+	InputPins = {
+		"$E55CB975",
+	};
+	OutputPins = {
+		"$DD583DA0",
+	};
+	ExportedName = "EmissiveRamp.RampVAxis";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:EmissiveRamp",
+	};
+	HasMin = true;
+	HasMax = true;
+	DefaultValueF4 = float4(5.0000000e-01, 1.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+	MaxValueF4 = float4(1.0000000e+00, 1.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$E55CB975
+{
+	SelfName = "DefaultValue";
+	Owner = "$87EA141D";
+}
+CParticleNodePinOut	$DD583DA0
+{
+	SelfName = "Value";
+	Owner = "$87EA141D";
+}
+CParticleRendererFeature	$92603AB6
+{
+	FeatureName = "UVDistortions";
+	Feature = "$9C89EB73";
+	Properties = {
+		"$0E61A71C",
+		"$96B1DB4E",
+		"$C2228868",
+		"$586A2F1F",
+		"$BC72DAAE",
+		"$475BB5ED",
+		"$7FBA4C98",
+		"$49646E4D",
+		"$DFEABF62",
+		"$382A30CD",
+		"$58B4EEAF",
+		"$948744AC",
+	};
+}
+CParticleNodeTemplateExport	$9C89EB73
+{
+	InputPins = {
+		"$E1074682",
+	};
+	OutputPins = {
+		"$A9E39C6B",
+	};
+	ExportedName = "UVDistortions";
+	ExportedType = bool;
+	Type = Input;
+	InputType = Property;
+}
+CParticleNodePinIn	$E1074682
+{
+	SelfName = "DefaultValue";
+	Owner = "$9C89EB73";
+}
+CParticleNodePinOut	$A9E39C6B
+{
+	SelfName = "Value";
+	Owner = "$9C89EB73";
+}
+CRHIRenderingFeature	$4C221782
+{
+	FeatureName = "UVDistortions";
+	UseUV = true;
+	PropertiesAsShaderConstants = {
+		"Distortion1Intensity",
+		"Distortion2TranslationSpeed",
+		"Distortion1Map",
+		"Distortion1Scale",
+		"Distortion1RotationSpeed",
+		"Distortion1TranslationSpeed",
+		"Distortion2Intensity",
+		"Distortion2RotationSpeed",
+		"Distortion2Map",
+		"Distortion2Scale",
+	};
+	TexturesUsedAsLookUp = {
+		"Distortion1Map",
+		"Distortion2Map",
+	};
+}
+CParticleNodeTemplateExport	$475BB5ED
+{
+	Description = {
+		"@eng:Distortion texture map.\\nOffsets the diffuse map, emissive map, normal map, metalrough map and alphamasks maps UVs by the 2D vector formed by the red and green channel.\\nIs added with the Distortion 2 Map sample.",
+	};
+	InputPins = {
+		"$5830513D",
+	};
+	OutputPins = {
+		"$579CC972",
+	};
+	ExportedName = "UVDistortions.Distortion1Map";
+	ExportedType = dataImage;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+	DefaultValueData = "Library/PopcornFXCore/Materials/DefaultTextures/Distort.dds";
+}
+CParticleNodePinIn	$5830513D
+{
+	SelfName = "DefaultValue";
+	Owner = "$475BB5ED";
+}
+CParticleNodePinOut	$579CC972
+{
+	SelfName = "Value";
+	Owner = "$475BB5ED";
+}
+CParticleNodeTemplateExport	$0E61A71C
+{
+	Description = {
+		"@eng:Multiplier applied to the Distortion 1 Map samples.",
+	};
+	InputPins = {
+		"$E5A1AC03",
+	};
+	OutputPins = {
+		"$995D2CBA",
+	};
+	ExportedName = "UVDistortions.Distortion1Intensity";
+	ExportedType = float;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+	HasMin = true;
+	DefaultValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$E5A1AC03
+{
+	SelfName = "DefaultValue";
+	Owner = "$0E61A71C";
+}
+CParticleNodePinOut	$995D2CBA
+{
+	SelfName = "Value";
+	Owner = "$0E61A71C";
+}
+CParticleNodeTemplateExport	$96B1DB4E
+{
+	Description = {
+		"@eng:UV Scaling for the Distortion 1 Map samples.",
+	};
+	InputPins = {
+		"$27161200",
+	};
+	OutputPins = {
+		"$7F811796",
+	};
+	ExportedName = "UVDistortions.Distortion1Scale";
+	ExportedType = float2;
+	Semantic = 3D_Scale;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+	DefaultValueF4 = float4(1.0000000e+00, 1.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$27161200
+{
+	SelfName = "DefaultValue";
+	Owner = "$96B1DB4E";
+}
+CParticleNodePinOut	$7F811796
+{
+	SelfName = "Value";
+	Owner = "$96B1DB4E";
+}
+CParticleNodeTemplateExport	$C2228868
+{
+	Description = {
+		"@eng:UV rotation speed around the rotation center 0.5, 0.5.\\nThis multiplier is applied to the Distortion 1 Animation Cursor to compute the UV rotation of the Distortion 1 Map samples.",
+	};
+	InputPins = {
+		"$8B8EF6E7",
+	};
+	OutputPins = {
+		"$3AADCE27",
+	};
+	ExportedName = "UVDistortions.Distortion1RotationSpeed";
+	ExportedType = float;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+}
+CParticleNodePinIn	$8B8EF6E7
+{
+	SelfName = "DefaultValue";
+	Owner = "$C2228868";
+}
+CParticleNodePinOut	$3AADCE27
+{
+	SelfName = "Value";
+	Owner = "$C2228868";
+}
+CParticleNodeTemplateExport	$586A2F1F
+{
+	Description = {
+		"@eng:UV translation speed.\\nThis multiplier is applied to the Distortion 1 Animation Cursor to compute the UV translation of the Distortion 1 Map samples.",
+	};
+	InputPins = {
+		"$746BA550",
+	};
+	OutputPins = {
+		"$48F3480A",
+	};
+	ExportedName = "UVDistortions.Distortion1TranslationSpeed";
+	ExportedType = float2;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+}
+CParticleNodePinIn	$746BA550
+{
+	SelfName = "DefaultValue";
+	Owner = "$586A2F1F";
+}
+CParticleNodePinOut	$48F3480A
+{
+	SelfName = "Value";
+	Owner = "$586A2F1F";
+}
+CParticleNodeTemplateExport	$BC72DAAE
+{
+	Description = {
+		"@eng:Value that drives the UV translation and rotation for the Distortion 1 Map samples.",
+	};
+	InputPins = {
+		"$C69C0772",
+	};
+	OutputPins = {
+		"$85406789",
+	};
+	ExportedName = "UVDistortions.Distortion1AnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+}
+CParticleNodePinIn	$C69C0772
+{
+	SelfName = "DefaultValue";
+	Owner = "$BC72DAAE";
+}
+CParticleNodePinOut	$85406789
+{
+	SelfName = "Value";
+	Owner = "$BC72DAAE";
+}
+CParticleNodeTemplateExport	$7FBA4C98
+{
+	Description = {
+		"@eng:Multiplier applied to the Distortion 2 Map samples.",
+	};
+	InputPins = {
+		"$2FCD33D0",
+	};
+	OutputPins = {
+		"$DB265939",
+	};
+	ExportedName = "UVDistortions.Distortion2Intensity";
+	ExportedType = float;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+	HasMin = true;
+	DefaultValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$2FCD33D0
+{
+	SelfName = "DefaultValue";
+	Owner = "$7FBA4C98";
+}
+CParticleNodePinOut	$DB265939
+{
+	SelfName = "Value";
+	Owner = "$7FBA4C98";
+}
+CParticleNodeTemplateExport	$49646E4D
+{
+	Description = {
+		"@eng:UV Scaling for the Distortion 2 Map samples.",
+	};
+	InputPins = {
+		"$1B2C0C30",
+	};
+	OutputPins = {
+		"$2CC8372A",
+	};
+	ExportedName = "UVDistortions.Distortion2Scale";
+	ExportedType = float2;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+	DefaultValueF4 = float4(1.0000000e+00, 1.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$1B2C0C30
+{
+	SelfName = "DefaultValue";
+	Owner = "$49646E4D";
+}
+CParticleNodePinOut	$2CC8372A
+{
+	SelfName = "Value";
+	Owner = "$49646E4D";
+}
+CParticleNodeTemplateExport	$DFEABF62
+{
+	Description = {
+		"@eng:UV rotation speed around the rotation center 0.5, 0.5.\\nThis multiplier is applied to the Distortion 2 Animation Cursor to compute the UV rotation of the Distortion 2 Map samples.",
+	};
+	InputPins = {
+		"$74D240BA",
+	};
+	OutputPins = {
+		"$56A6FD31",
+	};
+	ExportedName = "UVDistortions.Distortion2RotationSpeed";
+	ExportedType = float;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+}
+CParticleNodePinIn	$74D240BA
+{
+	SelfName = "DefaultValue";
+	Owner = "$DFEABF62";
+}
+CParticleNodePinOut	$56A6FD31
+{
+	SelfName = "Value";
+	Owner = "$DFEABF62";
+}
+CParticleNodeTemplateExport	$382A30CD
+{
+	Description = {
+		"@eng:UV translation speed.\\nThis multiplier is applied to the Distortion 2 Animation Cursor to compute the UV translation of the Distortion 1 Map samples.",
+	};
+	InputPins = {
+		"$746400E0",
+	};
+	OutputPins = {
+		"$267A3A25",
+	};
+	ExportedName = "UVDistortions.Distortion2TranslationSpeed";
+	ExportedType = float2;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+}
+CParticleNodePinIn	$746400E0
+{
+	SelfName = "DefaultValue";
+	Owner = "$382A30CD";
+}
+CParticleNodePinOut	$267A3A25
+{
+	SelfName = "Value";
+	Owner = "$382A30CD";
+}
+CParticleNodeTemplateExport	$58B4EEAF
+{
+	Description = {
+		"@eng:Value that drives the UV translation and rotation for the Distortion2Map samples.",
+	};
+	InputPins = {
+		"$C771CABB",
+	};
+	OutputPins = {
+		"$FB9A4B75",
+	};
+	ExportedName = "UVDistortions.Distortion2AnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+}
+CParticleNodePinIn	$C771CABB
+{
+	SelfName = "DefaultValue";
+	Owner = "$58B4EEAF";
+}
+CParticleNodePinOut	$FB9A4B75
+{
+	SelfName = "Value";
+	Owner = "$58B4EEAF";
+}
+CParticleRendererFeature	$658C0852
+{
+	FeatureName = "AlphaMasks";
+	Feature = "$93FBDA3B";
+	Properties = {
+		"$DF49F786",
+		"$AB8D5E14",
+		"$3F505E84",
+		"$C5E24F9F",
+		"$2BA29496",
+		"$DA6E1D90",
+		"$01601A94",
+		"$E1E3031A",
+		"$BBC23ED9",
+		"$A00DC516",
+		"$7A69A3EC",
+		"$76987EA2",
+		"$C11141F0",
+		"$1E93522C",
+	};
+}
+CParticleNodeTemplateExport	$93FBDA3B
+{
+	InputPins = {
+		"$CC2B6146",
+	};
+	OutputPins = {
+		"$3E257DA2",
+	};
+	ExportedName = "AlphaMasks";
+	ExportedType = bool;
+	Type = Input;
+	InputType = Property;
+}
+CParticleNodePinIn	$CC2B6146
+{
+	SelfName = "DefaultValue";
+	Owner = "$93FBDA3B";
+}
+CParticleNodePinOut	$3E257DA2
+{
+	SelfName = "Value";
+	Owner = "$93FBDA3B";
+}
+CRHIRenderingFeature	$AEC066F0
+{
+	FeatureName = "AlphaMasks";
+	UseUV = true;
+	PropertiesAsShaderConstants = {
+		"Mask1Map",
+		"Mask2Map",
+		"Mask1Intensity",
+		"Mask1Weight",
+		"Mask1RotationSpeed",
+		"Mask1TranslationSpeed",
+		"Mask1Scale",
+		"Mask2Intensity",
+		"Mask2Weight",
+		"Mask2RotationSpeed",
+		"Mask2TranslationSpeed",
+		"Mask2Scale",
+	};
+	TexturesUsedAsLookUp = {
+		"Mask1Map",
+		"Mask2Map",
+	};
+}
+CParticleNodeTemplateExport	$DF49F786
+{
+	Description = {
+		"@eng:Multiplier applied to the Mask 1 Map samples.",
+	};
+	InputPins = {
+		"$CD1E26C2",
+	};
+	OutputPins = {
+		"$65891797",
+	};
+	ExportedName = "AlphaMasks.Mask1Intensity";
+	ExportedType = float;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+	HasMin = true;
+	DefaultValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$CD1E26C2
+{
+	SelfName = "DefaultValue";
+	Owner = "$DF49F786";
+}
+CParticleNodePinOut	$65891797
+{
+	SelfName = "Value";
+	Owner = "$DF49F786";
+}
+CParticleNodeTemplateExport	$AB8D5E14
+{
+	Description = {
+		"@eng:[0, 1] slider linearly interpolating between full white (0) and the Mask 1 Map sample times its intensity (1).\\nControls the weight of the mask on the final alpha.",
+	};
+	InputPins = {
+		"$16AA6154",
+	};
+	OutputPins = {
+		"$BBA55ABC",
+	};
+	ExportedName = "AlphaMasks.Mask1Weight";
+	ExportedType = float;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+	HasMin = true;
+	HasMax = true;
+	UseSlider = true;
+	DefaultValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+	MaxValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$16AA6154
+{
+	SelfName = "DefaultValue";
+	Owner = "$AB8D5E14";
+}
+CParticleNodePinOut	$BBA55ABC
+{
+	SelfName = "Value";
+	Owner = "$AB8D5E14";
+}
+CParticleNodeTemplateExport	$C5E24F9F
+{
+	Description = {
+		"@eng:UV rotation speed around the rotation center 0.5, 0.5.\\nThis multiplier is applied to the Mask 1 Animation Cursor to compute the UV rotation of the Mask 1 Map samples.",
+	};
+	InputPins = {
+		"$E20E9659",
+	};
+	OutputPins = {
+		"$4EAF44CA",
+	};
+	ExportedName = "AlphaMasks.Mask1RotationSpeed";
+	ExportedType = float;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+}
+CParticleNodePinIn	$E20E9659
+{
+	SelfName = "DefaultValue";
+	Owner = "$C5E24F9F";
+}
+CParticleNodePinOut	$4EAF44CA
+{
+	SelfName = "Value";
+	Owner = "$C5E24F9F";
+}
+CParticleNodeTemplateExport	$2BA29496
+{
+	Description = {
+		"@eng:UV translation speed.\\nThis multiplier is applied to the Mask 1 Animation Cursor to compute the UV translation of the Mask 1 Map samples.",
+	};
+	InputPins = {
+		"$8D4374ED",
+	};
+	OutputPins = {
+		"$E2DF7A8B",
+	};
+	ExportedName = "AlphaMasks.Mask1TranslationSpeed";
+	ExportedType = float2;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+}
+CParticleNodePinIn	$8D4374ED
+{
+	SelfName = "DefaultValue";
+	Owner = "$2BA29496";
+}
+CParticleNodePinOut	$E2DF7A8B
+{
+	SelfName = "Value";
+	Owner = "$2BA29496";
+}
+CParticleNodeTemplateExport	$3F505E84
+{
+	Description = {
+		"@eng:UV Scaling for the Mask 1 Map samples.",
+	};
+	InputPins = {
+		"$FE67CB47",
+	};
+	OutputPins = {
+		"$7A849173",
+	};
+	ExportedName = "AlphaMasks.Mask1Scale";
+	ExportedType = float2;
+	Semantic = 3D_Scale;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+	DefaultValueF4 = float4(1.0000000e+00, 1.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$FE67CB47
+{
+	SelfName = "DefaultValue";
+	Owner = "$3F505E84";
+}
+CParticleNodePinOut	$7A849173
+{
+	SelfName = "Value";
+	Owner = "$3F505E84";
+}
+CParticleNodeTemplateExport	$DA6E1D90
+{
+	Description = {
+		"@eng:Value that drives the UV translation and rotation for the Mask 1 Map samples.",
+	};
+	InputPins = {
+		"$C80E82D1",
+	};
+	OutputPins = {
+		"$17DBA707",
+	};
+	ExportedName = "AlphaMasks.Mask1AnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+}
+CParticleNodePinIn	$C80E82D1
+{
+	SelfName = "DefaultValue";
+	Owner = "$DA6E1D90";
+}
+CParticleNodePinOut	$17DBA707
+{
+	SelfName = "Value";
+	Owner = "$DA6E1D90";
+}
+CParticleNodeTemplateExport	$01601A94
+{
+	Description = {
+		"@eng:Greyscale texture (R channel only is sampled) transformed by the above parameters and multiplied to the diffuse alpha and the emissive color.",
+	};
+	InputPins = {
+		"$0ABD0F41",
+	};
+	OutputPins = {
+		"$DDAA99A3",
+	};
+	ExportedName = "AlphaMasks.Mask1Map";
+	ExportedType = dataImage;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+	DefaultValueData = "Library/PopcornFXCore/Materials/DefaultTextures/White.dds";
+}
+CParticleNodePinIn	$0ABD0F41
+{
+	SelfName = "DefaultValue";
+	Owner = "$01601A94";
+}
+CParticleNodePinOut	$DDAA99A3
+{
+	SelfName = "Value";
+	Owner = "$01601A94";
+}
+CParticleNodeTemplateExport	$E1E3031A
+{
+	Description = {
+		"@eng:Multiplier applied to the Mask 2 Map samples.",
+	};
+	InputPins = {
+		"$61F5EF75",
+	};
+	OutputPins = {
+		"$214D7643",
+	};
+	ExportedName = "AlphaMasks.Mask2Intensity";
+	ExportedType = float;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+	HasMin = true;
+	DefaultValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$61F5EF75
+{
+	SelfName = "DefaultValue";
+	Owner = "$E1E3031A";
+}
+CParticleNodePinOut	$214D7643
+{
+	SelfName = "Value";
+	Owner = "$E1E3031A";
+}
+CParticleNodeTemplateExport	$BBC23ED9
+{
+	Description = {
+		"@eng:[0, 1] slider linearly interpolating between full white (0) and the Mask 1 Map sample times its intensity (1).\\nControls the weight of the mask on the final alpha.",
+	};
+	InputPins = {
+		"$86FACD61",
+	};
+	OutputPins = {
+		"$CD540CAC",
+	};
+	ExportedName = "AlphaMasks.Mask2Weight";
+	ExportedType = float;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+	HasMin = true;
+	HasMax = true;
+	UseSlider = true;
+	DefaultValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+	MaxValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$86FACD61
+{
+	SelfName = "DefaultValue";
+	Owner = "$BBC23ED9";
+}
+CParticleNodePinOut	$CD540CAC
+{
+	SelfName = "Value";
+	Owner = "$BBC23ED9";
+}
+CParticleNodeTemplateExport	$A00DC516
+{
+	Description = {
+		"@eng:UV Scaling for the Mask 2 Map samples.",
+	};
+	InputPins = {
+		"$9447F9CE",
+	};
+	OutputPins = {
+		"$0A42CFBB",
+	};
+	ExportedName = "AlphaMasks.Mask2Scale";
+	ExportedType = float2;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+	DefaultValueF4 = float4(1.0000000e+00, 1.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$9447F9CE
+{
+	SelfName = "DefaultValue";
+	Owner = "$A00DC516";
+}
+CParticleNodePinOut	$0A42CFBB
+{
+	SelfName = "Value";
+	Owner = "$A00DC516";
+}
+CParticleNodeTemplateExport	$7A69A3EC
+{
+	Description = {
+		"@eng:UV rotation speed around the rotation center 0.5, 0.5.\\nThis multiplier is applied to the Mask 2 Animation Cursor to compute the UV rotation of the Mask 2 Map samples.",
+	};
+	InputPins = {
+		"$646845D3",
+	};
+	OutputPins = {
+		"$1867A596",
+	};
+	ExportedName = "AlphaMasks.Mask2RotationSpeed";
+	ExportedType = float;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+}
+CParticleNodePinIn	$646845D3
+{
+	SelfName = "DefaultValue";
+	Owner = "$7A69A3EC";
+}
+CParticleNodePinOut	$1867A596
+{
+	SelfName = "Value";
+	Owner = "$7A69A3EC";
+}
+CParticleNodeTemplateExport	$76987EA2
+{
+	Description = {
+		"@eng:UV translation speed.\\nThis multiplier is applied to the Mask 2 Animation Cursor to compute the UV translation of the Mask 2 Map samples.",
+	};
+	InputPins = {
+		"$F1C244A6",
+	};
+	OutputPins = {
+		"$332A2537",
+	};
+	ExportedName = "AlphaMasks.Mask2TranslationSpeed";
+	ExportedType = float2;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+}
+CParticleNodePinIn	$F1C244A6
+{
+	SelfName = "DefaultValue";
+	Owner = "$76987EA2";
+}
+CParticleNodePinOut	$332A2537
+{
+	SelfName = "Value";
+	Owner = "$76987EA2";
+}
+CParticleNodeTemplateExport	$C11141F0
+{
+	Description = {
+		"@eng:Value that drives the UV translation and rotation for the Mask 2 Map samples.",
+	};
+	InputPins = {
+		"$62C3E35C",
+	};
+	OutputPins = {
+		"$DA865B37",
+	};
+	ExportedName = "AlphaMasks.Mask2AnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+}
+CParticleNodePinIn	$62C3E35C
+{
+	SelfName = "DefaultValue";
+	Owner = "$C11141F0";
+}
+CParticleNodePinOut	$DA865B37
+{
+	SelfName = "Value";
+	Owner = "$C11141F0";
+}
+CParticleNodeTemplateExport	$1E93522C
+{
+	Description = {
+		"@eng:Greyscale texture (R channel only is sampled) transformed by the above parameters and multiplied to the diffuse alpha and the emissive color.",
+	};
+	InputPins = {
+		"$DC28D69C",
+	};
+	OutputPins = {
+		"$5F5F0105",
+	};
+	ExportedName = "AlphaMasks.Mask2Map";
+	ExportedType = dataImage;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+	DefaultValueData = "Library/PopcornFXCore/Materials/DefaultTextures/White.dds";
+}
+CParticleNodePinIn	$DC28D69C
+{
+	SelfName = "DefaultValue";
+	Owner = "$1E93522C";
+}
+CParticleNodePinOut	$5F5F0105
+{
+	SelfName = "Value";
+	Owner = "$1E93522C";
+}
+CParticleRendererFeature	$B2A34B8E
+{
+	FeatureName = "Dissolve";
+	Feature = "$1945C150";
+	Properties = {
+		"$8C8FDBE7",
+		"$281FC9C1",
+		"$F598C889",
+	};
+}
+CParticleNodeTemplateExport	$1945C150
+{
+	InputPins = {
+		"$868B0234",
+	};
+	OutputPins = {
+		"$930FC9A2",
+	};
+	ExportedName = "Dissolve";
+	ExportedType = bool;
+	Type = Input;
+	InputType = Property;
+}
+CParticleNodePinIn	$868B0234
+{
+	SelfName = "DefaultValue";
+	Owner = "$1945C150";
+}
+CParticleNodePinOut	$930FC9A2
+{
+	SelfName = "Value";
+	Owner = "$1945C150";
+}
+CRHIRenderingFeature	$DDA74FDA
+{
+	FeatureName = "Dissolve";
+	UseUV = true;
+	PropertiesAsShaderConstants = {
+		"DissolveMap",
+		"DissolveSoftness",
+	};
+	TexturesUsedAsLookUp = {
+		"DissolveMap",
+	};
+}
+CParticleNodeTemplateExport	$8C8FDBE7
+{
+	Description = {
+		"@eng:Greyscale texture (R channel only is sampled) that is multiplied by the Dissolve Animation Cursor and multiplied to the diffuse alpha.",
+	};
+	InputPins = {
+		"$754BD2DD",
+	};
+	OutputPins = {
+		"$D39EB4DF",
+	};
+	ExportedName = "Dissolve.DissolveMap";
+	ExportedType = dataImage;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:Dissolve",
+	};
+	DefaultValueData = "Library/PopcornFXCore/Materials/DefaultTextures/White.dds";
+}
+CParticleNodePinIn	$754BD2DD
+{
+	SelfName = "DefaultValue";
+	Owner = "$8C8FDBE7";
+}
+CParticleNodePinOut	$D39EB4DF
+{
+	SelfName = "Value";
+	Owner = "$8C8FDBE7";
+}
+CParticleNodeTemplateExport	$948744AC
+{
+	Description = {
+		"@eng:Distortion texture map.\\nOffsets the diffuse map, emissive map, normal map, metalrough map and alphamasks maps UVs by the 2D vector formed by the red and green channel.\\nIs added with the Distortion 2 Map sample.",
+	};
+	InputPins = {
+		"$D9F4A400",
+	};
+	OutputPins = {
+		"$2CF90F4F",
+	};
+	ExportedName = "UVDistortions.Distortion2Map";
+	ExportedType = dataImage;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+	DefaultValueData = "Library/PopcornFXCore/Materials/DefaultTextures/Distort.dds";
+}
+CParticleNodePinIn	$D9F4A400
+{
+	SelfName = "DefaultValue";
+	Owner = "$948744AC";
+}
+CParticleNodePinOut	$2CF90F4F
+{
+	SelfName = "Value";
+	Owner = "$948744AC";
+}
+CParticleNodeTemplateExport	$281FC9C1
+{
+	Description = {
+		"@eng:[0, inf] value that acts as the alpha threshold value for the dissolve. With a dissolve softness of zero, every pixel that has an alpha value less than the animation cursor value will be discarded.",
+	};
+	InputPins = {
+		"$C80277B6",
+	};
+	OutputPins = {
+		"$786D47FA",
+	};
+	ExportedName = "Dissolve.DissolveAnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:Dissolve",
+	};
+	DefaultValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$C80277B6
+{
+	SelfName = "DefaultValue";
+	Owner = "$281FC9C1";
+}
+CParticleNodePinOut	$786D47FA
+{
+	SelfName = "Value";
+	Owner = "$281FC9C1";
+}
+CParticleNodeTemplateExport	$F598C889
+{
+	Description = {
+		"@eng:Float that describes how soft the dissolve will be. 0 means a sharp thresholding dissolve, higher values will fade the dissolve thresholding.",
+	};
+	InputPins = {
+		"$2F399DB1",
+	};
+	OutputPins = {
+		"$16D42EBB",
+	};
+	ExportedName = "Dissolve.DissolveSoftness";
+	ExportedType = float;
+	Type = Input;
+	InputType = Property;
+	CategoryName = {
+		"@eng:Dissolve",
+	};
+	HasMin = true;
+	HasMax = true;
+	UseSlider = true;
+	MaxValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$2F399DB1
+{
+	SelfName = "DefaultValue";
+	Owner = "$F598C889";
+}
+CParticleNodePinOut	$16D42EBB
+{
+	SelfName = "Value";
+	Owner = "$F598C889";
+}
+CParticleRendererFeature	$877C71C6
+{
+	FeatureName = "FastLit";
+	Feature = "$27002F2B";
+}
+CParticleNodeTemplateExport	$27002F2B
+{
+	InputPins = {
+		"$369957FB",
+	};
+	OutputPins = {
+		"$02EAFA76",
+	};
+	ExportedName = "FastLit";
+	ExportedType = bool;
+	Type = Input;
+	InputType = Property;
+}
+CParticleNodePinIn	$369957FB
+{
+	SelfName = "DefaultValue";
+	Owner = "$27002F2B";
+}
+CParticleNodePinOut	$02EAFA76
+{
+	SelfName = "Value";
+	Owner = "$27002F2B";
+}
+CRHIRenderingFeature	$BACDFB61
+{
+	FeatureName = "FastLit";
+	UseNormal = true;
+	UseSceneLightingInfo = true;
+}
+CParticleRendererFeature	$AC4D205A
+{
+	FeatureName = "ComputeVelocity";
+	Feature = "$671FAA75";
+	Properties = {
+		"$0AA1B94C",
+	};
+}
+CParticleNodeTemplateExport	$671FAA75
+{
+	InputPins = {
+		"$F93185C7",
+	};
+	OutputPins = {
+		"$92D5DB11",
+	};
+	ExportedName = "ComputeVelocity";
+	ExportedType = bool;
+	Type = Input;
+	InputType = Property;
+}
+CParticleNodePinIn	$F93185C7
+{
+	SelfName = "DefaultValue";
+	Owner = "$671FAA75";
+}
+CParticleNodePinOut	$92D5DB11
+{
+	SelfName = "Value";
+	Owner = "$671FAA75";
+}
+CRHIRenderingFeature	$DC5BC92F
+{
+	FeatureName = "ComputeVelocity";
+}
+CParticleNodeTemplateExport	$0AA1B94C
+{
+	Description = {
+		"@eng:Previous frame position of the particle.",
+	};
+	InputPins = {
+		"$D1118B69",
+	};
+	OutputPins = {
+		"$B7700A6D",
+	};
+	ExportedName = "ComputeVelocity.PreviousPosition";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Input;
+	TransformSpace = World;
+	TransformMode = Position;
+	CategoryName = {
+		"@eng:ComputeVelocity",
+	};
+}
+CParticleNodePinIn	$D1118B69
+{
+	SelfName = "DefaultValue";
+	Owner = "$0AA1B94C";
+}
+CParticleNodePinOut	$B7700A6D
+{
+	SelfName = "Value";
+	Owner = "$0AA1B94C";
+}

+ 5 - 9
PopcornFX/Library/PopcornFXCore/Materials/Interface/Editor.pkri → PopcornFX/Library/PopcornFXCore/Materials/Interface/Legacy.pkri

@@ -1,7 +1,7 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CEngineRendererInterface	$6B70D015
 {
-	InterfaceName = "Editor features";
+	InterfaceName = "Legacy default features";
 	RendererFeatures = {
 		"$D6EEA348",
 		"$81861AB7",
@@ -14,6 +14,9 @@ CEngineRendererInterface	$6B70D015
 		"$0798FEE6",
 		"$E749E042",
 		"$1838F4AE",
+		"$52697627",
+		"$D6BEA348",
+		"$55289D1E",
 		"$E191BFCB",
 		"$F415EE0A",
 		"$41EED1A4",
@@ -41,9 +44,6 @@ CEngineRendererInterface	$6B70D015
 		"$D857A09F",
 		"$047497F3",
 		"$9154DFA0",
-		"$52697627",
-		"$D6BEA348",
-		"$55289D1E",
 		"$23F9C093",
 		"$F50D7FD2",
 		"$8A93EEE1",
@@ -5212,10 +5212,6 @@ CParticleNodeTemplateExport	$1FD66E5F
 	CategoryName = {
 		"@eng:ComputeVelocity",
 	};
-	PinRules = Rule1;
-	RuleResult = Hidden;
-	DependentProperty = "General.Position";
-	RuleFunction = Visible;
 }
 CParticleNodePinIn	$4A2AE2B5
 {

+ 0 - 392
PopcornFX/Library/PopcornFXCore/Materials/Interface/MeshAnim.pkri

@@ -1,392 +0,0 @@
-Version = 2.19.0.20559;
-CEngineRendererInterface	$6B70D015
-{
-	InterfaceName = "Mesh Anim";
-	RendererFeatures = {
-		"$07502AB6",
-		"$85A52676",
-		"$657972C1",
-		"$B4745F99",
-	};
-}
-CRHIRenderingSettings	$6DF50834
-{
-	RenderingFeatures = {
-		"$691E0A5C",
-		"$FBB54BD2",
-		"$F560428A",
-		"$21F97218",
-	};
-}
-CParticleRendererFeature	$07502AB6
-{
-	FeatureName = "SkeletalAnimation";
-	Feature = "$D860242F";
-	Properties = {
-		"$8FED53BE",
-		"$FC06E279",
-		"$811D3FC7",
-		"$4D9DD5F2",
-		"$E0FEB178",
-	};
-}
-CParticleNodeTemplateExport	$D860242F
-{
-	InputPins = {
-		"$F51BABD9",
-	};
-	OutputPins = {
-		"$BA393FB8",
-	};
-	ExportedName = "SkeletalAnimation";
-	ExportedType = bool;
-	Type = Input;
-	InputType = Property;
-}
-CParticleNodePinIn	$F51BABD9
-{
-	SelfName = "DefaultValue";
-	Owner = "$D860242F";
-}
-CParticleNodePinOut	$BA393FB8
-{
-	SelfName = "Value";
-	Owner = "$D860242F";
-}
-CRHIRenderingFeature	$691E0A5C
-{
-	FeatureName = "SkeletalAnimation";
-	UseMeshVertexBonesIndicesAndWeights = true;
-	PropertiesAsShaderConstants = {
-		"AnimTextureResolution",
-		"AnimationTexture",
-		"AnimTracksCount",
-	};
-	TexturesUsedAsLookUp = {
-		"AnimationTexture",
-	};
-}
-CParticleNodeTemplateExport	$8FED53BE
-{
-	InputPins = {
-		"$51F00EE5",
-	};
-	OutputPins = {
-		"$B8E044B6",
-	};
-	ExportedName = "SkeletalAnimation.AnimationTexture";
-	ExportedType = dataImage;
-	Type = Input;
-	InputType = Property;
-	CategoryName = {
-		"@eng:SkeletalAnimation",
-	};
-}
-CParticleNodePinIn	$51F00EE5
-{
-	SelfName = "DefaultValue";
-	Owner = "$8FED53BE";
-}
-CParticleNodePinOut	$B8E044B6
-{
-	SelfName = "Value";
-	Owner = "$8FED53BE";
-}
-CParticleNodeTemplateExport	$FC06E279
-{
-	InputPins = {
-		"$70FB0232",
-	};
-	OutputPins = {
-		"$6AED2119",
-	};
-	ExportedName = "SkeletalAnimation.AnimationCursor";
-	ExportedType = float;
-	Type = Input;
-	CategoryName = {
-		"@eng:SkeletalAnimation",
-	};
-	HasMin = true;
-	HasMax = true;
-	UseSlider = true;
-	MaxValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
-}
-CParticleNodePinIn	$70FB0232
-{
-	SelfName = "DefaultValue";
-	Owner = "$FC06E279";
-}
-CParticleNodePinOut	$6AED2119
-{
-	SelfName = "Value";
-	Owner = "$FC06E279";
-}
-CParticleNodeTemplateExport	$811D3FC7
-{
-	InputPins = {
-		"$3B8615E2",
-	};
-	OutputPins = {
-		"$4DA235CB",
-	};
-	ExportedName = "SkeletalAnimation.AnimTextureResolution";
-	ExportedType = int2;
-	Type = Input;
-	InputType = Property;
-	CategoryName = {
-		"@eng:SkeletalAnimation",
-	};
-	DefaultValueI4 = int4(1024, 32, 0, 0);
-}
-CParticleNodePinIn	$3B8615E2
-{
-	SelfName = "DefaultValue";
-	Owner = "$811D3FC7";
-}
-CParticleNodePinOut	$4DA235CB
-{
-	SelfName = "Value";
-	Owner = "$811D3FC7";
-}
-CParticleRendererFeature	$85A52676
-{
-	FeatureName = "SkeletalAnimationInterpolate";
-	Feature = "$8501FD98";
-}
-CParticleNodeTemplateExport	$8501FD98
-{
-	InputPins = {
-		"$3FFF929C",
-	};
-	OutputPins = {
-		"$81C8B393",
-	};
-	ExportedName = "SkeletalAnimationInterpolate";
-	ExportedType = bool;
-	Type = Input;
-	InputType = Property;
-}
-CParticleNodePinIn	$3FFF929C
-{
-	SelfName = "DefaultValue";
-	Owner = "$8501FD98";
-}
-CParticleNodePinOut	$81C8B393
-{
-	SelfName = "Value";
-	Owner = "$8501FD98";
-}
-CRHIRenderingFeature	$FBB54BD2
-{
-	FeatureName = "SkeletalAnimationInterpolate";
-}
-CParticleNodeTemplateExport	$4D9DD5F2
-{
-	InputPins = {
-		"$2F228D2D",
-	};
-	OutputPins = {
-		"$EDD49B7E",
-	};
-	ExportedName = "SkeletalAnimation.AnimTracksCount";
-	ExportedType = float;
-	Type = Input;
-	InputType = Property;
-	CategoryName = {
-		"@eng:SkeletalAnimation",
-	};
-	HasMin = true;
-	DefaultValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
-	DefaultValueI4 = int4(1, 0, 0, 0);
-	MinValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
-	MinValueI4 = int4(1, 0, 0, 0);
-}
-CParticleNodePinIn	$2F228D2D
-{
-	SelfName = "DefaultValue";
-	Owner = "$4D9DD5F2";
-}
-CParticleNodePinOut	$EDD49B7E
-{
-	SelfName = "Value";
-	Owner = "$4D9DD5F2";
-}
-CParticleNodeTemplateExport	$E0FEB178
-{
-	InputPins = {
-		"$D93FEB8E",
-	};
-	OutputPins = {
-		"$0CFC3D9B",
-	};
-	ExportedName = "SkeletalAnimation.CurrentAnimTrack";
-	ExportedType = int;
-	Type = Input;
-	CategoryName = {
-		"@eng:SkeletalAnimation",
-	};
-	HasMin = true;
-}
-CParticleNodePinIn	$D93FEB8E
-{
-	SelfName = "DefaultValue";
-	Owner = "$E0FEB178";
-}
-CParticleNodePinOut	$0CFC3D9B
-{
-	SelfName = "Value";
-	Owner = "$E0FEB178";
-}
-CParticleRendererFeature	$657972C1
-{
-	FeatureName = "SkeletalAnimationInterpolateTracks";
-	Feature = "$E7833CC2";
-	Properties = {
-		"$F0BC969B",
-		"$E8EF58FF",
-		"$FEC61C9C",
-	};
-}
-CParticleNodeTemplateExport	$E7833CC2
-{
-	InputPins = {
-		"$98B1DEC4",
-	};
-	OutputPins = {
-		"$5E2A0AF4",
-	};
-	ExportedName = "SkeletalAnimationInterpolateTracks";
-	ExportedType = bool;
-	Type = Input;
-	InputType = Property;
-}
-CParticleNodePinIn	$98B1DEC4
-{
-	SelfName = "DefaultValue";
-	Owner = "$E7833CC2";
-}
-CParticleNodePinOut	$5E2A0AF4
-{
-	SelfName = "Value";
-	Owner = "$E7833CC2";
-}
-CRHIRenderingFeature	$F560428A
-{
-	FeatureName = "SkeletalAnimationInterpolateTracks";
-}
-CParticleNodeTemplateExport	$F0BC969B
-{
-	InputPins = {
-		"$44AEAB2B",
-	};
-	OutputPins = {
-		"$11E97D9F",
-	};
-	ExportedName = "SkeletalAnimationInterpolateTracks.NextAnimTrack";
-	ExportedType = int;
-	Type = Input;
-	CategoryName = {
-		"@eng:SkeletalAnimationInterpolateTracks",
-	};
-	HasMin = true;
-}
-CParticleNodePinIn	$44AEAB2B
-{
-	SelfName = "DefaultValue";
-	Owner = "$F0BC969B";
-}
-CParticleNodePinOut	$11E97D9F
-{
-	SelfName = "Value";
-	Owner = "$F0BC969B";
-}
-CParticleNodeTemplateExport	$E8EF58FF
-{
-	InputPins = {
-		"$40B88C2E",
-	};
-	OutputPins = {
-		"$E41A2064",
-	};
-	ExportedName = "SkeletalAnimationInterpolateTracks.TransitionRatio";
-	ExportedType = float;
-	Type = Input;
-	CategoryName = {
-		"@eng:SkeletalAnimationInterpolateTracks",
-	};
-	HasMin = true;
-	HasMax = true;
-	UseSlider = true;
-	MaxValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
-}
-CParticleNodePinIn	$40B88C2E
-{
-	SelfName = "DefaultValue";
-	Owner = "$E8EF58FF";
-}
-CParticleNodePinOut	$E41A2064
-{
-	SelfName = "Value";
-	Owner = "$E8EF58FF";
-}
-CParticleRendererFeature	$B4745F99
-{
-	FeatureName = "SkeletalAnimationUseBonesScale";
-	Feature = "$178648F9";
-}
-CParticleNodeTemplateExport	$178648F9
-{
-	InputPins = {
-		"$E9A438AD",
-	};
-	OutputPins = {
-		"$46ADF64A",
-	};
-	ExportedName = "SkeletalAnimationUseBonesScale";
-	ExportedType = bool;
-	Type = Input;
-	InputType = Property;
-}
-CParticleNodePinIn	$E9A438AD
-{
-	SelfName = "DefaultValue";
-	Owner = "$178648F9";
-}
-CParticleNodePinOut	$46ADF64A
-{
-	SelfName = "Value";
-	Owner = "$178648F9";
-}
-CRHIRenderingFeature	$21F97218
-{
-	FeatureName = "SkeletalAnimationUseBonesScale";
-}
-CParticleNodeTemplateExport	$FEC61C9C
-{
-	InputPins = {
-		"$FE746319",
-	};
-	OutputPins = {
-		"$6EC7EEC8",
-	};
-	ExportedName = "SkeletalAnimationInterpolateTracks.NextAnimationCursor";
-	ExportedType = float;
-	Type = Input;
-	CategoryName = {
-		"@eng:SkeletalAnimationInterpolateTracks",
-	};
-	HasMin = true;
-	HasMax = true;
-	UseSlider = true;
-	MaxValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
-}
-CParticleNodePinIn	$FE746319
-{
-	SelfName = "DefaultValue";
-	Owner = "$FEC61C9C";
-}
-CParticleNodePinOut	$6EC7EEC8
-{
-	SelfName = "Value";
-	Owner = "$FEC61C9C";
-}

+ 1 - 1
PopcornFX/Library/PopcornFXCore/Materials/Interface/SkeletalAnimationTexture.pkri

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CEngineRendererInterface	$6B70D015
 {
 	InterfaceName = "Skeletal Animation Texture";

+ 19 - 19
PopcornFX/Library/PopcornFXCore/Materials/Animated_Mesh.pkma → PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Animated_Mesh.pkma

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CParticleRendererMaterial	$6B70D015
 {
 	RendererFeatures = {
@@ -28,76 +28,76 @@ CParticleRendererMaterial	$6B70D015
 }
 CParticleRendererFeatureDesc	$A8FC2215
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "GeometryMesh";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$18565271
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Opaque";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$8F7B32AE
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Diffuse";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$35A36C4E
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EnableRendering";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$8BF32864
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Lit";
 }
 CParticleRendererFeatureDesc	$ECD07C82
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "LegacyLit";
 }
 CParticleRendererFeatureDesc	$D857A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "MeshAtlas";
 }
 CParticleRendererFeatureDesc	$4B933A29
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "AlphaRemap";
 }
 CParticleRendererFeatureDesc	$4B954A29
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Emissive";
 }
 CParticleRendererFeatureDesc	$9154DFA0
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "DiffuseRamp";
 }
 CParticleRendererFeatureDesc	$EAC726E3
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "TransformUVs";
 }
 CRHIMaterialShaders	$00269EC3
 {
 	VertexShader = "Library/PopcornFXCore/Shaders/AnimatedMesh.vert";
-	FragmentShader = "Library/PopcornFXCore/Shaders/Default_Mesh.frag";
+	FragmentShader = "Library/PopcornFXCore/Shaders/Legacy/Default_Mesh.frag";
 }
 CParticleRendererFeatureDesc	$3BE1856D
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EmissiveRamp";
 }
 CParticleRendererFeatureDesc	$1A35A1FF
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "UseVertexColors";
 }
 CParticleRendererFeatureDesc	$48A1612A
@@ -123,17 +123,17 @@ CParticleRendererFeatureDesc	$889B8BF4
 }
 CParticleRendererFeatureDesc	$B408CF5C
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Atlas";
 }
 CParticleRendererFeatureDesc	$F22CBF26
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "MeshLOD";
 }
 CParticleRendererFeatureDesc	$53BDE3A8
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Culling";
 	Mandatory = true;
 }
@@ -149,7 +149,7 @@ CParticleNodeGraph	$BA187922
 }
 CParticleRendererFeatureDesc	$F8D90E2B
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "ComputeVelocity";
 	Mandatory = true;
 }

+ 19 - 19
PopcornFX/Library/PopcornFXCore/Materials/Default_Billboard.pkma → PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Default_Billboard.pkma

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CParticleRendererMaterial	$6B70D015
 {
 	RendererFeatures = {
@@ -24,90 +24,90 @@ CParticleRendererMaterial	$6B70D015
 }
 CParticleRendererFeatureDesc	$191F1761
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "GeometryBillboard";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$5F3F8D5F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Transparent";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$3D324B43
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Diffuse";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D857A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EnableRendering";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$EA3837ED
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Lit";
 }
 CParticleRendererFeatureDesc	$02499109
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "LegacyLit";
 }
 CParticleRendererFeatureDesc	$EA331F29
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "SoftParticles";
 }
 CParticleRendererFeatureDesc	$1DB717AE
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "FlipUVs";
 }
 CParticleRendererFeatureDesc	$1098ED35
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "AlphaRemap";
 }
 CParticleRendererFeatureDesc	$CAD62F46
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Atlas";
 }
 CParticleRendererFeatureDesc	$C5F9C9BF
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "NormalWrap";
 }
 CParticleRendererFeatureDesc	$D851A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "DiffuseRamp";
 }
 CParticleRendererFeatureDesc	$35A36C4E
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Emissive";
 }
 CParticleRendererFeatureDesc	$4B933A29
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "NormalBend";
 }
 CParticleRendererFeatureDesc	$EAC726E3
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "TransformUVs";
 }
 CRHIMaterialShaders	$00269EC3
 {
-	FragmentShader = "Library/PopcornFXCore/Shaders/Default_Billboard.frag";
+	FragmentShader = "Library/PopcornFXCore/Shaders/Legacy/Default_Billboard.frag";
 }
 CParticleRendererFeatureDesc	$7FB4AB5F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EmissiveRamp";
 }
 CParticleNodeGraph	$56E6AB5C
@@ -143,7 +143,7 @@ CParticleNodePinIn	$747AA164
 }
 CParticleRendererFeatureDesc	$262FC99E
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "ComputeVelocity";
 	Mandatory = true;
 }

+ 10 - 10
PopcornFX/Library/PopcornFXCore/Materials/Default_Decal.pkma → PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Default_Decal.pkma

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CParticleRendererMaterial	$6B70D015
 {
 	RendererFeatures = {
@@ -14,40 +14,40 @@ CParticleRendererMaterial	$6B70D015
 }
 CParticleRendererFeatureDesc	$191F1761
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "GeometryDecal";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D857A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EnableRendering";
 	Mandatory = true;
 }
 CRHIMaterialShaders	$9154DFA0
 {
-	VertexShader = "Library/PopcornFXCore/Shaders/Default_Decal.vert";
-	FragmentShader = "Library/PopcornFXCore/Shaders/Default_Decal.frag";
+	VertexShader = "Library/PopcornFXCore/Shaders/Legacy/Default_Decal.vert";
+	FragmentShader = "Library/PopcornFXCore/Shaders/Legacy/Default_Decal.frag";
 }
 CParticleRendererFeatureDesc	$35A36C4E
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Diffuse";
 }
 CParticleRendererFeatureDesc	$4B933A29
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Decal";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$EAC726E3
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Emissive";
 }
 CParticleRendererFeatureDesc	$2DCA11C6
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Atlas";
 }
 CParticleNodeGraph	$F580548F
@@ -66,7 +66,7 @@ CParticleNodePinOut	$BFA3B61D
 }
 CParticleRendererFeatureDesc	$1FB37679
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "ComputeVelocity";
 	Mandatory = true;
 }

+ 9 - 9
PopcornFX/Library/PopcornFXCore/Materials/Default_Light.pkma → PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Default_Light.pkma

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CParticleRendererMaterial	$6B70D015
 {
 	RendererFeatures = {
@@ -12,40 +12,40 @@ CParticleRendererMaterial	$6B70D015
 }
 CParticleRendererFeatureDesc	$409FF19E
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "GeometryLight";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$BFFD5E01
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Light";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$27D7F2E5
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "LightAttenuation";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D857A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EnableRendering";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$2FB0C593
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "LightTranslucent";
 }
 CParticleRendererFeatureDesc	$5ACCE379
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "CastShadows";
 }
 CRHIMaterialShaders	$73ED6589
 {
-	VertexShader = "Library/PopcornFXCore/Shaders/Default_Light.vert";
-	FragmentShader = "Library/PopcornFXCore/Shaders/Default_Light.frag";
+	VertexShader = "Library/PopcornFXCore/Shaders/Legacy/Default_Light.vert";
+	FragmentShader = "Library/PopcornFXCore/Shaders/Legacy/Default_Light.frag";
 }

+ 19 - 19
PopcornFX/Library/PopcornFXCore/Materials/Default_Mesh.pkma → PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Default_Mesh.pkma

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CParticleRendererMaterial	$6B70D015
 {
 	RendererFeatures = {
@@ -24,96 +24,96 @@ CParticleRendererMaterial	$6B70D015
 }
 CParticleRendererFeatureDesc	$A8FC2215
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "GeometryMesh";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$18565271
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Opaque";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$8F7B32AE
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Diffuse";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$35A36C4E
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EnableRendering";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$8BF32864
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Lit";
 }
 CParticleRendererFeatureDesc	$ECD07C82
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "LegacyLit";
 }
 CParticleRendererFeatureDesc	$D857A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "MeshAtlas";
 }
 CParticleRendererFeatureDesc	$4B933A29
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "AlphaRemap";
 }
 CParticleRendererFeatureDesc	$4B954A29
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Emissive";
 }
 CParticleRendererFeatureDesc	$9154DFA0
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "DiffuseRamp";
 }
 CParticleRendererFeatureDesc	$EAC726E3
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "TransformUVs";
 }
 CRHIMaterialShaders	$00269EC3
 {
-	FragmentShader = "Library/PopcornFXCore/Shaders/Default_Mesh.frag";
+	FragmentShader = "Library/PopcornFXCore/Shaders/Legacy/Default_Mesh.frag";
 }
 CParticleRendererFeatureDesc	$3BE1856D
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EmissiveRamp";
 }
 CParticleRendererFeatureDesc	$1A35A1FF
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "UseVertexColors";
 }
 CParticleRendererFeatureDesc	$D72B521A
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "MeshLOD";
 }
 CParticleRendererFeatureDesc	$1C9B3978
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Atlas";
 }
 CParticleRendererFeatureDesc	$E2963AA1
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Culling";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$C4A58F03
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "ComputeVelocity";
 	Mandatory = true;
 }

+ 22 - 22
PopcornFX/Library/PopcornFXCore/Materials/Default_Ribbon.pkma → PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Default_Ribbon.pkma

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CParticleRendererMaterial	$6B70D015
 {
 	RendererFeatures = {
@@ -27,110 +27,110 @@ CParticleRendererMaterial	$6B70D015
 }
 CParticleRendererFeatureDesc	$FB5367C7
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "GeometryRibbon";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$83FDC6C2
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Transparent";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$156D23DE
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Diffuse";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D857A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EnableRendering";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$1A756CB9
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Lit";
 }
 CParticleRendererFeatureDesc	$8AB9925C
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "LegacyLit";
 }
 CParticleRendererFeatureDesc	$9237A057
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "SoftParticles";
 }
 CParticleRendererFeatureDesc	$07AE0A48
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "CorrectDeformation";
 }
 CParticleRendererFeatureDesc	$61837614
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "CustomTextureU";
 }
 CParticleRendererFeatureDesc	$1CA8897A
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "TextureUVs";
 }
 CParticleRendererFeatureDesc	$D3C19C23
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "TextureRepeat";
 }
 CParticleRendererFeatureDesc	$E7CAD9E4
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "AlphaRemap";
 }
 CParticleRendererFeatureDesc	$3AC11902
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Atlas";
 }
 CParticleRendererFeatureDesc	$01F95E26
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "NormalWrap";
 }
 CParticleRendererFeatureDesc	$D157A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "DiffuseRamp";
 }
 CParticleRendererFeatureDesc	$35A36C4E
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Emissive";
 }
 CParticleRendererFeatureDesc	$4B933A29
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "NormalBend";
 }
 CParticleRendererFeatureDesc	$9154DFA0
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "TransformUVs";
 }
 CRHIMaterialShaders	$00269EC3
 {
-	FragmentShader = "Library/PopcornFXCore/Shaders/Default_Ribbon.frag";
+	FragmentShader = "Library/PopcornFXCore/Shaders/Legacy/Default_Ribbon.frag";
 }
 CParticleRendererFeatureDesc	$84382E2F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EmissiveRamp";
 }
 CParticleRendererFeatureDesc	$2E5E8753
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "ComputeVelocity";
 	Mandatory = true;
 }

+ 6 - 6
PopcornFX/Library/PopcornFXCore/Materials/Default_Sound.pkma → PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Default_Sound.pkma

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CParticleRendererMaterial	$6B70D015
 {
 	RendererFeatures = {
@@ -11,30 +11,30 @@ CParticleRendererMaterial	$6B70D015
 }
 CParticleRendererFeatureDesc	$F361BD3A
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "GeometrySound";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$DCB8444C
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Sound";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D857A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EnableRendering";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$53C68443
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "SoundAttenuation";
 }
 CParticleRendererFeatureDesc	$589BAB05
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Doppler";
 }
 CRHIMaterialShaders	$00269EC3

+ 10 - 10
PopcornFX/Library/PopcornFXCore/Materials/Default_Triangle.pkma → PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Default_Triangle.pkma

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CParticleRendererMaterial	$6B70D015
 {
 	RendererFeatures = {
@@ -14,50 +14,50 @@ CParticleRendererMaterial	$6B70D015
 }
 CParticleRendererFeatureDesc	$191F1761
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "GeometryTriangle";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$3D324B43
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Diffuse";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D857A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EnableRendering";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$4B933A29
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Lit";
 }
 CParticleRendererFeatureDesc	$9154DFA0
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "NormalBend";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$EAC726E3
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "TriangleCustomNormals";
 }
 CParticleRendererFeatureDesc	$4ADE8DE2
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "TriangleCustomUVs";
 }
 CParticleRendererFeatureDesc	$7605928F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Transparent";
 	Mandatory = true;
 }
 CRHIMaterialShaders	$00269EC3
 {
-	FragmentShader = "Library/PopcornFXCore/Shaders/Default_Triangle.frag";
+	FragmentShader = "Library/PopcornFXCore/Shaders/Legacy/Default_Triangle.frag";
 }

+ 16 - 16
PopcornFX/Library/PopcornFXCore/Materials/Distortion_Billboard.pkma → PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Distortion_Billboard.pkma

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CParticleRendererMaterial	$6B70D015
 {
 	RendererFeatures = {
@@ -21,75 +21,75 @@ CParticleRendererMaterial	$6B70D015
 }
 CParticleRendererFeatureDesc	$E8631443
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "GeometryBillboard";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D0BFBDD9
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Distortion";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D857A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EnableRendering";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$DDEAB83F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "SoftParticles";
 }
 CParticleRendererFeatureDesc	$EEE60312
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "FlipUVs";
 }
 CParticleRendererFeatureDesc	$05ED5D39
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Atlas";
 }
 CParticleRendererFeatureDesc	$D956C336
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Lit";
 }
 CParticleRendererFeatureDesc	$4E07A528
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Diffuse";
 }
 CParticleRendererFeatureDesc	$618E9B88
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "DiffuseRamp";
 }
 CParticleRendererFeatureDesc	$7513657A
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Emissive";
 }
 CParticleRendererFeatureDesc	$07F6ADCE
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EmissiveRamp";
 }
 CParticleRendererFeatureDesc	$B650CB43
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "TransformUVs";
 }
 CParticleRendererFeatureDesc	$4E5BBEB1
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Tint";
 }
 CRHIMaterialShaders	$89AA45AB
 {
-	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
+	FragmentShader = "Library/PopcornFXCore/Shaders/Legacy/Particle_Master.frag";
 }
 CParticleNodeGraph	$FA62A490
 {
@@ -103,7 +103,7 @@ CParticleNodeGraph	$FA62A490
 }
 CParticleRendererFeatureDesc	$D25F542C
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "ComputeVelocity";
 	Mandatory = true;
 }

+ 19 - 19
PopcornFX/Library/PopcornFXCore/Materials/Distortion_Ribbon.pkma → PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Distortion_Ribbon.pkma

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CParticleRendererMaterial	$6B70D015
 {
 	RendererFeatures = {
@@ -24,89 +24,89 @@ CParticleRendererMaterial	$6B70D015
 }
 CParticleRendererFeatureDesc	$D0BFBDD9
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Distortion";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D857A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EnableRendering";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$DDEAB83F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "SoftParticles";
 }
 CParticleRendererFeatureDesc	$05ED5D39
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Atlas";
 }
 CParticleRendererFeatureDesc	$35A36C4E
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "GeometryRibbon";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$4B933A29
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "CorrectDeformation";
 }
 CParticleRendererFeatureDesc	$EAC726E3
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "TextureUVs";
 }
 CParticleRendererFeatureDesc	$4ADE8DE2
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "TextureRepeat";
 }
 CParticleRendererFeatureDesc	$D279714D
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "CustomTextureU";
 }
 CRHIMaterialShaders	$27E10855
 {
-	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
+	FragmentShader = "Library/PopcornFXCore/Shaders/Legacy/Particle_Master.frag";
 }
 CParticleRendererFeatureDesc	$B6BCAA6F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Diffuse";
 }
 CParticleRendererFeatureDesc	$451CCD2F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "DiffuseRamp";
 }
 CParticleRendererFeatureDesc	$BD4D7F29
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Emissive";
 }
 CParticleRendererFeatureDesc	$B3A8235C
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EmissiveRamp";
 }
 CParticleRendererFeatureDesc	$7B20F85D
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Tint";
 }
 CParticleRendererFeatureDesc	$AE117C84
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Lit";
 }
 CParticleRendererFeatureDesc	$D6EB29BC
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "TransformUVs";
 }
 CParticleNodeGraph	$A9947853
@@ -121,7 +121,7 @@ CParticleNodeGraph	$A9947853
 }
 CParticleRendererFeatureDesc	$558F3559
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "ComputeVelocity";
 	Mandatory = true;
 }

+ 18 - 18
PopcornFX/Library/PopcornFXCore/Materials/Opaque_Billboard.pkma → PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Opaque_Billboard.pkma

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CParticleRendererMaterial	$6B70D015
 {
 	RendererFeatures = {
@@ -23,80 +23,80 @@ CParticleRendererMaterial	$6B70D015
 }
 CParticleRendererFeatureDesc	$191F1761
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "GeometryBillboard";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D857A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Opaque";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$3D324B43
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Diffuse";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$35A36B4E
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "DiffuseRamp";
 }
 CParticleRendererFeatureDesc	$4B933A29
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Emissive";
 }
 CParticleRendererFeatureDesc	$35A36C4E
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EnableRendering";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$EA3837ED
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Lit";
 }
 CParticleRendererFeatureDesc	$1DB717AE
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "FlipUVs";
 }
 CParticleRendererFeatureDesc	$1098ED35
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "AlphaRemap";
 }
 CParticleRendererFeatureDesc	$CAD62F46
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Atlas";
 }
 CParticleRendererFeatureDesc	$C5F9C9BF
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "NormalWrap";
 }
 CParticleRendererFeatureDesc	$9154DFA0
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "NormalBend";
 }
 CParticleRendererFeatureDesc	$EAC726E3
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "TransformUVs";
 }
 CRHIMaterialShaders	$00269EC3
 {
-	FragmentShader = "Library/PopcornFXCore/Shaders/Opaque_Billboard.frag";
+	FragmentShader = "Library/PopcornFXCore/Shaders/Legacy/Opaque_Billboard.frag";
 }
 CParticleRendererFeatureDesc	$F936652D
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EmissiveRamp";
 }
 CParticleNodeGraph	$CD99CCED
@@ -111,7 +111,7 @@ CParticleNodeGraph	$CD99CCED
 }
 CParticleRendererFeatureDesc	$9C38A267
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "ComputeVelocity";
 	Mandatory = true;
 }
@@ -203,6 +203,6 @@ CParticleNodePinIn	$CA703AFB
 }
 CParticleRendererFeatureDesc	$BD7D33A6
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "LegacyLitOpaque";
 }

+ 21 - 21
PopcornFX/Library/PopcornFXCore/Materials/Opaque_Ribbon.pkma → PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Opaque_Ribbon.pkma

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CParticleRendererMaterial	$6B70D015
 {
 	RendererFeatures = {
@@ -26,95 +26,95 @@ CParticleRendererMaterial	$6B70D015
 }
 CParticleRendererFeatureDesc	$35A36C4E
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "GeometryRibbon";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D857A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Opaque";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$3D324B43
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Diffuse";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D279714D
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EnableRendering";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$EA3837ED
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Lit";
 }
 CParticleRendererFeatureDesc	$1098ED35
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "AlphaRemap";
 }
 CParticleRendererFeatureDesc	$CAD62F46
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Atlas";
 }
 CParticleRendererFeatureDesc	$C5F9C9BF
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "NormalWrap";
 }
 CParticleRendererFeatureDesc	$4B933A29
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "CorrectDeformation";
 }
 CParticleRendererFeatureDesc	$9154DFA0
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "CustomTextureU";
 }
 CParticleRendererFeatureDesc	$EAC726E3
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "TextureUVs";
 }
 CParticleRendererFeatureDesc	$4ADE8DE2
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "TextureRepeat";
 }
 CParticleRendererFeatureDesc	$D279714E
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "DiffuseRamp";
 }
 CParticleRendererFeatureDesc	$5F621394
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Emissive";
 }
 CParticleRendererFeatureDesc	$41E5AFE7
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "NormalBend";
 }
 CParticleRendererFeatureDesc	$BEDF8936
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "TransformUVs";
 }
 CRHIMaterialShaders	$00269EC3
 {
-	FragmentShader = "Library/PopcornFXCore/Shaders/Opaque_Ribbon.frag";
+	FragmentShader = "Library/PopcornFXCore/Shaders/Legacy/Opaque_Ribbon.frag";
 }
 CParticleRendererFeatureDesc	$3011D520
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EmissiveRamp";
 }
 CParticleNodeGraph	$26DE5A17
@@ -129,7 +129,7 @@ CParticleNodeGraph	$26DE5A17
 }
 CParticleRendererFeatureDesc	$AF945AB8
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "ComputeVelocity";
 	Mandatory = true;
 }
@@ -221,6 +221,6 @@ CParticleNodePinIn	$80CE492A
 }
 CParticleRendererFeatureDesc	$B1B7BA3B
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "LegacyLitOpaque";
 }

+ 10 - 10
PopcornFX/Library/PopcornFXCore/Materials/Opaque_Triangle.pkma → PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Opaque_Triangle.pkma

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CParticleRendererMaterial	$6B70D015
 {
 	RendererFeatures = {
@@ -14,50 +14,50 @@ CParticleRendererMaterial	$6B70D015
 }
 CParticleRendererFeatureDesc	$191F1761
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "GeometryTriangle";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$3D324B43
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Diffuse";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D857A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EnableRendering";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$35A36C4E
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Opaque";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$4B933A29
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Lit";
 }
 CParticleRendererFeatureDesc	$9154DFA0
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "NormalBend";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$EAC726E3
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "TriangleCustomNormals";
 }
 CParticleRendererFeatureDesc	$4ADE8DE2
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "TriangleCustomUVs";
 }
 CRHIMaterialShaders	$00269EC3
 {
-	FragmentShader = "Library/PopcornFXCore/Shaders/Opaque_Triangle.frag";
+	FragmentShader = "Library/PopcornFXCore/Shaders/Legacy/Opaque_Triangle.frag";
 }

+ 18 - 18
PopcornFX/Library/PopcornFXCore/Materials/Transparent_Mesh.pkma → PopcornFX/Library/PopcornFXCore/Materials/Legacy/Legacy_Transparent_Mesh.pkma

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CParticleRendererMaterial	$6B70D015
 {
 	RendererFeatures = {
@@ -23,91 +23,91 @@ CParticleRendererMaterial	$6B70D015
 }
 CParticleRendererFeatureDesc	$4126ECB5
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "GeometryMesh";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$CF8BEC2E
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Transparent";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$BF96EAFE
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Diffuse";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$35A36C4E
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EnableRendering";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D857A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "MeshAtlas";
 }
 CParticleRendererFeatureDesc	$9154ABA0
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "AlphaRemap";
 }
 CParticleRendererFeatureDesc	$4B933A29
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Emissive";
 }
 CParticleRendererFeatureDesc	$EAC726E3
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "DiffuseRamp";
 }
 CParticleRendererFeatureDesc	$9154DFA0
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "TransformUVs";
 }
 CParticleRendererFeatureDesc	$FF800025
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "SoftParticles";
 }
 CRHIMaterialShaders	$00269EC3
 {
-	FragmentShader = "Library/PopcornFXCore/Shaders/Transparent_Mesh.frag";
+	FragmentShader = "Library/PopcornFXCore/Shaders/Legacy/Transparent_Mesh.frag";
 }
 CParticleRendererFeatureDesc	$178EB8B0
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "EmissiveRamp";
 }
 CParticleRendererFeatureDesc	$30A73448
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "UseVertexColors";
 }
 CParticleRendererFeatureDesc	$21461F4D
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Atlas";
 }
 CParticleRendererFeatureDesc	$D46EA531
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "MeshLOD";
 }
 CParticleRendererFeatureDesc	$B15452BE
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "Culling";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$4A4A4170
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Editor.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Legacy.pkri";
 	RendererFeatureName = "ComputeVelocity";
 	Mandatory = true;
 }

+ 8 - 8
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Light/Light_Default.pkma → PopcornFX/Library/PopcornFXCore/Materials/Light_Default.pkma

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CParticleRendererMaterial	$6B70D015
 {
 	RendererFeatures = {
@@ -11,35 +11,35 @@ CParticleRendererMaterial	$6B70D015
 }
 CParticleRendererFeatureDesc	$409FF19E
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "GeometryLight";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$BFFD5E01
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "Light";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$27D7F2E5
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "LightAttenuation";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D857A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "EnableRendering";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$2FB0C593
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "LightTranslucent";
 }
 CRHIMaterialShaders	$73ED6589
 {
-	VertexShader = "Library/PopcornFXCore/Shaders/Experimental/Light_Default.vert";
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Light_Default.frag";
+	VertexShader = "Library/PopcornFXCore/Shaders/Light_Default.vert";
+	FragmentShader = "Library/PopcornFXCore/Shaders/Light_Default.frag";
 }

+ 603 - 0
PopcornFX/Library/PopcornFXCore/Materials/Mesh_AnimatedMasked.pkma

@@ -0,0 +1,603 @@
+Version = 2.20.1.21979;
+CParticleRendererMaterial	$6B70D015
+{
+	RendererFeatures = {
+		"$82290D6B",
+		"$855B560E",
+		"$BF53D1F0",
+		"$6E070218",
+		"$F9AE8557",
+		"$F3990E53",
+		"$3FD07EA7",
+		"$3576B2F9",
+		"$1CE37377",
+		"$3AB53997",
+		"$28002A64",
+		"$41E01F70",
+		"$923923FE",
+		"$2B0AD5F2",
+		"$B05415BE",
+		"$EA0E57EF",
+	};
+	NodeGraph = "$AEEAC0BC";
+}
+CRHIMaterialShaders	$00269EC3
+{
+	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
+}
+CParticleRendererFeatureDesc	$82290D6B
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "GeometryMesh";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$BF53D1F0
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "UVDistortions";
+}
+CParticleRendererFeatureDesc	$6E070218
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "AlphaMasks";
+}
+CParticleRendererFeatureDesc	$F9AE8557
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Dissolve";
+}
+CParticleRendererFeatureDesc	$F3990E53
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Emissive";
+}
+CParticleRendererFeatureDesc	$3FD07EA7
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EmissiveRamp";
+}
+CParticleRendererFeatureDesc	$3576B2F9
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Diffuse";
+	EnabledByDefault = true;
+}
+CParticleRendererFeatureDesc	$1CE37377
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "DiffuseRamp";
+}
+CParticleRendererFeatureDesc	$3AB53997
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TransformUVs";
+}
+CParticleRendererFeatureDesc	$28002A64
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Atlas";
+}
+CParticleRendererFeatureDesc	$41E01F70
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "NormalWrap";
+}
+CParticleRendererFeatureDesc	$923923FE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "NormalBend";
+}
+CParticleNodeGraph	$AEEAC0BC
+{
+	CustomName = "Adapter";
+	Nodes = {
+		"$4EACBB2A",
+		"$B7D91404",
+		"$E803212B",
+		"$3972C6F9",
+		"$ABF4F19C",
+		"$29098342",
+		"$BAFCDF17",
+		"$29F3505F",
+		"$ABA95939",
+		"$07BA0749",
+		"$647291C1",
+		"$5EB5E895",
+		"$AC5F2488",
+		"$76151B7F",
+		"$E89D2D19",
+		"$372F5415",
+		"$C23255FC",
+	};
+	WorkspacePosition = int2(-16, -155);
+	WorkspaceZoom = -6;
+	HasExplicitWorkspaceCoords = true;
+}
+CParticleNodeTemplateExport	$4EACBB2A
+{
+	InputPins = {
+		"$737D0DAF",
+	};
+	OutputPins = {
+		"$8C1042AC",
+	};
+	WorkspacePosition = int2(-572, 308);
+	ExportedName = "AlphaMasks";
+	ExportedType = bool;
+	Type = Input;
+	InputType = Property;
+}
+CParticleNodePinIn	$737D0DAF
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$4EACBB2A";
+}
+CParticleNodePinOut	$8C1042AC
+{
+	SelfName = "Value";
+	Owner = "$4EACBB2A";
+}
+CParticleNodeTemplateExport	$B7D91404
+{
+	InputPins = {
+		"$EB6CD3B8",
+	};
+	OutputPins = {
+		"$B2F5596D",
+	};
+	WorkspacePosition = int2(-572, -220);
+	ExportedName = "Dissolve";
+	ExportedType = bool;
+	Type = Input;
+	InputType = Property;
+}
+CParticleNodePinIn	$EB6CD3B8
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$B7D91404";
+}
+CParticleNodePinOut	$B2F5596D
+{
+	SelfName = "Value";
+	Owner = "$B7D91404";
+}
+CParticleRendererFeatureDesc	$2B0AD5F2
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Lit";
+}
+CParticleRendererFeatureDesc	$B05415BE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Transparent";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$EA0E57EF
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "MeshAtlas";
+}
+CParticleNodeTemplate	$E803212B
+{
+	InputPins = {
+		"$D4FF3CC6",
+	};
+	OutputPins = {
+		"$FAF765D7",
+	};
+	WorkspacePosition = int2(-1276, 1012);
+	SubGraphFilePath = "Library/PopcornFXCore/Templates/Core.pkfx";
+	SubGraphName = "self.age";
+}
+CParticleNodePinIn	$D4FF3CC6
+{
+	SelfName = "Scale";
+	Type = float;
+	Visible = false;
+	Owner = "$E803212B";
+	BaseType = float;
+	ValueF = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinOut	$FAF765D7
+{
+	SelfName = "Age";
+	Type = float;
+	Owner = "$E803212B";
+	BaseType = float;
+	ConnectedPins = {
+		"$7D3417F3",
+		"$AA4AECB6",
+		"$EA173C08",
+		"$00D1E63F",
+	};
+}
+CParticleNodeTemplateExport	$3972C6F9
+{
+	InputPins = {
+		"$AA4AECB6",
+	};
+	OutputPins = {
+		"$071FD58B",
+	};
+	WorkspacePosition = int2(-572, 792);
+	ExportedName = "AlphaMasks.Mask2AnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+}
+CParticleNodePinIn	$AA4AECB6
+{
+	SelfName = "DefaultValue";
+	Owner = "$3972C6F9";
+	ConnectedPins = {
+		"$FAF765D7",
+	};
+}
+CParticleNodePinOut	$071FD58B
+{
+	SelfName = "Value";
+	Owner = "$3972C6F9";
+	ConnectedPins = {
+		"$CD885762",
+	};
+}
+CParticleNodeTemplateExport	$ABF4F19C
+{
+	InputPins = {
+		"$2E838A2D",
+	};
+	OutputPins = {
+		"$66A1A340",
+	};
+	WorkspacePosition = int2(-572, 1034);
+	ExportedName = "UVDistortions";
+	ExportedType = bool;
+	Type = Input;
+	InputType = Property;
+}
+CParticleNodePinIn	$2E838A2D
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$ABF4F19C";
+}
+CParticleNodePinOut	$66A1A340
+{
+	SelfName = "Value";
+	Owner = "$ABF4F19C";
+}
+CParticleNodeTemplateExport	$29098342
+{
+	InputPins = {
+		"$7D3417F3",
+	};
+	OutputPins = {
+		"$1F78DBBA",
+	};
+	WorkspacePosition = int2(-572, 572);
+	ExportedName = "AlphaMasks.Mask1AnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+}
+CParticleNodePinIn	$7D3417F3
+{
+	SelfName = "DefaultValue";
+	Owner = "$29098342";
+	ConnectedPins = {
+		"$FAF765D7",
+	};
+}
+CParticleNodePinOut	$1F78DBBA
+{
+	SelfName = "Value";
+	Owner = "$29098342";
+	ConnectedPins = {
+		"$C9BCFB39",
+	};
+}
+CParticleNodeTemplateExport	$BAFCDF17
+{
+	InputPins = {
+		"$EA173C08",
+	};
+	OutputPins = {
+		"$DE06FA4B",
+	};
+	WorkspacePosition = int2(-572, 1254);
+	ExportedName = "UVDistortions.Distortion1AnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+}
+CParticleNodePinIn	$EA173C08
+{
+	SelfName = "DefaultValue";
+	Owner = "$BAFCDF17";
+	ConnectedPins = {
+		"$FAF765D7",
+	};
+}
+CParticleNodePinOut	$DE06FA4B
+{
+	SelfName = "Value";
+	Owner = "$BAFCDF17";
+	ConnectedPins = {
+		"$E1ECEBBB",
+	};
+}
+CParticleNodeTemplateExport	$29F3505F
+{
+	InputPins = {
+		"$00D1E63F",
+	};
+	OutputPins = {
+		"$76F6C6A5",
+	};
+	WorkspacePosition = int2(-572, 1474);
+	ExportedName = "UVDistortions.Distortion2AnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+}
+CParticleNodePinIn	$00D1E63F
+{
+	SelfName = "DefaultValue";
+	Owner = "$29F3505F";
+	ConnectedPins = {
+		"$FAF765D7",
+	};
+}
+CParticleNodePinOut	$76F6C6A5
+{
+	SelfName = "Value";
+	Owner = "$29F3505F";
+	ConnectedPins = {
+		"$209B311A",
+	};
+}
+CParticleNodeTemplateExport	$ABA95939
+{
+	InputPins = {
+		"$C9BCFB39",
+	};
+	WorkspacePosition = int2(396, 572);
+	ExportedName = "AlphaMasks.Mask1AnimationCursor";
+	ExportedType = float;
+	Type = Output;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+}
+CParticleNodePinIn	$C9BCFB39
+{
+	SelfName = "Value";
+	Owner = "$ABA95939";
+	ConnectedPins = {
+		"$1F78DBBA",
+	};
+}
+CParticleNodeTemplateExport	$07BA0749
+{
+	InputPins = {
+		"$CD885762",
+	};
+	WorkspacePosition = int2(396, 792);
+	ExportedName = "AlphaMasks.Mask2AnimationCursor";
+	ExportedType = float;
+	Type = Output;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+}
+CParticleNodePinIn	$CD885762
+{
+	SelfName = "Value";
+	Owner = "$07BA0749";
+	ConnectedPins = {
+		"$071FD58B",
+	};
+}
+CParticleNodeTemplateExport	$647291C1
+{
+	InputPins = {
+		"$E1ECEBBB",
+	};
+	WorkspacePosition = int2(396, 1254);
+	ExportedName = "UVDistortions.Distortion1AnimationCursor";
+	ExportedType = float;
+	Type = Output;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+}
+CParticleNodePinIn	$E1ECEBBB
+{
+	SelfName = "Value";
+	Owner = "$647291C1";
+	ConnectedPins = {
+		"$DE06FA4B",
+	};
+}
+CParticleNodeTemplateExport	$5EB5E895
+{
+	InputPins = {
+		"$209B311A",
+	};
+	WorkspacePosition = int2(396, 1474);
+	ExportedName = "UVDistortions.Distortion2AnimationCursor";
+	ExportedType = float;
+	Type = Output;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+}
+CParticleNodePinIn	$209B311A
+{
+	SelfName = "Value";
+	Owner = "$5EB5E895";
+	ConnectedPins = {
+		"$76F6C6A5",
+	};
+}
+CParticleRendererFeatureDesc	$855B560E
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "ComputeVelocity";
+	Mandatory = true;
+}
+CParticleNodeTemplateExport	$AC5F2488
+{
+	Description = {
+		"@eng:Billboard center in world coordinates",
+	};
+	InputPins = {
+		"$324A2A6F",
+	};
+	OutputPins = {
+		"$13FDAE2B",
+	};
+	WorkspacePosition = int2(-572, -462);
+	ExportedName = "General.Position";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Input;
+	VisibleByDefault = true;
+	TransformSpace = World;
+	TransformMode = Position;
+	CategoryName = {
+		"@eng:General",
+	};
+}
+CParticleNodePinIn	$324A2A6F
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$AC5F2488";
+}
+CParticleNodePinOut	$13FDAE2B
+{
+	SelfName = "Value";
+	Owner = "$AC5F2488";
+	ConnectedPins = {
+		"$49FA21EE",
+	};
+}
+CParticleNodeTemplate	$76151B7F
+{
+	InputPins = {
+		"$49FA21EE",
+	};
+	OutputPins = {
+		"$6CAF5EF1",
+	};
+	WorkspacePosition = int2(-88, -462);
+	SubGraphFilePath = "Library/PopcornFXCore/Templates/Core.pkfx";
+	SubGraphName = "PreviousFrameValue";
+}
+CParticleNodePinIn	$49FA21EE
+{
+	SelfName = "Value";
+	Owner = "$76151B7F";
+	ConnectedPins = {
+		"$13FDAE2B",
+	};
+}
+CParticleNodePinOut	$6CAF5EF1
+{
+	SelfName = "Value";
+	Owner = "$76151B7F";
+	ConnectedPins = {
+		"$0C03EAB7",
+	};
+}
+CParticleNodeTemplateExport	$E89D2D19
+{
+	InputPins = {
+		"$0C03EAB7",
+	};
+	WorkspacePosition = int2(396, -462);
+	ExportedName = "ComputeVelocity.PreviousPosition";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Output;
+	TransformSpace = World;
+	TransformMode = Position;
+}
+CParticleNodePinIn	$0C03EAB7
+{
+	SelfName = "Value";
+	Owner = "$E89D2D19";
+	ConnectedPins = {
+		"$6CAF5EF1",
+	};
+}
+CParticleNodeTemplateExport	$372F5415
+{
+	Description = {
+		"@eng:[0, inf] value that acts as the alpha threshold value for the dissolve. With a dissolve softness of zero, every pixel that has an alpha value less than the animation cursor value will be discarded.",
+	};
+	InputPins = {
+		"$9ADE52A6",
+	};
+	OutputPins = {
+		"$EB33D373",
+	};
+	WorkspacePosition = int2(-572, -44);
+	ExportedName = "Dissolve.DissolveAnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:Dissolve",
+	};
+	DefaultValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$9ADE52A6
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$372F5415";
+}
+CParticleNodePinOut	$EB33D373
+{
+	SelfName = "Value";
+	Owner = "$372F5415";
+	ConnectedPins = {
+		"$008F7EB8",
+	};
+}
+CParticleNodeTemplateExport	$C23255FC
+{
+	Description = {
+		"@eng:[0, inf] value that acts as the alpha threshold value for the dissolve. With a dissolve softness of zero, every pixel that has an alpha value less than the animation cursor value will be discarded.",
+	};
+	InputPins = {
+		"$008F7EB8",
+	};
+	WorkspacePosition = int2(418, -44);
+	ExportedName = "Dissolve.DissolveAnimationCursor";
+	ExportedType = float;
+	Type = Output;
+	CategoryName = {
+		"@eng:Dissolve",
+	};
+	DefaultValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$008F7EB8
+{
+	SelfName = "Value";
+	Owner = "$C23255FC";
+	ConnectedPins = {
+		"$EB33D373",
+	};
+}

+ 191 - 0
PopcornFX/Library/PopcornFXCore/Materials/Mesh_Emissive.pkma

@@ -0,0 +1,191 @@
+Version = 2.20.1.21979;
+CParticleRendererMaterial	$6B70D015
+{
+	RendererFeatures = {
+		"$191F1761",
+		"$30D76203",
+		"$D857A09F",
+		"$008ACB56",
+		"$93540081",
+		"$35A36C4E",
+		"$7FB4AB5F",
+		"$337C6546",
+		"$EAC726E3",
+		"$1BCA2B7D",
+		"$B040E9CD",
+		"$862F644E",
+		"$98B9ED49",
+	};
+	NodeGraph = "$22336263";
+}
+CParticleRendererFeatureDesc	$191F1761
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "GeometryMesh";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$D857A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EnableRendering";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$35A36C4E
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Emissive";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$7FB4AB5F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EmissiveRamp";
+}
+CParticleRendererFeatureDesc	$EAC726E3
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TransformUVs";
+}
+CRHIMaterialShaders	$00269EC3
+{
+	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
+}
+CParticleRendererFeatureDesc	$1BCA2B7D
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TextureRepeat";
+}
+CParticleRendererFeatureDesc	$B040E9CD
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "MeshAtlas";
+}
+CParticleRendererFeatureDesc	$862F644E
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "UseVertexColors";
+}
+CParticleRendererFeatureDesc	$93540081
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Transparent";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$98B9ED49
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "SoftParticles";
+}
+CParticleRendererFeatureDesc	$337C6546
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Atlas";
+}
+CParticleRendererFeatureDesc	$008ACB56
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Culling";
+	Mandatory = true;
+}
+CParticleNodeGraph	$22336263
+{
+	CustomName = "Adapter";
+	Nodes = {
+		"$D6B30FC7",
+		"$F48A9649",
+		"$89D8281F",
+	};
+	WorkspaceZoom = -4;
+}
+CParticleRendererFeatureDesc	$30D76203
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "ComputeVelocity";
+	Mandatory = true;
+}
+CParticleNodeTemplateExport	$D6B30FC7
+{
+	Description = {
+		"@eng:Billboard center in world coordinates",
+	};
+	InputPins = {
+		"$96B60D1E",
+	};
+	OutputPins = {
+		"$A5C884C3",
+	};
+	WorkspacePosition = int2(-572, -44);
+	ExportedName = "General.Position";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Input;
+	VisibleByDefault = true;
+	TransformSpace = World;
+	TransformMode = Position;
+	CategoryName = {
+		"@eng:General",
+	};
+}
+CParticleNodePinIn	$96B60D1E
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$D6B30FC7";
+}
+CParticleNodePinOut	$A5C884C3
+{
+	SelfName = "Value";
+	Owner = "$D6B30FC7";
+	ConnectedPins = {
+		"$C037E02F",
+	};
+}
+CParticleNodeTemplate	$F48A9649
+{
+	InputPins = {
+		"$C037E02F",
+	};
+	OutputPins = {
+		"$C8FC5782",
+	};
+	WorkspacePosition = int2(-88, -44);
+	SubGraphFilePath = "Library/PopcornFXCore/Templates/Core.pkfx";
+	SubGraphName = "PreviousFrameValue";
+}
+CParticleNodePinIn	$C037E02F
+{
+	SelfName = "Value";
+	Owner = "$F48A9649";
+	ConnectedPins = {
+		"$A5C884C3",
+	};
+}
+CParticleNodePinOut	$C8FC5782
+{
+	SelfName = "Value";
+	Owner = "$F48A9649";
+	ConnectedPins = {
+		"$4DAB7D0D",
+	};
+}
+CParticleNodeTemplateExport	$89D8281F
+{
+	InputPins = {
+		"$4DAB7D0D",
+	};
+	WorkspacePosition = int2(396, -44);
+	ExportedName = "ComputeVelocity.PreviousPosition";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Output;
+	TransformSpace = World;
+	TransformMode = Position;
+}
+CParticleNodePinIn	$4DAB7D0D
+{
+	SelfName = "Value";
+	Owner = "$89D8281F";
+	ConnectedPins = {
+		"$C8FC5782",
+	};
+}

+ 209 - 0
PopcornFX/Library/PopcornFXCore/Materials/Mesh_Opaque.pkma

@@ -0,0 +1,209 @@
+Version = 2.20.1.21979;
+CParticleRendererMaterial	$6B70D015
+{
+	RendererFeatures = {
+		"$191F1761",
+		"$1046C467",
+		"$D857A09F",
+		"$D8481107",
+		"$A357A567",
+		"$3D324B43",
+		"$D851A09F",
+		"$EA3837ED",
+		"$35A36C4E",
+		"$7FB4AB5F",
+		"$CB4D3C7E",
+		"$1098ED35",
+		"$EAC726E3",
+		"$1BCA2B7D",
+		"$B040E9CD",
+		"$862F644E",
+	};
+	NodeGraph = "$37F5471E";
+}
+CParticleRendererFeatureDesc	$191F1761
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "GeometryMesh";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$D857A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EnableRendering";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$3D324B43
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Diffuse";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$D851A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "DiffuseRamp";
+}
+CParticleRendererFeatureDesc	$EA3837ED
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Lit";
+}
+CParticleRendererFeatureDesc	$35A36C4E
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Emissive";
+}
+CParticleRendererFeatureDesc	$7FB4AB5F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EmissiveRamp";
+}
+CParticleRendererFeatureDesc	$1098ED35
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "AlphaRemap";
+}
+CParticleRendererFeatureDesc	$EAC726E3
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TransformUVs";
+}
+CRHIMaterialShaders	$00269EC3
+{
+	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
+}
+CParticleRendererFeatureDesc	$A357A567
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Opaque";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$1BCA2B7D
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TextureRepeat";
+}
+CParticleRendererFeatureDesc	$B040E9CD
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "MeshAtlas";
+}
+CParticleRendererFeatureDesc	$862F644E
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "UseVertexColors";
+}
+CParticleRendererFeatureDesc	$CB4D3C7E
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Atlas";
+}
+CParticleRendererFeatureDesc	$D8481107
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Culling";
+	Mandatory = true;
+}
+CParticleNodeGraph	$37F5471E
+{
+	CustomName = "Adapter";
+	Nodes = {
+		"$87F67927",
+		"$418856AB",
+		"$B5A326C1",
+	};
+	WorkspaceZoom = -4;
+}
+CParticleRendererFeatureDesc	$1046C467
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "ComputeVelocity";
+	Mandatory = true;
+}
+CParticleNodeTemplateExport	$87F67927
+{
+	Description = {
+		"@eng:Billboard center in world coordinates",
+	};
+	InputPins = {
+		"$A31B735D",
+	};
+	OutputPins = {
+		"$E0AE63BD",
+	};
+	WorkspacePosition = int2(-572, -44);
+	ExportedName = "General.Position";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Input;
+	VisibleByDefault = true;
+	TransformSpace = World;
+	TransformMode = Position;
+	CategoryName = {
+		"@eng:General",
+	};
+}
+CParticleNodePinIn	$A31B735D
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$87F67927";
+}
+CParticleNodePinOut	$E0AE63BD
+{
+	SelfName = "Value";
+	Owner = "$87F67927";
+	ConnectedPins = {
+		"$62CF9F44",
+	};
+}
+CParticleNodeTemplate	$418856AB
+{
+	InputPins = {
+		"$62CF9F44",
+	};
+	OutputPins = {
+		"$F182785E",
+	};
+	WorkspacePosition = int2(-88, -44);
+	SubGraphFilePath = "Library/PopcornFXCore/Templates/Core.pkfx";
+	SubGraphName = "PreviousFrameValue";
+}
+CParticleNodePinIn	$62CF9F44
+{
+	SelfName = "Value";
+	Owner = "$418856AB";
+	ConnectedPins = {
+		"$E0AE63BD",
+	};
+}
+CParticleNodePinOut	$F182785E
+{
+	SelfName = "Value";
+	Owner = "$418856AB";
+	ConnectedPins = {
+		"$6DA9B3B7",
+	};
+}
+CParticleNodeTemplateExport	$B5A326C1
+{
+	InputPins = {
+		"$6DA9B3B7",
+	};
+	WorkspacePosition = int2(396, -44);
+	ExportedName = "ComputeVelocity.PreviousPosition";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Output;
+	TransformSpace = World;
+	TransformMode = Position;
+}
+CParticleNodePinIn	$6DA9B3B7
+{
+	SelfName = "Value";
+	Owner = "$B5A326C1";
+	ConnectedPins = {
+		"$F182785E",
+	};
+}

+ 196 - 0
PopcornFX/Library/PopcornFXCore/Materials/Mesh_Tinted.pkma

@@ -0,0 +1,196 @@
+Version = 2.20.1.21979;
+CParticleRendererMaterial	$6B70D015
+{
+	RendererFeatures = {
+		"$191F1761",
+		"$0AFDE33C",
+		"$D857A09F",
+		"$008ACB56",
+		"$93540081",
+		"$35A36C4E",
+		"$7FB4AB5F",
+		"$337C6546",
+		"$EAC726E3",
+		"$1BCA2B7D",
+		"$B040E9CD",
+		"$862F644E",
+		"$98B9ED49",
+		"$69384768",
+	};
+	NodeGraph = "$49625406";
+}
+CParticleRendererFeatureDesc	$191F1761
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "GeometryMesh";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$D857A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EnableRendering";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$35A36C4E
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Emissive";
+}
+CParticleRendererFeatureDesc	$7FB4AB5F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EmissiveRamp";
+}
+CParticleRendererFeatureDesc	$EAC726E3
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TransformUVs";
+}
+CRHIMaterialShaders	$00269EC3
+{
+	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
+}
+CParticleRendererFeatureDesc	$1BCA2B7D
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TextureRepeat";
+}
+CParticleRendererFeatureDesc	$B040E9CD
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "MeshAtlas";
+}
+CParticleRendererFeatureDesc	$862F644E
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "UseVertexColors";
+}
+CParticleRendererFeatureDesc	$93540081
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Transparent";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$98B9ED49
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "SoftParticles";
+}
+CParticleRendererFeatureDesc	$337C6546
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Atlas";
+}
+CParticleRendererFeatureDesc	$008ACB56
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Culling";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$69384768
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Tint";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$0AFDE33C
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "ComputeVelocity";
+}
+CParticleNodeGraph	$49625406
+{
+	CustomName = "Adapter";
+	Nodes = {
+		"$4EE64E02",
+		"$CD7322A4",
+		"$D75B3EBE",
+	};
+	WorkspaceZoom = -4;
+}
+CParticleNodeTemplateExport	$4EE64E02
+{
+	Description = {
+		"@eng:Billboard center in world coordinates",
+	};
+	InputPins = {
+		"$1FC67CB6",
+	};
+	OutputPins = {
+		"$B8371FA2",
+	};
+	WorkspacePosition = int2(-572, -44);
+	ExportedName = "General.Position";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Input;
+	VisibleByDefault = true;
+	TransformSpace = World;
+	TransformMode = Position;
+	CategoryName = {
+		"@eng:General",
+	};
+}
+CParticleNodePinIn	$1FC67CB6
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$4EE64E02";
+}
+CParticleNodePinOut	$B8371FA2
+{
+	SelfName = "Value";
+	Owner = "$4EE64E02";
+	ConnectedPins = {
+		"$30E90247",
+	};
+}
+CParticleNodeTemplate	$CD7322A4
+{
+	InputPins = {
+		"$30E90247",
+	};
+	OutputPins = {
+		"$79A6F42F",
+	};
+	WorkspacePosition = int2(-88, -44);
+	SubGraphFilePath = "Library/PopcornFXCore/Templates/Core.pkfx";
+	SubGraphName = "PreviousFrameValue";
+}
+CParticleNodePinIn	$30E90247
+{
+	SelfName = "Value";
+	Owner = "$CD7322A4";
+	ConnectedPins = {
+		"$B8371FA2",
+	};
+}
+CParticleNodePinOut	$79A6F42F
+{
+	SelfName = "Value";
+	Owner = "$CD7322A4";
+	ConnectedPins = {
+		"$44D2827F",
+	};
+}
+CParticleNodeTemplateExport	$D75B3EBE
+{
+	InputPins = {
+		"$44D2827F",
+	};
+	WorkspacePosition = int2(396, -44);
+	ExportedName = "ComputeVelocity.PreviousPosition";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Output;
+	TransformSpace = World;
+	TransformMode = Position;
+}
+CParticleNodePinIn	$44D2827F
+{
+	SelfName = "Value";
+	Owner = "$D75B3EBE";
+	ConnectedPins = {
+		"$79A6F42F",
+	};
+}

+ 577 - 0
PopcornFX/Library/PopcornFXCore/Materials/Ribbon_AnimatedMasked.pkma

@@ -0,0 +1,577 @@
+Version = 2.20.1.21979;
+CParticleRendererMaterial	$6B70D015
+{
+	RendererFeatures = {
+		"$82290D6B",
+		"$BBEA7D3C",
+		"$BF53D1F0",
+		"$6E070218",
+		"$F9AE8557",
+		"$F3990E53",
+		"$3FD07EA7",
+		"$3576B2F9",
+		"$1CE37377",
+		"$3AB53997",
+		"$41E01F70",
+		"$923923FE",
+		"$2B0AD5F2",
+		"$B05415BE",
+		"$E768DA10",
+		"$16691B38",
+	};
+	NodeGraph = "$AEEAC0BC";
+}
+CRHIMaterialShaders	$00269EC3
+{
+	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
+}
+CParticleRendererFeatureDesc	$82290D6B
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "GeometryRibbon";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$BF53D1F0
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "UVDistortions";
+}
+CParticleRendererFeatureDesc	$6E070218
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "AlphaMasks";
+}
+CParticleRendererFeatureDesc	$F9AE8557
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Dissolve";
+}
+CParticleRendererFeatureDesc	$F3990E53
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Emissive";
+	EnabledByDefault = true;
+}
+CParticleRendererFeatureDesc	$3FD07EA7
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EmissiveRamp";
+}
+CParticleRendererFeatureDesc	$3576B2F9
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Diffuse";
+}
+CParticleRendererFeatureDesc	$1CE37377
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "DiffuseRamp";
+}
+CParticleRendererFeatureDesc	$3AB53997
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TransformUVs";
+}
+CParticleRendererFeatureDesc	$41E01F70
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "NormalWrap";
+}
+CParticleRendererFeatureDesc	$923923FE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "NormalBend";
+}
+CParticleNodeGraph	$AEEAC0BC
+{
+	CustomName = "Adapter";
+	Nodes = {
+		"$4EACBB2A",
+		"$3DD83F59",
+		"$97D3828B",
+		"$8C6E0B59",
+		"$052D0901",
+		"$C924A3F5",
+		"$0FCC4CE4",
+		"$C615FBE0",
+		"$10A48657",
+		"$C269499B",
+		"$55A3BB36",
+		"$851A7529",
+		"$F06DBE83",
+		"$E9AA2DA5",
+		"$56D22DB2",
+		"$1A584F4A",
+	};
+	WorkspacePosition = int2(-14, -184);
+	WorkspaceZoom = -6;
+	HasExplicitWorkspaceCoords = true;
+}
+CParticleNodeTemplateExport	$4EACBB2A
+{
+	InputPins = {
+		"$737D0DAF",
+	};
+	OutputPins = {
+		"$8C1042AC",
+	};
+	WorkspacePosition = int2(-572, 308);
+	ExportedName = "AlphaMasks";
+	ExportedType = bool;
+	Type = Input;
+	InputType = Property;
+}
+CParticleNodePinIn	$737D0DAF
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$4EACBB2A";
+}
+CParticleNodePinOut	$8C1042AC
+{
+	SelfName = "Value";
+	Owner = "$4EACBB2A";
+}
+CParticleRendererFeatureDesc	$2B0AD5F2
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Lit";
+}
+CParticleRendererFeatureDesc	$B05415BE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Transparent";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$E768DA10
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "CorrectDeformation";
+}
+CParticleNodeTemplate	$3DD83F59
+{
+	InputPins = {
+		"$2D817408",
+	};
+	OutputPins = {
+		"$56CB17CB",
+	};
+	WorkspacePosition = int2(-1276, 990);
+	SubGraphFilePath = "Library/PopcornFXCore/Templates/Core.pkfx";
+	SubGraphName = "self.age";
+}
+CParticleNodePinIn	$2D817408
+{
+	SelfName = "Scale";
+	Type = float;
+	Visible = false;
+	Owner = "$3DD83F59";
+	BaseType = float;
+	ValueF = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinOut	$56CB17CB
+{
+	SelfName = "Age";
+	Type = float;
+	Owner = "$3DD83F59";
+	BaseType = float;
+	ConnectedPins = {
+		"$E117A7C8",
+		"$ACD68EDB",
+		"$F60A46C2",
+		"$1FB5CE00",
+	};
+}
+CParticleNodeTemplateExport	$97D3828B
+{
+	InputPins = {
+		"$ACD68EDB",
+	};
+	OutputPins = {
+		"$D42DA13A",
+	};
+	WorkspacePosition = int2(-572, 770);
+	ExportedName = "AlphaMasks.Mask2AnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+}
+CParticleNodePinIn	$ACD68EDB
+{
+	SelfName = "DefaultValue";
+	Owner = "$97D3828B";
+	ConnectedPins = {
+		"$56CB17CB",
+	};
+}
+CParticleNodePinOut	$D42DA13A
+{
+	SelfName = "Value";
+	Owner = "$97D3828B";
+	ConnectedPins = {
+		"$3ED353BE",
+	};
+}
+CParticleNodeTemplateExport	$8C6E0B59
+{
+	InputPins = {
+		"$7F874C63",
+	};
+	OutputPins = {
+		"$20D8C01D",
+	};
+	WorkspacePosition = int2(-572, 1012);
+	ExportedName = "UVDistortions";
+	ExportedType = bool;
+	Type = Input;
+	InputType = Property;
+}
+CParticleNodePinIn	$7F874C63
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$8C6E0B59";
+}
+CParticleNodePinOut	$20D8C01D
+{
+	SelfName = "Value";
+	Owner = "$8C6E0B59";
+}
+CParticleNodeTemplateExport	$052D0901
+{
+	InputPins = {
+		"$E117A7C8",
+	};
+	OutputPins = {
+		"$FE3E3461",
+	};
+	WorkspacePosition = int2(-572, 550);
+	ExportedName = "AlphaMasks.Mask1AnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+}
+CParticleNodePinIn	$E117A7C8
+{
+	SelfName = "DefaultValue";
+	Owner = "$052D0901";
+	ConnectedPins = {
+		"$56CB17CB",
+	};
+}
+CParticleNodePinOut	$FE3E3461
+{
+	SelfName = "Value";
+	Owner = "$052D0901";
+	ConnectedPins = {
+		"$E1298589",
+	};
+}
+CParticleNodeTemplateExport	$C924A3F5
+{
+	InputPins = {
+		"$F60A46C2",
+	};
+	OutputPins = {
+		"$D830BFC8",
+	};
+	WorkspacePosition = int2(-572, 1232);
+	ExportedName = "UVDistortions.Distortion1AnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+}
+CParticleNodePinIn	$F60A46C2
+{
+	SelfName = "DefaultValue";
+	Owner = "$C924A3F5";
+	ConnectedPins = {
+		"$56CB17CB",
+	};
+}
+CParticleNodePinOut	$D830BFC8
+{
+	SelfName = "Value";
+	Owner = "$C924A3F5";
+	ConnectedPins = {
+		"$EB2EBB07",
+	};
+}
+CParticleNodeTemplateExport	$0FCC4CE4
+{
+	InputPins = {
+		"$1FB5CE00",
+	};
+	OutputPins = {
+		"$D19D1D5E",
+	};
+	WorkspacePosition = int2(-572, 1452);
+	ExportedName = "UVDistortions.Distortion2AnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+}
+CParticleNodePinIn	$1FB5CE00
+{
+	SelfName = "DefaultValue";
+	Owner = "$0FCC4CE4";
+	ConnectedPins = {
+		"$56CB17CB",
+	};
+}
+CParticleNodePinOut	$D19D1D5E
+{
+	SelfName = "Value";
+	Owner = "$0FCC4CE4";
+	ConnectedPins = {
+		"$D3C4F805",
+	};
+}
+CParticleNodeTemplateExport	$C615FBE0
+{
+	InputPins = {
+		"$E1298589",
+	};
+	WorkspacePosition = int2(396, 550);
+	ExportedName = "AlphaMasks.Mask1AnimationCursor";
+	ExportedType = float;
+	Type = Output;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+}
+CParticleNodePinIn	$E1298589
+{
+	SelfName = "Value";
+	Owner = "$C615FBE0";
+	ConnectedPins = {
+		"$FE3E3461",
+	};
+}
+CParticleNodeTemplateExport	$10A48657
+{
+	InputPins = {
+		"$3ED353BE",
+	};
+	WorkspacePosition = int2(396, 770);
+	ExportedName = "AlphaMasks.Mask2AnimationCursor";
+	ExportedType = float;
+	Type = Output;
+	CategoryName = {
+		"@eng:AlphaMasks",
+	};
+}
+CParticleNodePinIn	$3ED353BE
+{
+	SelfName = "Value";
+	Owner = "$10A48657";
+	ConnectedPins = {
+		"$D42DA13A",
+	};
+}
+CParticleNodeTemplateExport	$C269499B
+{
+	InputPins = {
+		"$EB2EBB07",
+	};
+	WorkspacePosition = int2(396, 1232);
+	ExportedName = "UVDistortions.Distortion1AnimationCursor";
+	ExportedType = float;
+	Type = Output;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+}
+CParticleNodePinIn	$EB2EBB07
+{
+	SelfName = "Value";
+	Owner = "$C269499B";
+	ConnectedPins = {
+		"$D830BFC8",
+	};
+}
+CParticleNodeTemplateExport	$55A3BB36
+{
+	InputPins = {
+		"$D3C4F805",
+	};
+	WorkspacePosition = int2(396, 1452);
+	ExportedName = "UVDistortions.Distortion2AnimationCursor";
+	ExportedType = float;
+	Type = Output;
+	CategoryName = {
+		"@eng:UVDistortions",
+	};
+}
+CParticleNodePinIn	$D3C4F805
+{
+	SelfName = "Value";
+	Owner = "$55A3BB36";
+	ConnectedPins = {
+		"$D19D1D5E",
+	};
+}
+CParticleRendererFeatureDesc	$16691B38
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "FastLit";
+}
+CParticleRendererFeatureDesc	$BBEA7D3C
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "ComputeVelocity";
+	Mandatory = true;
+}
+CParticleNodeTemplateExport	$851A7529
+{
+	Description = {
+		"@eng:Billboard center in world coordinates",
+	};
+	InputPins = {
+		"$E14E1391",
+	};
+	OutputPins = {
+		"$2926C4DC",
+	};
+	WorkspacePosition = int2(-572, -374);
+	ExportedName = "General.Position";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Input;
+	VisibleByDefault = true;
+	TransformSpace = World;
+	TransformMode = Position;
+	CategoryName = {
+		"@eng:General",
+	};
+}
+CParticleNodePinIn	$E14E1391
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$851A7529";
+}
+CParticleNodePinOut	$2926C4DC
+{
+	SelfName = "Value";
+	Owner = "$851A7529";
+	ConnectedPins = {
+		"$8102EC8B",
+	};
+}
+CParticleNodeTemplate	$F06DBE83
+{
+	InputPins = {
+		"$8102EC8B",
+	};
+	OutputPins = {
+		"$7B2868F7",
+	};
+	WorkspacePosition = int2(-88, -374);
+	SubGraphFilePath = "Library/PopcornFXCore/Templates/Core.pkfx";
+	SubGraphName = "PreviousFrameValue";
+}
+CParticleNodePinIn	$8102EC8B
+{
+	SelfName = "Value";
+	Owner = "$F06DBE83";
+	ConnectedPins = {
+		"$2926C4DC",
+	};
+}
+CParticleNodePinOut	$7B2868F7
+{
+	SelfName = "Value";
+	Owner = "$F06DBE83";
+	ConnectedPins = {
+		"$0264551C",
+	};
+}
+CParticleNodeTemplateExport	$E9AA2DA5
+{
+	InputPins = {
+		"$0264551C",
+	};
+	WorkspacePosition = int2(396, -374);
+	ExportedName = "ComputeVelocity.PreviousPosition";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Output;
+	TransformSpace = World;
+	TransformMode = Position;
+}
+CParticleNodePinIn	$0264551C
+{
+	SelfName = "Value";
+	Owner = "$E9AA2DA5";
+	ConnectedPins = {
+		"$7B2868F7",
+	};
+}
+CParticleNodeTemplateExport	$56D22DB2
+{
+	Description = {
+		"@eng:[0, inf] value that acts as the alpha threshold value for the dissolve. With a dissolve softness of zero, every pixel that has an alpha value less than the animation cursor value will be discarded.",
+	};
+	InputPins = {
+		"$648457F2",
+	};
+	OutputPins = {
+		"$1A9EB007",
+	};
+	WorkspacePosition = int2(-572, -110);
+	ExportedName = "Dissolve.DissolveAnimationCursor";
+	ExportedType = float;
+	Type = Input;
+	CategoryName = {
+		"@eng:Dissolve",
+	};
+	DefaultValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$648457F2
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$56D22DB2";
+}
+CParticleNodePinOut	$1A9EB007
+{
+	SelfName = "Value";
+	Owner = "$56D22DB2";
+	ConnectedPins = {
+		"$5509C981",
+	};
+}
+CParticleNodeTemplateExport	$1A584F4A
+{
+	Description = {
+		"@eng:[0, inf] value that acts as the alpha threshold value for the dissolve. With a dissolve softness of zero, every pixel that has an alpha value less than the animation cursor value will be discarded.",
+	};
+	InputPins = {
+		"$5509C981",
+	};
+	WorkspacePosition = int2(418, -110);
+	ExportedName = "Dissolve.DissolveAnimationCursor";
+	ExportedType = float;
+	Type = Output;
+	CategoryName = {
+		"@eng:Dissolve",
+	};
+	DefaultValueF4 = float4(1.0000000e+00, 0.0000000e+00, 0.0000000e+00, 0.0000000e+00);
+}
+CParticleNodePinIn	$5509C981
+{
+	SelfName = "Value";
+	Owner = "$1A584F4A";
+	ConnectedPins = {
+		"$1A9EB007",
+	};
+}

+ 186 - 0
PopcornFX/Library/PopcornFXCore/Materials/Ribbon_CorrectDeformation_Distortion.pkma

@@ -0,0 +1,186 @@
+Version = 2.20.1.21979;
+CParticleRendererMaterial	$6B70D015
+{
+	RendererFeatures = {
+		"$191F1492",
+		"$F57566F2",
+		"$D857A09F",
+		"$5F3F8D5F",
+		"$DCD8A7E7",
+		"$1DB717AE",
+		"$EAC726E3",
+		"$0FEA2C5F",
+		"$DCD8B8C4",
+		"$8F800045",
+		"$860D8229",
+		"$FCA910FF",
+	};
+	NodeGraph = "$E4ADF942";
+}
+CParticleRendererFeatureDesc	$191F1492
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "GeometryRibbon";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$D857A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EnableRendering";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$5F3F8D5F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Transparent";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$1DB717AE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "BasicTransformUVs";
+}
+CParticleRendererFeatureDesc	$EAC726E3
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TransformUVs";
+}
+CRHIMaterialShaders	$00269EC3
+{
+	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
+}
+CParticleRendererFeatureDesc	$0FEA2C5F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Distortion";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$8F800045
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Tint";
+}
+CParticleRendererFeatureDesc	$DCD8B8C4
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "CustomTextureU";
+}
+CParticleRendererFeatureDesc	$DCD8A7E7
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "CorrectDeformation";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$860D8229
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TextureRepeat";
+}
+CParticleRendererFeatureDesc	$FCA910FF
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Atlas";
+}
+CParticleNodeGraph	$E4ADF942
+{
+	CustomName = "Adapter";
+	Nodes = {
+		"$46632DBF",
+		"$A62242B6",
+		"$6B1E0A8B",
+	};
+	WorkspaceZoom = -4;
+	HasExplicitWorkspaceCoords = true;
+}
+CParticleRendererFeatureDesc	$F57566F2
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "ComputeVelocity";
+	Mandatory = true;
+}
+CParticleNodeTemplateExport	$46632DBF
+{
+	Description = {
+		"@eng:Billboard center in world coordinates",
+	};
+	InputPins = {
+		"$4A10077C",
+	};
+	OutputPins = {
+		"$889C70A4",
+	};
+	WorkspacePosition = int2(-572, -44);
+	ExportedName = "General.Position";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Input;
+	VisibleByDefault = true;
+	TransformSpace = World;
+	TransformMode = Position;
+	CategoryName = {
+		"@eng:General",
+	};
+}
+CParticleNodePinIn	$4A10077C
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$46632DBF";
+}
+CParticleNodePinOut	$889C70A4
+{
+	SelfName = "Value";
+	Owner = "$46632DBF";
+	ConnectedPins = {
+		"$2FBD79B4",
+	};
+}
+CParticleNodeTemplate	$A62242B6
+{
+	InputPins = {
+		"$2FBD79B4",
+	};
+	OutputPins = {
+		"$D687CF06",
+	};
+	WorkspacePosition = int2(-88, -44);
+	SubGraphFilePath = "Library/PopcornFXCore/Templates/Core.pkfx";
+	SubGraphName = "PreviousFrameValue";
+}
+CParticleNodePinIn	$2FBD79B4
+{
+	SelfName = "Value";
+	Owner = "$A62242B6";
+	ConnectedPins = {
+		"$889C70A4",
+	};
+}
+CParticleNodePinOut	$D687CF06
+{
+	SelfName = "Value";
+	Owner = "$A62242B6";
+	ConnectedPins = {
+		"$E53712C3",
+	};
+}
+CParticleNodeTemplateExport	$6B1E0A8B
+{
+	InputPins = {
+		"$E53712C3",
+	};
+	WorkspacePosition = int2(396, -44);
+	ExportedName = "ComputeVelocity.PreviousPosition";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Output;
+	TransformSpace = World;
+	TransformMode = Position;
+}
+CParticleNodePinIn	$E53712C3
+{
+	SelfName = "Value";
+	Owner = "$6B1E0A8B";
+	ConnectedPins = {
+		"$D687CF06",
+	};
+}

+ 220 - 0
PopcornFX/Library/PopcornFXCore/Materials/Ribbon_CorrectDeformation_Opaque.pkma

@@ -0,0 +1,220 @@
+Version = 2.20.1.21979;
+CParticleRendererMaterial	$6B70D015
+{
+	RendererFeatures = {
+		"$191A1915",
+		"$008C17A8",
+		"$D857A09F",
+		"$0EBD49BE",
+		"$3D324B43",
+		"$D851A09F",
+		"$EA3837ED",
+		"$4B933A29",
+		"$35A36C4E",
+		"$7FB4AB5F",
+		"$1098ED35",
+		"$1DB717AE",
+		"$D2F84E07",
+		"$DCD8B8C4",
+		"$DCD8A7E7",
+		"$860D8229",
+		"$270FE6C5",
+	};
+	NodeGraph = "$97B0EADD";
+}
+CParticleRendererFeatureDesc	$191A1915
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "GeometryRibbon";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$D857A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EnableRendering";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$3D324B43
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Diffuse";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$D851A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "DiffuseRamp";
+}
+CParticleRendererFeatureDesc	$EA3837ED
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Lit";
+}
+CParticleRendererFeatureDesc	$4B933A29
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "NormalBend";
+}
+CParticleRendererFeatureDesc	$35A36C4E
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Emissive";
+}
+CParticleRendererFeatureDesc	$7FB4AB5F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EmissiveRamp";
+}
+CParticleRendererFeatureDesc	$1098ED35
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "AlphaRemap";
+}
+CParticleRendererFeatureDesc	$1DB717AE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "BasicTransformUVs";
+}
+CParticleRendererFeatureDesc	$EAC726E3
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TransformUVs";
+}
+CRHIMaterialShaders	$00269EC3
+{
+	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
+}
+CParticleRendererFeatureDesc	$0EBD49BE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Opaque";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$DCD8B8C4
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "CustomTextureU";
+}
+CParticleRendererFeatureDesc	$DCD8A7E7
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "CorrectDeformation";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$D2F84E07
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TransformUVs";
+}
+CParticleRendererFeatureDesc	$860D8229
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TextureRepeat";
+}
+CParticleRendererFeatureDesc	$270FE6C5
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "FastLit";
+}
+CParticleNodeGraph	$97B0EADD
+{
+	CustomName = "Adapter";
+	Nodes = {
+		"$5233D28D",
+		"$D04C75AD",
+		"$801183A3",
+	};
+	WorkspaceZoom = -4;
+}
+CParticleNodeTemplateExport	$5233D28D
+{
+	Description = {
+		"@eng:Billboard center in world coordinates",
+	};
+	InputPins = {
+		"$6B8DDDB4",
+	};
+	OutputPins = {
+		"$6E0DF50D",
+	};
+	WorkspacePosition = int2(-572, -44);
+	ExportedName = "General.Position";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Input;
+	VisibleByDefault = true;
+	TransformSpace = World;
+	TransformMode = Position;
+	CategoryName = {
+		"@eng:General",
+	};
+}
+CParticleNodePinIn	$6B8DDDB4
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$5233D28D";
+}
+CParticleNodePinOut	$6E0DF50D
+{
+	SelfName = "Value";
+	Owner = "$5233D28D";
+	ConnectedPins = {
+		"$FF209532",
+	};
+}
+CParticleNodeTemplate	$D04C75AD
+{
+	InputPins = {
+		"$FF209532",
+	};
+	OutputPins = {
+		"$DBA76B2E",
+	};
+	WorkspacePosition = int2(-88, -44);
+	SubGraphFilePath = "Library/PopcornFXCore/Templates/Core.pkfx";
+	SubGraphName = "PreviousFrameValue";
+}
+CParticleNodePinIn	$FF209532
+{
+	SelfName = "Value";
+	Owner = "$D04C75AD";
+	ConnectedPins = {
+		"$6E0DF50D",
+	};
+}
+CParticleNodePinOut	$DBA76B2E
+{
+	SelfName = "Value";
+	Owner = "$D04C75AD";
+	ConnectedPins = {
+		"$12545B39",
+	};
+}
+CParticleNodeTemplateExport	$801183A3
+{
+	InputPins = {
+		"$12545B39",
+	};
+	WorkspacePosition = int2(396, -44);
+	ExportedName = "ComputeVelocity.PreviousPosition";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Output;
+	TransformSpace = World;
+	TransformMode = Position;
+}
+CParticleNodePinIn	$12545B39
+{
+	SelfName = "Value";
+	Owner = "$801183A3";
+	ConnectedPins = {
+		"$DBA76B2E",
+	};
+}
+CParticleRendererFeatureDesc	$008C17A8
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "ComputeVelocity";
+	Mandatory = true;
+}

+ 233 - 0
PopcornFX/Library/PopcornFXCore/Materials/Ribbon_CorrectDeformation_Transparent.pkma

@@ -0,0 +1,233 @@
+Version = 2.20.1.21979;
+CParticleRendererMaterial	$6B70D015
+{
+	RendererFeatures = {
+		"$191F1492",
+		"$579AF35E",
+		"$D857A09F",
+		"$5F3F8D5F",
+		"$DCD8A7E7",
+		"$3D324B43",
+		"$D851A09F",
+		"$EA3837ED",
+		"$C5F9C9BF",
+		"$4B933A29",
+		"$35A36C4E",
+		"$7FB4AB5F",
+		"$1098ED35",
+		"$EA331F29",
+		"$1DB717AE",
+		"$EAC726E3",
+		"$DCD8B8C4",
+		"$860D8229",
+		"$FCA910FF",
+		"$A70CBFC8",
+	};
+	NodeGraph = "$B959BBF0";
+}
+CParticleRendererFeatureDesc	$191F1492
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "GeometryRibbon";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$D857A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EnableRendering";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$5F3F8D5F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Transparent";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$3D324B43
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Diffuse";
+}
+CParticleRendererFeatureDesc	$D851A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "DiffuseRamp";
+}
+CParticleRendererFeatureDesc	$EA3837ED
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Lit";
+}
+CParticleRendererFeatureDesc	$C5F9C9BF
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "NormalWrap";
+}
+CParticleRendererFeatureDesc	$4B933A29
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "NormalBend";
+}
+CParticleRendererFeatureDesc	$35A36C4E
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Emissive";
+	EnabledByDefault = true;
+}
+CParticleRendererFeatureDesc	$7FB4AB5F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EmissiveRamp";
+}
+CParticleRendererFeatureDesc	$1098ED35
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "AlphaRemap";
+}
+CParticleRendererFeatureDesc	$EA331F29
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "SoftParticles";
+}
+CParticleRendererFeatureDesc	$1DB717AE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "BasicTransformUVs";
+}
+CParticleRendererFeatureDesc	$EAC726E3
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TransformUVs";
+}
+CRHIMaterialShaders	$00269EC3
+{
+	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
+}
+CParticleRendererFeatureDesc	$DCD8B8C4
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "CustomTextureU";
+}
+CParticleRendererFeatureDesc	$DCD8A7E7
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "CorrectDeformation";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$860D8229
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TextureRepeat";
+}
+CParticleRendererFeatureDesc	$FCA910FF
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Atlas";
+}
+CParticleRendererFeatureDesc	$A70CBFC8
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "FastLit";
+}
+CParticleNodeGraph	$B959BBF0
+{
+	CustomName = "Adapter";
+	Nodes = {
+		"$AD5CA0B9",
+		"$8008D4C8",
+		"$A07EF654",
+	};
+	WorkspaceZoom = -4;
+}
+CParticleRendererFeatureDesc	$579AF35E
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "ComputeVelocity";
+	Mandatory = true;
+}
+CParticleNodeTemplateExport	$AD5CA0B9
+{
+	Description = {
+		"@eng:Billboard center in world coordinates",
+	};
+	InputPins = {
+		"$373279C9",
+	};
+	OutputPins = {
+		"$C2362DC6",
+	};
+	WorkspacePosition = int2(-572, -66);
+	ExportedName = "General.Position";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Input;
+	VisibleByDefault = true;
+	TransformSpace = World;
+	TransformMode = Position;
+	CategoryName = {
+		"@eng:General",
+	};
+}
+CParticleNodePinIn	$373279C9
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$AD5CA0B9";
+}
+CParticleNodePinOut	$C2362DC6
+{
+	SelfName = "Value";
+	Owner = "$AD5CA0B9";
+	ConnectedPins = {
+		"$5E1C0BF7",
+	};
+}
+CParticleNodeTemplate	$8008D4C8
+{
+	InputPins = {
+		"$5E1C0BF7",
+	};
+	OutputPins = {
+		"$2B4EB242",
+	};
+	WorkspacePosition = int2(-88, -66);
+	SubGraphFilePath = "Library/PopcornFXCore/Templates/Core.pkfx";
+	SubGraphName = "PreviousFrameValue";
+}
+CParticleNodePinIn	$5E1C0BF7
+{
+	SelfName = "Value";
+	Owner = "$8008D4C8";
+	ConnectedPins = {
+		"$C2362DC6",
+	};
+}
+CParticleNodePinOut	$2B4EB242
+{
+	SelfName = "Value";
+	Owner = "$8008D4C8";
+	ConnectedPins = {
+		"$32C74DF4",
+	};
+}
+CParticleNodeTemplateExport	$A07EF654
+{
+	InputPins = {
+		"$32C74DF4",
+	};
+	WorkspacePosition = int2(396, -66);
+	ExportedName = "ComputeVelocity.PreviousPosition";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Output;
+	TransformSpace = World;
+	TransformMode = Position;
+}
+CParticleNodePinIn	$32C74DF4
+{
+	SelfName = "Value";
+	Owner = "$A07EF654";
+	ConnectedPins = {
+		"$2B4EB242",
+	};
+}

+ 178 - 0
PopcornFX/Library/PopcornFXCore/Materials/Ribbon_Distortion.pkma

@@ -0,0 +1,178 @@
+Version = 2.20.1.21979;
+CParticleRendererMaterial	$6B70D015
+{
+	RendererFeatures = {
+		"$191F1492",
+		"$34FA9731",
+		"$D857A09F",
+		"$5F3F8D5F",
+		"$CAD62F46",
+		"$1DB717AE",
+		"$EAC726E3",
+		"$0FEA2C5F",
+		"$8F800045",
+		"$DCD8B8C4",
+		"$860D8229",
+	};
+	NodeGraph = "$047201AF";
+}
+CParticleRendererFeatureDesc	$191F1492
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "GeometryRibbon";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$D857A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EnableRendering";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$5F3F8D5F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Transparent";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$CAD62F46
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Atlas";
+}
+CParticleRendererFeatureDesc	$1DB717AE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "BasicTransformUVs";
+}
+CParticleRendererFeatureDesc	$EAC726E3
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TransformUVs";
+}
+CRHIMaterialShaders	$00269EC3
+{
+	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
+}
+CParticleRendererFeatureDesc	$0FEA2C5F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Distortion";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$8F800045
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Tint";
+}
+CParticleRendererFeatureDesc	$DCD8B8C4
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "CustomTextureU";
+}
+CParticleRendererFeatureDesc	$860D8229
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TextureRepeat";
+}
+CParticleRendererFeatureDesc	$34FA9731
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "ComputeVelocity";
+	Mandatory = true;
+}
+CParticleNodeGraph	$047201AF
+{
+	CustomName = "Adapter";
+	Nodes = {
+		"$765CB856",
+		"$AB5658EB",
+		"$9DADF217",
+	};
+	WorkspaceZoom = -4;
+}
+CParticleNodeTemplateExport	$765CB856
+{
+	Description = {
+		"@eng:Billboard center in world coordinates",
+	};
+	InputPins = {
+		"$0F0EEF7A",
+	};
+	OutputPins = {
+		"$4008E4E9",
+	};
+	WorkspacePosition = int2(-572, -44);
+	ExportedName = "General.Position";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Input;
+	VisibleByDefault = true;
+	TransformSpace = World;
+	TransformMode = Position;
+	CategoryName = {
+		"@eng:General",
+	};
+}
+CParticleNodePinIn	$0F0EEF7A
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$765CB856";
+}
+CParticleNodePinOut	$4008E4E9
+{
+	SelfName = "Value";
+	Owner = "$765CB856";
+	ConnectedPins = {
+		"$30D2CA49",
+	};
+}
+CParticleNodeTemplate	$AB5658EB
+{
+	InputPins = {
+		"$30D2CA49",
+	};
+	OutputPins = {
+		"$A2E617D6",
+	};
+	WorkspacePosition = int2(-88, -44);
+	SubGraphFilePath = "Library/PopcornFXCore/Templates/Core.pkfx";
+	SubGraphName = "PreviousFrameValue";
+}
+CParticleNodePinIn	$30D2CA49
+{
+	SelfName = "Value";
+	Owner = "$AB5658EB";
+	ConnectedPins = {
+		"$4008E4E9",
+	};
+}
+CParticleNodePinOut	$A2E617D6
+{
+	SelfName = "Value";
+	Owner = "$AB5658EB";
+	ConnectedPins = {
+		"$60786EF7",
+	};
+}
+CParticleNodeTemplateExport	$9DADF217
+{
+	InputPins = {
+		"$60786EF7",
+	};
+	WorkspacePosition = int2(396, -44);
+	ExportedName = "ComputeVelocity.PreviousPosition";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Output;
+	TransformSpace = World;
+	TransformMode = Position;
+}
+CParticleNodePinIn	$60786EF7
+{
+	SelfName = "Value";
+	Owner = "$9DADF217";
+	ConnectedPins = {
+		"$A2E617D6",
+	};
+}

+ 208 - 0
PopcornFX/Library/PopcornFXCore/Materials/Ribbon_Opaque.pkma

@@ -0,0 +1,208 @@
+Version = 2.20.1.21979;
+CParticleRendererMaterial	$6B70D015
+{
+	RendererFeatures = {
+		"$191A1915",
+		"$74F368EB",
+		"$D857A09F",
+		"$0EBD49BE",
+		"$3D324B43",
+		"$D851A09F",
+		"$EA3837ED",
+		"$4B933A29",
+		"$35A36C4E",
+		"$7FB4AB5F",
+		"$1098ED35",
+		"$CAD62F46",
+		"$1DB717AE",
+		"$EAC726E3",
+		"$DCD8B8C4",
+		"$860D8229",
+	};
+	NodeGraph = "$0B64BDE9";
+}
+CParticleRendererFeatureDesc	$191A1915
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "GeometryRibbon";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$D857A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EnableRendering";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$3D324B43
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Diffuse";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$D851A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "DiffuseRamp";
+}
+CParticleRendererFeatureDesc	$EA3837ED
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Lit";
+}
+CParticleRendererFeatureDesc	$4B933A29
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "NormalBend";
+}
+CParticleRendererFeatureDesc	$35A36C4E
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Emissive";
+}
+CParticleRendererFeatureDesc	$7FB4AB5F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EmissiveRamp";
+}
+CParticleRendererFeatureDesc	$1098ED35
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "AlphaRemap";
+}
+CParticleRendererFeatureDesc	$CAD62F46
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Atlas";
+}
+CParticleRendererFeatureDesc	$1DB717AE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "BasicTransformUVs";
+}
+CParticleRendererFeatureDesc	$EAC726E3
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TransformUVs";
+}
+CRHIMaterialShaders	$00269EC3
+{
+	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
+}
+CParticleRendererFeatureDesc	$0EBD49BE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Opaque";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$DCD8B8C4
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "CustomTextureU";
+}
+CParticleRendererFeatureDesc	$860D8229
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TextureRepeat";
+}
+CParticleRendererFeatureDesc	$74F368EB
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "ComputeVelocity";
+	Mandatory = true;
+}
+CParticleNodeGraph	$0B64BDE9
+{
+	CustomName = "Adapter";
+	Nodes = {
+		"$104146D4",
+		"$9C306BFC",
+		"$59EB31D2",
+	};
+	WorkspaceZoom = -4;
+}
+CParticleNodeTemplateExport	$104146D4
+{
+	Description = {
+		"@eng:Billboard center in world coordinates",
+	};
+	InputPins = {
+		"$195B7ACD",
+	};
+	OutputPins = {
+		"$F8526B59",
+	};
+	WorkspacePosition = int2(-572, -44);
+	ExportedName = "General.Position";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Input;
+	VisibleByDefault = true;
+	TransformSpace = World;
+	TransformMode = Position;
+	CategoryName = {
+		"@eng:General",
+	};
+}
+CParticleNodePinIn	$195B7ACD
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$104146D4";
+}
+CParticleNodePinOut	$F8526B59
+{
+	SelfName = "Value";
+	Owner = "$104146D4";
+	ConnectedPins = {
+		"$7A8861A6",
+	};
+}
+CParticleNodeTemplate	$9C306BFC
+{
+	InputPins = {
+		"$7A8861A6",
+	};
+	OutputPins = {
+		"$FB8BFE7A",
+	};
+	WorkspacePosition = int2(-88, -44);
+	SubGraphFilePath = "Library/PopcornFXCore/Templates/Core.pkfx";
+	SubGraphName = "PreviousFrameValue";
+}
+CParticleNodePinIn	$7A8861A6
+{
+	SelfName = "Value";
+	Owner = "$9C306BFC";
+	ConnectedPins = {
+		"$F8526B59",
+	};
+}
+CParticleNodePinOut	$FB8BFE7A
+{
+	SelfName = "Value";
+	Owner = "$9C306BFC";
+	ConnectedPins = {
+		"$47821ACA",
+	};
+}
+CParticleNodeTemplateExport	$59EB31D2
+{
+	InputPins = {
+		"$47821ACA",
+	};
+	WorkspacePosition = int2(396, -44);
+	ExportedName = "ComputeVelocity.PreviousPosition";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Output;
+	TransformSpace = World;
+	TransformMode = Position;
+}
+CParticleNodePinIn	$47821ACA
+{
+	SelfName = "Value";
+	Owner = "$59EB31D2";
+	ConnectedPins = {
+		"$FB8BFE7A",
+	};
+}

+ 226 - 0
PopcornFX/Library/PopcornFXCore/Materials/Ribbon_Transparent.pkma

@@ -0,0 +1,226 @@
+Version = 2.20.1.21979;
+CParticleRendererMaterial	$6B70D015
+{
+	RendererFeatures = {
+		"$191F1492",
+		"$C66E7097",
+		"$D857A09F",
+		"$5F3F8D5F",
+		"$3D324B43",
+		"$D851A09F",
+		"$EA3837ED",
+		"$C5F9C9BF",
+		"$4B933A29",
+		"$35A36C4E",
+		"$7FB4AB5F",
+		"$1098ED35",
+		"$EA331F29",
+		"$CAD62F46",
+		"$1DB717AE",
+		"$EAC726E3",
+		"$DCD8B8C4",
+		"$860D8229",
+		"$5FAC5904",
+	};
+	NodeGraph = "$6D5E517D";
+}
+CParticleRendererFeatureDesc	$191F1492
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "GeometryRibbon";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$D857A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EnableRendering";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$5F3F8D5F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Transparent";
+	Mandatory = true;
+}
+CParticleRendererFeatureDesc	$3D324B43
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Diffuse";
+}
+CParticleRendererFeatureDesc	$D851A09F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "DiffuseRamp";
+}
+CParticleRendererFeatureDesc	$EA3837ED
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Lit";
+}
+CParticleRendererFeatureDesc	$C5F9C9BF
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "NormalWrap";
+}
+CParticleRendererFeatureDesc	$4B933A29
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "NormalBend";
+}
+CParticleRendererFeatureDesc	$35A36C4E
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Emissive";
+	EnabledByDefault = true;
+}
+CParticleRendererFeatureDesc	$7FB4AB5F
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "EmissiveRamp";
+}
+CParticleRendererFeatureDesc	$1098ED35
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "AlphaRemap";
+}
+CParticleRendererFeatureDesc	$EA331F29
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "SoftParticles";
+}
+CParticleRendererFeatureDesc	$CAD62F46
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Atlas";
+}
+CParticleRendererFeatureDesc	$1DB717AE
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "BasicTransformUVs";
+}
+CParticleRendererFeatureDesc	$EAC726E3
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TransformUVs";
+}
+CRHIMaterialShaders	$00269EC3
+{
+	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
+}
+CParticleRendererFeatureDesc	$DCD8B8C4
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "CustomTextureU";
+}
+CParticleRendererFeatureDesc	$860D8229
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TextureRepeat";
+}
+CParticleRendererFeatureDesc	$5FAC5904
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "FastLit";
+}
+CParticleRendererFeatureDesc	$C66E7097
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "ComputeVelocity";
+	Mandatory = true;
+}
+CParticleNodeGraph	$6D5E517D
+{
+	CustomName = "Adapter";
+	Nodes = {
+		"$EFAE75DD",
+		"$3364E8F1",
+		"$247BC08E",
+	};
+	WorkspaceZoom = -4;
+}
+CParticleNodeTemplateExport	$EFAE75DD
+{
+	Description = {
+		"@eng:Billboard center in world coordinates",
+	};
+	InputPins = {
+		"$55709A70",
+	};
+	OutputPins = {
+		"$2D62DD2A",
+	};
+	WorkspacePosition = int2(-572, -44);
+	ExportedName = "General.Position";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Input;
+	VisibleByDefault = true;
+	TransformSpace = World;
+	TransformMode = Position;
+	CategoryName = {
+		"@eng:General",
+	};
+}
+CParticleNodePinIn	$55709A70
+{
+	SelfName = "DefaultValue";
+	Visible = false;
+	Owner = "$EFAE75DD";
+}
+CParticleNodePinOut	$2D62DD2A
+{
+	SelfName = "Value";
+	Owner = "$EFAE75DD";
+	ConnectedPins = {
+		"$E3C55844",
+	};
+}
+CParticleNodeTemplate	$3364E8F1
+{
+	InputPins = {
+		"$E3C55844",
+	};
+	OutputPins = {
+		"$764F1037",
+	};
+	WorkspacePosition = int2(-88, -44);
+	SubGraphFilePath = "Library/PopcornFXCore/Templates/Core.pkfx";
+	SubGraphName = "PreviousFrameValue";
+}
+CParticleNodePinIn	$E3C55844
+{
+	SelfName = "Value";
+	Owner = "$3364E8F1";
+	ConnectedPins = {
+		"$2D62DD2A",
+	};
+}
+CParticleNodePinOut	$764F1037
+{
+	SelfName = "Value";
+	Owner = "$3364E8F1";
+	ConnectedPins = {
+		"$46CE41D0",
+	};
+}
+CParticleNodeTemplateExport	$247BC08E
+{
+	InputPins = {
+		"$46CE41D0",
+	};
+	WorkspacePosition = int2(396, -44);
+	ExportedName = "ComputeVelocity.PreviousPosition";
+	ExportedType = float3;
+	Semantic = 3D_Coordinate;
+	Type = Output;
+	TransformSpace = World;
+	TransformMode = Position;
+}
+CParticleNodePinIn	$46CE41D0
+{
+	SelfName = "Value";
+	Owner = "$247BC08E";
+	ConnectedPins = {
+		"$764F1037",
+	};
+}

+ 6 - 6
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Sound/Sound_Default.pkma → PopcornFX/Library/PopcornFXCore/Materials/Sound_Default.pkma

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CParticleRendererMaterial	$6B70D015
 {
 	RendererFeatures = {
@@ -11,30 +11,30 @@ CParticleRendererMaterial	$6B70D015
 }
 CParticleRendererFeatureDesc	$F361BD3A
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "GeometrySound";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$DCB8444C
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "Sound";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D857A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "EnableRendering";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$53C68443
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "SoundAttenuation";
 }
 CParticleRendererFeatureDesc	$589BAB05
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "Doppler";
 }
 CRHIMaterialShaders	$00269EC3

+ 38 - 39
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Decal/Decal_Emissive.pkma → PopcornFX/Library/PopcornFXCore/Materials/Triangle_Distortion.pkma

@@ -1,75 +1,74 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CParticleRendererMaterial	$6B70D015
 {
 	RendererFeatures = {
 		"$191F1761",
 		"$D857A09F",
-		"$0F57EEAC",
-		"$3D324B43",
-		"$D851A09F",
-		"$35A36C4E",
-		"$7FB4AB5F",
-		"$CAD62F46",
+		"$5F3F8D5F",
 		"$1DB717AE",
 		"$EAC726E3",
+		"$FD189ED3",
+		"$DA06D7A4",
+		"$860D8229",
+		"$CA44F941",
+		"$1D707283",
 	};
 }
 CParticleRendererFeatureDesc	$191F1761
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "GeometryDecal";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "GeometryTriangle";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D857A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "EnableRendering";
 	Mandatory = true;
 }
-CParticleRendererFeatureDesc	$3D324B43
+CParticleRendererFeatureDesc	$5F3F8D5F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Diffuse";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Transparent";
+	Mandatory = true;
 }
-CParticleRendererFeatureDesc	$D851A09F
+CParticleRendererFeatureDesc	$1DB717AE
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "DiffuseRamp";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "BasicTransformUVs";
 }
-CParticleRendererFeatureDesc	$35A36C4E
+CParticleRendererFeatureDesc	$EAC726E3
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Emissive";
-	Mandatory = true;
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TransformUVs";
 }
-CParticleRendererFeatureDesc	$7FB4AB5F
+CRHIMaterialShaders	$00269EC3
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "EmissiveRamp";
+	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
 }
-CParticleRendererFeatureDesc	$CAD62F46
+CParticleRendererFeatureDesc	$FD189ED3
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Atlas";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TriangleCustomNormals";
 }
-CParticleRendererFeatureDesc	$1DB717AE
+CParticleRendererFeatureDesc	$DA06D7A4
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "BasicTransformUVs";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TriangleCustomUVs";
 }
-CParticleRendererFeatureDesc	$EAC726E3
+CParticleRendererFeatureDesc	$860D8229
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "TransformUVs";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "TextureRepeat";
 }
-CRHIMaterialShaders	$00269EC3
+CParticleRendererFeatureDesc	$CA44F941
 {
-	VertexShader = "Library/PopcornFXCore/Shaders/Experimental/Decal_Default.vert";
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Distortion";
+	Mandatory = true;
 }
-CParticleRendererFeatureDesc	$0F57EEAC
+CParticleRendererFeatureDesc	$1D707283
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Decal";
-	Mandatory = true;
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "Tint";
 }

+ 23 - 17
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Triangle/Triangle_Opaque.pkma → PopcornFX/Library/PopcornFXCore/Materials/Triangle_Opaque.pkma

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CParticleRendererMaterial	$6B70D015
 {
 	RendererFeatures = {
@@ -17,88 +17,94 @@ CParticleRendererMaterial	$6B70D015
 		"$FD189ED3",
 		"$DA06D7A4",
 		"$860D8229",
+		"$2C3B858A",
 	};
 }
 CParticleRendererFeatureDesc	$191F1761
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "GeometryTriangle";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D857A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "EnableRendering";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$3D324B43
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "Diffuse";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D851A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "DiffuseRamp";
 }
 CParticleRendererFeatureDesc	$EA3837ED
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "Lit";
 }
 CParticleRendererFeatureDesc	$4B933A29
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "NormalBend";
 }
 CParticleRendererFeatureDesc	$35A36C4E
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "Emissive";
 }
 CParticleRendererFeatureDesc	$7FB4AB5F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "EmissiveRamp";
 }
 CParticleRendererFeatureDesc	$1098ED35
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "AlphaRemap";
 }
 CParticleRendererFeatureDesc	$1DB717AE
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "BasicTransformUVs";
 }
 CParticleRendererFeatureDesc	$EAC726E3
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "TransformUVs";
 }
 CRHIMaterialShaders	$00269EC3
 {
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
+	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
 }
 CParticleRendererFeatureDesc	$FD189ED3
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "TriangleCustomNormals";
 }
 CParticleRendererFeatureDesc	$DA06D7A4
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "TriangleCustomUVs";
 }
 CParticleRendererFeatureDesc	$A357A567
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "Opaque";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$860D8229
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "TextureRepeat";
 }
+CParticleRendererFeatureDesc	$2C3B858A
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "FastLit";
+}

+ 26 - 32
PopcornFX/Library/PopcornFXCore/Materials/Experimental/Triangle/Triangle_Diffuse.pkma → PopcornFX/Library/PopcornFXCore/Materials/Triangle_Transparent.pkma

@@ -1,4 +1,4 @@
-Version = 2.19.0.20559;
+Version = 2.20.1.21979;
 CParticleRendererMaterial	$6B70D015
 {
 	RendererFeatures = {
@@ -16,113 +16,107 @@ CParticleRendererMaterial	$6B70D015
 		"$EA331F29",
 		"$1DB717AE",
 		"$EAC726E3",
-		"$0FEA2C5F",
-		"$8F800045",
 		"$FD189ED3",
 		"$DA06D7A4",
 		"$860D8229",
+		"$7C172983",
 	};
 }
 CParticleRendererFeatureDesc	$191F1761
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "GeometryTriangle";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D857A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "EnableRendering";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$5F3F8D5F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "Transparent";
 	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$3D324B43
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "Diffuse";
-	Mandatory = true;
 }
 CParticleRendererFeatureDesc	$D851A09F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "DiffuseRamp";
 }
 CParticleRendererFeatureDesc	$EA3837ED
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "Lit";
 }
 CParticleRendererFeatureDesc	$C5F9C9BF
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "NormalWrap";
 }
 CParticleRendererFeatureDesc	$4B933A29
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "NormalBend";
 }
 CParticleRendererFeatureDesc	$35A36C4E
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "Emissive";
+	EnabledByDefault = true;
 }
 CParticleRendererFeatureDesc	$7FB4AB5F
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "EmissiveRamp";
 }
 CParticleRendererFeatureDesc	$1098ED35
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "AlphaRemap";
 }
 CParticleRendererFeatureDesc	$EA331F29
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "SoftParticles";
 }
 CParticleRendererFeatureDesc	$1DB717AE
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "BasicTransformUVs";
 }
 CParticleRendererFeatureDesc	$EAC726E3
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "TransformUVs";
 }
 CRHIMaterialShaders	$00269EC3
 {
-	FragmentShader = "Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag";
-}
-CParticleRendererFeatureDesc	$0FEA2C5F
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Distortion";
-}
-CParticleRendererFeatureDesc	$8F800045
-{
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
-	RendererFeatureName = "Tint";
+	FragmentShader = "Library/PopcornFXCore/Shaders/Particle_Master.frag";
 }
 CParticleRendererFeatureDesc	$FD189ED3
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "TriangleCustomNormals";
 }
 CParticleRendererFeatureDesc	$DA06D7A4
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "TriangleCustomUVs";
 }
 CParticleRendererFeatureDesc	$860D8229
 {
-	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Experimental.pkri";
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
 	RendererFeatureName = "TextureRepeat";
 }
+CParticleRendererFeatureDesc	$7C172983
+{
+	RendererInterfacePath = "Library/PopcornFXCore/Materials/Interface/Default.pkri";
+	RendererFeatureName = "FastLit";
+}

+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Experimental/Decal_Default.vert → PopcornFX/Library/PopcornFXCore/Shaders/Decal_Default.vert


+ 0 - 26
PopcornFX/Library/PopcornFXCore/Shaders/Experimental/includes/FeatureEmissive.h

@@ -1,26 +0,0 @@
-#pragma once
-
-#include "PKSurface.h"
-
-#if defined(PK_FORWARD_COLOR_PASS) || defined(PK_DEFERRED_COLOR_PASS) || defined(PK_DEFERRED_DECAL_PASS)
-
-#	if defined(HAS_Emissive)
-void	ApplyEmissive(INOUT(SFragSurface) fSurf, IN(SFragGeometry) fGeom, vec3 emissiveColor FS_ARGS)
-{
-	vec4	textureColor = SampleTextureVec4(fGeom, SAMPLER_ARG(Emissive_EmissiveMap) FS_PARAMS);
-#		if	defined(HAS_TransformUVs)
-	if (fGeom.m_UseAlphaUVs)
-		textureColor.a = SampleTextureAlpha(fGeom, SAMPLER_ARG(Emissive_EmissiveMap) FS_PARAMS);
-#		endif
-	fSurf.m_Emissive = emissiveColor * textureColor.rgb * textureColor.a;
-}
-#	endif
-
-#	if defined(HAS_EmissiveRamp)
-void	ApplyEmissiveRamp(INOUT(SFragSurface) fSurf FS_ARGS)
-{
-	fSurf.m_Emissive = SAMPLE(EmissiveRamp_RampMap, vec2(fSurf.m_Emissive.r, 0.0)).rgb;
-}
-#	endif
-
-#endif

+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Default_Billboard.frag → PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Default_Billboard.frag


+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Default_Decal.frag → PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Default_Decal.frag


+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Default_Decal.vert → PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Default_Decal.vert


+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Default_Light.frag → PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Default_Light.frag


+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Default_Light.vert → PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Default_Light.vert


+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Default_Mesh.frag → PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Default_Mesh.frag


+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Default_Ribbon.frag → PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Default_Ribbon.frag


+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Default_Triangle.frag → PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Default_Triangle.frag


+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Distortion_Billboard.frag → PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Distortion_Billboard.frag


+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Distortion_Ribbon.frag → PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Distortion_Ribbon.frag


+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Opaque_Billboard.frag → PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Opaque_Billboard.frag


+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Opaque_Ribbon.frag → PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Opaque_Ribbon.frag


+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Opaque_Triangle.frag → PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Opaque_Triangle.frag


+ 483 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Particle_Master.frag

@@ -0,0 +1,483 @@
+
+#if     defined(HAS_SoftParticles)
+float   clipToLinearDepth(float depth FS_ARGS)
+{
+	float zNear = GET_CONSTANT(SceneInfo, ZBufferLimits).x;
+	float zFar = GET_CONSTANT(SceneInfo, ZBufferLimits).y;
+	return (-zNear * zFar) / (depth * (zFar - zNear) - zFar);
+}
+#endif
+
+#if     defined(HAS_Distortion)
+float   clipDepthToDistortionFade(float depth FS_ARGS)
+{
+	float zNear = GET_CONSTANT(SceneInfo, ZBufferLimits).x;
+	float zFar = GET_CONSTANT(SceneInfo, ZBufferLimits).y;
+	float zLinear = (-zNear * zFar) / (depth * (zFar - zNear) - zFar);
+	return min(zLinear / zNear - 1.f, sqrt(10.f / zLinear) ); // looks like the v1 (10.f = sqrt(zFar * zNear))
+}
+#endif
+
+#if defined(HAS_Lit) && (defined(ParticlePass_TransparentPostDisto) || defined(ParticlePass_Transparent))
+
+//------------------------------
+// BRDF Computation
+//------------------------------
+#   define PI                       3.141592
+#   define  METAL_FRESNEL_FACTOR    vec3(0.04, 0.04, 0.04)
+#   define EPSILON                  1e-5
+
+float normalDistFuncGGX(float cosLh, float roughness)
+{
+	float alpha = roughness * roughness;
+	float alphaSq = alpha * alpha;
+
+	float denom = (cosLh * cosLh) * (alphaSq - 1.0) + 1.0;
+	return alphaSq / (PI * denom * denom);
+}
+
+float schlickGGX(float cosLi, float cosLo, float roughness)
+{
+	float r = roughness + 1.0;
+	float k = (r * r) / 8.0; // UE4 remapping
+
+	float t1 = cosLi / (cosLi * (1.0 - k) + k);
+	float t2 = cosLo / (cosLo * (1.0 - k) + k);
+
+	return t1 * t2;
+}
+ 
+vec3 fresnelSchlick(vec3 surfaceMetalColor, float cosTheta)
+{
+	return surfaceMetalColor + (vec3(1.0, 1.0, 1.0) - surfaceMetalColor) * pow(1.0 - cosTheta, 5.0);
+}
+
+vec3	computeBRDF(vec3 surfToLight, vec3 surfToView, vec3 surfaceNormal, float roughness, float metalness, vec4 diffuseColor, float litMask FS_ARGS)
+{
+	vec3    halfVec = normalize(surfToLight + surfToView);
+
+	float   NoL = dot(surfToLight, surfaceNormal);
+
+#if     defined(HAS_NormalWrap)
+	float   normalWrapFactor = GET_CONSTANT(Material, NormalWrap_WrapFactor) * 0.5f;
+	NoL = normalWrapFactor + (1.0f - normalWrapFactor) * NoL;
+#endif
+
+	NoL = max(0.0f, NoL);
+
+	float   specIntensity = max(0.0f, dot(halfVec, surfaceNormal));
+	float   NoV = max(EPSILON, dot(surfToView, surfaceNormal)); // Weird behavior when this is near 0
+
+	vec3    surfaceMetalColor = mix(METAL_FRESNEL_FACTOR, diffuseColor.rgb, metalness);
+
+	vec3    F  = fresnelSchlick(surfaceMetalColor, max(0.0f, dot(halfVec, surfToView)));
+	float   D = normalDistFuncGGX(specIntensity, roughness);
+	float   G = schlickGGX(NoL, NoV, roughness);
+
+	float specularMultiplier = GET_CONSTANT(Material, Lit_Type) == 1 ? litMask : diffuseColor.a;
+	vec3 diffuseBRDF = mix(vec3(1.0, 1.0, 1.0) - F, vec3(0.0, 0.0, 0.0), metalness) * diffuseColor.rgb * diffuseColor.a;
+	vec3 specularBRDF = ((F * D * G) / max(EPSILON, 4.0 * NoL * NoV)) * specularMultiplier;
+
+	return (diffuseBRDF + specularBRDF) * NoL;
+}
+
+vec3	fresnelSchlickRoughness(float cosTheta, vec3 F0, float roughness)
+{
+	return F0 + (max(vec3(1.0f - roughness, 1.0f - roughness, 1.0f - roughness), F0) - F0) * pow(1.0f - cosTheta, 5.0f);
+}
+
+vec3	toCubemapSpace(vec3 value FS_ARGS)
+{
+	vec3	valueLHZ = mul(GET_CONSTANT(SceneInfo, UserToLHZ), vec4(value, 0.0f)).xyz;
+	vec3	valueRHY = vec3(valueLHZ.x, valueLHZ.z, valueLHZ.y);
+	valueRHY.xz = mul(GET_CONSTANT(EnvironmentMapInfo, Rotation), valueRHY.xz);
+	return valueRHY;
+}
+
+vec3	computeAmbientBRDF(vec3 surfToView, vec3 surfaceNormal, float roughness, float metalness, vec4 diffuseColor, float litMask FS_ARGS)
+{
+	// Cubemaps are expected to be cosined filtered up to the 7th mipmap which should contain the fully diffuse 180 degrees cosine-filtered cubemap.
+	const float	kCubemapMipRange = 6;
+
+	vec3    surfaceMetalColor = mix(METAL_FRESNEL_FACTOR, diffuseColor.rgb, metalness);
+	vec3	kS = fresnelSchlickRoughness(max(dot(surfaceNormal, surfToView), 0.0), surfaceMetalColor, roughness);
+	vec3	kD = 1.0 - kS;
+	kD *= 1.0 - metalness;
+
+	// Ambient diffuse
+	vec3	irradiance = SAMPLELOD_CUBE(EnvironmentMapSampler, toCubemapSpace(surfaceNormal FS_PARAMS), kCubemapMipRange).rgb;
+	vec3	diffuse = irradiance * diffuseColor.rgb * diffuseColor.a;
+
+	// Ambient specular
+	vec3	prefilteredColor = SAMPLELOD_CUBE(EnvironmentMapSampler, toCubemapSpace(reflect(-surfToView, surfaceNormal) FS_PARAMS), roughness * kCubemapMipRange).rgb;
+	vec2	envBRDF  = SAMPLE(BRDFLUTSampler, vec2(max(dot(surfaceNormal, surfToView), 0.0), roughness)).rg;
+	float 	specularMultiplier = GET_CONSTANT(Material, Lit_Type) == 1 ? litMask : diffuseColor.a;
+	vec3	specular = prefilteredColor * (kS * envBRDF.x + envBRDF.y) * specularMultiplier;
+
+	vec3 ambient = kD * diffuse + specular;
+	return ambient;
+}
+
+#endif
+
+#if defined(HAS_TransformUVs)
+vec2 transformUV(vec2 UV, vec2 scale, mat2 rotation, vec2 offset)
+{
+	return mul(rotation, UV * scale) + offset;
+}
+#endif
+
+vec2    applyCorrectDeformation(IN(SFragmentInput) fInput, IN(vec2) fragUVin FS_ARGS)
+{
+#if     defined(HAS_CorrectDeformation)
+	vec2 fragUVout;
+	if (fragUVin.x + fragUVin.y < 1)
+		fragUVout = fragUVin.xy / fInput.fragUVFactors.xy;
+	else
+		fragUVout = 1.0 - ((1.0 - fragUVin.xy) / fInput.fragUVFactors.zw);
+#if     defined(HAS_TextureUVs)
+	if (GET_CONSTANT(Material, TextureUVs_RotateTexture) != 0)
+		fragUVout = fragUVout.yx;
+#endif
+	return fragUVout * fInput.fragUVScaleAndOffset.xy + fInput.fragUVScaleAndOffset.zw;
+#else
+	return fragUVin;
+#endif
+}
+
+void    FragmentMain(IN(SFragmentInput) fInput, OUT(SFragmentOutput) fOutput FS_ARGS)
+{
+//----------------------------------------------------------------------------
+// Gather texture coordinates
+//----------------------------------------------------------------------------
+#if 	defined(FINPUT_fragUV0)
+	vec2    fragUV0 = applyCorrectDeformation(fInput, fInput.fragUV0 FS_PARAMS);
+#	if		defined(HAS_Atlas)
+	int		blendingType = GET_CONSTANT(Material, Atlas_Blending);
+	vec2	fragUV1 = applyCorrectDeformation(fInput, fInput.fragUV1 FS_PARAMS);
+	float	blendMix = 0.f;
+
+	if (blendingType == 2)
+	{
+		// Motion vectors
+		vec2	scale = GET_CONSTANT(Material, Atlas_DistortionStrength);
+		vec2	curVectors = ((SAMPLE(Atlas_MotionVectorsMap, fragUV0).rg * 2.0f) - 1.0f) * scale;
+		vec2	nextVectors = ((SAMPLE(Atlas_MotionVectorsMap, fragUV1).rg * 2.0f) - 1.0f) * scale;
+		float	cursor = fract(fInput.fragAtlas_TextureID);
+
+		curVectors *= cursor;
+		nextVectors *= (1.0f - cursor);
+
+		fragUV0 = fragUV0 - curVectors;
+		fragUV1 = fragUV1 + nextVectors;
+		blendMix = cursor;
+	}
+	else if (blendingType == 1)
+	{
+		// Linear
+		blendMix = fract(fInput.fragAtlas_TextureID);
+	}
+#	endif // defined(HAS_Atlas)
+#endif // defined(FINPUT_fragUV0)
+
+//----------------------------------------------------------------------------
+// Transform UVs
+//----------------------------------------------------------------------------
+#if	defined(HAS_TransformUVs)
+	float	sinR = sin(fInput.fragTransformUVs_UVRotate);
+	float	cosR = cos(fInput.fragTransformUVs_UVRotate);
+	mat2	UVRotation = mat2(cosR, sinR, -sinR, cosR);
+	vec2	UVScale = fInput.fragTransformUVs_UVScale;
+	vec2	UVOffset = fInput.fragTransformUVs_UVOffset;
+	vec4	rect0 = vec4(1.0f, 1.0f, 0.0f, 0.0f);
+#	if	defined(HAS_Atlas)
+	if (blendingType >= 1)
+	{
+		rect0 = LOADF4(GET_RAW_BUFFER(Atlas), RAW_BUFFER_INDEX(min(LOADU(GET_RAW_BUFFER(Atlas), 0) - 1, uint(fInput.fragAtlas_TextureID)) * 4 + 1));
+	}
+	vec4	rect1 = LOADF4(GET_RAW_BUFFER(Atlas), RAW_BUFFER_INDEX(min(LOADU(GET_RAW_BUFFER(Atlas), 0) - 1, uint(fInput.fragAtlas_TextureID) + 1) * 4 + 1));
+
+	vec2	oldFragUV1 = fragUV1;
+	fragUV1 = ((fragUV1 - rect1.zw) / rect1.xy); // normalize (if atlas)
+	fragUV1 = transformUV(fragUV1, UVScale, UVRotation, UVOffset); // scale then rotate then translate UV
+	fragUV1 = fract(fragUV1) * rect1.xy + rect1.zw; // undo normalize
+#	endif // defined(HAS_Atlas)
+	vec2	oldFragUV0 = fragUV0;	
+	fragUV0 = ((fragUV0 - rect0.zw) / rect0.xy); // normalize (if atlas)
+	fragUV0 = transformUV(fragUV0, UVScale, UVRotation, UVOffset); // scale then rotate then translate UV
+	fragUV0 = fract(fragUV0) * rect0.xy + rect0.zw; // undo normalize
+	bool	RGBOnly = GET_CONSTANT(Material, TransformUVs_RGBOnly) != 0;
+#endif // defined(HAS_TransformUVs)
+
+//----------------------------------------------------------------------------
+// render pass distortion
+//----------------------------------------------------------------------------
+#if 	defined(ParticlePass_Distortion)
+
+	vec4    distoColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);
+
+#if     defined(FINPUT_fragDistortion_Color)
+	distoColor = fInput.fragDistortion_Color;
+#endif
+
+#if     defined(HAS_SoftParticles) || defined(HAS_Distortion)
+	vec4    projPos = fInput.fragViewProjPosition;
+	float   rcpw = 1.0 / projPos.w;
+	float   fragDepth_cs = projPos.z * rcpw;
+	//  if (IsDepthReversed())
+	//      fragDepth_cs = 1.0 - fragDepth_cs;
+#endif
+
+	vec4    textureColor;
+	
+	distoColor *= clipDepthToDistortionFade(fragDepth_cs  FS_PARAMS);
+
+#   if      defined(HAS_Atlas)
+	
+	if (blendingType == 2)
+	{
+		vec4	textureColor1 = SAMPLE(Distortion_DistortionMap, fragUV0);
+		vec4	textureColor2 = SAMPLE(Distortion_DistortionMap, fragUV1);
+		textureColor = mix(textureColor1, textureColor2, blendMix);
+	}
+	else
+	{
+		textureColor = SAMPLE(Distortion_DistortionMap, fragUV0);
+		if (blendingType == 1)
+		{
+			// Linear
+			vec4    textureColor2 = SAMPLE(Distortion_DistortionMap, fragUV1);
+			textureColor = mix(textureColor, textureColor2, blendMix);
+		}
+	}
+#	else
+	// No atlas
+	textureColor = SAMPLE(Distortion_DistortionMap, fInput.fragUV0);
+#	endif // defined(HAS_Atlas)
+
+	distoColor *= textureColor * vec4(2., 2., 1., 0.) - vec4(1.00392, 1.00392, 0., -1.); // 128 is considered as the mid-value (in range 0-255)
+
+#if     defined(HAS_SoftParticles)
+	vec2    screenUV = projPos.xy * rcpw * vec2(0.5, 0.5) + 0.5;
+	float   sceneDepth_cs = SAMPLE(DepthSampler, screenUV).x;
+	float   sceneDepth = clipToLinearDepth(sceneDepth_cs FS_PARAMS);
+	float   fragDepth = clipToLinearDepth(fragDepth_cs FS_PARAMS);
+	float   invSoftnessDistance = 1.0f / GET_CONSTANT(Material, SoftParticles_SoftnessDistance);
+	float   depthfade = clamp((sceneDepth - fragDepth) * invSoftnessDistance, 0.f, 1.f);
+	distoColor *= depthfade;
+#endif
+
+	fOutput.Output0 = distoColor;
+
+//----------------------------------------------------------------------------
+// render pass transparent
+//----------------------------------------------------------------------------
+#elif 	defined(ParticlePass_TransparentPostDisto) || defined(ParticlePass_Transparent)
+
+	vec4    diffuseColor = vec4(0.0f, 0.0f, 0.0f, 0.0f);
+	vec3    emissiveColor = vec3(0.0f, 0.0f, 0.0f);
+
+//----------------------------------------------------------------------------
+// DIFFUSE
+//----------------------------------------------------------------------------
+#if	defined(HAS_Diffuse)
+	diffuseColor = fInput.fragDiffuse_Color;
+
+	vec4    textureColor = SAMPLE(Diffuse_DiffuseMap, fragUV0);
+#	if defined(HAS_TransformUVs)
+		if (RGBOnly)
+		{
+			textureColor.a =  SAMPLE(Diffuse_DiffuseMap, oldFragUV0).a;
+		}
+#	endif // defined(HAS_TransformUVs)
+
+#   if defined(HAS_Atlas)
+	if (blendingType >= 1)
+	{
+		vec4    textureColor2 = SAMPLE(Diffuse_DiffuseMap, fragUV1);
+#		if defined(HAS_TransformUVs)
+		if (RGBOnly)
+		{
+			textureColor2.a =  SAMPLE(Diffuse_DiffuseMap, oldFragUV1).a;
+		}
+#		endif // defined(HAS_TransformUVs)
+		textureColor = mix(textureColor, textureColor2, blendMix);
+	}
+#	endif // defined(HAS_Atlas)
+
+	diffuseColor *= textureColor;
+
+#	if defined(HAS_DiffuseRamp)
+	diffuseColor.rgb =  SAMPLE(DiffuseRamp_RampMap, vec2(diffuseColor.x, 0.0)).rgb;
+#	endif // defined(HAS_DiffuseRamp)
+
+#if	defined(HAS_AlphaRemap)
+	vec2    alphaTexCoord = vec2(diffuseColor.a, fInput.fragAlphaRemap_Cursor);
+	diffuseColor.a = SAMPLE(AlphaRemap_AlphaMap, alphaTexCoord).r;
+#endif // defined(HAS_AlphaRemap)
+#endif // defined(HAS_Diffuse)
+
+//----------------------------------------------------------------------------
+// LIT
+//----------------------------------------------------------------------------
+#if defined(HAS_Lit)
+	vec3 surfacePosition = fInput.fragWorldPosition;
+
+	float litMask1 = SAMPLE(Lit_LitMaskMap, fragUV0).r;
+	vec3 normalTex1 = SAMPLE(Lit_NormalMap, fragUV0).xyz;
+#if defined(HAS_Atlas)
+	if (blendingType >= 1)
+	{
+		vec3 normalTex2 =  SAMPLE(Lit_NormalMap, fragUV1).xyz;
+		float litMask2 = SAMPLE(Lit_LitMaskMap, fragUV1).r;
+
+		normalTex1 = mix(normalTex1, normalTex2, blendMix);
+		litMask1 = mix(litMask1, litMask2, blendMix);
+	}
+#endif // defined(HAS_Atlas)
+	normalTex1 = 2.0f * normalTex1.xyz - vec3(1.0f, 1.0f, 1.0f);
+	diffuseColor.a *= litMask1;
+
+// if uv are rotated, inverse rotate the billboard space normal
+// to cancel tangent-UV mismatch
+#	if defined(HAS_TransformUVs)
+	float sinMR = -sinR; // sin(-x) = -sin(x)
+	float cosMR = cosR; // cos(-x) = cos(x)
+	mat2 UVInverseRotation = mat2(cosMR, sinMR, -sinMR, cosMR);
+	normalTex1.xy = mul(UVInverseRotation, normalTex1.xy);
+#	endif // defined(HAS_TransformUVs)
+
+	vec3	T = normalize(fInput.fragTangent.xyz);
+	vec3	N = normalize(fInput.fragNormal.xyz);
+	vec3	B = CROSS(N, T) * fInput.fragTangent.w * GET_CONSTANT(SceneInfo, Handedness);
+	N = fInput.IsFrontFace ? N : -N;
+	mat3	TBN = BUILD_MAT3(T, B, N);
+
+	vec3	surfaceNormal = normalize(mul(TBN, normalTex1.xyz));
+
+	float 	surfaceRoughness = GET_CONSTANT(Material, Lit_Roughness);
+	float	surfaceMetalness = GET_CONSTANT(Material, Lit_Metalness);
+
+	bool 	hasDirLight = GET_CONSTANT(LightInfo, DirectionalLightsCount) >= 1;
+	vec3 	lightDirection = hasDirLight ? LOADF3(GET_RAW_BUFFER(DirectionalLightsInfo), RAW_BUFFER_INDEX(0)) : vec3(0, 1, 0);
+	vec3 	lightColor = hasDirLight ? LOADF3(GET_RAW_BUFFER(DirectionalLightsInfo), RAW_BUFFER_INDEX(8)) : VEC3_ZERO;
+
+	vec3	viewPosition = GET_MATRIX_W_AXIS(GET_CONSTANT(SceneInfo, UnpackNormalView)).xyz;
+	vec3	surfToView = viewPosition - surfacePosition;
+	vec3	surfToLight = -lightDirection;
+	vec3	surfToLightDir = normalize(surfToLight);
+	vec3	surfToViewDir = normalize(surfToView);
+
+	vec3	lightDiffuse = computeBRDF(	surfToLightDir,
+										surfToViewDir,
+										surfaceNormal,
+										surfaceRoughness,
+										surfaceMetalness,
+										diffuseColor,
+										litMask1
+										FS_PARAMS);
+
+	vec3	ambientColor = GET_CONSTANT(LightInfo, AmbientColor);
+	vec3	lightAmbient = computeAmbientBRDF(	surfToViewDir,
+												surfaceNormal,
+												surfaceRoughness,
+												surfaceMetalness,
+												diffuseColor,
+												litMask1
+												FS_PARAMS);
+
+	diffuseColor.rgb = lightDiffuse * lightColor + lightAmbient * ambientColor;
+#else // !defined(HAS_Lit)
+	diffuseColor.rgb *= diffuseColor.a; // If we are unlit, we fade the diffuse color by it's alpha value
+#endif
+
+//----------------------------------------------------------------------------
+// EMISSIVE
+//----------------------------------------------------------------------------
+#if	defined(HAS_Emissive)
+
+#if     defined(FINPUT_fragEmissive_EmissiveColor)
+	emissiveColor = fInput.fragEmissive_EmissiveColor;
+#endif
+
+	vec3	emissiveColor1 = SAMPLE(Emissive_EmissiveMap, fragUV0).rgb;
+
+#if defined(HAS_Atlas)
+	if (blendingType >= 1)
+	{
+		vec3 emissiveColor2 = SAMPLE(Emissive_EmissiveMap, fragUV1).rgb;
+		emissiveColor1 = mix(emissiveColor1, emissiveColor2, blendMix);
+	}
+#endif // defined(HAS_Atlas)
+
+	emissiveColor *= emissiveColor1;
+
+#if	defined(HAS_EmissiveRamp)
+	emissiveColor = SAMPLE(EmissiveRamp_RampMap, vec2(emissiveColor.x,0.0)).rgb;
+#endif // defined(HAS_EmissiveRamp)
+
+#endif // defined(HAS_Emissive)
+
+#if	defined(HAS_SoftParticles)
+	vec4    projPos = fInput.fragViewProjPosition;
+	float   rcpw = 1.0 / projPos.w;
+	float   fragDepth_cs = projPos.z * rcpw;
+	//  if (IsDepthReversed())
+	//      fragDepth_cs = 1.0 - fragDepth_cs;
+	vec2    screenUV = projPos.xy * rcpw * vec2(0.5, 0.5) + 0.5;
+	float   sceneDepth_cs = SAMPLE(DepthSampler, screenUV).x;
+	float   sceneDepth = clipToLinearDepth(sceneDepth_cs FS_PARAMS);
+	float   fragDepth = clipToLinearDepth(fragDepth_cs FS_PARAMS);
+	float   invSoftnessDistance = 1.0f / GET_CONSTANT(Material, SoftParticles_SoftnessDistance);
+	float   depthfade = clamp((sceneDepth - fragDepth) * invSoftnessDistance, 0.f, 1.f);
+	emissiveColor *= depthfade;
+	diffuseColor.a *= depthfade;
+#endif // defined(HAS_SoftParticles)
+
+	fOutput.Output0 = vec4(emissiveColor + diffuseColor.rgb, diffuseColor.a);
+
+// !defined(ParticlePass_TransparentPostDisto)
+#elif defined(ParticlePass_Tint)
+
+	vec4	tintColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);
+
+//----------------------------------------------------------------------------
+// Tint
+//----------------------------------------------------------------------------
+#if     defined(FINPUT_fragTint_Color)
+	tintColor = fInput.fragTint_Color;
+#endif
+
+#if	defined(HAS_Tint)
+	vec4    textureColor = SAMPLE(Tint_TintMap, fragUV0);
+#	if defined(HAS_TransformUVs)
+		if (RGBOnly)
+		{
+			textureColor.a =  SAMPLE(Tint_TintMap, oldFragUV0).a;
+		}
+#	endif // defined(HAS_TransformUVs)
+
+#   if defined(HAS_Atlas)
+	if (blendingType >= 1)
+	{
+		vec4    textureColor2 = SAMPLE(Tint_TintMap, fragUV1);
+#		if defined(HAS_TransformUVs)
+		if (RGBOnly)
+		{
+			textureColor2.a =  SAMPLE(Tint_TintMap, oldFragUV1).a;
+		}
+#		endif // defined(HAS_TransformUVs)
+		textureColor = mix(textureColor, textureColor2, blendMix);
+	}
+#	endif // defined(HAS_Atlas)
+
+	tintColor *= textureColor;
+	tintColor.rgb = mix(vec3(1.0f, 1.0f, 1.0f), tintColor.rgb, tintColor.a);
+
+#endif // defined(HAS_Tint)
+
+	fOutput.Output0 = tintColor;
+
+#endif
+
+}

+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Transparent_Mesh.frag → PopcornFX/Library/PopcornFXCore/Shaders/Legacy/Transparent_Mesh.frag


+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Experimental/Light_Default.frag → PopcornFX/Library/PopcornFXCore/Shaders/Light_Default.frag


+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Experimental/Light_Default.vert → PopcornFX/Library/PopcornFXCore/Shaders/Light_Default.vert


+ 18 - 2
PopcornFX/Library/PopcornFXCore/Shaders/Experimental/Particle_Master.frag → PopcornFX/Library/PopcornFXCore/Shaders/Noise_Billboard.frag

@@ -4,7 +4,9 @@
 #include "includes/FeatureTransformUVs.h"
 #include "includes/FeatureDistortion.h"
 #include "includes/FeatureTint.h"
-#include "includes/FeatureDiffuse.h"
+#include "includes/FeatureNoise.h"
+#include "includes/FeatureUVDistortion.h"
+#include "includes/FeatureDiffuse.h"	
 #include "includes/FeatureEmissive.h"
 #include "includes/FeatureSoftParticles.h"
 #include "includes/FeatureDecal.h"
@@ -76,6 +78,20 @@ void    FragmentMain(IN(SFragmentInput) fInput, OUT(SFragmentOutput) fOutput FS_
 #		endif
 #	endif
 
+	SNoiseDistortion fNoiseDistortion;
+	fNoiseDistortion.m_UVDistortion0 = vec2(0.f, 0.f);
+	fNoiseDistortion.m_UVDistortion1 = vec2(0.f, 0.f);
+
+#	if	defined(HAS_UVDistortion0) || defined(HAS_UVDistortion1)
+	ApplyUVDistortion(fSurf, fGeom, fNoiseDistortion FS_PARAMS);
+#	endif
+
+#	if	defined(HAS_NOISE)
+	ApplyNoise(fSurf, fGeom, fInput.MainShape_ShapeTexture FS_PARAMS);
+#	endif
+
+	ApplyNoiseDiffuse(fSurf, fGeom, fNoiseDistortion FS_PARAMS);
+
 #	if	defined(HAS_DiffuseRamp)
 	ApplyDiffuseRamp(fSurf FS_PARAMS);
 #	endif
@@ -112,7 +128,7 @@ void    FragmentMain(IN(SFragmentInput) fInput, OUT(SFragmentOutput) fOutput FS_
 	ApplySoftParticles(fSurf, clipPos FS_PARAMS);
 # 	endif
 #endif
-
+	
 	OutputFragmentColor(fSurf, fOutput FS_PARAMS);
 }
 

+ 129 - 453
PopcornFX/Library/PopcornFXCore/Shaders/Particle_Master.frag

@@ -1,483 +1,159 @@
 
-#if     defined(HAS_SoftParticles)
-float   clipToLinearDepth(float depth FS_ARGS)
-{
-	float zNear = GET_CONSTANT(SceneInfo, ZBufferLimits).x;
-	float zFar = GET_CONSTANT(SceneInfo, ZBufferLimits).y;
-	return (-zNear * zFar) / (depth * (zFar - zNear) - zFar);
-}
-#endif
-
-#if     defined(HAS_Distortion)
-float   clipDepthToDistortionFade(float depth FS_ARGS)
-{
-	float zNear = GET_CONSTANT(SceneInfo, ZBufferLimits).x;
-	float zFar = GET_CONSTANT(SceneInfo, ZBufferLimits).y;
-	float zLinear = (-zNear * zFar) / (depth * (zFar - zNear) - zFar);
-	return min(zLinear / zNear - 1.f, sqrt(10.f / zLinear) ); // looks like the v1 (10.f = sqrt(zFar * zNear))
-}
-#endif
-
-#if defined(HAS_Lit) && (defined(ParticlePass_TransparentPostDisto) || defined(ParticlePass_Transparent))
-
-//------------------------------
-// BRDF Computation
-//------------------------------
-#   define PI                       3.141592
-#   define  METAL_FRESNEL_FACTOR    vec3(0.04, 0.04, 0.04)
-#   define EPSILON                  1e-5
-
-float normalDistFuncGGX(float cosLh, float roughness)
-{
-	float alpha = roughness * roughness;
-	float alphaSq = alpha * alpha;
-
-	float denom = (cosLh * cosLh) * (alphaSq - 1.0) + 1.0;
-	return alphaSq / (PI * denom * denom);
-}
-
-float schlickGGX(float cosLi, float cosLo, float roughness)
-{
-	float r = roughness + 1.0;
-	float k = (r * r) / 8.0; // UE4 remapping
-
-	float t1 = cosLi / (cosLi * (1.0 - k) + k);
-	float t2 = cosLo / (cosLo * (1.0 - k) + k);
-
-	return t1 * t2;
-}
- 
-vec3 fresnelSchlick(vec3 surfaceMetalColor, float cosTheta)
-{
-	return surfaceMetalColor + (vec3(1.0, 1.0, 1.0) - surfaceMetalColor) * pow(1.0 - cosTheta, 5.0);
-}
-
-vec3	computeBRDF(vec3 surfToLight, vec3 surfToView, vec3 surfaceNormal, float roughness, float metalness, vec4 diffuseColor, float litMask FS_ARGS)
-{
-	vec3    halfVec = normalize(surfToLight + surfToView);
-
-	float   NoL = dot(surfToLight, surfaceNormal);
-
-#if     defined(HAS_NormalWrap)
-	float   normalWrapFactor = GET_CONSTANT(Material, NormalWrap_WrapFactor) * 0.5f;
-	NoL = normalWrapFactor + (1.0f - normalWrapFactor) * NoL;
-#endif
-
-	NoL = max(0.0f, NoL);
-
-	float   specIntensity = max(0.0f, dot(halfVec, surfaceNormal));
-	float   NoV = max(EPSILON, dot(surfToView, surfaceNormal)); // Weird behavior when this is near 0
-
-	vec3    surfaceMetalColor = mix(METAL_FRESNEL_FACTOR, diffuseColor.rgb, metalness);
-
-	vec3    F  = fresnelSchlick(surfaceMetalColor, max(0.0f, dot(halfVec, surfToView)));
-	float   D = normalDistFuncGGX(specIntensity, roughness);
-	float   G = schlickGGX(NoL, NoV, roughness);
-
-	float specularMultiplier = GET_CONSTANT(Material, Lit_Type) == 1 ? litMask : diffuseColor.a;
-	vec3 diffuseBRDF = mix(vec3(1.0, 1.0, 1.0) - F, vec3(0.0, 0.0, 0.0), metalness) * diffuseColor.rgb * diffuseColor.a;
-	vec3 specularBRDF = ((F * D * G) / max(EPSILON, 4.0 * NoL * NoV)) * specularMultiplier;
-
-	return (diffuseBRDF + specularBRDF) * NoL;
-}
-
-vec3	fresnelSchlickRoughness(float cosTheta, vec3 F0, float roughness)
-{
-	return F0 + (max(vec3(1.0f - roughness, 1.0f - roughness, 1.0f - roughness), F0) - F0) * pow(1.0f - cosTheta, 5.0f);
-}
-
-vec3	toCubemapSpace(vec3 value FS_ARGS)
-{
-	vec3	valueLHZ = mul(GET_CONSTANT(SceneInfo, UserToLHZ), vec4(value, 0.0f)).xyz;
-	vec3	valueRHY = vec3(valueLHZ.x, valueLHZ.z, valueLHZ.y);
-	valueRHY.xz = mul(GET_CONSTANT(EnvironmentMapInfo, Rotation), valueRHY.xz);
-	return valueRHY;
-}
-
-vec3	computeAmbientBRDF(vec3 surfToView, vec3 surfaceNormal, float roughness, float metalness, vec4 diffuseColor, float litMask FS_ARGS)
-{
-	// Cubemaps are expected to be cosined filtered up to the 7th mipmap which should contain the fully diffuse 180 degrees cosine-filtered cubemap.
-	const float	kCubemapMipRange = 6;
-
-	vec3    surfaceMetalColor = mix(METAL_FRESNEL_FACTOR, diffuseColor.rgb, metalness);
-	vec3	kS = fresnelSchlickRoughness(max(dot(surfaceNormal, surfToView), 0.0), surfaceMetalColor, roughness);
-	vec3	kD = 1.0 - kS;
-	kD *= 1.0 - metalness;
-
-	// Ambient diffuse
-	vec3	irradiance = SAMPLELOD_CUBE(EnvironmentMapSampler, toCubemapSpace(surfaceNormal FS_PARAMS), kCubemapMipRange).rgb;
-	vec3	diffuse = irradiance * diffuseColor.rgb * diffuseColor.a;
-
-	// Ambient specular
-	vec3	prefilteredColor = SAMPLELOD_CUBE(EnvironmentMapSampler, toCubemapSpace(reflect(-surfToView, surfaceNormal) FS_PARAMS), roughness * kCubemapMipRange).rgb;
-	vec2	envBRDF  = SAMPLE(BRDFLUTSampler, vec2(max(dot(surfaceNormal, surfToView), 0.0), roughness)).rg;
-	float 	specularMultiplier = GET_CONSTANT(Material, Lit_Type) == 1 ? litMask : diffuseColor.a;
-	vec3	specular = prefilteredColor * (kS * envBRDF.x + envBRDF.y) * specularMultiplier;
-
-	vec3 ambient = kD * diffuse + specular;
-	return ambient;
-}
-
-#endif
-
-#if defined(HAS_TransformUVs)
-vec2 transformUV(vec2 UV, vec2 scale, mat2 rotation, vec2 offset)
-{
-	return mul(rotation, UV * scale) + offset;
-}
-#endif
-
-vec2    applyCorrectDeformation(IN(SFragmentInput) fInput, IN(vec2) fragUVin FS_ARGS)
-{
-#if     defined(HAS_CorrectDeformation)
-	vec2 fragUVout;
-	if (fragUVin.x + fragUVin.y < 1)
-		fragUVout = fragUVin.xy / fInput.fragUVFactors.xy;
-	else
-		fragUVout = 1.0 - ((1.0 - fragUVin.xy) / fInput.fragUVFactors.zw);
-#if     defined(HAS_TextureUVs)
-	if (GET_CONSTANT(Material, TextureUVs_RotateTexture) != 0)
-		fragUVout = fragUVout.yx;
-#endif
-	return fragUVout * fInput.fragUVScaleAndOffset.xy + fInput.fragUVScaleAndOffset.zw;
-#else
-	return fragUVin;
-#endif
-}
+#include "includes/FeatureRibbonCorrectDeformation.h"
+#include "includes/FeatureAtlas.h"
+#include "includes/FeatureTransformUVs.h"
+#include "includes/FeatureDistortion.h"
+#include "includes/FeatureTint.h"
+#include "includes/FeatureDiffuse.h"
+#include "includes/FeatureEmissive.h"
+#include "includes/FeatureSoftParticles.h"
+#include "includes/FeatureDecal.h"
+#include "includes/FeatureDithering.h"
+#include "includes/FeatureAlphaMasks.h"
+#include "includes/FeatureUVDistortions.h"
+#include "includes/FeatureFastLit.h"
+#include "includes/PKLighting.h"
+#include "includes/PKOutputColor.h"
 
 void    FragmentMain(IN(SFragmentInput) fInput, OUT(SFragmentOutput) fOutput FS_ARGS)
 {
-//----------------------------------------------------------------------------
-// Gather texture coordinates
-//----------------------------------------------------------------------------
-#if 	defined(FINPUT_fragUV0)
-	vec2    fragUV0 = applyCorrectDeformation(fInput, fInput.fragUV0 FS_PARAMS);
-#	if		defined(HAS_Atlas)
-	int		blendingType = GET_CONSTANT(Material, Atlas_Blending);
-	vec2	fragUV1 = applyCorrectDeformation(fInput, fInput.fragUV1 FS_PARAMS);
-	float	blendMix = 0.f;
-
-	if (blendingType == 2)
-	{
-		// Motion vectors
-		vec2	scale = GET_CONSTANT(Material, Atlas_DistortionStrength);
-		vec2	curVectors = ((SAMPLE(Atlas_MotionVectorsMap, fragUV0).rg * 2.0f) - 1.0f) * scale;
-		vec2	nextVectors = ((SAMPLE(Atlas_MotionVectorsMap, fragUV1).rg * 2.0f) - 1.0f) * scale;
-		float	cursor = fract(fInput.fragAtlas_TextureID);
-
-		curVectors *= cursor;
-		nextVectors *= (1.0f - cursor);
-
-		fragUV0 = fragUV0 - curVectors;
-		fragUV1 = fragUV1 + nextVectors;
-		blendMix = cursor;
-	}
-	else if (blendingType == 1)
-	{
-		// Linear
-		blendMix = fract(fInput.fragAtlas_TextureID);
-	}
-#	endif // defined(HAS_Atlas)
-#endif // defined(FINPUT_fragUV0)
-
-//----------------------------------------------------------------------------
-// Transform UVs
-//----------------------------------------------------------------------------
-#if	defined(HAS_TransformUVs)
-	float	sinR = sin(fInput.fragTransformUVs_UVRotate);
-	float	cosR = cos(fInput.fragTransformUVs_UVRotate);
-	mat2	UVRotation = mat2(cosR, sinR, -sinR, cosR);
-	vec2	UVScale = fInput.fragTransformUVs_UVScale;
-	vec2	UVOffset = fInput.fragTransformUVs_UVOffset;
-	vec4	rect0 = vec4(1.0f, 1.0f, 0.0f, 0.0f);
-#	if	defined(HAS_Atlas)
-	if (blendingType >= 1)
-	{
-		rect0 = LOADF4(GET_RAW_BUFFER(Atlas), RAW_BUFFER_INDEX(min(LOADU(GET_RAW_BUFFER(Atlas), 0) - 1, uint(fInput.fragAtlas_TextureID)) * 4 + 1));
-	}
-	vec4	rect1 = LOADF4(GET_RAW_BUFFER(Atlas), RAW_BUFFER_INDEX(min(LOADU(GET_RAW_BUFFER(Atlas), 0) - 1, uint(fInput.fragAtlas_TextureID) + 1) * 4 + 1));
-
-	vec2	oldFragUV1 = fragUV1;
-	fragUV1 = ((fragUV1 - rect1.zw) / rect1.xy); // normalize (if atlas)
-	fragUV1 = transformUV(fragUV1, UVScale, UVRotation, UVOffset); // scale then rotate then translate UV
-	fragUV1 = fract(fragUV1) * rect1.xy + rect1.zw; // undo normalize
-#	endif // defined(HAS_Atlas)
-	vec2	oldFragUV0 = fragUV0;	
-	fragUV0 = ((fragUV0 - rect0.zw) / rect0.xy); // normalize (if atlas)
-	fragUV0 = transformUV(fragUV0, UVScale, UVRotation, UVOffset); // scale then rotate then translate UV
-	fragUV0 = fract(fragUV0) * rect0.xy + rect0.zw; // undo normalize
-	bool	RGBOnly = GET_CONSTANT(Material, TransformUVs_RGBOnly) != 0;
-#endif // defined(HAS_TransformUVs)
-
-//----------------------------------------------------------------------------
-// render pass distortion
-//----------------------------------------------------------------------------
-#if 	defined(ParticlePass_Distortion)
+	vec3 			clipPos = fInput.fragViewProjPosition.xyz / fInput.fragViewProjPosition.w;
 
-	vec4    distoColor = vec4(0.0f, 0.0f, 0.0f, 1.0f);
+	// -------------------
+	// Frag geom:
+	// -------------------
+	SFragGeometry 	fGeom;
+	FragmentInputToFragGeometry(fInput, fGeom FS_PARAMS);
 
-#if     defined(FINPUT_fragDistortion_Color)
-	distoColor = fInput.fragDistortion_Color;
+#if defined(HAS_AlphaMasks) || defined(HAS_UVDistortions)
+	SMaskDistortion fMaskDist;
+	InitializeMaskDistortion(fMaskDist);
 #endif
 
-#if     defined(HAS_SoftParticles) || defined(HAS_Distortion)
-	vec4    projPos = fInput.fragViewProjPosition;
-	float   rcpw = 1.0 / projPos.w;
-	float   fragDepth_cs = projPos.z * rcpw;
-	//  if (IsDepthReversed())
-	//      fragDepth_cs = 1.0 - fragDepth_cs;
+#if defined(HAS_CorrectDeformation)
+	ApplyRibbonCorrectDeformation(fGeom, fInput.fragUVFactors, fInput.fragUVScaleAndOffset FS_PARAMS);
 #endif
 
-	vec4    textureColor;
-	
-	distoColor *= clipDepthToDistortionFade(fragDepth_cs  FS_PARAMS);
-
-#   if      defined(HAS_Atlas)
-	
-	if (blendingType == 2)
-	{
-		vec4	textureColor1 = SAMPLE(Distortion_DistortionMap, fragUV0);
-		vec4	textureColor2 = SAMPLE(Distortion_DistortionMap, fragUV1);
-		textureColor = mix(textureColor1, textureColor2, blendMix);
-	}
-	else
-	{
-		textureColor = SAMPLE(Distortion_DistortionMap, fragUV0);
-		if (blendingType == 1)
-		{
-			// Linear
-			vec4    textureColor2 = SAMPLE(Distortion_DistortionMap, fragUV1);
-			textureColor = mix(textureColor, textureColor2, blendMix);
-		}
-	}
-#	else
-	// No atlas
-	textureColor = SAMPLE(Distortion_DistortionMap, fInput.fragUV0);
-#	endif // defined(HAS_Atlas)
-
-	distoColor *= textureColor * vec4(2., 2., 1., 0.) - vec4(1.00392, 1.00392, 0., -1.); // 128 is considered as the mid-value (in range 0-255)
-
-#if     defined(HAS_SoftParticles)
-	vec2    screenUV = projPos.xy * rcpw * vec2(0.5, 0.5) + 0.5;
-	float   sceneDepth_cs = SAMPLE(DepthSampler, screenUV).x;
-	float   sceneDepth = clipToLinearDepth(sceneDepth_cs FS_PARAMS);
-	float   fragDepth = clipToLinearDepth(fragDepth_cs FS_PARAMS);
-	float   invSoftnessDistance = 1.0f / GET_CONSTANT(Material, SoftParticles_SoftnessDistance);
-	float   depthfade = clamp((sceneDepth - fragDepth) * invSoftnessDistance, 0.f, 1.f);
-	distoColor *= depthfade;
+#if defined(HAS_UVDistortions)
+	ApplyUVDistortion(fGeom, fInput.fragUVDistortions_Distortion1AnimationCursor, fInput.fragUVDistortions_Distortion2AnimationCursor, fMaskDist);
 #endif
 
-	fOutput.Output0 = distoColor;
-
-//----------------------------------------------------------------------------
-// render pass transparent
-//----------------------------------------------------------------------------
-#elif 	defined(ParticlePass_TransparentPostDisto) || defined(ParticlePass_Transparent)
-
-	vec4    diffuseColor = vec4(0.0f, 0.0f, 0.0f, 0.0f);
-	vec3    emissiveColor = vec3(0.0f, 0.0f, 0.0f);
-
-//----------------------------------------------------------------------------
-// DIFFUSE
-//----------------------------------------------------------------------------
-#if	defined(HAS_Diffuse)
-	diffuseColor = fInput.fragDiffuse_Color;
-
-	vec4    textureColor = SAMPLE(Diffuse_DiffuseMap, fragUV0);
-#	if defined(HAS_TransformUVs)
-		if (RGBOnly)
-		{
-			textureColor.a =  SAMPLE(Diffuse_DiffuseMap, oldFragUV0).a;
-		}
-#	endif // defined(HAS_TransformUVs)
-
-#   if defined(HAS_Atlas)
-	if (blendingType >= 1)
-	{
-		vec4    textureColor2 = SAMPLE(Diffuse_DiffuseMap, fragUV1);
-#		if defined(HAS_TransformUVs)
-		if (RGBOnly)
-		{
-			textureColor2.a =  SAMPLE(Diffuse_DiffuseMap, oldFragUV1).a;
-		}
-#		endif // defined(HAS_TransformUVs)
-		textureColor = mix(textureColor, textureColor2, blendMix);
-	}
-#	endif // defined(HAS_Atlas)
-
-	diffuseColor *= textureColor;
-
-#	if defined(HAS_DiffuseRamp)
-	diffuseColor.rgb =  SAMPLE(DiffuseRamp_RampMap, vec2(diffuseColor.x, 0.0)).rgb;
-#	endif // defined(HAS_DiffuseRamp)
-
-#if	defined(HAS_AlphaRemap)
-	vec2    alphaTexCoord = vec2(diffuseColor.a, fInput.fragAlphaRemap_Cursor);
-	diffuseColor.a = SAMPLE(AlphaRemap_AlphaMap, alphaTexCoord).r;
-#endif // defined(HAS_AlphaRemap)
-#endif // defined(HAS_Diffuse)
-
-//----------------------------------------------------------------------------
-// LIT
-//----------------------------------------------------------------------------
-#if defined(HAS_Lit)
-	vec3 surfacePosition = fInput.fragWorldPosition;
+#if defined(HAS_AlphaMasks)
+	ApplyAlphaMasks(fGeom, fInput.fragAlphaMasks_Mask1AnimationCursor, fInput.fragAlphaMasks_Mask2AnimationCursor, fMaskDist FS_PARAMS);
+#endif
 
-	float litMask1 = SAMPLE(Lit_LitMaskMap, fragUV0).r;
-	vec3 normalTex1 = SAMPLE(Lit_NormalMap, fragUV0).xyz;
 #if defined(HAS_Atlas)
-	if (blendingType >= 1)
-	{
-		vec3 normalTex2 =  SAMPLE(Lit_NormalMap, fragUV1).xyz;
-		float litMask2 = SAMPLE(Lit_LitMaskMap, fragUV1).r;
-
-		normalTex1 = mix(normalTex1, normalTex2, blendMix);
-		litMask1 = mix(litMask1, litMask2, blendMix);
-	}
-#endif // defined(HAS_Atlas)
-	normalTex1 = 2.0f * normalTex1.xyz - vec3(1.0f, 1.0f, 1.0f);
-	diffuseColor.a *= litMask1;
-
-// if uv are rotated, inverse rotate the billboard space normal
-// to cancel tangent-UV mismatch
-#	if defined(HAS_TransformUVs)
-	float sinMR = -sinR; // sin(-x) = -sin(x)
-	float cosMR = cosR; // cos(-x) = cos(x)
-	mat2 UVInverseRotation = mat2(cosMR, sinMR, -sinMR, cosMR);
-	normalTex1.xy = mul(UVInverseRotation, normalTex1.xy);
-#	endif // defined(HAS_TransformUVs)
-
-	vec3	T = normalize(fInput.fragTangent.xyz);
-	vec3	N = normalize(fInput.fragNormal.xyz);
-	vec3	B = CROSS(N, T) * fInput.fragTangent.w * GET_CONSTANT(SceneInfo, Handedness);
-	N = fInput.IsFrontFace ? N : -N;
-	mat3	TBN = BUILD_MAT3(T, B, N);
-
-	vec3	surfaceNormal = normalize(mul(TBN, normalTex1.xyz));
-
-	float 	surfaceRoughness = GET_CONSTANT(Material, Lit_Roughness);
-	float	surfaceMetalness = GET_CONSTANT(Material, Lit_Metalness);
-
-	bool 	hasDirLight = GET_CONSTANT(LightInfo, DirectionalLightsCount) >= 1;
-	vec3 	lightDirection = hasDirLight ? LOADF3(GET_RAW_BUFFER(DirectionalLightsInfo), RAW_BUFFER_INDEX(0)) : vec3(0, 1, 0);
-	vec3 	lightColor = hasDirLight ? LOADF3(GET_RAW_BUFFER(DirectionalLightsInfo), RAW_BUFFER_INDEX(8)) : VEC3_ZERO;
-
-	vec3	viewPosition = GET_MATRIX_W_AXIS(GET_CONSTANT(SceneInfo, UnpackNormalView)).xyz;
-	vec3	surfToView = viewPosition - surfacePosition;
-	vec3	surfToLight = -lightDirection;
-	vec3	surfToLightDir = normalize(surfToLight);
-	vec3	surfToViewDir = normalize(surfToView);
-
-	vec3	lightDiffuse = computeBRDF(	surfToLightDir,
-										surfToViewDir,
-										surfaceNormal,
-										surfaceRoughness,
-										surfaceMetalness,
-										diffuseColor,
-										litMask1
-										FS_PARAMS);
-
-	vec3	ambientColor = GET_CONSTANT(LightInfo, AmbientColor);
-	vec3	lightAmbient = computeAmbientBRDF(	surfToViewDir,
-												surfaceNormal,
-												surfaceRoughness,
-												surfaceMetalness,
-												diffuseColor,
-												litMask1
-												FS_PARAMS);
-
-	diffuseColor.rgb = lightDiffuse * lightColor + lightAmbient * ambientColor;
-#else // !defined(HAS_Lit)
-	diffuseColor.rgb *= diffuseColor.a; // If we are unlit, we fade the diffuse color by it's alpha value
+	ApplyAtlasTexCoords(fGeom FS_PARAMS);
 #endif
 
-//----------------------------------------------------------------------------
-// EMISSIVE
-//----------------------------------------------------------------------------
-#if	defined(HAS_Emissive)
-
-#if     defined(FINPUT_fragEmissive_EmissiveColor)
-	emissiveColor = fInput.fragEmissive_EmissiveColor;
+#if	defined(HAS_TransformUVs)
+#	if defined(HAS_Atlas)
+	uint	maxAtlasID = LOADU(GET_RAW_BUFFER(Atlas), 0) - 1;
+	vec4	rect0 = LOADF4(GET_RAW_BUFFER(Atlas), RAW_BUFFER_INDEX(min(maxAtlasID, uint(fInput.fragAtlas_TextureID)) * 4 + 1));
+	vec4	rect1 = LOADF4(GET_RAW_BUFFER(Atlas), RAW_BUFFER_INDEX(min(maxAtlasID, uint(fInput.fragAtlas_TextureID) + 1) * 4 + 1));
+	ApplyTransformUVs(fGeom, rect0, rect1, fInput.fragTransformUVs_UVRotate, fInput.fragTransformUVs_UVScale, fInput.fragTransformUVs_UVOffset FS_PARAMS);
+#	else
+	ApplyTransformUVs(fGeom, fInput.fragTransformUVs_UVRotate, fInput.fragTransformUVs_UVScale, fInput.fragTransformUVs_UVOffset FS_PARAMS);
+#	endif
 #endif
+#	if	defined(HAS_BasicTransformUVs)
+	ApplyBasicTransformUVs(fGeom FS_PARAMS);
+#	endif
+
+#	if defined(HAS_Lit) && !defined(HAS_FastLit)
+#		if(HAS_UVDistortions)
+	ApplyNormalMap(fGeom, fMaskDist, fInput.IsFrontFace FS_PARAMS);
+#		else
+	ApplyNormalMap(fGeom, fInput.IsFrontFace FS_PARAMS);
+#		endif
+#	endif
+
+	// -------------------
+	// Frag surface:
+	// -------------------
+	SFragSurface 	fSurf;
+	FragGeometryToFragSurface(fGeom, fSurf, clipPos.z FS_PARAMS);
+
+#if 	defined(PK_FORWARD_DISTORTION_PASS)
+
+	// Distortion render pass:
+	ApplyDistortion(fSurf, fGeom, fInput.fragDistortion_DistortionColor, clipPos.z FS_PARAMS);
+
+#elif 	defined(PK_FORWARD_TINT_PASS)
+
+	// Tint render pass:
+	ApplyTint(fSurf, fGeom, fInput.fragTint_TintColor FS_PARAMS);
+
+#elif 	defined(PK_FORWARD_COLOR_PASS) || defined(PK_DEFERRED_COLOR_PASS) || defined(PK_DEFERRED_DECAL_PASS)
+
+	// Color render pass:
+#	if	defined(HAS_Diffuse)
+#		if	defined(HAS_AlphaRemap)
+	ApplyDiffuse(fSurf, fGeom, fInput.fragDiffuse_DiffuseColor, fInput.fragAlphaRemap_AlphaRemapCursor FS_PARAMS);
+#		elif defined(HAS_UVDistortions)
+	ApplyDiffuse(fSurf, fGeom, fMaskDist, fInput.fragDiffuse_DiffuseColor FS_PARAMS);
+#		else
+	ApplyDiffuse(fSurf, fGeom, fInput.fragDiffuse_DiffuseColor FS_PARAMS);
+#		endif
+#	endif
+
+#	if	defined(HAS_Emissive)
+#		if defined(HAS_UVDistortions)
+	ApplyEmissive(fSurf, fGeom, fMaskDist, fInput.fragEmissive_EmissiveColor FS_PARAMS);
+#		else
+	ApplyEmissive(fSurf, fGeom, fInput.fragEmissive_EmissiveColor FS_PARAMS);
+#		endif
+#	endif
+
+#	if defined(HAS_AlphaMasks) || defined(HAS_UVDistortions)
+	ApplyFinalAlpha(fInput, fGeom, fSurf, fMaskDist FS_PARAMS);
+#	else
+	ApplyFinalAlpha(fInput, fGeom, fSurf FS_PARAMS);
+#	endif
 
-	vec3	emissiveColor1 = SAMPLE(Emissive_EmissiveMap, fragUV0).rgb;
-
-#if defined(HAS_Atlas)
-	if (blendingType >= 1)
-	{
-		vec3 emissiveColor2 = SAMPLE(Emissive_EmissiveMap, fragUV1).rgb;
-		emissiveColor1 = mix(emissiveColor1, emissiveColor2, blendMix);
-	}
-#endif // defined(HAS_Atlas)
-
-	emissiveColor *= emissiveColor1;
+#	if	defined(HAS_EmissiveRamp)
+		ApplyEmissiveRamp(fInput.fragEmissiveRamp_RampVAxis, fSurf FS_PARAMS);
+#	endif
 
-#if	defined(HAS_EmissiveRamp)
-	emissiveColor = SAMPLE(EmissiveRamp_RampMap, vec2(emissiveColor.x,0.0)).rgb;
-#endif // defined(HAS_EmissiveRamp)
+#	if	defined(HAS_DiffuseRamp)
+	ApplyDiffuseRamp(fInput.fragDiffuseRamp_RampVAxis, fSurf FS_PARAMS);
+#	endif
 
-#endif // defined(HAS_Emissive)
+#   if defined(HAS_Dissolve)
+	ApplyDissolve(fInput.fragDissolve_DissolveAnimationCursor, fGeom, fSurf FS_PARAMS);
+#   endif
 
-#if	defined(HAS_SoftParticles)
-	vec4    projPos = fInput.fragViewProjPosition;
-	float   rcpw = 1.0 / projPos.w;
-	float   fragDepth_cs = projPos.z * rcpw;
-	//  if (IsDepthReversed())
-	//      fragDepth_cs = 1.0 - fragDepth_cs;
-	vec2    screenUV = projPos.xy * rcpw * vec2(0.5, 0.5) + 0.5;
-	float   sceneDepth_cs = SAMPLE(DepthSampler, screenUV).x;
-	float   sceneDepth = clipToLinearDepth(sceneDepth_cs FS_PARAMS);
-	float   fragDepth = clipToLinearDepth(fragDepth_cs FS_PARAMS);
-	float   invSoftnessDistance = 1.0f / GET_CONSTANT(Material, SoftParticles_SoftnessDistance);
-	float   depthfade = clamp((sceneDepth - fragDepth) * invSoftnessDistance, 0.f, 1.f);
-	emissiveColor *= depthfade;
-	diffuseColor.a *= depthfade;
-#endif // defined(HAS_SoftParticles)
+#	if defined(PK_FORWARD_COLOR_PASS) || defined(PK_DEFERRED_COLOR_PASS)
+#		if	defined(HAS_Lit) && !defined(HAS_FastLit)
+	float 	roughness = GET_CONSTANT(Material, Lit_Roughness);
+	float	metalness = GET_CONSTANT(Material, Lit_Metalness);
+	ApplyLighting(fSurf, fGeom, fInput.fragWorldPosition, roughness, metalness FS_PARAMS);
+#		endif
 
-	fOutput.Output0 = vec4(emissiveColor + diffuseColor.rgb, diffuseColor.a);
+#		if	defined(HAS_FastLit)
+	ApplyFastLighting(fSurf, fGeom, fInput.fragWorldPosition FS_PARAMS);
+#		endif
+#	endif // !defined(PK_DEFERRED_DECAL_PASS)
 
-// !defined(ParticlePass_TransparentPostDisto)
-#elif defined(ParticlePass_Tint)
 
-	vec4	tintColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);
+#	if defined(PK_DEFERRED_COLOR_PASS)
+	if (GET_CONSTANT(Material, Opaque_Type) == 2)
+		ApplyDithering(fSurf, fGeom, fInput FS_PARAMS);
+#	endif
 
-//----------------------------------------------------------------------------
-// Tint
-//----------------------------------------------------------------------------
-#if     defined(FINPUT_fragTint_Color)
-	tintColor = fInput.fragTint_Color;
+#else
+#	error "Unrecognized particle render pass"
 #endif
 
-#if	defined(HAS_Tint)
-	vec4    textureColor = SAMPLE(Tint_TintMap, fragUV0);
-#	if defined(HAS_TransformUVs)
-		if (RGBOnly)
-		{
-			textureColor.a =  SAMPLE(Tint_TintMap, oldFragUV0).a;
-		}
-#	endif // defined(HAS_TransformUVs)
-
-#   if defined(HAS_Atlas)
-	if (blendingType >= 1)
-	{
-		vec4    textureColor2 = SAMPLE(Tint_TintMap, fragUV1);
-#		if defined(HAS_TransformUVs)
-		if (RGBOnly)
-		{
-			textureColor2.a =  SAMPLE(Tint_TintMap, oldFragUV1).a;
-		}
-#		endif // defined(HAS_TransformUVs)
-		textureColor = mix(textureColor, textureColor2, blendMix);
-	}
-#	endif // defined(HAS_Atlas)
-
-	tintColor *= textureColor;
-	tintColor.rgb = mix(vec3(1.0f, 1.0f, 1.0f), tintColor.rgb, tintColor.a);
-
-#endif // defined(HAS_Tint)
-
-	fOutput.Output0 = tintColor;
-
+#if defined(PK_DEFERRED_DECAL_PASS)
+	ApplyDecalFading(fSurf, fGeom FS_PARAMS);
+#elif !defined(PK_DEFERRED_COLOR_PASS)
+# 	if defined(HAS_SoftParticles)
+	// For all render passes except deferred :
+	ApplySoftParticles(fSurf, clipPos FS_PARAMS);
+# 	endif
 #endif
 
+	OutputFragmentColor(fSurf, fOutput FS_PARAMS);
 }
+

+ 93 - 0
PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureAlphaMasks.h

@@ -0,0 +1,93 @@
+#pragma once
+
+#include "PKSurface.h"
+#include "FeatureTransformUVs.h"
+
+#define SMOOTHSTEP_EPSILON 1.0e-7f
+
+#if defined(PK_FORWARD_COLOR_PASS) || defined(PK_DEFERRED_COLOR_PASS) || defined(PK_DEFERRED_DECAL_PASS)
+#   if defined(HAS_AlphaMasks) || defined(HAS_UVDistortions) 
+
+void        InitializeMaskDistortion(INOUT(SMaskDistortion) fMaskDistortion FS_ARGS)
+{
+#   if defined(HAS_UVDistortions)
+    fMaskDistortion.m_UVDistortion1 = vec2(0.f, 0.f);
+    fMaskDistortion.m_UVDistortion2 = vec2(0.f, 0.f);
+#   endif
+
+#   if defined(HAS_AlphaMasks)
+    fMaskDistortion.m_MaskSample1 = 0.f;
+    fMaskDistortion.m_MaskSample2 = 0.f;
+#   endif
+}
+
+#   if defined(HAS_AlphaMasks)
+void        ApplyAlphaMasks(IN(SFragGeometry) fGeom, IN(float) animationCursor1, IN(float) animationCursor2,  INOUT(SMaskDistortion) fMaskDistortion FS_ARGS)
+{
+#   if defined(HAS_UVDistortions)
+    vec2 uvMask1 = fMaskDistortion.m_UVDistortion1 * 0.1f + fMaskDistortion.m_UVDistortion2 * 0.01f + fGeom.m_RawUV0;
+    vec2 uvMask2 = fMaskDistortion.m_UVDistortion1 * 0.01f + fMaskDistortion.m_UVDistortion2 * 0.1f + fGeom.m_RawUV0;
+#   else
+    vec2 uvMask1 = fGeom.m_RawUV0;
+    vec2 uvMask2 = fGeom.m_RawUV0;
+#   endif
+
+    float   angle1 = GET_CONSTANT(Material, AlphaMasks_Mask1RotationSpeed) * animationCursor1;
+    float	sinR1 = sin(angle1);
+	float	cosR1 = cos(angle1);
+	mat2	UVRotation1 = mat2(cosR1, sinR1, -sinR1, cosR1);
+
+    vec2 translation1 = GET_CONSTANT(Material, AlphaMasks_Mask1TranslationSpeed) * animationCursor1;
+    vec2 scale1 = GET_CONSTANT(Material, AlphaMasks_Mask1Scale);
+    uvMask1 = TransformUV(uvMask1 - 0.5, scale1, UVRotation1, translation1 + scale1 * 0.5);
+    fMaskDistortion.m_MaskSample1 = SAMPLE(AlphaMasks_Mask1Map, uvMask1).r * GET_CONSTANT(Material, AlphaMasks_Mask1Intensity);
+    fMaskDistortion.m_MaskSample1 = mix(fMaskDistortion.m_MaskSample1, 1.f, 1 - GET_CONSTANT(Material, AlphaMasks_Mask1Weight)); // Do this on CPU
+
+    float   angle2 = GET_CONSTANT(Material, AlphaMasks_Mask2RotationSpeed) * animationCursor2;
+    float	sinR2 = sin(angle2);
+	float	cosR2 = cos(angle2);
+	mat2	UVRotation2 = mat2(cosR2, sinR2, -sinR2, cosR2);
+
+    vec2 translation2 = GET_CONSTANT(Material, AlphaMasks_Mask2TranslationSpeed) * animationCursor2;
+    vec2 scale2 = GET_CONSTANT(Material, AlphaMasks_Mask2Scale);
+    uvMask2 = TransformUV(uvMask2 - 0.5, scale2, UVRotation2, translation2 + scale2 * 0.5);
+    fMaskDistortion.m_MaskSample2 = SAMPLE(AlphaMasks_Mask2Map, uvMask2).r * GET_CONSTANT(Material, AlphaMasks_Mask2Intensity);
+    fMaskDistortion.m_MaskSample2 = mix(fMaskDistortion.m_MaskSample2, 1.f, 1 - GET_CONSTANT(Material, AlphaMasks_Mask2Weight)); // Do this on CPU
+}
+#   endif
+#endif
+
+#if defined(HAS_AlphaMasks) || defined(HAS_UVDistortions)
+void        ApplyFinalAlpha(IN(SFragmentInput)fInput, IN(SFragGeometry)fGeom, INOUT(SFragSurface) fSurf, IN(SMaskDistortion) fMaskDistortion FS_ARGS)
+#else
+void        ApplyFinalAlpha(IN(SFragmentInput)fInput, IN(SFragGeometry)fGeom, INOUT(SFragSurface) fSurf FS_ARGS)
+#endif
+{
+    float alphaProduct = 1;
+#   if defined(HAS_AlphaMasks)
+    alphaProduct *= fMaskDistortion.m_MaskSample1 * fMaskDistortion.m_MaskSample2;
+#   endif
+
+#   if defined(HAS_Emissive)
+    fSurf.m_Emissive *= clamp(alphaProduct, 0.f, 1.f);
+#   endif
+
+#   if defined(HAS_Diffuse)
+    fSurf.m_Diffuse.a *= alphaProduct;
+    fSurf.m_Diffuse.a = clamp(fSurf.m_Diffuse.a, 0.f, 1.f);
+#   endif
+
+}
+
+#if defined(HAS_Dissolve)
+void         ApplyDissolve(IN(float)dissolveCursor, IN(SFragGeometry)fGeom, INOUT(SFragSurface) fSurf FS_PARAMS)
+{
+    float dissolve = SAMPLE(Dissolve_DissolveMap, fGeom.m_RawUV0).r;
+    dissolve = smoothstep(dissolve, dissolve + GET_CONSTANT(Material, Dissolve_DissolveSoftness) + SMOOTHSTEP_EPSILON, dissolveCursor * (1 + SMOOTHSTEP_EPSILON));
+    fSurf.m_Emissive *= dissolve;
+    fSurf.m_Diffuse.a *= dissolve;
+}
+
+#   endif // #if defined(PK_FORWARD_COLOR_PASS) || defined(PK_DEFERRED_COLOR_PASS) || defined(PK_DEFERRED_DECAL_PASS)
+#endif // #   if defined(HAS_AlphaMasks) || defined(HAS_UVDistortions) 
+

+ 44 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Experimental/includes/FeatureAtlas.h → PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureAtlas.h

@@ -45,6 +45,28 @@ vec4	SampleTextureVec4(IN(SFragGeometry) fGeom, SAMPLER2D_DCL_ARG(toSample) FS_A
 	return color;
 }
 
+vec4	SampleDistortedTextureVec4(IN(SFragGeometry) fGeom, IN(vec2) distortionUVs, SAMPLER2D_DCL_ARG(toSample) FS_ARGS)
+{
+#if defined(HAS_TransformUVs)
+	vec4	color = SAMPLEGRAD(toSample, fGeom.m_UV0 + distortionUVs, fGeom.m_dUVdx, fGeom.m_dUVdy);
+#else
+	vec4	color = SAMPLE(toSample, fGeom.m_UV0 + distortionUVs);
+#endif
+#if defined(HAS_Atlas)
+	int		blendingType = GET_CONSTANT(Material, Atlas_Blending);
+	if (blendingType >= 1)
+	{
+#if defined(HAS_TransformUVs)
+		vec4	color1 =  SAMPLEGRAD(toSample, fGeom.m_UV1 + distortionUVs, fGeom.m_dUVdx, fGeom.m_dUVdy);
+#else
+		vec4	color1 =  SAMPLE(toSample, fGeom.m_UV1 + distortionUVs);
+#endif
+		color = mix(color, color1, fGeom.m_BlendMix);
+	}
+#endif
+	return color;
+}
+
 vec3	SampleTextureVec3(IN(SFragGeometry) fGeom, SAMPLER2D_DCL_ARG(toSample) FS_ARGS)
 {
 #if defined(HAS_TransformUVs)
@@ -67,6 +89,28 @@ vec3	SampleTextureVec3(IN(SFragGeometry) fGeom, SAMPLER2D_DCL_ARG(toSample) FS_A
 	return color;
 }
 
+vec3	SampleDistortedTextureVec3(IN(SFragGeometry) fGeom, IN(vec2) distortionUVs, SAMPLER2D_DCL_ARG(toSample) FS_ARGS)
+{
+#if defined(HAS_TransformUVs)
+	vec3	color = SAMPLEGRAD(toSample, fGeom.m_UV0 + distortionUVs, fGeom.m_dUVdx, fGeom.m_dUVdy).xyz;
+#else
+	vec3	color = SAMPLE(toSample, fGeom.m_UV0 + distortionUVs).xyz;
+#endif
+#if defined(HAS_Atlas)
+	int		blendingType = GET_CONSTANT(Material, Atlas_Blending);
+	if (blendingType >= 1)
+	{
+#if defined(HAS_TransformUVs)
+		vec3	color1 =  SAMPLEGRAD(toSample, fGeom.m_UV1 + distortionUVs, fGeom.m_dUVdx, fGeom.m_dUVdy).xyz;
+#else
+		vec3	color1 =  SAMPLE(toSample, fGeom.m_UV1 + distortionUVs).xyz;
+#endif
+		color = mix(color, color1, fGeom.m_BlendMix);
+	}
+#endif
+	return color;
+}
+
 vec2	SampleTextureVec2(IN(SFragGeometry) fGeom, SAMPLER2D_DCL_ARG(toSample) FS_ARGS)
 {
 #if defined(HAS_TransformUVs)

+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Experimental/includes/FeatureDecal.h → PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureDecal.h


+ 17 - 3
PopcornFX/Library/PopcornFXCore/Shaders/Experimental/includes/FeatureDiffuse.h → PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureDiffuse.h

@@ -16,11 +16,20 @@ void		ApplyAlphaRemap(INOUT(SFragSurface) fSurf, float cursor FS_ARGS)
 
 #		if	defined(HAS_AlphaRemap)
 void		ApplyDiffuse(INOUT(SFragSurface) fSurf, IN(SFragGeometry) fGeom, vec4 diffuseColor, float alphaRemapCursor FS_ARGS)
-#		else
+#		elif defined(HAS_UVDistortions)
+void		ApplyDiffuse(INOUT(SFragSurface) fSurf, IN(SFragGeometry) fGeom, IN(SMaskDistortion)fMaskDistortion, vec4 diffuseColor FS_ARGS)
+#		else 
 void		ApplyDiffuse(INOUT(SFragSurface) fSurf, IN(SFragGeometry) fGeom, vec4 diffuseColor FS_ARGS)
 #		endif // defined(HAS_AlphaRemap)
 {
+
+#	if defined(HAS_UVDistortions)
+	vec2 distortion = fMaskDistortion.m_UVDistortion1 * 0.1 + fMaskDistortion.m_UVDistortion2 * 0.01;
+	fSurf.m_Diffuse = SampleDistortedTextureVec4(fGeom, distortion, SAMPLER_ARG(Diffuse_DiffuseMap) FS_PARAMS);
+#else
 	fSurf.m_Diffuse = SampleTextureVec4(fGeom, SAMPLER_ARG(Diffuse_DiffuseMap) FS_PARAMS);
+#endif 
+
 #		if	defined(HAS_TransformUVs)
 	if (fGeom.m_UseAlphaUVs)
 		fSurf.m_Diffuse.a = SampleTextureAlpha(fGeom, SAMPLER_ARG(Diffuse_DiffuseMap) FS_PARAMS);
@@ -37,9 +46,14 @@ void		ApplyDiffuse(INOUT(SFragSurface) fSurf, IN(SFragGeometry) fGeom, vec4 diff
 #	endif // defined(HAS_Diffuse)
 
 #	if defined(HAS_DiffuseRamp)
-void		ApplyDiffuseRamp(INOUT(SFragSurface) fSurf FS_ARGS)
+void		ApplyDiffuseRamp(IN(float) v, INOUT(SFragSurface) fSurf FS_ARGS)
 {
-	fSurf.m_Diffuse.rgb = SAMPLE(DiffuseRamp_RampMap, vec2(fSurf.m_Diffuse.r, 0.0)).rgb;
+#		if defined(HAS_AlphaMasks)
+	vec2 uv = vec2(fSurf.m_Diffuse.a, v);
+#		else
+	vec2 uv = vec2(fSurf.m_Diffuse.r, v);
+#		endif
+	fSurf.m_Diffuse.rgb = SAMPLE(DiffuseRamp_RampMap, uv).rgb;
 }
 #	endif // defined(HAS_DiffuseRamp)
 

+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Experimental/includes/FeatureDistortion.h → PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureDistortion.h


+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Experimental/includes/FeatureDithering.h → PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureDithering.h


+ 37 - 0
PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureEmissive.h

@@ -0,0 +1,37 @@
+#pragma once
+
+#include "PKSurface.h"
+
+#if defined(PK_FORWARD_COLOR_PASS) || defined(PK_DEFERRED_COLOR_PASS) || defined(PK_DEFERRED_DECAL_PASS)
+
+#	if defined(HAS_Emissive)
+
+#		if defined(HAS_UVDistortions)
+void	ApplyEmissive(INOUT(SFragSurface) fSurf, IN(SFragGeometry) fGeom, IN(SMaskDistortion) fMaskDistortion, vec4 emissiveColor FS_ARGS)
+#		else
+void	ApplyEmissive(INOUT(SFragSurface) fSurf, IN(SFragGeometry) fGeom, vec4 emissiveColor FS_ARGS)
+#		endif
+{
+#		if defined(HAS_UVDistortions)
+	vec2 distortion = fMaskDistortion.m_UVDistortion1 * 0.1 + fMaskDistortion.m_UVDistortion2 * 0.01;
+	vec4	textureColor = SampleDistortedTextureVec4(fGeom, distortion, SAMPLER_ARG(Emissive_EmissiveMap) FS_PARAMS);
+		#else
+	vec4	textureColor = SampleTextureVec4(fGeom, SAMPLER_ARG(Emissive_EmissiveMap) FS_PARAMS);
+#		endif
+
+#		if	defined(HAS_TransformUVs)
+	if (fGeom.m_UseAlphaUVs)
+		textureColor.a = SampleTextureAlpha(fGeom, SAMPLER_ARG(Emissive_EmissiveMap) FS_PARAMS);
+#		endif
+	fSurf.m_Emissive = (emissiveColor.rgb * textureColor.rgb) * (emissiveColor.a * textureColor.a);
+}
+#	endif
+
+#	if defined(HAS_EmissiveRamp)
+void	ApplyEmissiveRamp(IN(float) v, INOUT(SFragSurface) fSurf FS_ARGS)
+{
+	vec2 uv = vec2(fSurf.m_Emissive.r, v);
+	fSurf.m_Emissive = SAMPLE(EmissiveRamp_RampMap, uv).rgb;
+}
+#	endif
+#endif

+ 165 - 0
PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureFastLit.h

@@ -0,0 +1,165 @@
+#pragma once
+
+#include "PKSurface.h"
+
+#if (defined(PK_FORWARD_COLOR_PASS) && defined(HAS_FastLit)) || defined(PK_LIGHTING_PASS)
+
+#	define PI						3.141592
+#	define METAL_FRESNEL_FACTOR		vec3(0.04, 0.04, 0.04) // F0
+#	define EPSILON					1e-5
+
+void	ApplyFastLightBRDF(INOUT(SFragSurface) fSurf, vec3 surfToLight, vec3 lightColor, vec3 surfaceDiffuseColor, float attenuation FS_ARGS)
+{
+	float   NoL = dot(surfToLight, fSurf.m_Normal);
+
+#if     defined(HAS_NormalWrap)
+	float   normalWrapFactor = GET_CONSTANT(Material, NormalWrap_WrapFactor) * 0.5f;
+	NoL = normalWrapFactor + (1.0f - normalWrapFactor) * NoL;
+#endif
+
+	NoL = max(0.0f, NoL) * attenuation;
+
+#	if defined(PK_LIGHTING_PASS)
+	fSurf.m_LightAccu += surfaceDiffuseColor * lightColor * NoL;
+#	else
+    fSurf.m_Diffuse.rgb += surfaceDiffuseColor * lightColor * NoL;
+#	endif
+}
+
+#   if defined(PK_FORWARD_COLOR_PASS)
+
+vec3	toCubemapSpace(vec3 value FS_ARGS)
+{
+	vec3	valueLHZ = mul(GET_CONSTANT(SceneInfo, UserToLHZ), vec4(value, 0.0f)).xyz;
+	vec3	valueRHY = vec3(valueLHZ.x, valueLHZ.z, valueLHZ.y);
+	valueRHY.xz = mul(GET_CONSTANT(EnvironmentMapInfo, Rotation), valueRHY.xz);
+	return valueRHY;
+}
+
+void	ApplyFastAmbientBRDF(INOUT(SFragSurface) fSurf, vec3 surfToView, vec3 ambientColor, vec3 surfaceDiffuseColor FS_ARGS)
+{
+	// Cubemaps are expected to be cosined filtered up to the 7th mipmap which should contain the fully diffuse 180 degrees cosine-filtered cubemap.
+	const float	kCubemapMipRange = 6;
+    fSurf.m_Roughness = 1.0f;
+
+	const vec3	surfaceMetalColor = METAL_FRESNEL_FACTOR; // mix(METAL_FRESNEL_FACTOR, surfaceDiffuseColor, fSurf.m_Metalness); // TODO
+	const vec3	kD = 1.0f;
+
+	// Ambient diffuse
+	vec3	diffuseBRDF = kD * SAMPLELOD_CUBE(EnvironmentMapSampler, toCubemapSpace(fSurf.m_Normal FS_PARAMS), kCubemapMipRange).rgb;
+	// Ambient specular
+	vec3	sampleDir = toCubemapSpace(reflect(-surfToView, fSurf.m_Normal) FS_PARAMS);
+	vec3	prefilteredColor = SAMPLELOD_CUBE(EnvironmentMapSampler, sampleDir, kCubemapMipRange).rgb;
+	vec2	envBRDF = SAMPLE(BRDFLUTSampler, vec2(max(dot(fSurf.m_Normal, surfToView), 0.0), 1.0f)).rg;
+	vec3	specularBRDF = prefilteredColor * envBRDF.y;
+
+#		if defined(HAS_Transparent)
+	vec3	litDiffuse = surfaceDiffuseColor * diffuseBRDF * ambientColor;
+	// Mix between the computed lit color and the original surface color
+	// Completly overrides the previous computed lit color:
+	fSurf.m_Diffuse.rgb = litDiffuse;
+	// We write the specular in the emissive output so that it doesn't get affected by the diffuse alpha:
+	fSurf.m_Emissive += specularBRDF * ambientColor;
+#		elif defined(HAS_Opaque)
+	fSurf.m_Diffuse.rgb += surfaceDiffuseColor * (diffuseBRDF + specularBRDF) * ambientColor;
+#		endif // defined(HAS_Transparent)
+}
+#   endif // defined(PK_FORWARD_COLOR_PASS)
+#endif // (defined(PK_FORWARD_COLOR_PASS) && defined(HAS_Lit)) || defined(PK_LIGHTING_PASS)
+
+#if defined(HAS_FastLit)
+float 		remapValue(float value, float oldMin, float oldMax, float newMin, float newMax)
+{
+	return newMin + (value - oldMin) * (newMax - newMin) / (oldMax - oldMin);
+}
+
+void ApplyFastLighting(INOUT(SFragSurface) fSurf, IN(SFragGeometry) fGeom, vec3 surfacePosition FS_ARGS)
+{
+#	if defined(PK_FORWARD_COLOR_PASS) || defined(PK_DEFERRED_COLOR_PASS)
+	fSurf.m_Roughness = 1.0f;
+	fSurf.m_Metalness = 0.0f;
+#	endif
+#	if defined(PK_FORWARD_COLOR_PASS)
+
+	vec3	viewPosition = GET_MATRIX_W_AXIS(GET_CONSTANT(SceneInfo, UnpackNormalView)).xyz;
+	vec3	surfToView = viewPosition - surfacePosition;
+	vec3	surfToViewDir = normalize(surfToView);
+	// Before lighting, we backup the surface diffuse color and reset the diffuse to 0 to accumulate the light influences:
+	vec3	surfaceDiffuseColor = fSurf.m_Diffuse.rgb;
+	fSurf.m_Diffuse.rgb = VEC3_ZERO;
+
+	vec3 	ambientColor = GET_CONSTANT(LightInfo, AmbientColor);
+
+	ApplyFastAmbientBRDF(fSurf, surfToViewDir, ambientColor, surfaceDiffuseColor FS_PARAMS); //
+
+	int	lightsDirectional = GET_CONSTANT(LightInfo, DirectionalLightsCount);
+	int	lightsSpot = GET_CONSTANT(LightInfo, SpotLightsCount);
+	int	lightsPoint = GET_CONSTANT(LightInfo, PointLightsCount);
+
+	// 3 x float4 per light:
+	const int 	lightStride = 3 * 4;
+
+	for (int dirIdx = 0; dirIdx < lightsDirectional; ++dirIdx)
+	{
+		// Directional layout is:
+		// float3 direction
+		// float padding
+		// float4 padding
+		// float3 color
+		// float padding
+		vec3	direction = LOADF3(GET_RAW_BUFFER(DirectionalLightsInfo), RAW_BUFFER_INDEX(dirIdx * lightStride));
+		vec3	color = LOADF3(GET_RAW_BUFFER(DirectionalLightsInfo), RAW_BUFFER_INDEX(dirIdx * lightStride + 8));
+
+		// Compute lighting:
+		vec3	surfToLightDir = normalize(-direction);
+		ApplyFastLightBRDF(fSurf, surfToLightDir, color, surfaceDiffuseColor, 1.0f FS_ARGS);
+	}
+	for (int spotIdx = 0; spotIdx < lightsSpot; ++spotIdx)
+	{
+		// Spot layout is:
+		// float3 position
+		// float angle
+		// float3 direction
+		// float cone falloff
+		// float3 color
+		// float padding
+		vec4	positionAngle = LOADF4(GET_RAW_BUFFER(SpotLightsInfo), RAW_BUFFER_INDEX(spotIdx * lightStride));
+		vec4	directionFalloff = LOADF4(GET_RAW_BUFFER(SpotLightsInfo), RAW_BUFFER_INDEX(spotIdx * lightStride + 4));
+		vec3	color = LOADF3(GET_RAW_BUFFER(SpotLightsInfo), RAW_BUFFER_INDEX(spotIdx * lightStride + 8));
+
+		vec3	surfToLight = positionAngle.xyz - surfacePosition;
+		vec3	surfToLightDir = normalize(surfToLight);
+		float	sqDistanceToLight = dot(surfToLight, surfToLight);
+	
+		// Compute the light attenuation
+		// Start by fading depending on the cone angle:
+		float   coneAttenuation = dot(-surfToLightDir, directionFalloff.xyz);
+		coneAttenuation = coneAttenuation < positionAngle.w ? 0.0f : remapValue(coneAttenuation, positionAngle.w, 1.0f, 0.0f, 1.0f);
+		coneAttenuation = min(coneAttenuation / max(directionFalloff.w, EPSILON), 1.0f);
+		float   lightAttenuation = coneAttenuation / sqDistanceToLight;
+
+		ApplyFastLightBRDF(fSurf, surfToLightDir, color, surfaceDiffuseColor, lightAttenuation FS_ARGS);
+	}
+	for (int pointIdx = 0; pointIdx < lightsPoint; ++pointIdx)
+	{
+		// Point layout is:
+		// float3 position
+		// float padding
+		// float4 padding
+		// float3 color
+		// float padding
+		vec3	position = LOADF3(GET_RAW_BUFFER(PointLightsInfo), RAW_BUFFER_INDEX(pointIdx * lightStride));
+		vec3	color = LOADF3(GET_RAW_BUFFER(PointLightsInfo), RAW_BUFFER_INDEX(pointIdx * lightStride + 8));
+
+		// Compute lighting:
+		vec3	surfToLight = position - surfacePosition;
+		float	sqDistanceToLight = dot(surfToLight, surfToLight);
+		vec3	surfToLightDir = normalize(surfToLight);
+		// (here we can use the square distance falloff as this is rendered as a full screen quad and there is no culling):
+		float   lightAttenuation = 1.0f / sqDistanceToLight;
+
+		ApplyFastLightBRDF(fSurf, surfToLightDir, color, surfaceDiffuseColor, lightAttenuation FS_ARGS);
+	}
+#	endif // defined(PK_FORWARD_COLOR_PASS)
+}
+#endif // defined(HAS_Lit)

+ 1 - 3
PopcornFX/Library/PopcornFXCore/Shaders/Experimental/includes/FeatureRibbonCorrectDeformation.h → PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureRibbonCorrectDeformation.h

@@ -22,9 +22,7 @@ void	ApplyRibbonCorrectDeformation(INOUT(SFragGeometry) fGeom, vec4 fragUVFactor
 	fGeom.m_UV0 = fragUVout * fragUVScaleAndOffset.xy + fragUVScaleAndOffset.zw;
 
 #	endif
-#	if defined(FINPUT_fragUV1)
-#		error "Ribbon correct deformation is not compatible with atlas"
-#	endif
+
 }
 
 #endif

+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Experimental/includes/FeatureSoftParticles.h → PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureSoftParticles.h


+ 0 - 0
PopcornFX/Library/PopcornFXCore/Shaders/Experimental/includes/FeatureTint.h → PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureTint.h


+ 26 - 4
PopcornFX/Library/PopcornFXCore/Shaders/Experimental/includes/FeatureTransformUVs.h → PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureTransformUVs.h

@@ -2,13 +2,13 @@
 
 #include "PKSurface.h"
 
-#if	defined(HAS_TransformUVs)
-
 vec2	TransformUV(vec2 UV, vec2 scale, mat2 rotation, vec2 offset)
 {
 	return mul(rotation, UV * scale) + offset;
 }
 
+#if	defined(HAS_TransformUVs)
+
 #	if defined(HAS_Atlas)
 void	ApplyTransformUVs(INOUT(SFragGeometry) fGeom, vec4 rect0, vec4 rect1, float angle, vec2 scale, vec2 offset FS_ARGS)
 #else
@@ -18,11 +18,12 @@ void	ApplyTransformUVs(INOUT(SFragGeometry) fGeom, float angle, vec2 scale, vec2
 	float	sinR = sin(angle);
 	float	cosR = cos(angle);
 	mat2	UVRotation = mat2(cosR, sinR, -sinR, cosR);
+	vec2	rotationCenter = GET_CONSTANT(Material, TransformUVs_RotationCenter);
 
 #	if defined(HAS_Atlas)
 	fGeom.m_AlphaUV1 = fGeom.m_UV1;
 	fGeom.m_UV1 = ((fGeom.m_UV1 - rect1.zw) / rect1.xy); // normalize (if atlas)
-	fGeom.m_UV1 = TransformUV(fGeom.m_UV1, scale, UVRotation, offset); // scale then rotate then translate UV
+	fGeom.m_UV1 = TransformUV(fGeom.m_UV1 - rotationCenter, scale, UVRotation, offset + scale*rotationCenter); // scale then rotate then translate UV
 	fGeom.m_UV1 = fract(fGeom.m_UV1) * rect1.xy + rect1.zw; // undo normalize
 #	else
 	vec4	rect0 = vec4(1.0f, 1.0f, 0.0f, 0.0f);
@@ -30,7 +31,7 @@ void	ApplyTransformUVs(INOUT(SFragGeometry) fGeom, float angle, vec2 scale, vec2
 
 	fGeom.m_AlphaUV0 = fGeom.m_UV0;
 	fGeom.m_UV0 = ((fGeom.m_UV0 - rect0.zw) / rect0.xy); // normalize (if atlas)
-	fGeom.m_UV0 = TransformUV(fGeom.m_UV0, scale, UVRotation, offset); // scale then rotate then translate UV
+	fGeom.m_UV0 = TransformUV(fGeom.m_UV0 - rotationCenter, scale, UVRotation, offset + scale*rotationCenter); // scale then rotate then translate UV
 	// Compute clean derivatives
 	vec2	_uv = fGeom.m_UV0 * rect0.xy + rect0.zw;
 	fGeom.m_dUVdx = dFdx(_uv);
@@ -51,6 +52,27 @@ void	ApplyTransformUVs(INOUT(SFragGeometry) fGeom, float angle, vec2 scale, vec2
 void	ApplyBasicTransformUVs(INOUT(SFragGeometry) fGeom FS_ARGS)
 {
 #	if !defined(HAS_GeometryRibbon)
+#		if defined(HAS_GeometryDecal)
+		bool flipU = bool(GET_CONSTANT(Material, BasicTransformUVs_FlipU));
+		bool flipV = bool(GET_CONSTANT(Material, BasicTransformUVs_FlipV));
+		
+		if (flipU)
+		{
+			fGeom.m_UV0.x = 1.0f - fGeom.m_UV0.x;
+#			if defined(HAS_Atlas)
+			fGeom.m_UV1.x = 1.0f - fGeom.m_UV1.x;
+#			endif
+		}
+
+		if (flipV)
+		{
+			fGeom.m_UV0.y = 1.0f - fGeom.m_UV0.y;
+#			if defined(HAS_Atlas)
+			fGeom.m_UV1.y = 1.0f - fGeom.m_UV1.y;
+#			endif
+		}
+#		endif
+
 	if (GET_CONSTANT(Material, BasicTransformUVs_RotateUV) != 0)
 	{
 		fGeom.m_UV0 = fGeom.m_UV0.yx;

+ 80 - 0
PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureTransformedNoises.h

@@ -0,0 +1,80 @@
+#pragma once
+
+#include "PKSurface.h"
+#include "FeatureTransformUVs.h"
+
+#if defined(HAS_TransformedNoises) || defined(HAS_UVDistortions) 
+
+void        InitializeNoiseDist(INOUT(SNoiseDistortion) fNoiseDistortion FS_ARGS)
+{
+#   if defined(HAS_UVDistortions)
+    fNoiseDistortion.m_UVDistortion1 = vec2(0.f, 0.f);
+    fNoiseDistortion.m_UVDistortion2 = vec2(0.f, 0.f);
+#   endif
+
+#   if defined(HAS_TransformedNoises)
+    fNoiseDistortion.m_NoiseSample1 = 0.f;
+    fNoiseDistortion.m_NoiseSample2 = 0.f;
+#   endif
+}
+
+#   if defined(HAS_TransformedNoises)
+void        ApplyTransformedNoises(IN(SFragGeometry) fGeom, IN(float) animationCursor1, IN(float) animationCursor2,  INOUT(SNoiseDistortion) fNoiseDistortion FS_ARGS)
+{
+#   if defined(HAS_UVDistortions)
+    vec2 uvNoise1 = fNoiseDistortion.m_UVDistortion1 * 0.1f + fNoiseDistortion.m_UVDistortion2 * 0.01f + fGeom.m_RawUV0;
+    vec2 uvNoise2 = fNoiseDistortion.m_UVDistortion1 * 0.01f + fNoiseDistortion.m_UVDistortion2 * 0.1f + fGeom.m_RawUV0;
+#   else
+    vec2 uvNoise1 = fGeom.m_RawUV0;
+    vec2 uvNoise2 = fGeom.m_RawUV0;
+#   endif
+
+    float   angle1 = GET_CONSTANT(Material, TransformedNoises_Noise1RotationSpeed) * animationCursor1;
+    float	sinR1 = sin(angle1);
+	float	cosR1 = cos(angle1);
+	mat2	UVRotation1 = mat2(cosR1, sinR1, -sinR1, cosR1);
+
+    vec2 translation1 = GET_CONSTANT(Material, TransformedNoises_Noise1TranslationSpeed) * animationCursor1;
+    vec2 scale1 = GET_CONSTANT(Material, TransformedNoises_Noise1Scale);
+    uvNoise1 = TransformUV(uvNoise1 - 0.5, scale1, UVRotation1, translation1 + scale1 * 0.5);
+    fNoiseDistortion.m_NoiseSample1 = SAMPLE(TransformedNoises_Noise1Map, uvNoise1).r * GET_CONSTANT(Material, TransformedNoises_Noise1Intensity);
+    fNoiseDistortion.m_NoiseSample1 = mix(fNoiseDistortion.m_NoiseSample1, 1.f, 1 - GET_CONSTANT(Material, TransformedNoises_Noise1Weight)); // Do this on CPU
+
+    float   angle2 = GET_CONSTANT(Material, TransformedNoises_Noise2RotationSpeed) * animationCursor2;
+    float	sinR2 = sin(angle2);
+	float	cosR2 = cos(angle2);
+	mat2	UVRotation2 = mat2(cosR2, sinR2, -sinR2, cosR2);
+
+    vec2 translation2 = GET_CONSTANT(Material, TransformedNoises_Noise2TranslationSpeed) * animationCursor2;
+    vec2 scale2 = GET_CONSTANT(Material, TransformedNoises_Noise2Scale);
+    uvNoise2 = TransformUV(uvNoise2 - 0.5, scale2, UVRotation2, translation2 + scale2 * 0.5);
+    fNoiseDistortion.m_NoiseSample2 = SAMPLE(TransformedNoises_Noise2Map, uvNoise2).r * GET_CONSTANT(Material, TransformedNoises_Noise2Intensity);
+    fNoiseDistortion.m_NoiseSample2 = mix(fNoiseDistortion.m_NoiseSample2, 1.f, 1 - GET_CONSTANT(Material, TransformedNoises_Noise2Weight)); // Do this on CPU
+}
+#   endif
+#endif
+
+#if defined(HAS_TransformedNoises) || defined(HAS_UVDistortions)
+void        ApplyFinalAlpha(IN(SFragmentInput)fInput, IN(SFragGeometry)fGeom, INOUT(SFragSurface) fSurf, IN(SNoiseDistortion) fNoiseDistortion FS_ARGS)
+#else
+void        ApplyFinalAlpha(IN(SFragmentInput)fInput, IN(SFragGeometry)fGeom, INOUT(SFragSurface) fSurf FS_ARGS)
+#endif
+{
+    float alphaProduct = 1;
+#   if defined(HAS_Dissolve)
+    alphaProduct *= SAMPLE(Dissolve_DissolveMap, fGeom.m_RawUV0).r * fInput.fragDissolve_DissolveAnimationCursor;
+#   endif
+
+#   if defined(HAS_TransformedNoises)
+    alphaProduct *= fNoiseDistortion.m_NoiseSample1 * fNoiseDistortion.m_NoiseSample2;
+#   endif
+
+#   if defined(HAS_Emissive)
+    fSurf.m_Emissive *= clamp(alphaProduct, 0.f, 1.f);
+#   endif
+
+#   if defined(HAS_Diffuse)
+    fSurf.m_Diffuse.a *= alphaProduct;
+    fSurf.m_Diffuse.a = clamp(fSurf.m_Diffuse.a, 0.f, 1.f);
+#   endif
+}

+ 32 - 0
PopcornFX/Library/PopcornFXCore/Shaders/includes/FeatureUVDistortions.h

@@ -0,0 +1,32 @@
+#pragma once
+
+#include "PKSurface.h"
+#include "FeatureAlphaMasks.h"
+#include "FeatureTransformUVs.h"
+
+#if defined(HAS_UVDistortions)
+void		ApplyUVDistortion( INOUT(SFragGeometry)fGeom, IN(float)animationCursor1, IN(float)animationCursor2, INOUT(SMaskDistortion) fMaskDist FS_ARGS)
+{
+    // move to InitializeMaskDistortion
+    float   angle1 = GET_CONSTANT(Material, UVDistortions_Distortion1RotationSpeed) * animationCursor1;
+    float	sinR1 = sin(angle1);
+	float	cosR1 = cos(angle1);
+	mat2	UVRotation1 = mat2(cosR1, sinR1, -sinR1, cosR1);
+    vec2    translation1 = GET_CONSTANT(Material, UVDistortions_Distortion1TranslationSpeed) * animationCursor1;
+    vec2    scale1 = GET_CONSTANT(Material, UVDistortions_Distortion1Scale);
+
+    vec2 uv1 = TransformUV(fGeom.m_RawUV0 - 0.5, scale1, UVRotation1, translation1 + scale1 * 0.5);
+    fMaskDist.m_UVDistortion1 = SAMPLE(UVDistortions_Distortion1Map, uv1).rg * GET_CONSTANT(Material, UVDistortions_Distortion1Intensity) - 0.5f;
+
+    float   angle2 = GET_CONSTANT(Material, UVDistortions_Distortion2RotationSpeed) * animationCursor2;
+    float	sinR2 = sin(angle2);
+	float	cosR2 = cos(angle2);
+	mat2	UVRotation2 = mat2(cosR2, sinR2, -sinR2, cosR2);
+    vec2    translation2 = GET_CONSTANT(Material, UVDistortions_Distortion2TranslationSpeed) * animationCursor2;
+    vec2    scale2 = GET_CONSTANT(Material, UVDistortions_Distortion2Scale);
+
+    vec2 uv2 = TransformUV(fGeom.m_RawUV0 - 0.5, scale2, UVRotation2, translation2 + scale2 * 0.5);
+	fMaskDist.m_UVDistortion2 = SAMPLE(UVDistortions_Distortion2Map, uv2).rg * GET_CONSTANT(Material, UVDistortions_Distortion2Intensity) - 0.5f;
+	
+}
+#endif

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff