private void registerMouseDragHandlers(final Scene scene) { final boolean[] isDragging = new boolean[] {false}; final double[] mouseX = new double[] {0}; final double[] mouseY = new double[] {0}; scene.setOnMousePressed( new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { isDragging[0] = true; mouseX[0] = event.getX(); mouseY[0] = event.getY(); } }); scene.setOnMouseReleased( new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { isDragging[0] = false; } }); scene.setOnMouseDragged( new EventHandler<MouseEvent>() { @Override public void handle(MouseEvent event) { getTracker().stopTracking(); double translateX = event.getX() - mouseX[0]; double translateY = event.getY() - mouseY[0]; getViewport().translateBy(Vector.cartesian(-translateX, -translateY)); mouseX[0] = event.getX(); mouseY[0] = event.getY(); } }); }
public Controller(View root, Stage stage) { this.root = root; root.openFile.setOnAction( (value) -> { root.pdbObjects.getChildren().clear(); File file = root.fileChooser.showOpenDialog(stage); readPDB(file.getAbsolutePath()); root.fileLabel.setText(file.getName()); }); scene = new Scene(root, 700, 700, true); root.threeDView.widthProperty().bind(scene.widthProperty()); root.threeDView.heightProperty().bind(Bindings.add(-50.0, scene.heightProperty())); scene.setOnMousePressed( (event) -> { mouseStartX = event.getSceneX(); mouseStartY = event.getSceneY(); }); scene.setOnMouseDragged( (event) -> { double deltaX = event.getSceneX() - mouseStartX; double deltaY = event.getSceneY() - mouseStartY; if (event.isShiftDown()) { root.camera.setTranslateZ(root.getTranslateZ() + deltaY * 10); } else { worldRotateY.setAngle(deltaX); worldRotateZ.setAngle(deltaY); } }); }
private void attachMouseEvents(Scene scene, final Stage primaryStage) { // Full screen toggle scene.setOnMouseClicked( new EventHandler<MouseEvent>() { public void handle(MouseEvent event) { if (event.getClickCount() == 2) { primaryStage.setFullScreen(!primaryStage.isFullScreen()); } } }); // starting initial anchor point scene.setOnMousePressed( new EventHandler<MouseEvent>() { public void handle(MouseEvent event) { if (!primaryStage.isFullScreen()) { anchorPt = new Point2D(event.getScreenX(), event.getScreenY()); } } }); // dragging the entire stage scene.setOnMouseDragged( new EventHandler<MouseEvent>() { public void handle(MouseEvent event) { if (anchorPt != null && previousLocation != null && !primaryStage.isFullScreen()) { primaryStage.setX(previousLocation.getX() + event.getScreenX() - anchorPt.getX()); primaryStage.setY(previousLocation.getY() + event.getScreenY() - anchorPt.getY()); } } }); // set the current location scene.setOnMouseReleased( new EventHandler<MouseEvent>() { public void handle(MouseEvent event) { if (!primaryStage.isFullScreen()) { previousLocation = new Point2D(primaryStage.getX(), primaryStage.getY()); } } }); }
private void initFirstPersonControls(Scene scene) { // First person shooter keyboard movement scene.setOnKeyPressed( event -> { double change = 10.0; // Add shift modifier to simulate "Running Speed" if (event.isShiftDown()) { change = 50.0; } // What key did the user press? KeyCode keycode = event.getCode(); // Step 2c: Add Zoom controls if (keycode == KeyCode.W) { camera.setTranslateZ(camera.getTranslateZ() + change); } if (keycode == KeyCode.S) { camera.setTranslateZ(camera.getTranslateZ() - change); } // Step 2d: Add Strafe controls if (keycode == KeyCode.A) { camera.setTranslateX(camera.getTranslateX() - change); } if (keycode == KeyCode.D) { camera.setTranslateX(camera.getTranslateX() + change); } }); scene.setOnMousePressed( (MouseEvent me) -> { mousePosX = me.getSceneX(); mousePosY = me.getSceneY(); mouseOldX = me.getSceneX(); mouseOldY = me.getSceneY(); }); scene.setOnMouseDragged( (MouseEvent me) -> { mouseOldX = mousePosX; mouseOldY = mousePosY; mousePosX = me.getSceneX(); mousePosY = me.getSceneY(); mouseDeltaX = (mousePosX - mouseOldX); mouseDeltaY = (mousePosY - mouseOldY); double modifier = 10.0; double modifierFactor = 0.1; if (me.isControlDown()) { modifier = 0.1; } if (me.isShiftDown()) { modifier = 50.0; } if (me.isPrimaryButtonDown()) { cameraTransform.ry.setAngle( ((cameraTransform.ry.getAngle() + mouseDeltaX * modifierFactor * modifier * 2.0) % 360 + 540) % 360 - 180); // + cameraTransform.rx.setAngle( Utils.clamp( -90, (((cameraTransform.rx.getAngle() - mouseDeltaY * modifierFactor * modifier * 2.0) % 360 + 540) % 360 - 180), 90)); // - } else if (me.isSecondaryButtonDown()) { double z = camera.getTranslateZ(); double newZ = z + mouseDeltaX * modifierFactor * modifier; camera.setTranslateZ(newZ); } else if (me.isMiddleButtonDown()) { cameraTransform.t.setX( cameraTransform.t.getX() + mouseDeltaX * modifierFactor * modifier * 0.3); // - cameraTransform.t.setY( cameraTransform.t.getY() + mouseDeltaY * modifierFactor * modifier * 0.3); // - } }); }
@Override public void start(Stage primaryStage) throws Exception { Group sceneRoot = new Group(); Scene scene = new Scene(sceneRoot, sceneWidth, sceneHeight, true, SceneAntialiasing.BALANCED); scene.setFill(Color.BLACK); camera = new PerspectiveCamera(true); // setup camera transform for rotational support cameraTransform.setTranslate(0, 0, 0); cameraTransform.getChildren().add(camera); camera.setNearClip(0.1); camera.setFarClip(10000.0); camera.setTranslateX(0); camera.setTranslateZ(-1000); cameraTransform.ry.setAngle(-25.0); cameraTransform.rx.setAngle(-10.0); // add a Point Light for better viewing of the grid coordinate system PointLight light = new PointLight(Color.WHITE); cameraTransform.getChildren().add(new AmbientLight()); light.setTranslateX(camera.getTranslateX()); light.setTranslateY(camera.getTranslateY()); light.setTranslateZ(camera.getTranslateZ()); scene.setCamera(camera); long time = System.currentTimeMillis(); Group group = new Group(cameraTransform); List<Point3D> data = new ArrayList<>(); // // create some data // IntStream.range(0,100000) // .forEach(i->data.add(new Point3D((float)(30*Math.sin(50*i)), // (float)(Math.sin(i)*(100+30*Math.cos(100*i))), // (float)(Math.cos(i)*(100+30*Math.cos(200*i))), // i))); // <-- f // // and write to csv file // Path out = Paths.get("output.txt"); // // Files.write(out,data.stream().map(p3d->p3d.toCSV()).collect(Collectors.toList()),Charset.defaultCharset()); // read from csv file Path out = getCSVFile(0); if (out != null) { Files.lines(out) .map(s -> s.split(";")) .forEach( s -> data.add( new Point3D( Float.parseFloat(s[0]), Float.parseFloat(s[1]), Float.parseFloat(s[2]), Float.parseFloat(s[3])))); } ScatterMesh scatter = new ScatterMesh(data, true, 1, 0); // DENSITY // texture is given by p.f value, don't change this! scatter.setTextureModeVertices3D(1530, p -> p.f); group.getChildren().add(scatter); sceneRoot.getChildren().addAll(group); // First person shooter keyboard movement scene.setOnKeyPressed( event -> { double change = 10.0; // Add shift modifier to simulate "Running Speed" if (event.isShiftDown()) { change = 50.0; } // What key did the user press? KeyCode keycode = event.getCode(); // Step 2c: Add Zoom controls if (keycode == KeyCode.W) { camera.setTranslateZ(camera.getTranslateZ() + change); } if (keycode == KeyCode.S) { camera.setTranslateZ(camera.getTranslateZ() - change); } // Step 2d: Add Strafe controls if (keycode == KeyCode.A) { camera.setTranslateX(camera.getTranslateX() - change); } if (keycode == KeyCode.D) { camera.setTranslateX(camera.getTranslateX() + change); } }); scene.setOnMousePressed( (MouseEvent me) -> { mousePosX = me.getSceneX(); mousePosY = me.getSceneY(); mouseOldX = me.getSceneX(); mouseOldY = me.getSceneY(); }); scene.setOnMouseDragged( (MouseEvent me) -> { mouseOldX = mousePosX; mouseOldY = mousePosY; mousePosX = me.getSceneX(); mousePosY = me.getSceneY(); mouseDeltaX = (mousePosX - mouseOldX); mouseDeltaY = (mousePosY - mouseOldY); double modifier = 10.0; double modifierFactor = 0.1; if (me.isControlDown()) { modifier = 0.1; } if (me.isShiftDown()) { modifier = 50.0; } if (me.isPrimaryButtonDown()) { cameraTransform.ry.setAngle( ((cameraTransform.ry.getAngle() + mouseDeltaX * modifierFactor * modifier * 2.0) % 360 + 540) % 360 - 180); // + cameraTransform.rx.setAngle( ((cameraTransform.rx.getAngle() - mouseDeltaY * modifierFactor * modifier * 2.0) % 360 + 540) % 360 - 180); // - } else if (me.isSecondaryButtonDown()) { double z = camera.getTranslateZ(); double newZ = z + mouseDeltaX * modifierFactor * modifier; camera.setTranslateZ(newZ); } else if (me.isMiddleButtonDown()) { cameraTransform.t.setX( cameraTransform.t.getX() + mouseDeltaX * modifierFactor * modifier * 0.3); // - cameraTransform.t.setY( cameraTransform.t.getY() + mouseDeltaY * modifierFactor * modifier * 0.3); // - } }); primaryStage.setTitle("F(X)yz - ScatterMesh Test"); primaryStage.setScene(scene); primaryStage.show(); final boolean constantVertices = true; lastEffect = System.nanoTime(); AtomicInteger count = new AtomicInteger(0); List<List<Number>> fullData = new ArrayList<>(); if (constantVertices) { // if possible we can cache all the data Stream.of(0, 1, 2, 3, 4, 3, 2, 1) .forEach( i -> { Path out2 = getCSVFile(i); if (out2 != null) { try { List<Number> data2 = new ArrayList<>(); Files.lines(out2) .map(s -> s.split(";")) .forEach( s -> { float f = Float.parseFloat(s[3]); // 4 vertices tetrahedra data2.add(f); data2.add(f); data2.add(f); data2.add(f); }); fullData.add(data2); } catch (IOException ex) { } } }); } AnimationTimer timerEffect = new AnimationTimer() { @Override public void handle(long now) { if (now > lastEffect + 50_000_000l) { try { // long t=System.currentTimeMillis(); if (constantVertices && fullData != null) { // Vertices coordinates are always the same: mesh is tha same, we only // need to update F on each element scatter.setFunctionData(fullData.get(count.get() % 8)); // System.out.println("t // "+(System.currentTimeMillis()-t)); } else { // vertices coordinates may change in time, we need to create them all over again // reading the files: Path out2 = getCSVFile( (int) (Stream.of(0, 1, 2, 3, 4, 3, 2, 1).toArray()[count.get() % 8])); if (out2 != null) { List<Point3D> data2 = new ArrayList<>(); Files.lines(out2) .map(s -> s.split(";")) .forEach( s -> data2.add( new Point3D( Float.parseFloat(s[0]), Float.parseFloat(s[1]), Float.parseFloat(s[2]), Float.parseFloat(s[3])))); scatter.setScatterData(data2); scatter.setTextureModeVertices1D(1530, p -> p); } // System.out.println("t // "+(System.currentTimeMillis()-t)); } } catch (IOException ex) { } count.getAndIncrement(); lastEffect = now; } } }; timerEffect.start(); }
@Override public void start(Stage primaryStage) throws Exception { Group sceneRoot = new Group(); Scene scene = new Scene(sceneRoot, sceneWidth, sceneHeight, true, SceneAntialiasing.BALANCED); scene.setFill(Color.BLACK); camera = new PerspectiveCamera(true); camera.setNearClip(0.1); camera.setFarClip(10000.0); camera.setTranslateZ(-1000); scene.setCamera(camera); ArrayList<Point3D> points = new ArrayList<>(); for (int i = -250; i < 250; i++) { points.add( new Point3D((float) i, (float) Math.sin(i) * 50 + i, (float) Math.cos(i) * 50 + i)); } polyLine3D = new PolyLine3D(points, 3, Color.STEELBLUE); sceneRoot.getChildren().addAll(polyLine3D); scene.setOnKeyPressed( event -> { double change = 10.0; // Add shift modifier to simulate "Running Speed" if (event.isShiftDown()) { change = 50.0; } // What key did the user press? KeyCode keycode = event.getCode(); // Step 2c: Add Zoom controls if (keycode == KeyCode.W) { camera.setTranslateZ(camera.getTranslateZ() + change); } if (keycode == KeyCode.S) { camera.setTranslateZ(camera.getTranslateZ() - change); } // Step 2d: Add Strafe controls if (keycode == KeyCode.A) { camera.setTranslateX(camera.getTranslateX() - change); } if (keycode == KeyCode.D) { camera.setTranslateX(camera.getTranslateX() + change); } }); // Add a Mouse Handler for Rotations Rotate xRotate = new Rotate(0, Rotate.X_AXIS); Rotate yRotate = new Rotate(0, Rotate.Y_AXIS); Rotate zRotate = new Rotate(0, Rotate.Z_AXIS); polyLine3D.getTransforms().addAll(xRotate, yRotate); // Use Binding so your rotation doesn't have to be recreated xRotate.angleProperty().bind(angleX); yRotate.angleProperty().bind(angleY); zRotate.angleProperty().bind(angleZ); // Start Tracking mouse movements only when a button is pressed scene.setOnMousePressed( event -> { scenex = event.getSceneX(); sceney = event.getSceneY(); fixedXAngle = angleX.get(); fixedYAngle = angleY.get(); if (event.isMiddleButtonDown()) { scenez = event.getSceneX(); fixedZAngle = angleZ.get(); } }); // Angle calculation will only change when the button has been pressed scene.setOnMouseDragged( event -> { if (event.isMiddleButtonDown()) angleZ.set(fixedZAngle - (scenez - event.getSceneY())); else angleX.set(fixedXAngle - (scenex - event.getSceneY())); angleY.set(fixedYAngle + sceney - event.getSceneX()); }); primaryStage.setTitle("F(X)yz ScatterPlotTest"); primaryStage.setScene(scene); primaryStage.show(); }