diff --git a/projects/openttd_vs100.vcxproj b/projects/openttd_vs100.vcxproj
index fcfb2e61e9..48b6a70781 100644
--- a/projects/openttd_vs100.vcxproj
+++ b/projects/openttd_vs100.vcxproj
@@ -332,6 +332,7 @@
+
@@ -476,6 +477,7 @@
+
diff --git a/projects/openttd_vs100.vcxproj.filters b/projects/openttd_vs100.vcxproj.filters
index 23806dfafd..f049a2777f 100644
--- a/projects/openttd_vs100.vcxproj.filters
+++ b/projects/openttd_vs100.vcxproj.filters
@@ -225,6 +225,9 @@
Source Files
+
+ Source Files
+
Source Files
@@ -657,6 +660,9 @@
Header Files
+
+ Header Files
+
Header Files
diff --git a/projects/openttd_vs80.vcproj b/projects/openttd_vs80.vcproj
index 3cf722b026..36f89adf74 100644
--- a/projects/openttd_vs80.vcproj
+++ b/projects/openttd_vs80.vcproj
@@ -598,6 +598,10 @@
RelativePath=".\..\src\linkgraph\demands.cpp"
>
+
+
@@ -1178,6 +1182,10 @@
RelativePath=".\..\src\linkgraph\demands.h"
>
+
+
diff --git a/projects/openttd_vs90.vcproj b/projects/openttd_vs90.vcproj
index 040ee91547..286b5b7209 100644
--- a/projects/openttd_vs90.vcproj
+++ b/projects/openttd_vs90.vcproj
@@ -595,6 +595,10 @@
RelativePath=".\..\src\linkgraph\demands.cpp"
>
+
+
@@ -1175,6 +1179,10 @@
RelativePath=".\..\src\linkgraph\demands.h"
>
+
+
diff --git a/source.list b/source.list
index 01d4d1f02f..0fc1b19098 100644
--- a/source.list
+++ b/source.list
@@ -40,6 +40,7 @@ ini.cpp
ini_load.cpp
landscape.cpp
linkgraph/demands.cpp
+linkgraph/flowmapper.cpp
linkgraph/linkgraph.cpp
linkgraph/linkgraphjob.cpp
linkgraph/linkgraphschedule.cpp
@@ -209,6 +210,7 @@ landscape.h
landscape_type.h
language.h
linkgraph/demands.h
+linkgraph/flowmapper.h
linkgraph/init.h
linkgraph/linkgraph.h
linkgraph/linkgraph_base.h
diff --git a/src/linkgraph/flowmapper.cpp b/src/linkgraph/flowmapper.cpp
new file mode 100644
index 0000000000..70779e8ecc
--- /dev/null
+++ b/src/linkgraph/flowmapper.cpp
@@ -0,0 +1,62 @@
+/* $Id$ */
+
+/*
+ * This file is part of OpenTTD.
+ * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+ * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see .
+ */
+
+/** @file flowmapper.cpp Definition of flowmapper. */
+
+#include "../stdafx.h"
+#include "flowmapper.h"
+
+/**
+ * Map the paths generated by the MCF solver into flows associated with nodes.
+ * @param component the link graph component to be used.
+ */
+void FlowMapper::Run(LinkGraphJob &job) const
+{
+ /* Time the graph has been running without being compressed. */
+ uint runtime = job.JoinDate() - job.Settings().recalc_time - job.LastCompression();
+
+ for (NodeID node_id = 0; node_id < job.Size(); ++node_id) {
+ Node prev_node = job[node_id];
+ StationID prev = prev_node.Station();
+ PathList &paths = prev_node.Paths();
+ for (PathList::iterator i = paths.begin(); i != paths.end(); ++i) {
+ Path *path = *i;
+ uint flow = path->GetFlow();
+ if (flow == 0) continue;
+ /* compress to monthly value */
+ flow = max(1U, flow * 30 / runtime);
+ Node node = job[path->GetNode()];
+ StationID via = node.Station();
+ StationID origin = job[path->GetOrigin()].Station();
+ assert(prev != via && via != origin);
+ /* Mark all of the flow for local consumption at "first". */
+ node.Flows().AddFlow(origin, via, flow);
+ if (prev != origin) {
+ /* Pass some of the flow marked for local consumption at "prev" on
+ * to this node. */
+ prev_node.Flows().PassOnFlow(origin, via, flow);
+ } else {
+ /* Prev node is origin. Simply add flow. */
+ prev_node.Flows().AddFlow(origin, via, flow);
+ }
+ }
+ }
+
+ for (NodeID node_id = 0; node_id < job.Size(); ++node_id) {
+ /* Remove local consumption shares marked as invalid. */
+ Node node = job[node_id];
+ node.Flows().FinalizeLocalConsumption(node.Station());
+ /* Clear paths. */
+ PathList &paths = node.Paths();
+ for (PathList::iterator i = paths.begin(); i != paths.end(); ++i) {
+ delete *i;
+ }
+ paths.clear();
+ }
+}
diff --git a/src/linkgraph/flowmapper.h b/src/linkgraph/flowmapper.h
new file mode 100644
index 0000000000..6dc84ffea5
--- /dev/null
+++ b/src/linkgraph/flowmapper.h
@@ -0,0 +1,34 @@
+/* $Id$ */
+
+/*
+ * This file is part of OpenTTD.
+ * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+ * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see .
+ */
+
+/** @file flowmapper.h Declaration of flow mapper; maps paths into flows at nodes. */
+
+#ifndef FLOWMAPPER_H_
+#define FLOWMAPPER_H_
+
+#include "linkgraphjob_base.h"
+
+/**
+ * Map the path trees generated by the MCF solver into flows. The path tree is
+ * useful to cache capacities and distances and allow quick disconnecting and
+ * reconnecting to other paths. The flows show how much cargo from which nodes
+ * is to be routed in which direction at a given node. This is what we need in
+ * the end.
+ */
+class FlowMapper : public ComponentHandler {
+public:
+ virtual void Run(LinkGraphJob &job) const;
+
+ /**
+ * Virtual destructor has to be defined because of virtual Run().
+ */
+ virtual ~FlowMapper() {}
+};
+
+#endif /* FLOWMAPPER_H_ */
diff --git a/src/linkgraph/linkgraphschedule.cpp b/src/linkgraph/linkgraphschedule.cpp
index 2cb2918535..7e2c66f8fe 100644
--- a/src/linkgraph/linkgraphschedule.cpp
+++ b/src/linkgraph/linkgraphschedule.cpp
@@ -14,6 +14,7 @@
#include "init.h"
#include "demands.h"
#include "mcf.h"
+#include "flowmapper.h"
/**
* Spawn a thread if possible and run the link graph job in the thread. If
@@ -132,7 +133,9 @@ LinkGraphSchedule::LinkGraphSchedule()
this->handlers[0] = new InitHandler;
this->handlers[1] = new DemandHandler;
this->handlers[2] = new MCFHandler;
- this->handlers[3] = new MCFHandler;
+ this->handlers[3] = new FlowMapper;
+ this->handlers[4] = new MCFHandler;
+ this->handlers[5] = new FlowMapper;
}
/**
diff --git a/src/linkgraph/linkgraphschedule.h b/src/linkgraph/linkgraphschedule.h
index f099f062b2..911fa389a1 100644
--- a/src/linkgraph/linkgraphschedule.h
+++ b/src/linkgraph/linkgraphschedule.h
@@ -44,7 +44,7 @@ private:
friend const SaveLoad *GetLinkGraphScheduleDesc();
protected:
- ComponentHandler *handlers[4]; ///< Handlers to be run for each job.
+ ComponentHandler *handlers[6]; ///< Handlers to be run for each job.
GraphList schedule; ///< Queue for new jobs.
JobList running; ///< Currently running jobs.