Search in sources :

Example 36 with AnimationTimer

use of javafx.animation.AnimationTimer in project FXyzLib by Birdasaur.

the class FrustumTest method 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.WHITESMOKE);
    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.setTranslateZ(-30);
    // cameraTransform.ry.setAngle(-45.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(light);
    light.setTranslateX(camera.getTranslateX());
    light.setTranslateY(camera.getTranslateY());
    light.setTranslateZ(10 * camera.getTranslateZ());
    scene.setCamera(camera);
    rotateY = new Rotate(0, 0, 0, 0, Rotate.Y_AXIS);
    Group group = new Group();
    group.getChildren().add(cameraTransform);
    // cylinder = new PrismMesh(2,5,4);
    // ,new Point3D(-5,5,0),new Point3D(0,0,5));
    cylinder = new FrustumMesh(1, 0.2, 4, 3);
    // cylinder.setDrawMode(DrawMode.LINE);
    // SECTION TYPE
    // cylinder.setSectionType(TriangleMeshHelper.SectionType.TRIANGLE);
    // NONE
    // cylinder.setTextureModeNone(Color.ROYALBLUE);
    // IMAGE
    // cylinder.setTextureModeImage(getClass().getResource("res/netCylinder.png").toExternalForm());
    cylinder.setTextureModeVertices1D(1530, t -> t);
    // cylinder.setColorPalette(ColorPalette.GREEN);
    // DENSITY
    // cylinder.setTextureModeVertices3D(1530,p->(double)p.y);
    // cylinder.setTextureModeVertices3D(1530,p->(double)cylinder.unTransform(p).magnitude());
    // FACES
    // cylinder.setTextureModeFaces(1530);
    cylinder.getTransforms().addAll(new Rotate(0, Rotate.X_AXIS), rotateY);
    group.getChildren().add(cylinder);
    boolean showKnots = true;
    if (showKnots) {
        Sphere s = new Sphere(cylinder.getMajorRadius() / 10d);
        Point3D k0 = cylinder.getAxisOrigin();
        s.getTransforms().add(new Translate(k0.x, k0.y, k0.z));
        s.setMaterial(new PhongMaterial(Color.GREENYELLOW));
        group.getChildren().add(s);
        s = new Sphere(cylinder.getMinorRadius() / 10d);
        Point3D k3 = cylinder.getAxisEnd();
        s.getTransforms().add(new Translate(k3.x, k3.y, k3.z));
        s.setMaterial(new PhongMaterial(Color.ROSYBROWN));
        group.getChildren().add(s);
    }
    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 - Cylinder Test");
    primaryStage.setScene(scene);
    primaryStage.show();
    // OBJWriter writer=new OBJWriter((TriangleMesh) cylinder.getMesh(),"cylinder2");
    // //        writer.setMaterialColor(Color.AQUA);
    // //        writer.setTextureImage(getClass().getResource("res/netCylinder.png").toExternalForm());
    // writer.setTextureColors(6,ColorPalette.GREEN);
    // writer.exportMesh();
    lastEffect = System.nanoTime();
    AtomicInteger count = new AtomicInteger(0);
    AnimationTimer timerEffect = new AnimationTimer() {

        @Override
        public void handle(long now) {
            if (now > lastEffect + 100_000_000l) {
                // <=1/6d)?1d:0d;
                func = t -> Math.pow(Math.sin(8d * Math.PI * (10d * (1 - t.doubleValue()) + count.get() % 11) / 20d), 6);
                cylinder.setFunction(func);
                // mapBez.values().forEach(b->b.setDensity(dens));
                count.getAndIncrement();
                lastEffect = now;
            }
        }
    };
    timerEffect.start();
}
Also used : Group(javafx.scene.Group) MouseEvent(javafx.scene.input.MouseEvent) Rotate(javafx.scene.transform.Rotate) AnimationTimer(javafx.animation.AnimationTimer) FrustumMesh(org.fxyz.shapes.primitives.FrustumMesh) PerspectiveCamera(javafx.scene.PerspectiveCamera) Scene(javafx.scene.Scene) Sphere(javafx.scene.shape.Sphere) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Point3D(org.fxyz.geometry.Point3D) KeyCode(javafx.scene.input.KeyCode) PointLight(javafx.scene.PointLight) PhongMaterial(javafx.scene.paint.PhongMaterial) Translate(javafx.scene.transform.Translate)

Example 37 with AnimationTimer

use of javafx.animation.AnimationTimer in project FXyzLib by Birdasaur.

the class Function2DPlotTest method 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.WHITESMOKE);
    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.setTranslateZ(-20);
    cameraTransform.ry.setAngle(-45.0);
    cameraTransform.rx.setAngle(-30.0);
    // add a Point Light for better viewing of the grid coordinate system
    PointLight light = new PointLight(Color.WHITE);
    cameraTransform.getChildren().add(light);
    // cameraTransform.getChildren().add(new AmbientLight(Color.WHITE));
    light.setTranslateX(camera.getTranslateX());
    light.setTranslateY(camera.getTranslateY());
    light.setTranslateZ(camera.getTranslateZ());
    scene.setCamera(camera);
    rotateY = new Rotate(0, 0, 0, 0, Rotate.Y_AXIS);
    Group group = new Group();
    group.getChildren().add(cameraTransform);
    surface = new SurfacePlotMesh(p -> Math.sin(p.magnitude() + 0.00000000000000001) / (p.magnitude() + 0.00000000000000001), 10, 10, 10, 10, 5d);
    // PhongMaterial matTorus = new PhongMaterial(Color.FIREBRICK);
    // torus.setMaterial(matTorus);
    // surface.setDrawMode(DrawMode.LINE);
    surface.setCullFace(CullFace.NONE);
    // NONE
    // surface.setTextureModeNone(Color.FORESTGREEN);
    // IMAGE
    // torus.setTextureModeImage(getClass().getResource("res/grid1.png").toExternalForm());
    // banner.setTextureModeImage(getClass().getResource("res/Duke3DprogressionSmall.jpg").toExternalForm());
    // PATTERN
    surface.setTextureModePattern(CarbonPatterns.CARBON_KEVLAR, 1.0d);
    // DENSITY
    // surface.setTextureModeVertices3D(1530,dens);
    // FACES
    // torus.setTextureModeFaces(256*256);
    surface.getTransforms().addAll(new Rotate(0, Rotate.X_AXIS), rotateY);
    group.getChildren().addAll(surface);
    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);
        }
    });
    lastEffect = System.nanoTime();
    AtomicInteger count = new AtomicInteger();
    AnimationTimer timerEffect = new AnimationTimer() {

        @Override
        public void handle(long now) {
            if (now > lastEffect + 1_000_000_000l) {
                // dens = p->(float)(p.x*Math.cos(count.get()%100d*2d*Math.PI/50d)+p.y*Math.sin(count.get()%100d*2d*Math.PI/50d));
                // torus.setDensity(dens);
                // if(count.get()%100<50){
                // torus.setDrawMode(DrawMode.LINE);
                // } else {
                // torus.setDrawMode(DrawMode.FILL);
                // }
                // spring.setLength(100+20*(count.get()%10));
                // torus.setColors((int)Math.pow(2,count.get()%16));
                // torus.setMajorRadius(500+100*(count.get()%10));
                // torus.setMinorRadius(150+10*(count.get()%10));
                // torus.setPatternScale(1d+(count.get()%10)*5d);
                count.getAndIncrement();
                lastEffect = now;
            }
        }
    };
    primaryStage.setTitle("F(X)yz - Surface Plot 2D");
    primaryStage.setScene(scene);
    primaryStage.show();
// timerEffect.start();
}
Also used : Scene(javafx.scene.Scene) KeyCode(javafx.scene.input.KeyCode) Color(javafx.scene.paint.Color) CarbonPatterns(org.fxyz.utils.Patterns.CarbonPatterns) Rotate(javafx.scene.transform.Rotate) SurfacePlotMesh(org.fxyz.shapes.primitives.SurfacePlotMesh) MouseEvent(javafx.scene.input.MouseEvent) PointLight(javafx.scene.PointLight) Group(javafx.scene.Group) DrawMode(javafx.scene.shape.DrawMode) Function(java.util.function.Function) CullFace(javafx.scene.shape.CullFace) Application(javafx.application.Application) AnimationTimer(javafx.animation.AnimationTimer) PerspectiveCamera(javafx.scene.PerspectiveCamera) CameraTransformer(org.fxyz.cameras.CameraTransformer) Stage(javafx.stage.Stage) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Patterns(org.fxyz.utils.Patterns) SceneAntialiasing(javafx.scene.SceneAntialiasing) Point3D(org.fxyz.geometry.Point3D) Group(javafx.scene.Group) MouseEvent(javafx.scene.input.MouseEvent) Rotate(javafx.scene.transform.Rotate) SurfacePlotMesh(org.fxyz.shapes.primitives.SurfacePlotMesh) AnimationTimer(javafx.animation.AnimationTimer) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) KeyCode(javafx.scene.input.KeyCode) PerspectiveCamera(javafx.scene.PerspectiveCamera) Scene(javafx.scene.Scene) PointLight(javafx.scene.PointLight)

Example 38 with AnimationTimer

use of javafx.animation.AnimationTimer in project FXyzLib by Birdasaur.

the class KnotTest method 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.WHEAT);
    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.setTranslateZ(-30);
    cameraTransform.ry.setAngle(-45.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(light);
    cameraTransform.getChildren().add(new AmbientLight(Color.WHITE));
    light.setTranslateX(camera.getTranslateX());
    light.setTranslateY(camera.getTranslateY());
    light.setTranslateZ(camera.getTranslateZ());
    scene.setCamera(camera);
    rotateY = new Rotate(0, 0, 0, 0, Rotate.Y_AXIS);
    Group group = new Group();
    group.getChildren().add(cameraTransform);
    knot = new KnotMesh(2d, 1d, 0.4d, 2d, 3d, 1000, 60, 0, 0);
    knot.setDrawMode(DrawMode.LINE);
    // knot.setCullFace(CullFace.NONE);
    knot.setSectionType(SectionType.TRIANGLE);
    // NONE
    // knot.setTextureModeNone(Color.BROWN);
    // IMAGE
    // knot.setTextureModeImage(getClass().getResource("res/LaminateSteel.jpg").toExternalForm());
    // PATTERN
    // knot.setTextureModePattern(3d);
    // FUNCTION
    // knot.setTextureModeVertices1D(1530,t->knot.getTau(t));
    knot.setTextureModeVertices1D(ColorPalette.GREEN, 8, t -> knot.getTau(t.doubleValue()));
    // DENSITY
    // knot.setTextureModeVertices3D(256*256,dens);
    // FACES
    // knot.setTextureModeFaces(256*256);
    knot.getTransforms().addAll(new Rotate(0, Rotate.X_AXIS), rotateY);
    group.getChildren().add(knot);
    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);
        }
    });
    lastEffect = System.nanoTime();
    AtomicInteger count = new AtomicInteger();
    AnimationTimer timerEffect = new AnimationTimer() {

        @Override
        public void handle(long now) {
            if (now > lastEffect + 100_000_000l) {
                // Point3D loc = knot.getPositionAt((count.get()%100)*2d*Math.PI/100d);
                // Point3D dir = knot.getTangentAt((count.get()%100)*2d*Math.PI/100d);
                // cameraTransform.t.setX(loc.x);
                // cameraTransform.t.setY(loc.y);
                // cameraTransform.t.setZ(-loc.z);
                // javafx.geometry.Point3D axis = cameraTransform.rx.getAxis();
                // javafx.geometry.Point3D cross = axis.crossProduct(-dir.x,-dir.y,-dir.z);
                // double angle = axis.angle(-dir.x,-dir.y,-dir.z);
                // cameraTransform.rx.setAngle(angle);
                // cameraTransform.rx.setAxis(new javafx.geometry.Point3D(cross.getX(),-cross.getY(),cross.getZ()));
                // dens = p->(float)(p.x*Math.cos(count.get()%100d*2d*Math.PI/50d)+p.y*Math.sin(count.get()%100d*2d*Math.PI/50d));
                // knot.setDensity(dens);
                // knot.setP(1+(count.get()%5));
                // knot.setQ(2+(count.get()%15));
                // if(count.get()%100<50){
                // knot.setDrawMode(DrawMode.LINE);
                // } else {
                // knot.setDrawMode(DrawMode.FILL);
                // }
                // knot.setColors((int)Math.pow(2,count.get()%16));
                // knot.setMajorRadius(0.5d+(count.get()%10));
                // knot.setMinorRadius(2d+(count.get()%60));
                // knot.setWireRadius(0.1d+(count.get()%6)/10d);
                // knot.setPatternScale(1d+(count.get()%10)*3d);
                knot.setSectionType(SectionType.values()[count.get() % SectionType.values().length]);
                count.getAndIncrement();
                lastEffect = now;
            }
        }
    };
    primaryStage.setTitle("F(X)yz - Knots");
    primaryStage.setScene(scene);
    primaryStage.show();
    OBJWriter writer = new OBJWriter((TriangleMesh) knot.getMesh(), "knot");
    writer.setMaterialColor(Color.BROWN);
    writer.exportMesh();
    timerEffect.start();
}
Also used : Group(javafx.scene.Group) KnotMesh(org.fxyz.shapes.primitives.KnotMesh) MouseEvent(javafx.scene.input.MouseEvent) Rotate(javafx.scene.transform.Rotate) AnimationTimer(javafx.animation.AnimationTimer) PerspectiveCamera(javafx.scene.PerspectiveCamera) Scene(javafx.scene.Scene) OBJWriter(org.fxyz.utils.OBJWriter) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) KeyCode(javafx.scene.input.KeyCode) PointLight(javafx.scene.PointLight) AmbientLight(javafx.scene.AmbientLight)

Example 39 with AnimationTimer

use of javafx.animation.AnimationTimer in project FXyzLib by Birdasaur.

the class BezierTest method 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);
    // setup camera transform for rotational support
    cameraTransform.setTranslate(0, 0, 0);
    cameraTransform.getChildren().add(camera);
    camera.setNearClip(0.1);
    camera.setFarClip(10000.0);
    camera.setTranslateZ(-10);
    cameraTransform.ry.setAngle(-45.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(light);
    cameraTransform.getChildren().add(new AmbientLight(Color.WHITE));
    light.setTranslateX(camera.getTranslateX());
    light.setTranslateY(camera.getTranslateY());
    light.setTranslateZ(camera.getTranslateZ());
    scene.setCamera(camera);
    rotateY = new Rotate(0, 0, 0, 0, Rotate.Y_AXIS);
    Group group = new Group();
    group.getChildren().add(cameraTransform);
    // List<Point3D> knots=Arrays.asList(new Point3D(0f,0f,0f),new Point3D(3f,0f,2f),
    // new Point3D(5f,2f,3f),new Point3D(7f,-3f,0f),new Point3D(6f,-1f,-4f));
    List<Point3D> knots = Arrays.asList(new Point3D(3f, 0f, 0f), new Point3D(0.77171f, 1.68981f, 0.989821f), new Point3D(-0.681387f, 0.786363f, -0.281733f), new Point3D(-2.31757f, -0.680501f, -0.909632f), new Point3D(-0.404353f, -2.81233f, 0.540641f), new Point3D(1.1316f, -0.727237f, 0.75575f), new Point3D(1.1316f, 0.727237f, -0.75575f), new Point3D(-0.404353f, 2.81233f, -0.540641f), new Point3D(-2.31757f, 0.680501f, 0.909632f), new Point3D(-0.681387f, -0.786363f, 0.281733f), new Point3D(0.77171f, -1.68981f, -0.989821f), new Point3D(3f, 0f, 0f));
    boolean showControlPoints = true;
    boolean showKnots = true;
    InterpolateBezier interpolate = new InterpolateBezier(knots);
    beziers = new ArrayList<>();
    AtomicInteger sp = new AtomicInteger();
    if (showKnots || showControlPoints) {
        interpolate.getSplines().forEach(spline -> {
            Point3D k0 = spline.getPoints().get(0);
            Point3D k1 = spline.getPoints().get(1);
            Point3D k2 = spline.getPoints().get(2);
            Point3D k3 = spline.getPoints().get(3);
            if (showKnots) {
                Sphere s = new Sphere(0.2d);
                s.getTransforms().add(new Translate(k0.x, k0.y, k0.z));
                s.setMaterial(new PhongMaterial(Color.GREENYELLOW));
                group.getChildren().add(s);
                s = new Sphere(0.2d);
                s.getTransforms().add(new Translate(k3.x, k3.y, k3.z));
                s.setMaterial(new PhongMaterial(Color.GREENYELLOW));
                group.getChildren().add(s);
            }
            if (showControlPoints) {
                PrismMesh c = new PrismMesh(0.03d, 1d, 1, k0, k1);
                c.setTextureModeNone(Color.GREEN);
                group.getChildren().add(c);
                c = new PrismMesh(0.03d, 1d, 1, k1, k2);
                c.setTextureModeNone(Color.GREEN);
                group.getChildren().add(c);
                c = new PrismMesh(0.03d, 1d, 1, k2, k3);
                c.setTextureModeNone(Color.GREEN);
                group.getChildren().add(c);
                Sphere s = new Sphere(0.1d);
                s.getTransforms().add(new Translate(k1.x, k1.y, k1.z));
                s.setMaterial(new PhongMaterial(Color.RED));
                group.getChildren().add(s);
                s = new Sphere(0.1d);
                s.getTransforms().add(new Translate(k2.x, k2.y, k2.z));
                s.setMaterial(new PhongMaterial(Color.RED));
                group.getChildren().add(s);
            }
        });
    }
    long time = System.currentTimeMillis();
    interpolate.getSplines().stream().forEach(spline -> {
        BezierMesh bezier = new BezierMesh(spline, 0.1d, 300, 20, 0, 0);
        // bezier.setDrawMode(DrawMode.LINE);
        // bezier.setCullFace(CullFace.NONE);
        // bezier.setSectionType(SectionType.TRIANGLE);
        // NONE
        // bezier.setTextureModeNone(Color.hsb(360d*sp.getAndIncrement()/interpolate.getSplines().size(), 1, 1));
        // IMAGE
        // bezier.setTextureModeImage(getClass().getResource("res/LaminateSteel.jpg").toExternalForm());
        // PATTERN
        // bezier.setTextureModePattern(3d);
        // FUNCTION
        bezier.setTextureModeVertices1D(1530, t -> spline.getKappa(t.doubleValue()));
        // bezier.setTextureModeVertices1D(1530,func);
        // DENSITY
        // bezier.setTextureModeVertices3D(256*256,dens);
        // FACES
        // bezier.setTextureModeFaces(256*256);
        bezier.getTransforms().addAll(new Rotate(0, Rotate.X_AXIS), rotateY);
        beziers.add(bezier);
    });
    // 43.815->25.606->15
    System.out.println("time: " + (System.currentTimeMillis() - time));
    group.getChildren().addAll(beziers);
    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);
        }
    });
    lastEffect = System.nanoTime();
    AtomicInteger count = new AtomicInteger();
    AnimationTimer timerEffect = new AnimationTimer() {

        @Override
        public void handle(long now) {
            if (now > lastEffect + 1_000_000_000l) {
                // Point3D loc = knot.getPositionAt((count.get()%100)*2d*Math.PI/100d);
                // Point3D dir = knot.getTangentAt((count.get()%100)*2d*Math.PI/100d);
                // cameraTransform.t.setX(loc.x);
                // cameraTransform.t.setY(loc.y);
                // cameraTransform.t.setZ(-loc.z);
                // javafx.geometry.Point3D axis = cameraTransform.rx.getAxis();
                // javafx.geometry.Point3D cross = axis.crossProduct(-dir.x,-dir.y,-dir.z);
                // double angle = axis.angle(-dir.x,-dir.y,-dir.z);
                // cameraTransform.rx.setAngle(angle);
                // cameraTransform.rx.setAxis(new javafx.geometry.Point3D(cross.getX(),-cross.getY(),cross.getZ()));
                // dens = p->(float)(p.x*Math.cos(count.get()%100d*2d*Math.PI/50d)+p.y*Math.sin(count.get()%100d*2d*Math.PI/50d));
                func = t -> Math.pow(t.doubleValue(), (count.get() % 5d));
                beziers.forEach(b -> b.setFunction(func));
                // knot.setP(1+(count.get()%5));
                // knot.setQ(2+(count.get()%15));
                // if(count.get()%100<50){
                // knot.setDrawMode(DrawMode.LINE);
                // } else {
                // knot.setDrawMode(DrawMode.FILL);
                // }
                // beziers.forEach(b->b.setColors((int)Math.pow(2,count.get()%16)));
                // beziers.forEach(b->b.setWireRadius(0.1d+(count.get()%6)/10d));
                // beziers.forEach(b->b.setPatternScale(1d+(count.get()%10)*3d));
                // beziers.forEach(b->b.setSectionType(SectionType.values()[count.get()%SectionType.values().length]));
                count.getAndIncrement();
                lastEffect = now;
            }
        }
    };
    primaryStage.setTitle("F(X)yz - Bezier Splines");
    primaryStage.setScene(scene);
    primaryStage.show();
    timerEffect.start();
}
Also used : Group(javafx.scene.Group) MouseEvent(javafx.scene.input.MouseEvent) Rotate(javafx.scene.transform.Rotate) AnimationTimer(javafx.animation.AnimationTimer) PerspectiveCamera(javafx.scene.PerspectiveCamera) Scene(javafx.scene.Scene) Sphere(javafx.scene.shape.Sphere) InterpolateBezier(org.fxyz.shapes.primitives.helper.InterpolateBezier) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Point3D(org.fxyz.geometry.Point3D) PrismMesh(org.fxyz.shapes.primitives.PrismMesh) KeyCode(javafx.scene.input.KeyCode) PointLight(javafx.scene.PointLight) PhongMaterial(javafx.scene.paint.PhongMaterial) Translate(javafx.scene.transform.Translate) BezierMesh(org.fxyz.shapes.primitives.BezierMesh) AmbientLight(javafx.scene.AmbientLight)

Example 40 with AnimationTimer

use of javafx.animation.AnimationTimer in project FXyzLib by Birdasaur.

the class Skybox method startTimer.

private void startTimer() {
    timer = new AnimationTimer() {

        @Override
        public void handle(long now) {
            Transform ct = (camera != null) ? camera.getLocalToSceneTransform() : null;
            if (ct != null) {
                affine.setTx(ct.getTx());
                affine.setTy(ct.getTy());
                affine.setTz(ct.getTz());
            }
        }
    };
    timer.start();
}
Also used : AnimationTimer(javafx.animation.AnimationTimer) Transform(javafx.scene.transform.Transform)

Aggregations

AnimationTimer (javafx.animation.AnimationTimer)53 Scene (javafx.scene.Scene)18 Group (javafx.scene.Group)15 PerspectiveCamera (javafx.scene.PerspectiveCamera)15 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)14 KeyCode (javafx.scene.input.KeyCode)14 MouseEvent (javafx.scene.input.MouseEvent)14 PointLight (javafx.scene.PointLight)13 Rotate (javafx.scene.transform.Rotate)11 Point3D (org.fxyz.geometry.Point3D)8 Section (eu.hansolo.enzo.common.Section)7 AmbientLight (javafx.scene.AmbientLight)7 Color (javafx.scene.paint.Color)7 ArrayList (java.util.ArrayList)6 KeyFrame (javafx.animation.KeyFrame)5 KeyValue (javafx.animation.KeyValue)5 Timeline (javafx.animation.Timeline)5 Stage (javafx.stage.Stage)5 OBJWriter (org.fxyz.utils.OBJWriter)5 Random (java.util.Random)4