ObservableFloatArray points = mesh.getPoints(); int pointElementSize = mesh.getPointElementSize(); int os = points.size() / pointElementSize; newPoints.clear(); newPoints.ensureCapacity(points.size()); reindex.clear(); reindex.resize(os); for (int i = 0, oi = 0, ni = 0; i < points.size(); i += pointElementSize, oi++) { float x = points.get(i); float y = points.get(i + 1); float z = points.get(i + 2); Point3D p = new Point3D(x, y, z); Integer index = pp.get(p); pp.put(p, ni); reindex.set(oi, ni); newPoints.addAll(x, y, z); ni++; } else { int ns = newPoints.size() / pointElementSize; points.setAll(newPoints); points.trimToSize(); check += mesh.getPoints().size() / pointElementSize;
public ObjectProperty<PolygonMesh> meshProperty() { if (meshProperty == null) { meshProperty = new SimpleObjectProperty<PolygonMesh>(); meshProperty.addListener((observable, oldValue, newValue) -> { if (oldValue != null) { oldValue.getPoints().removeListener(meshPointsListener); oldValue.getPoints().removeListener(meshTexCoordListener); } meshProperty.set(newValue); pointsDirty = pointsSizeDirty = texCoordsDirty = facesDirty = true; updateMesh(); if (newValue != null) { newValue.getPoints().addListener(meshPointsListener); newValue.getTexCoords().addListener(meshTexCoordListener); } }); } return meshProperty; }
@Override public void update() { mesh.getPoints().copyTo(0, data, 0, data.length); } }
@Override public void run() { Platform.runLater(()->{ synchronized (lockSingles) { boolean firstPoint = meshSingles.getPoints().size() == 0; meshSingles.getPoints().setAll(pointSingles.data, 0, pointSingles.size); meshSingles.getFaces().setAll(facesSingles.data, 0, facesSingles.size); if (firstPoint) { meshSingles.getTexCoords().setAll(texCoords); final MeshView meshView = new MeshView(meshSingles); meshView.setMaterial(new PhongMaterial(Color.RED)); meshView.setDepthTest(DepthTest.ENABLE); meshView.setDrawMode(DrawMode.FILL); meshView.setCullFace(CullFace.BACK); world.getChildren().addAll(meshView); } timerSingles = null; taskSingles = null; } }); } };
final boolean isWireframe = getDrawMode() == DrawMode.LINE; if (DEBUG) System.out.println("UPDATE MESH -- "+(isWireframe?"WIREFRAME":"SOLID")); final int numOfPoints = pmesh.getPoints().size() / pointElementSize; if (DEBUG) System.out.println("numOfPoints = " + numOfPoints); int pointsInd = pmesh.getPoints().size(); for(int[] face: pmesh.faces) { if (DEBUG) System.out.println("face.length = " + (face.length/2)+" -- "+Arrays.toString(face)); texCoordsDirty = false; triangleMesh.getTexCoords().setAll(0,0); float [] pointsArray = new float [pmesh.getPoints().size() + pmesh.getNumEdgesInFaces()*3]; pmesh.getPoints().copyTo(0, pointsArray, 0, pmesh.getPoints().size()); int pointsInd = pmesh.getPoints().size(); for(int[] face: pmesh.faces) { int lastPointIndex = face[face.length-2]; triangleMesh.getPoints().setAll(pointsArray); triangleMesh.getTexCoords().setAll(pmesh.getTexCoords()); triangleMesh.getPoints().setAll(pmesh.getPoints());
public OriginalPointArray(PolygonMesh mesh) { super(new float[mesh.getPoints().size()]); this.mesh = mesh; }
public SubdivisionMesh(PolygonMesh originalMesh, int subdivisionLevel, BoundaryMode boundaryMode, MapBorderMode mapBorderMode) { this.originalMesh = originalMesh; setSubdivisionLevelForced(subdivisionLevel); setBoundaryModeForced(boundaryMode); setMapBorderModeForced(mapBorderMode); symbolicMeshes = new ArrayList<>(4); // the polymesh is usually subdivided up to 3 times originalMesh.getPoints().addListener((observableArray, sizeChanged, from, to) -> { if (sizeChanged) { meshDirty = true; } else { pointValuesDirty = true; } }); originalMesh.getTexCoords().addListener((observableArray, sizeChanged, from, to) -> meshDirty = true); }
triangleMesh.getPoints().addAll(convertToFloatArray(vertices)); triangleMesh.getTexCoords().addAll(convertToFloatArray(texturePoints)); triangleMesh.getFaces().addAll(indices); triangleMesh.getFaceSmoothingGroups().addAll(new int[indices.length / triangleMesh.getFaceElementSize()]); triangleMesh.getNormals().addAll(convertToFloatArray(normals));
mesh.getPoints().setAll(newVertexes.toFloatArray()); mesh.getTexCoords().setAll(newUVs.toFloatArray()); mesh.getFaces().setAll(((IntegerArrayList) faces.subList(facesStart, faces.size())).toIntArray()); "Added mesh '" + key + "' of " + mesh.getPoints().size() / mesh.getPointElementSize() + " vertexes, " + mesh.getTexCoords().size() / mesh.getTexCoordElementSize() + " uvs, " + mesh.getFaces().size() / mesh.getFaceElementSize() + " faces, " + mesh.getFaceSmoothingGroups().size() + " smoothing groups.");
int numPoints = tMesh.getPoints().size() / tMesh.getPointElementSize(); int numTexCoords = tMesh.getTexCoords().size() / tMesh.getTexCoordElementSize(); int numFaces = tMesh.getFaces().size() / tMesh.getFaceElementSize(); if (numPoints == 0 || numPoints * tMesh.getPointElementSize() != tMesh.getPoints().size()) { throw new AssertionError("Points array size is not correct: " + tMesh.getPoints().size()); if (numTexCoords == 0 || numTexCoords * tMesh.getTexCoordElementSize() != tMesh.getTexCoords().size()) { throw new AssertionError("TexCoords array size is not correct: " + tMesh.getPoints().size()); throw new AssertionError("Faces array size is not correct: " + tMesh.getPoints().size()); throw new AssertionError("FaceSmoothingGroups array size is not correct: " + tMesh.getPoints().size() + ", numFaces = " + numFaces);
@Override protected void invalidated() { // create SubdivisionMesh if subdivisionLevel is greater than 0 if ((getSubdivisionLevel() > 0) && (subdivisionMesh == null)) { subdivisionMesh = new SubdivisionMesh(getMesh(), getSubdivisionLevel(), getBoundaryMode(), getMapBorderMode()); subdivisionMesh.getOriginalMesh().getPoints().addListener((t, bln, i, i1) -> subdivisionMesh.update()); setMesh(subdivisionMesh); } if (subdivisionMesh != null) { subdivisionMesh.setSubdivisionLevel(getSubdivisionLevel()); subdivisionMesh.update(); } pointsDirty = pointsSizeDirty = texCoordsDirty = facesDirty = true; updateMesh(); } };
ObservableFloatArray texcoords = mesh.getTexCoords(); int texcoordElementSize = mesh.getTexCoordElementSize(); int os = texcoords.size() / texcoordElementSize; newTexCoords.clear(); newTexCoords.ensureCapacity(texcoords.size()); reindex.clear(); reindex.resize(os); for (int i = 0, oi = 0, ni = 0; i < texcoords.size(); i += texcoordElementSize, oi++) { float x = texcoords.get(i); float y = texcoords.get(i + 1); Point2D p = new Point2D(x, y); Integer index = pp.get(p); pp.put(p, ni); reindex.set(oi, ni); newTexCoords.addAll(x, y); ni++; } else { int ns = newTexCoords.size() / texcoordElementSize; texcoords.setAll(newTexCoords); texcoords.trimToSize(); check += mesh.getTexCoords().size() / texcoordElementSize;
triangleMesh.getPoints().addAll(convertToFloatArray(vertices)); triangleMesh.getTexCoords().addAll(convertToFloatArray(texturePoints)); triangleMesh.getFaces().addAll(indices); triangleMesh.getFaceSmoothingGroups().addAll(new int[indices.length / triangleMesh.getFaceElementSize()]); triangleMesh.getNormals().addAll(convertToFloatArray(normals));
mesh.getPoints().addAll( (float) firstVertex.pos.x(), (float) firstVertex.pos.y(), (float) firstVertex.pos.z()); mesh.getTexCoords().addAll(0); // texture (not covered) mesh.getTexCoords().addAll(0); mesh.getPoints().addAll( (float) secondVertex.pos.x(), (float) secondVertex.pos.y(), (float) secondVertex.pos.z()); mesh.getTexCoords().addAll(0); // texture (not covered) mesh.getTexCoords().addAll(0); mesh.getPoints().addAll( (float) thirdVertex.pos.x(), (float) thirdVertex.pos.y(), mesh.getTexCoords().addAll(0); // texture (not covered) mesh.getTexCoords().addAll(0);
mesh.getPoints().addAll( (float) firstVertex.getLocation().x, (float) firstVertex.getLocation().y, (float) firstVertex.getLocation().z); mesh.getTexCoords().addAll(0); // texture (not covered) mesh.getTexCoords().addAll(0); mesh.getPoints().addAll( (float) secondVertex.getLocation().x, (float) secondVertex.getLocation().y, (float) secondVertex.getLocation().z); mesh.getTexCoords().addAll(0); // texture (not covered) mesh.getTexCoords().addAll(0); mesh.getPoints().addAll( (float) thirdVertex.getLocation().x, (float) thirdVertex.getLocation().y, (float) thirdVertex.getLocation().z); mesh.getTexCoords().addAll(0); // texture (not covered) mesh.getTexCoords().addAll(0);