Rotate placefile icons

This commit is contained in:
Dan Paulat 2023-08-05 01:28:34 -05:00
parent e66c202edf
commit 6c0b62709f
4 changed files with 29 additions and 3 deletions

View file

@ -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);
}

View file

@ -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<float>(params.width),
0.0f,
static_cast<float>(params.height));
projection = glm::rotate(projection,
glm::radians<float>(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)

View file

@ -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);

View file

@ -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_);