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); }
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 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(); } };