209 lines
6.8 KiB
C#
209 lines
6.8 KiB
C#
using FIMSpace.Generating.Planning.PlannerNodes;
|
|
using FIMSpace.Generating.Planning.PlannerNodes.FunctionNode;
|
|
using FIMSpace.Graph;
|
|
using UnityEngine;
|
|
|
|
namespace FIMSpace.Generating.Planning
|
|
{
|
|
public partial class PlannerFunctionNode
|
|
{
|
|
|
|
[System.Serializable]
|
|
public class FunctionPortRef
|
|
{
|
|
public PlannerRuleBase Parent;
|
|
public string DisplayName = "";
|
|
public int RootPortID = -1;
|
|
public int RootPortHelpID = -1;
|
|
public EFunctionPortType ViewType = EFunctionPortType.Int;
|
|
public EPortPinType PinType = EPortPinType.Input;
|
|
|
|
public IntPort p_Int = null;
|
|
public BoolPort p_Bool = null;
|
|
public FloatPort p_Float = null;
|
|
public PGGVector3Port p_Vector3 = null;
|
|
public PGGCellPort p_Cell = null;
|
|
public PGGPlannerPort p_Field = null;
|
|
public PGGStringPort p_String = null;
|
|
|
|
|
|
public FunctionPortRef(PlannerRuleBase parent, EFunctionPortType valueType, EPortPinType pinType)
|
|
{
|
|
Parent = parent;
|
|
|
|
DisplayName = Parent.GetDisplayName();
|
|
RootPortID = parent.IndividualID;
|
|
|
|
ViewType = valueType;
|
|
PinType = pinType;
|
|
//UnityEngine.Debug.Log("Creat " + valueType);
|
|
|
|
RefreshInstances();
|
|
}
|
|
|
|
|
|
public void PreGeneratePrepare()
|
|
{
|
|
if (ViewType == EFunctionPortType.Field)
|
|
{
|
|
if (p_Field != null) p_Field.Clear();
|
|
}
|
|
}
|
|
|
|
void RefreshInstances(bool force = true)
|
|
{
|
|
if (force)
|
|
{
|
|
p_Int = new IntPort();
|
|
p_Bool = new BoolPort();
|
|
p_Float = new FloatPort();
|
|
p_Vector3 = new PGGVector3Port();
|
|
p_Cell = new PGGCellPort();
|
|
p_String = new PGGStringPort();
|
|
p_Field = new PGGPlannerPort();
|
|
}
|
|
else
|
|
{
|
|
if (p_Int == null) p_Int = new IntPort();
|
|
if (p_Bool == null) p_Bool = new BoolPort();
|
|
if (p_Float == null) p_Float = new FloatPort();
|
|
if (p_Vector3 == null) p_Vector3 = new PGGVector3Port();
|
|
if (p_Cell == null) p_Cell = new PGGCellPort();
|
|
if (p_String == null) p_String = new PGGStringPort();
|
|
if (p_Field == null) p_Field = new PGGPlannerPort();
|
|
}
|
|
}
|
|
|
|
|
|
public NodePortBase GetPort()
|
|
{
|
|
NodePortBase prt = null;
|
|
|
|
|
|
switch (ViewType)
|
|
{
|
|
case EFunctionPortType.Int: prt = p_Int; break;
|
|
case EFunctionPortType.Bool: prt = p_Bool; break;
|
|
case EFunctionPortType.Number: prt = p_Float; break;
|
|
case EFunctionPortType.Vector3: prt = p_Vector3; break;
|
|
case EFunctionPortType.String: prt = p_String; break;
|
|
case EFunctionPortType.Cell: prt = p_Cell; break;
|
|
case EFunctionPortType.Field: prt = p_Field; break;
|
|
}
|
|
|
|
if (prt != null)
|
|
{
|
|
if (Parent) prt.DisplayName = Parent.GetDisplayName();
|
|
else prt.DisplayName = DisplayName;
|
|
}
|
|
else
|
|
{
|
|
RefreshInstances(false);
|
|
}
|
|
|
|
return prt;
|
|
}
|
|
|
|
public void RefreshValue()
|
|
{
|
|
FN_Output fOut = Parent as FN_Output;
|
|
|
|
if (fOut)
|
|
{
|
|
fOut.OnStartReadingNode();
|
|
|
|
var port = fOut.GetFunctionOutputPort();
|
|
port.TriggerReadPort();
|
|
port.GetPortValueCall(false);
|
|
|
|
fOut.RefreshPortValue();
|
|
|
|
SetValueOf(port);
|
|
}
|
|
else if (Parent is FN_Input)
|
|
{
|
|
FN_Input fInp = Parent as FN_Input;
|
|
fInp.OnStartReadingNode();
|
|
|
|
var port = GetPort();
|
|
////UnityEngine.Debug.Log(port.DisplayName +" is connected ? " + port.Connections.Count);
|
|
port.TriggerReadPort(false);
|
|
port.GetPortValueCall(false);
|
|
fInp.SetValueOf(port);
|
|
}
|
|
else if (Parent is FN_Parameter)
|
|
{
|
|
FN_Parameter fParam = Parent as FN_Parameter;
|
|
fParam.OnStartReadingNode();
|
|
|
|
var port = GetPort();
|
|
port.TriggerReadPort();
|
|
port.GetPortValueCall(false);
|
|
|
|
fParam.SetValue(port.GetPortValueSafe);
|
|
}
|
|
}
|
|
|
|
void SetValueOf(NodePortBase p)
|
|
{
|
|
if (p == null) { UnityEngine.Debug.Log("Null port value!"); return; }
|
|
|
|
object o = p.GetPortValueSafe;
|
|
|
|
switch (ViewType)
|
|
{
|
|
case EFunctionPortType.Int:
|
|
if (o != null)
|
|
p_Int.Value = (int)o;
|
|
break;
|
|
|
|
case EFunctionPortType.Bool:
|
|
if (o != null)
|
|
p_Bool.Value = (bool)o;
|
|
break;
|
|
|
|
case EFunctionPortType.Number:
|
|
if (o != null)
|
|
p_Float.Value = (float)o;
|
|
break;
|
|
|
|
case EFunctionPortType.Vector3:
|
|
|
|
if (o != null)
|
|
{
|
|
if (o is Vector3)
|
|
{
|
|
p_Vector3.Value = (Vector3)o;
|
|
}
|
|
else UnityEngine.Debug.Log("Inputting not Vector3! it's " + o.GetType() + " (" + o + ")");
|
|
}
|
|
|
|
break;
|
|
|
|
case EFunctionPortType.String:
|
|
if (o != null)
|
|
p_String.StringVal = (string)o;
|
|
break;
|
|
|
|
case EFunctionPortType.Cell:
|
|
if (p is PGGCellPort)
|
|
{
|
|
p_Cell.ProvideFullCellData(p as PGGCellPort);
|
|
}
|
|
break;
|
|
|
|
case EFunctionPortType.Field:
|
|
if (p is PGGPlannerPort)
|
|
{
|
|
p_Field.CopyValuesOfOtherPort(p);
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} |