/** * Copyright 2014 * SMEdit https://github.com/StarMade/SMEdit * SMTools https://github.com/StarMade/SMTools * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. **/ package jo.sm.ui.lwjgl; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseWheelEvent; import jo.sm.data.RenderPoly; import jo.sm.logic.RenderPolyLogic; import jo.sm.logic.StarMadeLogic; import jo.vecmath.Point3f; import jo.vecmath.Point3i; public class LWJGLMouseAdapter extends MouseAdapter { public static final float PIXEL_TO_RADIANS = (1f / 3.14159f / 16f); private static final int MOUSE_MODE_NULL = 0; private static final int MOUSE_MODE_PIVOT = 1; private static final int MOUSE_MODE_SELECT = 2; private final LWJGLRenderPanel mPanel; private Point mMouseDownAt; private Point3f mMousePivotAround; private int mMouseMode; public LWJGLMouseAdapter(LWJGLRenderPanel panel) { mPanel = panel; } @Override public void mousePressed(MouseEvent ev) { if (ev.getButton() == MouseEvent.BUTTON1) { doMouseDown(ev.getPoint(), ev.getModifiers()); } } @Override public void mouseReleased(MouseEvent ev) { if (ev.getButton() == MouseEvent.BUTTON1) { doMouseUp(ev.getPoint(), ev.getModifiers()); } } @Override public void mouseDragged(MouseEvent ev) { if (mMouseDownAt != null) { doMouseMove(ev.getPoint(), ev.getModifiers()); } } @Override public void mouseWheelMoved(MouseWheelEvent e) { doMouseWheel(e.getWheelRotation()); } private void doMouseDown(Point p, int modifiers) { mMouseDownAt = p; //System.out.println("MouseMod="+Integer.toHexString(modifiers)); if ((modifiers & MouseEvent.SHIFT_MASK) != 0) { RenderPoly tile = mPanel.getTileAt(p.x, p.y); if (tile == null) { return; } mMouseMode = MOUSE_MODE_SELECT; StarMadeLogic.getInstance().setSelectedLower(null); StarMadeLogic.getInstance().setSelectedUpper(null); extendSelection(tile); } else { mMouseMode = MOUSE_MODE_PIVOT; // Point3i pivot = getPointAt(p.x, p.y); // if (pivot != null) // mMousePivotAround = new Point3f(pivot.x, pivot.y, pivot.z); // else mMousePivotAround = null; } } private void doMouseMove(Point p, int modifiers) { if (mMouseMode == MOUSE_MODE_PIVOT) { int dx = p.x - mMouseDownAt.x; int dy = p.y - mMouseDownAt.y; mMouseDownAt = p; if ((dx != 0) || (dy != 0)) { if (mMousePivotAround == null) { //System.out.println("Pivot around ourselves"); if (dx != 0) { mPanel.mUniverse.getCamera().yaw(dx * PIXEL_TO_RADIANS); } if (dy != 0) { mPanel.mUniverse.getCamera().pitch(dy * PIXEL_TO_RADIANS); } } else { Point3f rot = new Point3f(dx * PIXEL_TO_RADIANS, dy * PIXEL_TO_RADIANS, 0); System.out.println("Pivot around " + mMousePivotAround + ", location=" + mPanel.mUniverse.getCamera().getLocation() + " by " + rot); mPanel.mUniverse.getCamera().rotateAround(mMousePivotAround, rot); System.out.println("After pivot=\n" + mPanel.mUniverse.getCamera()); } mPanel.updateTransform(); } } else if (mMouseMode == MOUSE_MODE_SELECT) { RenderPoly tile = mPanel.getTileAt(p.x, p.y); if (tile != null) { extendSelection(tile); } } } private void doMouseUp(Point p, int modifiers) { if (mMouseMode == MOUSE_MODE_PIVOT) { doMouseMove(p, modifiers); mMouseDownAt = null; } else if (mMouseMode == MOUSE_MODE_SELECT) { doMouseMove(p, modifiers); } mMouseMode = MOUSE_MODE_NULL; } private void doMouseWheel(int roll) { if (roll == 0) { return; } mPanel.mUniverse.getCamera().moveForward(-roll * 1.0f); mPanel.updateTransform(); } private void extendSelection(RenderPoly tile) { Point3i lowest = new Point3i(); Point3i highest = new Point3i(); RenderPolyLogic.getBounds(tile, lowest, highest); Point3i lower = StarMadeLogic.getInstance().getSelectedLower(); if (lower == null) { lower = lowest; StarMadeLogic.getInstance().setSelectedLower(lower); } else { lower.x = Math.min(lower.x, lowest.x); lower.y = Math.min(lower.y, lowest.y); lower.z = Math.min(lower.z, lowest.z); } Point3i upper = StarMadeLogic.getInstance().getSelectedUpper(); if (upper == null) { upper = highest; StarMadeLogic.getInstance().setSelectedUpper(upper); } else { upper.x = Math.min(upper.x, highest.x); upper.y = Math.min(upper.y, highest.y); upper.z = Math.min(upper.z, highest.z); } mPanel.updateSelectionBox(); } }