Skip to content

Commit d29aea1

Browse files
committed
GeoData: implement trueNorth for datasets, add separate button for ephemeral sky
1 parent c276b9c commit d29aea1

6 files changed

Lines changed: 155 additions & 109 deletions

File tree

src/OpenCOVER/geodata/GeoData.cpp

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ GeoData::GeoData()
1717
m_context = proj_context_create();
1818
#endif
1919

20-
m_offsetRoot = new osg::PositionAttitudeTransform;
21-
m_offsetRoot->setPosition(-m_projectOffset);
22-
cover->getObjectsRoot()->addChild(m_offsetRoot);
20+
m_transformRoot = new osg::MatrixTransform;
21+
m_transformRoot->setMatrix(osg::Matrix::identity());
22+
cover->getObjectsRoot()->addChild(m_transformRoot);
2323

2424
m_terrainRoot = new osg::Group;
25-
m_offsetRoot->addChild(m_terrainRoot);
25+
m_transformRoot->addChild(m_terrainRoot);
2626

2727
setProjection(GEODATA_DEFAULT_PROJECTION_PROJECT);
2828
}
@@ -83,9 +83,19 @@ void GeoData::setProjection(std::string_view projection)
8383
}
8484

8585
void GeoData::setProjectOffset(const osg::Vec3 &projectOffset)
86+
{
87+
setProjectTransform(projectOffset, m_projectTrueNorthDegree);
88+
}
89+
90+
void GeoData::setProjectTransform(const osg::Vec3 &projectOffset, const double trueNorthDeg)
8691
{
8792
m_projectOffset = projectOffset;
88-
m_offsetRoot->setPosition(-m_projectOffset);
93+
m_projectTrueNorthDegree = trueNorthDeg;
94+
osg::Matrix rot = osg::Matrix::rotate(osg::DegreesToRadians(-trueNorthDeg), osg::Vec3(0, 0, 1));
95+
osg::Matrix trans = osg::Matrix::translate(-projectOffset);
96+
m_projectTransform = trans * rot;
97+
m_inverseProjectTransform = osg::Matrix::inverse(m_projectTransform);
98+
m_transformRoot->setMatrix(m_projectTransform);
8999
}
90100

91101
const std::string &GeoData::projection() const
@@ -96,10 +106,21 @@ const osg::Vec3 &GeoData::projectOffset() const
96106
{
97107
return m_projectOffset;
98108
}
99-
100-
osg::PositionAttitudeTransform *GeoData::offsetRoot()
109+
const double GeoData::projectTrueNorthDegree() const
110+
{
111+
return m_projectTrueNorthDegree;
112+
}
113+
const osg::Matrix &GeoData::projectTransform() const
114+
{
115+
return m_projectTransform;
116+
}
117+
const osg::Matrix &GeoData::inverseProjectTransform() const
118+
{
119+
return m_inverseProjectTransform;
120+
}
121+
osg::MatrixTransform *GeoData::transformRoot()
101122
{
102-
return m_offsetRoot;
123+
return m_transformRoot;
103124
}
104125

105126
osg::Group *GeoData::terrainRoot()
@@ -120,7 +141,7 @@ osg::Vec3 GeoData::getGlobalPosition()
120141

121142
osg::Vec3 GeoData::globalToProject(const osg::Vec3 &globalPosition) const
122143
{
123-
return globalToReference(globalPosition) - m_projectOffset;
144+
return globalToReference(globalPosition) * m_projectTransform;
124145
}
125146

126147
osg::Vec3 GeoData::globalToReference(const osg::Vec3 &globalPosition) const
@@ -146,7 +167,7 @@ osg::Vec3 GeoData::projectToGlobal(const osg::Vec3 &projectPosition) const
146167
#ifndef HAVE_PROJ
147168
return projectPosition;
148169
#else
149-
auto p = projectPosition + m_projectOffset;
170+
auto p = projectPosition * m_inverseProjectTransform;
150171

151172
PJ_COORD c;
152173
c.enu.e = p.x();

src/OpenCOVER/geodata/GeoData.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,15 @@ class COVRGEODATAEXPORT GeoData
3737

3838
void setProjection(std::string_view projection);
3939
void setProjectOffset(const osg::Vec3 &projectOffset);
40+
void setProjectTransform(const osg::Vec3 &projectOffset, const double trueNorthDeg);
4041

4142
const std::string &projection() const;
4243
const osg::Vec3 &projectOffset() const;
44+
const double projectTrueNorthDegree() const;
45+
const osg::Matrix &projectTransform() const;
46+
const osg::Matrix &inverseProjectTransform() const;
4347

44-
osg::PositionAttitudeTransform *offsetRoot();
48+
osg::MatrixTransform *transformRoot();
4549
osg::Group *terrainRoot();
4650

4751
osg::Vec3 getProjectPosition();
@@ -78,8 +82,11 @@ class COVRGEODATAEXPORT GeoData
7882

7983
std::string m_projection;
8084
osg::Vec3 m_projectOffset;
85+
double m_projectTrueNorthDegree = 0.0;
86+
osg::Matrix m_projectTransform;
87+
osg::Matrix m_inverseProjectTransform;
8188

82-
osg::PositionAttitudeTransform *m_offsetRoot;
89+
osg::MatrixTransform *m_transformRoot;
8390
osg::Group *m_terrainRoot;
8491

8592
private:

src/OpenCOVER/plugins/general/GeoData/GeoDataLoader.cpp

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ bool GeoDataLoader::init()
129129
dataset.easting = entry.value<double>("", "easting")->value();
130130
dataset.northing = entry.value<double>("", "northing")->value();
131131
dataset.altitude = altitude;
132+
dataset.trueNorth = trueNorth;
132133
}
133134

134135
datasets.push_back(dataset);
@@ -175,7 +176,6 @@ bool GeoDataLoader::init()
175176
tempEastingText = std::to_string(dataset.easting);
176177
tempNorthingText = std::to_string(dataset.northing);
177178
tempAltitudeText = std::to_string(dataset.altitude);
178-
179179
tempTrueNorthText = std::to_string(dataset.trueNorth);
180180
}
181181
}
@@ -517,19 +517,6 @@ void GeoDataLoader::message(int toWhom, int type, int length, const void *data)
517517
loadTerrain(messageData + 20, osg::Vec3d(0, 0, 0)); // 20= opencover://terrain/
518518
}
519519

520-
void GeoDataLoader::setRootTransform(const osg::Vec3 &origin, float trueNorthDeg)
521-
{
522-
// rootOffset = off;
523-
// trueNorthDegree = trueNorthDeg;
524-
525-
// float trueNorthRad = osg::DegreesToRadians(trueNorthDegree);
526-
// osg::Matrix trans = osg::Matrix::translate(rootOffset);
527-
// osg::Matrix rot = osg::Matrix::rotate(-trueNorthRad, osg::Vec3(0, 0, 1));
528-
// rootNode->setMatrix(trans * rot);
529-
//
530-
GeoData::instance()->setProjectOffset(origin);
531-
}
532-
533520
bool GeoDataLoader::update()
534521
{
535522
if (editInteraction->isRunning())
@@ -746,7 +733,7 @@ void GeoDataLoader::applyOffset()
746733
}
747734

748735
osg::Vec3 origin = osg::Vec3(originEasting, originNorthing, originAltitude);
749-
setRootTransform(origin, trueNorth);
736+
GeoData::instance()->setProjectTransform(origin, trueNorth);
750737
}
751738

752739
std::optional<PlaceLabelGroup> GeoDataLoader::loadLabels(const std::string &file)

src/OpenCOVER/plugins/general/GeoData/GeoDataLoader.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,8 @@ class GeoDataLoader : public opencover::coVRPlugin,
112112
~GeoDataLoader();
113113

114114
osg::ref_ptr<osg::Node> loadTerrain(std::string filename, osg::Vec3d localOffset);
115-
void setRootTransform(const osg::Vec3 &origin, float trueNorthDeg = 0.f);
116115

117116
static GeoDataLoader *instance();
118-
osg::Vec3 rootOffset { 0.0, 0.0, 0.0 };
119-
float trueNorthDegree = 0.0f;
120117
editTerrain *editInteraction;
121118

122119
virtual void message(int toWhom, int type, int length, const void *data);

0 commit comments

Comments
 (0)