From 9272450e08dc2e6957cfc746d6ce8e513d476179 Mon Sep 17 00:00:00 2001
From: James Packer
Date: Tue, 19 May 2026 19:23:39 +0100
Subject: [PATCH 01/12] Initial implementation to load pontoon information,
currently just showing dummy nodes as 'land objects'.
---
src/LandObject.cpp | 2 +-
src/LandObjects.cpp | 36 ++++++++++++++++++++++++++++++++++--
2 files changed, 35 insertions(+), 3 deletions(-)
diff --git a/src/LandObject.cpp b/src/LandObject.cpp
index 09cf078d..471445f2 100644
--- a/src/LandObject.cpp
+++ b/src/LandObject.cpp
@@ -61,7 +61,7 @@ LandObject::LandObject(const std::string& name, const std::string& internalName,
//Failed to load mesh - load with dummy and continue
dev->getLogger()->log("Failed to load land object model:");
dev->getLogger()->log(objectFullPath.c_str());
- landObject = smgr->addCubeSceneNode(0.1, 0, -1, location);
+ landObject = smgr->addCubeSceneNode(1, 0, -1, location);
} else {
if (morph) {
// Remove nearly flat mesh buffers
diff --git a/src/LandObjects.cpp b/src/LandObjects.cpp
index a20b050c..192be9ed 100644
--- a/src/LandObjects.cpp
+++ b/src/LandObjects.cpp
@@ -52,7 +52,7 @@ void LandObjects::load(const std::string& worldName, irr::scene::ISceneManager*
//Get object position
irr::f32 objectX = model->longToX(IniFile::iniFileTof32(scenarioLandObjectFilename,IniFile::enumerate1("Long",currentObject)));
irr::f32 objectZ = model->latToZ(IniFile::iniFileTof32(scenarioLandObjectFilename,IniFile::enumerate1("Lat",currentObject)));
- irr::f32 objectY = IniFile::iniFileTof32(scenarioLandObjectFilename,IniFile::enumerate1("HeightCorrection",currentObject));;
+ irr::f32 objectY = IniFile::iniFileTof32(scenarioLandObjectFilename,IniFile::enumerate1("HeightCorrection",currentObject));
//Check if we should 'morph' the model to fit the land (mostly for OSM2World models)
bool morph = false;
@@ -79,10 +79,42 @@ void LandObjects::load(const std::string& worldName, irr::scene::ISceneManager*
//Create land object and load into vector
std::string internalName = "LandObject_";
- internalName.append(std::to_string(currentObject-1)); // -1 as we want index from 0
+ internalName.append(std::to_string(landObjects.size()));
landObjects.push_back(LandObject (objectName.c_str(),internalName,worldName,irr::core::vector3df(objectX,objectY,objectZ),rotation,collisionObject,radarObject,morph,terrain,smgr,dev));
}
+
+ // Add 'pontoons' here. Initially a simple test implementation with a dummy object for each node
+ std::string scenarioPontoonFilename = worldName;
+ scenarioPontoonFilename.append("/pontoon.ini");
+
+ //Find number of objects
+ irr::u32 numberOfPontoons;
+ numberOfPontoons = IniFile::iniFileTou32(scenarioPontoonFilename, "Number");
+ for (irr::u32 currentPontoon = 1; currentPontoon <= numberOfPontoons; currentPontoon++) {
+ irr::u32 numberOfNodes;
+ numberOfNodes = IniFile::iniFileTou32(scenarioPontoonFilename, IniFile::enumerate1("Nodes", currentPontoon));
+ for (irr::u32 currentNode = 1; currentNode <= numberOfNodes; currentNode++) {
+ //Get object position
+ irr::f32 nodeX = model->longToX(IniFile::iniFileTof32(scenarioPontoonFilename, IniFile::enumerate2("Long", currentPontoon, currentNode)));
+ irr::f32 nodeZ = model->latToZ(IniFile::iniFileTof32(scenarioPontoonFilename, IniFile::enumerate2("Lat", currentPontoon, currentNode)));
+ irr::f32 nodeY = IniFile::iniFileTof32(scenarioPontoonFilename, IniFile::enumerate2("HeightCorrection", currentPontoon, currentNode));
+
+ //Create land object and load into vector
+ std::string internalName = "LandObject_";
+ internalName.append(std::to_string(landObjects.size()));
+
+ // Defaults - TODO: Check/set these
+ std::string objectName = "DUMMY";
+ irr::f32 rotation = 0;
+ bool collisionObject = true;
+ bool radarObject = false;
+ bool morph = false;
+
+ landObjects.push_back(LandObject(objectName.c_str(), internalName, worldName, irr::core::vector3df(nodeX, nodeY, nodeZ), rotation, collisionObject, radarObject, morph, terrain, smgr, dev));
+
+ }
+ }
}
irr::u32 LandObjects::getNumber() const
From ff38bb32e52718933d44628e40a4cafc39866fb3 Mon Sep 17 00:00:00 2001
From: James Packer
Date: Tue, 2 Jun 2026 08:02:38 +0100
Subject: [PATCH 02/12] Pontoon objects working, but currently quite slow (due
to collision detection)
---
src/LandObject.cpp | 39 ++++++++++++++++++++++++++++++++++-----
src/LandObject.hpp | 5 ++++-
src/LandObjects.cpp | 25 ++++++++++++++++++-------
3 files changed, 56 insertions(+), 13 deletions(-)
diff --git a/src/LandObject.cpp b/src/LandObject.cpp
index 471445f2..150e51ab 100644
--- a/src/LandObject.cpp
+++ b/src/LandObject.cpp
@@ -24,7 +24,7 @@
//using namespace irr;
-LandObject::LandObject(const std::string& name, const std::string& internalName, const std::string& worldName, const irr::core::vector3df& location, irr::f32 rotation, bool collisionObject, bool radarObject, bool morph, Terrain* terrain, irr::scene::ISceneManager* smgr, irr::IrrlichtDevice* dev)
+LandObject::LandObject(const std::string& name, const std::string& internalName, const std::string& worldName, const irr::core::vector3df& location, irr::f32 rotation, bool collisionObject, bool radarObject, bool morph, Terrain* terrain, irr::scene::ISceneManager* smgr, irr::IrrlichtDevice* dev, bool dummyObject, irr::f32 sectionLength)
{
const irr::f32 tallHeightRatio = 5.0; // Minimum ratio of height to max of width, length for an object to be considered 'tall'
@@ -55,13 +55,18 @@ LandObject::LandObject(const std::string& name, const std::string& internalName,
std::string objectFullPath = basePath + objectFileName;
//Load the mesh
- irr::scene::IMesh* objectMesh = smgr->getMesh(objectFullPath.c_str());
+ irr::scene::IMesh* objectMesh = 0;
+ if (!dummyObject) {
+ objectMesh = smgr->getMesh(objectFullPath.c_str());
+ }
+
//add to scene node
- if (objectMesh==0) {
+ if (dummyObject || objectMesh==0) {
//Failed to load mesh - load with dummy and continue
dev->getLogger()->log("Failed to load land object model:");
dev->getLogger()->log(objectFullPath.c_str());
landObject = smgr->addCubeSceneNode(1, 0, -1, location);
+ objectMesh = landObject->getMesh();
} else {
if (morph) {
// Remove nearly flat mesh buffers
@@ -85,13 +90,16 @@ LandObject::LandObject(const std::string& name, const std::string& internalName,
}
//Set ID as a flag if we should model collisions with this, also used to get radar points
+ triangleSelectorEnabled = false;
+ selector = 0;
if (collisionObject || radarObject) {
landObject->setID(IDFlag_IsPickable);
//Add a triangle selector
- irr::scene::ITriangleSelector* selector=smgr->createTriangleSelector(objectMesh,landObject);
+ selector=smgr->createTriangleSelector(objectMesh,landObject);
if(selector) {
landObject->setTriangleSelector(selector);
+ triangleSelectorEnabled = true;
}
}
@@ -102,7 +110,12 @@ LandObject::LandObject(const std::string& name, const std::string& internalName,
}
}
- landObject->setScale(irr::core::vector3df(objectScale,objectScale,objectScale));
+ if (dummyObject) {
+ landObject->setScale(irr::core::vector3df(objectScale, objectScale, objectScale * sectionLength));
+ }
+ else {
+ landObject->setScale(irr::core::vector3df(objectScale, objectScale, objectScale));
+ }
landObject->setRotation(irr::core::vector3df(0,rotation,0));
landObject->setMaterialFlag(irr::video::EMF_FOG_ENABLE, true);
landObject->setMaterialFlag(irr::video::EMF_NORMALIZE_NORMALS, true); //Normalise normals on scaled meshes, for correct lighting
@@ -221,6 +234,7 @@ LandObject::LandObject(const std::string& name, const std::string& internalName,
if (!collisionObject) {
landObject->setID(-1);
landObject->setTriangleSelector(0);
+ triangleSelectorEnabled = false;
}
//End contact points for radar detection
//======================================
@@ -274,3 +288,18 @@ irr::scene::ISceneNode* LandObject::getSceneNode() const
{
return (irr::scene::ISceneNode*)landObject;
}
+
+void LandObject::enableTriangleSelector(bool selectorEnabled)
+{
+ //Only re-set if we need to change the state
+
+ if (selectorEnabled && !triangleSelectorEnabled) {
+ landObject->setTriangleSelector(selector);
+ triangleSelectorEnabled = true;
+ }
+
+ if (!selectorEnabled && triangleSelectorEnabled) {
+ landObject->setTriangleSelector(0);
+ triangleSelectorEnabled = false;
+ }
+}
diff --git a/src/LandObject.hpp b/src/LandObject.hpp
index fc2e2d88..d9d04d04 100644
--- a/src/LandObject.hpp
+++ b/src/LandObject.hpp
@@ -27,15 +27,18 @@ class Terrain;
class LandObject
{
public:
- LandObject(const std::string& name, const std::string& internalName, const std::string& worldName, const irr::core::vector3df& location, irr::f32 rotation, bool collisionObject, bool radarObject, bool morph, Terrain* terrain, irr::scene::ISceneManager* smgr, irr::IrrlichtDevice* dev);
+ LandObject(const std::string& name, const std::string& internalName, const std::string& worldName, const irr::core::vector3df& location, irr::f32 rotation, bool collisionObject, bool radarObject, bool morph, Terrain* terrain, irr::scene::ISceneManager* smgr, irr::IrrlichtDevice* dev, bool dummyObject = false, irr::f32 sectionLength = 1.0f);
virtual ~LandObject();
irr::core::vector3df getPosition() const;
void moveNode(irr::f32 deltaX, irr::f32 deltaY, irr::f32 deltaZ);
irr::scene::ISceneNode* getSceneNode() const;
+ void enableTriangleSelector(bool selectorEnabled);
protected:
private:
irr::scene::IMeshSceneNode* landObject; //The scene node for the object.
irr::IrrlichtDevice* device;
+ irr::scene::ITriangleSelector* selector; //The triangle selector for the buoy. We will set and unset this depending on the distance from the ownship for speed
+ bool triangleSelectorEnabled;
irr::f32 findContactYFromRay(irr::core::line3d ray);
};
diff --git a/src/LandObjects.cpp b/src/LandObjects.cpp
index 192be9ed..665e84d5 100644
--- a/src/LandObjects.cpp
+++ b/src/LandObjects.cpp
@@ -94,11 +94,23 @@ void LandObjects::load(const std::string& worldName, irr::scene::ISceneManager*
for (irr::u32 currentPontoon = 1; currentPontoon <= numberOfPontoons; currentPontoon++) {
irr::u32 numberOfNodes;
numberOfNodes = IniFile::iniFileTou32(scenarioPontoonFilename, IniFile::enumerate1("Nodes", currentPontoon));
- for (irr::u32 currentNode = 1; currentNode <= numberOfNodes; currentNode++) {
- //Get object position
- irr::f32 nodeX = model->longToX(IniFile::iniFileTof32(scenarioPontoonFilename, IniFile::enumerate2("Long", currentPontoon, currentNode)));
- irr::f32 nodeZ = model->latToZ(IniFile::iniFileTof32(scenarioPontoonFilename, IniFile::enumerate2("Lat", currentPontoon, currentNode)));
- irr::f32 nodeY = IniFile::iniFileTof32(scenarioPontoonFilename, IniFile::enumerate2("HeightCorrection", currentPontoon, currentNode));
+ for (irr::u32 currentNode = 1; currentNode < numberOfNodes; currentNode++) {
+ //Get position of this node and next one
+ irr::f32 node1X = model->longToX(IniFile::iniFileTof32(scenarioPontoonFilename, IniFile::enumerate2("Long", currentPontoon, currentNode)));
+ irr::f32 node1Z = model->latToZ(IniFile::iniFileTof32(scenarioPontoonFilename, IniFile::enumerate2("Lat", currentPontoon, currentNode)));
+ irr::f32 node1Y = IniFile::iniFileTof32(scenarioPontoonFilename, IniFile::enumerate2("HeightCorrection", currentPontoon, currentNode));
+
+ irr::f32 node2X = model->longToX(IniFile::iniFileTof32(scenarioPontoonFilename, IniFile::enumerate2("Long", currentPontoon, currentNode + 1)));
+ irr::f32 node2Z = model->latToZ(IniFile::iniFileTof32(scenarioPontoonFilename, IniFile::enumerate2("Lat", currentPontoon, currentNode + 1)));
+ irr::f32 node2Y = IniFile::iniFileTof32(scenarioPontoonFilename, IniFile::enumerate2("HeightCorrection", currentPontoon, currentNode + 1));
+
+ irr::f32 midPointX = (node1X + node2X) / 2.0;
+ irr::f32 midPointY = (node1Y + node2Y) / 2.0;
+ irr::f32 midPointZ = (node1Z + node2Z) / 2.0;
+
+ // Find length and angle of this section
+ irr::f32 rotation = atan2(node2X - node1X, node2Z - node1Z) * irr::core::RADTODEG;
+ irr::f32 sectionLength = pow(pow(node2X - node1X, 2.0) + pow(node2Z - node1Z, 2.0), 0.5);
//Create land object and load into vector
std::string internalName = "LandObject_";
@@ -106,12 +118,11 @@ void LandObjects::load(const std::string& worldName, irr::scene::ISceneManager*
// Defaults - TODO: Check/set these
std::string objectName = "DUMMY";
- irr::f32 rotation = 0;
bool collisionObject = true;
bool radarObject = false;
bool morph = false;
- landObjects.push_back(LandObject(objectName.c_str(), internalName, worldName, irr::core::vector3df(nodeX, nodeY, nodeZ), rotation, collisionObject, radarObject, morph, terrain, smgr, dev));
+ landObjects.push_back(LandObject(objectName.c_str(), internalName, worldName, irr::core::vector3df(midPointX, midPointY, midPointZ), rotation, collisionObject, radarObject, morph, terrain, smgr, dev, true, sectionLength));
}
}
From 16605fdee1126d74e702894ec4cf084c8fd6bc9f Mon Sep 17 00:00:00 2001
From: James Packer
Date: Tue, 2 Jun 2026 08:15:02 +0100
Subject: [PATCH 03/12] Add simple logic to enable/disable land object triangle
selectors depending on distance.
---
src/LandObjects.cpp | 17 +++++++++++++++++
src/LandObjects.hpp | 1 +
src/SimulationModel.cpp | 4 ++++
3 files changed, 22 insertions(+)
diff --git a/src/LandObjects.cpp b/src/LandObjects.cpp
index 665e84d5..aec83bc2 100644
--- a/src/LandObjects.cpp
+++ b/src/LandObjects.cpp
@@ -128,6 +128,23 @@ void LandObjects::load(const std::string& worldName, irr::scene::ISceneManager*
}
}
+void LandObjects::update(irr::f32 tideHeight, irr::core::vector3df ownShipPosition, irr::f32 ownShipLength)
+{
+ // TODO: Implement floating correction here (see buoys)
+
+ for (std::vector::iterator it = landObjects.begin(); it != landObjects.end(); ++it) {
+
+ //Set or clear triangle selector depending on distance from own ship; TODO: Changle logic here to account for land object size
+ if (it->getSceneNode()->getAbsolutePosition().getDistanceFrom(ownShipPosition) < 10 * ownShipLength) {
+ it->enableTriangleSelector(true);
+ }
+ else {
+ it->enableTriangleSelector(false);
+ }
+
+ }
+}
+
irr::u32 LandObjects::getNumber() const
{
return landObjects.size();
diff --git a/src/LandObjects.hpp b/src/LandObjects.hpp
index 4d36ca9b..a115397a 100644
--- a/src/LandObjects.hpp
+++ b/src/LandObjects.hpp
@@ -36,6 +36,7 @@ class LandObjects
irr::u32 getNumber() const;
void moveNode(irr::f32 deltaX, irr::f32 deltaY, irr::f32 deltaZ);
irr::scene::ISceneNode* getSceneNode(int number);
+ void update(irr::f32 tideHeight, irr::core::vector3df ownShipPosition, irr::f32 ownShipLength);
private:
std::vector landObjects;
diff --git a/src/SimulationModel.cpp b/src/SimulationModel.cpp
index 6efd6a4b..26d6ffa6 100644
--- a/src/SimulationModel.cpp
+++ b/src/SimulationModel.cpp
@@ -1902,6 +1902,10 @@ SimulationModel::~SimulationModel()
//update buoys (for lights, floating, and if collision detection is turned on)
buoys.update(deltaTime,scenarioTime,tideHeight,lightLevel,ownShip.getPosition(),ownShip.getLength());
+ }{ IPROF("Update land objects");
+ //update land objects (for floating, and if collision detection is turned on)
+ landObjects.update(tideHeight, ownShip.getPosition(), ownShip.getLength());
+
}{ IPROF("Update land lights");
//Update land lights
landLights.update(deltaTime,scenarioTime,lightLevel);
From 794195cef963ccb301ce1a04734c2885e34cf4b8 Mon Sep 17 00:00:00 2001
From: James Packer
Date: Tue, 2 Jun 2026 08:53:32 +0100
Subject: [PATCH 04/12] Make pontoons float
---
src/LandObject.cpp | 28 ++++++++++++++++++++++++++++
src/LandObject.hpp | 5 +++++
src/LandObjects.cpp | 24 +++++++++++++++++-------
src/LandObjects.hpp | 1 +
4 files changed, 51 insertions(+), 7 deletions(-)
diff --git a/src/LandObject.cpp b/src/LandObject.cpp
index 150e51ab..3562ebcc 100644
--- a/src/LandObject.cpp
+++ b/src/LandObject.cpp
@@ -54,6 +54,12 @@ LandObject::LandObject(const std::string& name, const std::string& internalName,
std::string objectFullPath = basePath + objectFileName;
+ // Store the vertical position (used later if object is floating)
+ heightCorrection = location.Y;
+
+ // Normally not floating
+ floating = false;
+
//Load the mesh
irr::scene::IMesh* objectMesh = 0;
if (!dummyObject) {
@@ -67,6 +73,13 @@ LandObject::LandObject(const std::string& name, const std::string& internalName,
dev->getLogger()->log(objectFullPath.c_str());
landObject = smgr->addCubeSceneNode(1, 0, -1, location);
objectMesh = landObject->getMesh();
+
+ // Special case, make the object float
+ if (name == "PONTOON_INTERNAL") {
+ floating = true;
+ }
+
+
} else {
if (morph) {
// Remove nearly flat mesh buffers
@@ -303,3 +316,18 @@ void LandObject::enableTriangleSelector(bool selectorEnabled)
triangleSelectorEnabled = false;
}
}
+
+irr::f32 LandObject::getHeightCorrection() const
+{
+ return heightCorrection;
+}
+
+bool LandObject::getFloating() const
+{
+ return floating;
+}
+
+void LandObject::setPosition(irr::core::vector3df position)
+{
+ landObject->setPosition(position);
+}
diff --git a/src/LandObject.hpp b/src/LandObject.hpp
index d9d04d04..8ffd7630 100644
--- a/src/LandObject.hpp
+++ b/src/LandObject.hpp
@@ -33,12 +33,17 @@ class LandObject
void moveNode(irr::f32 deltaX, irr::f32 deltaY, irr::f32 deltaZ);
irr::scene::ISceneNode* getSceneNode() const;
void enableTriangleSelector(bool selectorEnabled);
+ bool getFloating() const;
+ irr::f32 getHeightCorrection() const;
+ void setPosition(irr::core::vector3df position);
protected:
private:
irr::scene::IMeshSceneNode* landObject; //The scene node for the object.
irr::IrrlichtDevice* device;
irr::scene::ITriangleSelector* selector; //The triangle selector for the buoy. We will set and unset this depending on the distance from the ownship for speed
bool triangleSelectorEnabled;
+ irr::f32 heightCorrection;
+ bool floating;
irr::f32 findContactYFromRay(irr::core::line3d ray);
};
diff --git a/src/LandObjects.cpp b/src/LandObjects.cpp
index aec83bc2..255c5a34 100644
--- a/src/LandObjects.cpp
+++ b/src/LandObjects.cpp
@@ -38,6 +38,8 @@ LandObjects::~LandObjects()
void LandObjects::load(const std::string& worldName, irr::scene::ISceneManager* smgr, SimulationModel* model, Terrain* terrain, irr::IrrlichtDevice* dev)
{
+ this->model = model;
+
//get landObject.ini filename
std::string scenarioLandObjectFilename = worldName;
scenarioLandObjectFilename.append("/landobject.ini");
@@ -116,10 +118,10 @@ void LandObjects::load(const std::string& worldName, irr::scene::ISceneManager*
std::string internalName = "LandObject_";
internalName.append(std::to_string(landObjects.size()));
- // Defaults - TODO: Check/set these
- std::string objectName = "DUMMY";
+ // Set properties
+ std::string objectName = "PONTOON_INTERNAL"; // This name is used to trigger floating behaviour in 'land object'
bool collisionObject = true;
- bool radarObject = false;
+ bool radarObject = false; // TODO: Try turning this on?
bool morph = false;
landObjects.push_back(LandObject(objectName.c_str(), internalName, worldName, irr::core::vector3df(midPointX, midPointY, midPointZ), rotation, collisionObject, radarObject, morph, terrain, smgr, dev, true, sectionLength));
@@ -130,12 +132,20 @@ void LandObjects::load(const std::string& worldName, irr::scene::ISceneManager*
void LandObjects::update(irr::f32 tideHeight, irr::core::vector3df ownShipPosition, irr::f32 ownShipLength)
{
- // TODO: Implement floating correction here (see buoys)
-
for (std::vector::iterator it = landObjects.begin(); it != landObjects.end(); ++it) {
- //Set or clear triangle selector depending on distance from own ship; TODO: Changle logic here to account for land object size
- if (it->getSceneNode()->getAbsolutePosition().getDistanceFrom(ownShipPosition) < 10 * ownShipLength) {
+ if (it->getFloating()) {
+ irr::f32 xPos, yPos, zPos;
+ irr::core::vector3df pos = it->getPosition();
+ xPos = pos.X;
+ //yPos = tideHeight + model->getWaveHeight(pos.X, pos.Z) + it->getHeightCorrection();
+ yPos = tideHeight + it->getHeightCorrection(); // Don't include wave height for floating pontoons etc.
+ zPos = pos.Z;
+ it->setPosition(irr::core::vector3df(xPos, yPos, zPos));
+ }
+ //Set or clear triangle selector depending on distance from own ship;
+ irr::f32 landObjectMaxLength = it->getSceneNode()->getTransformedBoundingBox().getExtent().getLength(); // Max length between corners of the bounding box
+ if (it->getSceneNode()->getAbsolutePosition().getDistanceFrom(ownShipPosition) < (ownShipLength + landObjectMaxLength)) {
it->enableTriangleSelector(true);
}
else {
diff --git a/src/LandObjects.hpp b/src/LandObjects.hpp
index a115397a..c57cc42b 100644
--- a/src/LandObjects.hpp
+++ b/src/LandObjects.hpp
@@ -40,6 +40,7 @@ class LandObjects
private:
std::vector landObjects;
+ SimulationModel* model; //Store reference to model
};
#endif
From 9700474cea6bab7ff5238b698472e0354227a4f9 Mon Sep 17 00:00:00 2001
From: James Packer
Date: Tue, 2 Jun 2026 18:19:12 +0100
Subject: [PATCH 05/12] Add a basic texture to the pontoons.
---
bin/media/pontoon.png | Bin 0 -> 582 bytes
src/LandObject.cpp | 5 +++--
src/LandObjects.cpp | 2 +-
3 files changed, 4 insertions(+), 3 deletions(-)
create mode 100644 bin/media/pontoon.png
diff --git a/bin/media/pontoon.png b/bin/media/pontoon.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d99bc2e44aa8f81cc407ab9be21c279c79bb8aa
GIT binary patch
literal 582
zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jPK-BC>eK@{Ea{HEjtmSN
z`?>!lvI6-E$sR$z3=CCjKus+S48MRv4KElNN(~qoUL`OvSj}Ky5HFasE6@fg!CBxD
zS=d#Wzp$PykU#^1y
literal 0
HcmV?d00001
diff --git a/src/LandObject.cpp b/src/LandObject.cpp
index 3562ebcc..9feb34f8 100644
--- a/src/LandObject.cpp
+++ b/src/LandObject.cpp
@@ -69,7 +69,7 @@ LandObject::LandObject(const std::string& name, const std::string& internalName,
//add to scene node
if (dummyObject || objectMesh==0) {
//Failed to load mesh - load with dummy and continue
- dev->getLogger()->log("Failed to load land object model:");
+ dev->getLogger()->log("Using dummy land object model:");
dev->getLogger()->log(objectFullPath.c_str());
landObject = smgr->addCubeSceneNode(1, 0, -1, location);
objectMesh = landObject->getMesh();
@@ -77,6 +77,7 @@ LandObject::LandObject(const std::string& name, const std::string& internalName,
// Special case, make the object float
if (name == "PONTOON_INTERNAL") {
floating = true;
+ landObject->setMaterialTexture(0, smgr->getVideoDriver()->getTexture("media/pontoon.png"));
}
@@ -124,7 +125,7 @@ LandObject::LandObject(const std::string& name, const std::string& internalName,
}
if (dummyObject) {
- landObject->setScale(irr::core::vector3df(objectScale, objectScale, objectScale * sectionLength));
+ landObject->setScale(irr::core::vector3df(2.0, 1.0, sectionLength));
}
else {
landObject->setScale(irr::core::vector3df(objectScale, objectScale, objectScale));
diff --git a/src/LandObjects.cpp b/src/LandObjects.cpp
index 255c5a34..1cad7c3b 100644
--- a/src/LandObjects.cpp
+++ b/src/LandObjects.cpp
@@ -121,7 +121,7 @@ void LandObjects::load(const std::string& worldName, irr::scene::ISceneManager*
// Set properties
std::string objectName = "PONTOON_INTERNAL"; // This name is used to trigger floating behaviour in 'land object'
bool collisionObject = true;
- bool radarObject = false; // TODO: Try turning this on?
+ bool radarObject = false; // We could turn this on, but may use a lot of memory!
bool morph = false;
landObjects.push_back(LandObject(objectName.c_str(), internalName, worldName, irr::core::vector3df(midPointX, midPointY, midPointZ), rotation, collisionObject, radarObject, morph, terrain, smgr, dev, true, sectionLength));
From dae96fbe26b09666a2f4215718459c074904014f Mon Sep 17 00:00:00 2001
From: James Packer
Date: Tue, 2 Jun 2026 18:29:22 +0100
Subject: [PATCH 06/12] Scale pontoon mesh instead of scene node, so child
nodes (e.g. mooring markers) look sensible.
---
src/LandObject.cpp | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/src/LandObject.cpp b/src/LandObject.cpp
index 9feb34f8..98e1565a 100644
--- a/src/LandObject.cpp
+++ b/src/LandObject.cpp
@@ -77,6 +77,10 @@ LandObject::LandObject(const std::string& name, const std::string& internalName,
// Special case, make the object float
if (name == "PONTOON_INTERNAL") {
floating = true;
+ // Scale the mesh
+ irr::scene::IMeshManipulator* meshManipulator = smgr->getMeshManipulator();
+ meshManipulator->scale(objectMesh, irr::core::vector3df(2.0, 1.0, sectionLength));
+ // Set a simple texture
landObject->setMaterialTexture(0, smgr->getVideoDriver()->getTexture("media/pontoon.png"));
}
@@ -124,10 +128,7 @@ LandObject::LandObject(const std::string& name, const std::string& internalName,
}
}
- if (dummyObject) {
- landObject->setScale(irr::core::vector3df(2.0, 1.0, sectionLength));
- }
- else {
+ if (!dummyObject) {
landObject->setScale(irr::core::vector3df(objectScale, objectScale, objectScale));
}
landObject->setRotation(irr::core::vector3df(0,rotation,0));
From 485f0006147625747f838ec6c737c25c8debe90f Mon Sep 17 00:00:00 2001
From: James Packer
Date: Tue, 2 Jun 2026 18:56:36 +0100
Subject: [PATCH 07/12] Add pontoons file for Swinomish Channel world model.
---
bin/World/SwinomishChannelSouth/pontoon.ini | 1894 +++++++++++++++++++
1 file changed, 1894 insertions(+)
create mode 100644 bin/World/SwinomishChannelSouth/pontoon.ini
diff --git a/bin/World/SwinomishChannelSouth/pontoon.ini b/bin/World/SwinomishChannelSouth/pontoon.ini
new file mode 100644
index 00000000..da10e7a0
--- /dev/null
+++ b/bin/World/SwinomishChannelSouth/pontoon.ini
@@ -0,0 +1,1894 @@
+Number=201
+
+Nodes(1)=2
+Lat(1,1)=48.3922659
+Long(1,1)=-122.4968183
+Lat(1,2)=48.3922369
+Long(1,2)=-122.4965243
+
+Nodes(2)=3
+Lat(2,1)=48.3919328
+Long(2,1)=-122.4968907
+Lat(2,2)=48.3922659
+Long(2,2)=-122.4968183
+Lat(2,3)=48.3925858
+Long(2,3)=-122.4967724
+
+Nodes(3)=5
+Lat(3,1)=48.3915730
+Long(3,1)=-122.4967124
+Lat(3,2)=48.3916300
+Long(3,2)=-122.4969726
+Lat(3,3)=48.3918882
+Long(3,3)=-122.4968375
+Lat(3,4)=48.3918302
+Long(3,4)=-122.4965865
+Lat(3,5)=48.3915730
+Long(3,5)=-122.4967124
+
+Nodes(4)=8
+Lat(4,1)=48.3950583
+Long(4,1)=-122.4944454
+Lat(4,2)=48.3950654
+Long(4,2)=-122.4945634
+Lat(4,3)=48.3965649
+Long(4,3)=-122.4945634
+Lat(4,4)=48.3965614
+Long(4,4)=-122.4944078
+Lat(4,5)=48.3949264
+Long(4,5)=-122.4944180
+Lat(4,6)=48.3949237
+Long(4,6)=-122.4944320
+Lat(4,7)=48.3949209
+Long(4,7)=-122.4944460
+Lat(4,8)=48.3950583
+Long(4,8)=-122.4944454
+
+Nodes(5)=10
+Lat(5,1)=48.3950584
+Long(5,1)=-122.4948877
+Lat(5,2)=48.3950575
+Long(5,2)=-122.4950257
+Lat(5,3)=48.3963867
+Long(5,3)=-122.4950014
+Lat(5,4)=48.3963826
+Long(5,4)=-122.4947303
+Lat(5,5)=48.3950611
+Long(5,5)=-122.4947487
+Lat(5,6)=48.3950606
+Long(5,6)=-122.4948520
+Lat(5,7)=48.3949061
+Long(5,7)=-122.4948625
+Lat(5,8)=48.3949059
+Long(5,8)=-122.4948802
+Lat(5,9)=48.3949056
+Long(5,9)=-122.4948979
+Lat(5,10)=48.3950584
+Long(5,10)=-122.4948877
+
+Nodes(6)=9
+Lat(6,1)=48.3950598
+Long(6,1)=-122.4954285
+Lat(6,2)=48.3950670
+Long(6,2)=-122.4956056
+Lat(6,3)=48.3963813
+Long(6,3)=-122.4955841
+Lat(6,4)=48.3963742
+Long(6,4)=-122.4952515
+Lat(6,5)=48.3950670
+Long(6,5)=-122.4952622
+Lat(6,6)=48.3950670
+Long(6,6)=-122.4953803
+Lat(6,7)=48.3949046
+Long(6,7)=-122.4953910
+Lat(6,8)=48.3949045
+Long(6,8)=-122.4954392
+Lat(6,9)=48.3950598
+Long(6,9)=-122.4954285
+
+Nodes(7)=11
+Lat(7,1)=48.3950713
+Long(7,1)=-122.4960580
+Lat(7,2)=48.3950705
+Long(7,2)=-122.4962707
+Lat(7,3)=48.3963599
+Long(7,3)=-122.4962547
+Lat(7,4)=48.3963528
+Long(7,4)=-122.4958738
+Lat(7,5)=48.3950741
+Long(7,5)=-122.4958738
+Lat(7,6)=48.3950714
+Long(7,6)=-122.4960287
+Lat(7,7)=48.3949034
+Long(7,7)=-122.4960328
+Lat(7,8)=48.3949034
+Long(7,8)=-122.4960534
+Lat(7,9)=48.3949034
+Long(7,9)=-122.4960681
+Lat(7,10)=48.3949034
+Long(7,10)=-122.4960796
+Lat(7,11)=48.3950713
+Long(7,11)=-122.4960580
+
+Nodes(8)=13
+Lat(8,1)=48.3947072
+Long(8,1)=-122.4966949
+Lat(8,2)=48.3947263
+Long(8,2)=-122.4966917
+Lat(8,3)=48.3947291
+Long(8,3)=-122.4968364
+Lat(8,4)=48.3963592
+Long(8,4)=-122.4967891
+Lat(8,5)=48.3963601
+Long(8,5)=-122.4967698
+Lat(8,6)=48.3963608
+Long(8,6)=-122.4967540
+Lat(8,7)=48.3947542
+Long(8,7)=-122.4968016
+Lat(8,8)=48.3947501
+Long(8,8)=-122.4965828
+Lat(8,9)=48.3947265
+Long(8,9)=-122.4965779
+Lat(8,10)=48.3947192
+Long(8,10)=-122.4963759
+Lat(8,11)=48.3947122
+Long(8,11)=-122.4963763
+Lat(8,12)=48.3947010
+Long(8,12)=-122.4963769
+Lat(8,13)=48.3947072
+Long(8,13)=-122.4966949
+
+Nodes(9)=4
+Lat(9,1)=48.4023754
+Long(9,1)=-122.4960875
+Lat(9,2)=48.4019907
+Long(9,2)=-122.4961116
+Lat(9,3)=48.4018251
+Long(9,3)=-122.4961277
+Lat(9,4)=48.4018216
+Long(9,4)=-122.4958848
+
+Nodes(10)=14
+Lat(10,1)=48.3871372
+Long(10,1)=-122.5007937
+Lat(10,2)=48.3874357
+Long(10,2)=-122.5002957
+Lat(10,3)=48.3876390
+Long(10,3)=-122.5000667
+Lat(10,4)=48.3876314
+Long(10,4)=-122.5000352
+Lat(10,5)=48.3874851
+Long(10,5)=-122.5002012
+Lat(10,6)=48.3874604
+Long(10,6)=-122.5001669
+Lat(10,7)=48.3874262
+Long(10,7)=-122.5002241
+Lat(10,8)=48.3873478
+Long(10,8)=-122.5000905
+Lat(10,9)=48.3873038
+Long(10,9)=-122.5001543
+Lat(10,10)=48.3873919
+Long(10,10)=-122.5002699
+Lat(10,11)=48.3873615
+Long(10,11)=-122.5003272
+Lat(10,12)=48.3873824
+Long(10,12)=-122.5003501
+Lat(10,13)=48.3871163
+Long(10,13)=-122.5007708
+Lat(10,14)=48.3871372
+Long(10,14)=-122.5007937
+
+Nodes(11)=9
+Lat(11,1)=48.3880306
+Long(11,1)=-122.4996545
+Lat(11,2)=48.3887928
+Long(11,2)=-122.4991365
+Lat(11,3)=48.3886985
+Long(11,3)=-122.4988796
+Lat(11,4)=48.3883756
+Long(11,4)=-122.4991646
+Lat(11,5)=48.3883861
+Long(11,5)=-122.4992052
+Lat(11,6)=48.3884526
+Long(11,6)=-122.4991450
+Lat(11,7)=48.3885172
+Long(11,7)=-122.4992796
+Lat(11,8)=48.3880154
+Long(11,8)=-122.4996173
+Lat(11,9)=48.3880306
+Long(11,9)=-122.4996545
+
+Nodes(12)=12
+Lat(12,1)=48.3914735
+Long(12,1)=-122.4969400
+Lat(12,2)=48.3914760
+Long(12,2)=-122.4970751
+Lat(12,3)=48.3914960
+Long(12,3)=-122.4970604
+Lat(12,4)=48.3915014
+Long(12,4)=-122.4971100
+Lat(12,5)=48.3912645
+Long(12,5)=-122.4972193
+Lat(12,6)=48.3912525
+Long(12,6)=-122.4971670
+Lat(12,7)=48.3912676
+Long(12,7)=-122.4971583
+Lat(12,8)=48.3912667
+Long(12,8)=-122.4970309
+Lat(12,9)=48.3913369
+Long(12,9)=-122.4969910
+Lat(12,10)=48.3914640
+Long(12,10)=-122.4969732
+Lat(12,11)=48.3914635
+Long(12,11)=-122.4969433
+Lat(12,12)=48.3914735
+Long(12,12)=-122.4969400
+
+Nodes(13)=5
+Lat(13,1)=48.3937171
+Long(13,1)=-122.4963493
+Lat(13,2)=48.3937165
+Long(13,2)=-122.4964981
+Lat(13,3)=48.3937160
+Long(13,3)=-122.4966044
+Lat(13,4)=48.3937149
+Long(13,4)=-122.4968464
+Lat(13,5)=48.3941221
+Long(13,5)=-122.4968497
+
+Nodes(14)=2
+Lat(14,1)=48.3937160
+Long(14,1)=-122.4966044
+Lat(14,2)=48.3936096
+Long(14,2)=-122.4966044
+
+Nodes(15)=2
+Lat(15,1)=48.3937165
+Long(15,1)=-122.4964981
+Lat(15,2)=48.3940287
+Long(15,2)=-122.4964965
+
+Nodes(16)=4
+Lat(16,1)=48.3944039
+Long(16,1)=-122.4963376
+Lat(16,2)=48.3944051
+Long(16,2)=-122.4964898
+Lat(16,3)=48.3944068
+Long(16,3)=-122.4966959
+Lat(16,4)=48.3944078
+Long(16,4)=-122.4968324
+
+Nodes(17)=2
+Lat(17,1)=48.3945128
+Long(17,1)=-122.4966940
+Lat(17,2)=48.3944068
+Long(17,2)=-122.4966959
+
+Nodes(18)=2
+Lat(18,1)=48.3945180
+Long(18,1)=-122.4964898
+Lat(18,2)=48.3944051
+Long(18,2)=-122.4964898
+
+Nodes(19)=2
+Lat(19,1)=48.3945723
+Long(19,1)=-122.4964318
+Lat(19,2)=48.3945678
+Long(19,2)=-122.4962808
+
+Nodes(20)=2
+Lat(20,1)=48.3849124
+Long(20,1)=-122.5086484
+Lat(20,2)=48.3850254
+Long(20,2)=-122.5088319
+
+Nodes(21)=2
+Lat(21,1)=48.3850140
+Long(21,1)=-122.5084243
+Lat(21,2)=48.3851376
+Long(21,2)=-122.5086683
+
+Nodes(22)=2
+Lat(22,1)=48.3851251
+Long(22,1)=-122.5081319
+Lat(22,2)=48.3852373
+Long(22,2)=-122.5085557
+
+Nodes(23)=2
+Lat(23,1)=48.3854279
+Long(23,1)=-122.5083759
+Lat(23,2)=48.3854653
+Long(23,2)=-122.5079843
+
+Nodes(24)=2
+Lat(24,1)=48.3855598
+Long(24,1)=-122.5085208
+Lat(24,2)=48.3857164
+Long(24,2)=-122.5082445
+
+Nodes(25)=2
+Lat(25,1)=48.3857183
+Long(25,1)=-122.5086361
+Lat(25,2)=48.3859053
+Long(25,2)=-122.5085074
+
+Nodes(26)=2
+Lat(26,1)=48.3856898
+Long(26,1)=-122.5089178
+Lat(26,2)=48.3859267
+Long(26,2)=-122.5089526
+
+Nodes(27)=2
+Lat(27,1)=48.3856987
+Long(27,1)=-122.5092128
+Lat(27,2)=48.3858822
+Long(27,2)=-122.5094140
+
+Nodes(28)=2
+Lat(28,1)=48.3855295
+Long(28,1)=-122.5093067
+Lat(28,2)=48.3855651
+Long(28,2)=-122.5096151
+
+Nodes(29)=3
+Lat(29,1)=48.3852053
+Long(29,1)=-122.5091913
+Lat(29,2)=48.3853745
+Long(29,2)=-122.5092584
+Lat(29,3)=48.3853122
+Long(29,3)=-122.5095588
+
+Nodes(30)=3
+Lat(30,1)=48.3849470
+Long(30,1)=-122.5103822
+Lat(30,2)=48.3847412
+Long(30,2)=-122.5105780
+Lat(30,3)=48.3846406
+Long(30,3)=-122.5103527
+
+Nodes(31)=3
+Lat(31,1)=48.3850583
+Long(31,1)=-122.5107805
+Lat(31,2)=48.3848811
+Long(31,2)=-122.5107564
+Lat(31,3)=48.3848205
+Long(31,3)=-122.5107618
+
+Nodes(32)=2
+Lat(32,1)=48.3849897
+Long(32,1)=-122.5112245
+Lat(32,2)=48.3847626
+Long(32,2)=-122.5109871
+
+Nodes(33)=2
+Lat(33,1)=48.3847127
+Long(33,1)=-122.5115208
+Lat(33,2)=48.3846442
+Long(33,2)=-122.5110729
+
+Nodes(34)=5
+Lat(34,1)=48.3830959
+Long(34,1)=-122.5119241
+Lat(34,2)=48.3831487
+Long(34,2)=-122.5120103
+Lat(34,3)=48.3832360
+Long(34,3)=-122.5120895
+Lat(34,4)=48.3833055
+Long(34,4)=-122.5121176
+Lat(34,5)=48.3834026
+Long(34,5)=-122.5119339
+
+Nodes(35)=2
+Lat(35,1)=48.3829601
+Long(35,1)=-122.5122172
+Lat(35,2)=48.3832226
+Long(35,2)=-122.5123295
+
+Nodes(36)=2
+Lat(36,1)=48.3829675
+Long(36,1)=-122.5127057
+Lat(36,2)=48.3831924
+Long(36,2)=-122.5125790
+
+Nodes(37)=2
+Lat(37,1)=48.3831781
+Long(37,1)=-122.5130202
+Lat(37,2)=48.3833367
+Long(37,2)=-122.5127560
+
+Nodes(38)=2
+Lat(38,1)=48.3834257
+Long(38,1)=-122.5132307
+Lat(38,2)=48.3834614
+Long(38,2)=-122.5129116
+
+Nodes(39)=2
+Lat(39,1)=48.3836430
+Long(39,1)=-122.5132710
+Lat(39,2)=48.3835843
+Long(39,2)=-122.5128204
+
+Nodes(40)=2
+Lat(40,1)=48.3839067
+Long(40,1)=-122.5130323
+Lat(40,2)=48.3836894
+Long(40,2)=-122.5127399
+
+Nodes(41)=2
+Lat(41,1)=48.3840902
+Long(41,1)=-122.5124905
+Lat(41,2)=48.3837749
+Long(41,2)=-122.5125709
+
+Nodes(42)=3
+Lat(42,1)=48.3839548
+Long(42,1)=-122.5121444
+Lat(42,2)=48.3837873
+Long(42,2)=-122.5123134
+Lat(42,3)=48.3837143
+Long(42,3)=-122.5120640
+
+Nodes(43)=3
+Lat(43,1)=48.3843966
+Long(43,1)=-122.5113720
+Lat(43,2)=48.3844856
+Long(43,2)=-122.5110474
+Lat(43,3)=48.3843485
+Long(43,3)=-122.5109428
+
+Nodes(44)=2
+Lat(44,1)=48.3834720
+Long(44,1)=-122.5112486
+Lat(44,2)=48.3833574
+Long(44,2)=-122.5109503
+
+Nodes(45)=4
+Lat(45,1)=48.3832274
+Long(45,1)=-122.5110676
+Lat(45,2)=48.3833574
+Long(45,2)=-122.5109503
+Lat(45,3)=48.3834222
+Long(45,3)=-122.5108919
+Lat(45,4)=48.3835379
+Long(45,4)=-122.5111842
+
+Nodes(46)=2
+Lat(46,1)=48.3832476
+Long(46,1)=-122.5102991
+Lat(46,2)=48.3831245
+Long(46,2)=-122.5099838
+
+Nodes(47)=2
+Lat(47,1)=48.3836911
+Long(47,1)=-122.5099799
+Lat(47,2)=48.3835756
+Long(47,2)=-122.5101353
+
+Nodes(48)=3
+Lat(48,1)=48.3834819
+Long(48,1)=-122.5098667
+Lat(48,2)=48.3835756
+Long(48,2)=-122.5101353
+Lat(48,3)=48.3836056
+Long(48,3)=-122.5102213
+
+Nodes(49)=2
+Lat(49,1)=48.3839720
+Long(49,1)=-122.5094332
+Lat(49,2)=48.3840127
+Long(49,2)=-122.5093060
+
+Nodes(50)=4
+Lat(50,1)=48.3838468
+Long(50,1)=-122.5093427
+Lat(50,2)=48.3839720
+Long(50,2)=-122.5094332
+Lat(50,3)=48.3840559
+Long(50,3)=-122.5094938
+Lat(50,4)=48.3839534
+Long(50,4)=-122.5096232
+
+Nodes(51)=2
+Lat(51,1)=48.3841761
+Long(51,1)=-122.5093201
+Lat(51,2)=48.3839835
+Long(51,2)=-122.5089483
+
+Nodes(52)=2
+Lat(52,1)=48.3842325
+Long(52,1)=-122.5087650
+Lat(52,2)=48.3843146
+Long(52,2)=-122.5091484
+
+Nodes(53)=2
+Lat(53,1)=48.3844428
+Long(53,1)=-122.5087588
+Lat(53,2)=48.3844206
+Long(53,2)=-122.5091162
+
+Nodes(54)=3
+Lat(54,1)=48.3813798
+Long(54,1)=-122.5133501
+Lat(54,2)=48.3813023
+Long(54,2)=-122.5132844
+Lat(54,3)=48.3812186
+Long(54,3)=-122.5132227
+
+Nodes(55)=3
+Lat(55,1)=48.3813263
+Long(55,1)=-122.5135097
+Lat(55,2)=48.3812455
+Long(55,2)=-122.5134491
+Lat(55,3)=48.3811562
+Long(55,3)=-122.5133823
+
+Nodes(56)=3
+Lat(56,1)=48.3812782
+Long(56,1)=-122.5136559
+Lat(56,2)=48.3811981
+Long(56,2)=-122.5135865
+Lat(56,3)=48.3811233
+Long(56,3)=-122.5135218
+
+Nodes(57)=3
+Lat(57,1)=48.3812373
+Long(57,1)=-122.5137779
+Lat(57,2)=48.3811541
+Long(57,2)=-122.5137139
+Lat(57,3)=48.3810787
+Long(57,3)=-122.5136559
+
+Nodes(58)=3
+Lat(58,1)=48.3812007
+Long(58,1)=-122.5139174
+Lat(58,2)=48.3811094
+Long(58,2)=-122.5138436
+Lat(58,3)=48.3810315
+Long(58,3)=-122.5137806
+
+Nodes(59)=3
+Lat(59,1)=48.3811428
+Long(59,1)=-122.5140381
+Lat(59,2)=48.3810638
+Long(59,2)=-122.5139758
+Lat(59,3)=48.3809896
+Long(59,3)=-122.5139174
+
+Nodes(60)=3
+Lat(60,1)=48.3811037
+Long(60,1)=-122.5141668
+Lat(60,2)=48.3810185
+Long(60,2)=-122.5141073
+Lat(60,3)=48.3809558
+Long(60,3)=-122.5140636
+
+Nodes(61)=3
+Lat(61,1)=48.3810573
+Long(61,1)=-122.5143103
+Lat(61,2)=48.3809729
+Long(61,2)=-122.5142394
+Lat(61,3)=48.3808801
+Long(61,3)=-122.5141615
+
+Nodes(62)=3
+Lat(62,1)=48.3809896
+Long(62,1)=-122.5144203
+Lat(62,2)=48.3809265
+Long(62,2)=-122.5143739
+Lat(62,3)=48.3808453
+Long(62,3)=-122.5143144
+
+Nodes(63)=3
+Lat(63,1)=48.3809344
+Long(63,1)=-122.5145397
+Lat(63,2)=48.3808826
+Long(63,2)=-122.5145011
+Lat(63,3)=48.3807901
+Long(63,3)=-122.5144324
+
+Nodes(64)=3
+Lat(64,1)=48.3809389
+Long(64,1)=-122.5146993
+Lat(64,2)=48.3808375
+Long(64,2)=-122.5146320
+Lat(64,3)=48.3807527
+Long(64,3)=-122.5145759
+
+Nodes(65)=3
+Lat(65,1)=48.3808819
+Long(65,1)=-122.5148374
+Lat(65,2)=48.3807904
+Long(65,2)=-122.5147685
+Lat(65,3)=48.3807002
+Long(65,3)=-122.5147006
+
+Nodes(66)=3
+Lat(66,1)=48.3808400
+Long(66,1)=-122.5149675
+Lat(66,2)=48.3807473
+Long(66,2)=-122.5148936
+Lat(66,3)=48.3806565
+Long(66,3)=-122.5148213
+
+Nodes(67)=3
+Lat(67,1)=48.3807999
+Long(67,1)=-122.5151083
+Lat(67,2)=48.3807007
+Long(67,2)=-122.5150285
+Lat(67,3)=48.3806164
+Long(67,3)=-122.5149608
+
+Nodes(68)=15
+Lat(68,1)=48.3813023
+Long(68,1)=-122.5132844
+Lat(68,2)=48.3812455
+Long(68,2)=-122.5134491
+Lat(68,3)=48.3811981
+Long(68,3)=-122.5135865
+Lat(68,4)=48.3811541
+Long(68,4)=-122.5137139
+Lat(68,5)=48.3811094
+Long(68,5)=-122.5138436
+Lat(68,6)=48.3810638
+Long(68,6)=-122.5139758
+Lat(68,7)=48.3810185
+Long(68,7)=-122.5141073
+Lat(68,8)=48.3809729
+Long(68,8)=-122.5142394
+Lat(68,9)=48.3809265
+Long(68,9)=-122.5143739
+Lat(68,10)=48.3808826
+Long(68,10)=-122.5145011
+Lat(68,11)=48.3808375
+Long(68,11)=-122.5146320
+Lat(68,12)=48.3807904
+Long(68,12)=-122.5147685
+Lat(68,13)=48.3807473
+Long(68,13)=-122.5148936
+Lat(68,14)=48.3807007
+Long(68,14)=-122.5150285
+Lat(68,15)=48.3806191
+Long(68,15)=-122.5152652
+
+Nodes(69)=3
+Lat(69,1)=48.3804098
+Long(69,1)=-122.5143962
+Lat(69,2)=48.3804808
+Long(69,2)=-122.5144520
+Lat(69,3)=48.3805701
+Long(69,3)=-122.5145222
+
+Nodes(70)=3
+Lat(70,1)=48.3804392
+Long(70,1)=-122.5142849
+Lat(70,2)=48.3805190
+Long(70,2)=-122.5143440
+Lat(70,3)=48.3806040
+Long(70,3)=-122.5144069
+
+Nodes(71)=3
+Lat(71,1)=48.3804819
+Long(71,1)=-122.5141601
+Lat(71,2)=48.3805613
+Long(71,2)=-122.5142242
+Lat(71,3)=48.3806431
+Long(71,3)=-122.5142902
+
+Nodes(72)=3
+Lat(72,1)=48.3805238
+Long(72,1)=-122.5140448
+Lat(72,2)=48.3806027
+Long(72,2)=-122.5141071
+Lat(72,3)=48.3806868
+Long(72,3)=-122.5141735
+
+Nodes(73)=3
+Lat(73,1)=48.3805603
+Long(73,1)=-122.5139362
+Lat(73,2)=48.3806424
+Long(73,2)=-122.5139947
+Lat(73,3)=48.3807260
+Long(73,3)=-122.5140542
+
+Nodes(74)=3
+Lat(74,1)=48.3806111
+Long(74,1)=-122.5138168
+Lat(74,2)=48.3806841
+Long(74,2)=-122.5138769
+Lat(74,3)=48.3807625
+Long(74,3)=-122.5139415
+
+Nodes(75)=3
+Lat(75,1)=48.3808133
+Long(75,1)=-122.5138369
+Lat(75,2)=48.3807259
+Long(75,2)=-122.5137584
+Lat(75,3)=48.3806387
+Long(75,3)=-122.5136800
+
+Nodes(76)=3
+Lat(76,1)=48.3806895
+Long(76,1)=-122.5135861
+Lat(76,2)=48.3807664
+Long(76,2)=-122.5136440
+Lat(76,3)=48.3808498
+Long(76,3)=-122.5137068
+
+Nodes(77)=3
+Lat(77,1)=48.3807465
+Long(77,1)=-122.5134708
+Lat(77,2)=48.3808092
+Long(77,2)=-122.5135228
+Lat(77,3)=48.3808952
+Long(77,3)=-122.5135942
+
+Nodes(78)=3
+Lat(78,1)=48.3807661
+Long(78,1)=-122.5133407
+Lat(78,2)=48.3808506
+Long(78,2)=-122.5134057
+Lat(78,3)=48.3809317
+Long(78,3)=-122.5134681
+
+Nodes(79)=3
+Lat(79,1)=48.3808062
+Long(79,1)=-122.5132254
+Lat(79,2)=48.3808905
+Long(79,2)=-122.5132929
+Lat(79,3)=48.3809754
+Long(79,3)=-122.5133608
+
+Nodes(80)=3
+Lat(80,1)=48.3808534
+Long(80,1)=-122.5131141
+Lat(80,2)=48.3809323
+Long(80,2)=-122.5131745
+Lat(80,3)=48.3810110
+Long(80,3)=-122.5132374
+
+Nodes(81)=3
+Lat(81,1)=48.3810645
+Long(81,1)=-122.5131208
+Lat(81,2)=48.3809807
+Long(81,2)=-122.5130376
+Lat(81,3)=48.3808952
+Long(81,3)=-122.5129692
+
+Nodes(82)=14
+Lat(82,1)=48.3803920
+Long(82,1)=-122.5147033
+Lat(82,2)=48.3804808
+Long(82,2)=-122.5144520
+Lat(82,3)=48.3805190
+Long(82,3)=-122.5143440
+Lat(82,4)=48.3805613
+Long(82,4)=-122.5142242
+Lat(82,5)=48.3806027
+Long(82,5)=-122.5141071
+Lat(82,6)=48.3806424
+Long(82,6)=-122.5139947
+Lat(82,7)=48.3806841
+Long(82,7)=-122.5138769
+Lat(82,8)=48.3807259
+Long(82,8)=-122.5137584
+Lat(82,9)=48.3807664
+Long(82,9)=-122.5136440
+Lat(82,10)=48.3808092
+Long(82,10)=-122.5135228
+Lat(82,11)=48.3808506
+Long(82,11)=-122.5134057
+Lat(82,12)=48.3808905
+Long(82,12)=-122.5132929
+Lat(82,13)=48.3809323
+Long(82,13)=-122.5131745
+Lat(82,14)=48.3809807
+Long(82,14)=-122.5130376
+
+Nodes(83)=2
+Lat(83,1)=48.3806098
+Long(83,1)=-122.5129836
+Lat(83,2)=48.3805091
+Long(83,2)=-122.5129082
+
+Nodes(84)=2
+Lat(84,1)=48.3805675
+Long(84,1)=-122.5131027
+Lat(84,2)=48.3804677
+Long(84,2)=-122.5130249
+
+Nodes(85)=2
+Lat(85,1)=48.3805264
+Long(85,1)=-122.5132199
+Lat(85,2)=48.3804267
+Long(85,2)=-122.5131449
+
+Nodes(86)=2
+Lat(86,1)=48.3804848
+Long(86,1)=-122.5133365
+Lat(86,2)=48.3803865
+Long(86,2)=-122.5132536
+
+Nodes(87)=2
+Lat(87,1)=48.3804433
+Long(87,1)=-122.5134502
+Lat(87,2)=48.3803445
+Long(87,2)=-122.5133731
+
+Nodes(88)=2
+Lat(88,1)=48.3804015
+Long(88,1)=-122.5135628
+Lat(88,2)=48.3803064
+Long(88,2)=-122.5134896
+
+Nodes(89)=2
+Lat(89,1)=48.3803612
+Long(89,1)=-122.5136827
+Lat(89,2)=48.3802655
+Long(89,2)=-122.5136076
+
+Nodes(90)=2
+Lat(90,1)=48.3800900
+Long(90,1)=-122.5132348
+Lat(90,2)=48.3798557
+Long(90,2)=-122.5135633
+
+Nodes(91)=2
+Lat(91,1)=48.3797110
+Long(91,1)=-122.5129136
+Lat(91,2)=48.3798121
+Long(91,2)=-122.5130564
+
+Nodes(92)=3
+Lat(92,1)=48.3795719
+Long(92,1)=-122.5130620
+Lat(92,2)=48.3797110
+Long(92,2)=-122.5129136
+Lat(92,3)=48.3797493
+Long(92,3)=-122.5128653
+
+Nodes(93)=5
+Lat(93,1)=48.3795279
+Long(93,1)=-122.5127171
+Lat(93,2)=48.3794313
+Long(93,2)=-122.5126467
+Lat(93,3)=48.3794429
+Long(93,3)=-122.5125977
+Lat(93,4)=48.3794763
+Long(93,4)=-122.5125099
+Lat(93,5)=48.3795836
+Long(93,5)=-122.5125823
+
+Nodes(94)=2
+Lat(94,1)=48.3793182
+Long(94,1)=-122.5125226
+Lat(94,2)=48.3794429
+Long(94,2)=-122.5125977
+
+Nodes(95)=2
+Lat(95,1)=48.3798210
+Long(95,1)=-122.5123034
+Lat(95,2)=48.3798468
+Long(95,2)=-122.5126065
+
+Nodes(96)=2
+Lat(96,1)=48.3800566
+Long(96,1)=-122.5123445
+Lat(96,2)=48.3799907
+Long(96,2)=-122.5126199
+
+Nodes(97)=2
+Lat(97,1)=48.3805803
+Long(97,1)=-122.5122185
+Lat(97,2)=48.3807198
+Long(97,2)=-122.5125327
+
+Nodes(98)=2
+Lat(98,1)=48.3808017
+Long(98,1)=-122.5121183
+Lat(98,2)=48.3808302
+Long(98,2)=-122.5124395
+
+Nodes(99)=3
+Lat(99,1)=48.3810288
+Long(99,1)=-122.5121297
+Lat(99,2)=48.3809923
+Long(99,2)=-122.5123067
+Lat(99,3)=48.3810092
+Long(99,3)=-122.5125119
+
+Nodes(100)=3
+Lat(100,1)=48.3816390
+Long(100,1)=-122.5123791
+Lat(100,2)=48.3816871
+Long(100,2)=-122.5122236
+Lat(100,3)=48.3817396
+Long(100,3)=-122.5119741
+
+Nodes(101)=2
+Lat(101,1)=48.3815342
+Long(101,1)=-122.5120172
+Lat(101,2)=48.3816871
+Long(101,2)=-122.5122236
+
+Nodes(102)=3
+Lat(102,1)=48.3815009
+Long(102,1)=-122.5112352
+Lat(102,2)=48.3816969
+Long(102,2)=-122.5111520
+Lat(102,3)=48.3817307
+Long(102,3)=-122.5112915
+
+Nodes(103)=3
+Lat(103,1)=48.3812150
+Long(103,1)=-122.5109200
+Lat(103,2)=48.3812800
+Long(103,2)=-122.5105485
+Lat(103,3)=48.3814163
+Long(103,3)=-122.5106116
+
+Nodes(104)=2
+Lat(104,1)=48.3810173
+Long(104,1)=-122.5104117
+Lat(104,2)=48.3809121
+Long(104,2)=-122.5107577
+
+Nodes(105)=2
+Lat(105,1)=48.3802762
+Long(105,1)=-122.5105593
+Lat(105,2)=48.3804187
+Long(105,2)=-122.5108409
+
+Nodes(106)=2
+Lat(106,1)=48.3801782
+Long(106,1)=-122.5106880
+Lat(106,2)=48.3802085
+Long(106,2)=-122.5110555
+
+Nodes(107)=2
+Lat(107,1)=48.3800250
+Long(107,1)=-122.5106102
+Lat(107,2)=48.3799430
+Long(107,2)=-122.5109884
+
+Nodes(108)=4
+Lat(108,1)=48.3788314
+Long(108,1)=-122.5106397
+Lat(108,2)=48.3787102
+Long(108,2)=-122.5106639
+Lat(108,3)=48.3787016
+Long(108,3)=-122.5105415
+Lat(108,4)=48.3787165
+Long(108,4)=-122.5104131
+
+Nodes(109)=4
+Lat(109,1)=48.3785855
+Long(109,1)=-122.5105271
+Lat(109,2)=48.3787016
+Long(109,2)=-122.5105415
+Lat(109,3)=48.3787147
+Long(109,3)=-122.5105432
+Lat(109,4)=48.3788376
+Long(109,4)=-122.5105029
+
+Nodes(110)=2
+Lat(110,1)=48.3785989
+Long(110,1)=-122.5110796
+Lat(110,2)=48.3787672
+Long(110,2)=-122.5108275
+
+Nodes(111)=2
+Lat(111,1)=48.3788046
+Long(111,1)=-122.5113398
+Lat(111,2)=48.3788946
+Long(111,2)=-122.5110219
+
+Nodes(112)=2
+Lat(112,1)=48.3792242
+Long(112,1)=-122.5112835
+Lat(112,2)=48.3791476
+Long(112,2)=-122.5109240
+
+Nodes(113)=2
+Lat(113,1)=48.3794504
+Long(113,1)=-122.5110407
+Lat(113,2)=48.3792634
+Long(113,2)=-122.5107524
+
+Nodes(114)=3
+Lat(114,1)=48.3794731
+Long(114,1)=-122.5098598
+Lat(114,2)=48.3793572
+Long(114,2)=-122.5098934
+Lat(114,3)=48.3792482
+Long(114,3)=-122.5099128
+
+Nodes(115)=3
+Lat(115,1)=48.3794905
+Long(115,1)=-122.5100235
+Lat(115,2)=48.3793707
+Long(115,2)=-122.5100487
+Lat(115,3)=48.3792554
+Long(115,3)=-122.5100745
+
+Nodes(116)=3
+Lat(116,1)=48.3795012
+Long(116,1)=-122.5101945
+Lat(116,2)=48.3793863
+Long(116,2)=-122.5102182
+Lat(116,3)=48.3792669
+Long(116,3)=-122.5102428
+
+Nodes(117)=3
+Lat(117,1)=48.3792919
+Long(117,1)=-122.5104070
+Lat(117,2)=48.3794015
+Long(117,2)=-122.5103863
+Lat(117,3)=48.3795146
+Long(117,3)=-122.5103728
+
+Nodes(118)=5
+Lat(118,1)=48.3793355
+Long(118,1)=-122.5096527
+Lat(118,2)=48.3793572
+Long(118,2)=-122.5098934
+Lat(118,3)=48.3793707
+Long(118,3)=-122.5100487
+Lat(118,4)=48.3793863
+Long(118,4)=-122.5102182
+Lat(118,5)=48.3794015
+Long(118,5)=-122.5103863
+
+Nodes(119)=3
+Lat(119,1)=48.3799809
+Long(119,1)=-122.5097599
+Lat(119,2)=48.3798678
+Long(119,2)=-122.5097838
+Lat(119,3)=48.3797493
+Long(119,3)=-122.5098056
+
+Nodes(120)=3
+Lat(120,1)=48.3800000
+Long(120,1)=-122.5099249
+Lat(120,2)=48.3798857
+Long(120,2)=-122.5099546
+Lat(120,3)=48.3797680
+Long(120,3)=-122.5099752
+
+Nodes(121)=3
+Lat(121,1)=48.3800054
+Long(121,1)=-122.5100899
+Lat(121,2)=48.3799013
+Long(121,2)=-122.5101151
+Lat(121,3)=48.3797898
+Long(121,3)=-122.5101422
+
+Nodes(122)=3
+Lat(122,1)=48.3797969
+Long(122,1)=-122.5103018
+Lat(122,2)=48.3799172
+Long(122,2)=-122.5102790
+Lat(122,3)=48.3800285
+Long(122,3)=-122.5102575
+
+Nodes(123)=5
+Lat(123,1)=48.3798483
+Long(123,1)=-122.5095684
+Lat(123,2)=48.3798678
+Long(123,2)=-122.5097838
+Lat(123,3)=48.3798857
+Long(123,3)=-122.5099546
+Lat(123,4)=48.3799013
+Long(123,4)=-122.5101151
+Lat(123,5)=48.3799172
+Long(123,5)=-122.5102790
+
+Nodes(124)=3
+Lat(124,1)=48.3802655
+Long(124,1)=-122.5097023
+Lat(124,2)=48.3803677
+Long(124,2)=-122.5096827
+Lat(124,3)=48.3804828
+Long(124,3)=-122.5096607
+
+Nodes(125)=3
+Lat(125,1)=48.3805038
+Long(125,1)=-122.5098189
+Lat(125,2)=48.3803835
+Long(125,2)=-122.5098432
+Lat(125,3)=48.3802708
+Long(125,3)=-122.5098646
+
+Nodes(126)=3
+Lat(126,1)=48.3805131
+Long(126,1)=-122.5099806
+Lat(126,2)=48.3803998
+Long(126,2)=-122.5100095
+Lat(126,3)=48.3802771
+Long(126,3)=-122.5100242
+
+Nodes(127)=6
+Lat(127,1)=48.3803448
+Long(127,1)=-122.5094488
+Lat(127,2)=48.3803677
+Long(127,2)=-122.5096827
+Lat(127,3)=48.3803835
+Long(127,3)=-122.5098432
+Lat(127,4)=48.3803998
+Long(127,4)=-122.5100095
+Lat(127,5)=48.3804160
+Long(127,5)=-122.5101744
+Lat(127,6)=48.3805238
+Long(127,6)=-122.5101583
+
+Nodes(128)=3
+Lat(128,1)=48.3810186
+Long(128,1)=-122.5098773
+Lat(128,2)=48.3809043
+Long(128,2)=-122.5099020
+Lat(128,3)=48.3807905
+Long(128,3)=-122.5099229
+
+Nodes(129)=3
+Lat(129,1)=48.3809914
+Long(129,1)=-122.5095521
+Lat(129,2)=48.3808706
+Long(129,2)=-122.5095810
+Lat(129,3)=48.3807545
+Long(129,3)=-122.5096044
+
+Nodes(130)=3
+Lat(130,1)=48.3810048
+Long(130,1)=-122.5097150
+Lat(130,2)=48.3808875
+Long(130,2)=-122.5097422
+Lat(130,3)=48.3807750
+Long(130,3)=-122.5097680
+
+Nodes(131)=3
+Lat(131,1)=48.3810324
+Long(131,1)=-122.5100510
+Lat(131,2)=48.3809223
+Long(131,2)=-122.5100743
+Lat(131,3)=48.3808106
+Long(131,3)=-122.5100979
+
+Nodes(132)=5
+Lat(132,1)=48.3808453
+Long(132,1)=-122.5093402
+Lat(132,2)=48.3808706
+Long(132,2)=-122.5095810
+Lat(132,3)=48.3808875
+Long(132,3)=-122.5097422
+Lat(132,4)=48.3809043
+Long(132,4)=-122.5099020
+Lat(132,5)=48.3809223
+Long(132,5)=-122.5100743
+
+Nodes(133)=3
+Lat(133,1)=48.3814332
+Long(133,1)=-122.5096272
+Lat(133,2)=48.3813523
+Long(133,2)=-122.5096557
+Lat(133,3)=48.3812177
+Long(133,3)=-122.5096795
+
+Nodes(134)=3
+Lat(134,1)=48.3814938
+Long(134,1)=-122.5097814
+Lat(134,2)=48.3813664
+Long(134,2)=-122.5098006
+Lat(134,3)=48.3813156
+Long(134,3)=-122.5098082
+
+Nodes(135)=3
+Lat(135,1)=48.3815152
+Long(135,1)=-122.5099356
+Lat(135,2)=48.3813825
+Long(135,2)=-122.5099652
+Lat(135,3)=48.3812453
+Long(135,3)=-122.5099987
+
+Nodes(136)=4
+Lat(136,1)=48.3813139
+Long(136,1)=-122.5092611
+Lat(136,2)=48.3813523
+Long(136,2)=-122.5096557
+Lat(136,3)=48.3813664
+Long(136,3)=-122.5098006
+Lat(136,4)=48.3813825
+Long(136,4)=-122.5099652
+
+Nodes(137)=5
+Lat(137,1)=48.3850939
+Long(137,1)=-122.5043430
+Lat(137,2)=48.3852896
+Long(137,2)=-122.5046042
+Lat(137,3)=48.3854282
+Long(137,3)=-122.5044051
+Lat(137,4)=48.3852462
+Long(137,4)=-122.5041434
+Lat(137,5)=48.3850939
+Long(137,5)=-122.5043430
+
+Nodes(138)=4
+Lat(138,1)=48.3854778
+Long(138,1)=-122.5043339
+Lat(138,2)=48.3854282
+Long(138,2)=-122.5044051
+Lat(138,3)=48.3852896
+Long(138,3)=-122.5046042
+Lat(138,4)=48.3845836
+Long(138,4)=-122.5056186
+
+Nodes(139)=2
+Lat(139,1)=48.3826971
+Long(139,1)=-122.5140689
+Lat(139,2)=48.3825110
+Long(139,2)=-122.5142902
+
+Nodes(140)=4
+Lat(140,1)=48.3824379
+Long(140,1)=-122.5138946
+Lat(140,2)=48.3824228
+Long(140,2)=-122.5141427
+Lat(140,3)=48.3824050
+Long(140,3)=-122.5142325
+Lat(140,4)=48.3822758
+Long(140,4)=-122.5141722
+
+Nodes(141)=2
+Lat(141,1)=48.3813473
+Long(141,1)=-122.5154074
+Lat(141,2)=48.3814288
+Long(141,2)=-122.5154699
+
+Nodes(142)=2
+Lat(142,1)=48.3813833
+Long(142,1)=-122.5152887
+Lat(142,2)=48.3814696
+Long(142,2)=-122.5153610
+
+Nodes(143)=2
+Lat(143,1)=48.3815483
+Long(143,1)=-122.5152906
+Lat(143,2)=48.3814461
+Long(143,2)=-122.5151921
+
+Nodes(144)=3
+Lat(144,1)=48.3816768
+Long(144,1)=-122.5151774
+Lat(144,2)=48.3816281
+Long(144,2)=-122.5151339
+Lat(144,3)=48.3814889
+Long(144,3)=-122.5150218
+
+Nodes(145)=3
+Lat(145,1)=48.3817615
+Long(145,1)=-122.5150580
+Lat(145,2)=48.3816774
+Long(145,2)=-122.5149907
+Lat(145,3)=48.3815450
+Long(145,3)=-122.5148823
+
+Nodes(146)=3
+Lat(146,1)=48.3818185
+Long(146,1)=-122.5149105
+Lat(146,2)=48.3817284
+Long(146,2)=-122.5148407
+Lat(146,3)=48.3816020
+Long(146,3)=-122.5147348
+
+Nodes(147)=3
+Lat(147,1)=48.3818612
+Long(147,1)=-122.5147576
+Lat(147,2)=48.3817815
+Long(147,2)=-122.5146896
+Lat(147,3)=48.3816448
+Long(147,3)=-122.5145819
+
+Nodes(148)=3
+Lat(148,1)=48.3819120
+Long(148,1)=-122.5146154
+Lat(148,2)=48.3818288
+Long(148,2)=-122.5145489
+Lat(148,3)=48.3816955
+Long(148,3)=-122.5144397
+
+Nodes(149)=2
+Lat(149,1)=48.3819672
+Long(149,1)=-122.5144666
+Lat(149,2)=48.3817508
+Long(149,2)=-122.5142909
+
+Nodes(150)=3
+Lat(150,1)=48.3820113
+Long(150,1)=-122.5143090
+Lat(150,2)=48.3819314
+Long(150,2)=-122.5142395
+Lat(150,3)=48.3817949
+Long(150,3)=-122.5141333
+
+Nodes(151)=12
+Lat(151,1)=48.3813388
+Long(151,1)=-122.5157104
+Lat(151,2)=48.3814288
+Long(151,2)=-122.5154699
+Lat(151,3)=48.3814696
+Long(151,3)=-122.5153610
+Lat(151,4)=48.3814839
+Long(151,4)=-122.5153556
+Lat(151,5)=48.3815483
+Long(151,5)=-122.5152906
+Lat(151,6)=48.3815857
+Long(151,6)=-122.5152526
+Lat(151,7)=48.3816281
+Long(151,7)=-122.5151339
+Lat(151,8)=48.3816774
+Long(151,8)=-122.5149907
+Lat(151,9)=48.3817284
+Long(151,9)=-122.5148407
+Lat(151,10)=48.3817815
+Long(151,10)=-122.5146896
+Lat(151,11)=48.3818288
+Long(151,11)=-122.5145489
+Lat(151,12)=48.3819314
+Long(151,12)=-122.5142395
+
+Nodes(152)=2
+Lat(152,1)=48.3817356
+Long(152,1)=-122.5137095
+Lat(152,2)=48.3815192
+Long(152,2)=-122.5135379
+
+Nodes(153)=3
+Lat(153,1)=48.3816929
+Long(153,1)=-122.5138463
+Lat(153,2)=48.3815815
+Long(153,2)=-122.5137580
+Lat(153,3)=48.3814764
+Long(153,3)=-122.5136746
+
+Nodes(154)=3
+Lat(154,1)=48.3816341
+Long(154,1)=-122.5139818
+Lat(154,2)=48.3815317
+Long(154,2)=-122.5139006
+Lat(154,3)=48.3814176
+Long(154,3)=-122.5138101
+
+Nodes(155)=3
+Lat(155,1)=48.3815904
+Long(155,1)=-122.5141346
+Lat(155,2)=48.3814803
+Long(155,2)=-122.5140473
+Lat(155,3)=48.3813740
+Long(155,3)=-122.5139630
+
+Nodes(156)=3
+Lat(156,1)=48.3815370
+Long(156,1)=-122.5142822
+Lat(156,2)=48.3814284
+Long(156,2)=-122.5141960
+Lat(156,3)=48.3813205
+Long(156,3)=-122.5141105
+
+Nodes(157)=3
+Lat(157,1)=48.3814844
+Long(157,1)=-122.5144243
+Lat(157,2)=48.3813780
+Long(157,2)=-122.5143399
+Lat(157,3)=48.3812680
+Long(157,3)=-122.5142527
+
+Nodes(158)=3
+Lat(158,1)=48.3814363
+Long(158,1)=-122.5145786
+Lat(158,2)=48.3813253
+Long(158,2)=-122.5144905
+Lat(158,3)=48.3812199
+Long(158,3)=-122.5144069
+
+Nodes(159)=3
+Lat(159,1)=48.3813847
+Long(159,1)=-122.5147221
+Lat(159,2)=48.3812748
+Long(159,2)=-122.5146349
+Lat(159,3)=48.3811682
+Long(159,3)=-122.5145504
+
+Nodes(160)=3
+Lat(160,1)=48.3813393
+Long(160,1)=-122.5148696
+Lat(160,2)=48.3812246
+Long(160,2)=-122.5147786
+Lat(160,3)=48.3811228
+Long(160,3)=-122.5146979
+
+Nodes(161)=3
+Lat(161,1)=48.3812805
+Long(161,1)=-122.5150144
+Lat(161,2)=48.3811722
+Long(161,2)=-122.5149285
+Lat(161,3)=48.3810640
+Long(161,3)=-122.5148427
+
+Nodes(162)=3
+Lat(162,1)=48.3812306
+Long(162,1)=-122.5151512
+Lat(162,2)=48.3811239
+Long(162,2)=-122.5150666
+Lat(162,3)=48.3810141
+Long(162,3)=-122.5149795
+
+Nodes(163)=3
+Lat(163,1)=48.3811807
+Long(163,1)=-122.5153081
+Lat(163,2)=48.3810701
+Long(163,2)=-122.5152204
+Lat(163,3)=48.3809643
+Long(163,3)=-122.5151365
+
+Nodes(164)=3
+Lat(164,1)=48.3811330
+Long(164,1)=-122.5154690
+Lat(164,2)=48.3810157
+Long(164,2)=-122.5153759
+Lat(164,3)=48.3809166
+Long(164,3)=-122.5152974
+
+Nodes(165)=14
+Lat(165,1)=48.3816283
+Long(165,1)=-122.5136244
+Lat(165,2)=48.3815815
+Long(165,2)=-122.5137580
+Lat(165,3)=48.3815317
+Long(165,3)=-122.5139006
+Lat(165,4)=48.3814803
+Long(165,4)=-122.5140473
+Lat(165,5)=48.3814284
+Long(165,5)=-122.5141960
+Lat(165,6)=48.3813780
+Long(165,6)=-122.5143399
+Lat(165,7)=48.3813253
+Long(165,7)=-122.5144905
+Lat(165,8)=48.3812748
+Long(165,8)=-122.5146349
+Lat(165,9)=48.3812246
+Long(165,9)=-122.5147786
+Lat(165,10)=48.3811722
+Long(165,10)=-122.5149285
+Lat(165,11)=48.3811239
+Long(165,11)=-122.5150666
+Lat(165,12)=48.3810701
+Long(165,12)=-122.5152204
+Lat(165,13)=48.3810157
+Long(165,13)=-122.5153759
+Lat(165,14)=48.3809362
+Long(165,14)=-122.5156032
+
+Nodes(166)=7
+Lat(166,1)=48.3866470
+Long(166,1)=-122.5016340
+Lat(166,2)=48.3866823
+Long(166,2)=-122.5015991
+Lat(166,3)=48.3865432
+Long(166,3)=-122.5012806
+Lat(166,4)=48.3865215
+Long(166,4)=-122.5013020
+Lat(166,5)=48.3865845
+Long(166,5)=-122.5014460
+Lat(166,6)=48.3865708
+Long(166,6)=-122.5014596
+Lat(166,7)=48.3866470
+Long(166,7)=-122.5016340
+
+Nodes(167)=5
+Lat(167,1)=48.3903307
+Long(167,1)=-122.4996252
+Lat(167,2)=48.3902533
+Long(167,2)=-122.4993771
+Lat(167,3)=48.3903040
+Long(167,3)=-122.4993463
+Lat(167,4)=48.3903717
+Long(167,4)=-122.4995877
+Lat(167,5)=48.3903307
+Long(167,5)=-122.4996252
+
+Nodes(168)=3
+Lat(168,1)=48.3896614
+Long(168,1)=-122.4996942
+Lat(168,2)=48.3897257
+Long(168,2)=-122.4998620
+Lat(168,3)=48.3897955
+Long(168,3)=-122.5000289
+
+Nodes(169)=3
+Lat(169,1)=48.3900787
+Long(169,1)=-122.4995810
+Lat(169,2)=48.3897257
+Long(169,2)=-122.4998620
+Lat(169,3)=48.3893645
+Long(169,3)=-122.5001496
+
+Nodes(170)=3
+Lat(170,1)=48.3900199
+Long(170,1)=-122.4994147
+Lat(170,2)=48.3896614
+Long(170,2)=-122.4996942
+Lat(170,3)=48.3892594
+Long(170,3)=-122.5000075
+
+Nodes(171)=3
+Lat(171,1)=48.3894321
+Long(171,1)=-122.4987602
+Lat(171,2)=48.3895568
+Long(171,2)=-122.4986422
+Lat(171,3)=48.3895423
+Long(171,3)=-122.4986096
+
+Nodes(172)=3
+Lat(172,1)=48.3897064
+Long(172,1)=-122.4986127
+Lat(172,2)=48.3897779
+Long(172,2)=-122.4985431
+Lat(172,3)=48.3897871
+Long(172,3)=-122.4985342
+
+Nodes(173)=3
+Lat(173,1)=48.3905151
+Long(173,1)=-122.4978805
+Lat(173,2)=48.3904937
+Long(173,2)=-122.4978966
+Lat(173,3)=48.3903637
+Long(173,3)=-122.4980414
+
+Nodes(174)=2
+Lat(174,1)=48.3904547
+Long(174,1)=-122.4977986
+Lat(174,2)=48.3904937
+Long(174,2)=-122.4978966
+
+Nodes(175)=3
+Lat(175,1)=48.3901268
+Long(175,1)=-122.4982506
+Lat(175,2)=48.3899923
+Long(175,2)=-122.4983659
+Lat(175,3)=48.3899348
+Long(175,3)=-122.4984209
+
+Nodes(176)=2
+Lat(176,1)=48.3899475
+Long(176,1)=-122.4982639
+Lat(176,2)=48.3899923
+Long(176,2)=-122.4983659
+
+Nodes(177)=3
+Lat(177,1)=48.3910565
+Long(177,1)=-122.4974456
+Lat(177,2)=48.3912397
+Long(177,2)=-122.4972891
+Lat(177,3)=48.3911717
+Long(177,3)=-122.4971015
+
+Nodes(178)=3
+Lat(178,1)=48.3906540
+Long(178,1)=-122.4976344
+Lat(178,2)=48.3906998
+Long(178,2)=-122.4977644
+Lat(178,3)=48.3909515
+Long(178,3)=-122.4975640
+
+Nodes(179)=11
+Lat(179,1)=48.3720116
+Long(179,1)=-122.5036294
+Lat(179,2)=48.3719986
+Long(179,2)=-122.5036133
+Lat(179,3)=48.3720978
+Long(179,3)=-122.5034325
+Lat(179,4)=48.3721153
+Long(179,4)=-122.5034542
+Lat(179,5)=48.3720969
+Long(179,5)=-122.5034876
+Lat(179,6)=48.3721509
+Long(179,6)=-122.5035548
+Lat(179,7)=48.3721454
+Long(179,7)=-122.5035649
+Lat(179,8)=48.3720914
+Long(179,8)=-122.5034978
+Lat(179,9)=48.3720768
+Long(179,9)=-122.5035243
+Lat(179,10)=48.3720723
+Long(179,10)=-122.5035187
+Lat(179,11)=48.3720116
+Long(179,11)=-122.5036294
+
+Nodes(180)=6
+Lat(180,1)=48.3989724
+Long(180,1)=-122.4959017
+Lat(180,2)=48.3989607
+Long(180,2)=-122.4956270
+Lat(180,3)=48.3989518
+Long(180,3)=-122.4954188
+Lat(180,4)=48.4005850
+Long(180,4)=-122.4952611
+Lat(180,5)=48.4006055
+Long(180,5)=-122.4957436
+Lat(180,6)=48.3989724
+Long(180,6)=-122.4959017
+
+Nodes(181)=6
+Lat(181,1)=48.3989303
+Long(181,1)=-122.4949741
+Lat(181,2)=48.3989246
+Long(181,2)=-122.4947732
+Lat(181,3)=48.3989197
+Long(181,3)=-122.4945996
+Lat(181,4)=48.4005603
+Long(181,4)=-122.4944941
+Lat(181,5)=48.4005709
+Long(181,5)=-122.4948690
+Lat(181,6)=48.3989303
+Long(181,6)=-122.4949741
+
+Nodes(182)=6
+Lat(182,1)=48.4005338
+Long(182,1)=-122.4942164
+Lat(182,2)=48.3988816
+Long(182,2)=-122.4943331
+Lat(182,3)=48.3988767
+Long(182,3)=-122.4941740
+Lat(182,4)=48.3988717
+Long(182,4)=-122.4940139
+Lat(182,5)=48.4005239
+Long(182,5)=-122.4938972
+Lat(182,6)=48.4005338
+Long(182,6)=-122.4942164
+
+Nodes(183)=6
+Lat(183,1)=48.3989119
+Long(183,1)=-122.4938373
+Lat(183,2)=48.3989061
+Long(183,2)=-122.4936651
+Lat(183,3)=48.3989016
+Long(183,3)=-122.4935317
+Lat(183,4)=48.4005078
+Long(183,4)=-122.4934088
+Lat(183,5)=48.4005181
+Long(183,5)=-122.4937140
+Lat(183,6)=48.3989119
+Long(183,6)=-122.4938373
+
+Nodes(184)=4
+Lat(184,1)=48.4005221
+Long(184,1)=-122.4962990
+Lat(184,2)=48.3989065
+Long(184,2)=-122.4963891
+Lat(184,3)=48.3988834
+Long(184,3)=-122.4957790
+Lat(184,4)=48.3986509
+Long(184,4)=-122.4954502
+
+Nodes(185)=5
+Lat(185,1)=48.3989607
+Long(185,1)=-122.4956270
+Lat(185,2)=48.3988696
+Long(185,2)=-122.4956196
+Lat(185,3)=48.3988547
+Long(185,3)=-122.4951650
+Lat(185,4)=48.3988420
+Long(185,4)=-122.4947807
+Lat(185,5)=48.3989246
+Long(185,5)=-122.4947732
+
+Nodes(186)=2
+Lat(186,1)=48.3988547
+Long(186,1)=-122.4951650
+Lat(186,2)=48.3987411
+Long(186,2)=-122.4951715
+
+Nodes(187)=5
+Lat(187,1)=48.3989061
+Long(187,1)=-122.4936651
+Lat(187,2)=48.3988123
+Long(187,2)=-122.4936715
+Lat(187,3)=48.3988226
+Long(187,3)=-122.4939769
+Lat(187,4)=48.3988292
+Long(187,4)=-122.4941738
+Lat(187,5)=48.3988767
+Long(187,5)=-122.4941740
+
+Nodes(188)=2
+Lat(188,1)=48.3988226
+Long(188,1)=-122.4939769
+Lat(188,2)=48.3986952
+Long(188,2)=-122.4939901
+
+Nodes(189)=4
+Lat(189,1)=48.3986678
+Long(189,1)=-122.4932848
+Lat(189,2)=48.4009274
+Long(189,2)=-122.4931324
+Lat(189,3)=48.4009423
+Long(189,3)=-122.4931314
+Lat(189,4)=48.4009688
+Long(189,4)=-122.4936568
+
+Nodes(190)=3
+Lat(190,1)=48.4011713
+Long(190,1)=-122.4948968
+Lat(190,2)=48.4010189
+Long(190,2)=-122.4949039
+Lat(190,3)=48.4010381
+Long(190,3)=-122.4958388
+
+Nodes(191)=9
+Lat(191,1)=48.3716695
+Long(191,1)=-122.4827750
+Lat(191,2)=48.3716351
+Long(191,2)=-122.4827922
+Lat(191,3)=48.3716335
+Long(191,3)=-122.4829184
+Lat(191,4)=48.3716048
+Long(191,4)=-122.4829166
+Lat(191,5)=48.3716023
+Long(191,5)=-122.4827658
+Lat(191,6)=48.3716335
+Long(191,6)=-122.4827671
+Lat(191,7)=48.3716333
+Long(191,7)=-122.4827777
+Lat(191,8)=48.3716652
+Long(191,8)=-122.4827600
+Lat(191,9)=48.3716695
+Long(191,9)=-122.4827750
+
+Nodes(192)=21
+Lat(192,1)=48.3614157
+Long(192,1)=-122.4694357
+Lat(192,2)=48.3613413
+Long(192,2)=-122.4694038
+Lat(192,3)=48.3613308
+Long(192,3)=-122.4693880
+Lat(192,4)=48.3612482
+Long(192,4)=-122.4692905
+Lat(192,5)=48.3612446
+Long(192,5)=-122.4692385
+Lat(192,6)=48.3612475
+Long(192,6)=-122.4692244
+Lat(192,7)=48.3612743
+Long(192,7)=-122.4692536
+Lat(192,8)=48.3612727
+Long(192,8)=-122.4692680
+Lat(192,9)=48.3613622
+Long(192,9)=-122.4693994
+Lat(192,10)=48.3614193
+Long(192,10)=-122.4694232
+Lat(192,11)=48.3614216
+Long(192,11)=-122.4694150
+Lat(192,12)=48.3614349
+Long(192,12)=-122.4694237
+Lat(192,13)=48.3615254
+Long(192,13)=-122.4694831
+Lat(192,14)=48.3615358
+Long(192,14)=-122.4694472
+Lat(192,15)=48.3615466
+Long(192,15)=-122.4694100
+Lat(192,16)=48.3615500
+Long(192,16)=-122.4694122
+Lat(192,17)=48.3615392
+Long(192,17)=-122.4694495
+Lat(192,18)=48.3615288
+Long(192,18)=-122.4694853
+Lat(192,19)=48.3615098
+Long(192,19)=-122.4695509
+Lat(192,20)=48.3614027
+Long(192,20)=-122.4694806
+Lat(192,21)=48.3614157
+Long(192,21)=-122.4694357
+
+Nodes(193)=3
+Lat(193,1)=48.3897779
+Long(193,1)=-122.4985431
+Lat(193,2)=48.3897393
+Long(193,2)=-122.4984460
+Lat(193,3)=48.3897318
+Long(193,3)=-122.4984249
+
+Nodes(194)=3
+Lat(194,1)=48.3890724
+Long(194,1)=-122.5004781
+Lat(194,2)=48.3891908
+Long(194,2)=-122.5008188
+Lat(194,3)=48.3891988
+Long(194,3)=-122.5008979
+
+Nodes(195)=5
+Lat(195,1)=48.3821135
+Long(195,1)=-122.5150109
+Lat(195,2)=48.3822026
+Long(195,2)=-122.5149110
+Lat(195,3)=48.3821857
+Long(195,3)=-122.5148761
+Lat(195,4)=48.3820953
+Long(195,4)=-122.5149754
+Lat(195,5)=48.3821135
+Long(195,5)=-122.5150109
+
+Nodes(196)=2
+Lat(196,1)=48.3804160
+Long(196,1)=-122.5101744
+Lat(196,2)=48.3803003
+Long(196,2)=-122.5101955
+
+Nodes(197)=4
+Lat(197,1)=48.3805091
+Long(197,1)=-122.5129082
+Lat(197,2)=48.3802236
+Long(197,2)=-122.5137322
+Lat(197,3)=48.3803216
+Long(197,3)=-122.5138141
+Lat(197,4)=48.3801862
+Long(197,4)=-122.5142030
+
+Nodes(198)=5
+Lat(198,1)=48.3947166
+Long(198,1)=-122.4965699
+Lat(198,2)=48.3950978
+Long(198,2)=-122.4965603
+Lat(198,3)=48.3950964
+Long(198,3)=-122.4965278
+Lat(198,4)=48.3947158
+Long(198,4)=-122.4965364
+Lat(198,5)=48.3947166
+Long(198,5)=-122.4965699
+
+Nodes(199)=8
+Lat(199,1)=48.4009824
+Long(199,1)=-122.4935992
+Lat(199,2)=48.4009657
+Long(199,2)=-122.4930988
+Lat(199,3)=48.3986708
+Long(199,3)=-122.4932421
+Lat(199,4)=48.3986735
+Long(199,4)=-122.4932778
+Lat(199,5)=48.4009274
+Long(199,5)=-122.4931324
+Lat(199,6)=48.4009397
+Long(199,6)=-122.4931487
+Lat(199,7)=48.4009533
+Long(199,7)=-122.4935789
+Lat(199,8)=48.4009824
+Long(199,8)=-122.4935992
+
+Nodes(200)=9
+Lat(200,1)=48.3986201
+Long(200,1)=-122.4953705
+Lat(200,2)=48.3986020
+Long(200,2)=-122.4953986
+Lat(200,3)=48.3988700
+Long(200,3)=-122.4957665
+Lat(200,4)=48.3988922
+Long(200,4)=-122.4963921
+Lat(200,5)=48.4005510
+Long(200,5)=-122.4963030
+Lat(200,6)=48.4005533
+Long(200,6)=-122.4962402
+Lat(200,7)=48.3989231
+Long(200,7)=-122.4963415
+Lat(200,8)=48.3989069
+Long(200,8)=-122.4957512
+Lat(200,9)=48.3986201
+Long(200,9)=-122.4953705
+
+Nodes(201)=5
+Lat(201,1)=48.3971566
+Long(201,1)=-122.4965240
+Lat(201,2)=48.3971566
+Long(201,2)=-122.4964757
+Lat(201,3)=48.3967274
+Long(201,3)=-122.4964986
+Lat(201,4)=48.3967290
+Long(201,4)=-122.4965447
+Lat(201,5)=48.3971566
+Long(201,5)=-122.4965240
+
From 0812e3a0d187559401b1d471425c162db4e5e44b Mon Sep 17 00:00:00 2001
From: James Packer
Date: Tue, 2 Jun 2026 22:57:09 +0100
Subject: [PATCH 08/12] Add pontoons to docs.
---
doc/WorldFileSpec.html | 49 +++++++++++++++++++++++++++++++++++++++++-
1 file changed, 48 insertions(+), 1 deletion(-)
diff --git a/doc/WorldFileSpec.html b/doc/WorldFileSpec.html
index 86e3eb52..b82b7137 100755
--- a/doc/WorldFileSpec.html
+++ b/doc/WorldFileSpec.html
@@ -35,10 +35,14 @@ Introduction:
-For small details such as harbours and marinas, 3d models can be loaded into the world model. See the detail below in the landobject.ini
+For small details such as harbours, 3d models can be loaded into the world model. See the detail below in the landobject.ini
for how land objects can be set to appear in the radar, and act as physical models that the own ship can interact with.
+
+In addition, floating pontoons can be defined by a series of coordinates, which can be useful to model marinas.
+
+
A variety of formats can be used for the height maps. The simplest is a greyscale png image, with black representing the deepest point, and
white representing the highest point. A standard greyscale png can represent 255 shades from black to white, so if you need finer elevation
@@ -94,6 +98,7 @@
Configuration:
light.ini: Specifies navigation lights in world (floating or land based)
tide.ini: Defines the tides
tidalstream.ini: Defines the tidal stream (optional)
+pontoon.ini: Defines floating pontoons (optional)
@@ -497,6 +502,48 @@ Example tidalstream.ini:
+pontoon.ini
+
+This is an optional file, and defines floating pontoons (like in a marina), using a series of location coordinates.
+
+
+There is one general variables, number to set the number of pontoons.
+
+For each pontoon, a series of coordinates is given, defining the end point of each straight section. The number of these points is given by the Nodes(#) parameter. For each node, the position is given in latitude and longitude.
+
+Example tidalstream.ini:
+
+
+Number=3
+
+Nodes(1)=2
+Lat(1,1)=48.3922659
+Long(1,1)=-122.4968183
+Lat(1,2)=48.3922369
+Long(1,2)=-122.4965243
+
+Nodes(2)=3
+Lat(2,1)=48.3919328
+Long(2,1)=-122.4968907
+Lat(2,2)=48.3922659
+Long(2,2)=-122.4968183
+Lat(2,3)=48.3925858
+Long(2,3)=-122.4967724
+
+Nodes(3)=5
+Lat(3,1)=48.3915730
+Long(3,1)=-122.4967124
+Lat(3,2)=48.3916300
+Long(3,2)=-122.4969726
+Lat(3,3)=48.3918882
+Long(3,3)=-122.4968375
+Lat(3,4)=48.3918302
+Long(3,4)=-122.4965865
+Lat(3,5)=48.3915730
+Long(3,5)=-122.4967124
+
+
+