From f3ea9d7c7f3863e6fc6d2bbc180f75c8315c5145 Mon Sep 17 00:00:00 2001 From: boyce <6549168@qq.com> Date: Tue, 28 Oct 2025 10:36:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86port=20index=E6=94=B9=E4=B8=BAid,?= =?UTF-8?q?=E6=8F=90=E9=AB=98=E5=85=BC=E5=AE=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- util/blueprint/blueprint_test.go | 11 --- util/blueprint/exec.go | 118 ++++++++++++++++++++----------- util/blueprint/execpool.go | 26 ++++--- util/blueprint/graph.go | 26 +++---- util/blueprint/graphpool.go | 9 +-- 5 files changed, 113 insertions(+), 77 deletions(-) diff --git a/util/blueprint/blueprint_test.go b/util/blueprint/blueprint_test.go index df2e940..deb92cf 100644 --- a/util/blueprint/blueprint_test.go +++ b/util/blueprint/blueprint_test.go @@ -5,18 +5,7 @@ import ( ) func TestExecMgr(t *testing.T) { - var bp Blueprint - err := bp.Init("D:\\Develop\\OriginNodeEditor\\json", "D:\\Develop\\OriginNodeEditor\\vgf", nil) - if err != nil { - t.Fatalf("init failed,err:%v", err) - } - graphTest1 := bp.Create("testArrayOperator", 0) - err = graphTest1.Do(EntranceID_IntParam, 20, 1, 3) - if err != nil { - t.Fatalf("Do EntranceID_IntParam failed,err:%v", err) - } - graphTest1.Release() //graphTest2 := bp.Create("testForeach") //err = graphTest2.Do(EntranceID_IntParam, 1, 2, 3) //if err != nil { diff --git a/util/blueprint/exec.go b/util/blueprint/exec.go index da3de2b..3ba6be4 100644 --- a/util/blueprint/exec.go +++ b/util/blueprint/exec.go @@ -22,9 +22,6 @@ type IInnerExecNode interface { GetInPort(index int) IPort GetOutPort(index int) IPort - - GetInPortParamStartIndex() int - GetOutPortParamStartIndex() int } type IExecNode interface { @@ -46,9 +43,6 @@ type innerExecNode struct { inPort []IPort outPort []IPort - inPortParamStartIndex int // 输入参数的起始索引,用于排除执行入口 - outPortParamStartIndex int // 输出参数的起始索引,用于排除执行出口 - IExecNode } @@ -67,51 +61,100 @@ type InputConfig struct { DataType string `json:"data_type"` HasInput bool `json:"has_input"` PinWidget string `json:"pin_widget"` + PortId int `json:"port_id"` } -type OutInputConfig struct { +type OutputConfig struct { Name string `json:"name"` PortType string `json:"type"` DataType string `json:"data_type"` HasInput bool `json:"has_input"` + PortId int `json:"port_id"` } type BaseExecConfig struct { - Name string `json:"name"` - Title string `json:"title"` - Package string `json:"package"` - Description string `json:"description"` - IsPure bool `json:"is_pure"` - Inputs []InputConfig `json:"inputs"` - Outputs []OutInputConfig `json:"outputs"` + Name string `json:"name"` + Title string `json:"title"` + Package string `json:"package"` + Description string `json:"description"` + IsPure bool `json:"is_pure"` + Inputs []InputConfig `json:"inputs"` + Outputs []OutputConfig `json:"outputs"` } -func (em *innerExecNode) AppendInPort(port ...IPort) { - if len(em.inPort) == 0 { - em.inPortParamStartIndex = -1 - } - - for i := 0; i < len(port); i++ { - if !port[i].IsPortExec() && em.inPortParamStartIndex < 0 { - em.inPortParamStartIndex = len(em.inPort) +func (bc *BaseExecConfig) GetMaxInPortId() int { + maxPortId := -1 + for i := range bc.Inputs { + if bc.Inputs[i].PortId > maxPortId { + maxPortId = bc.Inputs[i].PortId } - - em.inPort = append(em.inPort, port[i]) } + + return maxPortId } -func (em *innerExecNode) AppendOutPort(port ...IPort) { - if len(em.outPort) == 0 { - em.outPortParamStartIndex = -1 - } - for i := 0; i < len(port); i++ { - if !port[i].IsPortExec() && em.outPortParamStartIndex < 0 { - em.outPortParamStartIndex = len(em.outPort) +func (bc *BaseExecConfig) GetMaxOutPortId() int { + maxPortId := -1 + for i := range bc.Outputs { + if bc.Outputs[i].PortId > maxPortId { + maxPortId = bc.Outputs[i].PortId } - em.outPort = append(em.outPort, port[i]) } + + return maxPortId } +//func (em *innerExecNode) AppendInPort(port ...IPort) { +// if len(em.inPort) == 0 { +// em.inPortParamStartIndex = -1 +// } +// +// for i := 0; i < len(port); i++ { +// if !port[i].IsPortExec() && em.inPortParamStartIndex < 0 { +// em.inPortParamStartIndex = len(em.inPort) +// } +// +// em.inPort = append(em.inPort, port[i]) +// } +//} + +func (em *innerExecNode) PrepareMaxInPortId(maxInPortId int) { + em.inPort = make([]IPort, 0, maxInPortId+1) +} + +func (em *innerExecNode) PrepareMaxOutPortId(maxOutPortId int) { + em.outPort = make([]IPort, 0, maxOutPortId+1) +} + +func (em *innerExecNode) SetInPortById(id int, port IPort) bool { + if id < 0 || id >= len(em.inPort) { + return false + } + em.inPort[id] = port + return true +} + +func (em *innerExecNode) SetOutPortById(id int, port IPort) bool { + if id < 0 || id >= len(em.outPort) { + return false + } + em.outPort[id] = port + return true +} + +// +//func (em *innerExecNode) AppendOutPort(port ...IPort) { +// if len(em.outPort) == 0 { +// em.outPortParamStartIndex = -1 +// } +// for i := 0; i < len(port); i++ { +// if !port[i].IsPortExec() && em.outPortParamStartIndex < 0 { +// em.outPortParamStartIndex = len(em.outPort) +// } +// em.outPort = append(em.outPort, port[i]) +// } +//} + func (em *innerExecNode) GetName() string { return em.Name } @@ -182,14 +225,6 @@ func (em *innerExecNode) GetOutPort(index int) IPort { return em.outPort[index] } -func (em *innerExecNode) GetInPortParamStartIndex() int { - return em.inPortParamStartIndex -} - -func (em *innerExecNode) GetOutPortParamStartIndex() int { - return em.outPortParamStartIndex -} - func (en *BaseExecNode) GetBluePrintModule() IBlueprintModule { return en.gr.IBlueprintModule } @@ -530,8 +565,7 @@ func (en *BaseExecNode) setVariableName(name string) bool { return false } - -func (en *BaseExecNode) GetBlueprintModule() IBlueprintModule{ +func (en *BaseExecNode) GetBlueprintModule() IBlueprintModule { if en.gr == nil { return nil } diff --git a/util/blueprint/execpool.go b/util/blueprint/execpool.go index 6ba063f..1ff76ed 100644 --- a/util/blueprint/execpool.go +++ b/util/blueprint/execpool.go @@ -125,6 +125,8 @@ func (em *ExecPool) createExecFromJSON(baseExecConfig BaseExecConfig) (IInnerExe baseExec.Title = baseExecConfig.Title baseExec.Package = baseExecConfig.Package baseExec.Description = baseExecConfig.Description + baseExec.PrepareMaxInPortId(baseExecConfig.GetMaxInPortId()) + baseExec.PrepareMaxOutPortId(baseExecConfig.GetMaxOutPortId()) // exec数量 inExecNum := 0 @@ -143,7 +145,8 @@ func (em *ExecPool) createExecFromJSON(baseExecConfig BaseExecConfig) (IInnerExe } inExecNum++ - baseExec.AppendInPort(NewPortExec()) + baseExec.SetInPortById(input.PortId, NewPortExec()) + // baseExec.AppendInPort(NewPortExec()) continue } @@ -152,7 +155,7 @@ func (em *ExecPool) createExecFromJSON(baseExecConfig BaseExecConfig) (IInnerExe return nil, err } - baseExec.AppendInPort(port) + baseExec.SetInPortById(input.PortId, port) } hasData := false @@ -168,16 +171,17 @@ func (em *ExecPool) createExecFromJSON(baseExecConfig BaseExecConfig) (IInnerExe } if portType == Config_PortType_Exec { - baseExec.AppendOutPort(NewPortExec()) + baseExec.SetOutPortById(output.PortId, NewPortExec()) continue } + hasData = true port, err := em.createPortByDataType(baseExec.Name, output.Name, output.DataType) if err != nil { return nil, err } - baseExec.AppendOutPort(port) + baseExec.SetOutPortById(output.PortId, port) } return &baseExec, nil } @@ -201,7 +205,7 @@ func (em *ExecPool) Register(exec IExecNode) bool { return false } - if _, ok := em.execNodeMap[innerNode.GetName()]; ok { + if _, ok = em.execNodeMap[innerNode.GetName()]; ok { return false } @@ -275,12 +279,13 @@ func (em *ExecPool) loadSysExec() error { func (em *ExecPool) regGetVariables(typ string) error { var baseExec innerExecNode baseExec.Name = genGetVariablesNodeName(typ) + baseExec.PrepareMaxOutPortId(0) outPort := NewPortByType(typ) if outPort == nil { return fmt.Errorf("invalid type %s", typ) } - baseExec.AppendOutPort(outPort) + baseExec.SetOutPortById(0, outPort) var getVariablesNode GetVariablesNode getVariablesNode.nodeName = baseExec.GetName() @@ -311,9 +316,14 @@ func (em *ExecPool) regSetVariables(typ string) error { inPort := NewPortByType(typ) outExecPort := NewPortByType(Config_PortType_Exec) outPort := NewPortByType(typ) + baseExec.PrepareMaxInPortId(1) + baseExec.PrepareMaxOutPortId(1) - baseExec.AppendInPort(inExecPort, inPort) - baseExec.AppendOutPort(outExecPort, outPort) + baseExec.SetInPortById(0, inExecPort) + baseExec.SetInPortById(1, inPort) + + baseExec.SetOutPortById(0, outExecPort) + baseExec.SetOutPortById(1, outPort) baseExec.IExecNode = &SetVariablesNode{nodeName: baseExec.GetName()} if !em.loadBaseExec(&baseExec) { diff --git a/util/blueprint/graph.go b/util/blueprint/graph.go index d9b4aa7..54bd4d9 100644 --- a/util/blueprint/graph.go +++ b/util/blueprint/graph.go @@ -2,21 +2,23 @@ package blueprint import ( "fmt" - "github.com/goccy/go-json" "time" + "github.com/duanhf2012/origin/v2/service" + "github.com/goccy/go-json" ) const ReturnVarial = "g_Return" + type IGraph interface { - Do(entranceID int64, args ...any) (Port_Array,error) + Do(entranceID int64, args ...any) (Port_Array, error) Release() } type IBlueprintModule interface { SafeAfterFunc(timerId *uint64, d time.Duration, AdditionData interface{}, cb func(uint64, interface{})) TriggerEvent(graphID int64, eventID int64, args ...any) error - CancelTimerId(graphID int64,timerId *uint64) bool + CancelTimerId(graphID int64, timerId *uint64) bool GetGameService() service.IService GetBattleService() service.IService } @@ -52,8 +54,8 @@ type edgeConfig struct { SourceNodeID string `json:"source_node_id"` DesNodeId string `json:"des_node_id"` - SourcePortIndex int `json:"source_port_index"` - DesPortIndex int `json:"des_port_index"` + SourcePortId int `json:"source_port_id"` + DesPortId int `json:"des_port_id"` } type MultiTypeValue struct { @@ -134,10 +136,10 @@ func (gc *graphConfig) GetNodeByID(nodeID string) *nodeConfig { return nil } -func (gr *Graph) Do(entranceID int64, args ...any) (Port_Array,error) { +func (gr *Graph) Do(entranceID int64, args ...any) (Port_Array, error) { entranceNode := gr.entrance[entranceID] if entranceNode == nil { - return nil,fmt.Errorf("entranceID:%d not found", entranceID) + return nil, fmt.Errorf("entranceID:%d not found", entranceID) } gr.variables = map[string]IPort{} @@ -150,17 +152,17 @@ func (gr *Graph) Do(entranceID int64, args ...any) (Port_Array,error) { return nil, err } - if gr.globalVariables!= nil { + if gr.globalVariables != nil { port := gr.globalVariables[ReturnVarial] if port != nil { - array,ok := port.GetArray() - if ok{ - return array,nil + array, ok := port.GetArray() + if ok { + return array, nil } } } - return nil,nil + return nil, nil } func (gr *Graph) GetNodeInPortValue(nodeID string, inPortIndex int) IPort { diff --git a/util/blueprint/graphpool.go b/util/blueprint/graphpool.go index 31a9a29..3e08777 100644 --- a/util/blueprint/graphpool.go +++ b/util/blueprint/graphpool.go @@ -2,10 +2,11 @@ package blueprint import ( "fmt" - "github.com/goccy/go-json" "os" "path/filepath" "strings" + + "github.com/goccy/go-json" ) type GraphPool struct { @@ -206,7 +207,7 @@ func (gp *GraphPool) prepareOneNode(mapNodeExec map[string]*execNode, nodeExec * func (gp *GraphPool) findOutNextNode(graphConfig *graphConfig, mapNodeExec map[string]*execNode, sourceNodeID string, sourcePortIdx int) *execNode { // 找到出口的NodeID for _, edge := range graphConfig.Edges { - if edge.SourceNodeID == sourceNodeID && edge.SourcePortIndex == sourcePortIdx { + if edge.SourceNodeID == sourceNodeID && edge.SourcePortId == sourcePortIdx { return mapNodeExec[edge.DesNodeId] } } @@ -254,7 +255,7 @@ func (gp *GraphPool) prepareOneEntrance(graphName string, entranceID int64, node func (gp *GraphPool) findPreInPortNode(mapNodes map[string]*execNode, nodeExec *execNode, graphConfig *graphConfig, portIdx int) *prePortNode { for _, edge := range graphConfig.Edges { - if edge.DesNodeId == nodeExec.Id && edge.DesPortIndex == portIdx { + if edge.DesNodeId == nodeExec.Id && edge.DesPortId == portIdx { srcNode := mapNodes[edge.SourceNodeID] if srcNode == nil { return nil @@ -262,7 +263,7 @@ func (gp *GraphPool) findPreInPortNode(mapNodes map[string]*execNode, nodeExec * var preNode prePortNode preNode.node = srcNode - preNode.outPortIndex = edge.SourcePortIndex + preNode.outPortIndex = edge.SourcePortId return &preNode }