diff --git a/scwx-qt/gl/geo_texture2d.vert b/scwx-qt/gl/geo_texture2d.vert index d8bd9b09..467aa72f 100644 --- a/scwx-qt/gl/geo_texture2d.vert +++ b/scwx-qt/gl/geo_texture2d.vert @@ -5,12 +5,13 @@ #define LONGITUDE_MAX 180.0f #define PI 3.1415926535897932384626433f #define RAD2DEG 57.295779513082320876798156332941f +#define DEG2RAD 0.0174532925199432957692369055556f layout (location = 0) in vec2 aLatLong; layout (location = 1) in vec2 aXYOffset; layout (location = 2) in vec2 aTexCoord; layout (location = 3) in vec4 aModulate; -layout (location = 4) in float aAngle; +layout (location = 4) in float aAngleDeg; uniform mat4 uMVPMatrix; uniform mat4 uMapMatrix; @@ -36,7 +37,12 @@ void main() vec2 p = latLngToScreenCoordinate(aLatLong) - uMapScreenCoord; + // Rotate clockwise + float angle = aAngleDeg * DEG2RAD; + mat2 rotate = mat2(cos(angle), -sin(angle), + sin(angle), cos(angle)); + // Transform the position to screen coordinates gl_Position = uMapMatrix * vec4(p, 0.0f, 1.0f) + - uMVPMatrix * vec4(aXYOffset, 0.0f, 0.0f); + uMVPMatrix * vec4(rotate * aXYOffset, 0.0f, 0.0f); } diff --git a/scwx-qt/source/scwx/qt/gl/draw/draw_item.cpp b/scwx-qt/source/scwx/qt/gl/draw/draw_item.cpp index b2c92279..1cc558a5 100644 --- a/scwx-qt/source/scwx/qt/gl/draw/draw_item.cpp +++ b/scwx-qt/source/scwx/qt/gl/draw/draw_item.cpp @@ -54,6 +54,23 @@ void DrawItem::UseDefaultProjection( uMVPMatrixLocation, 1, GL_FALSE, glm::value_ptr(projection)); } +void DrawItem::UseRotationProjection( + const QMapLibreGL::CustomLayerRenderParameters& params, + GLint uMVPMatrixLocation) +{ + glm::mat4 projection = glm::ortho(0.0f, + static_cast(params.width), + 0.0f, + static_cast(params.height)); + + projection = glm::rotate(projection, + glm::radians(params.bearing), + glm::vec3(0.0f, 0.0f, 1.0f)); + + p->gl_.glUniformMatrix4fv( + uMVPMatrixLocation, 1, GL_FALSE, glm::value_ptr(projection)); +} + // TODO: Refactor to utility class static glm::vec2 LatLongToScreenCoordinate(const QMapLibreGL::Coordinate& coordinate) diff --git a/scwx-qt/source/scwx/qt/gl/draw/draw_item.hpp b/scwx-qt/source/scwx/qt/gl/draw/draw_item.hpp index de94ebe7..dbacb008 100644 --- a/scwx-qt/source/scwx/qt/gl/draw/draw_item.hpp +++ b/scwx-qt/source/scwx/qt/gl/draw/draw_item.hpp @@ -36,6 +36,9 @@ protected: void UseDefaultProjection(const QMapLibreGL::CustomLayerRenderParameters& params, GLint uMVPMatrixLocation); + void + UseRotationProjection(const QMapLibreGL::CustomLayerRenderParameters& params, + GLint uMVPMatrixLocation); void UseMapProjection(const QMapLibreGL::CustomLayerRenderParameters& params, GLint uMVPMatrixLocation, GLint uMapScreenCoordLocation); diff --git a/scwx-qt/source/scwx/qt/gl/draw/placefile_icons.cpp b/scwx-qt/source/scwx/qt/gl/draw/placefile_icons.cpp index 41881ebd..ff63792b 100644 --- a/scwx-qt/source/scwx/qt/gl/draw/placefile_icons.cpp +++ b/scwx-qt/source/scwx/qt/gl/draw/placefile_icons.cpp @@ -218,7 +218,7 @@ void PlacefileIcons::Render( p->Update(); p->shaderProgram_->Use(); - UseDefaultProjection(params, p->uMVPMatrixLocation_); + UseRotationProjection(params, p->uMVPMatrixLocation_); UseMapProjection( params, p->uMapMatrixLocation_, p->uMapScreenCoordLocation_);