Browse Source

Fixed multivalue conversion

flabbet 8 months ago
parent
commit
7aed6fe3ff

+ 1 - 1
src/Drawie

@@ -1 +1 @@
-Subproject commit 3470bee10ed28168e63d19f03a1260f9a0aae2d3
+Subproject commit 05bb1b70b93fdef0b944c13f0dbe50e1baea0559

+ 42 - 2
src/PixiEditor.ChangeableDocument/Changeables/Graph/FuncInputProperty.cs

@@ -57,7 +57,12 @@ public class FuncInputProperty<T> : InputProperty<Func<FuncContext, T>>, IFuncIn
                 }
                 else if (sourceObj is Expression expression)
                 {
-                    ((ShaderExpressionVariable)toReturn).OverrideExpression = Adjust(expression, toReturn);
+                    ShaderExpressionVariable shaderExpressionVariable = (ShaderExpressionVariable)toReturn;
+                    shaderExpressionVariable.OverrideExpression = Adjust(expression, toReturn, out var adjustNested);
+                    if (adjustNested)
+                    {
+                        AdjustNested(((IMultiValueVariable)toReturn), expression);
+                    }
                 }
 
                 return (T)toReturn;
@@ -68,15 +73,50 @@ public class FuncInputProperty<T> : InputProperty<Func<FuncContext, T>>, IFuncIn
         return func;
     }
     
-    private Expression Adjust(Expression expression, object toReturn)
+    private Expression Adjust(Expression expression, object toReturn, out bool adjustNestedVariables)
     {
+        adjustNestedVariables = false;
         if (expression is IMultiValueVariable multiVal && toReturn is not IMultiValueVariable)
         {
             return multiVal.GetValueAt(0);
         }
 
+        if (toReturn is IMultiValueVariable)
+        {
+            adjustNestedVariables = true;
+            return expression;
+        }
+
         return expression;
     }
+    
+    private void AdjustNested(IMultiValueVariable toReturn, Expression expression)
+    {
+        if (toReturn is not ShaderExpressionVariable shaderExpressionVariable)
+        {
+            return;
+        }
+
+        if (expression is not IMultiValueVariable multiVal)
+        {
+            int count = toReturn.GetValuesCount();
+            for (int i = 0; i < count; i++)
+            {
+                toReturn.OverrideExpressionAt(i, expression);
+            }
+        }
+        else
+        {
+            int sourceCount = multiVal.GetValuesCount();
+            int targetCount = toReturn.GetValuesCount();
+
+            int count = Math.Min(sourceCount, targetCount);
+            for (int i = 0; i < count; i++)
+            {
+                toReturn.OverrideExpressionAt(i, multiVal.GetValueAt(i));
+            }
+        }
+    }
 
     object? IFuncInputProperty.GetFuncConstantValue() => constantNonOverrideValue;