In the olden days, producers knew what visual effects were. Now they’ve gotten into this methodology where they’ll hire a middleman – a visual effects supervisor, and this person works for the producing studio.
They’re middle managers. And when you go into a review with one of them, there’s this weird sort of competition that happens.

It’s a game called ‘Find What’s Wrong With This Shot’. And there’s always going to be something wrong, because everything’s subjective. And you can micromanage it down to a pixel, and that happens all the time. We’re doing it digitally, so there’s no pressure to save on film costs or whatever, so it’s not unusual to go through 500 revisions of the same shot, moving pixels around and scrutinizing this or that.

That’s not how you manage artists. You encourage artists, and then you’ll get – you know – art.

If your idea of managing artists is just pointing out what’s wrong and making them fix it over and over again, you end up with artists who just stand around asking “OK lady, where do you want this sofa? You want it over there? No? Fine. You want it over there? I don’t give a fuck. I’ll put it wherever you want it.” It’s creative mismanagement, it’s part of the whole corporate modality. The fish stinks from the head on down. Back on Star Wars, Robocop, we never thought about what was wrong with a shot.

We just thought about how to make it better.

Phil Tippett

CustomShader3D: Cg shader editing in your comp

Moderator: SecondMan

User avatar
Chad
Fusionista
Posts: 925
Joined: Fri Aug 08, 2014 12:11 pm
Been thanked: 3 times

Re: CustomShader3D: Cg shader editing in your comp

Post #31 by Chad » Tue Jun 07, 2016 8:54 am

Kristof wrote:And another one: POM (parallax occlusion mapping)!


Oh neat! This is really really cool.

Spoiler:
Code: [Select all] [Expand/Collapse] [Download] (3CuS_POM_Sample.setting)
  1. {
  2.     Tools = ordered() {
  3.         CustomShader3D1_1_1_1 = Indicated.CustomShaderOperator3D {
  4.             CtrlWZoom = false,
  5.             Inputs = {
  6.                 ShaderTextInputs = Input { Value = "FuFloat4 Normal;\nFuFloat4 Diffuse;\nFuFloat4 Height;\nfloat ParallaxScale;\nfloat MaxLayers;\nfloat MinLayers;\nFuLight Lights[];\nfloat4x4 ProjectionI;\nfloat3x3 ModelToEyeIT;\nfloat3x3 EyeToModelIT;\nfloat3x3 WorldToEyeIT;\nfloat3x3 EyeToWorldIT;\n\n", },
  7.                 ShaderTextBody = Input { Value = "float2 standard_parallaxMapping(FuFragment f, float3 V, float2 T)\r\n{\r\n   // get depth for this fragment\r\n   FuFragment newf = f;\r\n   newf.TexCoord0 = float3(T, 1.0);\r\n   float initialHeight = Height.Shade(newf).x;\r\n\r\n   // calculate amount of offset for Parallax Mapping\r\n   float2 texCoordOffset = ParallaxScale * V.xy / V.z * initialHeight;\r\n\r\n   // calculate amount of offset for Parallax Mapping With Offset Limiting\r\n   texCoordOffset = ParallaxScale * V.xy * initialHeight;\r\n\r\n   // retunr modified texture coordinates\r\n   return T - texCoordOffset;\r\n}\r\n\r\nfloat2 steep_parallaxMapping(FuFragment f, float3 V, float2 T, out float parallaxHeight)\r\n{\r\n   // determine number of layers from angle between V and N\r\n   float minLayers = 5;\r\n   float maxLayers = 15;\r\n   float numLayers = lerp(MaxLayers, MinLayers, abs(dot(float3(0, 0, 1), V)));\r\n\r\n   // height of each layer\r\n   float layerHeight = 1.0 / numLayers;\r\n   // depth of current layer\r\n   float currentLayerHeight = 0;\r\n   // shift of texture coordinates for each iteration\r\n   float2 dtex = ParallaxScale * V.xy / V.z / numLayers;\r\n\r\n   // current texture coordinates\r\n   float2 currentTextureCoords = T;\r\n\r\n   // get first depth from heightmap\r\n   FuFragment newf = f;\r\n   newf.TexCoord0 = float3(currentTextureCoords, 1.0);\r\n   float heightFromTexture = Height.Shade(newf).x;\r\n\r\n   // while point is above surface\r\n   while(heightFromTexture > currentLayerHeight)\r\n   {\r\n      // to the next layer\r\n      currentLayerHeight += layerHeight;\r\n      // shift texture coordinates along vector V\r\n      currentTextureCoords -= dtex;\r\n      // get new depth from heightmap\r\n      newf.TexCoord0 = float3(currentTextureCoords, 1.0);\r\n      heightFromTexture = Height.Shade(newf).x;\r\n   }\r\n\r\n   // return results\r\n   parallaxHeight = currentLayerHeight;\r\n   return currentTextureCoords;\r\n} \r\n\r\nfloat2 relief_parallaxMapping(FuFragment f, float3 V, float2 T, out float parallaxHeight)\r\n{\r\n   // determine required number of layers\r\n   const float minLayers = 10;\r\n   const float maxLayers = 15;\r\n   float numLayers = mix(MaxLayers, MinLayers, abs(dot(float3(0, 0, 1), V)));\r\n\r\n   // height of each layer\r\n   float layerHeight = 1.0 / numLayers;\r\n   // depth of current layer\r\n   float currentLayerHeight = 0;\r\n   // shift of texture coordinates for each iteration\r\n   float2 dtex = ParallaxScale * V.xy / V.z / numLayers;\r\n\r\n   // current texture coordinates\r\n   float2 currentTextureCoords = T;\r\n\r\n   // depth from heightmap\r\n   FuFragment newf = f;\r\n   newf.TexCoord0 = float3(currentTextureCoords, 1.0);\r\n   float heightFromTexture = Height.Shade(newf).x;\r\n\r\n   // while point is above surface\r\n   while(heightFromTexture > currentLayerHeight)\r\n   {\r\n     // go to the next layer\r\n     currentLayerHeight += layerHeight;\r\n     // shift texture coordinates along V\r\n     currentTextureCoords -= dtex;\r\n     currentTextureCoords = frac(currentTextureCoords);\r\n     // new depth from heightmap\r\n      newf.TexCoord0 = float3(currentTextureCoords, 1.0);\r\n      heightFromTexture = Height.Shade(newf).x;\r\n   }\r\n\r\n   ///////////////////////////////////////////////////////////\r\n   // Start of Relief Parallax Mapping\r\n\r\n   // decrease shift and height of layer by half\r\n   float2 deltaTexCoord = dtex / 2;\r\n   float deltaHeight = layerHeight / 2;\r\n\r\n   // return to the mid point of previous layer\r\n   currentTextureCoords += deltaTexCoord;\r\n   currentLayerHeight -= deltaHeight;\r\n\r\n   // binary search to increase precision of Steep Paralax Mapping\r\n   const int numSearches = 5;\r\n   for(int i=0; i<numSearches; i++)\r\n   {\r\n     // decrease shift and height of layer by half\r\n     deltaTexCoord /= 2;\r\n     deltaHeight /= 2;\r\n\r\n     // new depth from heightmap\r\n      newf.TexCoord0 = float3(currentTextureCoords, 1.0);\r\n      heightFromTexture = Height.Shade(newf).x;\r\n\r\n     // shift along or agains vector V\r\n     if(heightFromTexture > currentLayerHeight) // below the surface\r\n     {\r\n       currentTextureCoords -= deltaTexCoord;\r\n       currentLayerHeight += deltaHeight;\r\n     }\r\n     else // above the surface\r\n     {\r\n       currentTextureCoords += deltaTexCoord;\r\n       currentLayerHeight -= deltaHeight;\r\n     }\r\n   }\r\n\r\n   // return results\r\n   parallaxHeight = currentLayerHeight;    \r\n   return currentTextureCoords;\r\n} \r\n\r\nfloat parallaxSoftShadowMultiplier(FuFragment f, float3 L, float2 initialTexCoord, float initialHeight)\r\n{\r\n   float shadowMultiplier = 1;\r\n\r\n   // calculate lighting only for surface oriented to the light source\r\n   if(dot(float3(0, 0, 1), L) > 0)\r\n   {\r\n      // calculate initial parameters\r\n      float numSamplesUnderSurface =0;\r\n      shadowMultiplier = 0;\r\n      float numLayers = lerp(MaxLayers, MinLayers, abs(dot(float3(0, 0, 1), L)));\r\n      float layerHeight = initialHeight / numLayers;\r\n      float2 texStep = ParallaxScale * L.xy / L.z / numLayers;\r\n\r\n      // current parameters\r\n      float currentLayerHeight = initialHeight - layerHeight;\r\n      float2 currentTextureCoords = initialTexCoord + texStep;\r\n\r\n      currentTextureCoords = frac(currentTextureCoords + 64.0);\r\n\r\n      FuFragment newf = f;\r\n      newf.TexCoord0 = float3(currentTextureCoords, 1.0);\r\n      float heightFromTexture = Height.Shade(newf).x;\r\n\r\n      int stepIndex = 1;\r\n   \r\n      // while point is below depth 0.0 )\r\n      while(currentLayerHeight > 0)\r\n      {\r\n         // if point is under the surface\r\n         if(heightFromTexture < currentLayerHeight)\r\n         {\r\n            // calculate partial shadowing factor\r\n            numSamplesUnderSurface += 1;\r\n            float newShadowMultiplier = (currentLayerHeight - heightFromTexture) * (1.0 - stepIndex / numLayers);\r\n            shadowMultiplier = max(shadowMultiplier, newShadowMultiplier);\r\n         }\r\n\r\n         // offset to the next layer\r\n         stepIndex += 1;\r\n         currentLayerHeight -= layerHeight;\r\n         currentTextureCoords += texStep;\r\n         currentTextureCoords = frac(currentTextureCoords + 4.0);\r\n         newf.TexCoord0 = float3(currentTextureCoords, 1.0);\r\n         heightFromTexture = Height.Shade(newf).x;\r\n      }\r\n\r\n      // Shadowing factor should be 1 if there were no points under the surface\r\n      if(numSamplesUnderSurface < 1)\r\n      {\r\n         shadowMultiplier =1;\r\n      }\r\n      else\r\n      {\r\n         shadowMultiplier =1-shadowMultiplier;\r\n      }\r\n   }\r\n   return shadowMultiplier;\r\n} \r\n\r\nfloat4 normalMappingLighting(FuFragment f, float3 L, float3 V, float shadowMultiplier)\r\n{\r\n   // restore normal from normal map\r\n   float3 N = normalize(Normal.Shade(f).xyz * 2.0 - 1.0);\r\n   N = N.x * normalize(f.TangentU) + N.y * normalize(f.TangentV) + N.z * normalize(f.Normal);\r\n   float3 D = Diffuse.Shade(f).xyz;\r\n\r\n   // diffuse lighting\r\n   float idiff = clamp(dot(N, L), 0.0, 1.0);\r\n\r\n   float4 resColor;\r\n   resColor = float4(D * ((idiff) * pow(shadowMultiplier, 4)), 1.0);\r\n\r\n   return resColor;\r\n}\r\n\r\nfloat4 Shade(inout FuFragment f){\r\n\r\n   float4 Kd = Diffuse.Shade(f);\r\n   float4 normalMap = Normal.Shade(f) * 2.0 - 1.0;   \r\n\r\n   normalMap.xyz = normalMap.x * normalize(f.TangentU) + normalMap.y * normalize(f.TangentV) + normalMap.z * normalize(f.Normal); \r\n\r\n   float3 n = normalMap.xyz;\r\n    float3x3 mWorldToTangent = float3x3( f.TangentU, f.TangentV, f.Normal ) ;\r\n    float3 vNormalWorld = normalize(mul(mWorldToTangent, normalize(-f.Position)));\r\n   float3 v = vNormalWorld;\r\n   \r\n   float3 aAccum = 0;\r\n   float3 dAccum = 0;\r\n   float3 Lambert; \r\n   float3 l;  \r\n\r\n   float parallaxHeight;\r\n   float2 T = relief_parallaxMapping(f, v, f.TexCoord0.xy, parallaxHeight);\r\n   FuFragment newf = f;\r\n   newf.TexCoord0 = float3(T, 1.0);\r\n                \r\n   float3 d = Diffuse.Shade(newf).xyz;\r\n\r\n   for (int i = 0; i < Lights.length; i++) \r\n   {\r\n      FuLightData data = Lights[i].Illuminate(newf);\r\n      aAccum += data.AmbientColor.rgb;\r\n      l = normalize(data.LightVector);\r\nl = normalize(mul(mWorldToTangent, normalize(data.LightVector)));\r\n      // get self-shadowing factor for elements of parallax\r\n      float shadowMultiplier = parallaxSoftShadowMultiplier(newf, l, newf.TexCoord0.xy, parallaxHeight);\r\n\r\n      dAccum += normalMappingLighting(newf, l, v, shadowMultiplier).xyz * data.Color.rgb;\r\n   }\r\n\r\n   float4 ret = float4(d * (dAccum + aAccum), Kd.a);\r\n   return ret; \r\n}", },
  8.                 RCGroup = Input { Value = 1, },
  9.                 UseLights = Input { Value = 1, },
  10.                 RCMatrices = Input { Value = 682, },
  11.                 MaterialGroup = Input { Value = 1, },
  12.                 FloatGroup = Input { Value = 1, },
  13.                 MaterialID = Input { Value = 1, },
  14.                 Normal = Input {
  15.                     SourceOp = "BumpMap1",
  16.                     Source = "MaterialOutput",
  17.                     CustomData = {
  18.                         Metadata = {
  19.                             Type = "Material",
  20.                             Set = "Normal",
  21.                         },
  22.                     },
  23.                 },
  24.                 Diffuse = Input {
  25.                     SourceOp = "BrightnessContrast1",
  26.                     Source = "Output",
  27.                     CustomData = {
  28.                         Metadata = {
  29.                             Type = "Material",
  30.                             Set = "Diffuse",
  31.                         },
  32.                     },
  33.                 },
  34.                 Height = Input {
  35.                     SourceOp = "BrightnessContrast1",
  36.                     Source = "Output",
  37.                     CustomData = {
  38.                         Metadata = {
  39.                             Type = "Material",
  40.                             Set = "Height",
  41.                         },
  42.                     },
  43.                 },
  44.                 ParallaxScale = Input {
  45.                     Value = 0.1,
  46.                     CustomData = {
  47.                         Metadata = {
  48.                             Type = "Float",
  49.                             Set = "ParallaxScale",
  50.                         },
  51.                     },
  52.                 },
  53.                 MaxLayers = Input {
  54.                     Value = 128,
  55.                     CustomData = {
  56.                         Metadata = {
  57.                             Type = "Float",
  58.                             Set = "MaxLayers",
  59.                         },
  60.                     },
  61.                 },
  62.                 MinLayers = Input {
  63.                     Value = 16,
  64.                     CustomData = {
  65.                         Metadata = {
  66.                             Type = "Float",
  67.                             Set = "MinLayers",
  68.                         },
  69.                     },
  70.                 },
  71.             },
  72.             ViewInfo = OperatorInfo {
  73.                 Pos = { 935, 181.5, },
  74.                 Flags = {
  75.                     ShowPic = true,
  76.                 },
  77.             },
  78.             UserControls = ordered() {
  79.                 Normal = {
  80.                     {
  81.                         LINKID_DataType = "MtlGraph3D",
  82.                     },
  83.                     {
  84.                         LINKID_DataType = "Image",
  85.                     },
  86.                     {
  87.                         LINKID_AllowedDataType = "Image",
  88.                     },
  89.                     {
  90.                         LINKID_AllowedDataType = "Mask",
  91.                     },
  92.                     LINK_Main = 2,
  93.                     INP_AcceptsGLImages = true,
  94.                     INPID_InputControl = "ImageControl",
  95.                     IC_ControlPage = 0,
  96.                     INP_AcceptsMasks = true,
  97.                     INP_Required = false,
  98.                 },
  99.                 Diffuse = {
  100.                     {
  101.                         LINKID_DataType = "MtlGraph3D",
  102.                     },
  103.                     {
  104.                         LINKID_DataType = "Image",
  105.                     },
  106.                     {
  107.                         LINKID_AllowedDataType = "Image",
  108.                     },
  109.                     {
  110.                         LINKID_AllowedDataType = "Mask",
  111.                     },
  112.                     LINK_Main = 2,
  113.                     INP_AcceptsGLImages = true,
  114.                     INPID_InputControl = "ImageControl",
  115.                     IC_ControlPage = 0,
  116.                     INP_AcceptsMasks = true,
  117.                     INP_Required = false,
  118.                 },
  119.                 Height = {
  120.                     {
  121.                         LINKID_DataType = "MtlGraph3D",
  122.                     },
  123.                     {
  124.                         LINKID_DataType = "Image",
  125.                     },
  126.                     {
  127.                         LINKID_AllowedDataType = "Image",
  128.                     },
  129.                     {
  130.                         LINKID_AllowedDataType = "Mask",
  131.                     },
  132.                     LINK_Main = 3,
  133.                     INP_AcceptsGLImages = true,
  134.                     INPID_InputControl = "ImageControl",
  135.                     IC_ControlPage = 0,
  136.                     INP_AcceptsMasks = true,
  137.                     INP_Required = false,
  138.                 },
  139.                 ParallaxScale = {
  140.                     IC_ControlPage = 0,
  141.                     INPID_InputControl = "SliderControl",
  142.                     LINKID_DataType = "Number",
  143.                 },
  144.                 MaxLayers = {
  145.                     IC_ControlPage = 0,
  146.                     LINKID_DataType = "Number",
  147.                     INPID_InputControl = "SliderControl",
  148.                 },
  149.                 MinLayers = {
  150.                     IC_ControlPage = 0,
  151.                     LINKID_DataType = "Number",
  152.                     INPID_InputControl = "SliderControl",
  153.                 },
  154.             },
  155.         },
  156.         Shape3D1 = Shape3D {
  157.             Inputs = {
  158.                 Shape = Input { Value = FuID { "SurfaceCubeInputs", }, },
  159.                 MaterialInput = Input {
  160.                     SourceOp = "CustomShader3D1_1_1_1",
  161.                     Source = "MaterialOutput",
  162.                 },
  163.                 ["MtlStdInputs.MaterialID"] = Input { Value = 3, },
  164.                 ["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 1, },
  165.                 ["SurfaceIcoInputs.ObjectID.ObjectID"] = Input { Value = 2, },
  166.                 ["SurfaceTorusInputs.ObjectID.ObjectID"] = Input { Value = 3, },
  167.                 ["SurfaceCubeInputs.ObjectID.ObjectID"] = Input { Value = 4, },
  168.                 ["SurfaceSphereInputs.ObjectID.ObjectID"] = Input { Value = 5, },
  169.                 ["SurfaceCylinderInputs.ObjectID.ObjectID"] = Input { Value = 6, },
  170.             },
  171.             ViewInfo = OperatorInfo { Pos = { 1100, 214.5, }, },
  172.         },
  173.         BumpMap1 = BumpMap {
  174.             Inputs = {
  175.                 Input = Input {
  176.                     SourceOp = "Bitmap1",
  177.                     Source = "Mask",
  178.                 },
  179.                 SourceChannel = Input { Value = FuID { "Alpha", }, },
  180.                 HeightScale = Input { Value = 7.1739987, },
  181.                 MaterialID = Input { Value = 2, },
  182.             },
  183.             ViewInfo = OperatorInfo { Pos = { 770, 247.5, }, },
  184.         },
  185.         BrightnessContrast1 = BrightnessContrast {
  186.             Inputs = {
  187.                 Red = Input { Value = 0, },
  188.                 Green = Input { Value = 0, },
  189.                 Blue = Input { Value = 0, },
  190.                 Alpha = Input { Value = 1, },
  191.                 Brightness = Input { Value = 1, },
  192.                 ClipWhite = Input { Value = 1, },
  193.                 Input = Input {
  194.                     SourceOp = "Plasma1",
  195.                     Source = "Output",
  196.                 },
  197.             },
  198.             ViewInfo = OperatorInfo { Pos = { 605, 148.5, }, },
  199.         },
  200.         Bitmap1 = BitmapMask {
  201.             Inputs = {
  202.                 MaskWidth = Input { Value = 2048, },
  203.                 MaskHeight = Input { Value = 1556, },
  204.                 PixelAspect = Input { Value = { 1, 1, }, },
  205.                 ClippingMode = Input { Value = FuID { "None", }, },
  206.                 Image = Input {
  207.                     SourceOp = "BrightnessContrast1",
  208.                     Source = "Output",
  209.                 },
  210.                 Channel = Input { Value = FuID { "Red", }, },
  211.             },
  212.             ViewInfo = OperatorInfo { Pos = { 605, 247.5, }, },
  213.         },
  214.         Plasma1 = Plasma {
  215.             Inputs = {
  216.                 Width = Input { Value = 2048, },
  217.                 Height = Input { Value = 1556, },
  218.                 ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2", }, },
  219.             },
  220.             ViewInfo = OperatorInfo { Pos = { 495, 148.5, }, },
  221.         },
  222.     },
  223. }



Tags:

User avatar
SecondMan
Site Admin
Posts: 1451
Joined: Thu Jul 31, 2014 4:31 pm
Location: Vancouver
Been thanked: 11 times
Contact:

Re: CustomShader3D: Cg shader editing in your comp

Post #32 by SecondMan » Tue Jun 07, 2016 10:36 am

Oh wow. That's just messing with my mind! :)

User avatar
miaz3
Fusioneer
Posts: 111
Joined: Sat Jan 03, 2015 1:43 am
Location: France
Contact:

Re: CustomShader3D: Cg shader editing in your comp

Post #33 by miaz3 » Tue Jun 07, 2016 11:41 am

thats really, really, impressive !

User avatar
Dunn
Moderator
Posts: 284
Joined: Mon Aug 04, 2014 3:27 am
Location: Hamburg, Germany
Been thanked: 8 times
Contact:

Re: CustomShader3D: Cg shader editing in your comp

Post #34 by Dunn » Tue Jun 07, 2016 12:57 pm

Double Wow! .. now thats really slick ! :o

User avatar
Chad
Fusionista
Posts: 925
Joined: Fri Aug 08, 2014 12:11 pm
Been thanked: 3 times

Re: CustomShader3D: Cg shader editing in your comp

Post #35 by Chad » Wed Jun 08, 2016 10:57 pm

Image

This one isn't as exciting, but it's very practical. Basically a Merge Material, but with lots of blend modes and with UV masking. I love doing masking for materials. :)

It won't match Fusion's Merge2D for all blend modes. It COULD, I suppose, but some of the blend modes in Merge2D aren't quite right, so I chose to fix them. Feel free to adjust them if you want, or add your own. I put it up on the help page.

User avatar
SecondMan
Site Admin
Posts: 1451
Joined: Thu Jul 31, 2014 4:31 pm
Location: Vancouver
Been thanked: 11 times
Contact:

Re: CustomShader3D: Cg shader editing in your comp

Post #36 by SecondMan » Thu Jun 09, 2016 8:40 am

Extremely useful, I'd say! Thanks Chad! :)

User avatar
Kenzor
Fusioneer
Posts: 71
Joined: Wed Aug 06, 2014 10:32 pm
Contact:

Re: CustomShader3D: Cg shader editing in your comp

Post #37 by Kenzor » Sun Jun 26, 2016 9:31 am

Am I right in thinking that I could easily port cg unity shaders to fusion custom shader 3d ?

Could I use Shader Forge in Unity to create CG shader code for fusion http://www.acegikmo.com/shaderforge/ ?

User avatar
Chad
Fusionista
Posts: 925
Joined: Fri Aug 08, 2014 12:11 pm
Been thanked: 3 times

Re: CustomShader3D: Cg shader editing in your comp

Post #38 by Chad » Sun Jun 26, 2016 10:24 am

Cg fragment shaders, yes. Can't do vertex or tessellation shaders without breaking interoperability with the built in shaders. It's a tradeoff between ease of use and flexibility.

Shader Forge isn't really going to help, there's a lot of functions you'd have to translate over with an include. It's possible, just probably not worth it. We are working on a system similar to Shader Forge, though, called Stdlib Shader. This would give you a modular shader system with all the fine controls you would expect. It will have basic math functions that you can do in 3Bol, like Add, but it will also have ones that 3Bol doesn't have, like Abs or Dot. The neat thing is that we can make 99% of it work in SW too (slow, but at least it works).

User avatar
SirEdric
Fusioneer
Posts: 78
Joined: Tue Aug 05, 2014 9:04 am
Been thanked: 1 time
Contact:

Re: CustomShader3D: Cg shader editing in your comp

Post #39 by SirEdric » Fri Jul 15, 2016 5:00 am

Hi Folks.

Am I right assuming that stuff like this would work directly in the CustomShader?
https://www.shadertoy.com/view/Md2GDw

Cheers.

Eric.

User avatar
Chad
Fusionista
Posts: 925
Joined: Fri Aug 08, 2014 12:11 pm
Been thanked: 3 times

Re: CustomShader3D: Cg shader editing in your comp

Post #40 by Chad » Fri Jul 15, 2016 10:28 am

That specific one will work just fine with some minor tweaks. I've had some ShaderToy shaders work almost unmodified. You'll need to provide the "iGlobalTime" and "iResolution" parameters, etc, and texture lookups are done differently in Fusion so we can read in textures or other shaders interchangeably, but it will work just fine for this.

EDIT: I'm on a job right now, so I don't have time to work this one up right now, but if I did, would you want it to work in camera space or UV space?

User avatar
SecondMan
Site Admin
Posts: 1451
Joined: Thu Jul 31, 2014 4:31 pm
Location: Vancouver
Been thanked: 11 times
Contact:

Re: CustomShader3D: Cg shader editing in your comp

Post #41 by SecondMan » Mon Jul 18, 2016 4:26 am

Chad wrote:would you want it to work in camera space or UV space?


How about a toggle between the two? :)

User avatar
Chad
Fusionista
Posts: 925
Joined: Fri Aug 08, 2014 12:11 pm
Been thanked: 3 times

Re: CustomShader3D: Cg shader editing in your comp

Post #42 by Chad » Mon Jul 18, 2016 6:32 am

That's coming. We have that in some other plugins, where a checkbox causes a code branch to switch and you get a recompile. It's slower to compile but faster to render.

Right now having a checkbox will, on some graphics cards / driver combinations, cause both branches to render. It's not bad at all, really, especially on a shader that's already running at 1500 fps or whatever crazy speed this one runs at.

UV space sort of requires that you define at least the aspect ratio you want. Otherwise it's normalized height/width, so in this shader the "blocks" will be the shape of the UV space. So a 16:9 3Im will have a 16:9 blocks, so you have to correct that by telling the shader to render the correct aspect ratio. It's not so bad, really, if you're doing screen replacements it's not like the screen will be a random size.

User avatar
Chad
Fusionista
Posts: 925
Joined: Fri Aug 08, 2014 12:11 pm
Been thanked: 3 times

Re: CustomShader3D: Cg shader editing in your comp

Post #43 by Chad » Fri Jul 29, 2016 8:23 pm

Here's a really simple shader that blends between two material with a screen-space mask. Rather than worry about masking in UV space, you can just draw out your masks on the rendered image and the shader applies it pixel-perfectly.

It's using the Projection matrix to do this, only 3 lines, but it's a handy trick for people used to thinking in terms of image space, which compositors routinely do.

  1.     float4 proj = mul(Projection,float4((f.Position),1));   // Going from eye-space to clip-space.  To multiply the float4x4 projection matrix and float3 Position, we need to add a 4th component, 1.0.  
  2.     proj /= proj.w;    // Divide to get from 4D clip to 3D NDC (normalized device coordinates)
  3.     f.TexCoord0 = proj.rgb * .5 + .5;   // Normalizing from [-1,1] to [0,1]


If you were interested in doing any OpenGL/GPU accelerated image effects, like color correction, filters, compositing, etc., this general technique would be pretty handy.

ScreenSpaceMask.JPG


Spoiler:
  1. {
  2.     Tools = ordered() {
  3.         CustomShader3D_ScreenSpaceMask_1 = Indicated.CustomShaderOperator3D {
  4.             CtrlWZoom = false,
  5.             NameSet = true,
  6.             CustomData = {
  7.                 Settings = {
  8.                 }
  9.             },
  10.             Inputs = {
  11.                 ShaderTextInputs = Input { Value = "FuFloat4 EffectMask;\nFuFloat4 BgMtl;\nFuFloat4 FgMtl;\nfloat Dissolve;\nfloat4x4 Projection;\n\n", },
  12.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\n{\n\n   float3 OldTexCoord0 = f.TexCoord0;  // Buffer to store the UV's so we can mess with them in the shader\n\n  float4 proj = mul(Projection,float4((f.Position),1));   // Going from eye-space to clip-space.  To multiply the float4x4 projection matrix and float3 Position, we need to add a 4th component, 1.0.  \n    \n  proj /= proj.w;    // Divide to get from 4D clip to 3D NDC (normalized device coordinates)\n\n  f.TexCoord0 = proj.rgb * .5 + .5;   // Normalizing from [-1,1] to [0,1]\n\n float mask = EffectMask.Shade(f).a * Dissolve;  // We'll sample the alpha channel from the mask input with the new \n\n f.TexCoord0 = OldTexCoord0;  // Set the UV's back to the buffer values\n\n  float4 ret = lerp(BgMtl.Shade(f), FgMtl.Shade(f), mask);  // And use that to lerp between the Fg and Bg \n\n    return ret;\n\n}", },
  13.                 RCGroup = Input { Value = 1, },
  14.                 RCMatrices = Input { Value = 256, },
  15.                 MaterialGroup = Input { Value = 1, },
  16.                 FloatGroup = Input { Value = 1, },
  17.                 MaterialID = Input { Value = 1, },
  18.                 EffectMask = Input {
  19.                     CustomData = {
  20.                         Metadata = {
  21.                             Set = "EffectMask",
  22.                             Type = "Material",
  23.                         }
  24.                     },
  25.                 },
  26.                 BgMtl = Input {
  27.                     CustomData = {
  28.                         Metadata = {
  29.                             Set = "BgMtl",
  30.                             Type = "Material",
  31.                         }
  32.                     },
  33.                 },
  34.                 FgMtl = Input {
  35.                     CustomData = {
  36.                         Metadata = {
  37.                             Set = "FgMtl",
  38.                             Type = "Material",
  39.                         }
  40.                     },
  41.                 },
  42.                 Dissolve = Input {
  43.                     Value = 1,
  44.                     CustomData = {
  45.                         Metadata = {
  46.                             Type = "Float",
  47.                             Set = "Dissolve"
  48.                         }
  49.                     },
  50.                 },
  51.             },
  52.             ViewInfo = OperatorInfo {
  53.                 Pos = { 715, -49.5 },
  54.                 Flags = {
  55.                     ShowPic = true
  56.                 }
  57.             },
  58.             UserControls = ordered() {
  59.                 EffectMask = {
  60.                     {
  61.                         LINKID_DataType = "MtlGraph3D"
  62.                     },
  63.                     {
  64.                         LINKID_DataType = "Image"
  65.                     },
  66.                     {
  67.                         LINKID_AllowedDataType = "Image"
  68.                     },
  69.                     {
  70.                         LINKID_AllowedDataType = "Mask"
  71.                     },
  72.                     INP_AcceptsGLImages = true,
  73.                     LINK_Main = 3,
  74.                     INP_AcceptsMasks = true,
  75.                     INPID_InputControl = "ImageControl",
  76.                     INP_Required = false,
  77.                     IC_ControlPage = 0,
  78.                 },
  79.                 BgMtl = {
  80.                     {
  81.                         LINKID_DataType = "MtlGraph3D"
  82.                     },
  83.                     {
  84.                         LINKID_DataType = "Image"
  85.                     },
  86.                     {
  87.                         LINKID_AllowedDataType = "Image"
  88.                     },
  89.                     {
  90.                         LINKID_AllowedDataType = "Mask"
  91.                     },
  92.                     INP_AcceptsGLImages = true,
  93.                     LINK_Main = 1,
  94.                     INP_AcceptsMasks = true,
  95.                     INPID_InputControl = "ImageControl",
  96.                     INP_Required = false,
  97.                     IC_ControlPage = 0,
  98.                 },
  99.                 FgMtl = {
  100.                     {
  101.                         LINKID_DataType = "MtlGraph3D"
  102.                     },
  103.                     {
  104.                         LINKID_DataType = "Image"
  105.                     },
  106.                     {
  107.                         LINKID_AllowedDataType = "Image"
  108.                     },
  109.                     {
  110.                         LINKID_AllowedDataType = "Mask"
  111.                     },
  112.                     INP_AcceptsGLImages = true,
  113.                     LINK_Main = 2,
  114.                     INP_AcceptsMasks = true,
  115.                     INPID_InputControl = "ImageControl",
  116.                     INP_Required = false,
  117.                     IC_ControlPage = 0,
  118.                 },
  119.                 EffectMaskLabel = {
  120.                     IC_ControlPage = 1,
  121.                     ICD_Width = 0.9,
  122.                     INP_External = false,
  123.                     INPID_InputControl = "LabelControl",
  124.                     INP_Passive = true,
  125.                     ICS_Name = "EffectMask",
  126.                 },
  127.                 EffectMaskDeleteButton = {
  128.                     INP_DoNotifyChanged = 1,
  129.                     INP_External = 0,
  130.                     LINKID_DataType = "Number",
  131.                     ICD_Width = 0.1,
  132.                     ICS_Name = "",
  133.                     IC_ControlPage = 1,
  134.                     MBTNC_ButtonHeight = 18,
  135.                     INPID_InputControl = "MultiButtonControl",
  136.                     MBTNC_AddButton = "X",
  137.                     MBTNC_Type = "Toggle",
  138.                 },
  139.                 BgMtlLabel = {
  140.                     IC_ControlPage = 1,
  141.                     ICD_Width = 0.9,
  142.                     INP_External = false,
  143.                     INPID_InputControl = "LabelControl",
  144.                     INP_Passive = true,
  145.                     ICS_Name = "BgMtl",
  146.                 },
  147.                 BgMtlDeleteButton = {
  148.                     INP_DoNotifyChanged = 1,
  149.                     INP_External = 0,
  150.                     LINKID_DataType = "Number",
  151.                     ICD_Width = 0.1,
  152.                     ICS_Name = "",
  153.                     IC_ControlPage = 1,
  154.                     MBTNC_ButtonHeight = 18,
  155.                     INPID_InputControl = "MultiButtonControl",
  156.                     MBTNC_AddButton = "X",
  157.                     MBTNC_Type = "Toggle",
  158.                 },
  159.                 FgMtlLabel = {
  160.                     IC_ControlPage = 1,
  161.                     ICD_Width = 0.9,
  162.                     INP_External = false,
  163.                     INPID_InputControl = "LabelControl",
  164.                     INP_Passive = true,
  165.                     ICS_Name = "FgMtl",
  166.                 },
  167.                 FgMtlDeleteButton = {
  168.                     INP_DoNotifyChanged = 1,
  169.                     INP_External = 0,
  170.                     LINKID_DataType = "Number",
  171.                     ICD_Width = 0.1,
  172.                     ICS_Name = "",
  173.                     IC_ControlPage = 1,
  174.                     MBTNC_ButtonHeight = 18,
  175.                     INPID_InputControl = "MultiButtonControl",
  176.                     MBTNC_AddButton = "X",
  177.                     MBTNC_Type = "Toggle",
  178.                 },
  179.                 Dissolve = {
  180.                     LINKID_DataType = "Number",
  181.                     INPID_InputControl = "SliderControl",
  182.                     IC_ControlPage = 0,
  183.                 },
  184.                 DissolveLabel = {
  185.                     IC_ControlPage = 1,
  186.                     ICD_Width = 0.9,
  187.                     INP_External = false,
  188.                     INPID_InputControl = "LabelControl",
  189.                     INP_Passive = true,
  190.                     ICS_Name = "Dissolve",
  191.                 },
  192.                 DissolveDeleteButton = {
  193.                     INP_DoNotifyChanged = 1,
  194.                     INP_External = 0,
  195.                     LINKID_DataType = "Number",
  196.                     ICD_Width = 0.1,
  197.                     ICS_Name = "",
  198.                     IC_ControlPage = 1,
  199.                     MBTNC_ButtonHeight = 18,
  200.                     INPID_InputControl = "MultiButtonControl",
  201.                     MBTNC_AddButton = "X",
  202.                     MBTNC_Type = "Toggle",
  203.                 }
  204.             }
  205.         }
  206.     },
  207.     ActiveTool = "CustomShader3D_ScreenSpaceMask_1"
  208. }
You do not have the required permissions to view the files attached to this post.

User avatar
Chad
Fusionista
Posts: 925
Joined: Fri Aug 08, 2014 12:11 pm
Been thanked: 3 times

Re: CustomShader3D: Cg shader editing in your comp

Post #44 by Chad » Wed Aug 03, 2016 8:11 pm

Chad wrote:And as you can see, getting those first two blocks to turn into the third block probably isn't worth it. The compiler doesn't care, but you, as a human, aren't a good Cg compiler. :)



I thought I'd do a little sample of what that means in a practical sense with 3CuS.

Spoiler:
  1. {
  2.     Tools = ordered() {
  3.         fNormal = Indicated.CustomShaderOperator3D {
  4.             NameSet = true,
  5.             Inputs = {
  6.                 ShaderTextInputs = Input { Value = "FuFloat4 ChildMtl;\n\n", },
  7.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\n{\nreturn float4(f.Normal, 1);\n}", },
  8.                 RCGroup = Input { Value = 1, },
  9.                 MaterialGroup = Input { Value = 1, },
  10.                 MaterialID = Input { Value = 1, },
  11.                 ChildMtl = Input {
  12.                     CustomData = {
  13.                         Metadata = {
  14.                             Set = "ChildMtl",
  15.                             Type = "Material",
  16.                         }
  17.                     },
  18.                 },
  19.             },
  20.             ViewInfo = OperatorInfo { Pos = { -1265, 247.5 } },
  21.             UserControls = ordered() {
  22.                 ChildMtl = {
  23.                     {
  24.                         LINKID_DataType = "MtlGraph3D"
  25.                     },
  26.                     {
  27.                         LINKID_DataType = "Image"
  28.                     },
  29.                     {
  30.                         LINKID_AllowedDataType = "Image"
  31.                     },
  32.                     {
  33.                         LINKID_AllowedDataType = "Mask"
  34.                     },
  35.                     LINK_Main = 1,
  36.                     INP_AcceptsGLImages = true,
  37.                     INP_Required = false,
  38.                     IC_ControlPage = 0,
  39.                     INP_AcceptsMasks = true,
  40.                     INPID_InputControl = "ImageControl",
  41.                 },
  42.                 ChildMtlLabel = {
  43.                     INPID_InputControl = "LabelControl",
  44.                     IC_ControlPage = 1,
  45.                     ICS_Name = "ChildMtl",
  46.                     ICD_Width = 0.9,
  47.                     INP_Passive = true,
  48.                     INP_External = false,
  49.                 },
  50.                 ChildMtlDeleteButton = {
  51.                     LINKID_DataType = "Number",
  52.                     INPID_InputControl = "MultiButtonControl",
  53.                     INP_DoNotifyChanged = 1,
  54.                     MBTNC_AddButton = "X",
  55.                     MBTNC_Type = "Toggle",
  56.                     ICD_Width = 0.1,
  57.                     INP_External = 0,
  58.                     ICS_Name = "",
  59.                     IC_ControlPage = 1,
  60.                     MBTNC_ButtonHeight = 18,
  61.                 }
  62.             }
  63.         },
  64.         NormalizeRGB_2 = Indicated.CustomShaderOperator3D {
  65.             NameSet = true,
  66.             Inputs = {
  67.                 ShaderTextInputs = Input { Value = "FuFloat4 ChildMtl;\n\n", },
  68.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\n{\nreturn float4(normalize(ChildMtl.Shade(f).rgb), 1);\n}", },
  69.                 RCGroup = Input { Value = 1, },
  70.                 MaterialID = Input { Value = 1, },
  71.                 ChildMtl = Input {
  72.                     SourceOp = "fNormal",
  73.                     Source = "MaterialOutput",
  74.                     CustomData = {
  75.                         Metadata = {
  76.                             Set = "ChildMtl",
  77.                             Type = "Material",
  78.                         }
  79.                     },
  80.                 },
  81.             },
  82.             ViewInfo = OperatorInfo { Pos = { -1155, 247.5 } },
  83.             UserControls = ordered() {
  84.                 ChildMtl = {
  85.                     {
  86.                         LINKID_DataType = "MtlGraph3D"
  87.                     },
  88.                     {
  89.                         LINKID_DataType = "Image"
  90.                     },
  91.                     {
  92.                         LINKID_AllowedDataType = "Image"
  93.                     },
  94.                     {
  95.                         LINKID_AllowedDataType = "Mask"
  96.                     },
  97.                     LINK_Main = 1,
  98.                     INP_AcceptsGLImages = true,
  99.                     INP_Required = false,
  100.                     IC_ControlPage = 0,
  101.                     INP_AcceptsMasks = true,
  102.                     INPID_InputControl = "ImageControl",
  103.                 },
  104.                 ChildMtlLabel = {
  105.                     INPID_InputControl = "LabelControl",
  106.                     IC_ControlPage = 1,
  107.                     ICS_Name = "ChildMtl",
  108.                     ICD_Width = 0.9,
  109.                     INP_Passive = true,
  110.                     INP_External = false,
  111.                 },
  112.                 ChildMtlDeleteButton = {
  113.                     LINKID_DataType = "Number",
  114.                     INPID_InputControl = "MultiButtonControl",
  115.                     INP_DoNotifyChanged = 1,
  116.                     MBTNC_AddButton = "X",
  117.                     MBTNC_Type = "Toggle",
  118.                     ICD_Width = 0.1,
  119.                     INP_External = 0,
  120.                     ICS_Name = "",
  121.                     IC_ControlPage = 1,
  122.                     MBTNC_ButtonHeight = 18,
  123.                 }
  124.             }
  125.         },
  126.         Pow_1 = Indicated.CustomShaderOperator3D {
  127.             NameSet = true,
  128.             Inputs = {
  129.                 ShaderTextInputs = Input { Value = "FuFloat4 ChildMtl;\nFuFloat4 ExponentMtl;\n\n", },
  130.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\n{\n\nreturn float4(pow(ChildMtl.Shade(f).rgb, ExponentMtl.Shade(f).rgb), 1);\n\n}", },
  131.                 MaterialGroup = Input { Value = 1, },
  132.                 MaterialID = Input { Value = 8, },
  133.                 ChildMtl = Input {
  134.                     SourceOp = "InvertRGB",
  135.                     Source = "MaterialOutput",
  136.                     CustomData = {
  137.                         Metadata = {
  138.                             Type = "Material",
  139.                             Set = "ChildMtl",
  140.                         }
  141.                     },
  142.                 },
  143.                 ExponentMtl = Input {
  144.                     SourceOp = "ConstantValue",
  145.                     Source = "MaterialOutput",
  146.                     CustomData = {
  147.                         Metadata = {
  148.                             Type = "Material",
  149.                             Set = "ExponentMtl",
  150.                         }
  151.                     },
  152.                 },
  153.             },
  154.             ViewInfo = OperatorInfo { Pos = { -605, 280.5 } },
  155.             UserControls = ordered() {
  156.                 ChildMtl = {
  157.                     {
  158.                         LINKID_DataType = "MtlGraph3D"
  159.                     },
  160.                     {
  161.                         LINKID_DataType = "Image"
  162.                     },
  163.                     {
  164.                         LINKID_AllowedDataType = "Image"
  165.                     },
  166.                     {
  167.                         LINKID_AllowedDataType = "Mask"
  168.                     },
  169.                     INP_AcceptsGLImages = true,
  170.                     LINK_Main = 1,
  171.                     INP_AcceptsMasks = true,
  172.                     INPID_InputControl = "ImageControl",
  173.                     INP_Required = false,
  174.                     IC_ControlPage = 0,
  175.                 },
  176.                 ChildMtlLabel = {
  177.                     INPID_InputControl = "LabelControl",
  178.                     IC_ControlPage = 1,
  179.                     ICS_Name = "ChildMtl",
  180.                     ICD_Width = 0.9,
  181.                     INP_Passive = true,
  182.                     INP_External = false,
  183.                 },
  184.                 ChildMtlDeleteButton = {
  185.                     LINKID_DataType = "Number",
  186.                     INPID_InputControl = "MultiButtonControl",
  187.                     INP_DoNotifyChanged = 1,
  188.                     MBTNC_AddButton = "X",
  189.                     MBTNC_Type = "Toggle",
  190.                     ICD_Width = 0.1,
  191.                     INP_External = 0,
  192.                     ICS_Name = "",
  193.                     IC_ControlPage = 1,
  194.                     MBTNC_ButtonHeight = 18,
  195.                 },
  196.                 ExponentMtl = {
  197.                     {
  198.                         LINKID_DataType = "MtlGraph3D"
  199.                     },
  200.                     {
  201.                         LINKID_DataType = "Image"
  202.                     },
  203.                     {
  204.                         LINKID_AllowedDataType = "Image"
  205.                     },
  206.                     {
  207.                         LINKID_AllowedDataType = "Mask"
  208.                     },
  209.                     INP_AcceptsGLImages = true,
  210.                     LINK_Main = 2,
  211.                     INP_AcceptsMasks = true,
  212.                     INPID_InputControl = "ImageControl",
  213.                     INP_Required = false,
  214.                     IC_ControlPage = 0,
  215.                 },
  216.                 ExponentMtlLabel = {
  217.                     INPID_InputControl = "LabelControl",
  218.                     IC_ControlPage = 1,
  219.                     ICS_Name = "ExponentMtl",
  220.                     ICD_Width = 0.9,
  221.                     INP_Passive = true,
  222.                     INP_External = false,
  223.                 },
  224.                 ExponentMtlDeleteButton = {
  225.                     LINKID_DataType = "Number",
  226.                     INPID_InputControl = "MultiButtonControl",
  227.                     INP_DoNotifyChanged = 1,
  228.                     MBTNC_AddButton = "X",
  229.                     MBTNC_Type = "Toggle",
  230.                     ICD_Width = 0.1,
  231.                     INP_External = 0,
  232.                     ICS_Name = "",
  233.                     IC_ControlPage = 1,
  234.                     MBTNC_ButtonHeight = 18,
  235.                 }
  236.             }
  237.         },
  238.         InvertRGB = Indicated.CustomShaderOperator3D {
  239.             NameSet = true,
  240.             Inputs = {
  241.                 ShaderTextInputs = Input { Value = "FuFloat4 ChildMtl;\n\n", },
  242.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\n{\n\nreturn float4(1-ChildMtl.Shade(f).rgb, 1);\n\n}", },
  243.                 MaterialID = Input { Value = 8, },
  244.                 ChildMtl = Input {
  245.                     SourceOp = "Saturate",
  246.                     Source = "MaterialOutput",
  247.                     CustomData = {
  248.                         Metadata = {
  249.                             Type = "Material",
  250.                             Set = "ChildMtl"
  251.                         }
  252.                     },
  253.                 },
  254.             },
  255.             ViewInfo = OperatorInfo { Pos = { -715, 280.5 } },
  256.             UserControls = ordered() {
  257.                 ChildMtl = {
  258.                     {
  259.                         LINKID_DataType = "MtlGraph3D"
  260.                     },
  261.                     {
  262.                         LINKID_DataType = "Image"
  263.                     },
  264.                     {
  265.                         LINKID_AllowedDataType = "Image"
  266.                     },
  267.                     {
  268.                         LINKID_AllowedDataType = "Mask"
  269.                     },
  270.                     INP_AcceptsGLImages = true,
  271.                     LINK_Main = 1,
  272.                     INP_AcceptsMasks = true,
  273.                     INPID_InputControl = "ImageControl",
  274.                     INP_Required = false,
  275.                     IC_ControlPage = 0,
  276.                 },
  277.                 ChildMtlLabel = {
  278.                     IC_ControlPage = 1,
  279.                     ICD_Width = 0.9,
  280.                     INP_External = false,
  281.                     INPID_InputControl = "LabelControl",
  282.                     INP_Passive = true,
  283.                     ICS_Name = "ChildMtl",
  284.                 },
  285.                 ChildMtlDeleteButton = {
  286.                     INP_DoNotifyChanged = 1,
  287.                     INP_External = 0,
  288.                     LINKID_DataType = "Number",
  289.                     ICD_Width = 0.1,
  290.                     ICS_Name = "",
  291.                     IC_ControlPage = 1,
  292.                     MBTNC_ButtonHeight = 18,
  293.                     INPID_InputControl = "MultiButtonControl",
  294.                     MBTNC_AddButton = "X",
  295.                     MBTNC_Type = "Toggle",
  296.                 }
  297.             }
  298.         },
  299.         DotRGB = Indicated.CustomShaderOperator3D {
  300.             NameSet = true,
  301.             Inputs = {
  302.                 ShaderTextInputs = Input { Value = "FuFloat4 MtlA;\nFuFloat4 MtlB;\n\n", },
  303.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\n{\n\nreturn float4(float3(dot(MtlA.Shade(f).rgb, MtlB.Shade(f).rgb)), 1.0);\n\n}", },
  304.                 MaterialGroup = Input { Value = 1, },
  305.                 MaterialID = Input { Value = 4, },
  306.                 MtlA = Input {
  307.                     SourceOp = "NegateRGB",
  308.                     Source = "MaterialOutput",
  309.                     CustomData = {
  310.                         Metadata = {
  311.                             Set = "MtlA",
  312.                             Type = "Material",
  313.                         }
  314.                     },
  315.                 },
  316.                 MtlB = Input {
  317.                     SourceOp = "NormalizeRGB_2",
  318.                     Source = "MaterialOutput",
  319.                     CustomData = {
  320.                         Metadata = {
  321.                             Set = "MtlB",
  322.                             Type = "Material",
  323.                         }
  324.                     },
  325.                 },
  326.             },
  327.             ViewInfo = OperatorInfo { Pos = { -935, 280.5 } },
  328.             UserControls = ordered() {
  329.                 MtlA = {
  330.                     {
  331.                         LINKID_DataType = "MtlGraph3D"
  332.                     },
  333.                     {
  334.                         LINKID_DataType = "Image"
  335.                     },
  336.                     {
  337.                         LINKID_AllowedDataType = "Image"
  338.                     },
  339.                     {
  340.                         LINKID_AllowedDataType = "Mask"
  341.                     },
  342.                     LINK_Main = 1,
  343.                     INP_AcceptsGLImages = true,
  344.                     INP_Required = false,
  345.                     IC_ControlPage = 0,
  346.                     INP_AcceptsMasks = true,
  347.                     INPID_InputControl = "ImageControl",
  348.                 },
  349.                 MtlALabel = {
  350.                     INPID_InputControl = "LabelControl",
  351.                     IC_ControlPage = 1,
  352.                     ICS_Name = "MtlA",
  353.                     ICD_Width = 0.9,
  354.                     INP_Passive = true,
  355.                     INP_External = false,
  356.                 },
  357.                 MtlADeleteButton = {
  358.                     LINKID_DataType = "Number",
  359.                     INPID_InputControl = "MultiButtonControl",
  360.                     INP_DoNotifyChanged = 1,
  361.                     MBTNC_AddButton = "X",
  362.                     MBTNC_Type = "Toggle",
  363.                     ICD_Width = 0.1,
  364.                     INP_External = 0,
  365.                     ICS_Name = "",
  366.                     IC_ControlPage = 1,
  367.                     MBTNC_ButtonHeight = 18,
  368.                 },
  369.                 MtlB = {
  370.                     {
  371.                         LINKID_DataType = "MtlGraph3D"
  372.                     },
  373.                     {
  374.                         LINKID_DataType = "Image"
  375.                     },
  376.                     {
  377.                         LINKID_AllowedDataType = "Image"
  378.                     },
  379.                     {
  380.                         LINKID_AllowedDataType = "Mask"
  381.                     },
  382.                     LINK_Main = 2,
  383.                     INP_AcceptsGLImages = true,
  384.                     INP_Required = false,
  385.                     IC_ControlPage = 0,
  386.                     INP_AcceptsMasks = true,
  387.                     INPID_InputControl = "ImageControl",
  388.                 },
  389.                 MtlBLabel = {
  390.                     INPID_InputControl = "LabelControl",
  391.                     IC_ControlPage = 1,
  392.                     ICS_Name = "MtlB",
  393.                     ICD_Width = 0.9,
  394.                     INP_Passive = true,
  395.                     INP_External = false,
  396.                 },
  397.                 MtlBDeleteButton = {
  398.                     LINKID_DataType = "Number",
  399.                     INPID_InputControl = "MultiButtonControl",
  400.                     INP_DoNotifyChanged = 1,
  401.                     MBTNC_AddButton = "X",
  402.                     MBTNC_Type = "Toggle",
  403.                     ICD_Width = 0.1,
  404.                     INP_External = 0,
  405.                     ICS_Name = "",
  406.                     IC_ControlPage = 1,
  407.                     MBTNC_ButtonHeight = 18,
  408.                 }
  409.             }
  410.         },
  411.         Saturate = Indicated.CustomShaderOperator3D {
  412.             NameSet = true,
  413.             Inputs = {
  414.                 ShaderTextInputs = Input { Value = "FuFloat4 ChildMtl;\n\n", },
  415.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\n{\n\nreturn saturate(ChildMtl.Shade(f));\n\n}", },
  416.                 MaterialID = Input { Value = 8, },
  417.                 ChildMtl = Input {
  418.                     SourceOp = "DotRGB",
  419.                     Source = "MaterialOutput",
  420.                     CustomData = {
  421.                         Metadata = {
  422.                             Type = "Material",
  423.                             Set = "ChildMtl"
  424.                         }
  425.                     },
  426.                 },
  427.             },
  428.             ViewInfo = OperatorInfo { Pos = { -825, 280.5 } },
  429.             UserControls = ordered() {
  430.                 ChildMtl = {
  431.                     {
  432.                         LINKID_DataType = "MtlGraph3D"
  433.                     },
  434.                     {
  435.                         LINKID_DataType = "Image"
  436.                     },
  437.                     {
  438.                         LINKID_AllowedDataType = "Image"
  439.                     },
  440.                     {
  441.                         LINKID_AllowedDataType = "Mask"
  442.                     },
  443.                     INP_AcceptsGLImages = true,
  444.                     LINK_Main = 1,
  445.                     INP_AcceptsMasks = true,
  446.                     INPID_InputControl = "ImageControl",
  447.                     INP_Required = false,
  448.                     IC_ControlPage = 0,
  449.                 },
  450.                 ChildMtlLabel = {
  451.                     IC_ControlPage = 1,
  452.                     ICD_Width = 0.9,
  453.                     INP_External = false,
  454.                     INPID_InputControl = "LabelControl",
  455.                     INP_Passive = true,
  456.                     ICS_Name = "ChildMtl",
  457.                 },
  458.                 ChildMtlDeleteButton = {
  459.                     INP_DoNotifyChanged = 1,
  460.                     INP_External = 0,
  461.                     LINKID_DataType = "Number",
  462.                     ICD_Width = 0.1,
  463.                     ICS_Name = "",
  464.                     IC_ControlPage = 1,
  465.                     MBTNC_ButtonHeight = 18,
  466.                     INPID_InputControl = "MultiButtonControl",
  467.                     MBTNC_AddButton = "X",
  468.                     MBTNC_Type = "Toggle",
  469.                 }
  470.             }
  471.         },
  472.         LookupUVW = Indicated.CustomShaderOperator3D {
  473.             NameSet = true,
  474.             Inputs = {
  475.                 ShaderTextInputs = Input { Value = "FuFloat4 MappingMtl;\nFuFloat4 LookupMtl;\n\n", },
  476.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\n{\n\nfloat3 OldUVWs = f.TexCoord0;\n\nf.TexCoord0 = MappingMtl.Shade(f).rgb;\n\nfloat4 ret = LookupMtl.Shade(f);\n\nf.TexCoord0 = OldUVWs;\n\nreturn ret;\n\n}", },
  477.                 MaterialGroup = Input { Value = 1, },
  478.                 MaterialID = Input { Value = 8, },
  479.                 MappingMtl = Input {
  480.                     SourceOp = "Pow_1",
  481.                     Source = "MaterialOutput",
  482.                     CustomData = {
  483.                         Metadata = {
  484.                             Type = "Material",
  485.                             Set = "MappingMtl",
  486.                         }
  487.                     },
  488.                 },
  489.                 LookupMtl = Input {
  490.                     SourceOp = "Background1",
  491.                     Source = "Output",
  492.                     CustomData = {
  493.                         Metadata = {
  494.                             Type = "Material",
  495.                             Set = "LookupMtl",
  496.                         }
  497.                     },
  498.                 },
  499.             },
  500.             ViewInfo = OperatorInfo { Pos = { -385, 280.5 } },
  501.             UserControls = ordered() {
  502.                 MappingMtl = {
  503.                     {
  504.                         LINKID_DataType = "MtlGraph3D"
  505.                     },
  506.                     {
  507.                         LINKID_DataType = "Image"
  508.                     },
  509.                     {
  510.                         LINKID_AllowedDataType = "Image"
  511.                     },
  512.                     {
  513.                         LINKID_AllowedDataType = "Mask"
  514.                     },
  515.                     INP_AcceptsGLImages = true,
  516.                     LINK_Main = 1,
  517.                     INP_AcceptsMasks = true,
  518.                     INPID_InputControl = "ImageControl",
  519.                     INP_Required = false,
  520.                     IC_ControlPage = 0,
  521.                 },
  522.                 MappingMtlLabel = {
  523.                     INPID_InputControl = "LabelControl",
  524.                     IC_ControlPage = 1,
  525.                     ICS_Name = "MappingMtl",
  526.                     ICD_Width = 0.9,
  527.                     INP_Passive = true,
  528.                     INP_External = false,
  529.                 },
  530.                 MappingMtlDeleteButton = {
  531.                     LINKID_DataType = "Number",
  532.                     INPID_InputControl = "MultiButtonControl",
  533.                     INP_DoNotifyChanged = 1,
  534.                     MBTNC_AddButton = "X",
  535.                     MBTNC_Type = "Toggle",
  536.                     ICD_Width = 0.1,
  537.                     INP_External = 0,
  538.                     ICS_Name = "",
  539.                     IC_ControlPage = 1,
  540.                     MBTNC_ButtonHeight = 18,
  541.                 },
  542.                 LookupMtl = {
  543.                     {
  544.                         LINKID_DataType = "MtlGraph3D"
  545.                     },
  546.                     {
  547.                         LINKID_DataType = "Image"
  548.                     },
  549.                     {
  550.                         LINKID_AllowedDataType = "Image"
  551.                     },
  552.                     {
  553.                         LINKID_AllowedDataType = "Mask"
  554.                     },
  555.                     INP_AcceptsGLImages = true,
  556.                     LINK_Main = 2,
  557.                     INP_AcceptsMasks = true,
  558.                     INPID_InputControl = "ImageControl",
  559.                     INP_Required = false,
  560.                     IC_ControlPage = 0,
  561.                 },
  562.                 LookupMtlLabel = {
  563.                     INPID_InputControl = "LabelControl",
  564.                     IC_ControlPage = 1,
  565.                     ICS_Name = "LookupMtl",
  566.                     ICD_Width = 0.9,
  567.                     INP_Passive = true,
  568.                     INP_External = false,
  569.                 },
  570.                 LookupMtlDeleteButton = {
  571.                     LINKID_DataType = "Number",
  572.                     INPID_InputControl = "MultiButtonControl",
  573.                     INP_DoNotifyChanged = 1,
  574.                     MBTNC_AddButton = "X",
  575.                     MBTNC_Type = "Toggle",
  576.                     ICD_Width = 0.1,
  577.                     INP_External = 0,
  578.                     ICS_Name = "",
  579.                     IC_ControlPage = 1,
  580.                     MBTNC_ButtonHeight = 18,
  581.                 }
  582.             }
  583.         },
  584.         ConstantValue = Indicated.CustomShaderOperator3D {
  585.             NameSet = true,
  586.             Inputs = {
  587.                 ShaderTextInputs = Input { Value = "float Value;\n\n", },
  588.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\n{\nreturn float(Value);\n}", },
  589.                 RCGroup = Input { Value = 1, },
  590.                 MaterialGroup = Input { Value = 1, },
  591.                 FloatGroup = Input { Value = 1, },
  592.                 MaterialID = Input { Value = 1, },
  593.                 Value = Input {
  594.                     Value = 2.25,
  595.                     CustomData = {
  596.                         Metadata = {
  597.                             Set = "Value",
  598.                             Type = "Float",
  599.                         }
  600.                     },
  601.                 },
  602.             },
  603.             ViewInfo = OperatorInfo { Pos = { -660, 313.5 } },
  604.             UserControls = ordered() {
  605.                 Value = {
  606.                     IC_ControlPage = 0,
  607.                     INPID_InputControl = "SliderControl",
  608.                     LINKID_DataType = "Number",
  609.                 },
  610.                 ValueLabel = {
  611.                     INPID_InputControl = "LabelControl",
  612.                     IC_ControlPage = 1,
  613.                     ICS_Name = "Value",
  614.                     ICD_Width = 0.9,
  615.                     INP_Passive = true,
  616.                     INP_External = false,
  617.                 },
  618.                 ValueDeleteButton = {
  619.                     LINKID_DataType = "Number",
  620.                     INPID_InputControl = "MultiButtonControl",
  621.                     INP_DoNotifyChanged = 1,
  622.                     MBTNC_AddButton = "X",
  623.                     MBTNC_Type = "Toggle",
  624.                     ICD_Width = 0.1,
  625.                     INP_External = 0,
  626.                     ICS_Name = "",
  627.                     IC_ControlPage = 1,
  628.                     MBTNC_ButtonHeight = 18,
  629.                 }
  630.             }
  631.         },
  632.         NegateRGB = Indicated.CustomShaderOperator3D {
  633.             NameSet = true,
  634.             Inputs = {
  635.                 ShaderTextInputs = Input { Value = "FuFloat4 ChildMtl;\n\n", },
  636.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\n{\nreturn float4(-ChildMtl.Shade(f).rgb, 1);\n}", },
  637.                 RCGroup = Input { Value = 1, },
  638.                 MaterialID = Input { Value = 1, },
  639.                 ChildMtl = Input {
  640.                     SourceOp = "NormalizeRGB",
  641.                     Source = "MaterialOutput",
  642.                     CustomData = {
  643.                         Metadata = {
  644.                             Set = "ChildMtl",
  645.                             Type = "Material",
  646.                         }
  647.                     },
  648.                 },
  649.             },
  650.             ViewInfo = OperatorInfo { Pos = { -1045, 313.5 } },
  651.             UserControls = ordered() {
  652.                 ChildMtl = {
  653.                     {
  654.                         LINKID_DataType = "MtlGraph3D"
  655.                     },
  656.                     {
  657.                         LINKID_DataType = "Image"
  658.                     },
  659.                     {
  660.                         LINKID_AllowedDataType = "Image"
  661.                     },
  662.                     {
  663.                         LINKID_AllowedDataType = "Mask"
  664.                     },
  665.                     LINK_Main = 1,
  666.                     INP_AcceptsGLImages = true,
  667.                     INP_Required = false,
  668.                     IC_ControlPage = 0,
  669.                     INP_AcceptsMasks = true,
  670.                     INPID_InputControl = "ImageControl",
  671.                 },
  672.                 ChildMtlLabel = {
  673.                     INPID_InputControl = "LabelControl",
  674.                     IC_ControlPage = 1,
  675.                     ICS_Name = "ChildMtl",
  676.                     ICD_Width = 0.9,
  677.                     INP_Passive = true,
  678.                     INP_External = false,
  679.                 },
  680.                 ChildMtlDeleteButton = {
  681.                     LINKID_DataType = "Number",
  682.                     INPID_InputControl = "MultiButtonControl",
  683.                     INP_DoNotifyChanged = 1,
  684.                     MBTNC_AddButton = "X",
  685.                     MBTNC_Type = "Toggle",
  686.                     ICD_Width = 0.1,
  687.                     INP_External = 0,
  688.                     ICS_Name = "",
  689.                     IC_ControlPage = 1,
  690.                     MBTNC_ButtonHeight = 18,
  691.                 }
  692.             }
  693.         },
  694.         NormalizeRGB = Indicated.CustomShaderOperator3D {
  695.             NameSet = true,
  696.             Inputs = {
  697.                 ShaderTextInputs = Input { Value = "FuFloat4 ChildMtl;\n\n", },
  698.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\n{\nreturn float4(normalize(ChildMtl.Shade(f).rgb), 1);\n}", },
  699.                 RCGroup = Input { Value = 1, },
  700.                 MaterialID = Input { Value = 1, },
  701.                 ChildMtl = Input {
  702.                     SourceOp = "fPosition",
  703.                     Source = "MaterialOutput",
  704.                     CustomData = {
  705.                         Metadata = {
  706.                             Set = "ChildMtl",
  707.                             Type = "Material",
  708.                         }
  709.                     },
  710.                 },
  711.             },
  712.             ViewInfo = OperatorInfo { Pos = { -1155, 313.5 } },
  713.             UserControls = ordered() {
  714.                 ChildMtl = {
  715.                     {
  716.                         LINKID_DataType = "MtlGraph3D"
  717.                     },
  718.                     {
  719.                         LINKID_DataType = "Image"
  720.                     },
  721.                     {
  722.                         LINKID_AllowedDataType = "Image"
  723.                     },
  724.                     {
  725.                         LINKID_AllowedDataType = "Mask"
  726.                     },
  727.                     LINK_Main = 1,
  728.                     INP_AcceptsGLImages = true,
  729.                     INP_Required = false,
  730.                     IC_ControlPage = 0,
  731.                     INP_AcceptsMasks = true,
  732.                     INPID_InputControl = "ImageControl",
  733.                 },
  734.                 ChildMtlLabel = {
  735.                     INPID_InputControl = "LabelControl",
  736.                     IC_ControlPage = 1,
  737.                     ICS_Name = "ChildMtl",
  738.                     ICD_Width = 0.9,
  739.                     INP_Passive = true,
  740.                     INP_External = false,
  741.                 },
  742.                 ChildMtlDeleteButton = {
  743.                     LINKID_DataType = "Number",
  744.                     INPID_InputControl = "MultiButtonControl",
  745.                     INP_DoNotifyChanged = 1,
  746.                     MBTNC_AddButton = "X",
  747.                     MBTNC_Type = "Toggle",
  748.                     ICD_Width = 0.1,
  749.                     INP_External = 0,
  750.                     ICS_Name = "",
  751.                     IC_ControlPage = 1,
  752.                     MBTNC_ButtonHeight = 18,
  753.                 }
  754.             }
  755.         },
  756.         fPosition = Indicated.CustomShaderOperator3D {
  757.             NameSet = true,
  758.             Inputs = {
  759.                 ShaderTextInputs = Input { Value = "FuFloat4 ChildMtl;\n\n", },
  760.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\n{\nreturn float4(f.Position, 1);\n}", },
  761.                 RCGroup = Input { Value = 1, },
  762.                 MaterialGroup = Input { Value = 1, },
  763.                 MaterialID = Input { Value = 1, },
  764.                 ChildMtl = Input {
  765.                     CustomData = {
  766.                         Metadata = {
  767.                             Type = "Material",
  768.                             Set = "ChildMtl"
  769.                         }
  770.                     },
  771.                 },
  772.             },
  773.             ViewInfo = OperatorInfo { Pos = { -1265, 313.5 } },
  774.             UserControls = ordered() {
  775.                 ChildMtl = {
  776.                     LINKID_DataType = "MtlGraph3D",
  777.                     IC_ControlPage = 0,
  778.                     LINKID_AllowedDataType = "Mask",
  779.                     INP_AcceptsMasks = 1,
  780.                     INP_AcceptsGLImages = 1,
  781.                     INPID_InputControl = "ImageControl",
  782.                     LINK_Main = 1,
  783.                     INP_Required = 0,
  784.                 },
  785.                 ChildMtlLabel = {
  786.                     INPID_InputControl = "LabelControl",
  787.                     IC_ControlPage = 1,
  788.                     ICS_Name = "ChildMtl",
  789.                     ICD_Width = 0.9,
  790.                     INP_Passive = true,
  791.                     INP_External = false,
  792.                 },
  793.                 ChildMtlDeleteButton = {
  794.                     LINKID_DataType = "Number",
  795.                     INPID_InputControl = "MultiButtonControl",
  796.                     INP_DoNotifyChanged = 1,
  797.                     MBTNC_AddButton = "X",
  798.                     MBTNC_Type = "Toggle",
  799.                     ICD_Width = 0.1,
  800.                     INP_External = 0,
  801.                     ICS_Name = "",
  802.                     IC_ControlPage = 1,
  803.                     MBTNC_ButtonHeight = 18,
  804.                 }
  805.             }
  806.         },
  807.         Lerp_1 = Indicated.CustomShaderOperator3D {
  808.             NameSet = true,
  809.             Inputs = {
  810.                 ShaderTextInputs = Input { Value = "FuFloat4 BgMtl;\nFuFloat4 FgMtl;\nFuFloat4 BlendMtl;\n\n", },
  811.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\n{\nreturn lerp(BgMtl.Shade(f), FgMtl.Shade(f), BlendMtl.Shade(f).a);\n}", },
  812.                 RCGroup = Input { Value = 1, },
  813.                 MaterialGroup = Input { Value = 1, },
  814.                 FloatGroup = Input { Value = 1, },
  815.                 MaterialID = Input { Value = 1, },
  816.                 BgMtl = Input {
  817.                     SourceOp = "LookupUVW",
  818.                     Source = "MaterialOutput",
  819.                     CustomData = {
  820.                         Metadata = {
  821.                             Set = "BgMtl",
  822.                             Type = "Material",
  823.                         }
  824.                     },
  825.                 },
  826.                 FgMtl = Input {
  827.                     SourceOp = "Lerp",
  828.                     Source = "MaterialOutput",
  829.                     CustomData = {
  830.                         Metadata = {
  831.                             Set = "FgMtl",
  832.                             Type = "Material",
  833.                         }
  834.                     },
  835.                 },
  836.                 BlendMtl = Input {
  837.                     SourceOp = "FastNoise1",
  838.                     Source = "Output",
  839.                     CustomData = {
  840.                         Metadata = {
  841.                             Set = "BlendMtl",
  842.                             Type = "Material",
  843.                         }
  844.                     },
  845.                 },
  846.             },
  847.             ViewInfo = OperatorInfo { Pos = { -220, 313.5 } },
  848.             UserControls = ordered() {
  849.                 BgMtl = {
  850.                     {
  851.                         LINKID_DataType = "MtlGraph3D"
  852.                     },
  853.                     {
  854.                         LINKID_DataType = "Image"
  855.                     },
  856.                     {
  857.                         LINKID_AllowedDataType = "Image"
  858.                     },
  859.                     {
  860.                         LINKID_AllowedDataType = "Mask"
  861.                     },
  862.                     INP_AcceptsGLImages = true,
  863.                     LINK_Main = 1,
  864.                     INP_AcceptsMasks = true,
  865.                     INPID_InputControl = "ImageControl",
  866.                     INP_Required = false,
  867.                     IC_ControlPage = 0
  868.                 },
  869.                 BgMtlLabel = {
  870.                     IC_ControlPage = 1,
  871.                     ICD_Width = 0.9,
  872.                     INP_External = false,
  873.                     INPID_InputControl = "LabelControl",
  874.                     INP_Passive = true,
  875.                     ICS_Name = "BgMtl"
  876.                 },
  877.                 BgMtlDeleteButton = {
  878.                     INP_DoNotifyChanged = 1,
  879.                     INP_External = 0,
  880.                     LINKID_DataType = "Number",
  881.                     ICD_Width = 0.1,
  882.                     ICS_Name = "",
  883.                     IC_ControlPage = 1,
  884.                     MBTNC_ButtonHeight = 18,
  885.                     INPID_InputControl = "MultiButtonControl",
  886.                     MBTNC_AddButton = "X",
  887.                     MBTNC_Type = "Toggle"
  888.                 },
  889.                 FgMtl = {
  890.                     {
  891.                         LINKID_DataType = "MtlGraph3D"
  892.                     },
  893.                     {
  894.                         LINKID_DataType = "Image"
  895.                     },
  896.                     {
  897.                         LINKID_AllowedDataType = "Image"
  898.                     },
  899.                     {
  900.                         LINKID_AllowedDataType = "Mask"
  901.                     },
  902.                     INP_AcceptsGLImages = true,
  903.                     LINK_Main = 2,
  904.                     INP_AcceptsMasks = true,
  905.                     INPID_InputControl = "ImageControl",
  906.                     INP_Required = false,
  907.                     IC_ControlPage = 0
  908.                 },
  909.                 FgMtlLabel = {
  910.                     IC_ControlPage = 1,
  911.                     ICD_Width = 0.9,
  912.                     INP_External = false,
  913.                     INPID_InputControl = "LabelControl",
  914.                     INP_Passive = true,
  915.                     ICS_Name = "FgMtl"
  916.                 },
  917.                 FgMtlDeleteButton = {
  918.                     INP_DoNotifyChanged = 1,
  919.                     INP_External = 0,
  920.                     LINKID_DataType = "Number",
  921.                     ICD_Width = 0.1,
  922.                     ICS_Name = "",
  923.                     IC_ControlPage = 1,
  924.                     MBTNC_ButtonHeight = 18,
  925.                     INPID_InputControl = "MultiButtonControl",
  926.                     MBTNC_AddButton = "X",
  927.                     MBTNC_Type = "Toggle"
  928.                 },
  929.                 BlendMtl = {
  930.                     {
  931.                         LINKID_DataType = "MtlGraph3D"
  932.                     },
  933.                     {
  934.                         LINKID_DataType = "Image"
  935.                     },
  936.                     {
  937.                         LINKID_AllowedDataType = "Image"
  938.                     },
  939.                     {
  940.                         LINKID_AllowedDataType = "Mask"
  941.                     },
  942.                     INP_AcceptsGLImages = true,
  943.                     LINK_Main = 3,
  944.                     INP_AcceptsMasks = true,
  945.                     INPID_InputControl = "ImageControl",
  946.                     INP_Required = false,
  947.                     IC_ControlPage = 0
  948.                 },
  949.                 BlendMtlLabel = {
  950.                     IC_ControlPage = 1,
  951.                     ICD_Width = 0.9,
  952.                     INP_External = false,
  953.                     INPID_InputControl = "LabelControl",
  954.                     INP_Passive = true,
  955.                     ICS_Name = "BlendMtl"
  956.                 },
  957.                 BlendMtlDeleteButton = {
  958.                     INP_DoNotifyChanged = 1,
  959.                     INP_External = 0,
  960.                     LINKID_DataType = "Number",
  961.                     ICD_Width = 0.1,
  962.                     ICS_Name = "",
  963.                     IC_ControlPage = 1,
  964.                     MBTNC_ButtonHeight = 18,
  965.                     INPID_InputControl = "MultiButtonControl",
  966.                     MBTNC_AddButton = "X",
  967.                     MBTNC_Type = "Toggle"
  968.                 },
  969.             }
  970.         },
  971.         ConstantColor_2 = Indicated.CustomShaderOperator3D {
  972.             NameSet = true,
  973.             Inputs = {
  974.                 ShaderTextInputs = Input { Value = "float4 Color;\n\n", },
  975.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\n{\nreturn Color;\n}", },
  976.                 RCGroup = Input { Value = 1, },
  977.                 MaterialGroup = Input { Value = 1, },
  978.                 FloatGroup = Input { Value = 1, },
  979.                 ColorGroup = Input { Value = 1, },
  980.                 MaterialID = Input { Value = 1, },
  981.                 ColorRed = Input {
  982.                     Value = 0.694080519796882,
  983.                     CustomData = {
  984.                         Metadata = {
  985.                             Set = "Color",
  986.                             Type = "Color",
  987.                         }
  988.                     },
  989.                 },
  990.                 ColorGreen = Input {
  991.                     Value = 0.141980290685736,
  992.                     CustomData = {
  993.                         Metadata = {
  994.                             Set = "Color",
  995.                             Type = "Color",
  996.                         }
  997.                     },
  998.                 },
  999.                 ColorBlue = Input {
  1000.                     Value = 0.0986891975410945,
  1001.                     CustomData = {
  1002.                         Metadata = {
  1003.                             Set = "Color",
  1004.                             Type = "Color",
  1005.                         }
  1006.                     },
  1007.                 },
  1008.                 ColorAlpha = Input {
  1009.                     CustomData = {
  1010.                         Metadata = {
  1011.                             Set = "Color",
  1012.                             Type = "Color",
  1013.                         }
  1014.                     },
  1015.                 },
  1016.             },
  1017.             ViewInfo = OperatorInfo { Pos = { -495, 346.5 } },
  1018.             UserControls = ordered() {
  1019.                 ColorRed = {
  1020.                     INPID_InputControl = "ColorControl",
  1021.                     IC_ControlPage = 0,
  1022.                     INP_MaxScale = 1,
  1023.                     INP_Default = 1,
  1024.                     INP_MinScale = 0,
  1025.                     LINKID_DataType = "Number",
  1026.                     IC_ControlID = 0,
  1027.                     ICS_Name = "Color",
  1028.                     IC_ControlGroup = 1,
  1029.                 },
  1030.                 ColorGreen = {
  1031.                     INPID_InputControl = "ColorControl",
  1032.                     INP_MinScale = 0,
  1033.                     INP_Default = 1,
  1034.                     LINKID_DataType = "Number",
  1035.                     IC_ControlID = 1,
  1036.                     IC_ControlPage = 0,
  1037.                     INP_MaxScale = 1,
  1038.                     IC_ControlGroup = 1,
  1039.                 },
  1040.                 ColorBlue = {
  1041.                     IC_ControlGroup = 1,
  1042.                     INP_MinScale = 0,
  1043.                     INPID_InputControl = "ColorControl",
  1044.                     LINKID_DataType = "Number",
  1045.                     IC_ControlID = 2,
  1046.                     IC_ControlPage = 0,
  1047.                     INP_MaxScale = 1,
  1048.                     INP_Default = 1,
  1049.                 },
  1050.                 ColorAlpha = {
  1051.                     INPID_InputControl = "ColorControl",
  1052.                     INP_MinScale = 0,
  1053.                     INP_Default = 1,
  1054.                     LINKID_DataType = "Number",
  1055.                     IC_ControlID = 3,
  1056.                     IC_ControlPage = 0,
  1057.                     INP_MaxScale = 1,
  1058.                     IC_ControlGroup = 1,
  1059.                 },
  1060.                 ColorLabel = {
  1061.                     INPID_InputControl = "LabelControl",
  1062.                     IC_ControlPage = 1,
  1063.                     ICS_Name = "Color",
  1064.                     ICD_Width = 0.9,
  1065.                     INP_Passive = true,
  1066.                     INP_External = false,
  1067.                 },
  1068.                 ColorDeleteButton = {
  1069.                     LINKID_DataType = "Number",
  1070.                     INPID_InputControl = "MultiButtonControl",
  1071.                     INP_DoNotifyChanged = 1,
  1072.                     MBTNC_AddButton = "X",
  1073.                     MBTNC_Type = "Toggle",
  1074.                     ICD_Width = 0.1,
  1075.                     INP_External = 0,
  1076.                     ICS_Name = "",
  1077.                     IC_ControlPage = 1,
  1078.                     MBTNC_ButtonHeight = 18,
  1079.                 }
  1080.             }
  1081.         },
  1082.         Lerp = Indicated.CustomShaderOperator3D {
  1083.             NameSet = true,
  1084.             Inputs = {
  1085.                 ShaderTextInputs = Input { Value = "FuFloat4 BgMtl;\nFuFloat4 FgMtl;\nFuFloat4 BlendMtl;\n\n", },
  1086.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\n{\nreturn lerp(BgMtl.Shade(f), FgMtl.Shade(f), BlendMtl.Shade(f).r);\n}", },
  1087.                 RCGroup = Input { Value = 1, },
  1088.                 MaterialGroup = Input { Value = 1, },
  1089.                 FloatGroup = Input { Value = 1, },
  1090.                 MaterialID = Input { Value = 1, },
  1091.                 BgMtl = Input {
  1092.                     SourceOp = "ConstantColor_2",
  1093.                     Source = "MaterialOutput",
  1094.                     CustomData = {
  1095.                         Metadata = {
  1096.                             Set = "BgMtl",
  1097.                             Type = "Material",
  1098.                         }
  1099.                     },
  1100.                 },
  1101.                 FgMtl = Input {
  1102.                     SourceOp = "ConstantColor_3",
  1103.                     Source = "MaterialOutput",
  1104.                     CustomData = {
  1105.                         Metadata = {
  1106.                             Set = "FgMtl",
  1107.                             Type = "Material",
  1108.                         }
  1109.                     },
  1110.                 },
  1111.                 BlendMtl = Input {
  1112.                     SourceOp = "Pow_1",
  1113.                     Source = "MaterialOutput",
  1114.                     CustomData = {
  1115.                         Metadata = {
  1116.                             Set = "BlendMtl",
  1117.                             Type = "Material",
  1118.                         }
  1119.                     },
  1120.                 },
  1121.             },
  1122.             ViewInfo = OperatorInfo { Pos = { -385, 346.5 } },
  1123.             UserControls = ordered() {
  1124.                 BgMtl = {
  1125.                     {
  1126.                         LINKID_DataType = "MtlGraph3D"
  1127.                     },
  1128.                     {
  1129.                         LINKID_DataType = "Image"
  1130.                     },
  1131.                     {
  1132.                         LINKID_AllowedDataType = "Image"
  1133.                     },
  1134.                     {
  1135.                         LINKID_AllowedDataType = "Mask"
  1136.                     },
  1137.                     INP_AcceptsGLImages = true,
  1138.                     LINK_Main = 1,
  1139.                     INP_AcceptsMasks = true,
  1140.                     INPID_InputControl = "ImageControl",
  1141.                     INP_Required = false,
  1142.                     IC_ControlPage = 0
  1143.                 },
  1144.                 BgMtlLabel = {
  1145.                     IC_ControlPage = 1,
  1146.                     ICD_Width = 0.9,
  1147.                     INP_External = false,
  1148.                     INPID_InputControl = "LabelControl",
  1149.                     INP_Passive = true,
  1150.                     ICS_Name = "BgMtl"
  1151.                 },
  1152.                 BgMtlDeleteButton = {
  1153.                     INP_DoNotifyChanged = 1,
  1154.                     INP_External = 0,
  1155.                     LINKID_DataType = "Number",
  1156.                     ICD_Width = 0.1,
  1157.                     ICS_Name = "",
  1158.                     IC_ControlPage = 1,
  1159.                     MBTNC_ButtonHeight = 18,
  1160.                     INPID_InputControl = "MultiButtonControl",
  1161.                     MBTNC_AddButton = "X",
  1162.                     MBTNC_Type = "Toggle"
  1163.                 },
  1164.                 FgMtl = {
  1165.                     {
  1166.                         LINKID_DataType = "MtlGraph3D"
  1167.                     },
  1168.                     {
  1169.                         LINKID_DataType = "Image"
  1170.                     },
  1171.                     {
  1172.                         LINKID_AllowedDataType = "Image"
  1173.                     },
  1174.                     {
  1175.                         LINKID_AllowedDataType = "Mask"
  1176.                     },
  1177.                     INP_AcceptsGLImages = true,
  1178.                     LINK_Main = 2,
  1179.                     INP_AcceptsMasks = true,
  1180.                     INPID_InputControl = "ImageControl",
  1181.                     INP_Required = false,
  1182.                     IC_ControlPage = 0
  1183.                 },
  1184.                 FgMtlLabel = {
  1185.                     IC_ControlPage = 1,
  1186.                     ICD_Width = 0.9,
  1187.                     INP_External = false,
  1188.                     INPID_InputControl = "LabelControl",
  1189.                     INP_Passive = true,
  1190.                     ICS_Name = "FgMtl"
  1191.                 },
  1192.                 FgMtlDeleteButton = {
  1193.                     INP_DoNotifyChanged = 1,
  1194.                     INP_External = 0,
  1195.                     LINKID_DataType = "Number",
  1196.                     ICD_Width = 0.1,
  1197.                     ICS_Name = "",
  1198.                     IC_ControlPage = 1,
  1199.                     MBTNC_ButtonHeight = 18,
  1200.                     INPID_InputControl = "MultiButtonControl",
  1201.                     MBTNC_AddButton = "X",
  1202.                     MBTNC_Type = "Toggle"
  1203.                 },
  1204.                 BlendMtl = {
  1205.                     {
  1206.                         LINKID_DataType = "MtlGraph3D"
  1207.                     },
  1208.                     {
  1209.                         LINKID_DataType = "Image"
  1210.                     },
  1211.                     {
  1212.                         LINKID_AllowedDataType = "Image"
  1213.                     },
  1214.                     {
  1215.                         LINKID_AllowedDataType = "Mask"
  1216.                     },
  1217.                     INP_AcceptsGLImages = true,
  1218.                     LINK_Main = 3,
  1219.                     INP_AcceptsMasks = true,
  1220.                     INPID_InputControl = "ImageControl",
  1221.                     INP_Required = false,
  1222.                     IC_ControlPage = 0
  1223.                 },
  1224.                 BlendMtlLabel = {
  1225.                     IC_ControlPage = 1,
  1226.                     ICD_Width = 0.9,
  1227.                     INP_External = false,
  1228.                     INPID_InputControl = "LabelControl",
  1229.                     INP_Passive = true,
  1230.                     ICS_Name = "BlendMtl"
  1231.                 },
  1232.                 BlendMtlDeleteButton = {
  1233.                     INP_DoNotifyChanged = 1,
  1234.                     INP_External = 0,
  1235.                     LINKID_DataType = "Number",
  1236.                     ICD_Width = 0.1,
  1237.                     ICS_Name = "",
  1238.                     IC_ControlPage = 1,
  1239.                     MBTNC_ButtonHeight = 18,
  1240.                     INPID_InputControl = "MultiButtonControl",
  1241.                     MBTNC_AddButton = "X",
  1242.                     MBTNC_Type = "Toggle"
  1243.                 },
  1244.             }
  1245.         },
  1246.         Background1 = Background {
  1247.             Inputs = {
  1248.                 Width = Input { Value = 1920, },
  1249.                 Height = Input { Value = 1080, },
  1250.                 ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
  1251.                 Type = Input { Value = FuID { "Gradient" }, },
  1252.                 Gradient = Input {
  1253.                     Value = Gradient {
  1254.                         Colors = {
  1255.                             [0] = { 0.15390625, 0, 0, 1 },
  1256.                             [0.3804034582133] = { 0.4757632384726, 0.442252262148447, 0.204249160282051, 1 },
  1257.                             [1] = { 1, 0.924751582725113, 0.844507949470792, 1 }
  1258.                         }
  1259.                     },
  1260.                 },
  1261.             },
  1262.             ViewInfo = OperatorInfo { Pos = { -55, 82.5 } },
  1263.         },
  1264.         ConstantColor_3 = Indicated.CustomShaderOperator3D {
  1265.             NameSet = true,
  1266.             Inputs = {
  1267.                 ShaderTextInputs = Input { Value = "float4 Color;\n\n", },
  1268.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\n{\nreturn Color;\n}", },
  1269.                 RCGroup = Input { Value = 1, },
  1270.                 MaterialGroup = Input { Value = 1, },
  1271.                 FloatGroup = Input { Value = 1, },
  1272.                 ColorGroup = Input { Value = 1, },
  1273.                 MaterialID = Input { Value = 1, },
  1274.                 ColorRed = Input {
  1275.                     Value = 0.176774321640903,
  1276.                     CustomData = {
  1277.                         Metadata = {
  1278.                             Set = "Color",
  1279.                             Type = "Color",
  1280.                         }
  1281.                     },
  1282.                 },
  1283.                 ColorGreen = Input {
  1284.                     Value = 0.666116968775851,
  1285.                     CustomData = {
  1286.                         Metadata = {
  1287.                             Set = "Color",
  1288.                             Type = "Color",
  1289.                         }
  1290.                     },
  1291.                 },
  1292.                 ColorBlue = Input {
  1293.                     Value = 0.368590922197487,
  1294.                     CustomData = {
  1295.                         Metadata = {
  1296.                             Set = "Color",
  1297.                             Type = "Color",
  1298.                         }
  1299.                     },
  1300.                 },
  1301.                 ColorAlpha = Input {
  1302.                     CustomData = {
  1303.                         Metadata = {
  1304.                             Set = "Color",
  1305.                             Type = "Color",
  1306.                         }
  1307.                     },
  1308.                 },
  1309.             },
  1310.             ViewInfo = OperatorInfo { Pos = { -495, 379.5 } },
  1311.             UserControls = ordered() {
  1312.                 ColorRed = {
  1313.                     INPID_InputControl = "ColorControl",
  1314.                     IC_ControlPage = 0,
  1315.                     INP_MaxScale = 1,
  1316.                     INP_Default = 1,
  1317.                     INP_MinScale = 0,
  1318.                     LINKID_DataType = "Number",
  1319.                     IC_ControlID = 0,
  1320.                     ICS_Name = "Color",
  1321.                     IC_ControlGroup = 1,
  1322.                 },
  1323.                 ColorGreen = {
  1324.                     INPID_InputControl = "ColorControl",
  1325.                     INP_MinScale = 0,
  1326.                     INP_Default = 1,
  1327.                     LINKID_DataType = "Number",
  1328.                     IC_ControlID = 1,
  1329.                     IC_ControlPage = 0,
  1330.                     INP_MaxScale = 1,
  1331.                     IC_ControlGroup = 1,
  1332.                 },
  1333.                 ColorBlue = {
  1334.                     IC_ControlGroup = 1,
  1335.                     INP_MinScale = 0,
  1336.                     INPID_InputControl = "ColorControl",
  1337.                     LINKID_DataType = "Number",
  1338.                     IC_ControlID = 2,
  1339.                     IC_ControlPage = 0,
  1340.                     INP_MaxScale = 1,
  1341.                     INP_Default = 1,
  1342.                 },
  1343.                 ColorAlpha = {
  1344.                     INPID_InputControl = "ColorControl",
  1345.                     INP_MinScale = 0,
  1346.                     INP_Default = 1,
  1347.                     LINKID_DataType = "Number",
  1348.                     IC_ControlID = 3,
  1349.                     IC_ControlPage = 0,
  1350.                     INP_MaxScale = 1,
  1351.                     IC_ControlGroup = 1,
  1352.                 },
  1353.                 ColorLabel = {
  1354.                     INPID_InputControl = "LabelControl",
  1355.                     IC_ControlPage = 1,
  1356.                     ICS_Name = "Color",
  1357.                     ICD_Width = 0.9,
  1358.                     INP_Passive = true,
  1359.                     INP_External = false,
  1360.                 },
  1361.                 ColorDeleteButton = {
  1362.                     LINKID_DataType = "Number",
  1363.                     INPID_InputControl = "MultiButtonControl",
  1364.                     INP_DoNotifyChanged = 1,
  1365.                     MBTNC_AddButton = "X",
  1366.                     MBTNC_Type = "Toggle",
  1367.                     ICD_Width = 0.1,
  1368.                     INP_External = 0,
  1369.                     ICS_Name = "",
  1370.                     IC_ControlPage = 1,
  1371.                     MBTNC_ButtonHeight = 18,
  1372.                 }
  1373.             }
  1374.         },
  1375.         Shape3D2_1 = Shape3D {
  1376.             Inputs = {
  1377.                 ["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 3, },
  1378.                 ["SurfaceCylinderInputs.ObjectID.ObjectID"] = Input { Value = 7, },
  1379.                 ["SurfaceIcoInputs.ObjectID.ObjectID"] = Input { Value = 5, },
  1380.                 ["SurfaceConeInputs.ObjectID.ObjectID"] = Input { Value = 6, },
  1381.                 Shape = Input { Value = FuID { "SurfaceTorusInputs" }, },
  1382.                 MaterialInput = Input {
  1383.                     SourceOp = "Lerp_1",
  1384.                     Source = "MaterialOutput",
  1385.                 },
  1386.                 ["MtlStdInputs.MaterialID"] = Input { Value = 3, },
  1387.                 ["SurfaceTorusInputs.SubdivisionLevelBase"] = Input { Value = 60, },
  1388.                 ["SurfaceTorusInputs.SubdivisionLevelHeight"] = Input { Value = 60, },
  1389.                 ["SurfaceTorusInputs.EndSweep"] = Input { Value = 180, },
  1390.                 ["SurfaceTorusInputs.ObjectID.ObjectID"] = Input { Value = 4, }
  1391.             },
  1392.             ViewInfo = OperatorInfo { Pos = { -55, 445.5 } },
  1393.         },
  1394.         FastNoise1 = FastNoise {
  1395.             Inputs = {
  1396.                 Width = Input { Value = 1920, },
  1397.                 Height = Input { Value = 1080, },
  1398.                 ["Gamut.SLogVersion"] = Input { Value = FuID { "SLog2" }, },
  1399.                 Detail = Input { Value = 10, },
  1400.                 XScale = Input { Value = 20, },
  1401.                 Gradient = Input {
  1402.                     Value = Gradient {
  1403.                         Colors = {
  1404.                             [0] = { 0, 0, 0, 1 },
  1405.                             [1] = { 1, 1, 1, 1 }
  1406.                         }
  1407.                     },
  1408.                 },
  1409.             },
  1410.             ViewInfo = OperatorInfo { Pos = { 275, 82.5 } },
  1411.         },
  1412.         Shape3D2 = Shape3D {
  1413.             Inputs = {
  1414.                 ["SurfacePlaneInputs.ObjectID.ObjectID"] = Input { Value = 3, },
  1415.                 ["SurfaceCylinderInputs.ObjectID.ObjectID"] = Input { Value = 7, },
  1416.                 ["SurfaceIcoInputs.ObjectID.ObjectID"] = Input { Value = 5, },
  1417.                 ["SurfaceConeInputs.ObjectID.ObjectID"] = Input { Value = 6, },
  1418.                 Shape = Input { Value = FuID { "SurfaceTorusInputs" }, },
  1419.                 MaterialInput = Input {
  1420.                     SourceOp = "CustomShader3D1",
  1421.                     Source = "MaterialOutput",
  1422.                 },
  1423.                 ["MtlStdInputs.MaterialID"] = Input { Value = 3, },
  1424.                 ["SurfaceTorusInputs.SubdivisionLevelBase"] = Input { Value = 60, },
  1425.                 ["SurfaceTorusInputs.SubdivisionLevelHeight"] = Input { Value = 60, },
  1426.                 ["SurfaceTorusInputs.StartSweep"] = Input { Value = 180, },
  1427.                 ["SurfaceTorusInputs.ObjectID.ObjectID"] = Input { Value = 4, }
  1428.             },
  1429.             ViewInfo = OperatorInfo { Pos = { 275, 445.5 } },
  1430.         },
  1431.         Merge3D2 = Merge3D {
  1432.             Inputs = {
  1433.                 SceneInput1 = Input {
  1434.                     SourceOp = "Shape3D2_1",
  1435.                     Source = "Output",
  1436.                 },
  1437.                 SceneInput2 = Input {
  1438.                     SourceOp = "Shape3D2",
  1439.                     Source = "Output",
  1440.                 },
  1441.             },
  1442.             ViewInfo = OperatorInfo { Pos = { 110, 577.5 } },
  1443.         },
  1444.         CustomShader3D1 = Indicated.CustomShaderOperator3D {
  1445.             CtrlWZoom = false,
  1446.             CustomData = {
  1447.                 Settings = {
  1448.                     [1] = {
  1449.                         Tools = ordered() {
  1450.                             CustomShader3D1 = Indicated.CustomShaderOperator3D {
  1451.                                 Inputs = {
  1452.                                     ChildMtl = Input {
  1453.                                         CustomData = {
  1454.                                             Metadata = {
  1455.                                                 Set = "ChildMtl",
  1456.                                                 Type = "Material"
  1457.                                             }
  1458.                                         }
  1459.                                     },
  1460.                                     ShaderTextInputs = Input { Value = "FuFloat4 ChildMtl;\nfloat FalloffExponent;\nfloat4 FaceColor;\nfloat4 EdgeColor;\n\n" },
  1461.                                     ColorGroup = Input { Value = 1 },
  1462.                                     MaterialID = Input { Value = 5 },
  1463.                                     EdgeColorGreen = Input {
  1464.                                         CustomData = {
  1465.                                             Metadata = {
  1466.                                                 Set = "EdgeColor",
  1467.                                                 Type = "Color"
  1468.                                             }
  1469.                                         }
  1470.                                     },
  1471.                                     FloatGroup = Input { Value = 1 },
  1472.                                     FaceColorAlpha = Input {
  1473.                                         CustomData = {
  1474.                                             Metadata = {
  1475.                                                 Set = "FaceColor",
  1476.                                                 Type = "Color"
  1477.                                             }
  1478.                                         }
  1479.                                     },
  1480.                                     EdgeColorAlpha = Input {
  1481.                                         CustomData = {
  1482.                                             Metadata = {
  1483.                                                 Set = "EdgeColor",
  1484.                                                 Type = "Color"
  1485.                                             }
  1486.                                         }
  1487.                                     },
  1488.                                     EdgeColorBlue = Input {
  1489.                                         CustomData = {
  1490.                                             Metadata = {
  1491.                                                 Set = "EdgeColor",
  1492.                                                 Type = "Color"
  1493.                                             }
  1494.                                         }
  1495.                                     },
  1496.                                     ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\n{\n\nfloat3 n = normalize(f.Normal);\nfloat3 p = -normalize(f.Position);\n\nfloat falloff = pow(1-saturate(dot(n,p)), FalloffExponent;\n\nfloat4 colormix = lerp(ColorA, ColorB, falloff);\n\nreturn ret;\n\n}" },
  1497.                                     FaceColorBlue = Input {
  1498.                                         CustomData = {
  1499.                                             Metadata = {
  1500.                                                 Set = "FaceColor",
  1501.                                                 Type = "Color"
  1502.                                             }
  1503.                                         }
  1504.                                     },
  1505.                                     FaceColorGreen = Input {
  1506.                                         CustomData = {
  1507.                                             Metadata = {
  1508.                                                 Set = "FaceColor",
  1509.                                                 Type = "Color"
  1510.                                             }
  1511.                                         }
  1512.                                     },
  1513.                                     FaceColorRed = Input {
  1514.                                         CustomData = {
  1515.                                             Metadata = {
  1516.                                                 Set = "FaceColor",
  1517.                                                 Type = "Color"
  1518.                                             }
  1519.                                         }
  1520.                                     },
  1521.                                     FalloffExponent = Input {
  1522.                                         Value = 1,
  1523.                                         CustomData = {
  1524.                                             Metadata = {
  1525.                                                 Set = "FalloffExponent",
  1526.                                                 Type = "Float"
  1527.                                             }
  1528.                                         }
  1529.                                     },
  1530.                                     EdgeColorRed = Input {
  1531.                                         CustomData = {
  1532.                                             Metadata = {
  1533.                                                 Set = "EdgeColor",
  1534.                                                 Type = "Color"
  1535.                                             }
  1536.                                         }
  1537.                                     }
  1538.                                 },
  1539.                                 Name = "CustomShader3D1",
  1540.                                 CtrlWZoom = false,
  1541.                                 ViewInfo = OperatorInfo { Pos = { 880, -49.5 } },
  1542.                                 UserControls = ordered() {
  1543.                                     ChildMtl = {
  1544.                                         {
  1545.                                             LINKID_DataType = "MtlGraph3D"
  1546.                                         },
  1547.                                         {
  1548.                                             LINKID_DataType = "Image"
  1549.                                         },
  1550.                                         {
  1551.                                             LINKID_AllowedDataType = "Image"
  1552.                                         },
  1553.                                         {
  1554.                                             LINKID_AllowedDataType = "Mask"
  1555.                                         },
  1556.                                         LINK_Main = 1,
  1557.                                         INP_AcceptsGLImages = true,
  1558.                                         INP_Required = false,
  1559.                                         IC_ControlPage = 0,
  1560.                                         INP_AcceptsMasks = true,
  1561.                                         INPID_InputControl = "ImageControl"
  1562.                                     },
  1563.                                     ChildMtlLabel = {
  1564.                                         ICD_Width = 0.9,
  1565.                                         INP_External = false,
  1566.                                         INPID_InputControl = "LabelControl",
  1567.                                         IC_ControlPage = 1,
  1568.                                         INP_Passive = true,
  1569.                                         ICS_Name = "ChildMtl"
  1570.                                     },
  1571.                                     ChildMtlDeleteButton = {
  1572.                                         ICD_Width = 0.1,
  1573.                                         INPID_InputControl = "MultiButtonControl",
  1574.                                         IC_ControlPage = 1,
  1575.                                         MBTNC_ButtonHeight = 18,
  1576.                                         INP_DoNotifyChanged = 1,
  1577.                                         INP_External = 0,
  1578.                                         LINKID_DataType = "Number",
  1579.                                         ICS_Name = "",
  1580.                                         MBTNC_Type = "Toggle",
  1581.                                         MBTNC_AddButton = "X"
  1582.                                     },
  1583.                                     FalloffExponent = {
  1584.                                         IC_ControlPage = 0,
  1585.                                         INPID_InputControl = "SliderControl",
  1586.                                         LINKID_DataType = "Number"
  1587.                                     },
  1588.                                     FalloffExponentLabel = {
  1589.                                         ICD_Width = 0.9,
  1590.                                         INP_External = false,
  1591.                                         INPID_InputControl = "LabelControl",
  1592.                                         IC_ControlPage = 1,
  1593.                                         ICS_Name = "FalloffExponent",
  1594.                                         INP_Passive = true
  1595.                                     },
  1596.                                     FalloffExponentDeleteButton = {
  1597.                                         ICD_Width = 0.1,
  1598.                                         INPID_InputControl = "MultiButtonControl",
  1599.                                         IC_ControlPage = 1,
  1600.                                         MBTNC_ButtonHeight = 18,
  1601.                                         INP_DoNotifyChanged = 1,
  1602.                                         INP_External = 0,
  1603.                                         LINKID_DataType = "Number",
  1604.                                         ICS_Name = "",
  1605.                                         MBTNC_Type = "Toggle",
  1606.                                         MBTNC_AddButton = "X"
  1607.                                     },
  1608.                                     FaceColorRed = {
  1609.                                         INPID_InputControl = "ColorControl",
  1610.                                         IC_ControlPage = 0,
  1611.                                         INP_MaxScale = 1,
  1612.                                         INP_Default = 1,
  1613.                                         INP_MinScale = 0,
  1614.                                         LINKID_DataType = "Number",
  1615.                                         IC_ControlID = 0,
  1616.                                         ICS_Name = "FaceColor",
  1617.                                         IC_ControlGroup = 1
  1618.                                     },
  1619.                                     FaceColorGreen = {
  1620.                                         IC_ControlGroup = 1,
  1621.                                         INP_MinScale = 0,
  1622.                                         INPID_InputControl = "ColorControl",
  1623.                                         LINKID_DataType = "Number",
  1624.                                         IC_ControlID = 1,
  1625.                                         IC_ControlPage = 0,
  1626.                                         INP_MaxScale = 1,
  1627.                                         INP_Default = 1
  1628.                                     },
  1629.                                     FaceColorBlue = {
  1630.                                         INPID_InputControl = "ColorControl",
  1631.                                         INP_MinScale = 0,
  1632.                                         INP_Default = 1,
  1633.                                         LINKID_DataType = "Number",
  1634.                                         IC_ControlID = 2,
  1635.                                         IC_ControlPage = 0,
  1636.                                         INP_MaxScale = 1,
  1637.                                         IC_ControlGroup = 1
  1638.                                     },
  1639.                                     FaceColorAlpha = {
  1640.                                         IC_ControlGroup = 1,
  1641.                                         INP_MinScale = 0,
  1642.                                         INPID_InputControl = "ColorControl",
  1643.                                         LINKID_DataType = "Number",
  1644.                                         IC_ControlID = 3,
  1645.                                         IC_ControlPage = 0,
  1646.                                         INP_MaxScale = 1,
  1647.                                         INP_Default = 1
  1648.                                     },
  1649.                                     FaceColorLabel = {
  1650.                                         ICD_Width = 0.9,
  1651.                                         INP_External = false,
  1652.                                         INPID_InputControl = "LabelControl",
  1653.                                         IC_ControlPage = 1,
  1654.                                         INP_Passive = true,
  1655.                                         ICS_Name = "FaceColor"
  1656.                                     },
  1657.                                     FaceColorDeleteButton = {
  1658.                                         ICD_Width = 0.1,
  1659.                                         INPID_InputControl = "MultiButtonControl",
  1660.                                         IC_ControlPage = 1,
  1661.                                         MBTNC_ButtonHeight = 18,
  1662.                                         INP_DoNotifyChanged = 1,
  1663.                                         INP_External = 0,
  1664.                                         LINKID_DataType = "Number",
  1665.                                         ICS_Name = "",
  1666.                                         MBTNC_Type = "Toggle",
  1667.                                         MBTNC_AddButton = "X"
  1668.                                     },
  1669.                                     EdgeColorRed = {
  1670.                                         INPID_InputControl = "ColorControl",
  1671.                                         IC_ControlPage = 0,
  1672.                                         INP_MaxScale = 1,
  1673.                                         INP_Default = 1,
  1674.                                         INP_MinScale = 0,
  1675.                                         LINKID_DataType = "Number",
  1676.                                         IC_ControlID = 0,
  1677.                                         ICS_Name = "EdgeColor",
  1678.                                         IC_ControlGroup = 2
  1679.                                     },
  1680.                                     EdgeColorGreen = {
  1681.                                         IC_ControlGroup = 2,
  1682.                                         INP_MinScale = 0,
  1683.                                         INPID_InputControl = "ColorControl",
  1684.                                         LINKID_DataType = "Number",
  1685.                                         IC_ControlID = 1,
  1686.                                         IC_ControlPage = 0,
  1687.                                         INP_MaxScale = 1,
  1688.                                         INP_Default = 1
  1689.                                     },
  1690.                                     EdgeColorBlue = {
  1691.                                         INPID_InputControl = "ColorControl",
  1692.                                         INP_MinScale = 0,
  1693.                                         INP_Default = 1,
  1694.                                         LINKID_DataType = "Number",
  1695.                                         IC_ControlID = 2,
  1696.                                         IC_ControlPage = 0,
  1697.                                         INP_MaxScale = 1,
  1698.                                         IC_ControlGroup = 2
  1699.                                     },
  1700.                                     EdgeColorAlpha = {
  1701.                                         IC_ControlGroup = 2,
  1702.                                         INP_MinScale = 0,
  1703.                                         INPID_InputControl = "ColorControl",
  1704.                                         LINKID_DataType = "Number",
  1705.                                         IC_ControlID = 3,
  1706.                                         IC_ControlPage = 0,
  1707.                                         INP_MaxScale = 1,
  1708.                                         INP_Default = 1
  1709.                                     },
  1710.                                     EdgeColorLabel = {
  1711.                                         ICD_Width = 0.9,
  1712.                                         INP_External = false,
  1713.                                         INPID_InputControl = "LabelControl",
  1714.                                         IC_ControlPage = 1,
  1715.                                         INP_Passive = true,
  1716.                                         ICS_Name = "EdgeColor"
  1717.                                     },
  1718.                                     EdgeColorDeleteButton = {
  1719.                                         ICD_Width = 0.1,
  1720.                                         INPID_InputControl = "MultiButtonControl",
  1721.                                         IC_ControlPage = 1,
  1722.                                         MBTNC_ButtonHeight = 18,
  1723.                                         INP_DoNotifyChanged = 1,
  1724.                                         INP_External = 0,
  1725.                                         LINKID_DataType = "Number",
  1726.                                         ICS_Name = "",
  1727.                                         MBTNC_Type = "Toggle",
  1728.                                         MBTNC_AddButton = "X"
  1729.                                     }
  1730.                                 },
  1731.                                 CustomData = {
  1732.                                 }
  1733.                             }
  1734.                         }
  1735.                     },
  1736.                 }
  1737.             },
  1738.             Inputs = {
  1739.                 ShaderTextInputs = Input { Value = "FuFloat4 LookupMtl;\nFuFloat4 MixMtl;\nfloat FalloffExponent;\nfloat4 FaceColor;\nfloat4 EdgeColor;\n\n", },
  1740.                 ShaderTextBody = Input { Value = "float4 Shade(inout FuFragment f)\n{\n\nfloat3 n = normalize(f.Normal);\nfloat3 p = -normalize(f.Position);\n\nfloat Falloff = pow(1-saturate(dot(n,p)), FalloffExponent);\n\nfloat4 Colormix = lerp(FaceColor, EdgeColor, Falloff);\n\nfloat3 OldUVWs = f.TexCoord0;\n\nf.TexCoord0 = Falloff;\n\nfloat4 Lookup = LookupMtl.Shade(f);\n\nf.TexCoord0 = OldUVWs;\n\nreturn lerp(Lookup, Colormix, MixMtl.Shade(f).a);\n\n}", },
  1741.                 MaterialGroup = Input { Value = 1, },
  1742.                 FloatGroup = Input { Value = 1, },
  1743.                 ColorGroup = Input { Value = 1, },
  1744.                 MaterialIDNest = Input { Value = 1, },
  1745.                 MaterialID = Input { Value = 5, },
  1746.                 FalloffExponent = Input {
  1747.                     Value = 2.25,
  1748.                     CustomData = {
  1749.                         Metadata = {
  1750.                             Set = "FalloffExponent",
  1751.                             Type = "Float",
  1752.                         }
  1753.                     },
  1754.                 },
  1755.                 FaceColorRed = Input {
  1756.                     Value = 0.694080519796882,
  1757.                     CustomData = {
  1758.                         Metadata = {
  1759.                             Set = "FaceColor",
  1760.                             Type = "Color",
  1761.                         }
  1762.                     },
  1763.                 },
  1764.                 FaceColorGreen = Input {
  1765.                     Value = 0.141980290685736,
  1766.                     CustomData = {
  1767.                         Metadata = {
  1768.                             Set = "FaceColor",
  1769.                             Type = "Color",
  1770.                         }
  1771.                     },
  1772.                 },
  1773.                 FaceColorBlue = Input {
  1774.                     Value = 0.0986891975410945,
  1775.                     CustomData = {
  1776.                         Metadata = {
  1777.                             Set = "FaceColor",
  1778.                             Type = "Color",
  1779.                         }
  1780.                     },
  1781.                 },
  1782.                 FaceColorAlpha = Input {
  1783.                     CustomData = {
  1784.                         Metadata = {
  1785.                             Set = "FaceColor",
  1786.                             Type = "Color",
  1787.                         }
  1788.                     },
  1789.                 },
  1790.                 EdgeColorRed = Input {
  1791.                     Value = 0.176774321640903,
  1792.                     CustomData = {
  1793.                         Metadata = {
  1794.                             Set = "EdgeColor",
  1795.                             Type = "Color",
  1796.                         }
  1797.                     },
  1798.                 },
  1799.                 EdgeColorGreen = Input {
  1800.                     Value = 0.666116968775851,
  1801.                     CustomData = {
  1802.                         Metadata = {
  1803.                             Set = "EdgeColor",
  1804.                             Type = "Color",
  1805.                         }
  1806.                     },
  1807.                 },
  1808.                 EdgeColorBlue = Input {
  1809.                     Value = 0.368590922197487,
  1810.                     CustomData = {
  1811.                         Metadata = {
  1812.                             Set = "EdgeColor",
  1813.                             Type = "Color",
  1814.                         }
  1815.                     },
  1816.                 },
  1817.                 EdgeColorAlpha = Input {
  1818.                     CustomData = {
  1819.                         Metadata = {
  1820.                             Set = "EdgeColor",
  1821.                             Type = "Color",
  1822.                         }
  1823.                     },
  1824.                 },
  1825.                 LookupMtl = Input {
  1826.                     SourceOp = "Background1",
  1827.                     Source = "Output",
  1828.                     CustomData = {
  1829.                         Metadata = {
  1830.                             Set = "LookupMtl",
  1831.                             Type = "Material",
  1832.                         }
  1833.                     },
  1834.                 },
  1835.                 MixMtl = Input {
  1836.                     SourceOp = "FastNoise1",
  1837.                     Source = "Output",
  1838.                     CustomData = {
  1839.                         Metadata = {
  1840.                             Set = "MixMtl",
  1841.                             Type = "Material",
  1842.                         }
  1843.                     },
  1844.                 },
  1845.             },
  1846.             ViewInfo = OperatorInfo { Pos = { 440, 313.5 } },
  1847.             UserControls = ordered() {
  1848.                 FalloffExponent = {
  1849.                     IC_ControlPage = 0,
  1850.                     INPID_InputControl = "SliderControl",
  1851.                     LINKID_DataType = "Number",
  1852.                 },
  1853.                 FalloffExponentLabel = {
  1854.                     INPID_InputControl = "LabelControl",
  1855.                     IC_ControlPage = 1,
  1856.                     ICS_Name = "FalloffExponent",
  1857.                     ICD_Width = 0.9,
  1858.                     INP_Passive = true,
  1859.                     INP_External = false,
  1860.                 },
  1861.                 FalloffExponentDeleteButton = {
  1862.                     LINKID_DataType = "Number",
  1863.                     INPID_InputControl = "MultiButtonControl",
  1864.                     INP_DoNotifyChanged = 1,
  1865.                     MBTNC_AddButton = "X",
  1866.                     MBTNC_Type = "Toggle",
  1867.                     ICD_Width = 0.1,
  1868.                     INP_External = 0,
  1869.                     ICS_Name = "",
  1870.                     IC_ControlPage = 1,
  1871.                     MBTNC_ButtonHeight = 18,
  1872.                 },
  1873.                 FaceColorRed = {
  1874.                     INPID_InputControl = "ColorControl",
  1875.                     IC_ControlPage = 0,
  1876.                     INP_MaxScale = 1,
  1877.                     INP_Default = 1,
  1878.                     INP_MinScale = 0,
  1879.                     LINKID_DataType = "Number",
  1880.                     IC_ControlID = 0,
  1881.                     ICS_Name = "FaceColor",
  1882.                     IC_ControlGroup = 1,
  1883.                 },
  1884.                 FaceColorGreen = {
  1885.                     INPID_InputControl = "ColorControl",
  1886.                     INP_MinScale = 0,
  1887.                     INP_Default = 1,
  1888.                     LINKID_DataType = "Number",
  1889.                     IC_ControlID = 1,
  1890.                     IC_ControlPage = 0,
  1891.                     INP_MaxScale = 1,
  1892.                     IC_ControlGroup = 1,
  1893.                 },
  1894.                 FaceColorBlue = {
  1895.                     IC_ControlGroup = 1,
  1896.                     INP_MinScale = 0,
  1897.                     INPID_InputControl = "ColorControl",
  1898.                     LINKID_DataType = "Number",
  1899.                     IC_ControlID = 2,
  1900.                     IC_ControlPage = 0,
  1901.                     INP_MaxScale = 1,
  1902.                     INP_Default = 1,
  1903.                 },
  1904.                 FaceColorAlpha = {
  1905.                     INPID_InputControl = "ColorControl",
  1906.                     INP_MinScale = 0,
  1907.                     INP_Default = 1,
  1908.                     LINKID_DataType = "Number",
  1909.                     IC_ControlID = 3,
  1910.                     IC_ControlPage = 0,
  1911.                     INP_MaxScale = 1,
  1912.                     IC_ControlGroup = 1,
  1913.                 },
  1914.                 FaceColorLabel = {
  1915.                     INPID_InputControl = "LabelControl",
  1916.                     IC_ControlPage = 1,
  1917.                     ICS_Name = "FaceColor",
  1918.                     ICD_Width = 0.9,
  1919.                     INP_Passive = true,
  1920.                     INP_External = false,
  1921.                 },
  1922.                 FaceColorDeleteButton = {
  1923.                     LINKID_DataType = "Number",
  1924.                     INPID_InputControl = "MultiButtonControl",
  1925.                     INP_DoNotifyChanged = 1,
  1926.                     MBTNC_AddButton = "X",
  1927.                     MBTNC_Type = "Toggle",
  1928.                     ICD_Width = 0.1,
  1929.                     INP_External = 0,
  1930.                     ICS_Name = "",
  1931.                     IC_ControlPage = 1,
  1932.                     MBTNC_ButtonHeight = 18,
  1933.                 },
  1934.                 EdgeColorRed = {
  1935.                     INPID_InputControl = "ColorControl",
  1936.                     IC_ControlPage = 0,
  1937.                     INP_MaxScale = 1,
  1938.                     INP_Default = 1,
  1939.                     INP_MinScale = 0,
  1940.                     LINKID_DataType = "Number",
  1941.                     IC_ControlID = 0,
  1942.                     ICS_Name = "EdgeColor",
  1943.                     IC_ControlGroup = 2,
  1944.                 },
  1945.                 EdgeColorGreen = {
  1946.                     INPID_InputControl = "ColorControl",
  1947.                     INP_MinScale = 0,
  1948.                     INP_Default = 1,
  1949.                     LINKID_DataType = "Number",
  1950.                     IC_ControlID = 1,
  1951.                     IC_ControlPage = 0,
  1952.                     INP_MaxScale = 1,
  1953.                     IC_ControlGroup = 2,
  1954.                 },
  1955.                 EdgeColorBlue = {
  1956.                     IC_ControlGroup = 2,
  1957.                     INP_MinScale = 0,
  1958.                     INPID_InputControl = "ColorControl",
  1959.                     LINKID_DataType = "Number",
  1960.                     IC_ControlID = 2,
  1961.                     IC_ControlPage = 0,
  1962.                     INP_MaxScale = 1,
  1963.                     INP_Default = 1,
  1964.                 },
  1965.                 EdgeColorAlpha = {
  1966.                     INPID_InputControl = "ColorControl",
  1967.                     INP_MinScale = 0,
  1968.                     INP_Default = 1,
  1969.                     LINKID_DataType = "Number",
  1970.                     IC_ControlID = 3,
  1971.                     IC_ControlPage = 0,
  1972.                     INP_MaxScale = 1,
  1973.                     IC_ControlGroup = 2,
  1974.                 },
  1975.                 EdgeColorLabel = {
  1976.                     INPID_InputControl = "LabelControl",
  1977.                     IC_ControlPage = 1,
  1978.                     ICS_Name = "EdgeColor",
  1979.                     ICD_Width = 0.9,
  1980.                     INP_Passive = true,
  1981.                     INP_External = false,
  1982.                 },
  1983.                 EdgeColorDeleteButton = {
  1984.                     LINKID_DataType = "Number",
  1985.                     INPID_InputControl = "MultiButtonControl",
  1986.                     INP_DoNotifyChanged = 1,
  1987.                     MBTNC_AddButton = "X",
  1988.                     MBTNC_Type = "Toggle",
  1989.                     ICD_Width = 0.1,
  1990.                     INP_External = 0,
  1991.                     ICS_Name = "",
  1992.                     IC_ControlPage = 1,
  1993.                     MBTNC_ButtonHeight = 18,
  1994.                 },
  1995.                 LookupMtl = {
  1996.                     {
  1997.                         LINKID_DataType = "MtlGraph3D"
  1998.                     },
  1999.                     {
  2000.                         LINKID_DataType = "Image"
  2001.                     },
  2002.                     {
  2003.                         LINKID_AllowedDataType = "Image"
  2004.                     },
  2005.                     {
  2006.                         LINKID_AllowedDataType = "Mask"
  2007.                     },
  2008.                     LINK_Main = 2,
  2009.                     INP_AcceptsGLImages = true,
  2010.                     INP_Required = false,
  2011.                     IC_ControlPage = 0,
  2012.                     INP_AcceptsMasks = true,
  2013.                     INPID_InputControl = "ImageControl",
  2014.                 },
  2015.                 LookupMtlLabel = {
  2016.                     INPID_InputControl = "LabelControl",
  2017.                     IC_ControlPage = 1,
  2018.                     ICS_Name = "LookupMtl",
  2019.                     ICD_Width = 0.9,
  2020.                     INP_Passive = true,
  2021.                     INP_External = false,
  2022.                 },
  2023.                 LookupMtlDeleteButton = {
  2024.                     LINKID_DataType = "Number",
  2025.                     INPID_InputControl = "MultiButtonControl",
  2026.                     INP_DoNotifyChanged = 1,
  2027.                     MBTNC_AddButton = "X",
  2028.                     MBTNC_Type = "Toggle",
  2029.                     ICD_Width = 0.1,
  2030.                     INP_External = 0,
  2031.                     ICS_Name = "",
  2032.                     IC_ControlPage = 1,
  2033.                     MBTNC_ButtonHeight = 18,
  2034.                 },
  2035.                 MixMtl = {
  2036.                     {
  2037.                         LINKID_DataType = "MtlGraph3D"
  2038.                     },
  2039.                     {
  2040.                         LINKID_DataType = "Image"
  2041.                     },
  2042.                     {
  2043.                         LINKID_AllowedDataType = "Image"
  2044.                     },
  2045.                     {
  2046.                         LINKID_AllowedDataType = "Mask"
  2047.                     },
  2048.                     LINK_Main = 1,
  2049.                     INP_AcceptsGLImages = true,
  2050.                     INP_Required = false,
  2051.                     IC_ControlPage = 0,
  2052.                     INP_AcceptsMasks = true,
  2053.                     INPID_InputControl = "ImageControl",
  2054.                 },
  2055.                 MixMtlLabel = {
  2056.                     INPID_InputControl = "LabelControl",
  2057.                     IC_ControlPage = 1,
  2058.                     ICS_Name = "MixMtl",
  2059.                     ICD_Width = 0.9,
  2060.                     INP_Passive = true,
  2061.                     INP_External = false,
  2062.                 },
  2063.                 MixMtlDeleteButton = {
  2064.                     LINKID_DataType = "Number",
  2065.                     INPID_InputControl = "MultiButtonControl",
  2066.                     INP_DoNotifyChanged = 1,
  2067.                     MBTNC_AddButton = "X",
  2068.                     MBTNC_Type = "Toggle",
  2069.                     ICD_Width = 0.1,
  2070.                     INP_External = 0,
  2071.                     ICS_Name = "",
  2072.                     IC_ControlPage = 1,
  2073.                     MBTNC_ButtonHeight = 18,
  2074.                 }
  2075.             }
  2076.         }
  2077.     }
  2078. }


FusionCapture.JPG


The left side has 15 nodes that are all 3CuS. Each one is small, the largest is 5 lines, but most are 1 line. On the right side is one 3CuS that returns the same result, but is 9 lines long, however the lines are a bit more complex. Like
  1.  float Falloff = pow(1-saturate(dot(n,p)), FalloffExponent);
which has Power, Invert, Saturate, and Dot all happening in one line, not 4.

In the end, the compiler makes almost the same result, it's 16 GPU instructions on the right and 19 on the left, but it doesn't really matter as both are crazy fast. In some cases it's easier to play around with the individual nodes and debug them, since you can see the output at any node and you can quickly wire up a new idea or copy/paste and try a new variation. But in other cases it's nice to have your code in a little box and you can type certain shorthand really quickly, like swizzling or doing simple arithmetic.

Some things don't work really well with individual nodes, like iteration. Just like it's hard (without a Fuse) to say "Blur this image N times". But if all you want to do is take a material and invert it, having a library of little simple tools can be really handy.
You do not have the required permissions to view the files attached to this post.

User avatar
Kristof
Fusionista
Posts: 274
Joined: Thu Aug 07, 2014 12:30 pm
Been thanked: 3 times

Re: CustomShader3D: Cg shader editing in your comp

Post #45 by Kristof » Thu Sep 15, 2016 12:53 pm

Taking notes. :)

Who is online

Users browsing this forum: No registered users and 1 guest