From 4ff3b0291695fea9617fc4e48d9187fba9c87c43 Mon Sep 17 00:00:00 2001 From: bkuker Date: Sat, 30 Mar 2013 09:19:14 -0400 Subject: [PATCH 1/3] Do not render shoulders if zero length --- .../openrocket/gui/figure3d/geometry/ComponentRenderer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/net/sf/openrocket/gui/figure3d/geometry/ComponentRenderer.java b/core/src/net/sf/openrocket/gui/figure3d/geometry/ComponentRenderer.java index b8ef6e558..acb7d5ba1 100644 --- a/core/src/net/sf/openrocket/gui/figure3d/geometry/ComponentRenderer.java +++ b/core/src/net/sf/openrocket/gui/figure3d/geometry/ComponentRenderer.java @@ -137,7 +137,7 @@ public class ComponentRenderer { if (which == Surface.EDGES || which == Surface.INSIDE) { // Render AFT shoulder - { + if (t.getAftShoulderLength() > 0) { gl.glPushMatrix(); gl.glTranslated(t.getLength(), 0, 0); double iR = (t.isFilled() || t.isAftShoulderCapped()) ? 0 : t.getAftShoulderRadius() - t.getAftShoulderThickness(); @@ -160,7 +160,7 @@ public class ComponentRenderer { } // Render Fore shoulder - { + if (t.getForeShoulderLength() > 0) { gl.glPushMatrix(); gl.glRotated(180, 0, 1.0, 0); //gl.glTranslated(t.getLength(), 0, 0); From c9652d851cdeb43b230066980a275ef673810bd6 Mon Sep 17 00:00:00 2001 From: bkuker Date: Sat, 30 Mar 2013 09:39:51 -0400 Subject: [PATCH 2/3] Render edges of a transition with thickness --- .../figure3d/geometry/ComponentRenderer.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/core/src/net/sf/openrocket/gui/figure3d/geometry/ComponentRenderer.java b/core/src/net/sf/openrocket/gui/figure3d/geometry/ComponentRenderer.java index acb7d5ba1..8814312ad 100644 --- a/core/src/net/sf/openrocket/gui/figure3d/geometry/ComponentRenderer.java +++ b/core/src/net/sf/openrocket/gui/figure3d/geometry/ComponentRenderer.java @@ -136,6 +136,18 @@ public class ComponentRenderer { } if (which == Surface.EDGES || which == Surface.INSIDE) { + //Render aft edge + gl.glPushMatrix(); + gl.glTranslated(t.getLength(), 0, 0); + if (which == Surface.EDGES) { + gl.glRotated(90, 0, 1.0, 0); + glu.gluDisk(q, Math.max(0, t.getAftRadius() - t.getThickness()), t.getAftRadius(), LOD, 2); + } else { + gl.glRotated(270, 0, 1.0, 0); + glu.gluDisk(q, Math.max(0, t.getAftRadius() - t.getThickness()), t.getAftRadius(), LOD, 2); + } + gl.glPopMatrix(); + // Render AFT shoulder if (t.getAftShoulderLength() > 0) { gl.glPushMatrix(); @@ -159,6 +171,18 @@ public class ComponentRenderer { gl.glPopMatrix(); } + //Render Fore edge + gl.glPushMatrix(); + gl.glRotated(180, 0, 1.0, 0); + if (which == Surface.EDGES) { + gl.glRotated(90, 0, 1.0, 0); + glu.gluDisk(q, Math.max(0, t.getForeRadius() - t.getThickness()), t.getForeRadius(), LOD, 2); + } else { + gl.glRotated(270, 0, 1.0, 0); + glu.gluDisk(q, Math.max(0, t.getForeRadius() - t.getThickness()), t.getForeRadius(), LOD, 2); + } + gl.glPopMatrix(); + // Render Fore shoulder if (t.getForeShoulderLength() > 0) { gl.glPushMatrix(); From 9fd739b4a88ad6aac59df7be71b2100b59f3399f Mon Sep 17 00:00:00 2001 From: bkuker Date: Sat, 30 Mar 2013 10:37:55 -0400 Subject: [PATCH 3/3] Draw inside surface of transition offset by transition thickness. Note the offset is perpendicular to the axis of the rocket, not normal to the transition surface, so it is not a perfect render, but closer to correct than before. --- .../openrocket/gui/figure3d/geometry/ComponentRenderer.java | 2 +- .../gui/figure3d/geometry/TransitionRenderer.java | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/net/sf/openrocket/gui/figure3d/geometry/ComponentRenderer.java b/core/src/net/sf/openrocket/gui/figure3d/geometry/ComponentRenderer.java index 8814312ad..3ca25910e 100644 --- a/core/src/net/sf/openrocket/gui/figure3d/geometry/ComponentRenderer.java +++ b/core/src/net/sf/openrocket/gui/figure3d/geometry/ComponentRenderer.java @@ -128,7 +128,7 @@ public class ComponentRenderer { if (which == Surface.INSIDE) { gl.glFrontFace(GL.GL_CCW); } - TransitionRenderer.drawTransition(gl, t, LOD, t.getType() == Shape.CONICAL ? 4 : LOD / 2); + TransitionRenderer.drawTransition(gl, t, LOD, t.getType() == Shape.CONICAL ? 4 : LOD / 2, which == Surface.INSIDE ? -t.getThickness() : 0); if (which == Surface.INSIDE) { gl.glFrontFace(GL.GL_CW); } diff --git a/core/src/net/sf/openrocket/gui/figure3d/geometry/TransitionRenderer.java b/core/src/net/sf/openrocket/gui/figure3d/geometry/TransitionRenderer.java index 25879eb18..1dd093676 100644 --- a/core/src/net/sf/openrocket/gui/figure3d/geometry/TransitionRenderer.java +++ b/core/src/net/sf/openrocket/gui/figure3d/geometry/TransitionRenderer.java @@ -126,7 +126,7 @@ final class TransitionRenderer { } static final void drawTransition(final GL2 gl, final Transition tr, - final int slices, final int stacks) { + final int slices, final int stacks, final double offsetRadius) { double da, r, dzBase; double x, y, z, nz, lnz = 0; @@ -145,8 +145,8 @@ final class TransitionRenderer { double dz = t < 0.025 ? dzBase / 8.0 : dzBase; double zNext = Math.min(z + dz, tr.getLength()); - r = tr.getRadius(z); - double rNext = tr.getRadius(zNext); + r = Math.max(0, tr.getRadius(z) + offsetRadius); + double rNext = Math.max(0, tr.getRadius(zNext) + offsetRadius); // Z component of normal vectors