Mercurial > octave
diff libinterp/corefcn/gl-render.cc @ 24154:78ff6ba5cbb1
Add basic support of "facealpha" for surfaces and patches in OpenGL (bug #39535)
* gl-render.cc (draw_surface, draw_patch): Pass alpha value of faces to OpenGL.
* doc/interpreter/genpropdoc.m: Add documentation for surface and patch facealpha.
* scripts/plot/draw/surface.m: Add cross-reference to Surface Properties.
* scripts/plot/draw/patch.m: Add cross-reference to Patch Properties.
author | Markus Mützel <markus.muetzel@gmx.de> |
---|---|
date | Tue, 10 Oct 2017 18:21:24 +0200 |
parents | 56b7352fa456 |
children | 730227072acb |
line wrap: on
line diff
--- a/libinterp/corefcn/gl-render.cc Tue Oct 17 19:47:55 2017 +0200 +++ b/libinterp/corefcn/gl-render.cc Tue Oct 10 18:21:24 2017 +0200 @@ -488,7 +488,7 @@ if (col.numel () == 3) { - glColor3dv (col.data ()); + glColor4d (col(0), col(1), col(2), v->alpha); if (light_mode > 0) { float buf[4] = { 0, 0, 0, 1 }; @@ -2323,6 +2323,7 @@ Matrix fcolor = (fc_mode == TEXTURE ? Matrix (1, 3, 1.0) : props.get_facecolor_rgb ()); Matrix ecolor = props.get_edgecolor_rgb (); + double fa = 1.0; float as = props.get_ambientstrength (); float ds = props.get_diffusestrength (); @@ -2374,11 +2375,12 @@ if (! props.facecolor_is ("none")) { - if (props.get_facealpha_double () == 1) + if (fa_mode == 0) { + fa = props.get_facealpha_double (); if (fc_mode == UNIFORM || fc_mode == TEXTURE) { - glColor3dv (fcolor.data ()); + glColor4d (fcolor(1), fcolor(2), fcolor(3), fa); if (fl_mode > 0) { for (int i = 0; i < 3; i++) @@ -2449,7 +2451,8 @@ // FIXME: is there a smarter way to do this? for (int k = 0; k < 3; k++) cb[k] = c(j-1, i-1, k); - glColor3fv (cb); + cb[3] = fa; + glColor4fv (cb); if (fl_mode > 0) { @@ -2478,7 +2481,8 @@ { for (int k = 0; k < 3; k++) cb[k] = c(j-1, i, k); - glColor3fv (cb); + cb[3] = fa; + glColor4fv (cb); if (fl_mode > 0) { @@ -2508,7 +2512,8 @@ { for (int k = 0; k < 3; k++) cb[k] = c(j, i, k); - glColor3fv (cb); + cb[3] = fa; + glColor4fv (cb); if (fl_mode > 0) { @@ -2537,7 +2542,8 @@ { for (int k = 0; k < 3; k++) cb[k] = c(j, i-1, k); - glColor3fv (cb); + cb[3] = fa; + glColor4fv (cb); if (fl_mode > 0) { @@ -2572,7 +2578,7 @@ } else { - // FIXME: implement transparency + // FIXME: implement flat, interp and texturemap transparency } } @@ -2916,6 +2922,7 @@ Matrix c; const Matrix n = props.get_vertexnormals ().matrix_value (); Matrix a; + double fa = 1.0; int nv = v.rows (); int nf = f.rows (); @@ -3010,6 +3017,9 @@ has_facealpha = ((a.numel () > 0) && (a.rows () == f.rows ())); } + if (fa_mode == 0) + fa = props.get_facealpha_double (); + octave_idx_type fr = f.rows (); std::vector<vertex_data> vdata (f.numel ()); @@ -3046,7 +3056,9 @@ else cc(0) = c(idx,0), cc(1) = c(idx,1), cc(2) = c(idx,2); } - if (a.numel () > 0) + if (fa_mode == 0) + aa = fa; + else if (a.numel () > 0) { if (has_facealpha) aa = a(i); @@ -3063,11 +3075,11 @@ if (! props.facecolor_is ("none")) { // FIXME: adapt to double-radio property - if (props.get_facealpha_double () == 1) + if (fa_mode == 0) { if (fc_mode == UNIFORM) { - glColor3dv (fcolor.data ()); + glColor4d (fcolor(0), fcolor(1), fcolor(2), fa); if (fl_mode > 0) { float cb[4] = { 0, 0, 0, 1 }; @@ -3122,7 +3134,7 @@ if (col.numel () == 3) { - glColor3dv (col.data ()); + glColor4d (col(0), col(1), col(2), fa); if (fl_mode > 0) { float cb[4] = { 0, 0, 0, 1 }; @@ -3155,7 +3167,7 @@ } else { - // FIXME: implement transparency + // FIXME: implement flat and interp transparency } }