package org.osm2world.viewer.control.actions; import java.awt.event.ActionEvent; import java.util.Observable; import java.util.Observer; import javax.swing.AbstractAction; import javax.swing.JOptionPane; import org.osm2world.core.map_data.creation.MapProjection; import org.osm2world.core.math.VectorXYZ; import org.osm2world.core.math.VectorXZ; import org.osm2world.viewer.model.Data; import org.osm2world.viewer.model.RenderOptions; import org.osm2world.viewer.view.ViewerFrame; public class SetCameraToCoordinateAction extends AbstractAction implements Observer { private static final long serialVersionUID = 8587163475874776786L; //generated serialVersionUID ViewerFrame viewerFrame; Data data; RenderOptions renderOptions; public SetCameraToCoordinateAction(ViewerFrame viewerFrame, Data data, RenderOptions renderOptions) { super("Set camera to coordinate"); putValue(SHORT_DESCRIPTION, "Precisely position the camera"); this.viewerFrame = viewerFrame; this.data = data; this.renderOptions = renderOptions; setEnabled(false); data.addObserver(this); } @Override public void update(Observable o, Object arg) { setEnabled(data.getConversionResults() != null); } @Override public void actionPerformed(ActionEvent e) { double lat = Double.parseDouble( JOptionPane.showInputDialog(viewerFrame, "lat")); double lon = Double.parseDouble( JOptionPane.showInputDialog(viewerFrame, "lon")); double height = Double.parseDouble( JOptionPane.showInputDialog(viewerFrame, "height")); MapProjection projection = data.getConversionResults().getMapProjection(); VectorXZ newPosXZ = projection.calcPos(lat, lon); VectorXYZ newPos = newPosXZ.xyz(height); renderOptions.camera.move(newPos.subtract(renderOptions.camera.getPos())); } }