use of javafx.scene.transform.Translate in project FXyzLib by Birdasaur.
the class SegmentedSphereMesh method createSegmentedSphere.
private TriangleMesh createSegmentedSphere(int subDivY, int cropX, int cropY, float radius, float tubeStartAngle, float xOffset, float yOffset, float zOffset) {
listVertices.clear();
listTextures.clear();
listFaces.clear();
int subDivX = subDivY;
int numDivX = subDivX + 1 - 2 * cropX;
float pointX, pointY, pointZ;
areaMesh.setWidth((1 - 2 * cropX / subDivX) * 2d * Math.PI * radius);
areaMesh.setHeight((1 - 2 * cropY / subDivY) * 2d * Math.PI * radius);
a = new Affine();
if (center.get() != null) {
a = a.createConcatenation(new Translate(center.get().x, center.get().y, center.get().z));
}
// Create points
for (int y = cropY; y <= subDivY - cropY; y++) {
float dy = (float) y / subDivY;
for (int x = cropX; x <= subDivX - cropX; x++) {
float dx = (float) x / subDivX;
if (cropX > 0 || (cropX == 0 && x < subDivX)) {
pointX = (float) ((radius * Math.sin((-1d + dy) * Math.PI)) * (Math.cos((-1d + 2d * dx) * Math.PI) + xOffset));
pointZ = (float) ((radius * Math.sin((-1d + dy) * Math.PI)) * (Math.sin((-1d + 2d * dx) * Math.PI) + yOffset));
pointY = (float) (radius * Math.cos((-1d + dy) * Math.PI) * zOffset);
Point3D ta = transform(pointX, pointY, pointZ);
listVertices.add(ta);
}
}
}
// Create texture coordinates
// if(exterior.get()){
createTexCoords(subDivX - 2 * cropX, subDivY - 2 * cropY);
// Create textures indices
for (int y = cropY; y < subDivY - cropY; y++) {
for (int x = cropX; x < subDivX - cropX; x++) {
int p00 = (y - cropY) * numDivX + (x - cropX);
int p01 = p00 + 1;
int p10 = p00 + numDivX;
int p11 = p10 + 1;
if (y < subDivY - 1) {
listTextures.add(new Face3(p00, p10, p11));
}
if (y > 0) {
listTextures.add(new Face3(p11, p01, p00));
}
}
}
// Create faces indices
for (int y = cropY; y < subDivY - cropY; y++) {
for (int x = cropX; x < subDivX - cropX; x++) {
int p00 = (y - cropY) * ((cropX > 0) ? numDivX : numDivX - 1) + (x - cropX);
int p01 = p00 + 1;
if (cropX == 0 && x == subDivX - 1) {
p01 -= subDivX;
}
int p10 = p00 + ((cropX > 0) ? numDivX : numDivX - 1);
// if(cropY==0 && y==subDivY-1){
// p10-=subDivY*((cropX>0)?numDivX:numDivX-1);
// }
int p11 = p10 + 1;
if (cropX == 0 && x == subDivX - 1) {
p11 -= subDivX;
}
if (y < subDivY - 1) {
listFaces.add(new Face3(p00, p10, p11));
}
if (y > 0) {
listFaces.add(new Face3(p11, p01, p00));
}
}
}
return createMesh();
}
use of javafx.scene.transform.Translate in project FXyzLib by Birdasaur.
the class CuboidMesh method createCube.
private TriangleMesh createCube(float width, float height, float depth, int level) {
TriangleMesh m0 = null;
if (level > 0) {
m0 = createCube(width, height, depth, level - 1);
}
if (level == 0) {
a = new Affine();
float L = 2f * width + 2f * depth;
float H = height + 2f * depth;
float hw = width / 2f, hh = height / 2f, hd = depth / 2f;
if (center.get() != null) {
a = a.createConcatenation(new Translate(center.get().x, center.get().y, center.get().z));
// hw+=center.get().x;
// hh+=center.get().y;
// hd+=center.get().z;
}
final float[] baseVertices = new float[] { hw, hh, hd, hw, hh, -hd, hw, -hh, hd, hw, -hh, -hd, -hw, hh, hd, -hw, hh, -hd, -hw, -hh, hd, -hw, -hh, -hd };
final float[] baseTexCoords = new float[] { depth / L, 0f, (depth + width) / L, 0f, 0f, depth / H, depth / L, depth / H, (depth + width) / L, depth / H, (2f * depth + width) / L, depth / H, 1f, depth / H, 0f, (depth + height) / H, depth / L, (depth + height) / H, (depth + width) / L, (depth + height) / H, (2f * depth + width) / L, (depth + height) / H, 1f, (depth + height) / H, depth / L, 1f, (depth + width) / L, 1f };
final int[] baseTexture = new int[] { 8, 3, 7, 3, 2, 7, 9, 10, 4, 4, 10, 5, 8, 12, 9, 9, 12, 13, 3, 4, 0, 0, 4, 1, 8, 9, 3, 3, 9, 4, 11, 6, 10, 10, 6, 5 };
final List<Integer> baseFaces = Arrays.asList(0, 2, 1, 2, 3, 1, 4, 5, 6, 6, 5, 7, 0, 1, 4, 4, 1, 5, 2, 6, 3, 3, 6, 7, 0, 4, 2, 2, 4, 6, 1, 3, 5, 5, 3, 7);
for (int i = 0; i < baseVertices.length / 3; i++) {
Point3D ta = transform(baseVertices[3 * i], baseVertices[3 * i + 1], baseVertices[3 * i + 2]);
baseVertices[3 * i] = ta.x;
baseVertices[3 * i + 1] = ta.y;
baseVertices[3 * i + 2] = ta.z;
}
points0 = baseVertices;
numVertices = baseVertices.length / 3;
texCoord0 = baseTexCoords;
numTexCoords = baseTexCoords.length / 2;
faces0 = IntStream.range(0, baseFaces.size() / 3).mapToObj(i -> IntStream.of(baseFaces.get(3 * i), baseTexture[3 * i], baseFaces.get(3 * i + 1), baseTexture[3 * i + 1], baseFaces.get(3 * i + 2), baseTexture[3 * i + 2])).flatMapToInt(i -> i).toArray();
numFaces = baseFaces.size() / 3;
} else if (m0 != null) {
points0 = new float[numVertices * m0.getPointElementSize()];
m0.getPoints().toArray(points0);
}
List<Point3D> points1 = IntStream.range(0, numVertices).mapToObj(i -> new Point3D(points0[3 * i], points0[3 * i + 1], points0[3 * i + 2])).collect(Collectors.toList());
if (level > 0 && m0 != null) {
texCoord0 = new float[numTexCoords * m0.getTexCoordElementSize()];
m0.getTexCoords().toArray(texCoord0);
}
texCoord1 = IntStream.range(0, numTexCoords).mapToObj(i -> new Point2D(texCoord0[2 * i], texCoord0[2 * i + 1])).collect(Collectors.toList());
if (level > 0 && m0 != null) {
faces0 = new int[numFaces * m0.getFaceElementSize()];
m0.getFaces().toArray(faces0);
}
List<Face3> faces1 = IntStream.range(0, numFaces).mapToObj(i -> new Face3(faces0[6 * i], faces0[6 * i + 2], faces0[6 * i + 4])).collect(Collectors.toList());
index.set(points1.size());
map.clear();
listVertices.clear();
listFaces.clear();
listVertices.addAll(points1);
faces1.forEach(face -> {
int v1 = face.p0;
int v2 = face.p1;
int v3 = face.p2;
if (level > 0) {
int a = getMiddle(v1, points1.get(v1), v2, points1.get(v2));
int b = getMiddle(v2, points1.get(v2), v3, points1.get(v3));
int c = getMiddle(v3, points1.get(v3), v1, points1.get(v1));
listFaces.add(new Face3(v1, a, c));
listFaces.add(new Face3(v2, b, a));
listFaces.add(new Face3(v3, c, b));
listFaces.add(new Face3(a, b, c));
} else {
listFaces.add(new Face3(v1, v2, v3));
}
});
map.clear();
numVertices = listVertices.size();
numFaces = listFaces.size();
List<Face3> textures1;
if (level == 0) {
textures1 = IntStream.range(0, faces0.length / 6).mapToObj(i -> new Face3(faces0[6 * i + 1], faces0[6 * i + 3], faces0[6 * i + 5])).collect(Collectors.toList());
} else {
textures1 = listTextures.stream().map(t -> t).collect(Collectors.toList());
}
index.set(texCoord1.size());
listTextures.clear();
textures1.forEach(face -> {
int v1 = face.p0;
int v2 = face.p1;
int v3 = face.p2;
if (level > 0) {
int a = getMiddle(v1, texCoord1.get(v1), v2, texCoord1.get(v2));
int b = getMiddle(v2, texCoord1.get(v2), v3, texCoord1.get(v3));
int c = getMiddle(v3, texCoord1.get(v3), v1, texCoord1.get(v1));
listTextures.add(new Face3(v1, a, c));
listTextures.add(new Face3(v2, b, a));
listTextures.add(new Face3(v3, c, b));
listTextures.add(new Face3(a, b, c));
} else {
listTextures.add(new Face3(v1, v2, v3));
}
});
map.clear();
texCoord0 = texCoord1.stream().flatMapToDouble(p -> DoubleStream.of(p.getX(), p.getY())).collect(() -> new FloatCollector(texCoord1.size() * 2), FloatCollector::add, FloatCollector::join).toArray();
numTexCoords = texCoord0.length / 2;
textureCoords = texCoord0;
if (level == getLevel()) {
areaMesh.setWidth(2f * width + 2f * depth);
areaMesh.setHeight(height + 2f * depth);
// 1<<j -> bitset, 00100. Otherwise: 000111 will mean they are shared
smoothingGroups = IntStream.range(0, listFaces.size()).map(i -> 1 << (i / (listFaces.size() / 6))).toArray();
// smoothing groups based on 3DViewer -> same result
// float[] normals=new float[]{1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1};
// int[] newFaces = IntStream.range(0, listFaces.size())
// .mapToObj(i->IntStream.of((int)listFaces.get(i).x, (int)listFaces.get(i).x,
// (int)listFaces.get(i).y, (int)listFaces.get(i).y,
// (int)listFaces.get(i).z, (int)listFaces.get(i).z))
// .flatMapToInt(i->i).toArray();
// int[] newFaceNormals = IntStream.range(0,listFaces.size()).mapToObj(i->{
// int j=(i/(listFaces.size()/6));
// return IntStream.of(j,j,j);
// }).flatMapToInt(i->i).toArray();
// smoothingGroups=SmoothingGroups.calcSmoothGroups(new TriangleMesh(), newFaces, newFaceNormals, normals);
}
return createMesh();
}
use of javafx.scene.transform.Translate 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.setTextureModeVertices1D(1530, t -> spline.getKappa(t.doubleValue()));
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;
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) {
// 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();
}
use of javafx.scene.transform.Translate in project FXyzLib by Birdasaur.
the class CapsuleTest method start.
@Override
public void start(Stage stage) {
Group capsuleGroup = new Group();
for (int i = 0; i < 50; i++) {
Random r = new Random();
//A lot of magic numbers in here that just artificially constrain the math
float randomRadius = (float) ((r.nextFloat() * 100) + 25);
float randomHeight = (float) ((r.nextFloat() * 300) + 75);
Color randomColor = new Color(r.nextDouble(), r.nextDouble(), r.nextDouble(), r.nextDouble());
Capsule cap = new Capsule(randomRadius, randomHeight, randomColor);
cap.setEmissiveLightingColor(randomColor);
cap.setEmissiveLightingOn(r.nextBoolean());
cap.setDrawMode(r.nextBoolean() ? DrawMode.FILL : DrawMode.LINE);
double translationX = Math.random() * 1024 * 1.95;
if (Math.random() >= 0.5) {
translationX *= -1;
}
double translationY = Math.random() * 1024 * 1.95;
if (Math.random() >= 0.5) {
translationY *= -1;
}
double translationZ = Math.random() * 1024 * 1.95;
if (Math.random() >= 0.5) {
translationZ *= -1;
}
Translate translate = new Translate(translationX, translationY, translationZ);
Rotate rotateX = new Rotate(Math.random() * 360, Rotate.X_AXIS);
Rotate rotateY = new Rotate(Math.random() * 360, Rotate.Y_AXIS);
Rotate rotateZ = new Rotate(Math.random() * 360, Rotate.Z_AXIS);
cap.getTransforms().addAll(translate, rotateX, rotateY, rotateZ);
capsuleGroup.getChildren().add(cap);
}
root.getChildren().add(capsuleGroup);
camera = new AdvancedCamera();
controller = new FPSController();
camera.setNearClip(0.1);
camera.setFarClip(10000.0);
camera.setFieldOfView(42);
camera.setController(controller);
Scene scene = new Scene(new StackPane(root), 1024, 668, true, SceneAntialiasing.BALANCED);
scene.setCamera(camera);
scene.setFill(Color.BLACK);
controller.setScene(scene);
stage.setTitle("Hello World!");
stage.setScene(scene);
stage.show();
stage.setFullScreen(true);
stage.setFullScreenExitHint("");
}
use of javafx.scene.transform.Translate in project FXyzLib by Birdasaur.
the class Text3DMesh method createLetter.
private void createLetter(String letter) {
Text3DHelper helper = new Text3DHelper(letter, font.get(), fontSize.get());
List<Point3D> origin = helper.getOffset();
final int ind = indSegments.get();
helper.getLineSegment().stream().map(poly -> poly.getPath()).forEach(path -> letterPath = Shape.union(letterPath, path));
helper.getLineSegment().stream().forEach(poly -> {
final List<Point3D> points = poly.getPoints();
List<List<Point3D>> holes = null;
if (poly.getHoles().size() > 0) {
holes = poly.getHoles().stream().map(LineSegment::getPoints).collect(Collectors.toList());
}
List<Point3D> invert = IntStream.range(0, points.size()).mapToObj(i -> points.get(points.size() - 1 - i)).distinct().collect(Collectors.toList());
Bounds bounds = null;
if (joinSegments.get()) {
bounds = letterPath.getBoundsInParent();
}
TriangulatedMesh polyMesh = new TriangulatedMesh(invert, holes, level.get(), height.get(), 0d, bounds);
if (indSegments.get() > ind && joinSegments.get()) {
MeshHelper mh = new MeshHelper((TriangleMesh) meshes.get(meshes.size() - 1).getMesh());
MeshHelper mh1 = new MeshHelper((TriangleMesh) polyMesh.getMesh());
mh1.addMesh(mh);
polyMesh.updateMesh(mh1);
meshes.set(meshes.size() - 1, polyMesh);
} else {
meshes.add(polyMesh);
}
polyMesh.getTransforms().addAll(new Translate(offset.get(ind).x - origin.get(0).x + indLetters.get() * gap.doubleValue(), 0, 0));
polyMesh.setCullFace(CullFace.BACK);
polyMesh.setDrawMode(DrawMode.FILL);
polyMesh.setDepthTest(DepthTest.ENABLE);
polyMesh.setId(poly.getLetter());
System.out.println("l " + poly.getLetter());
indSegments.getAndIncrement();
});
indLetters.getAndIncrement();
}
Aggregations