Search in sources :

Example 1 with ScatterMesh

use of org.fxyz.shapes.primitives.ScatterMesh in project FXyzLib by Birdasaur.

the class CSVScatter3DTest 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.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;
        if (event.isShiftDown()) {
            change = 50.0;
        }
        KeyCode keycode = event.getCode();
        if (keycode == KeyCode.W) {
            camera.setTranslateZ(camera.getTranslateZ() + change);
        }
        if (keycode == KeyCode.S) {
            camera.setTranslateZ(camera.getTranslateZ() - change);
        }
        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]);
                        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();
}
Also used : Path(java.nio.file.Path) Scene(javafx.scene.Scene) ScatterMesh(org.fxyz.shapes.primitives.ScatterMesh) Palette(org.fxyz.utils.Palette) URISyntaxException(java.net.URISyntaxException) MouseEvent(javafx.scene.input.MouseEvent) PointLight(javafx.scene.PointLight) ArrayList(java.util.ArrayList) Application(javafx.application.Application) PerspectiveCamera(javafx.scene.PerspectiveCamera) CameraTransformer(org.fxyz.cameras.CameraTransformer) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Path(java.nio.file.Path) KeyCode(javafx.scene.input.KeyCode) Color(javafx.scene.paint.Color) Files(java.nio.file.Files) IOException(java.io.IOException) Group(javafx.scene.Group) AnimationTimer(javafx.animation.AnimationTimer) List(java.util.List) Stream(java.util.stream.Stream) Stage(javafx.stage.Stage) Paths(java.nio.file.Paths) SceneAntialiasing(javafx.scene.SceneAntialiasing) Point3D(org.fxyz.geometry.Point3D) AmbientLight(javafx.scene.AmbientLight) Group(javafx.scene.Group) MouseEvent(javafx.scene.input.MouseEvent) AnimationTimer(javafx.animation.AnimationTimer) ArrayList(java.util.ArrayList) PerspectiveCamera(javafx.scene.PerspectiveCamera) IOException(java.io.IOException) Scene(javafx.scene.Scene) ScatterMesh(org.fxyz.shapes.primitives.ScatterMesh) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Point3D(org.fxyz.geometry.Point3D) KeyCode(javafx.scene.input.KeyCode) ArrayList(java.util.ArrayList) List(java.util.List) PointLight(javafx.scene.PointLight) AmbientLight(javafx.scene.AmbientLight)

Example 2 with ScatterMesh

use of org.fxyz.shapes.primitives.ScatterMesh in project FXyzLib by Birdasaur.

the class Scatter3DTest 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.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<>();
    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))), // <-- f
    i)));
    ScatterMesh scatter = new ScatterMesh(data, true, 1, 0);
    // NONE
    //        scatter.setTextureModeNone(Color.ROYALBLUE);
    //        scatter.setDrawMode(DrawMode.LINE);
    // IMAGE
    //        scatter.setTextureModeImage(getClass().getResource("res/steel-background1.jpg").toExternalForm());
    //        scatter.setTextureModeImage(getClass().getResource("res/share-carousel2.jpg").toExternalForm());
    // DENSITY
    scatter.setTextureModeVertices3D(1530, p -> p.magnitude());
    //        scatter.setTextureModeVertices1D(1530,p->Math.sqrt(p.doubleValue()));
    //        scatter.setTextureModeVertices3D(1530,p->Math.sin(p.y/50)*Math.cos(p.x/40)*p.z);
    // FACES
    //        scatter.setTextureModeFaces(Palette.ColorPalette.HSB,1530);
    group.getChildren().add(scatter);
    sceneRoot.getChildren().addAll(group);
    //First person shooter keyboard movement 
    scene.setOnKeyPressed(event -> {
        double change = 10.0;
        if (event.isShiftDown()) {
            change = 50.0;
        }
        KeyCode keycode = event.getCode();
        if (keycode == KeyCode.W) {
            camera.setTranslateZ(camera.getTranslateZ() + change);
        }
        if (keycode == KeyCode.S) {
            camera.setTranslateZ(camera.getTranslateZ() - change);
        }
        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();
    System.out.println("time " + (System.currentTimeMillis() - time));
    final Timeline rotateEffect2 = new Timeline();
    TexturedMesh t1 = scatter.getMeshFromId("1");
    final KeyValue kv2 = new KeyValue(t1.getRotateX().angleProperty(), 360);
    final KeyFrame kf2 = new KeyFrame(Duration.millis(2000), kv2);
    rotateEffect2.getKeyFrames().addAll(kf2);
    //        rotateEffect2.play();
    //        
    final Timeline rotateEffect3 = new Timeline();
    rotateEffect3.setCycleCount(Timeline.INDEFINITE);
    TexturedMesh t5 = scatter.getMeshFromId("2");
    final KeyValue kv1x = new KeyValue(t5.getScale().xProperty(), 1.2, Interpolator.EASE_BOTH);
    final KeyValue kv1y = new KeyValue(t5.getScale().yProperty(), 1.2, Interpolator.EASE_BOTH);
    final KeyValue kv1z = new KeyValue(t5.getScale().zProperty(), 1.2, Interpolator.EASE_BOTH);
    final KeyFrame kfs1 = new KeyFrame(Duration.millis(500), kv1x, kv1y, kv1z);
    final KeyValue kv2x = new KeyValue(t5.getScale().xProperty(), 0.3, Interpolator.EASE_BOTH);
    final KeyValue kv2y = new KeyValue(t5.getScale().yProperty(), 0.3, Interpolator.EASE_BOTH);
    final KeyValue kv2z = new KeyValue(t5.getScale().zProperty(), 0.3, Interpolator.EASE_BOTH);
    final KeyFrame kfs2 = new KeyFrame(Duration.millis(2000), kv2x, kv2y, kv2z);
    final KeyValue kv3x = new KeyValue(t5.getScale().xProperty(), 1, Interpolator.EASE_BOTH);
    final KeyValue kv3y = new KeyValue(t5.getScale().yProperty(), 1, Interpolator.EASE_BOTH);
    final KeyValue kv3z = new KeyValue(t5.getScale().zProperty(), 1, Interpolator.EASE_BOTH);
    final KeyFrame kfs3 = new KeyFrame(Duration.millis(3000), kv3x, kv3y, kv3z);
    rotateEffect3.getKeyFrames().addAll(kfs1, kfs2, kfs3);
    //        rotateEffect3.play();
    final boolean constantVertices = true;
    lastEffect = System.nanoTime();
    AtomicInteger count = new AtomicInteger(0);
    AnimationTimer timerEffect = new AnimationTimer() {

        @Override
        public void handle(long now) {
            if (now > lastEffect + 50_000_000l) {
                //                    if(count.get()%10<2){
                //                        scatter.setTextureModeNone(Color.hsb(count.get()%360, 1, 1));
                //                    } else if(count.get()%10<4){
                //                        scatter.setTextureModeImage(getClass().getResource("res/steel-background1.jpg").toExternalForm());
                //                    } else if(count.get()%10<8){
                //                        scatter.setTextureModeVertices3D(1530,p->(double)(p.y/(20+count.get()%20))*(p.x/(10+count.get()%10)));
                //                    } else {
                //                        scatter.setTextureModeFaces(1530);
                //                    }
                //                    
                //                    if(count.get()%20>15){
                //                        scatter.setDrawMode(DrawMode.LINE);
                //                    } else {
                //                        scatter.setDrawMode(DrawMode.FILL);
                //                    }
                //                    scatter.getChildren().forEach(m->((TexturedMesh)m).setDensity(p->p.magnitude()*Math.cos(p.y/100d*(count.get()%5))));
                count.getAndIncrement();
                lastEffect = now;
            }
        }
    };
    //        timerEffect.start();
    OBJWriter writer = new OBJWriter((TriangleMesh) ((TexturedMesh) (scatter.getChildren().get(0))).getMesh(), "scatter");
    writer.setTextureColors(6);
    //writer.setTexturePattern();
    //        writer.setTextureImage(getClass().getResource("res/LaminateSteel.jpg").toExternalForm());
    writer.exportMesh();
}
Also used : Group(javafx.scene.Group) MouseEvent(javafx.scene.input.MouseEvent) KeyValue(javafx.animation.KeyValue) AnimationTimer(javafx.animation.AnimationTimer) ArrayList(java.util.ArrayList) PerspectiveCamera(javafx.scene.PerspectiveCamera) Scene(javafx.scene.Scene) OBJWriter(org.fxyz.utils.OBJWriter) ScatterMesh(org.fxyz.shapes.primitives.ScatterMesh) Timeline(javafx.animation.Timeline) TexturedMesh(org.fxyz.shapes.primitives.TexturedMesh) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Point3D(org.fxyz.geometry.Point3D) KeyFrame(javafx.animation.KeyFrame) KeyCode(javafx.scene.input.KeyCode) PointLight(javafx.scene.PointLight) AmbientLight(javafx.scene.AmbientLight)

Aggregations

ArrayList (java.util.ArrayList)2 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)2 AnimationTimer (javafx.animation.AnimationTimer)2 AmbientLight (javafx.scene.AmbientLight)2 Group (javafx.scene.Group)2 PerspectiveCamera (javafx.scene.PerspectiveCamera)2 PointLight (javafx.scene.PointLight)2 Scene (javafx.scene.Scene)2 KeyCode (javafx.scene.input.KeyCode)2 MouseEvent (javafx.scene.input.MouseEvent)2 Point3D (org.fxyz.geometry.Point3D)2 ScatterMesh (org.fxyz.shapes.primitives.ScatterMesh)2 IOException (java.io.IOException)1 URISyntaxException (java.net.URISyntaxException)1 Files (java.nio.file.Files)1 Path (java.nio.file.Path)1 Paths (java.nio.file.Paths)1 List (java.util.List)1 Stream (java.util.stream.Stream)1 KeyFrame (javafx.animation.KeyFrame)1