Browse Source

Use entire color HslaToRgba if all expressions access same color

CPKreuz 11 months ago
parent
commit
616ced6fd5

+ 5 - 0
src/PixiEditor.ChangeableDocument/Changeables/Graph/Context/FuncContext.cs

@@ -122,6 +122,11 @@ public class FuncContext
             constantHalf4.ConstantValue = Color.FromHsl((float)hValue, (float)sValue, (float)lValue, aByte);
             constantHalf4.ConstantValue = Color.FromHsl((float)hValue, (float)sValue, (float)lValue, aByte);
             return constantHalf4;
             return constantHalf4;
         }
         }
+
+        if (Half4Float1Accessor.AllAccessSame(h, s, l, a, out var half4))
+        {
+            return Builder.AssignNewHalf4(Builder.Functions.GetHslToRgb(half4));
+        }
         
         
         return Builder.AssignNewHalf4(Builder.Functions.GetHslToRgb(h, s, l, a));
         return Builder.AssignNewHalf4(Builder.Functions.GetHslToRgb(h, s, l, a));
     }
     }

+ 25 - 1
src/PixiEditor.DrawingApi.Core/Shaders/Generation/Expressions/Float1.cs

@@ -12,9 +12,33 @@ public class Float1(string name) : ShaderExpressionVariable<double>(name)
 
 
     public override Expression? OverrideExpression { get; set; }
     public override Expression? OverrideExpression { get; set; }
 
 
-    public static implicit operator Float1(double value) => new Float1("") { ConstantValue = value };
+    public static implicit operator Float1(double value) => new("") { ConstantValue = value };
 
 
     public static explicit operator double(Float1 value) => value.ConstantValue;
     public static explicit operator double(Float1 value) => value.ConstantValue;
 
 
     public byte FullSizeByteConstant => (byte)(ConstantValue * 255);
     public byte FullSizeByteConstant => (byte)(ConstantValue * 255);
 }
 }
+
+public class Half4Float1Accessor : Float1
+{
+    public Half4Float1Accessor(Half4 accessTo, char name) : base(string.IsNullOrEmpty(accessTo.VariableName) ? string.Empty : $"{accessTo.VariableName}.{name}")
+    {
+        Accesses = accessTo;
+    }
+    
+    public Half4 Accesses { get; }
+
+    public static bool AllAccessSame(Expression r, Expression g, Expression b, Expression a, out Half4? half4)
+    {
+        if (r is Half4Float1Accessor rA && g is Half4Float1Accessor gA &&
+            b is Half4Float1Accessor bA && a is Half4Float1Accessor aA &&
+            rA.Accesses == gA.Accesses && bA.Accesses == aA.Accesses && rA.Accesses == bA.Accesses)
+        {
+            half4 = rA.Accesses;
+            return true;
+        }
+
+        half4 = null;
+        return false;
+    }
+}

+ 6 - 6
src/PixiEditor.DrawingApi.Core/Shaders/Generation/Expressions/Half4.cs

@@ -8,12 +8,12 @@ public class Half4(string name) : ShaderExpressionVariable<Color>(name), IMultiV
     private Expression? _overrideExpression;
     private Expression? _overrideExpression;
     public override string ConstantValueString => $"half4({ConstantValue.R}, {ConstantValue.G}, {ConstantValue.B}, {ConstantValue.A})";
     public override string ConstantValueString => $"half4({ConstantValue.R}, {ConstantValue.G}, {ConstantValue.B}, {ConstantValue.A})";
     
     
-    public Float1 R => new Float1(string.IsNullOrEmpty(VariableName) ? string.Empty : $"{VariableName}.r") { ConstantValue = ConstantValue.R, OverrideExpression = _overrideExpression};
-    public Float1 G => new Float1(string.IsNullOrEmpty(VariableName) ? string.Empty : $"{VariableName}.g") { ConstantValue = ConstantValue.G, OverrideExpression = _overrideExpression};
-    public Float1 B => new Float1(string.IsNullOrEmpty(VariableName) ? string.Empty : $"{VariableName}.b") { ConstantValue = ConstantValue.B, OverrideExpression = _overrideExpression};
-    public Float1 A => new Float1(string.IsNullOrEmpty(VariableName) ? string.Empty : $"{VariableName}.a") { ConstantValue = ConstantValue.A, OverrideExpression = _overrideExpression};
-    
-    public static implicit operator Half4(Color value) => new Half4("") { ConstantValue = value };
+    public Float1 R => new Half4Float1Accessor(this, 'r') { ConstantValue = ConstantValue.R, OverrideExpression = _overrideExpression};
+    public Float1 G => new Half4Float1Accessor(this, 'g') { ConstantValue = ConstantValue.G, OverrideExpression = _overrideExpression};
+    public Float1 B => new Half4Float1Accessor(this, 'b') { ConstantValue = ConstantValue.B, OverrideExpression = _overrideExpression};
+    public Float1 A => new Half4Float1Accessor(this, 'a') { ConstantValue = ConstantValue.A, OverrideExpression = _overrideExpression};
+
+    public static implicit operator Half4(Color value) => new("") { ConstantValue = value };
     public static explicit operator Color(Half4 value) => value.ConstantValue;
     public static explicit operator Color(Half4 value) => value.ConstantValue;
 
 
     public override Expression? OverrideExpression
     public override Expression? OverrideExpression