diff --git a/swing/src/net/sf/openrocket/gui/simulation/SimulationRunDialog.java b/swing/src/net/sf/openrocket/gui/simulation/SimulationRunDialog.java index bb1f11147..44416bf24 100644 --- a/swing/src/net/sf/openrocket/gui/simulation/SimulationRunDialog.java +++ b/swing/src/net/sf/openrocket/gui/simulation/SimulationRunDialog.java @@ -49,9 +49,9 @@ import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.Unit; import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.MathUtil; +import net.sf.openrocket.util.Coordinate; import net.sf.openrocket.gui.widgets.SelectColorButton; - public class SimulationRunDialog extends JDialog { private static final long serialVersionUID = -1593459321777026455L; private static final Logger log = LoggerFactory.getLogger(SimulationRunDialog.class); @@ -270,6 +270,7 @@ public class SimulationRunDialog extends JDialog { private final int index; private final double burnoutTimeEstimate; private volatile double burnoutVelocity; + private volatile double apogeeAltitude; private final CustomExpressionSimulationListener exprListener; @@ -328,10 +329,11 @@ public class SimulationRunDialog extends JDialog { // in order to calculate things like optimal coast time, we'll keep updating max altitude // whenever we see that the rocket is going upwards. The last apogee found is the real one. for (SimulationStatus s : chunks) { - if (s.getConfiguration().isStageActive(0) && (s.getRocketVelocity().z > 0)) { + if (s.getConfiguration().isStageActive(0) && + ((s.getRocketVelocity().z > 0) || (s.getRocketPosition().z > simulationMaxAltitude[index]))) { log.debug("updating simulationMaxAltitude[" + index + "] to " + s.getRocketPosition().z); simulationMaxAltitude[index] = s.getRocketPosition().z; - simulationMaxVelocity[index] = Math.max(simulationMaxVelocity[index], s.getRocketVelocity().length()); + simulationMaxVelocity[index] = Math.max(simulationMaxVelocity[index], s.getRocketVelocity().z); } } @@ -367,14 +369,14 @@ public class SimulationRunDialog extends JDialog { // Past apogee, switch to landing if (simulationStage == -1 && status.getRocketVelocity().z < 0) { simulationStage++; - log.debug("CHANGING to simulationStage " + simulationStage + ", apogee=" + simulationMaxAltitude[index]); + apogeeAltitude = MathUtil.max(simulationMaxAltitude[index], 1); + log.debug("CHANGING to simulationStage " + simulationStage + ", apogee=" + apogeeAltitude); } // >= 0 Landing. z-position from apogee to zero // TODO: MEDIUM: several stages - System.out.flush(); - log.debug("simulationStage landing (" + simulationStage + "): alt=" + status.getRocketPosition().z + " apogee=" + simulationMaxAltitude[index]); - setSimulationProgress(MathUtil.map(status.getRocketPosition().z, simulationMaxAltitude[index], 0, APOGEE_PROGRESS, 1.0)); + log.debug("simulationStage landing (" + simulationStage + "): alt=" + status.getRocketPosition().z + " apogee=" + apogeeAltitude); + setSimulationProgress(MathUtil.map(status.getRocketPosition().z, apogeeAltitude, 0, APOGEE_PROGRESS, 1.0)); updateProgress(); } @@ -449,16 +451,17 @@ public class SimulationRunDialog extends JDialog { switch (event.getType()) { case APOGEE: log.debug("APOGEE"); - publish(status); + publish(new SimulationStatus(status)); break; case LAUNCH: - publish(status); + log.debug("LAUNCH"); + publish(new SimulationStatus(status)); break; case SIMULATION_END: log.debug("END"); - publish(status); + publish(new SimulationStatus(status)); break; default: @@ -471,7 +474,7 @@ public class SimulationRunDialog extends JDialog { public void postStep(SimulationStatus status) { if (System.currentTimeMillis() >= time + UPDATE_MS) { time = System.currentTimeMillis(); - publish(status); + publish(new SimulationStatus(status)); } } }