use of javafx.scene.PointLight in project FXyzLib by Birdasaur.
the class SegmentedSphereTest 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(100000.0);
camera.setTranslateZ(-0);
camera.setFieldOfView(100);
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(0);
light.setTranslateY(0);
light.setTranslateZ(-1000);
scene.setCamera(camera);
rotateY = new Rotate(0, 0, 0, 0, Rotate.Y_AXIS);
Group group = new Group();
group.getChildren().add(cameraTransform);
// torus = new SegmentedSphereMesh(100, 0, 10, 2000d, new Point3D(20f,4f,-2f));
sphere = new SegmentedSphereMesh(200, 0, 0, 100, new Point3D(0f, 0f, 0f));
// torus.setDrawMode(DrawMode.LINE);
// torus.setCullFace(CullFace.NONE);
// NONE
// torus.setTextureModeNone(Color.FORESTGREEN);
// IMAGE
// torus.setTextureModeImage(getClass().getResource("res/share-carousel_In.png").toExternalForm());
// PATTERN
// torus.setTextureModePattern(20.0d);
// DENSITY
sphere.setTextureModeVertices3D(2, dens);
// FACES
// torus.setTextureModeFaces(256*256);
sphere.getTransforms().addAll(new Rotate(0, Rotate.X_AXIS), rotateY);
// banner.getTransforms().addAll(new Rotate(0,Rotate.X_AXIS),rotateY);
//,banner);
group.getChildren().addAll(sphere);
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);
}
if (keycode == KeyCode.L) {
camera.setTranslateY(camera.getTranslateY() - change);
}
if (keycode == KeyCode.R) {
camera.setTranslateY(camera.getTranslateY() + 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.setRadius(150+10*(count.get()%10));
// torus.setPatternScale(1d+(count.get()%10)*5d);
count.getAndIncrement();
lastEffect = now;
}
}
};
primaryStage.setTitle("F(X)yz - Segmented Sphere");
primaryStage.setScene(scene);
primaryStage.show();
// timerEffect.start();
final Timeline bannerEffect = new Timeline();
bannerEffect.setCycleCount(Timeline.INDEFINITE);
final KeyValue kv1 = new KeyValue(cameraTransform.ry.angleProperty(), 360);
final KeyFrame kf1 = new KeyFrame(Duration.millis(20000), kv1);
bannerEffect.getKeyFrames().addAll(kf1);
// bannerEffect.play();
}
use of javafx.scene.PointLight 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;
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 - 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();
}
use of javafx.scene.PointLight 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;
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);
}
});
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();
}
use of javafx.scene.PointLight 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;
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);
}
});
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();
}
use of javafx.scene.PointLight in project FXyzLib by Birdasaur.
the class RayTest 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(-40);
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, 100, 20, 0, 0);
// knot.setDrawMode(DrawMode.LINE);
knot.setCullFace(CullFace.NONE);
knot.setSectionType(SectionType.TRIANGLE);
spring = new CurvedSpringMesh(6d, 2d, 0.4d, 25d, 6.25d * 2d * Math.PI, 1000, 60, 0, 0);
spring.getTransforms().addAll(new Translate(6, -6, 0));
spring.setDrawMode(DrawMode.LINE);
spring.setCullFace(CullFace.NONE);
// spring.setTextureModeVertices3D(256*256,dens);
// NONE
knot.setTextureModeNone(Color.BROWN);
spring.setTextureModeNone(Color.BROWN);
knot.getTransforms().addAll(new Rotate(0, Rotate.X_AXIS), rotateY);
group.getChildren().add(knot);
group.getChildren().add(spring);
/*
Origin in knot
Target in spring
*/
org.fxyz.geometry.Point3D locOrigin = knot.getOrigin();
Point3D gloOrigin = knot.localToScene(new Point3D(locOrigin.x, locOrigin.y, locOrigin.z));
org.fxyz.geometry.Point3D locTarget1 = spring.getOrigin();
Point3D locTarget2 = new Point3D(locTarget1.x, locTarget1.y, locTarget1.z);
Point3D gloTarget = spring.localToScene(locTarget2);
Point3D gloDirection = gloTarget.subtract(gloOrigin).normalize();
Point3D gloOriginInLoc = spring.sceneToLocal(gloOrigin);
Bounds locBounds = spring.getBoundsInLocal();
Bounds gloBounds = spring.localToScene(locBounds);
Sphere s = new Sphere(0.05d);
s.getTransforms().add(new Translate(gloOrigin.getX(), gloOrigin.getY(), gloOrigin.getZ()));
s.setMaterial(new PhongMaterial(Color.GREENYELLOW));
group.getChildren().add(s);
s = new Sphere(0.05d);
s.getTransforms().add(new Translate(gloTarget.getX(), gloTarget.getY(), gloTarget.getZ()));
s.setMaterial(new PhongMaterial(Color.GREENYELLOW));
Point3D dir = gloTarget.subtract(gloOrigin).crossProduct(new Point3D(0, -1, 0));
double angle = Math.acos(gloTarget.subtract(gloOrigin).normalize().dotProduct(new Point3D(0, -1, 0)));
double h1 = gloTarget.subtract(gloOrigin).magnitude();
Cylinder c = new Cylinder(0.01d, h1);
c.getTransforms().addAll(new Translate(gloOrigin.getX(), gloOrigin.getY() - h1 / 2d, gloOrigin.getZ()), new Rotate(-Math.toDegrees(angle), 0d, h1 / 2d, 0d, new Point3D(dir.getX(), -dir.getY(), dir.getZ())));
c.setMaterial(new PhongMaterial(Color.GREEN));
group.getChildren().add(c);
group.getChildren().add(new Axes(0.02));
Box box = new Box(gloBounds.getWidth(), gloBounds.getHeight(), gloBounds.getDepth());
// If transparency is enabled (8u60+), comment:
box.setDrawMode(DrawMode.LINE);
box.setCullFace(CullFace.NONE);
// If transparency is enabled (8u60+), uncomment:
// box.setMaterial(new PhongMaterial(Color.web("8A2BE2",0.3)));
box.getTransforms().add(new Translate(gloBounds.getMinX() + gloBounds.getWidth() / 2d, gloBounds.getMinY() + gloBounds.getHeight() / 2d, gloBounds.getMinZ() + gloBounds.getDepth() / 2d));
group.getChildren().add(box);
/*
FIRST STEP; Check the ray crosses the bounding box of the shape at any of
its 6 faces
*/
List<Point3D> normals = Arrays.asList(new Point3D(-1, 0, 0), new Point3D(1, 0, 0), new Point3D(0, -1, 0), new Point3D(0, 1, 0), new Point3D(0, 0, -1), new Point3D(0, 0, 1));
List<Point3D> positions = Arrays.asList(new Point3D(locBounds.getMinX(), 0, 0), new Point3D(locBounds.getMaxX(), 0, 0), new Point3D(0, locBounds.getMinY(), 0), new Point3D(0, locBounds.getMaxY(), 0), new Point3D(0, 0, locBounds.getMinZ()), new Point3D(0, 0, locBounds.getMaxZ()));
AtomicInteger counter = new AtomicInteger();
IntStream.range(0, 6).forEach(i -> {
double d = -normals.get(i).dotProduct(positions.get(i));
double t = -(gloOriginInLoc.dotProduct(normals.get(i)) + d) / (gloDirection.dotProduct(normals.get(i)));
Point3D locInter = gloOriginInLoc.add(gloDirection.multiply(t));
if (locBounds.contains(locInter)) {
counter.getAndIncrement();
Point3D gloInter = spring.localToScene(locInter);
Sphere s2 = new Sphere(0.1d);
s2.getTransforms().add(new Translate(gloInter.getX(), gloInter.getY(), gloInter.getZ()));
s2.setMaterial(new PhongMaterial(Color.GOLD));
group.getChildren().add(s2);
}
});
if (counter.get() > 0) {
/*
SECOND STEP: Check if the ray crosses any of the triangles of the mesh
*/
// triangle mesh
org.fxyz.geometry.Point3D gloOriginInLoc1 = new org.fxyz.geometry.Point3D((float) gloOriginInLoc.getX(), (float) gloOriginInLoc.getY(), (float) gloOriginInLoc.getZ());
org.fxyz.geometry.Point3D gloDirection1 = new org.fxyz.geometry.Point3D((float) gloDirection.getX(), (float) gloDirection.getY(), (float) gloDirection.getZ());
System.out.println("inter: " + spring.getIntersections(gloOriginInLoc1, gloDirection1));
}
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 - Ray Picker Between Nodes");
primaryStage.setScene(scene);
primaryStage.show();
}
Aggregations