public override void CreateConnections(MaterialExpressionAppendVector unrealNode, Material unrealMaterial, ShaderGraphBuilder builder)
        {
            if (unrealNode.A != null)
            {
                var a = unrealMaterial.ResolveExpressionReference(
                    ValueUtil.ParseExpressionReference(unrealNode.A.FindPropertyValue("Expression"))
                    );
                var aSlot = builder.FindSlot <MaterialSlot>(a?.Name, unrealNode.Name, 0, unrealNode.A);

                if (aSlot.concreteValueType == ConcreteSlotValueType.Vector4 || aSlot.concreteValueType == ConcreteSlotValueType.Vector3)
                {
                    builder.Connect(a?.Name, unrealNode.Name, 0, unrealNode.A);
                    builder.Connect(a?.Name, unrealNode.Name, 1, unrealNode.A);
                    builder.Connect(a?.Name, unrealNode.Name, 2, unrealNode.A);
                }
                else if (aSlot.concreteValueType == ConcreteSlotValueType.Vector2)
                {
                    builder.Connect(a?.Name, unrealNode.Name, 0, unrealNode.A);
                    builder.Connect(a?.Name, unrealNode.Name, 1, unrealNode.A);
                }
                else if (aSlot.concreteValueType == ConcreteSlotValueType.Vector1)
                {
                    builder.Connect(a?.Name, unrealNode.Name, 0, unrealNode.A);
                }
                else
                {
                    throw new System.Exception("FIXME: unhandled vector type");
                }
            }

            if (unrealNode.B != null)
            {
                var b = unrealMaterial.ResolveExpressionReference(
                    ValueUtil.ParseExpressionReference(unrealNode.B.FindPropertyValue("Expression"))
                    );
                var bSlot = builder.FindSlot <MaterialSlot>(b?.Name, unrealNode.Name, 0, unrealNode.B);

                if (bSlot.concreteValueType == ConcreteSlotValueType.Vector4 || bSlot.concreteValueType == ConcreteSlotValueType.Vector3)
                {
                    builder.Connect(b?.Name, unrealNode.Name, 0, unrealNode.B);
                    builder.Connect(b?.Name, unrealNode.Name, 1, unrealNode.B);
                    builder.Connect(b?.Name, unrealNode.Name, 2, unrealNode.B);
                }
                else if (bSlot.concreteValueType == ConcreteSlotValueType.Vector2)
                {
                    builder.Connect(b?.Name, unrealNode.Name, 1, unrealNode.B);
                    builder.Connect(b?.Name, unrealNode.Name, 2, unrealNode.B);
                }
                else if (bSlot.concreteValueType == ConcreteSlotValueType.Vector1)
                {
                    builder.Connect(b?.Name, unrealNode.Name, 1, unrealNode.B);
                }
                else
                {
                    throw new System.Exception("FIXME: unhandled vector type");
                }
            }
        }
Ejemplo n.º 2
0
        public override void CreateConnections(MaterialExpressionMaterialFunctionCall unrealNode, Material unrealMaterial, ShaderGraphBuilder builder)
        {
            foreach (var functionInput in unrealNode.FunctionInputs)
            {
                var inputPropertyBag      = ValueUtil.ParseAttributeList(functionInput.FindPropertyValue("Input"));
                var expressionValue       = ValueUtil.ParseExpressionReference(inputPropertyBag.FindPropertyValue("Expression"));
                var resolvedFunctionInput = unrealMaterial.ResolveExpressionReference(expressionValue);

                if (resolvedFunctionInput != null)
                {
                    var slotId    = GetConnectionIdSlotForFunctionInput(inputPropertyBag.FindPropertyValue("InputName"), resolvedFunctionInput);
                    var inputSlot = builder.FindSlot <MaterialSlot>(resolvedFunctionInput?.Name, unrealNode.Name, slotId, inputPropertyBag);

                    builder.Connect(resolvedFunctionInput?.Name, unrealNode.Name, slotId, inputPropertyBag);
                }
            }
        }