/******************************************************************************* * This is part of SketchChair, an open-source tool for designing your own furniture. * www.sketchchair.cc * * Copyright (C) 2012, Diatom Studio ltd. Contact: hello@diatom.cc * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package cc.sketchchair.core; import java.awt.Desktop; import java.awt.Frame; import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import javax.jnlp.FileContents; import javax.jnlp.FileOpenService; import javax.jnlp.FileSaveService; import javax.jnlp.ServiceManager; import javax.jnlp.UnavailableServiceException; import javax.vecmath.Matrix4f; import javax.vecmath.Vector3f; import nu.xom.Attribute; import nu.xom.Builder; import nu.xom.Document; import nu.xom.Element; import nu.xom.ParsingException; import nu.xom.Serializer; import nu.xom.ValidityException; import processing.core.PApplet; import processing.core.PGraphics; import processing.core.PImage; import toxi.geom.Plane; import toxi.geom.Ray3D; import toxi.geom.Vec2D; import toxi.geom.Vec3D; import ModalGUI.GUIButton; import ModalGUI.GUIComponentSet; import ModalGUI.GUIEvent; import ModalGUI.GUIImage; import ModalGUI.GUIToggle; import ModalGUI.GUIWindow; import ModalGUI.ModalGUI; import ShapePacking.BezierControlNode; import cc.sketchchair.environments.Environment; import cc.sketchchair.functions.functions; import cc.sketchchair.geometry.SlicePlane; import cc.sketchchair.ragdoll.ergoDoll; import cc.sketchchair.sketch.SETTINGS_SKETCH; import cc.sketchchair.sketch.SketchPoint; import cc.sketchchair.sketch.SketchShape; import cc.sketchchair.sketch.SketchTools; import cc.sketchchair.widgets.WidgetLoad; import com.bulletphysics.dynamics.RigidBody; import com.bulletphysics.linearmath.Transform; /** * Acts as a interface between the GUI and the SketchChair engine. * This class also proves some functions such as mapping a 2d position into model space that might be best put else where later. * This class could do with some tidying up. * @author gregsaul * */ public class UITools { public static final int DRAW_TOOL = 1; public static final int SELECT_TOOL = 2; public static final int SELECT_BEZIER_TOOL = 9; public static int LEG_TOOL = 7; public static final int MOVE_CAM_TOOL = 3; public static final int ZOOM_CAM_TOOL = 4; public static final int ROTATE_CAM_TOOL = 5; public static final int ADD_DOLL_TOOL = 6; public static final int SCALE_PERSON_TOOL = 8; public static final int VIEW_SHAPE_PACK = 1; public static final int VIEW_CHAIR_EDIT = 2; public static final int VIEW_SAVE_CHAIR = 3; public static final int DRAW_PATH_TOOL = 12; public static final int MOVE_OBJECT = 16; public static final int SCALE_TOOL = 19; public static final int MOVE_2D_TOOL = 20; public static final int SLICES_SINGLE_SLICE = 23; public static final int SLICES_GROUP_SLICES = 24; public static final int SLICES_SINGLE_SLAT = 28; public static final int SLICES_SLATSLICE_GROUP = 29; public static final int SLICES_EDIT = 30; GUIComponentSet toggleSet = new GUIComponentSet(); static void doLoad() { load("chair.cha"); } static void doSave() { save("chair.cha"); } static void load(Document doc) { LOGGER.debug("UITools: about to load Document"); //return fd.getFile(); //FileInputStream fileIn = new FileInputStream(name); //ObjectInputStream in = new ObjectInputStream(fileIn); Element e = (Element) doc.getChild(0); //check to make sure that it's a sketch chair doc. if (!e.getQualifiedName().equals("SketchChairDoc")) return; e = (Element) e.getChild(0); SketchChair loadedChair = null; LOGGER.debug("UITools: about to load chair structure"); //loading a chair if (e.getQualifiedName().equals("SketchChair")) { loadedChair = new SketchChair(e); } LOGGER.debug("UITools: loaded chair object"); if (loadedChair != null) { // loadedChair.justLoaded(); GLOBAL.sketchChairs.add(loadedChair); //GLOBAL.sketchChairs.setCurChair(loadedChair); if (GLOBAL.planesWidget != null && GLOBAL.planesWidget.slider != null) { GLOBAL.planesWidget.slider.setVal(loadedChair.getWidth()); //GLOBAL.planesWidget.SlatSliderStart.setVal(loadedChair.startCoverPercent); // GLOBAL.planesWidget.SlatSliderEnd.setVal(loadedChair.endCoverPercent); // GLOBAL.planesWidget.SlatSliderSpacing.setVal(loadedChair.slatSpacingX); GLOBAL.slicesWidget.rebuild(loadedChair.crossSliceSelections); } GLOBAL.sketchChairs.getCurChair().localSavelocation = GLOBAL.lastLoadLocation; } else { LOGGER.error("Could not load chair from XML."); } } static void load(InputStream inputStream) { Builder builder = new Builder(); Document doc = null; try { doc = builder.build(inputStream); load(doc); } catch (ValidityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParsingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void load(String name) { Builder builder = new Builder(); InputStream input = null; GLOBAL.lastLoadLocation = name; LOGGER.debug("loading about to open file pointer."); try { input = new FileInputStream(name); } catch (FileNotFoundException e1) { LOGGER.debug("UITolls: FileNotFoundException"); e1.printStackTrace(); } LOGGER.debug("loading file pointer open."); Document doc = null; if (input == null) LOGGER.debug("UITools: File input is null."); try { if (builder == null) LOGGER.debug("UITools: XOM builder is null."); LOGGER.debug("UITools: about to build XML from input."); doc = builder.build(input); if (doc == null) LOGGER.debug("UITools: doc XOM obj is null."); load(doc); } catch (ValidityException e) { // TODO Auto-generated catch block LOGGER.error("UITools: Could not make XML document: ValidityException"); e.printStackTrace(); } catch (ParsingException e) { // TODO Auto-generated catch block LOGGER.error("UITools: Could not make XML document: ParsingException"); e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block LOGGER.error("UITools: Could not make XML document: IOException"); e.printStackTrace(); } } static void save(OutputStream stream, String name) { if (GLOBAL.sketchChairs.getCurChair() != null) { PGraphics saveImg = GLOBAL.sketchChairs.getCurChair() .renderToFile(); if (saveImg.width > 0 && saveImg.height > 0) saveImg.save(name + ".png"); } } static void save(String name) { if (GLOBAL.sketchChairs.getCurChair() != null) { try { Element root = new Element("SketchChairDoc"); root.addAttribute(new Attribute("version", String .valueOf(SETTINGS.version))); root.appendChild(GLOBAL.sketchChairs.getCurChair().toXML()); Document doc = new Document(root); OutputStream outXML = new FileOutputStream(name); outXML = new BufferedOutputStream(outXML); Serializer serializer = new Serializer(outXML, "ISO-8859-1"); serializer.write(doc); GLOBAL.sketchChairs.getCurChair().localSavelocation = name; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } float rememberThis = GLOBAL.rotateModelsX; GLOBAL.rotateModelsX = .01f; /* PImage saveImg = GLOBAL.sketchChairs.getCurChair().renderDiagram( SETTINGS.THUMBNAIL_HEIGHT, SETTINGS.THUMBNAIL_HEIGHT, (float) -(Math.PI / 8), (float) -(Math.PI / 4), false); GLOBAL.rotateModelsX = rememberThis; if (saveImg.width > 0 && saveImg.height > 0) saveImg.save(name + ".png"); */ } } static void savePattern(String name) { GLOBAL.shapePack.makeSVG(GLOBAL.applet, name); /* if (GLOBAL.sketchChairs.getCurChair() != null) { try { Element root = new Element("SketchChairDoc"); root.addAttribute(new Attribute("version", String .valueOf(SETTINGS.version))); root.appendChild(GLOBAL.sketchChairs.getCurChair().toXML()); Document doc = new Document(root); OutputStream outXML = new FileOutputStream(name); outXML = new BufferedOutputStream(outXML); Serializer serializer = new Serializer(outXML, "ISO-8859-1"); serializer.write(doc); GLOBAL.sketchChairs.getCurChair().localSavelocation = name; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } float rememberThis = GLOBAL.rotateModelsX; GLOBAL.rotateModelsX = .01f; PImage saveImg = GLOBAL.sketchChairs.getCurChair().renderDiagram( SETTINGS.THUMBNAIL_HEIGHT, SETTINGS.THUMBNAIL_HEIGHT, (float) -(Math.PI / 8), (float) -(Math.PI / 4), false); GLOBAL.rotateModelsX = rememberThis; if (saveImg.width > 0 && saveImg.height > 0) saveImg.save(name + ".png"); } */ } private int currentTool = 1; public int currentView = 2; public static int MEASURE_TOOL = 21; public static int CROSSSLICE_EDIT = 22; public static PImage DRAW_TOOL_CURSOR = null; public static PImage SELECT_TOOL_CURSOR = null; public static PImage ADD_DOLL_TOOL_CURSOR = null; public static PImage MOVE_OBJECT_CURSOR = null; public static PImage ROTATE_CAM_TOOL_CURSOR =null; public static PImage ZOOM_CAM_TOOL_CURSOR = null; public static PImage MOVE_CAM_TOOL_CURSOR = null; public static PImage CURSOR_ADD_SLICE = null; public static PImage LINE_TOOL_CURSOR; public static PImage SCALE_TOOL_CURSOR; private PGraphics pickBuffer; private SketchPoint selectedVec = new SketchPoint(0, 0); public boolean render3dPreview = false; private SlicePlane selectedVecPlane = null; public SlicePlane curSliceplane = null; private SketchShape selectedShape = null; private boolean isSelectedVecOnOutline = false; public static int MOUSE_RIGHT = 39; public static int MOUSE_MIDDLE = 3; public static final int MOUSE_LEFT = 37; static final int LANGUAGE_ENG = 1; static final int LANGUAGE_JP = 2; private static final int NONE = -1; public static final int SLICE_EDIT_MODE_ADD = 0; public static final int SLICE_EDIT_MODE_POS = 1; public static final int SLICE_EDIT_MODE_SPACING = 2; private int editing = 1; public int preview = 2; public int editingMode = isEditing(); public int pmouseX; public int pmouseY; public int mouseX; public int mouseY; public float mouseXworld; public float mouseYworld; public float pmouseXworld; public float pmouseYworld; public boolean mouseDown = false; public int mouseButton; public boolean renderNodesFlag = false; boolean useGrid = false; float gridWidth = 50f; float gridHeight = 50f; float minorGridnumber = 10; public RigidBody selectedBody; public boolean keyPressed; public char key; public int keyCode; private int selectCooldown; public MeasureTool measureTool = new MeasureTool(); private PImage MEASURE_TOOL_CURSOR; private ArrayList<Clickable> clickables = new ArrayList<Clickable>(); public boolean patternView = false; public float brush_dia = 40; public boolean mousePressed = false; private int mousePressedTime = 0; private int mouseSingleClickTime; public int loadedCursor; private boolean waitingForSingleClick; public boolean hasCursorControl = false; private PImage CURSOR_EDIT_SLICE_POS; private PImage CURSOR_EDIT_SLICE_SPACING; public int sliceToolMode = 0; private boolean prevMouseWasMove = false; public static SketchTools SketchTools; UITools(PApplet applet) { SketchTools = new SketchTools(applet); } public void addListener(Clickable clickable) { this.clickables.add(clickable); } public void addPlane(GUIEvent e) { if (GLOBAL.sketchChairs.getCurChair() != null) GLOBAL.sketchChairs.getCurChair().addLayer(); } public void autoLoad() { load("autoSave.cha"); } public void autoRotate(GUIEvent e) { GLOBAL.autoRotate = !GLOBAL.autoRotate; setCurrentTool(ROTATE_CAM_TOOL); if (!GLOBAL.autoRotate) GLOBAL.rotateModelsY = 0; GLOBAL.slicesWidget.unselectAll(); GLOBAL.planesWidget.unselectAll(); } public void autoSave() { save("autoSave.cha"); } void build(PApplet applet) { DRAW_TOOL_CURSOR = applet.loadImage("gui/GUI_DRAW_TOOL_CURSOR.png"); SELECT_TOOL_CURSOR = applet.loadImage("gui/cursors/CURSOR_SELECT.png"); ADD_DOLL_TOOL_CURSOR = applet .loadImage("gui/cursors/CURSOR_HAND_UP.png"); MOVE_CAM_TOOL_CURSOR = applet .loadImage("gui/cursors/CURSOR_CAM_MOVE.png"); ROTATE_CAM_TOOL_CURSOR = applet .loadImage("gui/cursors/CURSOR_CAM_ROTATE.png"); ZOOM_CAM_TOOL_CURSOR = applet.loadImage("gui/cursors/CURSOR_CAM_ZOOM.png"); LINE_TOOL_CURSOR = applet.loadImage("gui/GUI_LINE_TOOL_UP.png"); SCALE_TOOL_CURSOR = applet.loadImage("gui/GUI_SCALE_TOOL_CURSOR.png"); MEASURE_TOOL_CURSOR = applet .loadImage("gui/GUI_MEASURE_TOOL_CURSOR.png"); MOVE_OBJECT_CURSOR = applet .loadImage("gui/cursors/CURSOR_HAND_UP.png"); CURSOR_ADD_SLICE = applet .loadImage("gui/cursors/CURSOR_SLAT_ADD.png"); this.SketchTools.build(GLOBAL.applet); CURSOR_EDIT_SLICE_POS = applet .loadImage("gui/cursors/CURSOR_SLAT_EDIT.png"); this.SketchTools.build(GLOBAL.applet); CURSOR_EDIT_SLICE_SPACING = applet .loadImage("gui/cursors/CURSOR_SLAT_EDIT_SPACING.png"); this.SketchTools.build(GLOBAL.applet); //GLOBAL.applet.cursor(UITools.SELECT_TOOL_CURSOR, 1,1); // buffer is created using applet dimensions //this.pickBuffer = applet.createGraphics(applet.width, applet.height, // PConstants.P3D); //this.pickBuffer.ortho(-(applet.width / 2), (applet.width / 2), //-(applet.height / 2), (applet.height / 2), -1000, 10000); } public void camJumpFront(GUIEvent e) { GLOBAL.rotateModelsX = 0; GLOBAL.rotateModelsY = 0; } public void camJumpSide(GUIEvent e) { GLOBAL.rotateModelsX = 0; GLOBAL.rotateModelsY = (float) -(Math.PI / 2); } public void camJumpTop(GUIEvent e) { GLOBAL.rotateModelsX = (float) -(Math.PI / 2); GLOBAL.rotateModelsY = 0; } public void camJumpIso(GUIEvent e) { GLOBAL.rotateModelsX = (float) -(Math.PI / 8); GLOBAL.rotateModelsY = (float) -(Math.PI / 4); //g.rotateY(rotateRend); } public void captureScreen(GUIEvent e) { GLOBAL.captureScreen = true; } public void changeModeBasic(GUIEvent e) { SETTINGS.EXPERT_MODE = false; UI.setupGUITabsBasic(GLOBAL.applet, GLOBAL.gui); GLOBAL.modeChanged = true; } public void changeModeExpert(GUIEvent e) { SETTINGS.EXPERT_MODE = true; UI.setupGUITabsExpert(GLOBAL.applet, GLOBAL.gui); GLOBAL.modeChanged = true; } public void changeView(GUIEvent e) { this.toggleView(e); // GLOBAL.sketchChairs.curChair.slicePlanesY.update(); //GLOBAL.sketchChairs.curChair.addToShapePack(); // this.currentView = (int) e.val; } public void copyChair() { GLOBAL.copyOfChair = GLOBAL.sketchChairs.getCurChair().copy(); } public void deleteAllChairsFlag(GUIEvent e) { GLOBAL.deleteAllChairsFlag = true; } public void deleteAllChairs(GUIEvent e) { //this.saveChairToFileAuto(null); //this.captureScreen(null); //GLOBAL.applet.draw(); GLOBAL.sketchChairs.killAll(); } public void deleteLastChair(GUIEvent e) { this.saveChairToFileAuto(null); this.captureScreen(null); GLOBAL.applet.draw(); GLOBAL.sketchChairs.killLast(); } public void flipChair(GUIEvent e) { if (GLOBAL.sketchChairs.getCurChair() != null) GLOBAL.sketchChairs.getCurChair().flipDesign(); } /** * @return the currentTool */ public int getCurrentTool() { return currentTool; } /** * @return the pickBuffer */ public PGraphics getPickBuffer() { return pickBuffer; } public Vec2D getPointOnPlane(Vec2D mousePoint, Plane planeIn) { Plane plane = new Plane(planeIn.copy(), planeIn.normal.copy()); Vec3D mouseRayPos = new Vec3D(mousePoint.x, mousePoint.y, planeIn.z); // this only works for planes perpendicular to the screen Vec3D mouseRayDir = new Vec3D(0, 0, -1); Vec3D focusCentre = new Vec3D( ((GLOBAL.windowWidth / 2) - (float)GLOBAL.CAM_OFFSET_X), ((GLOBAL.windowHeight / 2) - (float)GLOBAL.CAM_OFFSET_Y), 0); //now mouse pos is refereced from the centre of the screen mouseRayPos.x -= (GLOBAL.windowWidth / 2); mouseRayPos.y -= (GLOBAL.windowHeight / 2); mouseRayPos.scaleSelf((float) (1 / GLOBAL.getZOOM())); mouseRayPos.addSelf(focusCentre); Ray3D ray; Vec3D mousePos = null; Vec3D intersect; mouseRayDir = new Vec3D(0, 0, -1); plane.z = 0; //we need to rotate the plane so that it matches the one on the draw view plane.normal.rotateY(GLOBAL.rotateModelsY); plane.normal.rotateX(GLOBAL.rotateModelsX); plane.addSelf(plane.normal.scale(planeIn.z)); //mouseRayDir.rotateY(GLOBAL.rotateModelsY); //mouseRayDir.rotateX(GLOBAL.rotateModelsX); mouseRayPos.subSelf(focusCentre); ray = new Ray3D(mouseRayPos, mouseRayDir); // this should be the world position of the mouse poiner on the 0,0,-1 plane intersect = plane.getIntersectionWithRay(ray); if (intersect == null) { ray = new Ray3D(mouseRayPos, mouseRayDir.invert()); intersect = plane.getIntersectionWithRay(ray); } ray = new Ray3D(mouseRayPos, mouseRayDir); ray.addSelf(focusCentre); //if(this.mouseDown) // GLOBAL.debugRay = ray; if (intersect != null) { // System.out.println(plane.getProjectedPoint(intersect)); // intersect.z -= plane.z*2; //intersect.x += 70; // System.out.println("before rotate " +intersect); // intersect.subSelf(focusCentre.scale(GLOBAL.getZOOM())); // intersect. intersect.rotateX(-GLOBAL.rotateModelsX); intersect.rotateY(-GLOBAL.rotateModelsY); intersect.addSelf(focusCentre); //intersect.x += (GLOBAL.CAM_OFFSET_X*GLOBAL.getZOOM()); //intersect.y += GLOBAL.CAM_OFFSET_Y; //intersect.rotateAroundAxis(axis, theta) mousePos = intersect; //mousePos.x += intersect.z; //System.out.println("after rotate " +intersect); } //get the chair matrix Matrix4f chairMatrix = new Matrix4f(); Vec3D chairCentreOfMass = new Vec3D(); if (GLOBAL.sketchChairs.getCurChair() != null && GLOBAL.sketchChairs.getCurChair().rigidBody != null) { Transform transform = new Transform(); GLOBAL.sketchChairs.getCurChair().rigidBody .getWorldTransform(transform); transform.getMatrix(chairMatrix); chairCentreOfMass = GLOBAL.sketchChairs.getCurChair().centreOfMass; } if (GLOBAL.sketchChairs.getCurChair() != null && GLOBAL.sketchChairs.getCurChair().rigidBody != null && chairMatrix != null && mousePos != null) { float centreMouseDeltaX = mousePos.x - ((chairMatrix.m03) / GLOBAL.jBullet.scale); float centreMouseDeltaY = mousePos.y - ((chairMatrix.m13) / GLOBAL.jBullet.scale); float centreMouseDeltaZ = mousePos.z - ((chairMatrix.m23) / GLOBAL.jBullet.scale); centreMouseDeltaZ = 0; float newX = ((chairMatrix.m00) * centreMouseDeltaX) + ((chairMatrix.m01) * centreMouseDeltaY) + ((chairMatrix.m02) * centreMouseDeltaZ); float newY = (((chairMatrix.m10) * centreMouseDeltaX) + ((chairMatrix.m11) * centreMouseDeltaY) + ((chairMatrix.m12) * centreMouseDeltaZ)); float newZ = ((chairMatrix.m20) * centreMouseDeltaX) + ((chairMatrix.m21) * centreMouseDeltaY) + ((chairMatrix.m22) * centreMouseDeltaZ); newY = newY * -1; mousePos.x = newX + ((chairCentreOfMass.x) / GLOBAL.jBullet.scale); mousePos.y = newY + ((chairCentreOfMass.y) / GLOBAL.jBullet.scale); //mousePos.z = centreMouseDeltaZ + chairCentreOfMass.Z; } Vec2D intersect2D = null; if (mousePos != null) { intersect2D = new Vec2D(mousePos.x, mousePos.y); //intersect2D = new Vec2D(mousePoint.x, mousePoint.y); } else { intersect2D = new Vec2D(mousePoint.x, mousePoint.y); } if (intersect2D == null) intersect2D = new Vec2D(mousePoint.x, mousePoint.y); return intersect2D; } public Vec2D getPointOnPlaneOld(Vec2D mousePoint, Plane planeIn) { //get the chair matrix Matrix4f chairMatrix = new Matrix4f(); Vec3D chairCentreOfMass = new Vec3D(); if (GLOBAL.sketchChairs.getCurChair() != null && GLOBAL.sketchChairs.getCurChair().rigidBody != null) { Transform transform = new Transform(); GLOBAL.sketchChairs.getCurChair().rigidBody .getWorldTransform(transform); transform.getMatrix(chairMatrix); chairCentreOfMass = GLOBAL.sketchChairs.getCurChair().centreOfMass; } Plane plane = new Plane(planeIn.copy(), planeIn.normal.copy()); Vec3D mouseRayPos = new Vec3D(mousePoint.x, mousePoint.y, plane.z); // this only works for planes perpendicular to the screen Vec3D mouseRayDir = new Vec3D(0, 0, -1); Vec3D focusCentre = new Vec3D( ((GLOBAL.windowWidth / 2) - (float)GLOBAL.CAM_OFFSET_X), ((GLOBAL.windowHeight / 2) - (float)GLOBAL.CAM_OFFSET_Y), 0); //now mouse pos is refereced from the centre of the screen mouseRayPos.x -= (GLOBAL.windowWidth / 2); mouseRayPos.y -= (GLOBAL.windowHeight / 2); mouseRayPos.scaleSelf((float) (1 / GLOBAL.getZOOM())); //mouseRayPos.addSelf(-screenCentre.x,-screenCentre.y, 0); mouseRayPos.rotateX((GLOBAL.rotateModelsX)); mouseRayPos.rotateY((GLOBAL.rotateModelsY)); mouseRayPos.addSelf(focusCentre); mouseRayDir.x = mouseRayDir.x - mouseRayPos.x; mouseRayDir.y = mouseRayDir.y - mouseRayPos.y; mouseRayDir.z = mouseRayDir.z - mouseRayPos.z; mouseRayDir.rotateX((GLOBAL.rotateModelsX)); mouseRayDir.rotateY((GLOBAL.rotateModelsY)); Ray3D ray = new Ray3D(mouseRayPos, mouseRayDir); Vec3D mousePos = null; if (GLOBAL.rotateModelsX == 0 && GLOBAL.rotateModelsY == 0 && plane.normal.x == 0 && plane.normal.y == 0) mousePos = new Vec3D(ray.x, ray.y, ray.z); //put these back in for 3d // if(mousePos == null) // mousePos = plane.getIntersectionWithRay(ray); if (mousePos == null) { mouseRayDir = new Vec3D(0, 0, 1); mouseRayDir.x = mouseRayDir.x - mouseRayPos.x; mouseRayDir.y = mouseRayDir.y - mouseRayPos.y; mouseRayDir.z = mouseRayDir.z - mouseRayPos.z; mouseRayDir.rotateX((GLOBAL.rotateModelsX)); mouseRayDir.rotateY((GLOBAL.rotateModelsY)); ray = new Ray3D(mouseRayPos, mouseRayDir); plane.normal.z *= -1; //put these back in for 3d // mousePos = plane.getIntersectionWithRay(ray); } if (GLOBAL.sketchChairs.getCurChair() != null && GLOBAL.sketchChairs.getCurChair().rigidBody != null && chairMatrix != null && mousePos != null) { float centreMouseDeltaX = mousePos.x - ((chairMatrix.m03) / GLOBAL.jBullet.scale); float centreMouseDeltaY = mousePos.y - ((chairMatrix.m13) / GLOBAL.jBullet.scale); float centreMouseDeltaZ = mousePos.z - ((chairMatrix.m23) / GLOBAL.jBullet.scale); centreMouseDeltaZ = 0; float newX = ((chairMatrix.m00) * centreMouseDeltaX) + ((chairMatrix.m01) * centreMouseDeltaY) + ((chairMatrix.m02) * centreMouseDeltaZ); float newY = (((chairMatrix.m10) * centreMouseDeltaX) + ((chairMatrix.m11) * centreMouseDeltaY) + ((chairMatrix.m12) * centreMouseDeltaZ)); float newZ = ((chairMatrix.m20) * centreMouseDeltaX) + ((chairMatrix.m21) * centreMouseDeltaY) + ((chairMatrix.m22) * centreMouseDeltaZ); newY = newY * -1; mousePos.x = newX + ((chairCentreOfMass.x) / GLOBAL.jBullet.scale); mousePos.y = newY + ((chairCentreOfMass.y) / GLOBAL.jBullet.scale); //mousePos.z = centreMouseDeltaZ + chairCentreOfMass.Z; } Vec2D intersect2D = null; if (mousePos != null) { intersect2D = new Vec2D(mousePos.x, mousePos.y); //intersect2D = new Vec2D(mousePoint.x, mousePoint.y); } else { intersect2D = new Vec2D(mousePoint.x, mousePoint.y); } if (intersect2D == null) intersect2D = new Vec2D(mousePoint.x, mousePoint.y); return intersect2D; } public Vec2D getPointTranslated(Vec2D mousePoint) { Vec2D mouseRayPos = new Vec2D(mousePoint.x, mousePoint.y); // this only works for planes perpendicular to the screen Vec2D focusCentre = new Vec2D( ((GLOBAL.windowWidth / 2) - (float)GLOBAL.CAM_OFFSET_X), ((GLOBAL.windowHeight / 2) - (float)GLOBAL.CAM_OFFSET_Y)); mouseRayPos.x -= (GLOBAL.windowWidth / 2); mouseRayPos.y -= (GLOBAL.windowHeight / 2); mouseRayPos.scaleSelf((float) (1 / GLOBAL.getZOOM())); mouseRayPos.addSelf(focusCentre); return mouseRayPos; } Vec2D getPointTranslatedFromWorld(Vec2D mousePoint) { Vec2D mouseRayPos = new Vec2D(mousePoint.x, mousePoint.y); // this only works for planes perpendicular to the screen Vec2D focusCentre = new Vec2D( ((GLOBAL.windowWidth / 2) - (float)GLOBAL.CAM_OFFSET_X), ((GLOBAL.windowHeight / 2) - (float)GLOBAL.CAM_OFFSET_Y)); mouseRayPos.subSelf(focusCentre); mouseRayPos.scaleSelf((float) GLOBAL.getZOOM()); mouseRayPos.x += (GLOBAL.windowWidth / 2); mouseRayPos.y += (GLOBAL.windowHeight / 2); return mouseRayPos; } public void gotoWebsite(GUIEvent e) { /* String url = "http://www.sketchChair.com"; try { // not compatible in JRE 1.5 //java.awt.Desktop.getDesktop().browse(java.net.URI.create(url)); } catch (IOException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } */ } public void hybernateChairToFileAuto(GUIEvent e) { if (GLOBAL.sketchChairs.getCurChair() != null) GLOBAL.sketchChairs.getCurChair().addToShapePack(); String computername = functions.getComputerName(); String currentDir = new File(".").getAbsolutePath(); currentDir = currentDir.substring(0, currentDir.length() - 1); int id = 0; boolean nameFound = false; String location = ""; while (!nameFound && id < 10000) { location = currentDir + "savedChairs\\hybernate\\" + computername + "_chair-" + id + ".cha"; File f = new File(location); if (!f.exists()) nameFound = true; id++; } save(location); //System.out.println("saving to " + location); SETTINGS.chairSaveNum = id; GLOBAL.LAST_SAVED_LOCATION = location; } /** * @return the editing */ public int isEditing() { return editing; } boolean isEditingTool(int TOOL) { if (TOOL == DRAW_TOOL || TOOL == SELECT_TOOL || TOOL == LEG_TOOL || TOOL == SELECT_BEZIER_TOOL || TOOL == DRAW_PATH_TOOL || TOOL == SCALE_TOOL || TOOL == MOVE_2D_TOOL) return true; else return false; } public void runAutomatedActions(GUIEvent e) { GLOBAL.skchAutomatic.start(); } public void loadTemplateChair(GUIEvent e) { //if(GLOBAL.widgetLoad == null){ GLOBAL.widgetLoad = new WidgetLoad(); GLOBAL.widgetLoad.setupGUI(GLOBAL.applet, GLOBAL.gui); // } GLOBAL.widgetLoad.show(); } public void mouseDown() { if (GLOBAL.gui.overComponent()) GLOBAL.planesWidget.mousePressed(mouseX, mouseY); //let the gui handle any mouse down events if (GLOBAL.gui.overComponent() && GLOBAL.gui.hasFocus()) return; //Jump to front if we're in? if (mouseButton == UITools.MOUSE_LEFT && isEditingTool(this.getCurrentTool())) this.camJumpFront(null); for (Clickable obj : this.clickables) { obj.mousePressed(); } //model manip! if (this.getCurrentTool() == UITools.MOVE_OBJECT || this.SketchTools.getCurrentTool() == SketchTools.LEG_TOOL || this.SketchTools.getCurrentTool() == SketchTools.DRAW_TOOL || this.SketchTools.getCurrentTool() == SketchTools.SELECT_TOOL && !GLOBAL.gui.overComponent() && !GLOBAL.sketchChairs.getCurChair().overSelectPoint( GLOBAL.uiTools.mouseX, GLOBAL.uiTools.mouseY)) { Vec2D mousePos = this.getPointTranslated(new Vec2D(this.mouseX, this.mouseY)); GLOBAL.jBullet.mouseDragged(mousePos.x, mousePos.y); } if ((GLOBAL.uiTools.getCurrentTool() == UITools.SCALE_TOOL) && !GLOBAL.gui.overComponent()) { //GLOBAL.person.dragScale(mouseX,mouseX); } // middle click if (mouseButton == UITools.MOUSE_RIGHT || this.getCurrentTool() == UITools.MOVE_CAM_TOOL) { if (SETTINGS.render_chairs && GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT) { if(this.prevMouseWasMove){ moveView((UI.mouseX - UI.pmouseX) * (float)(1 / GLOBAL.ZOOM), (UI.mouseY - UI.pmouseY) * (float)(1 / GLOBAL.ZOOM)); }else{ this.prevMouseWasMove = true; } } if (GLOBAL.uiTools.currentView == UITools.VIEW_SHAPE_PACK) { GLOBAL.shapePack.CAM_OFFSET_X += (UI.mouseX - UI.pmouseX) * (1 / GLOBAL.shapePack.ZOOM); GLOBAL.shapePack.CAM_OFFSET_Y += (UI.mouseY - UI.pmouseY) * (1 / GLOBAL.shapePack.ZOOM); } } if (!GLOBAL.gui.overComponent()) { if (this.getCurrentTool() == UITools.ZOOM_CAM_TOOL) { if (SETTINGS.render_chairs && GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT){ this.zoomView(((UI.mouseY - UI.pmouseY) * .01f)); } if (SETTINGS.render_chairs && GLOBAL.uiTools.currentView == UITools.VIEW_SHAPE_PACK) { GLOBAL.shapePack.zoomView((UI.mouseY - UI.pmouseY) * .01f, this.mouseX, this.mouseY) ; } } if (this.getCurrentTool() == UITools.ROTATE_CAM_TOOL || mouseButton == UITools.MOUSE_MIDDLE) { if (SETTINGS.render_chairs && GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT) { GLOBAL.rotateModelsY -= (UI.pmouseX - UI.mouseX) / 90f; GLOBAL.rotateModelsX += (UI.pmouseY - UI.mouseY) / 90f; } } if (this.getCurrentTool() == UITools.SELECT_TOOL && GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT) { updateVecMove(); } } if (this.getCurrentTool() != UITools.ROTATE_CAM_TOOL && GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT) GLOBAL.person.mouseDown(mouseX, mouseY); Vec2D mousePos = this.getPointTranslated(new Vec2D(this.mouseX, this.mouseY)); GLOBAL.measuretTool.mousePressed(mousePos.x, mousePos.y); } public void mouseDragged() { if (!GLOBAL.gui.overComponent() && !GLOBAL.gui.hasFocus() && !GLOBAL.gui.clickStartedOn()&& GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT) { for (Clickable obj : this.clickables) { obj.mouseDragged(); } GLOBAL.sketchChairs.mouseDragged(mouseX, mouseY); Vec2D MousePos = this.getPointTranslated(new Vec2D(this.mouseX,this.mouseY)); GLOBAL.environments.mouseDragged(MousePos.x, MousePos.y); } if (GLOBAL.gui.overComponent()) GLOBAL.planesWidget.mouseDragged(mouseX, mouseY); } void mousePressed() { //see if this is a fast press this.mousePressedTime = GLOBAL.applet.millis(); if (!GLOBAL.gui.overComponent() && !SETTINGS.EXPERT_MODE && GLOBAL.uiTools.currentView == GLOBAL.uiTools.VIEW_SHAPE_PACK) this.toggleView(null); //unselect auto rotate if (GLOBAL.autoRotate && !GLOBAL.gui.overComponent()) { GLOBAL.autoRotate = false; GLOBAL.rotateModelsY = 0; } //NOT OVER GUI //IF a press starts over GUI and drags outside it's included as still over GUI if (!GLOBAL.gui.overComponent() && !GLOBAL.gui.hasFocus() && !GLOBAL.gui.clickStartedOn()&& GLOBAL.uiTools.currentView == UITools.VIEW_CHAIR_EDIT) { GLOBAL.undo.addChair(GLOBAL.sketchChairs.getCurChair().copy()); for (Clickable obj : this.clickables) { obj.mouseClicked(); } Vec2D MousePosPerson = this.getPointTranslated(new Vec2D( this.mouseX, this.mouseY)); GLOBAL.person.mouseClicked(MousePosPerson.x, MousePosPerson.y); if (this.getCurrentTool() == UITools.SCALE_TOOL && GLOBAL.sketchChairs.getCurChair() != null) { GLOBAL.sketchChairs.getCurChair().mousePressed( MousePosPerson.x, MousePosPerson.y); } if (this.getCurrentTool() == UITools.MOVE_2D_TOOL && GLOBAL.sketchChairs.getCurChair() != null) { GLOBAL.sketchChairs.getCurChair().mousePressed( MousePosPerson.x, MousePosPerson.y); } if (this.getCurrentTool() == UITools.SELECT_TOOL || this.SketchTools.getCurrentTool() == SketchTools.SELECT_BEZIER_TOOL && !GLOBAL.person.clickedOnPerson) { //getVecOver(); if (GLOBAL.sketchChairs.getCurChair() != null) { GLOBAL.sketchChairs.getCurChair().mousePressed( MousePosPerson.x, MousePosPerson.y); } } if (this.getCurrentTool() == UITools.MOVE_OBJECT || GLOBAL.person.clickedOnPerson) { Vec2D mousePos = this.getPointTranslated(new Vec2D(this.mouseX, this.mouseY)); GLOBAL.jBullet.mouseDown(mousePos.x, mousePos.y); } if (this.SketchTools.getCurrentTool() == SketchTools.SELECT_TOOL && GLOBAL.sketchChairs.getCurChair() != null && GLOBAL.sketchChairs.getCurChair().countSelectedNodes() <= 0) { Vec2D mousePos = this.getPointTranslated(new Vec2D(this.mouseX, this.mouseY)); if (GLOBAL.jBullet.physics_on) GLOBAL.jBullet.mouseDown(mousePos.x, mousePos.y); } if (this.getCurrentTool() == UITools.SELECT_TOOL && GLOBAL.sketchChairs.getCurChair() == null) { Vec2D mousePos = this.getPointTranslated(new Vec2D(this.mouseX, this.mouseY)); GLOBAL.jBullet.mouseDown(mousePos.x, mousePos.y); } if (this.getCurrentTool() == UITools.ADD_DOLL_TOOL) { /*new SittingDoll(GLOBAL.jBullet.myWorld, new Vector3f( GLOBAL.applet.mouseX, GLOBAL.applet.mouseY, 0), 1); selectedVec = null; selectedVecPlane = null; */ } Vec2D MousePos = this.getPointTranslated(new Vec2D(this.mouseX, this.mouseY)); if (!GLOBAL.sketchChairs.getCurChair().mouseOver(MousePos.x, MousePos.y)) GLOBAL.environments.mousePressed(MousePos.x, MousePos.y); GLOBAL.sketchChairs.mousePressed(this.mouseX, this.mouseY); // if( this.currentView == UITools.VIEW_SHAPE_PACK && this.mouseButton == this.MOUSE_LEFT) // this.changeView(null); } if (GLOBAL.gui.overComponent()) GLOBAL.planesWidget.mouseClicked(mouseX, mouseY); //GLOBAL.undo.setMouseUpChair(GLOBAL.sketchChairs.getCurChair().copy()); //if(GLOBAL.undo.getMouseUpChair() != null)GLOBAL.undo.getMouseUpChair().build(); } void mouseReleased() { if(GLOBAL.uiTools.currentView != UITools.VIEW_CHAIR_EDIT) return; // this.prevMouseWasMove = false; if(!waitingForSingleClick && GLOBAL.applet.millis() - this.mousePressedTime < SETTINGS.MOUSE_PRESSED_MIN_TIME) this.waitingForSingleClick = true; else waitingForSingleClick = false; this.mouseSingleClickTime = GLOBAL.applet.millis(); /* //see if this is a fast press if (GLOBAL.applet.millis() - this.mousePressedTime < SETTINGS.MOUSE_CLICKED_MIN_TIME) { if (GLOBAL.applet.millis() - this.mouseSingleClickTime < SETTINGS.MOUSE_CLICKED_MIN_TIME*2) this.mouseDoubleClick(); else this.mouseSingleClick(); this.mouseSingleClickTime = GLOBAL.applet.millis(); */ if (GLOBAL.resetting) return; GLOBAL.person.mouseReleased(mouseX, mouseY); GLOBAL.measuretTool.mouseReleased(mouseX, mouseY); if (this.getCurrentTool() == UITools.ROTATE_CAM_TOOL && !SETTINGS.EXPERT_MODE) this.camJumpFront(null); if (SETTINGS.EXPERT_MODE && GLOBAL.gui.overComponent()) GLOBAL.planesWidget.mouseReleased(mouseX, mouseY); if (!GLOBAL.gui.overComponent()) GLOBAL.sketchChairs.mouseReleased(mouseX, mouseY); if (!GLOBAL.gui.overComponent()) GLOBAL.environments.mouseReleased(mouseX, mouseY); if (!GLOBAL.gui.overComponent()) { for (Clickable obj : this.clickables) { // obj.mouseReleased(); } } if (selectedVec != null && selectedVecPlane != null) { GLOBAL.sketchChairs.getCurChair().selectedPlanes .buildCurrentSketch(); selectedVecPlane.getSketch().buildOutline(); selectedVecPlane.getSketch().getSketchShapes().sketchOutlines .optimize(); selectedVec = null; this.selectedVecPlane.getSketch().getSketchShapes().renderShapes = false; this.selectedShape.offset(); } if (GLOBAL.sketchChairs.getCurChair() != null) { // GLOBAL.sketchChairs.curChair.updateCollisionShape(); } if (!SETTINGS.EXPERT_MODE) { GLOBAL.rotateModelsX = 0; GLOBAL.rotateModelsY = 0; //BASIC MODE EXHIBITION MODE if (this.SketchTools.getCurrentTool() != SketchTools.LEG_TOOL) GLOBAL.sketchChairs.getCurChair().selectedPlanes .add(GLOBAL.sketchChairs.getCurChair() .getSlicePlanesY()); } //rebuild cross selections widget every click if (SETTINGS.EXPERT_MODE) GLOBAL.slicesWidget .rebuild(GLOBAL.sketchChairs.getCurChair().crossSliceSelections); GLOBAL.undo.setMouseUpChair(GLOBAL.sketchChairs.getCurChair()); } void mouseSingleClick() { if(GLOBAL.uiTools.currentView != UITools.VIEW_CHAIR_EDIT) return; //Select planes with the select tool if ((!GLOBAL.gui.overComponent() && this.SketchTools.getCurrentTool() == SketchTools.SELECT_TOOL) || GLOBAL.previewWidget.isMouseOver()) { if(GLOBAL.uiTools.isSideView() && !GLOBAL.previewWidget.isMouseOver()){ GLOBAL.planesWidget.selectAllPlanes(null); GLOBAL.gui.reRender(); return; } Object obj = PickBuffer.getInstance().getObject(mouseX, mouseY); if (obj instanceof SlicePlane) { SlicePlane splane = (SlicePlane) obj; if (splane.getCrossSliceSelection() == null) { GLOBAL.planesWidget.planeClickedOn(splane); } else { if (GLOBAL.designToolbarAdvanced != null) GLOBAL.designToolbarAdvanced.selectTab("slices"); GLOBAL.slicesWidget.selectSlice(splane .getCrossSliceSelection()); } GLOBAL.previewWidget.rebuildPatternPreview(); } else { if(!GLOBAL.previewWidget.isMouseOver()){ GLOBAL.slicesWidget.unselectAll(); GLOBAL.planesWidget.unselectAll(); } } } //IF no planes are selected we can select one with the slat tools if((this.getCurrentTool() == UITools.SLICES_GROUP_SLICES || this.getCurrentTool() == UITools.SLICES_SINGLE_SLAT || this.getCurrentTool() == UITools.SLICES_SINGLE_SLICE || this.getCurrentTool() == UITools.SLICES_SLATSLICE_GROUP) && (GLOBAL.sketchChairs.getCurChair() != null && GLOBAL.sketchChairs.getCurChair().selectedPlanes.size() == 0) ){ Object obj = PickBuffer.getInstance().getObject(mouseX, mouseY); if (obj instanceof SlicePlane) { SlicePlane splane = (SlicePlane) obj; if (splane.getCrossSliceSelection() == null) { GLOBAL.planesWidget.planeClickedOn(splane); } } } GLOBAL.undo.setMouseUpChair(GLOBAL.sketchChairs.getCurChair()); //LOGGER.debug("mouseSingleClick()"+GLOBAL.sketchChairs.getCurChair().selectedPlanes.size()); GLOBAL.gui.reRender(); } void mouseDoubleClick() { if (!GLOBAL.gui.overComponent()) GLOBAL.sketchChairs.mouseDoubleClick(mouseX, mouseY); GLOBAL.undo.setMouseUpChair(GLOBAL.sketchChairs.getCurChair()); } public void newChair(GUIEvent e) { this.hybernateChairToFileAuto(e); } public void openChairFromFile(GUIEvent e) { GLOBAL.applet.selectInput("select design file.", "openChairFromFileCallback", null, this); } public void openChairFromFileCallback(File file) { GLOBAL.loadChairLocation = file.getAbsolutePath(); } public void openChairFromFileAuto(GUIEvent e) { // in response to a button click: if (GLOBAL.sketchChairs.getCurChair() != null) GLOBAL.sketchChairs.killAll(); String computername = functions.getComputerName(); String currentDir = new File(".").getAbsolutePath(); currentDir = currentDir.substring(0, currentDir.length() - 1); int id = SETTINGS.chairSaveNum; boolean nameFound = false; String location = null; while (!nameFound && id >= 0) { location = currentDir + "savedChairs\\" + computername + "_chair-" + id + ".cha"; File f = new File(location); if (f.exists()) { nameFound = true; } else { id--; } } LOGGER.info("Loading chair from: " + location); SETTINGS.chairSaveNum = (id - 1); if (location != null) load(location); else SETTINGS.chairSaveNum = 2000; } public void openEnvironmentFromFile(GUIEvent e) { GLOBAL.environments.openEnvironmentFromFile(e); } public void pasteChair() { LOGGER.info("paste"); if (GLOBAL.copyOfChair != null) { GLOBAL.sketchChairs.killAll(); GLOBAL.sketchChairs.add(GLOBAL.copyOfChair); GLOBAL.sketchChairs.getCurChair().build(); } } public void physicsPause(GUIEvent e) { GLOBAL.jBullet.physics_on = !GLOBAL.jBullet.physics_on; } public void physicsPlay(GUIEvent e) { GLOBAL.jBullet.physics_on = !GLOBAL.jBullet.physics_on; } public void physicsPlayPause(GUIEvent e) { if (!GLOBAL.jBullet.physics_on) { GLOBAL.jBullet.physics_on = true; } else { GLOBAL.jBullet.physics_on = false; } } public void physicsRewind(GUIEvent e) { GLOBAL.jBullet.resetCollisons(); GLOBAL.jBullet.physics_on = false; GLOBAL.person.resetPhysics(); if(GLOBAL.sketchChairs.getCurChair() != null) GLOBAL.sketchChairs.getCurChair().resetPhysics(); } public void print(GUIEvent e) { LOGGER.info("PRINT"); if (GLOBAL.sketchChairs.getCurChair() != null) { //GLOBAL.shapePack.empty(); //GLOBAL.sketchChairs.getCurChair().addToShapePack(); //GLOBAL.shapePack.build(); String currentDir = new File(".").getAbsolutePath(); currentDir = currentDir.substring(0, currentDir.length() - 1); int id = 0; boolean nameFound = false; String location = ""; location = currentDir + "print.pdf"; GLOBAL.pdfSaveLocation = location; GLOBAL.savePDF = true; GLOBAL.autoOpenPDF = true; } } void printOpen(String fileLoc) { // not compatible in JRE 1.5 Desktop desktop = null; // Before more Desktop API is used, first check // whether the API is supported by this particular // virtual machine (VM) on this particular host. if (Desktop.isDesktopSupported()) { desktop = Desktop.getDesktop(); File file = new File(fileLoc); try { desktop.open(file); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void redo(GUIEvent e) { // GLOBAL.undo.undo(); } public void removeSelectedPlanes(GUIEvent e) { if (GLOBAL.sketchChairs.getCurChair() != null) GLOBAL.sketchChairs.getCurChair().removeSelectedPlanes(); } void render(PGraphics g) { if(GLOBAL.gui.overComponent()){ ModalGUI.setCursor(GLOBAL.applet,SELECT_TOOL_CURSOR,15,9); return; } //are we rotating? maybe we should set a flag for this instead of testing the buttons? if(this.mouseDown && this.mouseButton == UITools.MOUSE_MIDDLE){ ModalGUI.setCursor(GLOBAL.applet,ROTATE_CAM_TOOL_CURSOR,17,16); this.hasCursorControl = true; return; } if(this.mouseDown && this.mouseButton == UITools.MOUSE_RIGHT){ ModalGUI.setCursor(GLOBAL.applet,MOVE_CAM_TOOL_CURSOR,16,16); this.hasCursorControl = true; return; } g.fill(255); g.ellipseMode(PApplet.CENTER); Vec2D physicsMousePos = this.getPointTranslated(new Vec2D(this.mouseX, this.mouseY)); // if ((this.SketchTools.getCurrentTool() == SketchTools.SELECT_TOOL || this.SketchTools.getCurrentTool() == SketchTools.DRAW_TOOL) && GLOBAL.person.mouseOver(physicsMousePos.x, physicsMousePos.y)) { ModalGUI.setCursor(GLOBAL.applet,MOVE_OBJECT_CURSOR, 16,16); return; } if (this.SketchTools.getCurrentTool() == SketchTools.SELECT_TOOL) { if (GLOBAL.sketchChairs.getCurChair() != null) { if (!GLOBAL.sketchChairs.getCurChair().overSelectPoint(mouseX, mouseY) && GLOBAL.sketchChairs.getCurChair().mouseOver( physicsMousePos.x, physicsMousePos.y)) { ModalGUI.setCursor(GLOBAL.applet,MOVE_OBJECT_CURSOR, 16,16); this.hasCursorControl = true; return; } } } if (this.getCurrentTool() == UITools.MOVE_CAM_TOOL) { ModalGUI.setCursor(GLOBAL.applet,MOVE_CAM_TOOL_CURSOR,16,16); this.hasCursorControl = true; return; } else if (this.getCurrentTool() == UITools.ROTATE_CAM_TOOL) { ModalGUI.setCursor(GLOBAL.applet,ROTATE_CAM_TOOL_CURSOR,16,16); this.hasCursorControl = true; return; } else if (this.getCurrentTool() == UITools.ZOOM_CAM_TOOL) { ModalGUI.setCursor(GLOBAL.applet,ZOOM_CAM_TOOL_CURSOR,15,14); this.hasCursorControl = true; return; } else if (this.getCurrentTool() == UITools.SLICES_GROUP_SLICES || this.getCurrentTool() == UITools.SLICES_SINGLE_SLAT || this.getCurrentTool() == UITools.SLICES_SINGLE_SLICE || this.getCurrentTool() == UITools.SLICES_SLATSLICE_GROUP || this.getCurrentTool() == UITools.SLICES_EDIT) { if(sliceToolMode == UITools.SLICE_EDIT_MODE_ADD){ ModalGUI.setCursor(GLOBAL.applet,CURSOR_ADD_SLICE,5,7); this.hasCursorControl = true; return; } if(sliceToolMode == UITools.SLICE_EDIT_MODE_POS){ ModalGUI.setCursor(GLOBAL.applet,CURSOR_EDIT_SLICE_POS,5,7); this.hasCursorControl = true; return; } if(sliceToolMode == UITools.SLICE_EDIT_MODE_SPACING){ ModalGUI.setCursor(GLOBAL.applet,CURSOR_EDIT_SLICE_SPACING,5,7); this.hasCursorControl = true; return; } } //CURSOR_EDIT_SLICE_POS this.hasCursorControl = false; this.SketchTools.render(g); /* if (!GLOBAL.gui.overComponent() || this.selectCooldown > 0) { if (this.getCurrentTool() == DRAW_TOOL) { g.noFill(); g.stroke(100, 100, 100); //LOGGER.info("SET CURSOR D"); if(this.loadedCursor != DRAW_TOOL){ GLOBAL.applet.cursor(UITools.DRAW_TOOL_CURSOR, 1,1); this.loadedCursor = DRAW_TOOL; } return; } else if (this.getCurrentTool() == LEG_TOOL) { if(this.loadedCursor != DRAW_TOOL){ GLOBAL.applet.cursor(UITools.DRAW_TOOL_CURSOR, 1,1); this.loadedCursor = DRAW_TOOL; } } else if (this.getCurrentTool() == SELECT_TOOL) { if(this.loadedCursor != SELECT_TOOL){ GLOBAL.applet.cursor(UITools.SELECT_TOOL_CURSOR, 1,1); this.loadedCursor = SELECT_TOOL; } //g.image(UITools.SELECT_TOOL_CURSOR, mouseX - 10, mouseY - 8); } else if (this.getCurrentTool() == ADD_DOLL_TOOL) { if(this.loadedCursor != ADD_DOLL_TOOL){ GLOBAL.applet.cursor(ADD_DOLL_TOOL_CURSOR, 1,1); this.loadedCursor = ADD_DOLL_TOOL; } } else if (this.getCurrentTool() == UITools.MOVE_CAM_TOOL) { if(this.loadedCursor != MOVE_CAM_TOOL){ GLOBAL.applet.cursor(MOVE_CAM_TOOL_CURSOR, 1,1); this.loadedCursor = MOVE_CAM_TOOL; } } else if (this.getCurrentTool() == UITools.ROTATE_CAM_TOOL) { if(this.loadedCursor != ROTATE_CAM_TOOL){ GLOBAL.applet.cursor(ROTATE_CAM_TOOL_CURSOR, 1,1); this.loadedCursor = ROTATE_CAM_TOOL; } } else if (this.getCurrentTool() == UITools.ZOOM_CAM_TOOL) { if(this.loadedCursor != ZOOM_CAM_TOOL){ GLOBAL.applet.cursor(ZOOM_CAM_TOOL_CURSOR, 1,1); this.loadedCursor = ZOOM_CAM_TOOL; } } else if (this.getCurrentTool() == UITools.LEG_TOOL) { if(this.loadedCursor != LEG_TOOL){ GLOBAL.applet.cursor(LINE_TOOL_CURSOR, 1,1); this.loadedCursor = LEG_TOOL; } } else if (this.getCurrentTool() == UITools.SCALE_PERSON_TOOL) { if(this.loadedCursor != SCALE_PERSON_TOOL){ GLOBAL.applet.cursor(ADD_DOLL_TOOL_CURSOR, 1,1); this.loadedCursor = SCALE_PERSON_TOOL; } } else if (this.getCurrentTool() == UITools.MOVE_OBJECT) { if(this.loadedCursor != MOVE_OBJECT){ GLOBAL.applet.cursor(ADD_DOLL_TOOL_CURSOR, 1,1); this.loadedCursor = MOVE_OBJECT; } } else if (this.getCurrentTool() == UITools.SCALE_TOOL) { if(this.loadedCursor != SCALE_TOOL){ GLOBAL.applet.cursor(SCALE_TOOL_CURSOR, 1,1); this.loadedCursor = SCALE_TOOL; } } else if (this.getCurrentTool() == UITools.MEASURE_TOOL) { if(this.loadedCursor != MEASURE_TOOL){ GLOBAL.applet.cursor(MEASURE_TOOL_CURSOR, 1,1); this.loadedCursor = MEASURE_TOOL; } } else if (this.getCurrentTool() == UITools.MOVE_2D_TOOL) { if(this.loadedCursor != MOVE_2D_TOOL){ GLOBAL.applet.cursor(MOVE_CAM_TOOL_CURSOR, 1,1); this.loadedCursor = MOVE_2D_TOOL; } } else { if(this.loadedCursor != SELECT_TOOL){ GLOBAL.applet.cursor(UITools.SELECT_TOOL_CURSOR, 1,1); this.loadedCursor = SELECT_TOOL; } // // g.fill(255,0,0); // g.ellipse(UI.mouseX , UI.mouseY ,2,2); } } else { if(this.loadedCursor != SELECT_TOOL){ // GLOBAL.applet.cursor(UITools.SELECT_TOOL_CURSOR, 1,1); // this.loadedCursor = SELECT_TOOL; } } */ // g.image(this.pickBuffer,0,0); } void renderGrid(PGraphics g) { if (this.useGrid && this.gridWidth * GLOBAL.getZOOM() > 2) { g.stroke(SETTINGS.GRID_MAJOR_LINE); g.strokeWeight(SETTINGS.GRID_MAJOR_LINE_WEIGHT); //float offset_x = GLOBAL.CAM_OFFSET_X % (this.gridWidth); //calculate the number of grid squares between the centre of the screen and the edge to see where our grid should start double offset_x = (GLOBAL.windowWidth / 2) - (Math.floor((GLOBAL.windowWidth / 2) / (this.gridWidth * GLOBAL.getZOOM())) * this.gridWidth * GLOBAL.getZOOM()); offset_x = (((GLOBAL.CAM_OFFSET_X * GLOBAL.getZOOM()) + offset_x) % (this.gridWidth * GLOBAL .getZOOM())) - this.gridWidth * GLOBAL.getZOOM(); for (float x = (float) offset_x; x < GLOBAL.windowWidth; x += this.gridWidth * GLOBAL.getZOOM()) { g.stroke(SETTINGS.GRID_MAJOR_LINE); g.strokeWeight(SETTINGS.GRID_MAJOR_LINE_WEIGHT); g.line(x, 0, x, GLOBAL.windowHeight); if (this.gridWidth * GLOBAL.getZOOM() > minorGridnumber * 5) { g.stroke(SETTINGS.GRID_MINOR_LINE); g.strokeWeight(SETTINGS.GRID_MINOR_LINE_WEIGHT); for (float x2 = (float) (x + (this.gridWidth * GLOBAL.getZOOM()) / minorGridnumber); x2 < x + this.gridWidth * GLOBAL.getZOOM(); x2 += (this.gridWidth * GLOBAL .getZOOM()) / minorGridnumber) { g.line(x2, 0, x2, GLOBAL.windowHeight); } } } double offset_y = (GLOBAL.windowHeight / 2) - (Math.floor((GLOBAL.windowHeight / 2) / (this.gridHeight * GLOBAL.getZOOM())) * this.gridHeight * GLOBAL.getZOOM()); offset_y = (((GLOBAL.CAM_OFFSET_Y * GLOBAL.getZOOM()) + offset_y) % (this.gridHeight * GLOBAL .getZOOM())) - this.gridHeight * GLOBAL.getZOOM(); // Y offset for (float y = (float) offset_y; y < GLOBAL.windowHeight; y += this.gridHeight * GLOBAL.getZOOM()) { g.stroke(SETTINGS.GRID_MAJOR_LINE); g.strokeWeight(SETTINGS.GRID_MAJOR_LINE_WEIGHT); g.line(0, y, GLOBAL.windowWidth, y); if (this.gridWidth * GLOBAL.getZOOM() > minorGridnumber * 5) { g.stroke(SETTINGS.GRID_MINOR_LINE); g.strokeWeight(SETTINGS.GRID_MINOR_LINE_WEIGHT); for (float y2 = (float) (y + (this.gridHeight * GLOBAL.getZOOM()) / minorGridnumber); y2 < y + this.gridWidth * GLOBAL.getZOOM(); y2 += (this.gridHeight * GLOBAL .getZOOM()) / minorGridnumber) { g.line(0, y2, GLOBAL.windowWidth, y2); } } } } } public void reset(GUIEvent e) { GLOBAL.forceResize = true; GLOBAL.setZOOM(.5f); GLOBAL.CAM_OFFSET_X = -400; GLOBAL.CAM_OFFSET_Y = (float) -((700 - GLOBAL.windowHeight) + 900); GLOBAL.autoRotate = false; //GLOBAL.forceResize = true; /* GLOBAL.resetting = true; if(!SETTINGS.APPLET_MODE){ this.saveChairToFileAuto(null); this.captureScreen(null); GLOBAL.applet.draw(); } */ //GLOBAL.gui.reset(); // GLOBAL.applet.removeAll(); //GLOBAL.person.resetPhysics(); //GLOBAL.forceReset = true; this.currentView = UITools.VIEW_CHAIR_EDIT; SETTINGS.EXPERT_MODE = false; GLOBAL.displayIntroPanel = true; GLOBAL.gui.reload(); GLOBAL.gui.reset(); if (SETTINGS.EXPERT_MODE) UI.setupGUITabsExpert(GLOBAL.applet, GLOBAL.gui); if (!SETTINGS.EXPERT_MODE) UI.setupGUITabsBasic(GLOBAL.applet, GLOBAL.gui); GLOBAL.sketchChairs.killAll(); GLOBAL.jBullet = new jBullet(); GLOBAL.person = new ergoDoll(GLOBAL.jBullet.myWorld, new Vector3f(-80, -10, 0), 1f); this.physicsRewind(null); //GLOBAL.applet.setup(); //GLOBAL.resetting = false; SETTINGS_SKETCH.plane_thickness = SETTINGS_SKETCH.plane_thickness_default; } public void saveChairToFile(GUIEvent e) { GLOBAL.saveChairToFile = true; } public void saveChairToFile() { if (SETTINGS.APPLET_MODE) { try { FileSaveService save = (FileSaveService) ServiceManager .lookup("javax.jnlp.FileSaveService"); Element root = new Element("SketchChairDoc"); root.addAttribute(new Attribute("version", String .valueOf(SETTINGS.version))); root.appendChild(GLOBAL.sketchChairs.getCurChair().toXML()); Document doc = new Document(root); // outXML = ;// new FileOutputStream(name+".xml"); ByteArrayOutputStream outXML = new ByteArrayOutputStream(); Serializer serializer = new Serializer(outXML, "ISO-8859-1"); serializer.write(doc); FileContents fc = save.saveFileDialog(null, new String[] { "chair" }, new ByteArrayInputStream( outXML.toByteArray()), null); } catch (Exception ex) { LOGGER.error("exception: " + ex); } } else { //Create a file chooser GLOBAL.applet.selectOutput("select design file.", "saveChairToFileCallback", null, this); } } public void savePattern(GUIEvent e) { this.savePatternToFile(); } public void savePatternToFile() { if (SETTINGS.APPLET_MODE) { try { FileSaveService save = (FileSaveService) ServiceManager .lookup("javax.jnlp.FileSaveService"); Element root = new Element("SketchChairDoc"); root.addAttribute(new Attribute("version", String .valueOf(SETTINGS.version))); root.appendChild(GLOBAL.sketchChairs.getCurChair().toXML()); Document doc = new Document(root); // outXML = ;// new FileOutputStream(name+".xml"); ByteArrayOutputStream outXML = new ByteArrayOutputStream(); Serializer serializer = new Serializer(outXML, "ISO-8859-1"); serializer.write(doc); FileContents fc = save.saveFileDialog(null, new String[] { "chair" }, new ByteArrayInputStream( outXML.toByteArray()), null); } catch (Exception ex) { LOGGER.error("exception: " + ex); } } else { //Create a file chooser GLOBAL.applet.selectOutput("select design file.", "savePatternToFileCallback", null, this); } } public void saveChairToFileCallback(File file) { GLOBAL.saveChairLocation = file.getAbsolutePath(); if(!GLOBAL.saveChairLocation.endsWith(".skchr")) GLOBAL.saveChairLocation += ".skchr"; } public void savePatternToFileCallback(File file) { GLOBAL.savePatternLocation = file.getAbsolutePath(); if(!GLOBAL.savePatternLocation.endsWith(".svg")) GLOBAL.savePatternLocation += ".svg"; } public void saveChairToFileAuto(GUIEvent e) { GLOBAL.saveChairToFileAuto = true; } public void saveChairToFileAuto() { if (GLOBAL.sketchChairs.getCurChair() != null) { if(GLOBAL.sketchChairs.getCurChair().localSavelocation == null){ this.saveChairToFile(); return; } GLOBAL.sketchChairs.getCurChair().addToShapePack(); String location = ""; int id = 0; if (GLOBAL.sketchChairs.getCurChair().localSavelocation != null) { location = GLOBAL.sketchChairs.getCurChair().localSavelocation; } else { String computername = functions.getComputerName(); String currentDir = new File(".").getAbsolutePath(); currentDir = currentDir.substring(0, currentDir.length() - 1); boolean nameFound = false; while (!nameFound && id < 10000) { location = currentDir + "savedChairs\\chair-" + id + ".xml"; GLOBAL.sketchChairs.getCurChair().localSavelocation = location; File f = new File(location); if (!f.exists()) nameFound = true; id++; } } save(location); //System.out.println("saving to " + location); SETTINGS.chairSaveNum = id; GLOBAL.LAST_SAVED_LOCATION = location; } } public void saveCraftRobo(GUIEvent e) { if (GLOBAL.sketchChairs.getCurChair() != null) GLOBAL.sketchChairs.getCurChair().addToShapePack(); // GLOBAL.shapePack.build(); GLOBAL.shapePack.printToCraftRobo(); } public void saveModelDxf(GUIEvent e) { GLOBAL.dxfCapture = true; if (SETTINGS.APPLET_MODE) { FileSaveService save; try { save = (FileSaveService) ServiceManager .lookup("javax.jnlp.FileSaveService"); GLOBAL.shapePack.build(); FileContents fc = save.saveFileDialog(null, new String[] { "pdf" }, new ByteArrayInputStream( GLOBAL.shapePack.getPDFBuffered(GLOBAL.applet) .toByteArray()), null); } catch (UnavailableServiceException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } else { GLOBAL.applet.selectOutput("select design file.", "saveModelDxfCallback", null, this); } } public void saveModelDxfCallback(File file) { GLOBAL.dxfLocation = file.getAbsolutePath(); GLOBAL.dxfCapture = true; } public void savePatternDXF(GUIEvent e) { if (GLOBAL.sketchChairs.getCurChair() != null) GLOBAL.sketchChairs.getCurChair().addToShapePack(); if (SETTINGS.APPLET_MODE) { FileSaveService save; try { save = (FileSaveService) ServiceManager .lookup("javax.jnlp.FileSaveService"); GLOBAL.shapePack.build(); FileContents fc = save.saveFileDialog(null, new String[] { "dxf" }, new ByteArrayInputStream( GLOBAL.shapePack.getDXFBuffered(GLOBAL.applet) .toByteArray()), null); } catch (UnavailableServiceException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } else { //GLOBAL.shapePack.printToCraftRobo(); GLOBAL.applet.selectOutput("select design file.", "savePatternDXFCallback", null, this); } } public void savePatternDXFCallback(File file) { GLOBAL.dxfSaveLocation = file.getAbsolutePath(); GLOBAL.saveDXF = true; if(!GLOBAL.dxfSaveLocation.endsWith(".dxf")) GLOBAL.dxfSaveLocation += ".dxf"; } public void savePDF(GUIEvent e) { if (GLOBAL.sketchChairs.getCurChair() != null) GLOBAL.sketchChairs.getCurChair().addToShapePack(); if (SETTINGS.APPLET_MODE) { FileSaveService save; try { save = (FileSaveService) ServiceManager .lookup("javax.jnlp.FileSaveService"); GLOBAL.shapePack.build(); FileContents fc = save.saveFileDialog(null, new String[] { "pdf" }, new ByteArrayInputStream( GLOBAL.shapePack.getPDFBuffered(GLOBAL.applet) .toByteArray()), null); } catch (UnavailableServiceException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } else { //GLOBAL.shapePack.printToCraftRobo(); //Create a file chooser GLOBAL.applet.selectOutput("select design file.", "savePDFCallback", null, this); } } public void savePDFCallback(File file) { String filename = file.getAbsolutePath(); if (!filename.endsWith("pdf")) filename += ".pdf"; GLOBAL.pdfSaveLocation = filename; GLOBAL.savePDF = true; } public void layersSelectNext(GUIEvent e){ if (GLOBAL.sketchChairs.getCurChair() != null) { GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber++; if(GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber >= GLOBAL.sketchChairs.getCurChair().getSlicePlanesY().size()){ if(GLOBAL.planesWidget.mirrorSelection && GLOBAL.sketchChairs.getCurChair().getSlicePlanesY().size()>1) GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber = 1; else GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber = 0; } GLOBAL.planesWidget.planeClickedOn(GLOBAL.sketchChairs.getCurChair().getSlicePlanesY().get(GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber)); } } public void layersSelectPrev(GUIEvent e){ if (GLOBAL.sketchChairs.getCurChair() != null) { GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber--; if(GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber < 0){ if(GLOBAL.planesWidget.mirrorSelection && GLOBAL.sketchChairs.getCurChair().getSlicePlanesY().size()>1) GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber = GLOBAL.sketchChairs.getCurChair().getSlicePlanesY().size()-1; else GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber = GLOBAL.sketchChairs.getCurChair().getSlicePlanesY().size(); } GLOBAL.planesWidget.planeClickedOn(GLOBAL.sketchChairs.getCurChair().getSlicePlanesY().get(GLOBAL.sketchChairs.getCurChair().selectedPlaneNumber)); } } public void exportPreview(GUIEvent e) { if (SETTINGS.APPLET_MODE) { } else { //Create a file chooser GLOBAL.applet.selectOutput("select design file.", "exportPreviewCallback", null, this); } } public void exportPreviewCallback(File file) { String filename = file.getAbsolutePath(); if (!filename.endsWith("png")) filename += ".png"; GLOBAL.pngPreviewSaveLocation = filename; GLOBAL.exportPreviewPNG = true; } public void savePDFauto(GUIEvent e) { if (GLOBAL.sketchChairs.getCurChair() != null) GLOBAL.sketchChairs.getCurChair().addToShapePack(); String computername = functions.getComputerName(); String currentDir = new File(".").getAbsolutePath(); currentDir = currentDir.substring(0, currentDir.length() - 1); int id = 0; boolean nameFound = false; String location = ""; String dropBoxDir = SETTINGS.autoSaveMakeLocation; while (!nameFound && id < 10000) { location = dropBoxDir + "/" + "_exhibitionChair-" + id + ".pdf"; File f = new File(location); if (!f.exists()) nameFound = true; id++; } LOGGER.info("Saving PDF to: " + location); GLOBAL.pdfSaveLocation = location; GLOBAL.savePDF = true; SETTINGS.chairSaveNum++; } public void selectLanguage(GUIEvent e) { if (e.val == UITools.LANGUAGE_ENG) { SETTINGS.LANGUAGE = "ENG"; GLOBAL.modeChanged = true; } if (e.val == UITools.LANGUAGE_JP) { SETTINGS.LANGUAGE = "JP"; GLOBAL.modeChanged = true; } } public void setDisplaypanelAsShown(GUIEvent e) { GLOBAL.displayIntroPanel = false; } public void selectLegPlanes(GUIEvent e) { if (GLOBAL.sketchChairs.getCurChair() != null) { GLOBAL.sketchChairs.getCurChair().selectedPlanes.clear(); GLOBAL.sketchChairs.getCurChair().selectedPlanes .add(GLOBAL.sketchChairs.getCurChair().getSlicePlanesY() .getFirst()); GLOBAL.sketchChairs.getCurChair().selectedPlanes .add(GLOBAL.sketchChairs.getCurChair().getSlicePlanesY() .getLast()); } } public void selectTool(GUIEvent e) { this.selectTool((int) e.val); this.selectCooldown = 50; } public void makeChairWindow(GUIEvent e) { float windowWidth = SETTINGS.GUIDE_WINDOW_WIDTH; float windowHeight = SETTINGS.GUIDE_WINDOW_HEIGHT; GUIWindow window = new GUIWindow(0f, 0f, windowWidth, windowHeight, GLOBAL.gui); window.setLightboxed(true); window.centre(); GLOBAL.gui.add(window); float posX = 100; float posY = 100; float spacingY = 80; GUIImage guiImg; guiImg = new GUIImage(0, 50, "gui/WINDOW_TITLE_MAKE.png", GLOBAL.gui); window.add(guiImg); GUIButton button; button = new GUIToggle(400, 50, "gui/WINDOW_MAKE_PREVIEW_PATTERN.png", GLOBAL.gui); button.addActionListener(GLOBAL.uiTools, "toggleView", UITools.LEG_TOOL); button.addActionListener(window, "close", UITools.LEG_TOOL); window.add(button); posY += spacingY; button = new GUIToggle(400, 200, "gui/WINDOW_MAKE_CUT_PATTERN.png", GLOBAL.gui); button.addActionListener(window, "close", UITools.LEG_TOOL); if (SETTINGS.autoSaveMakePattern) button.addActionListener(GLOBAL.uiTools, "savePDFauto", UITools.LEG_TOOL); else button.addActionListener(GLOBAL.uiTools, "print", UITools.LEG_TOOL); window.add(button); posY += spacingY; } public void selectTool(int toolNum) { setCurrentTool(toolNum); if (this.getCurrentTool() == UITools.SELECT_TOOL && !SETTINGS.EXPERT_MODE) { if (GLOBAL.sketchChairs.getCurChair() != null) { GLOBAL.sketchChairs.getCurChair().selectedPlanes.clear(); GLOBAL.sketchChairs.getCurChair().selectedPlanes .add(GLOBAL.sketchChairs.getCurChair() .getSlicePlanesY()); } } //GLOBAL.forceResize = true; // System.out.print(toolNum); } public void setBrushDia(float val) { GLOBAL.uiTools.SketchTools.brush_dia = val; if (GLOBAL.sketchChairs.getCurChair() != null) GLOBAL.sketchChairs.getCurChair().setBrushDia(val); } public void setChairColour(GUIEvent e) { if (GLOBAL.sketchChairs.getCurChair() != null) { GLOBAL.sketchChairs.getCurChair().chairColour = (int) e.val; } } /** * @param currentTool the currentTool to set */ public void setCurrentTool(int currentTool) { this.SketchTools.selectTool(SketchTools.NONE); this.currentTool = currentTool; } /** * @param editing the editing to set */ public void setEditing(int editing) { this.editing = editing; } /** * @param pickBuffer the pickBuffer to set */ public void setPickBuffer(PGraphics pickBuffer) { this.pickBuffer = pickBuffer; } public void showBugsWebpage(GUIEvent e) { String url = "http://www.sketchchair.cc/forum/index.php?board=8.0"; if (java.awt.Desktop.isDesktopSupported()) { try { // not compatible in JRE 1.5 java.awt.Desktop.getDesktop().browse(java.net.URI.create(url)); } catch (IOException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } } } public void showForumWebpage(GUIEvent e) { String url = "http://www.sketchchair.cc/forum/"; if (java.awt.Desktop.isDesktopSupported()) { try { // not compatible in JRE 1.5 java.awt.Desktop.getDesktop().browse(java.net.URI.create(url)); } catch (IOException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } } } public void showInstructionMovie(GUIEvent e) { //GLOBAL.tittleImageNum = 0; //GLOBAL.myMovie = new FasterMovie(GLOBAL.applet,"./introVideos/"+GLOBAL.tittleImageNum+".mov"); //GLOBAL.myMovie.loop(); } public void showInstructions(GUIEvent e) { GLOBAL.tittleImageNum = 0; GLOBAL.tittleImg = GLOBAL.applet.loadImage("./tittleImage/" + GLOBAL.tittleImageNum + SETTINGS.LANGUAGE + ".jpg"); } public void showReferenceWebpage(GUIEvent e) { String url = "http://www.sketchchair.cc/development/description-of-features/"; if (java.awt.Desktop.isDesktopSupported()) { try { // not compatible in JRE 1.5 java.awt.Desktop.getDesktop().browse(java.net.URI.create(url)); } catch (IOException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } } } public void sitStand(GUIEvent e) { if (!GLOBAL.jBullet.physics_on) { GLOBAL.jBullet.physics_on = true; } else { this.physicsRewind(null); GLOBAL.jBullet.physics_on = false; } } public void toggleCentreConstraintChair(GUIEvent e) { if (GLOBAL.sketchChairs.getCurChair() != null) GLOBAL.sketchChairs.getCurChair().toggleCentreConstraint(); } public void figureGrow(GUIEvent e) { GLOBAL.person.bigger(); } public void figureShrink(GUIEvent e) { GLOBAL.person.smaller(); } public void toggleExpert(GUIEvent e) { SETTINGS.EXPERT_MODE = !SETTINGS.EXPERT_MODE; if(this.currentView == UITools.VIEW_CHAIR_EDIT) { if (SETTINGS.EXPERT_MODE) { UI.setupGUITabsExpert(GLOBAL.applet, GLOBAL.gui); } else { UI.setupGUITabsBasic(GLOBAL.applet, GLOBAL.gui); } } if (GLOBAL.slicesWidget != null && GLOBAL.sketchChairs.getCurChair() != null) GLOBAL.slicesWidget .rebuild(GLOBAL.sketchChairs.getCurChair().crossSliceSelections); GLOBAL.forceResize = true; } public void togglePerformance(GUIEvent e) { GLOBAL.performanceMode = !GLOBAL.performanceMode; GLOBAL.gui.performanceMode = GLOBAL.performanceMode; if (GLOBAL.gui.performanceMode) { SETTINGS.cylinder_res = 4; SETTINGS.sphere_res = 9; } else { SETTINGS.cylinder_res = 12; SETTINGS.sphere_res = 7; } } public void togglePerson(GUIEvent e) { GLOBAL.person.toggleON(); } public void toggleFloor(GUIEvent e){ GLOBAL.floorOn = !GLOBAL.floorOn; } public void toggleReferenceGeom(GUIEvent e) { GLOBAL.environments.render = !GLOBAL.environments.render; } public void toggleGrid(GUIEvent e) { LOGGER.info("snap to grid"); this.useGrid = !this.useGrid; this.SketchTools.useGrid = !this.SketchTools.useGrid ; } public void importSVG(GUIEvent e) { GLOBAL.applet.selectInput("select design file.", "importSVGCallback", null, this); } public void importSVGCallback(File file) { GLOBAL.importSVGLocation = file.getAbsolutePath(); } public void applyMaterialSettings(GUIEvent e) { if(GLOBAL.sketchChairs.getCurChair() != null) GLOBAL.sketchChairs.getCurChair().addToShapePack(); //LOGGER.info("applyMaterialSettings"); } public void toggleView(GUIEvent e) { System.gc();//clean up before we hit the memory if (this.currentView == UITools.VIEW_CHAIR_EDIT) this.currentView = UITools.VIEW_SHAPE_PACK; else this.currentView = UITools.VIEW_CHAIR_EDIT; if (this.currentView == UITools.VIEW_SHAPE_PACK) { UI.setupGUIPattern(GLOBAL.applet, GLOBAL.gui); GLOBAL.sketchChairs.getCurChair().getSlicePlanesY().update(); GLOBAL.sketchChairs.getCurChair().addToShapePack(); }else{ if(SETTINGS.EXPERT_MODE) UI.setupGUITabsExpert(GLOBAL.applet, GLOBAL.gui); else UI.setupGUITabsBasic(GLOBAL.applet, GLOBAL.gui); if(GLOBAL.designToolbarPattern != null) GLOBAL.designToolbarPattern.hide(); if(GLOBAL.designToolbarBasic != null) GLOBAL.designToolbarBasic.show(); if(GLOBAL.designToolbarAdvanced != null) GLOBAL.designToolbarAdvanced.show(); } } public void viewPattern(GUIEvent e) { GLOBAL.previewWidget.makeItBtn.hide(); GLOBAL.previewWidget.designItBtn.hide(); GLOBAL.patternCameraPanel.show(); GLOBAL.cameraPanel.hide(); this.currentView = UITools.VIEW_SHAPE_PACK; UI.setupGUIPattern(GLOBAL.applet, GLOBAL.gui); GLOBAL.sketchChairs.getCurChair().getSlicePlanesY().update(); GLOBAL.sketchChairs.getCurChair().addToShapePack(); } public void viewModel(GUIEvent e) { GLOBAL.previewWidget.makeItBtn.show(); GLOBAL.previewWidget.designItBtn.hide(); GLOBAL.patternCameraPanel.hide(); GLOBAL.cameraPanel.show(); this.currentView = UITools.VIEW_CHAIR_EDIT; if(SETTINGS.EXPERT_MODE) UI.setupGUITabsExpert(GLOBAL.applet, GLOBAL.gui); else UI.setupGUITabsBasic(GLOBAL.applet, GLOBAL.gui); } public void undo(GUIEvent e) { System.out.print("UNDO"); GLOBAL.undo.undoChair(GLOBAL.sketchChairs.getCurChair()); } public void ShareChairOnline(GUIEvent e) { SketchChairCloudhook.getInstance().ShareChairOnline(null); } void update() { updateVecMove(); if(GLOBAL.autoRotate){ GLOBAL.slicesWidget.unselectAll(); GLOBAL.planesWidget.unselectAll(); } if (this.SketchTools.getCurrentTool() != SketchTools.NONE) this.currentTool = NONE; //if(this.waitingForSingleClick) // LOGGER.info("waitingForSingleClick"+(GLOBAL.applet.millis() - this.mousePressedTime)); if((GLOBAL.applet.millis() - this.mousePressedTime) > SETTINGS.MOUSE_CLICKED_MIN_TIME ) this.waitingForSingleClick = false; if (this.waitingForSingleClick && (GLOBAL.applet.millis() - this.mousePressedTime) < SETTINGS.MOUSE_CLICKED_MIN_TIME && (mouseX == pmouseX && mouseY == pmouseY) ){ this.mouseSingleClick(); waitingForSingleClick = false; } this.selectCooldown--; } public void updateMouse(int mouseX2, int mouseY2, int pmouseX2, int pmouseY2, boolean mouseDown2, int mouseButton2) { GLOBAL.uiTools.pmouseX = GLOBAL.uiTools.mouseX; GLOBAL.uiTools.pmouseY = GLOBAL.uiTools.mouseY; GLOBAL.uiTools.mouseX = mouseX2; GLOBAL.uiTools.mouseY = mouseY2; GLOBAL.uiTools.mouseDown = mouseDown2; GLOBAL.uiTools.mouseButton = mouseButton2; if (this.useGrid ) { float m_gridW = this.gridWidth; float m_gridH = this.gridHeight; if (this.gridWidth * GLOBAL.getZOOM() > minorGridnumber * 5) { m_gridW /= minorGridnumber; m_gridH /= minorGridnumber; } //calculate the number of grid squares between the centre of the screen and the edge to see where our grid should start float offset_x = (float) (Math.round((((float)mouseX2 - ((float)GLOBAL.windowWidth / 2.0f)) / (m_gridW * GLOBAL.getZOOM()))) * (m_gridW * GLOBAL.getZOOM())); offset_x +=(float)(GLOBAL.windowWidth / 2)+ ((GLOBAL.CAM_OFFSET_X * GLOBAL.getZOOM()) % (m_gridW * GLOBAL.getZOOM())); float offset_y = (float) (Math.round((((float)mouseY2 - ((float)GLOBAL.windowHeight / 2.0f)) / (m_gridH * GLOBAL.getZOOM()))) * (m_gridH * GLOBAL.getZOOM())); offset_y += (float)(GLOBAL.windowHeight / 2)+ ((GLOBAL.CAM_OFFSET_Y * GLOBAL.getZOOM()) % (m_gridH * GLOBAL.getZOOM())); int newMouseX = (int) offset_x; int newMouseY = (int) offset_y; GLOBAL.uiTools.mouseX = newMouseX; GLOBAL.uiTools.mouseY = newMouseY; } } public void updateMouseWorld() { GLOBAL.uiTools.pmouseXworld = GLOBAL.uiTools.mouseXworld; GLOBAL.uiTools.pmouseYworld = GLOBAL.uiTools.mouseYworld; Vec2D MouseWorld = this.getPointTranslated(new Vec2D(this.mouseX, this.mouseY)); GLOBAL.uiTools.mouseXworld = MouseWorld.x; GLOBAL.uiTools.mouseYworld = MouseWorld.y; } void updateVecMove() { /* if (selectedVec != null && selectedVecPlane != null) { // System.out.println(selectedVec.x); if (UI.mouseDown) { //Vec2D planePoint = getPointOnPlane(new Vec2D(UI.mouseX, UI.mouseY), this.selectedVecPlane, GLOBAL.g); // selectedVec.x += (UI.mouseX - UI.pmouseX) / GLOBAL.ZOOM; // selectedVec.y += (UI.mouseY - UI.pmouseY) / GLOBAL.ZOOM; if (planePoint != null) { // selectedVec.x = planePoint.x; // / selectedVec.y = planePoint.y; if (this.selectedShape != null) { this.selectedShape.movePoint(selectedVec, planePoint); } } // } } */ } boolean isSideView(){ return(GLOBAL.rotateModelsX == 0 && GLOBAL.rotateModelsY == 0); } void zoomView(float _zoomDelta){ float deltaMouseXBefore = (float) (((GLOBAL.applet.width/2)-UI.mouseX)/GLOBAL.ZOOM); float deltaMouseYBefore = (float) (((GLOBAL.applet.height/2)-UI.mouseY)/GLOBAL.ZOOM); GLOBAL.ZOOM -= _zoomDelta; if( (_zoomDelta > 0 && GLOBAL.ZOOM < SETTINGS.MIN_ZOOM)){ GLOBAL.ZOOM = SETTINGS.MIN_ZOOM; } if(_zoomDelta < 0 && GLOBAL.ZOOM > SETTINGS.MAX_ZOOM){ GLOBAL.ZOOM = SETTINGS.MAX_ZOOM; } float deltaMouseXAfter = (float) (((GLOBAL.applet.width/2)-UI.mouseX)/GLOBAL.ZOOM); float deltaMouseYAfter = (float) (((GLOBAL.applet.height/2)-UI.mouseY)/GLOBAL.ZOOM); float deltaMouseX = deltaMouseXAfter - deltaMouseXBefore; float deltaMouseY = deltaMouseYAfter - deltaMouseYBefore; moveView(-deltaMouseX,-deltaMouseY); } void centreView(float _x, float _y){ float deltaMouseX = (GLOBAL.applet.width/2)-_x; float deltaMouseY = (GLOBAL.applet.height/2)-_y; GLOBAL.CAM_OFFSET_X += ((deltaMouseX/GLOBAL.ZOOM)); GLOBAL.CAM_OFFSET_Y += ((deltaMouseY/GLOBAL.ZOOM)); } void moveView(float _deltaX, float _deltaY){ GLOBAL.CAM_OFFSET_X += _deltaX; GLOBAL.CAM_OFFSET_Y += _deltaY; float leftEdge = (float) (GLOBAL.CAM_OFFSET_X - ((GLOBAL.applet.width/2)/GLOBAL.ZOOM)); if(leftEdge < SETTINGS.MIN_CAM_X_OFFSET) GLOBAL.CAM_OFFSET_X = SETTINGS.MIN_CAM_X_OFFSET + ((GLOBAL.applet.width/2)/GLOBAL.ZOOM); float rightEdge = (float) (GLOBAL.CAM_OFFSET_X + ((GLOBAL.applet.width/2)/GLOBAL.ZOOM)); if(rightEdge > SETTINGS.MAX_CAM_X_OFFSET) GLOBAL.CAM_OFFSET_X = SETTINGS.MAX_CAM_X_OFFSET - ((GLOBAL.applet.width/2)/GLOBAL.ZOOM); double topEdge = (double) GLOBAL.CAM_OFFSET_Y + ((GLOBAL.applet.height/2)/GLOBAL.ZOOM); if(topEdge > SETTINGS.MAX_CAM_Y_OFFSET) GLOBAL.CAM_OFFSET_Y = SETTINGS.MAX_CAM_Y_OFFSET - ((GLOBAL.applet.height/2)/GLOBAL.ZOOM); float bottomEdge = (float) (GLOBAL.CAM_OFFSET_Y - ((GLOBAL.applet.height/2)/GLOBAL.ZOOM)); if(bottomEdge < SETTINGS.MIN_CAM_Y_OFFSET) GLOBAL.CAM_OFFSET_Y = SETTINGS.MIN_CAM_Y_OFFSET + ((GLOBAL.applet.height/2)/GLOBAL.ZOOM); } }