public PathfinderNode(PathfinderNetwork ParentNetwork) { PathfinderLayer tmpLayer = default(PathfinderLayer); if ( ParentNetwork.NodeLayerCount == 0 ) { tmpLayer = new PathfinderLayer(ParentNetwork); } else { tmpLayer = ParentNetwork.NodeLayers[0]; } Layer = tmpLayer; tmpLayer.Node_Add(this); }
public void NodeLayer_Add(PathfinderLayer NewNodeLayer) { if ( NodeLayerCount > 0 ) { NodeLayers[NodeLayerCount - 1].ParentLayer = NewNodeLayer; } Array.Resize(ref NodeLayers, NodeLayerCount + 1); NodeLayers[NodeLayerCount] = NewNodeLayer; NodeLayers[NodeLayerCount].Network_LayerNum = NodeLayerCount; NodeLayerCount++; }
public void ForceDeallocate() { int A = 0; for ( A = 0; A <= ConnectionCount - 1; A++ ) { Connections[A].ForceDeallocate(); } Connections = null; Nodes = null; ParentNode = null; Layer = null; }
public PathfinderNode(PathfinderLayer NewParentLayer) { Layer = NewParentLayer; Layer.Node_Add(this); }
public void FindParent() { PathfinderNode tmpNodeA = default(PathfinderNode); float BestScore = 0; PathfinderNode BestNode = null; float Score = 0; int A = 0; bool MakeNew = default(bool); int B = 0; int Count = 0; int C = 0; bool Allow = default(bool); PathfinderConnection tmpConnection = default(PathfinderConnection); PathfinderNode DestNode = default(PathfinderNode); if ( NodeCount == 0 & Layer.Network_LayerNum > 0 ) { Debugger.Break(); return; } if ( ParentNode != null ) { Debugger.Break(); return; } BestScore = float.MaxValue; for ( A = 0; A <= ConnectionCount - 1; A++ ) { tmpConnection = Connections[A]; DestNode = tmpConnection.GetOtherNode(this); tmpNodeA = DestNode.ParentNode; if ( tmpNodeA == null ) { tmpNodeA = tmpConnection.GetOtherNode(this); Score = tmpConnection.Value * (0.98F + VBMath.Rnd() * 0.04F); if ( Score < BestScore ) { BestScore = Score; BestNode = tmpNodeA; MakeNew = true; } } else { //dont allow this to join to another when the other has 3 nodes and they only have one connection if ( tmpNodeA.NodeCount == 3 ) { Count = 0; Allow = false; for ( B = 0; B <= tmpNodeA.NodeCount - 1; B++ ) { for ( C = 0; C <= tmpNodeA.Nodes[B].ConnectionCount - 1; C++ ) { if ( tmpNodeA.Nodes[B].Connections[C].GetOtherNode(tmpNodeA.Nodes[B]) == this ) { Count++; if ( Count >= 2 ) { Allow = true; goto CountFinished; } break; } } } CountFinished: 1.GetHashCode(); //TODO: cleanup this loop } else { Allow = true; } if ( Allow ) { Score = (DestNode.SiblingSpan + tmpConnection.Value) * (0.98F + VBMath.Rnd() * 0.04F); if ( Score < BestScore ) { BestScore = Score; BestNode = tmpNodeA; MakeNew = false; } } } } if ( BestNode != null ) { if ( MakeNew ) { PathfinderLayer tmpLayer = default(PathfinderLayer); if ( Layer.ParentLayer == null ) { tmpLayer = new PathfinderLayer(Layer.Network); } else { tmpLayer = Layer.ParentLayer; } PathfinderNode NewNode = new PathfinderNode(tmpLayer); NewNode.Node_Add(this); NewNode.Node_Add(BestNode); NewNode.SpanCalc(); RaiseConnections(); BestNode.RaiseConnections(); NewNode.Layer.Network.FindParentNode_Add(NewNode); } else { if ( BestNode != null ) { BestNode.Node_Add(this); if ( BestNode.NodeCount >= 4 ) { BestNode.Split(); } else { BestNode.SpanCalc(); RaiseConnections(); if ( BestNode.ParentNode == null ) { BestNode.Layer.Network.FindParentNode_Add(BestNode); } } } } } else if ( ConnectionCount > 0 ) { //it is part of a network but there is no suitable parent to join, so make a new isolated parent PathfinderLayer tmpLayer = default(PathfinderLayer); if ( Layer.ParentLayer == null ) { tmpLayer = new PathfinderLayer(Layer.Network); } else { tmpLayer = Layer.ParentLayer; } PathfinderNode NewNode = new PathfinderNode(tmpLayer); NewNode.Node_Add(this); NewNode.SpanCalc(); RaiseConnections(); NewNode.Layer.Network.FindParentNode_Add(NewNode); } }
public void ForceDeallocate() { int A = 0; for ( A = 0; A <= NodeCount - 1; A++ ) { Nodes[A].ForceDeallocate(); } Nodes = null; Connections = null; Network = null; ParentLayer = null; }