Clustered Forward Shading Path

UE4 currently has two shading paths:
Deferred Shading Path - For Desktop Use
“Pared Down” Forward Shading Path - For Mobile Use

Our projects requires the use of MSAA and we would like to have good transparency support. The Deferred Shading Path does not meet our requirements so we are currently looking in to how much effort it would take to use the existing “Pared Down” Forward Shading Path on the desktop and use it with MSAA.

In an ideal world, we would love to see UE4 have it’s own Clustered Forward Shading Path.

http://www.cse.chalmers.se/~olaolss/main_frame.php?contents=publication&id=practical_clustered_2013

In the UE4 Rendering Update, Nick Penwarden actually mentioned you guys are looking at Cluster Forward:

I was curious if you could elaborate on this a bit more. Are you actually looking to implement a completely separate Cluster Forward shading path? Or is the aim more to use Cluster Forward along with the existing Deferred path to help out in areas where the existing path is deficient?

Is it even feasible to have a Clustered Forward path along side the existing Deferred and Pared Down Forward paths? If you had to guess, would it be man-months or man-years work?

Perhaps some sort of collaboration could work if this is not a priority for Epic. Is anyone else out there interested in actually implementing a Clustered Forward Shading Path in UE4?

First up, I’d highly suggest evaluating UE4’s temporal AA for your game. If AA quality is the concern UE4 temporal AA is basically best of breed right now.

Forward shading is something we intend to work on in the next 6 months or so. The primary purpose is for lit translucency. The second being support for varied shading models where our Gbuffer restricts us. Exactly where we arrive is TBD depending heavily on the difficulty of supporting various features together with forward and the performance of it. It certainly won’t be the plan to have two side by side options, deferred and forward. The support costs would be too high.

If forward is a good option we will switch to it completely. If there are performance issues with fully forward we may go with a hybrid, deferred for the common case and forward for other shading models and translucency. If supporting all the rendering features turns out to be a big problem we may figure out a way to support more shading models with deferred and support a limited set of features for translucent lighting.

As for how much work? A TON! We expect that it will take us many man months for our UE4 rendering experts here. It is also hugely invasive touching more than half the rendering code which would make it difficult to integrate changes from us in the future. I’d advise against it for anyone who doesn’t have a ton of experience doing this kind of thing if completing it is super important. As a learning exercise, it would be awesome.

As for using the forward shading path on desktop, totally! You can run with -featureleveles2 on desktop right now. That is a far simpler renderer to modify as well if its feature set serves your purpose.

If there are needs you have for anti-aliasing or translucency that UE4 doesn’t fulfill we’d love to hear them, especially since we will be doing work in those areas very soon.

I’ve been thinking about that, and complex lights and etc. aren’t supported well by forward shading. You could, instead of doing all that, keep deferred and go for a K buffer of some sort, but with some things I’ve been thinking about (but will no doubt get around to… after a while. Ugh).

Stippled deferred is an interesting idea: http://www.gamedev.net/topic/647731-stippled-deferred-translucency/

In fact it’s a fascinating idea, and for keeping things parallel you’d actually re-arrange your buffers into uniform material properties for shading (restoring positions after) to keep from multipassing stuff. But you’d only get 4 layers of transparency, and at a low resolution. I was tinkering with the idea of generating a separate set of thin g-buffers dedicated too transparency, and going with a k-buffer (if needed) for that. It wouldn’t have full material properties. You could probably cull it down to 6 channels of render targets for actual material definitions. Compact YCoCg for color, X and Y for normals and reconstruct Z. The other two channels could be a material ID buffer and alpha. After that you’d still need your other information… but I digress. (mesh specific for emissive? I guess maybe there’s a case for transparencies with emissive and non emissive in the same texture… sigh).

It’d still be relatively cheap to then use these for extra translucency, 1 stippled buffer of this could get you (another?) 4 layers, a 2xMSAA K-Buffer target could get you 8. Since it would be dedicated to transparency to begin with the lowered resolution from using stippling wouldn’t be too much of a problem. Nor would the reduced color or normals. Not that deferred should be terribly memory intensive for the high end nowadays. Sucker Punch managed a ridiculous amount of render targets with Second Son, and a reduced g-buffer layout like UE4’s could, in my mind at least, spare some targets for transparency.

It’s not a solution for mobile or low end though. So I’m not sure if it’s right for UE4 and targeting all those things. I’m just not sure when I’ll have to chance to investigate it more (I’m putting off stuff just by typing this out!) But I thought I should type it out somewhere. Still, give the stippled deferred a look. Maybe no need to do something tough like hybrid stuff if it can be made to work just by itself, and support the extra transparency only target for the high end? It’s certainly true most mobile stuff could stand to lose some resolution these days *cough.

As for multiple lighting models. Well… ok, but there’s some stuff do for that.

Listening too your youtube QA thing, glad to hear you’ve taken up Bioshock Infinite/Destiny’s volume deferred stuff for translucency. I suppose you could just use stippled, sort your primitives, and then make sure the high priority stippled stuff is used for the more important samples (close to the camera, whatever). Also I’ve realized the background layer, opaque and always important, could be a mipmapped version of all 4 initially rendered pixels, free… kinda superampling yay! Other people use a similar system but only limit it to two layers, but a half res upscaled result with other translucency using volume stuff might look “good enough”.

Perhaps the best thing to do would be to do two layers at most (foreground complex layer, like first layer of glass) and background. Then stipple in a vertical pattern,
B/F/B/F
B/F/B/F

when combined with flipping the background/foreground colums each frame you could then use Guerilla’s predictive reprojection to fill in the missing gaps for both layer EG http://www.killzone.com/en_GB/blog/news/2014-03-06_regarding-killzone-shadow-fall-and-1080p.html and http://www.ign.com/boards/threads/killzone-shadow-falls-multiplayer-runs-at-960-x-1080-temporally-reprojected-to-1080p.453819097/

Or some such thing, either way you’d get a nice deferred pass for 1 layer of transparency and background without spending much appreciable more cycles, bandwidth, or even ram, which wouldn’t be much help for purely deferred particles, but it’s something. Or if you don’t care about transparency that much go:

B/F1/B/F1
B/F2/B/F2
B/F1/B/F1

Etc. 2 layers of transparency with a high quality opaque layer. Beyond that just fake everything else. A single ARGB 8bit render target could store particles/further layers using color and alpha only, stipple for 4 layers total from a full sized render target. Accumulate close particles ala: http://www2.imm.dtu.dk/visiondag/VD06/graphical/smoke.pdf to take care of large smoke plumes/other cases of dense particles.

With all this you could get visibly good results, stay deferred and relatively clean, include screenspace reflections, probably cheap glossy stuff too, what besides water and glass is transparent and would really benefit from SSR? Along with all the other benefits of deferred, including speed and SSAO (weight the SSAO based on alpha? but a material lookup would suuuuck.) Bleh, just more thoughts.

Either way I’m sure you guys will figure it out. Oh by the way tiled light lists are good for more than just light culling. You can also use the same tiles to determine the lighting models applicable to each tile. Say you’ve got oren-nyar diffuse, but its only useable on rocks. Any tiles then with oren-nyar diffuse would then run full oren-nyar, while any without could default to lambertian. This saves time while allowing multiple lighting models, as you’d maintain parallelism through your tiles. Though worst case can of course still, well be worst case.

As for Hybrid, there’s already clustered systems with explicit paths for both forward and deferred running concurrently, EG: http://www.humus.name/Articles/PracticalClusteredShading.pdf

Because I’m super annoying (admittedly)

A great presentation on fitting a multi material/translucency/particle deferred renderer into realtime and even into a single pass of the Xbox One’s ESRAM.

Yea, I unfortunately had to give up on Unreal Engine because of the translucency support. Which is a huge shame because the engine looks absolutely fantastic.

Would love to see better support. I’ll be very pleased if it comes in the next 6 months or so.

So now after many months, what are epics plans for Forward(+) rendering? Any news or is it fully discarded?

If you want lit translucency for like an ocean, I was able to get the same Phong specular shading model from UDK in the shader for the ocean, with a basic light vector blueprint/material parameter collection trick. If I ever need a specular highlight for a translucent object, I can just drop the material function in any material I want, plug in the light vector, and add the result to the opacity and emissive, and now I have a specular highlight wherever I need to. Seeing the old Phong model again actually made me very happy, because it is very fast (7 instructions), and looks absolutely perfect for water!

But you can use whatever specular model makes you happy: Blinn, Cook-Toor, or even GGX. The only problem with this method is it doesn’t have access to the shadow environment, or any sort of GI whatsoever. You can set a color, and across the whole ocean it will light up in glorious specular highlights… even in areas that should be shadowed. But if you’re not worried about that, seriously, it’s easy to set up, 7 instructions, and you can have an awesome specular highlight!

df7f5f490c3031572eacd8e9695cd0374c495a00.jpeg

For anyone who wants the material function to put Phong specular lighting on your translucent objects, here it is. Just copy and paste into a material function:


Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1723"
   Begin Object Class=EdGraphPin Name="EdGraphPin_93895"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93894"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93893"
   End Object
   Begin Object Class=MaterialExpressionDotProduct Name="MaterialExpressionDotProduct_32"
   End Object
   Begin Object Name="EdGraphPin_93895"
      PinName="Output"
      PinFriendlyName=" "
      Direction=EGPD_Output
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1724.EdGraphPin_93896'
   End Object
   Begin Object Name="EdGraphPin_93894"
      PinName="B"
      PinType=(PinCategory="required")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1739.EdGraphPin_93937'
   End Object
   Begin Object Name="EdGraphPin_93893"
      PinName="A"
      PinType=(PinCategory="required")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1738.EdGraphPin_93935'
   End Object
   Begin Object Name="MaterialExpressionDotProduct_32"
      A=(Expression=MaterialExpressionFunctionInput'MaterialGraphNode_1738.MaterialExpressionFunctionInput_85')
      B=(Expression=MaterialExpressionFunctionInput'MaterialGraphNode_1739.MaterialExpressionFunctionInput_86')
      MaterialExpressionEditorX=-1248
      MaterialExpressionEditorY=176
      MaterialExpressionGuid=7103F71742DB6D376DFFCF8D400BEB5E
      Material=Material'/Engine/Transient.Material_41'
   End Object
   MaterialExpression=MaterialExpressionDotProduct'MaterialExpressionDotProduct_32'
   Pins(0)=EdGraphPin'EdGraphPin_93893'
   Pins(1)=EdGraphPin'EdGraphPin_93894'
   Pins(2)=EdGraphPin'EdGraphPin_93895'
   NodePosX=-1248
   NodePosY=176
   NodeGuid=C8D030A34C938B302A75C3BD042FE0D4
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1724"
   Begin Object Class=EdGraphPin Name="EdGraphPin_93899"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93898"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93897"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93896"
   End Object
   Begin Object Class=MaterialExpressionClamp Name="MaterialExpressionClamp_30"
   End Object
   Begin Object Name="EdGraphPin_93899"
      PinName="Output"
      PinFriendlyName=" "
      Direction=EGPD_Output
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1734.EdGraphPin_93925'
   End Object
   Begin Object Name="EdGraphPin_93898"
      PinName="Max"
      PinType=(PinCategory="optional")
   End Object
   Begin Object Name="EdGraphPin_93897"
      PinName="Min"
      PinType=(PinCategory="optional")
   End Object
   Begin Object Name="EdGraphPin_93896"
      PinName="Input"
      PinFriendlyName=" "
      PinType=(PinCategory="required")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1723.EdGraphPin_93895'
   End Object
   Begin Object Name="MaterialExpressionClamp_30"
      Input=(Expression=MaterialExpressionDotProduct'MaterialGraphNode_1723.MaterialExpressionDotProduct_32')
      MaterialExpressionEditorX=-992
      MaterialExpressionEditorY=176
      MaterialExpressionGuid=A0449EE04C228DCFBF989BB64BEE6FEF
      Material=Material'/Engine/Transient.Material_41'
   End Object
   MaterialExpression=MaterialExpressionClamp'MaterialExpressionClamp_30'
   Pins(0)=EdGraphPin'EdGraphPin_93896'
   Pins(1)=EdGraphPin'EdGraphPin_93897'
   Pins(2)=EdGraphPin'EdGraphPin_93898'
   Pins(3)=EdGraphPin'EdGraphPin_93899'
   NodePosX=-992
   NodePosY=176
   NodeGuid=2A9283194B0D5972D3A05A95F39D2C8A
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1725"
   Begin Object Class=EdGraphPin Name="EdGraphPin_93902"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93901"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93900"
   End Object
   Begin Object Class=MaterialExpressionDotProduct Name="MaterialExpressionDotProduct_33"
   End Object
   Begin Object Name="EdGraphPin_93902"
      PinName="Output"
      PinFriendlyName=" "
      Direction=EGPD_Output
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1727.EdGraphPin_93905'
   End Object
   Begin Object Name="EdGraphPin_93901"
      PinName="B"
      PinType=(PinCategory="required")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1726.EdGraphPin_93904'
   End Object
   Begin Object Name="EdGraphPin_93900"
      PinName="A"
      PinType=(PinCategory="required")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1738.EdGraphPin_93935'
   End Object
   Begin Object Name="MaterialExpressionDotProduct_33"
      A=(Expression=MaterialExpressionFunctionInput'MaterialGraphNode_1738.MaterialExpressionFunctionInput_85')
      B=(Expression=MaterialExpressionReflectionVectorWS'MaterialGraphNode_1726.MaterialExpressionReflectionVectorWS_9')
      MaterialExpressionEditorX=-1248
      MaterialExpressionEditorY=320
      MaterialExpressionGuid=7103F71742DB6D376DFFCF8D400BEB5E
      Material=Material'/Engine/Transient.Material_41'
   End Object
   MaterialExpression=MaterialExpressionDotProduct'MaterialExpressionDotProduct_33'
   Pins(0)=EdGraphPin'EdGraphPin_93900'
   Pins(1)=EdGraphPin'EdGraphPin_93901'
   Pins(2)=EdGraphPin'EdGraphPin_93902'
   NodePosX=-1248
   NodePosY=320
   NodeGuid=25EE2E8E43479165C5E82A89A02C12E4
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1726"
   Begin Object Class=EdGraphPin Name="EdGraphPin_93904"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93903"
   End Object
   Begin Object Class=MaterialExpressionReflectionVectorWS Name="MaterialExpressionReflectionVectorWS_9"
   End Object
   Begin Object Name="EdGraphPin_93904"
      PinName="Output"
      PinFriendlyName=" "
      Direction=EGPD_Output
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1725.EdGraphPin_93901'
   End Object
   Begin Object Name="EdGraphPin_93903"
      PinName="CustomWorldNormal"
      PinType=(PinCategory="optional")
   End Object
   Begin Object Name="MaterialExpressionReflectionVectorWS_9"
      MaterialExpressionEditorX=-1584
      MaterialExpressionEditorY=512
      MaterialExpressionGuid=E302FD9E4F8AD3D5DB97F2B0202A77B1
      Material=Material'/Engine/Transient.Material_41'
   End Object
   MaterialExpression=MaterialExpressionReflectionVectorWS'MaterialExpressionReflectionVectorWS_9'
   Pins(0)=EdGraphPin'EdGraphPin_93903'
   Pins(1)=EdGraphPin'EdGraphPin_93904'
   NodePosX=-1584
   NodePosY=512
   NodeGuid=D5F18EED434F086943E6389BA9352BDB
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1727"
   Begin Object Class=EdGraphPin Name="EdGraphPin_93908"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93907"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93906"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93905"
   End Object
   Begin Object Class=MaterialExpressionClamp Name="MaterialExpressionClamp_31"
   End Object
   Begin Object Name="EdGraphPin_93908"
      PinName="Output"
      PinFriendlyName=" "
      Direction=EGPD_Output
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1728.EdGraphPin_93909'
   End Object
   Begin Object Name="EdGraphPin_93907"
      PinName="Max"
      PinType=(PinCategory="optional")
   End Object
   Begin Object Name="EdGraphPin_93906"
      PinName="Min"
      PinType=(PinCategory="optional")
   End Object
   Begin Object Name="EdGraphPin_93905"
      PinName="Input"
      PinFriendlyName=" "
      PinType=(PinCategory="required")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1725.EdGraphPin_93902'
   End Object
   Begin Object Name="MaterialExpressionClamp_31"
      Input=(Expression=MaterialExpressionDotProduct'MaterialGraphNode_1725.MaterialExpressionDotProduct_33')
      MaterialExpressionEditorX=-1136
      MaterialExpressionEditorY=320
      MaterialExpressionGuid=64D32E80405F0B657F97DDA655BECCDB
      Material=Material'/Engine/Transient.Material_41'
   End Object
   MaterialExpression=MaterialExpressionClamp'MaterialExpressionClamp_31'
   Pins(0)=EdGraphPin'EdGraphPin_93905'
   Pins(1)=EdGraphPin'EdGraphPin_93906'
   Pins(2)=EdGraphPin'EdGraphPin_93907'
   Pins(3)=EdGraphPin'EdGraphPin_93908'
   NodePosX=-1136
   NodePosY=320
   NodeGuid=4080E9DD45A2B0BD30AD89979CA9F994
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1728"
   Begin Object Class=EdGraphPin Name="EdGraphPin_93911"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93910"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93909"
   End Object
   Begin Object Class=MaterialExpressionPower Name="MaterialExpressionPower_9"
   End Object
   Begin Object Name="EdGraphPin_93911"
      PinName="Output"
      PinFriendlyName=" "
      Direction=EGPD_Output
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1730.EdGraphPin_93914'
   End Object
   Begin Object Name="EdGraphPin_93910"
      PinName="Exp"
      PinType=(PinCategory="optional")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1729.EdGraphPin_93913'
   End Object
   Begin Object Name="EdGraphPin_93909"
      PinName="Base"
      PinType=(PinCategory="required")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1727.EdGraphPin_93908'
   End Object
   Begin Object Name="MaterialExpressionPower_9"
      Base=(Expression=MaterialExpressionClamp'MaterialGraphNode_1727.MaterialExpressionClamp_31')
      Exponent=(Expression=MaterialExpressionFunctionInput'MaterialGraphNode_1729.MaterialExpressionFunctionInput_81')
      MaterialExpressionEditorX=-880
      MaterialExpressionEditorY=320
      MaterialExpressionGuid=479D252F4E0573FF19E8298C42979D7F
      Material=Material'/Engine/Transient.Material_41'
   End Object
   MaterialExpression=MaterialExpressionPower'MaterialExpressionPower_9'
   Pins(0)=EdGraphPin'EdGraphPin_93909'
   Pins(1)=EdGraphPin'EdGraphPin_93910'
   Pins(2)=EdGraphPin'EdGraphPin_93911'
   NodePosX=-880
   NodePosY=320
   NodeGuid=90BA26F2472C1D79191DA98BDC0F5445
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1729"
   Begin Object Class=EdGraphPin Name="EdGraphPin_93913"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93912"
   End Object
   Begin Object Class=MaterialExpressionFunctionInput Name="MaterialExpressionFunctionInput_81"
   End Object
   Begin Object Name="EdGraphPin_93913"
      PinName="Output"
      PinFriendlyName=" "
      Direction=EGPD_Output
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1728.EdGraphPin_93910'
   End Object
   Begin Object Name="EdGraphPin_93912"
      PinName="Preview"
      PinType=(PinCategory="optional")
   End Object
   Begin Object Name="MaterialExpressionFunctionInput_81"
      InputName="SpecPower"
      Description="Controls aqcuity of specularity in phong shader"
      Id=201EB1F94C3DA44A37DA13B1234BFA05
      InputType=FunctionInput_Scalar
      PreviewValue=(X=25.000000,Y=0.000000,Z=0.000000,W=1.000000)
      bUsePreviewValueAsDefault=True
      SortPriority=4
      MaterialExpressionEditorX=-1152
      MaterialExpressionEditorY=480
      MaterialExpressionGuid=63F9553C40C5099709F4ED8A64855993
      Material=Material'/Engine/Transient.Material_41'
   End Object
   MaterialExpression=MaterialExpressionFunctionInput'MaterialExpressionFunctionInput_81'
   Pins(0)=EdGraphPin'EdGraphPin_93912'
   Pins(1)=EdGraphPin'EdGraphPin_93913'
   NodePosX=-1152
   NodePosY=480
   NodeGuid=BDCE646E489A369A3AD1C7A5E8E7F490
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1730"
   Begin Object Class=EdGraphPin Name="EdGraphPin_93916"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93915"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93914"
   End Object
   Begin Object Class=MaterialExpressionMultiply Name="MaterialExpressionMultiply_33"
   End Object
   Begin Object Name="EdGraphPin_93916"
      PinName="Output"
      PinFriendlyName=" "
      Direction=EGPD_Output
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1732.EdGraphPin_93920'
      LinkedTo(1)=EdGraphPin'MaterialGraphNode_1735.EdGraphPin_93928'
   End Object
   Begin Object Name="EdGraphPin_93915"
      PinName="B"
      PinType=(PinCategory="optional")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1731.EdGraphPin_93918'
   End Object
   Begin Object Name="EdGraphPin_93914"
      PinName="A"
      PinType=(PinCategory="optional")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1728.EdGraphPin_93911'
   End Object
   Begin Object Name="MaterialExpressionMultiply_33"
      A=(Expression=MaterialExpressionPower'MaterialGraphNode_1728.MaterialExpressionPower_9')
      B=(Expression=MaterialExpressionFunctionInput'MaterialGraphNode_1731.MaterialExpressionFunctionInput_82')
      MaterialExpressionEditorX=-656
      MaterialExpressionEditorY=320
      MaterialExpressionGuid=C28C84AE455E4F2E0053ECBB894AC37F
      Material=Material'/Engine/Transient.Material_41'
   End Object
   MaterialExpression=MaterialExpressionMultiply'MaterialExpressionMultiply_33'
   Pins(0)=EdGraphPin'EdGraphPin_93914'
   Pins(1)=EdGraphPin'EdGraphPin_93915'
   Pins(2)=EdGraphPin'EdGraphPin_93916'
   NodePosX=-656
   NodePosY=320
   NodeGuid=18354C414E52896CB7C66487383ECCE9
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1731"
   Begin Object Class=EdGraphPin Name="EdGraphPin_93918"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93917"
   End Object
   Begin Object Class=MaterialExpressionFunctionInput Name="MaterialExpressionFunctionInput_82"
   End Object
   Begin Object Name="EdGraphPin_93918"
      PinName="Output"
      PinFriendlyName=" "
      Direction=EGPD_Output
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1730.EdGraphPin_93915'
   End Object
   Begin Object Name="EdGraphPin_93917"
      PinName="Preview"
      PinType=(PinCategory="optional")
   End Object
   Begin Object Name="MaterialExpressionFunctionInput_82"
      InputName="SpecStrength"
      Description="Scales specularity in phong shader"
      Id=31DD14444A32F188B5E044AA9D4932E1
      PreviewValue=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000)
      bUsePreviewValueAsDefault=True
      SortPriority=5
      MaterialExpressionEditorX=-896
      MaterialExpressionEditorY=480
      MaterialExpressionGuid=63F9553C40C5099709F4ED8A64855993
      Material=Material'/Engine/Transient.Material_41'
   End Object
   MaterialExpression=MaterialExpressionFunctionInput'MaterialExpressionFunctionInput_82'
   Pins(0)=EdGraphPin'EdGraphPin_93917'
   Pins(1)=EdGraphPin'EdGraphPin_93918'
   NodePosX=-896
   NodePosY=480
   NodeGuid=9D3628A54483608C2CA52582D2F0E829
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1732"
   Begin Object Class=EdGraphPin Name="EdGraphPin_93921"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93920"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93919"
   End Object
   Begin Object Class=MaterialExpressionAdd Name="MaterialExpressionAdd_19"
   End Object
   Begin Object Name="EdGraphPin_93921"
      PinName="Output"
      PinFriendlyName=" "
      Direction=EGPD_Output
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1735.EdGraphPin_93927'
   End Object
   Begin Object Name="EdGraphPin_93920"
      PinName="B"
      PinType=(PinCategory="optional")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1730.EdGraphPin_93916'
   End Object
   Begin Object Name="EdGraphPin_93919"
      PinName="A"
      PinType=(PinCategory="optional")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1734.EdGraphPin_93926'
   End Object
   Begin Object Name="MaterialExpressionAdd_19"
      A=(Expression=MaterialExpressionMultiply'MaterialGraphNode_1734.MaterialExpressionMultiply_34')
      B=(Expression=MaterialExpressionMultiply'MaterialGraphNode_1730.MaterialExpressionMultiply_33')
      MaterialExpressionEditorX=-288
      MaterialExpressionEditorY=176
      MaterialExpressionGuid=B4A177084060E4BC35E970B354E1EA41
      Material=Material'/Engine/Transient.Material_41'
   End Object
   MaterialExpression=MaterialExpressionAdd'MaterialExpressionAdd_19'
   Pins(0)=EdGraphPin'EdGraphPin_93919'
   Pins(1)=EdGraphPin'EdGraphPin_93920'
   Pins(2)=EdGraphPin'EdGraphPin_93921'
   NodePosX=-288
   NodePosY=176
   NodeGuid=76453A41406B04AD4F5F248280966126
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1733"
   Begin Object Class=EdGraphPin Name="EdGraphPin_93923"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93922"
   End Object
   Begin Object Class=MaterialExpressionFunctionInput Name="MaterialExpressionFunctionInput_83"
   End Object
   Begin Object Name="EdGraphPin_93923"
      PinName="Output"
      PinFriendlyName=" "
      Direction=EGPD_Output
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1734.EdGraphPin_93924'
   End Object
   Begin Object Name="EdGraphPin_93922"
      PinName="Preview"
      PinType=(PinCategory="optional")
   End Object
   Begin Object Name="MaterialExpressionFunctionInput_83"
      InputName="DiffuseStrength"
      Description="Scalar for diffuse in phong shader"
      Id=0A4AE0AE43768F6C2D79A7AC103EABEA
      PreviewValue=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000)
      bUsePreviewValueAsDefault=True
      SortPriority=3
      MaterialExpressionEditorX=-992
      MaterialExpressionEditorY=-32
      MaterialExpressionGuid=63F9553C40C5099709F4ED8A64855993
      Material=Material'/Engine/Transient.Material_41'
   End Object
   MaterialExpression=MaterialExpressionFunctionInput'MaterialExpressionFunctionInput_83'
   Pins(0)=EdGraphPin'EdGraphPin_93922'
   Pins(1)=EdGraphPin'EdGraphPin_93923'
   NodePosX=-992
   NodePosY=-32
   NodeGuid=A46B7B824772B086BC106ABDB1EE9470
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1734"
   Begin Object Class=EdGraphPin Name="EdGraphPin_93926"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93925"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93924"
   End Object
   Begin Object Class=MaterialExpressionMultiply Name="MaterialExpressionMultiply_34"
   End Object
   Begin Object Name="EdGraphPin_93926"
      PinName="Output"
      PinFriendlyName=" "
      Direction=EGPD_Output
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1732.EdGraphPin_93919'
   End Object
   Begin Object Name="EdGraphPin_93925"
      PinName="B"
      PinType=(PinCategory="optional")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1724.EdGraphPin_93899'
   End Object
   Begin Object Name="EdGraphPin_93924"
      PinName="A"
      PinType=(PinCategory="optional")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1733.EdGraphPin_93923'
   End Object
   Begin Object Name="MaterialExpressionMultiply_34"
      A=(Expression=MaterialExpressionFunctionInput'MaterialGraphNode_1733.MaterialExpressionFunctionInput_83')
      B=(Expression=MaterialExpressionClamp'MaterialGraphNode_1724.MaterialExpressionClamp_30')
      MaterialExpressionEditorX=-688
      MaterialExpressionEditorY=64
      MaterialExpressionGuid=9E1A71374F5FD19EA3AC52A4133E6D1E
      Material=Material'/Engine/Transient.Material_41'
   End Object
   MaterialExpression=MaterialExpressionMultiply'MaterialExpressionMultiply_34'
   Pins(0)=EdGraphPin'EdGraphPin_93924'
   Pins(1)=EdGraphPin'EdGraphPin_93925'
   Pins(2)=EdGraphPin'EdGraphPin_93926'
   NodePosX=-688
   NodePosY=64
   NodeGuid=1793E08E456FAFA4600324BC5EFE3BF0
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1735"
   Begin Object Class=EdGraphPin Name="EdGraphPin_93930"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93929"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93928"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93927"
   End Object
   Begin Object Class=MaterialExpressionStaticSwitch Name="MaterialExpressionStaticSwitch_12"
   End Object
   Begin Object Name="EdGraphPin_93930"
      PinName="Output"
      PinFriendlyName=" "
      Direction=EGPD_Output
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1722.EdGraphPin_93891'
   End Object
   Begin Object Name="EdGraphPin_93929"
      PinName="Value"
      PinType=(PinCategory="optional")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1736.EdGraphPin_93932'
   End Object
   Begin Object Name="EdGraphPin_93928"
      PinName="False"
      PinType=(PinCategory="required")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1730.EdGraphPin_93916'
   End Object
   Begin Object Name="EdGraphPin_93927"
      PinName="True"
      PinType=(PinCategory="required")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1732.EdGraphPin_93921'
   End Object
   Begin Object Name="MaterialExpressionStaticSwitch_12"
      A=(Expression=MaterialExpressionAdd'MaterialGraphNode_1732.MaterialExpressionAdd_19')
      B=(Expression=MaterialExpressionMultiply'MaterialGraphNode_1730.MaterialExpressionMultiply_33')
      Value=(Expression=MaterialExpressionFunctionInput'MaterialGraphNode_1736.MaterialExpressionFunctionInput_84')
      MaterialExpressionEditorX=16
      MaterialExpressionEditorY=288
      MaterialExpressionGuid=D225AA73475661068A66D993A02FD440
      Material=Material'/Engine/Transient.Material_41'
   End Object
   MaterialExpression=MaterialExpressionStaticSwitch'MaterialExpressionStaticSwitch_12'
   Pins(0)=EdGraphPin'EdGraphPin_93927'
   Pins(1)=EdGraphPin'EdGraphPin_93928'
   Pins(2)=EdGraphPin'EdGraphPin_93929'
   Pins(3)=EdGraphPin'EdGraphPin_93930'
   NodePosX=16
   NodePosY=288
   NodeGuid=031957594A37EA06209B6BBB7CAC3DFB
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1736"
   Begin Object Class=EdGraphPin Name="EdGraphPin_93932"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93931"
   End Object
   Begin Object Class=MaterialExpressionFunctionInput Name="MaterialExpressionFunctionInput_84"
   End Object
   Begin Object Name="EdGraphPin_93932"
      PinName="Output"
      PinFriendlyName=" "
      Direction=EGPD_Output
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1735.EdGraphPin_93929'
   End Object
   Begin Object Name="EdGraphPin_93931"
      PinName="Preview"
      PinType=(PinCategory="optional")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1737.EdGraphPin_93933'
   End Object
   Begin Object Name="MaterialExpressionFunctionInput_84"
      Preview=(Expression=MaterialExpressionStaticBool'MaterialGraphNode_1737.MaterialExpressionStaticBool_11')
      InputName="Use Diffuse?"
      Description="Use Lambertian diffuse plus Phong specular (default set to true, off can save 1 instruction)"
      Id=E580B2CF456E6BAD6100879584416AD0
      InputType=FunctionInput_StaticBool
      bUsePreviewValueAsDefault=True
      SortPriority=2
      MaterialExpressionEditorX=-304
      MaterialExpressionEditorY=432
      MaterialExpressionGuid=63F9553C40C5099709F4ED8A64855993
      Material=Material'/Engine/Transient.Material_41'
   End Object
   MaterialExpression=MaterialExpressionFunctionInput'MaterialExpressionFunctionInput_84'
   Pins(0)=EdGraphPin'EdGraphPin_93931'
   Pins(1)=EdGraphPin'EdGraphPin_93932'
   NodePosX=-304
   NodePosY=432
   NodeGuid=793974EB422384C20C3C8FAAC15BA2D3
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1737"
   Begin Object Class=EdGraphPin Name="EdGraphPin_93933"
   End Object
   Begin Object Class=MaterialExpressionStaticBool Name="MaterialExpressionStaticBool_11"
   End Object
   Begin Object Name="EdGraphPin_93933"
      PinName="Output"
      PinFriendlyName=" "
      Direction=EGPD_Output
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1736.EdGraphPin_93931'
   End Object
   Begin Object Name="MaterialExpressionStaticBool_11"
      Value=True
      MaterialExpressionEditorX=-512
      MaterialExpressionEditorY=464
      MaterialExpressionGuid=6A0CCE734B6176341FF79F8506474ACE
      Material=Material'/Engine/Transient.Material_41'
   End Object
   MaterialExpression=MaterialExpressionStaticBool'MaterialExpressionStaticBool_11'
   Pins(0)=EdGraphPin'EdGraphPin_93933'
   NodePosX=-512
   NodePosY=464
   NodeGuid=2DE36C6D4665FC5C2867B9A0A441CE19
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1738"
   Begin Object Class=EdGraphPin Name="EdGraphPin_93935"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93934"
   End Object
   Begin Object Class=MaterialExpressionFunctionInput Name="MaterialExpressionFunctionInput_85"
   End Object
   Begin Object Name="EdGraphPin_93935"
      PinName="Output"
      PinFriendlyName=" "
      Direction=EGPD_Output
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1723.EdGraphPin_93893'
      LinkedTo(1)=EdGraphPin'MaterialGraphNode_1725.EdGraphPin_93900'
   End Object
   Begin Object Name="EdGraphPin_93934"
      PinName="Preview"
      PinType=(PinCategory="optional")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1741.EdGraphPin_93939'
   End Object
   Begin Object Name="MaterialExpressionFunctionInput_85"
      Preview=(Expression=MaterialExpressionConstant3Vector'MaterialGraphNode_1741.MaterialExpressionConstant3Vector_13')
      InputName="LightVector"
      Description="Vector direction of light source"
      Id=566DA4F84C0B0D78E4E010BD8A39D47E
      bUsePreviewValueAsDefault=True
      MaterialExpressionEditorX=-1616
      MaterialExpressionEditorY=16
      MaterialExpressionGuid=B8EF2C0C42EFC403DA6758B7D1C53B39
      Material=Material'/Engine/Transient.Material_41'
   End Object
   MaterialExpression=MaterialExpressionFunctionInput'MaterialExpressionFunctionInput_85'
   Pins(0)=EdGraphPin'EdGraphPin_93934'
   Pins(1)=EdGraphPin'EdGraphPin_93935'
   NodePosX=-1616
   NodePosY=16
   NodeGuid=6A90CFCD4FDDC25C1B3B05AA94E15DB7
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1739"
   Begin Object Class=EdGraphPin Name="EdGraphPin_93937"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_93936"
   End Object
   Begin Object Class=MaterialExpressionFunctionInput Name="MaterialExpressionFunctionInput_86"
   End Object
   Begin Object Name="EdGraphPin_93937"
      PinName="Output"
      PinFriendlyName=" "
      Direction=EGPD_Output
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1723.EdGraphPin_93894'
   End Object
   Begin Object Name="EdGraphPin_93936"
      PinName="Preview"
      PinType=(PinCategory="optional")
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1740.EdGraphPin_93938'
   End Object
   Begin Object Name="MaterialExpressionFunctionInput_86"
      Preview=(Expression=MaterialExpressionPixelNormalWS'MaterialGraphNode_1740.MaterialExpressionPixelNormalWS_12')
      InputName="Normal"
      Description="Normals (defaults to pixel normal)"
      Id=AC426A184216CBF754BA1BBFBE651F71
      bUsePreviewValueAsDefault=True
      SortPriority=1
      MaterialExpressionEditorX=-1600
      MaterialExpressionEditorY=256
      MaterialExpressionGuid=B8EF2C0C42EFC403DA6758B7D1C53B39
      Material=Material'/Engine/Transient.Material_41'
   End Object
   MaterialExpression=MaterialExpressionFunctionInput'MaterialExpressionFunctionInput_86'
   Pins(0)=EdGraphPin'EdGraphPin_93936'
   Pins(1)=EdGraphPin'EdGraphPin_93937'
   NodePosX=-1600
   NodePosY=256
   NodeGuid=040542254457104D3A1C77802E9B91F6
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1740"
   Begin Object Class=EdGraphPin Name="EdGraphPin_93938"
   End Object
   Begin Object Class=MaterialExpressionPixelNormalWS Name="MaterialExpressionPixelNormalWS_12"
   End Object
   Begin Object Name="EdGraphPin_93938"
      PinName="Output"
      PinFriendlyName=" "
      Direction=EGPD_Output
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1739.EdGraphPin_93936'
   End Object
   Begin Object Name="MaterialExpressionPixelNormalWS_12"
      MaterialExpressionEditorX=-1808
      MaterialExpressionEditorY=240
      MaterialExpressionGuid=E6B170854A1EF7B84AFE549D702B4D45
      Material=Material'/Engine/Transient.Material_41'
   End Object
   MaterialExpression=MaterialExpressionPixelNormalWS'MaterialExpressionPixelNormalWS_12'
   Pins(0)=EdGraphPin'EdGraphPin_93938'
   NodePosX=-1808
   NodePosY=240
   NodeGuid=304915FC4EB7F15970623FA86D09BF26
End Object
Begin Object Class=MaterialGraphNode Name="MaterialGraphNode_1741"
   Begin Object Class=EdGraphPin Name="EdGraphPin_93939"
   End Object
   Begin Object Class=MaterialExpressionConstant3Vector Name="MaterialExpressionConstant3Vector_13"
   End Object
   Begin Object Name="EdGraphPin_93939"
      PinName="Output"
      PinFriendlyName=" "
      Direction=EGPD_Output
      LinkedTo(0)=EdGraphPin'MaterialGraphNode_1738.EdGraphPin_93934'
   End Object
   Begin Object Name="MaterialExpressionConstant3Vector_13"
      Constant=(R=0.000000,G=0.000000,B=1.000000,A=0.000000)
      MaterialExpressionEditorX=-1792
      MaterialExpressionEditorY=16
      MaterialExpressionGuid=AE2F94884F3FAFDD97FC0FB03EC4CBBC
      Material=Material'/Engine/Transient.Material_41'
   End Object
   MaterialExpression=MaterialExpressionConstant3Vector'MaterialExpressionConstant3Vector_13'
   Pins(0)=EdGraphPin'EdGraphPin_93939'
   NodePosX=-1792
   NodePosY=16
   NodeGuid=F1EB1A624F95E9BC42399FBD1876C024
End Object


And here’s the Blueprint for a Light Vector. You don’t have to use the names I used, just make sure you also make a Material Parameter Collection with a 3-vector output for the light vector and make sure the Blueprint communicates with that. For most direct types of shading, you need to use the inverse vector, but I like having access to both sides.


Begin Object Class=K2Node_CallFunction Name="K2Node_CallFunction_6286"
   Begin Object Class=EdGraphPin Name="EdGraphPin_50019"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50020"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50021"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50022"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50023"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50024"
   End Object
   Begin Object Name="EdGraphPin_50019"
      PinName="execute"
      PinToolTip="
Exec"
      PinType=(PinCategory="exec")
      LinkedTo(0)=EdGraphPin'K2Node_Event_232.EdGraphPin_49996'
   End Object
   Begin Object Name="EdGraphPin_50020"
      PinName="then"
      PinToolTip="
Exec"
      Direction=EGPD_Output
      PinType=(PinCategory="exec")
      LinkedTo(0)=EdGraphPin'K2Node_MacroInstance_850.EdGraphPin_95103'
   End Object
   Begin Object Name="EdGraphPin_50021"
      PinName="self"
      PinFriendlyName="Target"
      PinToolTip="Target
Gameplay Statics Reference"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/Engine.GameplayStatics')
      DefaultObject=Default__GameplayStatics
      bHidden=True
   End Object
   Begin Object Name="EdGraphPin_50022"
      PinName="WorldContextObject"
      PinToolTip="World Context Object
Object Reference"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/CoreUObject.Object')
      bHidden=True
   End Object
   Begin Object Name="EdGraphPin_50023"
      PinName="ActorClass"
      PinToolTip="Actor Class
Actor Class

Class of Actor to find. Must be specified or result array will be empty."
      PinType=(PinCategory="class",PinSubCategoryObject=Class'/Script/Engine.Actor')
      DefaultObject=Class'/Script/Engine.DirectionalLight'
   End Object
   Begin Object Name="EdGraphPin_50024"
      PinName="OutActors"
      PinToolTip="Out Actors
Array of Directional Light References

Output array of Actors of the specified class."
      Direction=EGPD_Output
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/Engine.DirectionalLight',bIsArray=True)
      LinkedTo(0)=EdGraphPin'K2Node_CallArrayFunction_53.EdGraphPin_50038'
   End Object
   FunctionReference=(MemberParent=Class'/Script/Engine.GameplayStatics',MemberName="GetAllActorsOfClass")
   Pins(0)=EdGraphPin'EdGraphPin_50019'
   Pins(1)=EdGraphPin'EdGraphPin_50020'
   Pins(2)=EdGraphPin'EdGraphPin_50021'
   Pins(3)=EdGraphPin'EdGraphPin_50022'
   Pins(4)=EdGraphPin'EdGraphPin_50023'
   Pins(5)=EdGraphPin'EdGraphPin_50024'
   NodePosX=240
   NodePosY=-16
   NodeGuid=CBA49AAB427F2E4B1FCCFCA6536D97A2
End Object
Begin Object Class=K2Node_CallArrayFunction Name="K2Node_CallArrayFunction_53"
   Begin Object Class=EdGraphPin Name="EdGraphPin_50037"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50038"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50039"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50040"
   End Object
   Begin Object Name="EdGraphPin_50037"
      PinName="self"
      PinFriendlyName="Target"
      PinToolTip="Target
Kismet Array Library Reference"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/Engine.KismetArrayLibrary')
      DefaultObject=Default__KismetArrayLibrary
      bHidden=True
   End Object
   Begin Object Name="EdGraphPin_50038"
      PinName="TargetArray"
      PinToolTip="Target Array
Array of Directional Light References

The array to get an item from *"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/Engine.DirectionalLight',bIsArray=True,bIsReference=True,bIsConst=True)
      LinkedTo(0)=EdGraphPin'K2Node_CallFunction_6286.EdGraphPin_50024'
      bDefaultValueIsIgnored=True
   End Object
   Begin Object Name="EdGraphPin_50039"
      PinName="Index"
      PinToolTip="Index
Integer

The index in the array to get an item from *"
      PinType=(PinCategory="int")
      DefaultValue="0"
      AutogeneratedDefaultValue="0"
   End Object
   Begin Object Name="EdGraphPin_50040"
      PinName="Item"
      PinToolTip="Item
Directional Light Reference"
      Direction=EGPD_Output
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/Engine.DirectionalLight')
      AutogeneratedDefaultValue="0"
      LinkedTo(0)=EdGraphPin'K2Node_CallFunction_6287.EdGraphPin_50070'
      LinkedTo(1)=EdGraphPin'K2Node_MacroInstance_850.EdGraphPin_95104'
   End Object
   bIsPureFunc=True
   FunctionReference=(MemberParent=Class'/Script/Engine.KismetArrayLibrary',MemberName="Array_Get")
   Pins(0)=EdGraphPin'EdGraphPin_50037'
   Pins(1)=EdGraphPin'EdGraphPin_50038'
   Pins(2)=EdGraphPin'EdGraphPin_50039'
   Pins(3)=EdGraphPin'EdGraphPin_50040'
   NodePosX=528
   NodePosY=64
   NodeGuid=A8A97E8B4FAD66037E7A5CAF8F995C2A
End Object
Begin Object Class=K2Node_CallMaterialParameterCollectionFunction Name="K2Node_CallMaterialParameterCollectionFunction_87"
   Begin Object Class=EdGraphPin Name="EdGraphPin_50049"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50050"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50051"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50052"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50053"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50054"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50055"
   End Object
   Begin Object Name="EdGraphPin_50049"
      PinName="execute"
      PinToolTip="
Exec"
      PinType=(PinCategory="exec")
      LinkedTo(0)=EdGraphPin'K2Node_MacroInstance_850.EdGraphPin_95105'
   End Object
   Begin Object Name="EdGraphPin_50050"
      PinName="then"
      PinToolTip="
Exec"
      Direction=EGPD_Output
      PinType=(PinCategory="exec")
      LinkedTo(0)=EdGraphPin'K2Node_CallMaterialParameterCollectionFunction_101.EdGraphPin_50106'
   End Object
   Begin Object Name="EdGraphPin_50051"
      PinName="self"
      PinFriendlyName="Target"
      PinToolTip="Target
Kismet Material Library Reference"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/Engine.KismetMaterialLibrary')
      DefaultObject=Default__KismetMaterialLibrary
      bHidden=True
   End Object
   Begin Object Name="EdGraphPin_50052"
      PinName="WorldContextObject"
      PinToolTip="World Context Object
Object Reference"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/CoreUObject.Object')
      bHidden=True
   End Object
   Begin Object Name="EdGraphPin_50053"
      PinName="Collection"
      PinToolTip="Collection
Material Parameter Collection Reference"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/Engine.MaterialParameterCollection')
      DefaultObject=MaterialParameterCollection'/Game/Blueprints/LightVector_MPC.LightVector_MPC'
   End Object
   Begin Object Name="EdGraphPin_50054"
      PinName="ParameterName"
      PinToolTip="Parameter Name
Name"
      PinType=(PinCategory="name")
      DefaultValue="Vector"
      AutogeneratedDefaultValue="None"
   End Object
   Begin Object Name="EdGraphPin_50055"
      PinName="ParameterValue"
      PinToolTip="Parameter Value
Linear Color Structure (by ref)"
      PinType=(PinCategory="struct",PinSubCategoryObject=ScriptStruct'/Script/CoreUObject.LinearColor',bIsReference=True,bIsConst=True)
      LinkedTo(0)=EdGraphPin'K2Node_CallFunction_6292.EdGraphPin_50087'
      bDefaultValueIsIgnored=True
   End Object
   FunctionReference=(MemberParent=Class'/Script/Engine.KismetMaterialLibrary',MemberName="SetVectorParameterValue")
   Pins(0)=EdGraphPin'EdGraphPin_50049'
   Pins(1)=EdGraphPin'EdGraphPin_50050'
   Pins(2)=EdGraphPin'EdGraphPin_50051'
   Pins(3)=EdGraphPin'EdGraphPin_50052'
   Pins(4)=EdGraphPin'EdGraphPin_50053'
   Pins(5)=EdGraphPin'EdGraphPin_50054'
   Pins(6)=EdGraphPin'EdGraphPin_50055'
   NodePosX=1312
   NodePosY=-16
   NodeGuid=7B2F3A2848F7D97BB8484A86F0B9FFB2
End Object
Begin Object Class=K2Node_CallFunction Name="K2Node_CallFunction_6287"
   Begin Object Class=EdGraphPin Name="EdGraphPin_50070"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50071"
   End Object
   Begin Object Name="EdGraphPin_50070"
      PinName="self"
      PinFriendlyName="Target"
      PinToolTip="Target
Actor Reference"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/Engine.Actor')
      LinkedTo(0)=EdGraphPin'K2Node_CallArrayFunction_53.EdGraphPin_50040'
   End Object
   Begin Object Name="EdGraphPin_50071"
      PinName="ReturnValue"
      PinToolTip="Return Value
Rotator "
      Direction=EGPD_Output
      PinType=(PinCategory="struct",PinSubCategoryObject=ScriptStruct'/Script/CoreUObject.Rotator')
      AutogeneratedDefaultValue="0, 0, 0"
      LinkedTo(0)=EdGraphPin'K2Node_CallFunction_6290.EdGraphPin_50077'
   End Object
   bIsPureFunc=True
   bIsConstFunc=True
   FunctionReference=(MemberName="K2_GetActorRotation",bSelfContext=True)
   Pins(0)=EdGraphPin'EdGraphPin_50070'
   Pins(1)=EdGraphPin'EdGraphPin_50071'
   NodePosX=720
   NodePosY=112
   NodeGuid=B45A5FAD499CDB5D68467F82FEBD0A96
End Object
Begin Object Class=K2Node_CallFunction Name="K2Node_CallFunction_6290"
   Begin Object Class=EdGraphPin Name="EdGraphPin_50076"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50077"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50078"
   End Object
   Begin Object Name="EdGraphPin_50076"
      PinName="self"
      PinFriendlyName="Target"
      PinToolTip="Target
Kismet Math Library Reference"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/Engine.KismetMathLibrary')
      DefaultObject=Default__KismetMathLibrary
      bHidden=True
   End Object
   Begin Object Name="EdGraphPin_50077"
      PinName="InRot"
      PinToolTip="In Rot
Rotator "
      PinType=(PinCategory="struct",PinSubCategoryObject=ScriptStruct'/Script/CoreUObject.Rotator')
      DefaultValue="0, 0, 0"
      AutogeneratedDefaultValue="0, 0, 0"
      LinkedTo(0)=EdGraphPin'K2Node_CallFunction_6287.EdGraphPin_50071'
   End Object
   Begin Object Name="EdGraphPin_50078"
      PinName="ReturnValue"
      PinToolTip="Return Value
Vector "
      Direction=EGPD_Output
      PinType=(PinCategory="struct",PinSubCategoryObject=ScriptStruct'/Script/CoreUObject.Vector')
      AutogeneratedDefaultValue="0, 0, 0"
      LinkedTo(0)=EdGraphPin'K2Node_CallFunction_6292.EdGraphPin_50086'
      LinkedTo(1)=EdGraphPin'K2Node_CallFunction_6414.EdGraphPin_94695'
   End Object
   bIsPureFunc=True
   FunctionReference=(MemberParent=Class'/Script/Engine.KismetMathLibrary',MemberName="GetForwardVector")
   Pins(0)=EdGraphPin'EdGraphPin_50076'
   Pins(1)=EdGraphPin'EdGraphPin_50077'
   Pins(2)=EdGraphPin'EdGraphPin_50078'
   NodePosX=944
   NodePosY=128
   NodeGuid=989EAF5441101FCA5D74EFAEA4BF500D
End Object
Begin Object Class=K2Node_CallFunction Name="K2Node_CallFunction_6292"
   Begin Object Class=EdGraphPin Name="EdGraphPin_50085"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50086"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50087"
   End Object
   Begin Object Name="EdGraphPin_50085"
      PinName="self"
      PinFriendlyName="Target"
      PinToolTip="Target
Kismet Math Library Reference"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/Engine.KismetMathLibrary')
      DefaultObject=Default__KismetMathLibrary
      bHidden=True
   End Object
   Begin Object Name="EdGraphPin_50086"
      PinName="InVec"
      PinToolTip="In Vec
Vector "
      PinType=(PinCategory="struct",PinSubCategoryObject=ScriptStruct'/Script/CoreUObject.Vector')
      DefaultValue="0, 0, 0"
      AutogeneratedDefaultValue="0, 0, 0"
      LinkedTo(0)=EdGraphPin'K2Node_CallFunction_6290.EdGraphPin_50078'
   End Object
   Begin Object Name="EdGraphPin_50087"
      PinName="ReturnValue"
      PinToolTip="Return Value
Linear Color Structure"
      Direction=EGPD_Output
      PinType=(PinCategory="struct",PinSubCategoryObject=ScriptStruct'/Script/CoreUObject.LinearColor')
      LinkedTo(0)=EdGraphPin'K2Node_CallMaterialParameterCollectionFunction_87.EdGraphPin_50055'
   End Object
   bIsPureFunc=True
   FunctionReference=(MemberParent=Class'/Script/Engine.KismetMathLibrary',MemberName="Conv_VectorToLinearColor")
   Pins(0)=EdGraphPin'EdGraphPin_50085'
   Pins(1)=EdGraphPin'EdGraphPin_50086'
   Pins(2)=EdGraphPin'EdGraphPin_50087'
   NodePosX=1184
   NodePosY=112
   NodeGuid=4F06C5264D43FFA02006AEA42FAE73CE
End Object
Begin Object Class=K2Node_MacroInstance Name="K2Node_MacroInstance_850"
   Begin Object Class=EdGraphPin Name="EdGraphPin_95106"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_95105"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_95104"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_95103"
   End Object
   Begin Object Name="EdGraphPin_95106"
      PinName="Is Not Valid"
      Direction=EGPD_Output
      PinType=(PinCategory="exec")
   End Object
   Begin Object Name="EdGraphPin_95105"
      PinName="Is Valid"
      Direction=EGPD_Output
      PinType=(PinCategory="exec")
      LinkedTo(0)=EdGraphPin'K2Node_CallMaterialParameterCollectionFunction_87.EdGraphPin_50049'
   End Object
   Begin Object Name="EdGraphPin_95104"
      PinName="InputObject"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/CoreUObject.Object')
      LinkedTo(0)=EdGraphPin'K2Node_CallArrayFunction_53.EdGraphPin_50040'
   End Object
   Begin Object Name="EdGraphPin_95103"
      PinName="exec"
      PinType=(PinCategory="exec")
      LinkedTo(0)=EdGraphPin'K2Node_CallFunction_6286.EdGraphPin_50020'
   End Object
   MacroGraphReference=(MacroGraph=EdGraph'/Engine/EditorBlueprintResources/StandardMacros.StandardMacros:IsValid',GraphBlueprint=Blueprint'/Engine/EditorBlueprintResources/StandardMacros.StandardMacros',GraphGuid=64422BCD430703FF5CAEA8B79A32AA65)
   Pins(0)=EdGraphPin'EdGraphPin_95103'
   Pins(1)=EdGraphPin'EdGraphPin_95104'
   Pins(2)=EdGraphPin'EdGraphPin_95105'
   Pins(3)=EdGraphPin'EdGraphPin_95106'
   NodePosX=736
   NodePosY=-16
   NodeGuid=C5841DA440DB9AAF79C7EE96F52E394E
End Object
Begin Object Class=K2Node_CallMaterialParameterCollectionFunction Name="K2Node_CallMaterialParameterCollectionFunction_101"
   Begin Object Class=EdGraphPin Name="EdGraphPin_50106"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50107"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50108"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50109"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50110"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50111"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50112"
   End Object
   Begin Object Name="EdGraphPin_50106"
      PinName="execute"
      PinType=(PinCategory="exec")
      LinkedTo(0)=EdGraphPin'K2Node_CallMaterialParameterCollectionFunction_87.EdGraphPin_50050'
   End Object
   Begin Object Name="EdGraphPin_50107"
      PinName="then"
      Direction=EGPD_Output
      PinType=(PinCategory="exec")
   End Object
   Begin Object Name="EdGraphPin_50108"
      PinName="self"
      PinFriendlyName="Target"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/Engine.KismetMaterialLibrary')
      DefaultObject=Default__KismetMaterialLibrary
      bHidden=True
   End Object
   Begin Object Name="EdGraphPin_50109"
      PinName="WorldContextObject"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/CoreUObject.Object')
      bHidden=True
   End Object
   Begin Object Name="EdGraphPin_50110"
      PinName="Collection"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/Engine.MaterialParameterCollection')
      DefaultObject=MaterialParameterCollection'/Game/Blueprints/LightVector_MPC.LightVector_MPC'
   End Object
   Begin Object Name="EdGraphPin_50111"
      PinName="ParameterName"
      PinType=(PinCategory="name")
      DefaultValue="InverseLightVector"
      AutogeneratedDefaultValue="None"
   End Object
   Begin Object Name="EdGraphPin_50112"
      PinName="ParameterValue"
      PinType=(PinCategory="struct",PinSubCategoryObject=ScriptStruct'/Script/CoreUObject.LinearColor',bIsReference=True,bIsConst=True)
      LinkedTo(0)=EdGraphPin'K2Node_CallFunction_6293.EdGraphPin_50141'
      bDefaultValueIsIgnored=True
   End Object
   FunctionReference=(MemberParent=Class'/Script/Engine.KismetMaterialLibrary',MemberName="SetVectorParameterValue")
   Pins(0)=EdGraphPin'EdGraphPin_50106'
   Pins(1)=EdGraphPin'EdGraphPin_50107'
   Pins(2)=EdGraphPin'EdGraphPin_50108'
   Pins(3)=EdGraphPin'EdGraphPin_50109'
   Pins(4)=EdGraphPin'EdGraphPin_50110'
   Pins(5)=EdGraphPin'EdGraphPin_50111'
   Pins(6)=EdGraphPin'EdGraphPin_50112'
   NodePosX=1632
   NodePosY=-16
   NodeGuid=0ACDC5BB438DAD5E37382E8B1403CF6D
End Object
Begin Object Class=K2Node_CallFunction Name="K2Node_CallFunction_6293"
   Begin Object Class=EdGraphPin Name="EdGraphPin_50139"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50140"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_50141"
   End Object
   Begin Object Name="EdGraphPin_50139"
      PinName="self"
      PinFriendlyName="Target"
      PinToolTip="Target
Kismet Math Library Reference"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/Engine.KismetMathLibrary')
      DefaultObject=Default__KismetMathLibrary
      bHidden=True
   End Object
   Begin Object Name="EdGraphPin_50140"
      PinName="InVec"
      PinToolTip="In Vec
Vector "
      PinType=(PinCategory="struct",PinSubCategoryObject=ScriptStruct'/Script/CoreUObject.Vector')
      DefaultValue="0, 0, 0"
      AutogeneratedDefaultValue="0, 0, 0"
      LinkedTo(0)=EdGraphPin'K2Node_CallFunction_6414.EdGraphPin_94696'
   End Object
   Begin Object Name="EdGraphPin_50141"
      PinName="ReturnValue"
      PinToolTip="Return Value
Linear Color Structure"
      Direction=EGPD_Output
      PinType=(PinCategory="struct",PinSubCategoryObject=ScriptStruct'/Script/CoreUObject.LinearColor')
      LinkedTo(0)=EdGraphPin'K2Node_CallMaterialParameterCollectionFunction_101.EdGraphPin_50112'
   End Object
   bIsPureFunc=True
   FunctionReference=(MemberParent=Class'/Script/Engine.KismetMathLibrary',MemberName="Conv_VectorToLinearColor")
   Pins(0)=EdGraphPin'EdGraphPin_50139'
   Pins(1)=EdGraphPin'EdGraphPin_50140'
   Pins(2)=EdGraphPin'EdGraphPin_50141'
   NodePosX=1456
   NodePosY=208
   NodeGuid=1265657C4801B15207E1D4B2CD6546B9
End Object
Begin Object Class=K2Node_CallFunction Name="K2Node_CallFunction_6414"
   Begin Object Class=EdGraphPin Name="EdGraphPin_94694"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_94695"
   End Object
   Begin Object Class=EdGraphPin Name="EdGraphPin_94696"
   End Object
   Begin Object Name="EdGraphPin_94694"
      PinName="self"
      PinFriendlyName="Target"
      PinToolTip="Target
Kismet Math Library Reference"
      PinType=(PinCategory="object",PinSubCategoryObject=Class'/Script/Engine.KismetMathLibrary')
      DefaultObject=Default__KismetMathLibrary
      bHidden=True
   End Object
   Begin Object Name="EdGraphPin_94695"
      PinName="A"
      PinToolTip="A
Vector "
      PinType=(PinCategory="struct",PinSubCategoryObject=ScriptStruct'/Script/CoreUObject.Vector')
      DefaultValue="0, 0, 0"
      AutogeneratedDefaultValue="0, 0, 0"
      LinkedTo(0)=EdGraphPin'K2Node_CallFunction_6290.EdGraphPin_50078'
   End Object
   Begin Object Name="EdGraphPin_94696"
      PinName="ReturnValue"
      PinToolTip="Return Value
Vector "
      Direction=EGPD_Output
      PinType=(PinCategory="struct",PinSubCategoryObject=ScriptStruct'/Script/CoreUObject.Vector')
      AutogeneratedDefaultValue="0, 0, 0"
      LinkedTo(0)=EdGraphPin'K2Node_CallFunction_6293.EdGraphPin_50140'
   End Object
   bIsPureFunc=True
   FunctionReference=(MemberParent=Class'/Script/Engine.KismetMathLibrary',MemberName="NegateVector")
   Pins(0)=EdGraphPin'EdGraphPin_94694'
   Pins(1)=EdGraphPin'EdGraphPin_94695'
   Pins(2)=EdGraphPin'EdGraphPin_94696'
   NodePosX=1184
   NodePosY=208
   NodeGuid=8DC074964C98308DE0FD458BB92668CE
End Object