Commit 57926235 authored by iSergio's avatar iSergio
Browse files

Merge branch '1.87.1' into 'develop'

New example

See merge request !21
parents 2a417009 fd49e0db
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -122,5 +122,6 @@ public class InjectorModule extends AbstractGinModule {
        bind(CustomShadersModels.class).asEagerSingleton();
        bind(Tiles3DNextCDBYemen.class).asEagerSingleton();
        bind(Tiles3DNextS2Globe.class).asEagerSingleton();
        bind(ModelExperimental3DModels.class).asEagerSingleton();
    }
}
+109 −0
Original line number Diff line number Diff line
/*
 * Copyright 2021 iserge, Gis4Fun.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.cleanlogic.cesiumjs4gwt.showcase.examples;

import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.ListBox;
import org.cesiumjs.cs.core.*;
import org.cesiumjs.cs.core.HeadingPitchRoll;
import org.cesiumjs.cs.scene.experimental.ModelExperimental;
import org.cesiumjs.cs.scene.experimental.options.ModelExperimentalFromGltfOptions;
import org.cesiumjs.cs.widgets.Viewer;
import org.cesiumjs.cs.widgets.ViewerPanel;
import org.cleanlogic.cesiumjs4gwt.showcase.basic.AbstractExample;
import org.cleanlogic.cesiumjs4gwt.showcase.components.store.ShowcaseExampleStore;

import javax.inject.Inject;
import java.lang.Math;

public class ModelExperimental3DModels extends AbstractExample {
    private Viewer viewer;

    private final HeadingPitchRoll hpr = new HeadingPitchRoll(Math.toRadians(180), 0, 0);
    private final Transforms.LocalFrameToFixedFrame fixedFrameTransform = Transforms.localFrameToFixedFrameGenerator("north", "west");

    @Inject
    public ModelExperimental3DModels(ShowcaseExampleStore store) {
        super("Model Experimental 3D Models",
                "Load glTF models using Model Experimental",
                new String[]{"Showcase", "Cesium", "3d", "Viewer", "experimental"}, store, "1.87.1");
    }

    @Override
    public void buildPanel() {
        ViewerPanel csVPanel = new ViewerPanel();
        viewer = csVPanel.getViewer();

        csVPanel.getViewer().clock().currentTime = JulianDate.fromIso8601("2021-11-09T20:27:37.016064475348684937Z");

        ListBox listBox = new ListBox();
        listBox.addItem("Cesium Balloon");
        listBox.addItem("Skinned Character");
        listBox.addItem("Draco Compressed Model");
        listBox.addItem("Unlit Box");
        listBox.addItem("Drone");
        listBox.addItem("Ground Vehicle");
        listBox.addItem("Instanced Box");
        listBox.addChangeHandler(event -> {
            String value = ((ListBox) event.getSource()).getSelectedItemText();
            String prefix = GWT.getModuleBaseURL();
            switch (value) {
                case "Cesium Balloon": selectModel(prefix + "SampleData/models/CesiumBalloon/CesiumBalloon.glb", 15); break;
                case "Skinned Character": selectModel(prefix + "SampleData/models/CesiumMan/Cesium_Man.glb", 0); break;
                case "Draco Compressed Model": selectModel(prefix + "SampleData/models/DracoCompressed/CesiumMilkTruck.gltf", 0); break;
                case "Unlit Box": selectModel(prefix + "Specs/Data/Models/PBR/BoxUnlit/BoxUnlit.gltf", 0); break;
                case "Drone": selectModel(prefix + "SampleData/models/CesiumDrone/CesiumDrone.glb", 15); break;
                case "Ground Vehicle": selectModel(prefix + "SampleData/models/GroundVehicle/GroundVehicle.glb", 0); break;
                case "Instanced Box": selectModel(prefix + "Specs/Data/Models/GltfLoader/BoxInstanced/glTF/box-instanced.gltf", 15); break;
                default: break;
            }
        });

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

        contentPanel.add(new HTML(
                "<p>Load glTF models using Model Experimental.</p>"));
        contentPanel.add(aPanel);

        initWidget(contentPanel);

        selectModel(GWT.getModuleBaseURL() + "SampleData/models/CesiumBalloon/CesiumBalloon.glb", 15);
    }

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

    private void selectModel(String url, double height) {
        Cartesian3 position = Cartesian3.fromDegrees(-123.0744619, 44.0503706, height);

        viewer.scene().primitives().removeAll();
        ModelExperimentalFromGltfOptions options = ModelExperimentalFromGltfOptions.create(url);
        options.modelMatrix = Transforms.headingPitchRollToFixedFrame(position, hpr, Ellipsoid.WGS84(), fixedFrameTransform);
        ModelExperimental model = (ModelExperimental) viewer.scene().primitives().add(ModelExperimental.fromGltf(options));

        model.readyPromise().then(nModel -> viewer.camera.lookAt(position,
                new HeadingPitchRange(Math.toRadians(45), Math.toRadians(-15), model.boundingSphere().radius * 5)));
    }
}
+289 −0
Original line number Diff line number Diff line
{
  "asset": {
    "version": "2.0"
  },
  "extensionsUsed": [
    "EXT_mesh_features",
    "EXT_mesh_gpu_instancing"
  ],
  "extensionsRequired": [
    "EXT_mesh_gpu_instancing"
  ],
  "extensions": {
    "EXT_mesh_features": {
      "schema": {
        "classes": {
          "box": {
            "properties": {
              "name": {
                "componentType": "STRING"
              },
              "volume": {
                "componentType": "FLOAT32"
              }
            }
          },
          "section": {
            "properties": {
              "name": {
                "componentType": "STRING"
              },
              "id": {
                "componentType": "UINT16"
              }
            }
          }
        }
      },
      "propertyTables": [
        {
          "name": "Box",
          "class": "box",
          "count": 4,
          "properties": {
            "name": {
              "stringOffsetType": "UINT16",
              "bufferView": 7,
              "stringOffsetBufferView": 8
            },
            "volume": {
              "bufferView": 9
            }
          }
        },
        {
          "name": "Section",
          "class": "section",
          "count": 2,
          "properties": {
            "name": {
              "stringOffsetType": "UINT16",
              "bufferView": 10,
              "stringOffsetBufferView": 11
            },
            "id": {
              "bufferView": 12
            }
          }
        }
      ]
    }
  },
  "scene": 0,
  "scenes": [
    {
      "nodes": [
        0
      ]
    }
  ],
  "nodes": [
    {
      "mesh": 0,
      "extensions": {
        "EXT_mesh_gpu_instancing": {
          "attributes": {
            "TRANSLATION": 3,
            "ROTATION": 4,
            "SCALE": 5,
            "FEATURE_ID_0": 6
          }
        },
        "EXT_mesh_features": {
          "propertyTables": [
            0,
            1
          ],
          "featureIds": [
            {
              "offset": 0,
              "repeat": 1
            },
            {
              "attribute": 0
            }
          ]
        }
      }
    }
  ],
  "meshes": [
    {
      "primitives": [
        {
          "attributes": {
            "POSITION": 0,
            "NORMAL": 1
          },
          "indices": 2,
          "mode": 4
        }
      ]
    }
  ],
  "accessors": [
    {
      "name": "Positions",
      "bufferView": 0,
      "byteOffset": 0,
      "componentType": 5126,
      "count": 24,
      "max": [
        0.5,
        0.5,
        0.5
      ],
      "min": [
        -0.5,
        -0.5,
        -0.5
      ],
      "type": "VEC3"
    },
    {
      "name": "Normals",
      "bufferView": 1,
      "byteOffset": 0,
      "componentType": 5126,
      "count": 24,
      "type": "VEC3"
    },
    {
      "name": "Indices",
      "bufferView": 2,
      "byteOffset": 0,
      "componentType": 5123,
      "count": 36,
      "type": "SCALAR"
    },
    {
      "name": "Instance Translations",
      "bufferView": 3,
      "byteOffset": 0,
      "componentType": 5126,
      "count": 4,
      "type": "VEC3"
    },
    {
      "name": "Instance Rotations",
      "bufferView": 4,
      "byteOffset": 0,
      "componentType": 5126,
      "count": 4,
      "type": "VEC4"
    },
    {
      "name": "Instance Scales",
      "bufferView": 5,
      "byteOffset": 0,
      "componentType": 5126,
      "count": 4,
      "type": "VEC3"
    },
    {
      "name": "Instance Feature IDs",
      "bufferView": 6,
      "byteOffset": 0,
      "componentType": 5126,
      "count": 4,
      "type": "SCALAR"
    }
  ],
  "bufferViews": [
    {
      "name": "Positions",
      "buffer": 0,
      "byteLength": 288,
      "byteOffset": 0
    },
    {
      "name": "Normals",
      "buffer": 0,
      "byteLength": 288,
      "byteOffset": 288
    },
    {
      "name": "Indices",
      "buffer": 0,
      "byteLength": 72,
      "byteOffset": 576
    },
    {
      "name": "Instance Translations",
      "buffer": 1,
      "byteLength": 48,
      "byteOffset": 0
    },
    {
      "name": "Instance Rotations",
      "buffer": 1,
      "byteLength": 64,
      "byteOffset": 48
    },
    {
      "name": "Instance Scales",
      "buffer": 1,
      "byteLength": 48,
      "byteOffset": 112
    },
    {
      "name": "Instance Feature IDs",
      "buffer": 1,
      "byteLength": 16,
      "byteOffset": 160
    },
    {
      "name": "Box Names",
      "buffer": 2,
      "byteLength": 40,
      "byteOffset": 0
    },
    {
      "name": "Box Name Offsets",
      "buffer": 2,
      "byteLength": 10,
      "byteOffset": 40
    },
    {
      "name": "Box Volumes",
      "buffer": 2,
      "byteLength": 16,
      "byteOffset": 56
    },
    {
      "name": "Section Name",
      "buffer": 2,
      "byteLength": 9,
      "byteOffset": 72
    },
    {
      "name": "Section Name Offsets",
      "buffer": 2,
      "byteLength": 6,
      "byteOffset": 88
    },
    {
      "name": "Section IDs",
      "buffer": 2,
      "byteLength": 4,
      "byteOffset": 96
    }
  ],
  "buffers": [
    {
      "name": "Geometry Buffer",
      "byteLength": 648,
      "uri": "geometry.bin"
    },
    {
      "name": "Instances Buffer",
      "byteLength": 176,
      "uri": "instances.bin"
    },
    {
      "name": "Metadata Buffer",
      "byteLength": 104,
      "uri": "metadata.bin"
    }
  ]
}
+648 B

File added.

No diff preview for this file type.

+176 B

File added.

No diff preview for this file type.

Loading