Add rotation uniform to 2d drawing shader
This commit is contained in:
parent
e20f6e3209
commit
ce1c188b1a
@ -2,7 +2,7 @@ uniform vec2 center;
|
||||
uniform vec2 size;
|
||||
uniform vec2 texcenter;
|
||||
uniform vec2 texsize;
|
||||
|
||||
uniform float rotation;
|
||||
#ifdef Explicit_Attrib_Location_Usable
|
||||
layout(location=0) in vec2 Position;
|
||||
layout(location=3) in vec2 Texcoord;
|
||||
@ -15,6 +15,9 @@ out vec2 uv;
|
||||
|
||||
void main()
|
||||
{
|
||||
float s = sin(rotation);
|
||||
float c = cos(rotation);
|
||||
mat2 m = mat2(c, -s, s, c);
|
||||
uv = Texcoord * texsize + texcenter;
|
||||
gl_Position = vec4(Position * size + center, 0., 1.);
|
||||
gl_Position = vec4(m * Position * size + center, 0., 1.) ;
|
||||
}
|
||||
|
@ -60,14 +60,15 @@ public:
|
||||
// ============================================================================
|
||||
class TextureRectShader : public TextureShader<TextureRectShader, 1,
|
||||
core::vector2df, core::vector2df,
|
||||
core::vector2df, core::vector2df>
|
||||
core::vector2df, core::vector2df,
|
||||
float>
|
||||
{
|
||||
public:
|
||||
TextureRectShader()
|
||||
{
|
||||
loadProgram(OBJECT, GL_VERTEX_SHADER, "texturedquad.vert",
|
||||
GL_FRAGMENT_SHADER, "texturedquad.frag");
|
||||
assignUniforms("center", "size", "texcenter", "texsize");
|
||||
assignUniforms("center", "size", "texcenter", "texsize", "rotation");
|
||||
|
||||
assignSamplerNames(0, "tex", ST_BILINEAR_CLAMPED_FILTERED);
|
||||
} // TextureRectShader
|
||||
@ -161,7 +162,7 @@ static void drawTexColoredQuad(const video::ITexture *texture,
|
||||
static void drawTexQuad(GLuint texture, float width, float height,
|
||||
float center_pos_x, float center_pos_y,
|
||||
float tex_center_pos_x, float tex_center_pos_y,
|
||||
float tex_width, float tex_height)
|
||||
float tex_width, float tex_height, float rotation)
|
||||
{
|
||||
TextureRectShader::getInstance()->use();
|
||||
glBindVertexArray(SharedGPUObjects::getUI_VAO());
|
||||
@ -171,7 +172,7 @@ static void drawTexQuad(GLuint texture, float width, float height,
|
||||
core::vector2df(center_pos_x, center_pos_y),
|
||||
core::vector2df(width, height),
|
||||
core::vector2df(tex_center_pos_x, tex_center_pos_y),
|
||||
core::vector2df(tex_width, tex_height) );
|
||||
core::vector2df(tex_width, tex_height), rotation);
|
||||
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||
glBindVertexArray(0);
|
||||
@ -456,7 +457,7 @@ void draw2DImage(const video::ITexture* texture,
|
||||
const core::rect<s32>* clip_rect,
|
||||
const video::SColor* const colors,
|
||||
bool use_alpha_channel_of_texture,
|
||||
bool draw_translucently)
|
||||
bool draw_translucently, float rotation)
|
||||
{
|
||||
if (!CVS->isGLSL())
|
||||
{
|
||||
@ -511,7 +512,7 @@ void draw2DImage(const video::ITexture* texture,
|
||||
{
|
||||
drawTexQuad(texture->getOpenGLTextureName(), width, height,
|
||||
center_pos_x, center_pos_y, tex_center_pos_x,
|
||||
tex_center_pos_y, tex_width, tex_height);
|
||||
tex_center_pos_y, tex_width, tex_height, rotation);
|
||||
}
|
||||
if (clip_rect)
|
||||
glDisable(GL_SCISSOR_TEST);
|
||||
@ -588,7 +589,7 @@ void draw2DImage(const video::ITexture* texture,
|
||||
{
|
||||
drawTexQuad(texture->getOpenGLTextureName(), width, height,
|
||||
center_pos_x, center_pos_y, tex_center_pos_x,
|
||||
tex_center_pos_y, tex_width, tex_height);
|
||||
tex_center_pos_y, tex_width, tex_height, 0.0f/*rotation*/);
|
||||
}
|
||||
if (clip_rect)
|
||||
glDisable(GL_SCISSOR_TEST);
|
||||
|
@ -56,7 +56,8 @@ void draw2DImage(const irr::video::ITexture* texture,
|
||||
const irr::core::rect<irr::s32>& sourceRect,
|
||||
const irr::core::rect<irr::s32>* clipRect,
|
||||
const irr::video::SColor* const colors,
|
||||
bool useAlphaChannelOfTexture, bool draw_translucently = false);
|
||||
bool useAlphaChannelOfTexture, bool draw_translucently = false,
|
||||
float rotation = 0.0f);
|
||||
|
||||
void draw2DImage(const irr::video::ITexture* texture,
|
||||
const irr::core::rect<float>& destRect,
|
||||
|
Loading…
Reference in New Issue
Block a user