From 3cd31bcd1ee2cfe5f6d7e9a4892ad5d0d9e1fbbb Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Mon, 19 Mar 2012 18:56:07 -0300 Subject: [PATCH] rework Color to optimize render --- src/framework/graphics/painter.cpp | 2 +- src/framework/graphics/shaderprogram.h | 4 +- src/framework/math/color.h | 67 ++++++++++++-------------- 3 files changed, 34 insertions(+), 39 deletions(-) diff --git a/src/framework/graphics/painter.cpp b/src/framework/graphics/painter.cpp index c6aac106..a0460b58 100644 --- a/src/framework/graphics/painter.cpp +++ b/src/framework/graphics/painter.cpp @@ -33,7 +33,7 @@ Painter g_painter; void Painter::init() { setColor(Fw::white); - setOpacity(255); + setOpacity(1.0f); setCompositionMode(CompositionMode_Normal); m_drawTexturedProgram = PainterShaderProgramPtr(new PainterShaderProgram); diff --git a/src/framework/graphics/shaderprogram.h b/src/framework/graphics/shaderprogram.h index e34bc504..2d3e1ed1 100644 --- a/src/framework/graphics/shaderprogram.h +++ b/src/framework/graphics/shaderprogram.h @@ -62,7 +62,7 @@ public: void setAttributeValue(const char *name, float x, float y) { glVertexAttrib2f(getAttributeLocation(name), x, y); } void setAttributeValue(const char *name, float x, float y, float z) { glVertexAttrib3f(getAttributeLocation(name), x, y, z); } - void setUniformValue(int location, const Color& color) { glUniform4f(m_uniformLocations[location], color.r() / 255.0f, color.g() / 255.0f, color.b() / 255.0f, color.a() / 255.0f); } + void setUniformValue(int location, const Color& color) { glUniform4f(m_uniformLocations[location], color.rF(), color.gF(), color.bF(), color.aF()); } void setUniformValue(int location, GLint value) { glUniform1i(m_uniformLocations[location], value); } void setUniformValue(int location, float value) { glUniform1f(m_uniformLocations[location], value); } void setUniformValue(int location, float x, float y) { glUniform2f(m_uniformLocations[location], x, y); } @@ -70,7 +70,7 @@ public: void setUniformValue(int location, float x, float y, float z, float w) { glUniform4f(m_uniformLocations[location], x, y, z, w); } void setUniformValue(int location, const Matrix2& mat) { glUniformMatrix2fv(m_uniformLocations[location], 1, GL_FALSE, mat.data()); } void setUniformValue(int location, const Matrix3& mat) { glUniformMatrix3fv(m_uniformLocations[location], 1, GL_FALSE, mat.data()); } - void setUniformValue(const char *name, const Color& color) { glUniform4f(glGetUniformLocation(m_programId, name), color.r() / 255.0f, color.g() / 255.0f, color.b() / 255.0f, color.a() / 255.0f); } + void setUniformValue(const char *name, const Color& color) { glUniform4f(glGetUniformLocation(m_programId, name), color.rF(), color.gF(), color.bF(), color.aF()); } void setUniformValue(const char *name, GLint value) { glUniform1i(glGetUniformLocation(m_programId, name), value); } void setUniformValue(const char *name, float value) { glUniform1f(glGetUniformLocation(m_programId, name), value); } void setUniformValue(const char *name, float x, float y) { glUniform2f(glGetUniformLocation(m_programId, name), x, y); } diff --git a/src/framework/math/color.h b/src/framework/math/color.h index 743a1455..346690cb 100644 --- a/src/framework/math/color.h +++ b/src/framework/math/color.h @@ -30,41 +30,41 @@ class Color { public: - Color() : m_rgba(0xFFFFFFFF) { } - Color(uint8 r, uint8 g, uint8 b, uint8 a = 0xFF) : m_r(r), m_g(g), m_b(b), m_a(a) { } - Color(const Color& other) : m_rgba(other.m_rgba) { } - Color(uint32 rgba) : m_rgba(rgba) { } + Color() : m_r(1.0f), m_g(1.0f), m_b(1.0f), m_a(1.0f) { } + Color(uint32 rgba) { setRGBA(rgba); } + Color(uint8 r, uint8 g, uint8 b, uint8 a = 0xFF) : m_r(r/255.0f), m_g(g/255.0f), m_b(b/255.0f), m_a(a/255.0f) { } - uint8 a() const { return m_a; } - uint8 b() const { return m_b; } - uint8 g() const { return m_g; } - uint8 r() const { return m_r; } + uint8 a() const { return m_a*255.0f; } + uint8 b() const { return m_b*255.0f; } + uint8 g() const { return m_g*255.0f; } + uint8 r() const { return m_r*255.0f; } - float aF() const { return m_a/255.0f; } - float bF() const { return m_b/255.0f; } - float gF() const { return m_g/255.0f; } - float rF() const { return m_r/255.0f; } + float aF() const { return m_a; } + float bF() const { return m_b; } + float gF() const { return m_g; } + float rF() const { return m_r; } - uint32 rgba() const { return m_rgba; } + uint32 rgba() const { return uint32(a() | b() << 8 | g() << 16 | r() << 24); } - const uint8* rgbaPtr() const { return (const uint8*)&m_rgba; } + void setRed(int r) { m_r = uint8(r)/255.0f; } + void setGreen(int g) { m_g = uint8(g)/255.0f; } + void setBlue(int b) { m_b = uint8(b)/255.0f; } + void setAlpha(int a) { m_a = uint8(a)/255.0f; } - void setRed(int r) { m_r = r; } - void setGreen(int g) { m_g = g; } - void setBlue(int b) { m_b = b; } - void setAlpha(int a) { m_a = a; } + void setRed(float r) { m_r = r; } + void setGreen(float g) { m_g = g; } + void setBlue(float b) { m_b = b; } + void setAlpha(float a) { m_a = a; } - void setRed(float r) { setRed(int(r*255.0f)); } - void setGreen(float g) { setGreen(int(g*255.0f)); } - void setBlue(float b) { setBlue(int(b*255.0f)); } - void setAlpha(float a) { setAlpha(int(a*255.0f)); } + void setRGBA(uint8 r, uint8 g, uint8 b, uint8 a = 0xFF) { m_r = r/255.0f; m_g = g/255.0f; m_b = b/255.0f; m_a = a/255.0f; } + void setRGBA(uint32 rgba) { setRGBA((rgba >> 0) & 0xff, (rgba >> 8) & 0xff, (rgba >> 16) & 0xff, (rgba >> 24) & 0xff); } - void setRGBA(int r, int g, int b, int a = 0xFF) { m_r = r; m_g = g; m_b = b; m_a = a; } - void setRGBA(uint32 rgba) { rgba = rgba; } + Color& operator=(uint32_t rgba) { setRGBA(rgba); return *this; } + bool operator==(uint32_t rgba) const { return this->rgba() == rgba; } - Color& operator=(const Color& other) { m_rgba = other.m_rgba; return *this; } - bool operator==(const Color& other) const { return other.m_rgba == m_rgba; } - bool operator!=(const Color& other) const { return other.m_rgba != m_rgba; } + Color& operator=(const Color& other) { m_r = other.m_r; m_g = other.m_g; m_b = other.m_b; m_a = other.m_a; return *this; } + bool operator==(const Color& other) const { return other.m_r == m_r && other.m_g == m_g && other.m_b == m_b && other.m_a == m_a; } + bool operator!=(const Color& other) const { return other.m_r != m_r || other.m_g != m_g || other.m_b != m_b || other.m_a != m_a; } static Color from8bit(int color) { if(color >= 216 || color <= 0) @@ -77,15 +77,10 @@ public: } private: - union { - uint32 m_rgba; - struct { - uint8 m_r; - uint8 m_g; - uint8 m_b; - uint8 m_a; - }; - }; + float m_r; + float m_g; + float m_b; + float m_a; }; inline std::ostream& operator<<(std::ostream& out, const Color& color)