diff --git a/cesiumjs4gwt-showcase/src/main/java/org/cleanlogic/cesiumjs4gwt/showcase/config/InjectorModule.java b/cesiumjs4gwt-showcase/src/main/java/org/cleanlogic/cesiumjs4gwt/showcase/config/InjectorModule.java index 8146c88fc5d4f36b4c3a172b60389b7d90bab75d..0adc756c4e5555471938d22ab4056e8a42031f12 100644 --- a/cesiumjs4gwt-showcase/src/main/java/org/cleanlogic/cesiumjs4gwt/showcase/config/InjectorModule.java +++ b/cesiumjs4gwt-showcase/src/main/java/org/cleanlogic/cesiumjs4gwt/showcase/config/InjectorModule.java @@ -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(); } } diff --git a/cesiumjs4gwt-showcase/src/main/java/org/cleanlogic/cesiumjs4gwt/showcase/examples/ModelExperimental3DModels.java b/cesiumjs4gwt-showcase/src/main/java/org/cleanlogic/cesiumjs4gwt/showcase/examples/ModelExperimental3DModels.java new file mode 100644 index 0000000000000000000000000000000000000000..220597571c67ab45b72015d399b71b8b35b66b8d --- /dev/null +++ b/cesiumjs4gwt-showcase/src/main/java/org/cleanlogic/cesiumjs4gwt/showcase/examples/ModelExperimental3DModels.java @@ -0,0 +1,109 @@ +/* + * 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( + "

Load glTF models using Model Experimental.

")); + 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))); + } +} diff --git a/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/box-instanced.gltf b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/box-instanced.gltf new file mode 100644 index 0000000000000000000000000000000000000000..4b134f5cb0ccf99ee625f1883fda8c45073f7c25 --- /dev/null +++ b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/box-instanced.gltf @@ -0,0 +1,289 @@ +{ + "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" + } + ] +} diff --git a/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/geometry.bin b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/geometry.bin new file mode 100644 index 0000000000000000000000000000000000000000..999f962cf186e3dd7d49fdd4d6f3afc19de1cb85 Binary files /dev/null and b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/geometry.bin differ diff --git a/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/instances.bin b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/instances.bin new file mode 100644 index 0000000000000000000000000000000000000000..0f4b2a8dc8f62c66aec9ea7884fa7e90505430ac Binary files /dev/null and b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/instances.bin differ diff --git a/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/metadata.bin b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/metadata.bin new file mode 100644 index 0000000000000000000000000000000000000000..1dffc7779929e4cfcd4b849927021595eb2c6f55 Binary files /dev/null and b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/GltfLoader/BoxInstanced/glTF/metadata.bin differ diff --git a/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/PBR/BoxUnlit/BoxUnlit.gltf b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/PBR/BoxUnlit/BoxUnlit.gltf new file mode 100644 index 0000000000000000000000000000000000000000..f4bda300552cd5e226a37b74922e118b0f1afd0c --- /dev/null +++ b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/Specs/Data/Models/PBR/BoxUnlit/BoxUnlit.gltf @@ -0,0 +1,151 @@ +{ + "asset": { + "generator": "COLLADA2GLTF", + "version": "2.0" + }, + "extensionsUsed": [ + "KHR_materials_unlit" + ], + "extensionsRequired": [ + "KHR_materials_unlit" + ], + "scene": 0, + "scenes": [ + { + "nodes": [ + 0 + ] + } + ], + "nodes": [ + { + "children": [ + 1 + ], + "matrix": [ + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + -1.0, + 0.0, + 0.0, + 1.0, + 0.0, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0 + ] + }, + { + "mesh": 0 + } + ], + "meshes": [ + { + "primitives": [ + { + "attributes": { + "NORMAL": 1, + "POSITION": 2 + }, + "indices": 0, + "mode": 4, + "material": 0 + } + ], + "name": "Mesh" + } + ], + "accessors": [ + { + "bufferView": 0, + "byteOffset": 0, + "componentType": 5123, + "count": 36, + "max": [ + 23 + ], + "min": [ + 0 + ], + "type": "SCALAR" + }, + { + "bufferView": 1, + "byteOffset": 0, + "componentType": 5126, + "count": 24, + "max": [ + 1.0, + 1.0, + 1.0 + ], + "min": [ + -1.0, + -1.0, + -1.0 + ], + "type": "VEC3" + }, + { + "bufferView": 1, + "byteOffset": 288, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + } + ], + "materials": [ + { + "pbrMetallicRoughness": { + "baseColorFactor": [ + 0.0, + 1.0, + 0.0, + 1.0 + ], + "metallicFactor": 1.0 + }, + "name": "Unlit Green", + "extensions": { + "KHR_materials_unlit": {} + } + } + ], + "bufferViews": [ + { + "buffer": 0, + "byteOffset": 576, + "byteLength": 72, + "target": 34963 + }, + { + "buffer": 0, + "byteOffset": 0, + "byteLength": 576, + "byteStride": 12, + "target": 34962 + } + ], + "buffers": [ + { + "byteLength": 648, + "uri": "data:application/octet-stream;base64,AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAvwAAAL8AAAA/AAAAPwAAAL8AAAA/AAAAvwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAL8AAAA/AAAAvwAAAL8AAAA/AAAAPwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAPwAAAD8AAAA/AAAAPwAAAL8AAAA/AAAAPwAAAD8AAAC/AAAAPwAAAL8AAAC/AAAAvwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAvwAAAD8AAAC/AAAAPwAAAD8AAAC/AAAAvwAAAL8AAAA/AAAAvwAAAD8AAAA/AAAAvwAAAL8AAAC/AAAAvwAAAD8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAD8AAAC/AAAAPwAAAL8AAAC/AAAAPwAAAD8AAAC/AAABAAIAAwACAAEABAAFAAYABwAGAAUACAAJAAoACwAKAAkADAANAA4ADwAOAA0AEAARABIAEwASABEAFAAVABYAFwAWABUA" + } + ] +} diff --git a/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/examples/Model Experimental 3D Models.jpg b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/examples/Model Experimental 3D Models.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b67fab48ac11a3f85a334369ccb8d6f2bcdfd23c Binary files /dev/null and b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/examples/Model Experimental 3D Models.jpg differ diff --git a/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/examples/ModelExperimental3DModels.txt b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/examples/ModelExperimental3DModels.txt new file mode 100644 index 0000000000000000000000000000000000000000..d8b0780dcfd1e429b83ccce738b4af25b8e63118 --- /dev/null +++ b/cesiumjs4gwt-showcase/src/main/resources/org/cleanlogic/cesiumjs4gwt/public/examples/ModelExperimental3DModels.txt @@ -0,0 +1,93 @@ +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( + "

Load glTF models using Model Experimental.

")); + 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))); + } +}