/* * Copyright (C) 2013-2015 F(X)yz, * Sean Phillips, Jason Pollastrini and Jose Pereda * All rights reserved. * * 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 org.fxyz.tests; import javafx.application.Application; import javafx.scene.Group; import javafx.scene.PerspectiveCamera; import javafx.scene.PointLight; import javafx.scene.Scene; import javafx.scene.SceneAntialiasing; import javafx.scene.image.Image; import javafx.scene.input.KeyCode; import javafx.scene.input.MouseEvent; import javafx.scene.layout.StackPane; import javafx.scene.paint.Color; import javafx.scene.paint.CycleMethod; import javafx.scene.paint.LinearGradient; import javafx.scene.paint.Stop; import javafx.scene.shape.CullFace; import javafx.scene.shape.DrawMode; import javafx.stage.Stage; import org.fxyz.cameras.CameraTransformer; import org.fxyz.shapes.complex.cloth.ClothMesh; /** * * @author Jason Pollastrini aka jdub1581 */ public class ClothMeshTest extends Application { private PerspectiveCamera camera; private final CameraTransformer cameraTransform = new CameraTransformer(); private double mousePosX; private double mousePosY; private double mouseOldX; private double mouseOldY; private double mouseDeltaX; private double mouseDeltaY; @Override public void start(Stage stage) throws Exception { camera = new PerspectiveCamera(true); cameraTransform.setTranslate(0, 0, 0); cameraTransform.getChildren().addAll(camera); camera.setNearClip(0.1); camera.setFarClip(1000000.0); camera.setFieldOfView(42); camera.setVerticalFieldOfView(true); camera.setTranslateZ(-1500); PointLight light = new PointLight(Color.LIGHTSKYBLUE); //cameraTransform.getChildren().add(light); light.translateXProperty().bind(camera.translateXProperty()); light.translateYProperty().bind(camera.translateYProperty()); light.translateZProperty().bind(camera.translateZProperty()); ClothMesh cloth = new ClothMesh(); cloth.setPerPointMass(10); cloth.setBendStrength(0.5); cloth.setStretchStrength(1.0); cloth.setShearStrength(0.55); cloth.setDrawMode(DrawMode.LINE); cloth.setCullFace(CullFace.NONE); // cloth.setDiffuseMap(new Image("https://kenai.com/attachments/wiki_images/duke/Duke3DprogressionSmall.jpg")); cloth.setSpecularPower(5); StackPane root = new StackPane(); root.setPickOnBounds(false); PointLight light2 = new PointLight(Color.GAINSBORO); light2.setTranslateZ(-1500); PointLight light3 = new PointLight(Color.AZURE); light3.setTranslateZ(2500); Group g = new Group(); g.getChildren().addAll(cameraTransform, cloth, light2, light3); root.getChildren().add(g); Scene scene = new Scene(root, 1200, 600, true, SceneAntialiasing.BALANCED); Stop[] stops = new Stop[]{new Stop(0, Color.BLACK), new Stop(1, Color.RED)}; LinearGradient lg = new LinearGradient(0, 0, 0, 1, true, CycleMethod.NO_CYCLE, stops); scene.setFill(lg); scene.setCamera(camera); //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) -> { if (!cloth.isHover()) { 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); // - } } }); stage.setScene(scene); //stage.setMaximized(true); stage.show(); cloth.startSimulation(); } public static void main(String[] args) { Application.launch(args); } }