243 lines
8.8 KiB
C#
243 lines
8.8 KiB
C#
|
using UnityEngine;
|
||
|
using UnityEditor.Graphing;
|
||
|
using UnityEditor.ShaderGraph.Drawing.Controls;
|
||
|
using UnityEditor.ShaderGraph.Internal;
|
||
|
|
||
|
namespace UnityEditor.ShaderGraph
|
||
|
{
|
||
|
internal enum Texture2DMipSamplingMode
|
||
|
{
|
||
|
Standard,
|
||
|
LOD,
|
||
|
Gradient,
|
||
|
Bias
|
||
|
}
|
||
|
|
||
|
internal enum Texture3DMipSamplingMode
|
||
|
{
|
||
|
Standard,
|
||
|
LOD
|
||
|
}
|
||
|
|
||
|
internal struct Mip2DSamplingInputs
|
||
|
{
|
||
|
public int biasInput;
|
||
|
public int lodInput;
|
||
|
public int ddxInput;
|
||
|
public int ddyInput;
|
||
|
public MaterialSlot bias;
|
||
|
public MaterialSlot lod;
|
||
|
public MaterialSlot ddx;
|
||
|
public MaterialSlot ddy;
|
||
|
|
||
|
public static Mip2DSamplingInputs NewDefault()
|
||
|
{
|
||
|
return new Mip2DSamplingInputs()
|
||
|
{
|
||
|
bias = null,
|
||
|
lod = null,
|
||
|
ddx = null,
|
||
|
ddy = null
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal struct Mip3DSamplingInputs
|
||
|
{
|
||
|
public int lodInput;
|
||
|
public MaterialSlot lod;
|
||
|
|
||
|
public static Mip3DSamplingInputs NewDefault()
|
||
|
{
|
||
|
return new Mip3DSamplingInputs()
|
||
|
{
|
||
|
lod = null
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal static class MipSamplingModesUtils
|
||
|
{
|
||
|
private static string kLodName = "LOD";
|
||
|
private static string kBiasName = "Bias";
|
||
|
private static string kDdxName = "DDX";
|
||
|
private static string kDdyName = "DDY";
|
||
|
|
||
|
public static string Get2DTextureSamplingMacro(Texture2DMipSamplingMode mode, bool usePlatformMacros, bool isArray)
|
||
|
{
|
||
|
if (isArray)
|
||
|
{
|
||
|
if (usePlatformMacros)
|
||
|
{
|
||
|
switch (mode)
|
||
|
{
|
||
|
case Texture2DMipSamplingMode.Standard:
|
||
|
return "PLATFORM_SAMPLE_TEXTURE2D_ARRAY";
|
||
|
case Texture2DMipSamplingMode.LOD:
|
||
|
return "PLATFORM_SAMPLE_TEXTURE2D_ARRAY_LOD";
|
||
|
case Texture2DMipSamplingMode.Bias:
|
||
|
return "PLATFORM_SAMPLE_TEXTURE2D_ARRAY_BIAS";
|
||
|
case Texture2DMipSamplingMode.Gradient:
|
||
|
return "PLATFORM_SAMPLE_TEXTURE2D_ARRAY_GRAD";
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
switch (mode)
|
||
|
{
|
||
|
case Texture2DMipSamplingMode.Standard:
|
||
|
return "SAMPLE_TEXTURE2D_ARRAY";
|
||
|
case Texture2DMipSamplingMode.LOD:
|
||
|
return "SAMPLE_TEXTURE2D_ARRAY_LOD";
|
||
|
case Texture2DMipSamplingMode.Bias:
|
||
|
return "SAMPLE_TEXTURE2D_ARRAY_BIAS";
|
||
|
case Texture2DMipSamplingMode.Gradient:
|
||
|
return "SAMPLE_TEXTURE2D_ARRAY_GRAD";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (usePlatformMacros)
|
||
|
{
|
||
|
switch (mode)
|
||
|
{
|
||
|
case Texture2DMipSamplingMode.Standard:
|
||
|
return "PLATFORM_SAMPLE_TEXTURE2D";
|
||
|
case Texture2DMipSamplingMode.LOD:
|
||
|
return "PLATFORM_SAMPLE_TEXTURE2D_LOD";
|
||
|
case Texture2DMipSamplingMode.Bias:
|
||
|
return "PLATFORM_SAMPLE_TEXTURE2D_BIAS";
|
||
|
case Texture2DMipSamplingMode.Gradient:
|
||
|
return "PLATFORM_SAMPLE_TEXTURE2D_GRAD";
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
switch (mode)
|
||
|
{
|
||
|
case Texture2DMipSamplingMode.Standard:
|
||
|
return "SAMPLE_TEXTURE2D";
|
||
|
case Texture2DMipSamplingMode.LOD:
|
||
|
return "SAMPLE_TEXTURE2D_LOD";
|
||
|
case Texture2DMipSamplingMode.Bias:
|
||
|
return "SAMPLE_TEXTURE2D_BIAS";
|
||
|
case Texture2DMipSamplingMode.Gradient:
|
||
|
return "SAMPLE_TEXTURE2D_GRAD";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return "";
|
||
|
}
|
||
|
|
||
|
public static string Get3DTextureSamplingMacro(Texture3DMipSamplingMode mode, bool usePlatformMacros)
|
||
|
{
|
||
|
if (usePlatformMacros)
|
||
|
{
|
||
|
switch (mode)
|
||
|
{
|
||
|
case Texture3DMipSamplingMode.Standard:
|
||
|
return "PLATFORM_SAMPLE_TEXTURE3D";
|
||
|
case Texture3DMipSamplingMode.LOD:
|
||
|
return "PLATFORM_SAMPLE_TEXTURE2D_LOD";
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
switch (mode)
|
||
|
{
|
||
|
case Texture3DMipSamplingMode.Standard:
|
||
|
return "SAMPLE_TEXTURE3D";
|
||
|
case Texture3DMipSamplingMode.LOD:
|
||
|
return "SAMPLE_TEXTURE3D_LOD";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return "";
|
||
|
}
|
||
|
|
||
|
public static Mip2DSamplingInputs CreateMip2DSamplingInputs(
|
||
|
AbstractMaterialNode node, Texture2DMipSamplingMode mode, Mip2DSamplingInputs previousInputs,
|
||
|
int biasInputId, int lodInputId, int ddxInputId, int ddyInputId)
|
||
|
{
|
||
|
if (previousInputs.bias != null)
|
||
|
node.RemoveSlot(previousInputs.bias.id);
|
||
|
if (previousInputs.lod != null)
|
||
|
node.RemoveSlot(previousInputs.lod.id);
|
||
|
if (previousInputs.ddx != null)
|
||
|
node.RemoveSlot(previousInputs.ddx.id);
|
||
|
if (previousInputs.ddy != null)
|
||
|
node.RemoveSlot(previousInputs.ddy.id);
|
||
|
|
||
|
Mip2DSamplingInputs inputs = Mip2DSamplingInputs.NewDefault();
|
||
|
inputs.biasInput = biasInputId;
|
||
|
inputs.lodInput = lodInputId;
|
||
|
inputs.ddxInput = ddxInputId;
|
||
|
inputs.ddyInput = ddyInputId;
|
||
|
switch (mode)
|
||
|
{
|
||
|
case Texture2DMipSamplingMode.LOD:
|
||
|
inputs.lod = node.AddSlot(new Vector1MaterialSlot(lodInputId, kLodName, kLodName, SlotType.Input, 0.0f));
|
||
|
break;
|
||
|
case Texture2DMipSamplingMode.Bias:
|
||
|
inputs.bias = node.AddSlot(new Vector1MaterialSlot(biasInputId, kBiasName, kBiasName, SlotType.Input, 0.0f));
|
||
|
break;
|
||
|
case Texture2DMipSamplingMode.Gradient:
|
||
|
inputs.ddx = node.AddSlot(new Vector2MaterialSlot(ddxInputId, kDdxName, kDdxName, SlotType.Input, new Vector2(0.0f, 0.0f)));
|
||
|
inputs.ddy = node.AddSlot(new Vector2MaterialSlot(ddyInputId, kDdyName, kDdyName, SlotType.Input, new Vector2(0.0f, 0.0f)));
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return inputs;
|
||
|
}
|
||
|
|
||
|
public static Mip3DSamplingInputs CreateMip3DSamplingInputs(
|
||
|
AbstractMaterialNode node, Texture3DMipSamplingMode mode, Mip3DSamplingInputs previousInputs,
|
||
|
int lodInputId)
|
||
|
{
|
||
|
if (previousInputs.lod != null)
|
||
|
node.RemoveSlot(previousInputs.lod.id);
|
||
|
|
||
|
Mip3DSamplingInputs inputs = Mip3DSamplingInputs.NewDefault();
|
||
|
inputs.lodInput = lodInputId;
|
||
|
switch (mode)
|
||
|
{
|
||
|
case Texture3DMipSamplingMode.LOD:
|
||
|
inputs.lod = node.AddSlot(new Vector1MaterialSlot(lodInputId, kLodName, kLodName, SlotType.Input, 0.0f));
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return inputs;
|
||
|
}
|
||
|
|
||
|
public static string GetSamplerMipArgs(
|
||
|
AbstractMaterialNode node, Texture2DMipSamplingMode mode, Mip2DSamplingInputs inputs, GenerationMode generationMode)
|
||
|
{
|
||
|
switch (mode)
|
||
|
{
|
||
|
case Texture2DMipSamplingMode.LOD:
|
||
|
return string.Format(", {0}", node.GetSlotValue(inputs.lodInput, generationMode));
|
||
|
case Texture2DMipSamplingMode.Bias:
|
||
|
return string.Format(", {0}", node.GetSlotValue(inputs.biasInput, generationMode));
|
||
|
case Texture2DMipSamplingMode.Gradient:
|
||
|
return string.Format(", {0}, {1}", node.GetSlotValue(inputs.ddxInput, generationMode), node.GetSlotValue(inputs.ddyInput, generationMode));
|
||
|
}
|
||
|
|
||
|
return "";
|
||
|
}
|
||
|
|
||
|
public static string GetSamplerMipArgs(
|
||
|
AbstractMaterialNode node, Texture3DMipSamplingMode mode, Mip3DSamplingInputs inputs, GenerationMode generationMode)
|
||
|
{
|
||
|
switch (mode)
|
||
|
{
|
||
|
case Texture3DMipSamplingMode.LOD:
|
||
|
return string.Format(", {0}", node.GetSlotValue(inputs.lodInput, generationMode));
|
||
|
}
|
||
|
|
||
|
return "";
|
||
|
}
|
||
|
}
|
||
|
}
|