From befd3bfb9651197a3dc21a6d6494472ad83275b2 Mon Sep 17 00:00:00 2001 From: bkuker Date: Sun, 10 Mar 2013 12:40:30 -0400 Subject: [PATCH] Re-introduce display lists. I should really just push everything into a single one, but I would have to re-factor to pre-load all the textures, not load them while rendering. This isn't Doom III :) --- .../gui/figure3d/RocketRenderer.java | 3 +- .../figure3d/geometry/ComponentRenderer.java | 2 +- .../DisplayListComponentRenderer.java | 78 +++++++++++++++++++ 3 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 core/src/net/sf/openrocket/gui/figure3d/geometry/DisplayListComponentRenderer.java diff --git a/core/src/net/sf/openrocket/gui/figure3d/RocketRenderer.java b/core/src/net/sf/openrocket/gui/figure3d/RocketRenderer.java index 079bfc932..16c5fba89 100644 --- a/core/src/net/sf/openrocket/gui/figure3d/RocketRenderer.java +++ b/core/src/net/sf/openrocket/gui/figure3d/RocketRenderer.java @@ -13,6 +13,7 @@ import javax.media.opengl.GLAutoDrawable; import javax.media.opengl.fixedfunc.GLLightingFunc; import net.sf.openrocket.gui.figure3d.geometry.ComponentRenderer; +import net.sf.openrocket.gui.figure3d.geometry.DisplayListComponentRenderer; import net.sf.openrocket.gui.figure3d.geometry.Geometry.Surface; import net.sf.openrocket.logging.LogHelper; import net.sf.openrocket.motor.Motor; @@ -28,7 +29,7 @@ import net.sf.openrocket.util.Coordinate; public abstract class RocketRenderer { protected static final LogHelper log = Application.getLogger(); - final ComponentRenderer cr = new ComponentRenderer(); + final ComponentRenderer cr = new DisplayListComponentRenderer(); private final float[] selectedEmissive = { 1, 0, 0, 1 }; private final float[] colorBlack = { 0, 0, 0, 1 }; 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 9013708ab..2fd69fa33 100644 --- a/core/src/net/sf/openrocket/gui/figure3d/geometry/ComponentRenderer.java +++ b/core/src/net/sf/openrocket/gui/figure3d/geometry/ComponentRenderer.java @@ -72,7 +72,7 @@ public class ComponentRenderer { }; } - private void renderGeometry(GL2 gl, RocketComponent c, Surface which) { + protected void renderGeometry(GL2 gl, RocketComponent c, Surface which) { if (glu == null) throw new IllegalStateException(this + " Not Initialized"); diff --git a/core/src/net/sf/openrocket/gui/figure3d/geometry/DisplayListComponentRenderer.java b/core/src/net/sf/openrocket/gui/figure3d/geometry/DisplayListComponentRenderer.java new file mode 100644 index 000000000..c27c81d95 --- /dev/null +++ b/core/src/net/sf/openrocket/gui/figure3d/geometry/DisplayListComponentRenderer.java @@ -0,0 +1,78 @@ +package net.sf.openrocket.gui.figure3d.geometry; + +import java.util.HashMap; +import java.util.Map; + +import javax.media.opengl.GL2; +import javax.media.opengl.GLAutoDrawable; + +import net.sf.openrocket.gui.figure3d.geometry.Geometry.Surface; +import net.sf.openrocket.rocketcomponent.RocketComponent; + +public class DisplayListComponentRenderer extends ComponentRenderer { + private Map lists = new HashMap(); + + @Override + public void updateFigure(GLAutoDrawable drawable) { + super.updateFigure(drawable); + + GL2 gl = drawable.getGL().getGL2(); + for (int i : lists.values()) { + gl.glDeleteLists(i, 1); + } + lists.clear(); + } + + @Override + protected void renderGeometry(GL2 gl, RocketComponent c, Surface which) { + Key k = new Key(c, which); + if (lists.containsKey(k)) { + gl.glCallList(lists.get(k)); + } else { + int list = gl.glGenLists(1); + gl.glNewList(list, GL2.GL_COMPILE_AND_EXECUTE); + super.renderGeometry(gl, c, which); + gl.glEndList(); + lists.put(k, list); + } + } + + private static class Key { + final RocketComponent c; + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((c == null) ? 0 : c.hashCode()); + result = prime * result + ((which == null) ? 0 : which.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Key other = (Key) obj; + if (c == null) { + if (other.c != null) + return false; + } else if (!c.equals(other.c)) + return false; + if (which != other.which) + return false; + return true; + } + + final Surface which; + + Key(final RocketComponent c, final Surface which) { + this.c = c; + this.which = which; + } + } +}