public static void AddQuad(
            VertexHelper vertexHelper, Rect bounds,
            Vector2 posMin, Vector2 posMax,
            ColorMode mode, Color colorA, Color colorB,
            Vector2 uvMin, Vector2 uvMax,
            VertexMaterialData materialProperties)
        {
            int cnt = vertexHelper.currentVertCount;

            Color32[] colors = new Color32[4];
            colors[0] = GetColor(mode, colorA, colorB, bounds, posMin.x, posMin.y);
            colors[1] = GetColor(mode, colorA, colorB, bounds, posMin.x, posMax.y);
            colors[2] = GetColor(mode, colorA, colorB, bounds, posMax.x, posMax.y);
            colors[3] = GetColor(mode, colorA, colorB, bounds, posMax.x, posMin.y);

            float uvX = 0, uvY = 0, tangentW = 0;

            materialProperties.Apply(ref uvX, ref uvY, ref tangentW);

            Vector2 uv1     = new Vector2(uvX, uvY);
            Vector3 normal  = Vector3.back;
            Vector4 tangent = new Vector4(1, 0, 0, tangentW);

            vertexHelper.AddVert(new Vector3(posMin.x, posMin.y, 0f), colors[0], new Vector2(uvMin.x, uvMin.y),
                                 uv1, normal, tangent);
            vertexHelper.AddVert(new Vector3(posMin.x, posMax.y, 0f), colors[1], new Vector2(uvMin.x, uvMax.y),
                                 uv1, normal, tangent);
            vertexHelper.AddVert(new Vector3(posMax.x, posMax.y, 0f), colors[2], new Vector2(uvMax.x, uvMax.y),
                                 uv1, normal, tangent);
            vertexHelper.AddVert(new Vector3(posMax.x, posMin.y, 0f), colors[3], new Vector2(uvMax.x, uvMin.y),
                                 uv1, normal, tangent);

            vertexHelper.AddTriangle(cnt, cnt + 1, cnt + 2);
            vertexHelper.AddTriangle(cnt + 2, cnt + 3, cnt);
        }
        public VertexMaterialData Clone()
        {
            VertexMaterialData result = new VertexMaterialData();

            this.CopyTo(result);

            return(result);
        }
 public void CopyTo(VertexMaterialData target)
 {
     target.FloatProperties = CloneArray <FloatProperty, float>(this.FloatProperties);
     //target.Vector2Properties = CloneArray<Vector2Property, Vector2>(this.Vector2Properties);
     //target.Vector3Properties = CloneArray<Vector3Property, Vector3>(this.Vector3Properties);
     //target.Vector4Properties = CloneArray<Vector4Property, Vector4>(this.Vector4Properties);
     //target.ColorProperties = CloneArray<ColorProperty, Color>(this.ColorProperties);
 }
        //public Vector2Property[] Vector2Properties;
        //public Vector3Property[] Vector3Properties;
        //public Vector4Property[] Vector4Properties;
        //public ColorProperty[] ColorProperties;

        public void Apply(ref float uvX, ref float uvY, ref float tangentW)
        {
            VertexMaterialData.Apply(FloatProperties, ref uvX, ref uvY, ref tangentW);
            //VertexMaterialData.Apply(Vector2Properties, ref texCoord, ref normal, ref tangent);
            //VertexMaterialData.Apply(Vector3Properties, ref texCoord, ref normal, ref tangent);
            //VertexMaterialData.Apply(Vector4Properties, ref texCoord, ref normal, ref tangent);
            //VertexMaterialData.Apply(ColorProperties, ref uvX, ref uvY, ref tangentW);
        }
        public static void SetMaterialEffect(MaterialEffect value,
                                             Graphic graphic, VertexMaterialData materialProperties, ref MaterialEffect effect, ref string materialType)
        {
            if (effect == value && graphic.material != null)
            {
                return;
            }

            UpdateMaterial(graphic, materialProperties, ref effect, ref materialType);

            effect = value;
        }
        private static void UpdateMaterial(
            Graphic graphic, VertexMaterialData materialProperties, ref MaterialEffect effect, ref string materialType)
        {
            var info = Materials.Instance.GetMaterialInfo(materialType, effect);

            materialProperties.Clear();
            if (info != null)
            {
                graphic.material = info.Material;
                info.Properties.CopyTo(materialProperties);
            }
            else
            {
                graphic.material = null;
            }
        }
        public static void SetMaterialProperty(int propertyIndex, float value,
                                               Graphic graphic, VertexMaterialData materialProperties,
                                               ref float materialProperty1, ref float materialProperty2, ref float materialProperty3)
        {
            if (propertyIndex < 0 || propertyIndex >= 3)
            {
                throw new ArgumentException("the propertyIndex can have the value 0, 1 or 2.");
            }

            switch (propertyIndex)
            {
            case 0: materialProperty1 = value; break;

            case 1: materialProperty2 = value; break;

            case 2: materialProperty3 = value; break;
            }

            if (materialProperties.FloatProperties.Length > propertyIndex)
            {
                materialProperties.FloatProperties[propertyIndex].Value = value;
                graphic.SetVerticesDirty();
            }
        }