private static void BlendSetters(MaterialPropertySetterGroup blendedSetter, List <WeightedSingleSetter> samePropertySetters)
        {
            switch (samePropertySetters[0].setter)
            {
            case FloatMaterialPropertySetter floatMaterialPropertySetter: {
                blendedSetter.floatSetters.Add(BlendFloatSetters(samePropertySetters));
            }
            break;

            case IntMaterialPropertySetter intMaterialPropertySetter: {
                blendedSetter.intSettters.Add(BlendIntSetters(samePropertySetters));
            }
            break;

            case TextureMaterialPropertySetter textureMaterialPropertySetter: {
                blendedSetter.textureSetters.Add(BlendTextureSetters(samePropertySetters));
            }
            break;

            case VectorMaterialPropertySetter vectorMaterialPropertySetter: {
                blendedSetter.vectorSetters.Add(BlendVectorSetters(samePropertySetters));
            }
            break;

            case ColorMaterialPropertySetter colorMaterialPropertySetter: {
                blendedSetter.colorSetters.Add(BlendColorSetters(samePropertySetters));
            }
            break;

            default:
                Debug.LogWarning("MaterialPropertySetter: GetBlendedSetter: Warning: Blending setters of type " + samePropertySetters[0].setter.GetType() + " is not implemented");
                break;
            }
        }
        public static MaterialPropertySetterGroup GetBlendedSetter(List <WeightedSingleSetter> singleSetters, List <SingleMaterialPropertySetter> defaults = null)
        {
            MaterialPropertySetterGroup blendedSetter    = new MaterialPropertySetterGroup();
            List <WeightedSingleSetter> remainingSetters = new List <WeightedSingleSetter>(singleSetters);

            foreach (var singleSetter in singleSetters)
            {
                if (remainingSetters.Contains(singleSetter) == false)
                {
                    continue;
                }

                List <WeightedSingleSetter> samePropertySetters = GetSamePropertySetters(remainingSetters, singleSetter.setter.propertyName);

                float weightSum = samePropertySetters.Select(s => s.weight).Sum();
                if (defaults != null && weightSum < 1)
                {
                    var defaultPropertySetter = defaults.Find(s => s.propertyName == singleSetter.setter.propertyName);
                    samePropertySetters.Add(new WeightedSingleSetter(defaultPropertySetter, 1f - weightSum));
                }

                BlendSetters(blendedSetter, samePropertySetters);

                remainingSetters = remainingSetters.Except(samePropertySetters).ToList();
            }

            return(blendedSetter);
        }