From ab86cb7f4e13577d24f83ec04418de1ee2100948 Mon Sep 17 00:00:00 2001 From: Billy Olsen Date: Sat, 20 Feb 2021 20:40:40 -0700 Subject: [PATCH] Fix transparency display issue Use the provided alpha from the color when it is available when rendering the model in the 3d finished view. The 3d unfinished view will continue to override the alpha to show interior components. Additionally, enable the GL2.GL_COLOR_MATERIAL for the rendering of the component to display the right alpha settings. Fixes #878 Signed-off-by: Billy Olsen --- .../openrocket/gui/figure3d/RealisticRenderer.java | 14 ++++++++++++-- .../gui/figure3d/UnfinishedRenderer.java | 8 ++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/figure3d/RealisticRenderer.java b/swing/src/net/sf/openrocket/gui/figure3d/RealisticRenderer.java index 9f2ba1543..d3c94b006 100644 --- a/swing/src/net/sf/openrocket/gui/figure3d/RealisticRenderer.java +++ b/swing/src/net/sf/openrocket/gui/figure3d/RealisticRenderer.java @@ -101,15 +101,23 @@ public class RealisticRenderer extends RocketRenderer { render(gl, geom, Surface.EDGES, app, false, alpha); } + protected float[] convertColor(Appearance a, float alpha) { + float[] color = new float[4]; + convertColor(a.getPaint(), color); + return color; + } + private void render(GL2 gl, Geometry g, Surface which, Appearance a, boolean decals, float alpha) { final Decal t = a.getTexture(); final Texture tex = textures.getTexture(t); gl.glLightModeli(GL2.GL_LIGHT_MODEL_COLOR_CONTROL, GL2.GL_SEPARATE_SPECULAR_COLOR); + float[] convertedColor = this.convertColor(a, alpha); + for (int i=0; i < convertedColor.length; i++) { + color[i] = convertedColor[i]; + } - convertColor(a.getPaint(), color); - color[3] = alpha;//re-set to "alpha" so that Unfinished renderer will show interior parts. gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_DIFFUSE, color, 0); gl.glMaterialfv(GL.GL_FRONT, GLLightingFunc.GL_AMBIENT, color, 0); @@ -149,6 +157,7 @@ public class RealisticRenderer extends RocketRenderer { gl.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); gl.glEnable(GL.GL_BLEND); + gl.glEnable(GL2.GL_COLOR_MATERIAL); gl.glDepthFunc(GL.GL_LEQUAL); gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); @@ -167,6 +176,7 @@ public class RealisticRenderer extends RocketRenderer { gl.glPopMatrix(); gl.glMatrixMode(GLMatrixFunc.GL_MODELVIEW); + gl.glDisable(GL2.GL_COLOR_MATERIAL); tex.disable(gl); } diff --git a/swing/src/net/sf/openrocket/gui/figure3d/UnfinishedRenderer.java b/swing/src/net/sf/openrocket/gui/figure3d/UnfinishedRenderer.java index 5788380f8..875bd8e3d 100644 --- a/swing/src/net/sf/openrocket/gui/figure3d/UnfinishedRenderer.java +++ b/swing/src/net/sf/openrocket/gui/figure3d/UnfinishedRenderer.java @@ -21,4 +21,12 @@ public class UnfinishedRenderer extends RealisticRenderer { protected Appearance getAppearance(RocketComponent c) { return DefaultAppearance.getDefaultAppearance(c); } + + @Override + protected float[] convertColor(final Appearance a, float alpha) { + float[] color = new float[4]; + convertColor(a.getPaint(), color); + color[3] = alpha;//re-set to "alpha" so that Unfinished renderer will show interior parts. + return color; + } }