diff --git a/Hazel/src/Hazel/Renderer/Renderer2D.cpp b/Hazel/src/Hazel/Renderer/Renderer2D.cpp index 61d5b29ed..ba100b0c7 100644 --- a/Hazel/src/Hazel/Renderer/Renderer2D.cpp +++ b/Hazel/src/Hazel/Renderer/Renderer2D.cpp @@ -83,27 +83,74 @@ namespace Hazel { HZ_PROFILE_FUNCTION(); s_Data->TextureShader->SetFloat4("u_Color", color); + s_Data->TextureShader->SetFloat("u_TilingFactor", 1.0f); s_Data->WhiteTexture->Bind(); - glm::mat4 transform = glm::translate(glm::mat4(1.0f), position) * glm::scale(glm::mat4(1.0f), { size.x, size.y, 1.0f }); + glm::mat4 transform = glm::translate(glm::mat4(1.0f), position) + * glm::scale(glm::mat4(1.0f), { size.x, size.y, 1.0f }); s_Data->TextureShader->SetMat4("u_Transform", transform); s_Data->QuadVertexArray->Bind(); RenderCommand::DrawIndexed(s_Data->QuadVertexArray); } - void Renderer2D::DrawQuad(const glm::vec2& position, const glm::vec2& size, const Ref& texture) + void Renderer2D::DrawQuad(const glm::vec2& position, const glm::vec2& size, const Ref& texture, float tilingFactor, const glm::vec4& tintColor) { - DrawQuad({ position.x, position.y, 0.0f }, size, texture); + DrawQuad({ position.x, position.y, 0.0f }, size, texture, tilingFactor, tintColor); } - void Renderer2D::DrawQuad(const glm::vec3& position, const glm::vec2& size, const Ref& texture) + void Renderer2D::DrawQuad(const glm::vec3& position, const glm::vec2& size, const Ref& texture, float tilingFactor, const glm::vec4& tintColor) { HZ_PROFILE_FUNCTION(); - s_Data->TextureShader->SetFloat4("u_Color", glm::vec4(1.0f)); + s_Data->TextureShader->SetFloat4("u_Color", tintColor); + s_Data->TextureShader->SetFloat("u_TilingFactor", tilingFactor); texture->Bind(); - glm::mat4 transform = glm::translate(glm::mat4(1.0f), position) * glm::scale(glm::mat4(1.0f), { size.x, size.y, 1.0f }); + glm::mat4 transform = glm::translate(glm::mat4(1.0f), position) + * glm::scale(glm::mat4(1.0f), { size.x, size.y, 1.0f }); + s_Data->TextureShader->SetMat4("u_Transform", transform); + + s_Data->QuadVertexArray->Bind(); + RenderCommand::DrawIndexed(s_Data->QuadVertexArray); + } + + void Renderer2D::DrawRotatedQuad(const glm::vec2& position, const glm::vec2& size, float rotation, const glm::vec4& color) + { + DrawRotatedQuad({ position.x, position.y, 0.0f }, size, rotation, color); + } + + void Renderer2D::DrawRotatedQuad(const glm::vec3& position, const glm::vec2& size, float rotation, const glm::vec4& color) + { + HZ_PROFILE_FUNCTION(); + + s_Data->TextureShader->SetFloat4("u_Color", color); + s_Data->TextureShader->SetFloat("u_TilingFactor", 1.0f); + s_Data->WhiteTexture->Bind(); + + glm::mat4 transform = glm::translate(glm::mat4(1.0f), position) + * glm::rotate(glm::mat4(1.0f), rotation, { 0.0f, 0.0f, 1.0f }) + * glm::scale(glm::mat4(1.0f), { size.x, size.y, 1.0f }); + s_Data->TextureShader->SetMat4("u_Transform", transform); + s_Data->QuadVertexArray->Bind(); + RenderCommand::DrawIndexed(s_Data->QuadVertexArray); + } + + void Renderer2D::DrawRotatedQuad(const glm::vec2& position, const glm::vec2& size, float rotation, const Ref& texture, float tilingFactor, const glm::vec4& tintColor) + { + DrawRotatedQuad({ position.x, position.y, 0.0f }, size, rotation, texture, tilingFactor, tintColor); + } + + void Renderer2D::DrawRotatedQuad(const glm::vec3& position, const glm::vec2& size, float rotation, const Ref& texture, float tilingFactor, const glm::vec4& tintColor) + { + HZ_PROFILE_FUNCTION(); + + s_Data->TextureShader->SetFloat4("u_Color", tintColor); + s_Data->TextureShader->SetFloat("u_TilingFactor", tilingFactor); + texture->Bind(); + + glm::mat4 transform = glm::translate(glm::mat4(1.0f), position) + * glm::rotate(glm::mat4(1.0f), rotation, { 0.0f, 0.0f, 1.0f }) + * glm::scale(glm::mat4(1.0f), { size.x, size.y, 1.0f }); s_Data->TextureShader->SetMat4("u_Transform", transform); s_Data->QuadVertexArray->Bind(); diff --git a/Hazel/src/Hazel/Renderer/Renderer2D.h b/Hazel/src/Hazel/Renderer/Renderer2D.h index b37a7294c..888bf439c 100644 --- a/Hazel/src/Hazel/Renderer/Renderer2D.h +++ b/Hazel/src/Hazel/Renderer/Renderer2D.h @@ -18,8 +18,14 @@ namespace Hazel { // Primitives static void DrawQuad(const glm::vec2& position, const glm::vec2& size, const glm::vec4& color); static void DrawQuad(const glm::vec3& position, const glm::vec2& size, const glm::vec4& color); - static void DrawQuad(const glm::vec2& position, const glm::vec2& size, const Ref& texture); - static void DrawQuad(const glm::vec3& position, const glm::vec2& size, const Ref& texture); + static void DrawQuad(const glm::vec2& position, const glm::vec2& size, const Ref& texture, float tilingFactor = 1.0f, const glm::vec4& tintColor = glm::vec4(1.0f)); + static void DrawQuad(const glm::vec3& position, const glm::vec2& size, const Ref& texture, float tilingFactor = 1.0f, const glm::vec4& tintColor = glm::vec4(1.0f)); + + static void DrawRotatedQuad(const glm::vec2& position, const glm::vec2& size, float rotation, const glm::vec4& color); + static void DrawRotatedQuad(const glm::vec3& position, const glm::vec2& size, float rotation, const glm::vec4& color); + static void DrawRotatedQuad(const glm::vec2& position, const glm::vec2& size, float rotation, const Ref& texture, float tilingFactor = 1.0f, const glm::vec4& tintColor = glm::vec4(1.0f)); + static void DrawRotatedQuad(const glm::vec3& position, const glm::vec2& size, float rotation, const Ref& texture, float tilingFactor = 1.0f, const glm::vec4& tintColor = glm::vec4(1.0f)); + }; } \ No newline at end of file diff --git a/Hazel/src/Hazel/Renderer/Shader.h b/Hazel/src/Hazel/Renderer/Shader.h index 751ee1667..494fc5ce1 100644 --- a/Hazel/src/Hazel/Renderer/Shader.h +++ b/Hazel/src/Hazel/Renderer/Shader.h @@ -16,6 +16,7 @@ namespace Hazel { virtual void Unbind() const = 0; virtual void SetInt(const std::string& name, int value) = 0; + virtual void SetFloat(const std::string& name, float value) = 0; virtual void SetFloat3(const std::string& name, const glm::vec3& value) = 0; virtual void SetFloat4(const std::string& name, const glm::vec4& value) = 0; virtual void SetMat4(const std::string& name, const glm::mat4& value) = 0; diff --git a/Hazel/src/Platform/OpenGL/OpenGLShader.cpp b/Hazel/src/Platform/OpenGL/OpenGLShader.cpp index a8e466784..984910e40 100644 --- a/Hazel/src/Platform/OpenGL/OpenGLShader.cpp +++ b/Hazel/src/Platform/OpenGL/OpenGLShader.cpp @@ -207,6 +207,13 @@ namespace Hazel { UploadUniformInt(name, value); } + void OpenGLShader::SetFloat(const std::string& name, float value) + { + HZ_PROFILE_FUNCTION(); + + UploadUniformFloat(name, value); + } + void OpenGLShader::SetFloat3(const std::string& name, const glm::vec3& value) { HZ_PROFILE_FUNCTION(); diff --git a/Hazel/src/Platform/OpenGL/OpenGLShader.h b/Hazel/src/Platform/OpenGL/OpenGLShader.h index b5744fe96..cb894cf19 100644 --- a/Hazel/src/Platform/OpenGL/OpenGLShader.h +++ b/Hazel/src/Platform/OpenGL/OpenGLShader.h @@ -19,6 +19,7 @@ namespace Hazel { virtual void Unbind() const override; virtual void SetInt(const std::string& name, int value) override; + virtual void SetFloat(const std::string& name, float value) override; virtual void SetFloat3(const std::string& name, const glm::vec3& value) override; virtual void SetFloat4(const std::string& name, const glm::vec4& value) override; virtual void SetMat4(const std::string& name, const glm::mat4& value) override; diff --git a/Sandbox/assets/shaders/Texture.glsl b/Sandbox/assets/shaders/Texture.glsl index 922ef125f..674ec135c 100644 --- a/Sandbox/assets/shaders/Texture.glsl +++ b/Sandbox/assets/shaders/Texture.glsl @@ -25,9 +25,10 @@ layout(location = 0) out vec4 color; in vec2 v_TexCoord; uniform vec4 u_Color; +uniform float u_TilingFactor; uniform sampler2D u_Texture; void main() { - color = texture(u_Texture, v_TexCoord * 10.0) * u_Color; + color = texture(u_Texture, v_TexCoord * u_TilingFactor) * u_Color; } \ No newline at end of file