You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

136 lines
4.5 KiB

using System.Collections.Generic;
using UnityEditor.ShaderGraph.Drawing.Controls;
using UnityEngine;
using UnityEditor.Graphing;
using UnityEditor.ShaderGraph.Internal;
namespace UnityEditor.ShaderGraph
{
#if PROCEDURAL_VT_IN_GRAPH
[Title("Input", "Texture", "Procedural Virtual Texture")]
class ProceduralVirtualTextureNode : AbstractMaterialNode
{
public const int OutputSlotId = 0;
const string kOutputSlotName = "Out";
public ProceduralVirtualTextureNode()
{
UpdateNodeAfterDeserialization();
SetLayerCount(2);
vtProperty.displayName = "ProceduralVirtualTexture";
vtProperty.overrideReferenceName = "MyPVT";
vtProperty.value.procedural = true;
vtProperty.value.shaderDeclaration = HLSLDeclaration.UnityPerMaterial;
UpdateName();
}
void UpdateName()
{
name = "Procedural Virtual Texture: " + vtProperty.overrideReferenceName;
}
public sealed override void UpdateNodeAfterDeserialization()
{
AddSlot(new VirtualTextureMaterialSlot(OutputSlotId, kOutputSlotName, kOutputSlotName, SlotType.Output));
RemoveSlotsNameNotMatching(new[] { OutputSlotId });
SetLayerCount(layers);
vtProperty.generatePropertyBlock = true;
vtProperty.hidden = true;
}
public override int latestVersion => 1;
public override void OnAfterMultiDeserialize(string json)
{
if (sgVersion == 0)
{
// version 0 was implicitly declaring PVT stacks as Global shader properties
shaderDeclaration = HLSLDeclaration.Global;
ChangeVersion(1);
}
}
[SerializeField]
private VirtualTextureShaderProperty vtProperty = new VirtualTextureShaderProperty();
void SetLayerCount(int layers)
{
var uniqueName = objectId;
vtProperty.value.layers.Clear();
layers = System.Math.Max(System.Math.Min(layers, SampleVirtualTextureNode.kMaxLayers), SampleVirtualTextureNode.kMinLayers);
for (int x = 0; x < layers; x++)
{
vtProperty.value.layers.Add(new SerializableVirtualTextureLayer("Layer" + x + "_" + uniqueName, "Layer" + x + "_" + uniqueName, null));
}
}
[IdentifierControl("Name")]
public string vtName
{
get { return vtProperty.overrideReferenceName; }
set
{
if (vtProperty.overrideReferenceName == value)
return;
vtProperty.overrideReferenceName = value;
UpdateName();
Dirty(ModificationScope.Graph);
}
}
[IntegerControl("Layers")]
public int layers
{
get { return vtProperty.value.layers.Count; }
set
{
if (vtProperty.value.layers.Count == value)
return;
SetLayerCount(value);
Dirty(ModificationScope.Topological);
//Hack to handle downstream SampleVirtualTextureNodes
owner.ValidateGraph();
}
}
internal HLSLDeclaration shaderDeclaration
{
get { return vtProperty.value.shaderDeclaration; }
set
{
if (vtProperty.value.shaderDeclaration == value)
return;
vtProperty.value.shaderDeclaration = value;
Dirty(ModificationScope.Graph);
}
}
public override void CollectShaderProperties(PropertyCollector properties, GenerationMode generationMode)
{
properties.AddShaderProperty(vtProperty);
}
public override void CollectPreviewMaterialProperties(List<PreviewProperty> properties)
{
properties.Add(new PreviewProperty(PropertyType.VirtualTexture)
{
name = GetVariableNameForSlot(OutputSlotId),
vtProperty = vtProperty
});
}
public AbstractShaderProperty AsShaderProperty()
{
return vtProperty;
}
// to show Shader Declaration in the node settings, as if this node was itself a real AbstractShaderProperty
internal bool AllowHLSLDeclaration(HLSLDeclaration decl) =>
(decl == HLSLDeclaration.Global || decl == HLSLDeclaration.UnityPerMaterial);
}
#endif // PROCEDURAL_VT_IN_GRAPH
}