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"); } } }
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); } } }