Commit e4b2b087 authored by iSergio's avatar iSergio
Browse files

Up example with original. Need check all examples.

parent 2f59918e
Loading
Loading
Loading
Loading
+182 −36
Original line number Diff line number Diff line
@@ -17,18 +17,11 @@
package org.cleanlogic.cesiumjs4gwt.showcase.examples;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.*;
import org.cesiumjs.cs.Cesium;
import org.cesiumjs.cs.collections.ClippingPlaneCollection;
import org.cesiumjs.cs.collections.options.ClippingPlaneCollectionOptions;
import org.cesiumjs.cs.core.Cartesian3;
import org.cesiumjs.cs.core.Color;
import org.cesiumjs.cs.core.JulianDate;
import org.cesiumjs.cs.core.providers.CesiumTerrainProvider;
import org.cesiumjs.cs.core.providers.options.CesiumTerrainProviderOptions;
import org.cesiumjs.cs.core.*;
import org.cesiumjs.cs.datasources.Entity;
import org.cesiumjs.cs.datasources.graphics.BoxGraphics;
import org.cesiumjs.cs.datasources.graphics.ModelGraphics;
@@ -38,6 +31,10 @@ import org.cesiumjs.cs.datasources.options.EntityOptions;
import org.cesiumjs.cs.datasources.properties.ColorMaterialProperty;
import org.cesiumjs.cs.datasources.properties.ConstantPositionProperty;
import org.cesiumjs.cs.datasources.properties.ConstantProperty;
import org.cesiumjs.cs.js.JsObject;
import org.cesiumjs.cs.promise.Promise;
import org.cesiumjs.cs.scene.Cesium3DTileStyle;
import org.cesiumjs.cs.scene.Cesium3DTileset;
import org.cesiumjs.cs.scene.ClippingPlane;
import org.cesiumjs.cs.scene.Globe;
import org.cesiumjs.cs.widgets.ViewerPanel;
@@ -46,11 +43,18 @@ import org.cleanlogic.cesiumjs4gwt.showcase.basic.AbstractExample;
import org.cleanlogic.cesiumjs4gwt.showcase.components.store.ShowcaseExampleStore;

import javax.inject.Inject;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Serge Silaev aka iSergio
 */
public class TerrainClippingPlanes extends AbstractExample {
    private ViewerPanel csVPanel;
    private Cesium3DTileset tileset;
    private boolean edgeStylingEnabled = true;
    private boolean clippingPlanesEnabled = true;

    @Inject
    public TerrainClippingPlanes(ShowcaseExampleStore store) {
        super("Terrain Clipping Planes", "User-defined clipping planes applied to terrain.",
@@ -61,14 +65,68 @@ public class TerrainClippingPlanes extends AbstractExample {
    public void buildPanel() {
        ViewerOptions viewerOptions = new ViewerOptions();
        viewerOptions.skyAtmosphere = null;
        final ViewerPanel csVPanel = new ViewerPanel(viewerOptions);
        csVPanel = new ViewerPanel(viewerOptions);

        csVPanel.getViewer().terrainProvider = Cesium.createWorldTerrain();

        loadCesiumMan();

        ListBox listBox = new ListBox();
        listBox.addItem("Cesium Man", "0");
        listBox.addItem("St. Helens", "1");
        listBox.addItem("Grand Canyon Isolated", "2");
        listBox.addChangeHandler(event -> {
            ListBox source = (ListBox) event.getSource();
            int value = Integer.parseInt(source.getSelectedValue());
            reset();
            if (value == 0) {
                loadCesiumMan();
            } else if (value == 1) {
                loadStHelens();
            } else if (value == 2) {
                loadGrandCanyon();
            }
        });

        CheckBox globeClippingCBox = new CheckBox("Globe clipping planes enabled");
        globeClippingCBox.setValue(true);
        globeClippingCBox.getElement().getStyle().setColor("white");
        globeClippingCBox.addValueChangeHandler(event -> {
            clippingPlanesEnabled = event.getValue();
            csVPanel.getViewer().scene().globe.clippingPlanes.enabled = event.getValue();
        });

        CheckBox edgeStylingCBox = new CheckBox("Edge styling enabled");
        edgeStylingCBox.setValue(true);
        edgeStylingCBox.getElement().getStyle().setColor("white");
        edgeStylingCBox.addValueChangeHandler(event -> {
            edgeStylingEnabled = event.getValue();
            csVPanel.getViewer().scene().globe.clippingPlanes.edgeWidth = edgeStylingEnabled ? 1.0 : 0.0;
        });

        HorizontalPanel hPanel = new HorizontalPanel();
        hPanel.add(listBox);
        hPanel.add(globeClippingCBox);
        hPanel.add(edgeStylingCBox);

        AbsolutePanel aPanel = new AbsolutePanel();
        aPanel.add(csVPanel);
        aPanel.add(hPanel, 20, 20);

        contentPanel.add(new HTML("<p>User-defined clipping planes applied to terrain.</p>"));
        contentPanel.add(aPanel);

        CesiumTerrainProviderOptions terrainProviderOptions = new CesiumTerrainProviderOptions();
        terrainProviderOptions.url = "https://assets.agi.com/stk-terrain/v1/tilesets/world/tiles";
        terrainProviderOptions.requestWaterMask = true;
        terrainProviderOptions.requestVertexNormals = true;
        csVPanel.getViewer().terrainProvider = new CesiumTerrainProvider(terrainProviderOptions);
        initWidget(contentPanel);
    }

    @Override
    public String[] getSourceCodeURLs() {
        String[] sourceCodeURLs = new String[1];
        sourceCodeURLs[0] = GWT.getModuleBaseURL() + "examples/" + "TerrainClippingPlanes.txt";
        return sourceCodeURLs;
    }

    private void loadCesiumMan() {
        Cartesian3 position = Cartesian3.fromRadians(-2.0862979473351286, 0.6586620013036164, 1400.0);

        BoxGraphicsOptions boxGraphicsOptions = new BoxGraphicsOptions();
@@ -108,31 +166,119 @@ public class TerrainClippingPlanes extends AbstractExample {
        globe.clippingPlanes = new ClippingPlaneCollection(clippingPlaneCollectionOptions);

        csVPanel.getViewer().trackedEntity = entity;
    }

        CheckBox globeClippingCBox = new CheckBox("Globe clipping planes enabled");
        globeClippingCBox.setValue(true);
        globeClippingCBox.getElement().getStyle().setColor("white");
        globeClippingCBox.addValueChangeHandler(new ValueChangeHandler<Boolean>() {
            @Override
            public void onValueChange(ValueChangeEvent<Boolean> event) {
                globe.clippingPlanes.enabled = event.getValue();
    private Promise<Cesium3DTileset, Void> loadStHelens() {
        // Create clipping planes for polygon around area to be clipped.
        Cartesian3[] points = new Cartesian3[] {
                new Cartesian3(-2358434.3501556474, -3743554.5012105294, 4581080.771684084),
                new Cartesian3(-2357886.4482675144, -3744467.562778789, 4581020.9199767085),
                new Cartesian3(-2357299.84353055, -3744954.0879047974, 4581080.992360969),
                new Cartesian3(-2356412.05169956, -3745385.3013702347, 4580893.4737207815),
                new Cartesian3(-2355472.889436636, -3745256.5725702164, 4581252.3128526565),
                new Cartesian3(-2354385.7458722834, -3744319.3823686405, 4582372.770031389),
                new Cartesian3(-2353758.788158616, -3743051.0128084184, 4583356.453176038),
                new Cartesian3(-2353663.8128999653, -3741847.9126874236, 4584079.428665509),
                new Cartesian3(-2354213.667592133, -3740784.50946316, 4584502.428203525),
                new Cartesian3(-2355596.239450013, -3739901.0226732804, 4584515.9652557485),
                new Cartesian3(-2356942.4170108805, -3740342.454698685, 4583686.690694482),
                new Cartesian3(-2357529.554838029, -3740766.995076834, 4583145.055348843),
                new Cartesian3(-2358106.017822064, -3741439.438418052, 4582452.293605261),
                new Cartesian3(-2358539.5426236596, -3742680.720902901, 4581692.0260975715)
        };

        int pointsLength = points.length;

        // Create center points for each clipping plane
        List<ClippingPlane> clippingPlanes = new ArrayList<>();
        for (int i = 0; i < pointsLength; i++) {
            int nextIndex = (i + 1) % pointsLength;
            Cartesian3 midpoint = Cartesian3.add(points[i], points[nextIndex], new Cartesian3());
            midpoint = Cartesian3.multiplyByScalar(midpoint, 0.5, midpoint);

            Cartesian3 up = Cartesian3.normalize(midpoint, new Cartesian3());

            Cartesian3 right = Cartesian3.subtract(points[nextIndex], midpoint, new Cartesian3());
            right = Cartesian3.normalize(right, right);

            Cartesian3 normal = Cartesian3.cross(right, up, new Cartesian3());
            normal = Cartesian3.normalize(normal, normal);

            // Compute distance by pretending the plane is at the origin
            Plane originCenteredPlane = new Plane(normal, 0.0);
            double distance = Plane.getPointDistance(originCenteredPlane, midpoint);

            clippingPlanes.add(new ClippingPlane(normal, distance));
        }
        });
        ClippingPlaneCollectionOptions options = new ClippingPlaneCollectionOptions();
        options.planes = clippingPlanes.toArray(new ClippingPlane[0]);
        options.edgeWidth = edgeStylingEnabled ? 1.0 : 0.0;
        options.edgeColor = Color.WHITE();
        options.enabled = clippingPlanesEnabled;

        AbsolutePanel aPanel = new AbsolutePanel();
        aPanel.add(csVPanel);
        aPanel.add(globeClippingCBox, 20, 20);
        Globe globe = csVPanel.getViewer().scene().globe;

        contentPanel.add(new HTML("<p>User-defined clipping planes applied to terrain.</p>"));
        contentPanel.add(aPanel);
        globe.clippingPlanes = new ClippingPlaneCollection(options);
        globe.backFaceCulling = true;
        globe.showSkirts = true;

        initWidget(contentPanel);
        // Load tileset
        tileset = Cesium3DTileset.create(IonResource.fromAssetId(5713));
        return tileset.readyPromise().then(t -> {
            tileset.pointCloudShading.attenuation = true;

            // Adjust height so tileset is in terrain
            Cartographic cartographic = Cartographic.fromCartesian(tileset.boundingSphere().center);
            Cartesian3 surface = Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0);
            Cartesian3 offset = Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, -20.0);
            Cartesian3 translation = Cartesian3.subtract(offset, surface, new Cartesian3());
            tileset.modelMatrix = Matrix4.fromTranslation(translation);

            tileset.style = new Cesium3DTileStyle();
            JsObject.setProperty(tileset.style, "color", "rgb(207, 255, 207)");

            csVPanel.getViewer().scene().primitives().add(tileset);

            BoundingSphere boundingSphere = tileset.boundingSphere();

            double radius = boundingSphere.radius;
            csVPanel.getViewer().camera.viewBoundingSphere(boundingSphere,
                    new HeadingPitchRange(0.5, -0.2, radius * 4.0));
            csVPanel.getViewer().camera.lookAtTransform(Matrix4.IDENTITY());
        }).otherwise(v -> {Cesium.log("!!!!!");});
    }

    @Override
    public String[] getSourceCodeURLs() {
        String[] sourceCodeURLs = new String[1];
        sourceCodeURLs[0] = GWT.getModuleBaseURL() + "examples/" + "TerrainClippingPlanes.txt";
        return sourceCodeURLs;
    private void loadGrandCanyon() {
        // Pick a position at the Grand Canyon
        Cartesian3 position = Cartographic.toCartesian(Cartographic.fromDegrees(-113.2665534, 36.0939345, 100));
        double distance = 3000.0;
        BoundingSphere boundingSphere = new BoundingSphere(position, distance);

        Globe globe = csVPanel.getViewer().scene().globe;

        ClippingPlaneCollectionOptions options = new ClippingPlaneCollectionOptions();
        options.modelMatrix = Transforms.eastNorthUpToFixedFrame(position);
        options.planes = new ClippingPlane[] {
            new ClippingPlane(new Cartesian3(1.0, 0.0, 0.0), distance),
            new ClippingPlane(new Cartesian3(-1.0, 0.0, 0.0), distance),
            new ClippingPlane(new Cartesian3(0.0, 1.0, 0.0), distance),
            new ClippingPlane(new Cartesian3(0.0, -1.0, 0.0), distance)};
        options.unionClippingRegions = true;
        options.edgeWidth = edgeStylingEnabled ? 1.0 : 0.0;
        options.edgeColor = Color.WHITE();
        options.enabled = clippingPlanesEnabled;

        globe.clippingPlanes = new ClippingPlaneCollection(options);
        globe.backFaceCulling = false;
        globe.showSkirts = false;

        csVPanel.getViewer().camera.viewBoundingSphere(boundingSphere,
                new HeadingPitchRange(0.5, -0.5, boundingSphere.radius * 5.0));
        csVPanel.getViewer().camera.lookAtTransform(Matrix4.IDENTITY());
    }

    private void reset() {
        csVPanel.getViewer().entities().removeAll();
        csVPanel.getViewer().scene().primitives().remove(tileset);
    }
}
+192 −44

File changed.

Preview size limit exceeded, changes collapsed.