|
From: rainbyte <rai...@us...> - 2012-07-17 10:51:10
|
Author: Lasse Karkkainen <tro...@tr...>
Date: Fri Jul 6 12:41:39 2012 +0300
Use premultiplied alpha
- OpenGL blending mode changed
- PNG loading with Cairo (internally converts from non-premultiplied)
- Color setting now needs to multiply R/G/B components by alpha (fixed a few cases, others remain broken)
---
game/guitargraph.cc | 4 +---
game/image.hh | 18 +++++++++++++++++-
game/notegraph.cc | 2 --
game/screen_songs.cc | 12 ++++++------
game/video_driver.cc | 4 ++--
5 files changed, 26 insertions(+), 14 deletions(-)
diff --git a/game/guitargraph.cc b/game/guitargraph.cc
index 4339b4a..5279fbd 100644
--- a/game/guitargraph.cc
+++ b/game/guitargraph.cc
@@ -1015,9 +1015,7 @@ void GuitarGraph::draw(double time) {
if (m_neckglowColor.w > 0.0) {
// Neck glow drawing
using namespace glmath;
- double a = m_neckglowColor.w;
- vec4 color((1.0 / a) * vec3(m_neckglowColor), a); // Convert into non-premultiplied
- ColorTrans c(glmath::mat4::diagonal(color));
+ ColorTrans c(glmath::mat4::diagonal(m_neckglowColor));
m_neckglow.dimensions.screenBottom(0.0).middle().fixedWidth(neckWidth());
m_neckglow.draw();
}
diff --git a/game/image.hh b/game/image.hh
index 61dbb14..ed3ff8c 100644
--- a/game/image.hh
+++ b/game/image.hh
@@ -125,6 +125,22 @@ static inline void loadSVG(Bitmap& bitmap, std::string const& filename) {
}
static inline void loadPNG(Bitmap& bitmap, std::string const& filename) {
+ // Raster with Cairo
+ boost::shared_ptr<cairo_surface_t> surface(
+ cairo_image_surface_create_from_png(filename.c_str()),
+ cairo_surface_destroy);
+ cairo_surface_flush(surface.get());
+ unsigned char* buf = cairo_image_surface_get_data(surface.get());
+ // Prepare the pixel buffer
+ bitmap.resize(
+ cairo_image_surface_get_width(surface.get()),
+ cairo_image_surface_get_height(surface.get()));
+ bitmap.fmt = pix::INT_ARGB;
+ std::copy(buf, buf + bitmap.buf.size(), bitmap.buf.begin());
+}
+
+/*
+static inline void loadPNG(Bitmap& bitmap, std::string const& filename) {
std::ifstream file(filename.c_str(), std::ios::binary);
png_structp pngPtr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (!pngPtr) throw std::runtime_error("png_create_read_struct failed");
@@ -140,7 +156,7 @@ static inline void loadPNG(Bitmap& bitmap, std::string const& filename) {
std::vector<png_bytep> rows;
loadPNG_internal(pngPtr, infoPtr, file, bitmap, rows);
}
-
+*/
struct my_jpeg_error_mgr {
struct jpeg_error_mgr pub; /* "public" fields */
jmp_buf setjmp_buffer; /* for return to caller */
diff --git a/game/notegraph.cc b/game/notegraph.cc
index 6340d6c..ec9deb3 100644
--- a/game/notegraph.cc
+++ b/game/notegraph.cc
@@ -196,7 +196,6 @@ namespace {
void NoteGraph::drawWaves(Database const& database) {
if (m_vocal.notes.empty()) return; // Cannot draw without notes
UseTexture tblock(m_wave);
- //glBlendFunc(GL_SRC_ALPHA, GL_ONE);
for (std::list<Player>::const_iterator p = database.cur.begin(); p != database.cur.end(); ++p) {
if (p->m_vocal.name != m_vocal.name)
continue;
@@ -250,6 +249,5 @@ void NoteGraph::drawWaves(Database const& database) {
}
strip(va);
}
- //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
diff --git a/game/screen_songs.cc b/game/screen_songs.cc
index 9dacfcf..afe23a1 100644
--- a/game/screen_songs.cc
+++ b/game/screen_songs.cc
@@ -280,7 +280,7 @@ void ScreenSongs::drawCovers() {
s.draw();
// Draw the reflection
Transform transMirror(scale(vec3(1.0f, -1.0f, 1.0f)));
- ColorTrans c2(Color(1.0f, 1.0f, 1.0f, 0.4f));
+ ColorTrans c2(Color(0.4f, 0.4f, 0.4f, 0.4f));
s.draw();
}
}
@@ -336,7 +336,7 @@ void ScreenSongs::drawInstruments(Dimensions const& dim, float alpha) const {
float a = alpha * (have_vocals ? 1.00 : 0.25);
float m = !(typeFilter & 8);
glutil::VertexArray va;
- glmath::vec4 c(m * 1.0f, 1.0f, m * (is_karaoke ? 0.25f : 1.0f), a);
+ glmath::vec4 c(m * a, a, m * (is_karaoke ? 0.25f : 1.0f) * a, a);
x = dim.x1()+0.00*(dim.x2()-dim.x1());
va.Color(c).TexCoord(getIconTex(1), 0.0f).Vertex(x, dim.y1());
va.Color(c).TexCoord(getIconTex(1), 1.0f).Vertex(x, dim.y2());
@@ -352,7 +352,7 @@ void ScreenSongs::drawInstruments(Dimensions const& dim, float alpha) const {
if (guitarCount == 0) { guitarCount = 1; a *= 0.25f; }
for (int i = guitarCount-1; i >= 0; i--) {
glutil::VertexArray va;
- glmath::vec4 c(m * 1.0f, 1.0f, m * 1.0f, a);
+ glmath::vec4 c(m * a, a, m * a, a);
x = dim.x1()+(xincr+i*0.04)*(dim.x2()-dim.x1());
va.Color(c).TexCoord(getIconTex(2), 0.0f).Vertex(x, dim.y1());
va.Color(c).TexCoord(getIconTex(2), 1.0f).Vertex(x, dim.y2());
@@ -367,7 +367,7 @@ void ScreenSongs::drawInstruments(Dimensions const& dim, float alpha) const {
float a = alpha * (have_bass ? 1.00f : 0.25f);
float m = !(typeFilter & 4);
glutil::VertexArray va;
- glmath::vec4 c(m * 1.0f, 1.0f, m * 1.0f, a);
+ glmath::vec4 c(m * a, a, m * a, a);
x = dim.x1()+2*xincr*(dim.x2()-dim.x1());
va.Color(c).TexCoord(getIconTex(3), 0.0f).Vertex(x, dim.y1());
va.Color(c).TexCoord(getIconTex(3), 1.0f).Vertex(x, dim.y2());
@@ -381,7 +381,7 @@ void ScreenSongs::drawInstruments(Dimensions const& dim, float alpha) const {
float a = alpha * (have_drums ? 1.00f : 0.25f);
float m = !(typeFilter & 2);
glutil::VertexArray va;
- glmath::vec4 c(m * 1.0f, 1.0f, m * 1.0f, a);
+ glmath::vec4 c(m * a, a, m * a, a);
x = dim.x1()+3*xincr*(dim.x2()-dim.x1());
va.Color(c).TexCoord(getIconTex(4), 0.0f).Vertex(x, dim.y1());
va.Color(c).TexCoord(getIconTex(4), 1.0f).Vertex(x, dim.y2());
@@ -409,7 +409,7 @@ void ScreenSongs::drawInstruments(Dimensions const& dim, float alpha) const {
float a = alpha * (have_dance ? 1.00f : 0.25f);
float m = !(typeFilter & 1);
glutil::VertexArray va;
- glmath::vec4 c(m * 1.0f, 1.0f, m * 1.0f, a);
+ glmath::vec4 c(m * a, a, m * a, a);
x = dim.x1()+4*xincr*(dim.x2()-dim.x1());
va.Color(c).TexCoord(getIconTex(6), 0.0f).Vertex(x, dim.y1());
va.Color(c).TexCoord(getIconTex(6), 1.0f).Vertex(x, dim.y2());
diff --git a/game/video_driver.cc b/game/video_driver.cc
index c1ed465..51f02b6 100644
--- a/game/video_driver.cc
+++ b/game/video_driver.cc
@@ -196,7 +196,7 @@ void Window::render(boost::function<void (void)> drawFunc) {
// Over/under only available in fullscreen
if (stereo && type == 2 && !m_fullscreen) stereo = false;
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
updateStereo(stereo ? getSeparation() : 0.0);
glerror.check("setup");
// Can we do direct to framebuffer rendering (no FBO)?
@@ -259,7 +259,7 @@ void Window::view(unsigned num) {
glClearColor (0.0f, 0.0f, 0.0f, 1.0f);
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glShadeModel(GL_SMOOTH);
glEnable(GL_BLEND);
|