Example #1
0
        // ShaderLab doesn't understand virtual texture inputs, they need to be processed to replace the virtual texture input with the layers that compose it instead
        public static GraphInputData ProcessVirtualTextureProperty(VirtualTextureShaderProperty virtualTextureShaderProperty)
        {
            var layerReferenceNames = new List <string>();

            virtualTextureShaderProperty.GetPropertyReferenceNames(layerReferenceNames);
            var virtualTextureLayerDataList = new List <SubPropertyData>();

            // Skip the first entry in this list as that's the Virtual Texture reference name itself, which won't exist in ShaderLab
            foreach (var referenceName in layerReferenceNames.Skip(1))
            {
                var layerPropertyData = new SubPropertyData()
                {
                    referenceName = referenceName, propertyType = PropertyType.Texture2D
                };
                virtualTextureLayerDataList.Add(layerPropertyData);
            }

            var virtualTexturePropertyData = new GraphInputData()
            {
                referenceName = virtualTextureShaderProperty.displayName, propertyType = PropertyType.VirtualTexture, isKeyword = false
            };

            virtualTexturePropertyData.isCompoundProperty = true;
            virtualTexturePropertyData.subProperties      = virtualTextureLayerDataList;
            return(virtualTexturePropertyData);
        }
        internal override ShaderInput Copy()
        {
            var vt = new VirtualTextureShaderProperty
            {
                displayName = displayName,
                value       = new SerializableVirtualTexture(),
            };

            // duplicate layer data, but reset reference names (they should be unique)
            for (int layer = 0; layer < value.layers.Count; layer++)
            {
                var guid = Guid.NewGuid();
                vt.value.layers.Add(new SerializableVirtualTextureLayer(value.layers[layer]));
            }

            return(vt);
        }
        internal override ShaderInput Copy()
        {
            var vt = new VirtualTextureShaderProperty
            {
                displayName = displayName,
                hidden      = hidden,
                value       = new SerializableVirtualTexture(),
                precision   = precision
            };

            // duplicate layer data, but reset reference names (they should be unique)
            for (int layer = 0; layer < value.layers.Count; layer++)
            {
                var guid = Guid.NewGuid();
                vt.value.layers.Add(
                    new SerializableVirtualTextureLayer(
                        value.layers[layer].layerName,
                        $"Layer_{GuidEncoder.Encode(guid)}",
                        value.layers[layer].layerTexture));
            }

            return(vt);
        }