├── examples
├── simple
│ ├── .gitignore
│ ├── README.md
│ └── index.html
└── webpack_simple
│ ├── .gitignore
│ ├── package.json
│ ├── webpack.config.js
│ ├── src
│ ├── index.js
│ └── index.template
│ └── README.md
├── .prettierignore
├── .husky
└── pre-commit
├── ci
└── publish-gh-pages.js
├── test
└── blah.test.ts.disabled
├── .github
└── workflows
│ ├── size.yml.disabled
│ ├── main.yml.disabled
│ └── build.yml
├── .gitignore
├── src
├── format
│ ├── GeoJSON.ts
│ └── DDDFormat.ts
├── render
│ ├── skybox
│ │ ├── CubemapSkybox.ts
│ │ ├── DynamicSkybox.ts
│ │ └── Skybox.ts
│ ├── environment
│ │ └── DefaultEnvironment.ts
│ ├── materials
│ │ ├── TextMaterial.ts
│ │ ├── SkyboxMaterial.ts
│ │ └── TerrainMaterial.ts
│ └── pipeline
│ │ └── DefaultRenderPipeline.ts
├── core
│ ├── ScenePosition.ts
│ └── DDDObjectRef.ts
├── camera
│ ├── PanningCameraController.ts
│ ├── BaseCameraController.ts
│ ├── WalkCameraController.ts
│ ├── WalkCollideCameraController.ts
│ ├── FreeCameraController.ts
│ ├── OrbitCameraController.ts
│ └── GeolocationCameraController.ts
├── DDDViewerConfig.ts
├── process
│ ├── ViewerProcess.ts
│ ├── anim
│ │ ├── TextAnimationProcess.ts
│ │ ├── DateTimeAnimationProcess.ts
│ │ ├── AnimationProcess.ts
│ │ └── CameraMoveAnimationProcess.ts
│ ├── ViewerProcessManager.ts
│ └── sequencer
│ │ └── ViewerSequencer.ts
├── layers
│ ├── Base3DLayer.ts
│ ├── LayerManager.ts
│ ├── OverlayLayer.ts
│ ├── DDD3DLayer.ts
│ ├── GeoJson3DLayer.ts
│ └── GeoTile3DLayer.ts
├── index.ts
├── loading
│ └── QueueLoader.ts
└── ViewerState.ts
├── .eslintrc.js
├── LICENSE
├── tsdx.config.js
├── tsconfig.json
├── package.json
└── README.md
/examples/simple/.gitignore:
--------------------------------------------------------------------------------
1 | lib
--------------------------------------------------------------------------------
/.prettierignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
--------------------------------------------------------------------------------
/examples/webpack_simple/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | build/
3 | package-lock.json
--------------------------------------------------------------------------------
/.husky/pre-commit:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 | . "$(dirname -- "$0")/_/husky.sh"
3 |
4 | yarn lint-staged
5 |
--------------------------------------------------------------------------------
/ci/publish-gh-pages.js:
--------------------------------------------------------------------------------
1 | var ghpages = require('gh-pages');
2 |
3 | ghpages.publish('examples/simple', function(err) {});
--------------------------------------------------------------------------------
/test/blah.test.ts.disabled:
--------------------------------------------------------------------------------
1 | // import { sum } from "../src";
2 |
3 | // describe( "blah", () => {
4 | // it( "works", () => {
5 | // expect( sum( 1, 1 )).toEqual( 2 );
6 | // });
7 | // });
8 |
--------------------------------------------------------------------------------
/.github/workflows/size.yml.disabled:
--------------------------------------------------------------------------------
1 | name: size
2 | on: [pull_request]
3 | jobs:
4 | size:
5 | runs-on: ubuntu-latest
6 | env:
7 | CI_JOB_NUMBER: 1
8 | steps:
9 | - uses: actions/checkout@v1
10 | - uses: andresz1/size-limit-action@v1
11 | with:
12 | github_token: ${{ secrets.GITHUB_TOKEN }}
13 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *~
2 | .DS_Store
3 | node_modules
4 | /dist
5 | /.settings/
6 | .project
7 | .pydevproject
8 |
9 | .nyc_output
10 | /coverage/
11 | /tests/e2e/reports/
12 | selenium-debug.log
13 |
14 | # local env files
15 | .env.local
16 | .env.*.local
17 |
18 | # Log files
19 | npm-debug.log*
20 | yarn-debug.log*
21 | yarn-error.log*
22 |
23 | # Editor directories and files
24 | .idea
25 | .vscode
26 | *.suo
27 | *.ntvs*
28 | *.njsproj
29 | *.sln
30 | *.sw*
31 |
32 | *.log
33 |
34 | package-lock.json
35 | yarn.lock
36 |
--------------------------------------------------------------------------------
/src/format/GeoJSON.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D scenes
3 | * Copyright 2021 Jose Juan Montes and Contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 | import { Camera } from "@babylonjs/core";
8 | import { SceneViewer } from "SceneViewer";
9 |
10 | /**
11 | */
12 | class GeoJSONFormat {
13 |
14 | protected dddViewer: SceneViewer;
15 |
16 | constructor(dddViewer: SceneViewer) {
17 | // Reference to DDDViewer
18 | this.dddViewer = dddViewer;
19 | }
20 |
21 | }
22 |
23 | export { GeoJSONFormat };
--------------------------------------------------------------------------------
/src/render/skybox/CubemapSkybox.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D scenes
3 | * Copyright 2021 Jose Juan Montes and Contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 | import { Camera } from "@babylonjs/core";
8 | import { SceneViewer } from "SceneViewer";
9 | import { Skybox } from "./Skybox";
10 |
11 | /**
12 | * A skybox based on a cubemap.
13 | */
14 | class CubemapSkybox extends Skybox {
15 |
16 | update(deltaTime: number): void {
17 | throw new Error("Method not implemented.");
18 | }
19 |
20 | }
21 |
22 | export { CubemapSkybox };
--------------------------------------------------------------------------------
/src/render/skybox/DynamicSkybox.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D scenes
3 | * Copyright 2021 Jose Juan Montes and Contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 | import { Camera } from "@babylonjs/core";
8 | import { SceneViewer } from "SceneViewer";
9 | import { Skybox } from "./Skybox";
10 |
11 | /**
12 | * A skybox based on a shader.
13 | */
14 | class DynamicSkybox extends Skybox {
15 |
16 | update(deltaTime: number): void {
17 | throw new Error("Method not implemented.");
18 | }
19 |
20 | }
21 |
22 | export { DynamicSkybox };
--------------------------------------------------------------------------------
/examples/webpack_simple/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "webpack_simple",
3 | "version": "1.0.0",
4 | "description": "DDD(3Ds) Viewer Webpack Example",
5 | "main": "./src/index.js",
6 | "scripts": {
7 | "serve": "webpack serve",
8 | "build": "webpack build"
9 | },
10 | "author": "",
11 | "license": "MIT",
12 | "dependencies": {
13 | "ddd-viewer": "file:../../ddd-viewer",
14 | "webpack": "^5.58.0",
15 | "webpack-cli": "^4.8.0"
16 | },
17 | "devDependencies": {
18 | "html-webpack-plugin": "^4.5.2",
19 | "webpack-dev-server": "^4.3.1"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/core/ScenePosition.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D models
3 | * Copyright 2021 Jose Juan Montes and contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 |
8 | /**
9 | * ScenePosition represents
10 | */
11 | class ScenePosition {
12 |
13 | // Position is Lat, Lon, Altitude (currently MSL)
14 | positionWGS84: number[] = [ 0, 0, 0 ];
15 |
16 | positionTileZoomLevel: number = 0;
17 |
18 | // Ground altitude
19 | positionGroundHeight: number = 0;
20 |
21 | positionHeading: number = 0;
22 |
23 | positionTilt: number = 0;
24 |
25 | }
26 |
27 | export { ScenePosition };
--------------------------------------------------------------------------------
/src/camera/PanningCameraController.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D scenes
3 | * Copyright 2021 Jose Juan Montes and Contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 | import { Camera } from "@babylonjs/core";
8 | import { SceneViewer } from "SceneViewer";
9 | import { BaseCameraController } from "./BaseCameraController";
10 |
11 | /**
12 | * DDD Viewer base layer class.
13 | */
14 | class PanningCameraController extends BaseCameraController {
15 |
16 | update(deltaTime: number): void {
17 |
18 | }
19 |
20 | activate(): void {
21 |
22 | }
23 |
24 | }
25 |
26 | export { PanningCameraController };
--------------------------------------------------------------------------------
/examples/webpack_simple/webpack.config.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const HtmlWebpackPlugin = require('html-webpack-plugin');
3 |
4 | module.exports = {
5 | entry: './src/index.js',
6 | mode: 'development',
7 | output: {
8 | path: path.resolve(__dirname, 'build'),
9 | filename: 'webpack_simple.js',
10 | },
11 | module: {
12 | rules: [
13 | {
14 | test: /\.m?js/,
15 | resolve: {
16 | fullySpecified: false
17 | }
18 | },
19 | ]
20 | },
21 | plugins: [new HtmlWebpackPlugin({template: './src/index.template'})],
22 | };
--------------------------------------------------------------------------------
/src/format/DDDFormat.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D scenes
3 | * Copyright 2021 Jose Juan Montes and Contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 | import { Camera } from "@babylonjs/core";
8 | import { SceneViewer } from "SceneViewer";
9 |
10 | /**
11 | * Manages reading of files in DDD format. DDD files are glTF files
12 | * with custom metadata. This class processes nodes and metadata.
13 | */
14 | class DDDFormat {
15 |
16 | protected dddViewer: SceneViewer;
17 |
18 | constructor(dddViewer: SceneViewer) {
19 | // Reference to DDDViewer
20 | this.dddViewer = dddViewer;
21 | }
22 |
23 |
24 |
25 | }
26 |
27 | export { DDDFormat };
--------------------------------------------------------------------------------
/src/render/skybox/Skybox.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D scenes
3 | * Copyright 2021 Jose Juan Montes and Contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 | import { Camera } from "@babylonjs/core";
8 | import { SceneViewer } from "SceneViewer";
9 |
10 | /**
11 | * DDD Viewer base skybox class.
12 | */
13 | abstract class Skybox {
14 |
15 | protected dddViewer: SceneViewer;
16 |
17 | constructor(dddViewer: SceneViewer) {
18 |
19 | // Reference to DDDViewer
20 | this.dddViewer = dddViewer;
21 |
22 | // Babylon camera which we are controlling
23 | //this.camera = dddViewer.camera;
24 | }
25 |
26 | abstract update(deltaTime: number): void;
27 |
28 | }
29 |
30 | export { Skybox };
--------------------------------------------------------------------------------
/.github/workflows/main.yml.disabled:
--------------------------------------------------------------------------------
1 | name: CI
2 | on: [push]
3 | jobs:
4 | build:
5 | name: Build, lint, and test on Node ${{ matrix.node }} and ${{ matrix.os }}
6 |
7 | runs-on: ${{ matrix.os }}
8 | strategy:
9 | matrix:
10 | node: ['10.x', '12.x', '14.x']
11 | os: [ubuntu-latest, windows-latest, macOS-latest]
12 |
13 | steps:
14 | - name: Checkout repo
15 | uses: actions/checkout@v2
16 |
17 | - name: Use Node ${{ matrix.node }}
18 | uses: actions/setup-node@v1
19 | with:
20 | node-version: ${{ matrix.node }}
21 |
22 | - name: Install deps and build (with cache)
23 | uses: bahmutov/npm-install@v1
24 |
25 | - name: Lint
26 | run: yarn lint
27 |
28 | - name: Test
29 | run: yarn test --ci --coverage --maxWorkers=2
30 |
31 | - name: Build
32 | run: yarn build
33 |
--------------------------------------------------------------------------------
/src/render/environment/DefaultEnvironment.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D scenes
3 | * Copyright 2021 Jose Juan Montes and Contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 | import { Camera } from "@babylonjs/core";
8 | import { SceneViewer } from "SceneViewer";
9 |
10 | /**
11 | * Manages environment rendering, using time, date or other information
12 | * to set up the skybox and lighting.
13 | */
14 | class DefaultEnvironment {
15 |
16 | protected dddViewer: SceneViewer;
17 |
18 | constructor(dddViewer: SceneViewer) {
19 |
20 | // Reference to DDDViewer
21 | this.dddViewer = dddViewer;
22 |
23 | // Babylon camera which we are controlling
24 | //this.camera = dddViewer.camera;
25 | }
26 |
27 | update(deltaTime: number): void {
28 |
29 | }
30 |
31 | initialize(): void {
32 |
33 | }
34 |
35 | dispose(): void {
36 |
37 | }
38 |
39 | }
40 |
41 | export { DefaultEnvironment };
--------------------------------------------------------------------------------
/src/DDDViewerConfig.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D models
3 | * Copyright 2021 Jose Juan Montes and contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 | /**
8 | * This object represents ddd-viewer configuration, and is used to pass
9 | * options to the main object (DDDViewer) constructor.
10 | */
11 | class DDDViewerConfig {
12 | defaultCoords: number[] | null = [ -8.726, 42.233 ]; // [0.0, 0.0];
13 |
14 | // TODO: Move this to layer configuration (?)
15 | tileUrlBase: string = "/cache/ddd_http/";
16 | tileUrlSuffix: string = "";
17 |
18 | assetsUrlbase: string = "/assets/";
19 |
20 | materialsTextureSet: string | null = "default256";
21 | materialsSplatmap: number | null = null; // 256
22 |
23 | //sceneGroundTextureOverrideUrl: string | null = null;
24 |
25 | timeScale: number = 0.0;
26 |
27 | moveSpeeds: number[] = [ 2.0, 5.0, 10.0 ];
28 |
29 | sceneTileDrawDistanceDefault: number = 1;
30 | }
31 |
32 | export { DDDViewerConfig };
33 |
--------------------------------------------------------------------------------
/examples/webpack_simple/src/index.js:
--------------------------------------------------------------------------------
1 | import { SceneViewer } from 'ddd-viewer';
2 | import { GeoTile3DLayer } from 'ddd-viewer';
3 |
4 | export function initViewer() {
5 |
6 | var dddviewer = window['ddd-viewer'];
7 |
8 | const dddConfig = {
9 | "defaultCoords": [-8.723, 42.238],
10 | //"defaultCoords": [-8.4069793, 43.3861094],
11 | "tileUrlBase": "https://3dsmaps.com/cache/ddd_http/",
12 | "tileUrlSuffix": "",
13 | "assetsUrlbase": "https://3dsmaps.com/assets/",
14 | "materialsTextureSet": "default256",
15 | "geolocation": false
16 | }
17 |
18 | const canvas = document.getElementById('ddd-scene');
19 | const sceneViewer = new SceneViewer(canvas, dddConfig);
20 |
21 | const layerDddOsm3d = new GeoTile3DLayer();
22 | sceneViewer.layerManager.addLayer(layerDddOsm3d);
23 |
24 | // Events
25 | //window.addEventListener('resize', this.resize);
26 |
27 | }
28 |
29 | window.addEventListener("load", () => {
30 | initViewer();
31 | });
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | env: {
3 | browser: true,
4 | es2015: true,
5 | //"commonjs": true
6 | },
7 | ignorePatterns: ['**/ddd-viewer/**/*.js', '**/ddd-viewer/**/*.ts'],
8 | extends: [
9 | 'eslint:recommended',
10 | 'plugin:@typescript-eslint/eslint-recommended',
11 | 'plugin:@typescript-eslint/recommended',
12 | ],
13 | parser: '@typescript-eslint/parser',
14 | parserOptions: {
15 | ecmaVersion: 12,
16 | sourceType: 'module',
17 | },
18 | plugins: ['@typescript-eslint'],
19 | rules: {
20 | indent: ['error', 4],
21 | quotes: ['error', 'double'],
22 | semi: ['error', 'always'],
23 | 'object-curly-spacing': ['error', 'always'],
24 | 'array-bracket-spacing': ['error', 'always'],
25 | 'no-console': 'off',
26 | '@typescript-eslint/no-non-null-assertion': 'off',
27 | '@typescript-eslint/no-inferrable-types': 'off',
28 | '@typescript-eslint/no-empty-function': 'off',
29 | '@typescript-eslint/no-unused-vars': 'warn',
30 | "@typescript-eslint/no-explicit-any": "off",
31 | "no-mixed-spaces-and-tabs": "off"
32 | },
33 | };
34 |
--------------------------------------------------------------------------------
/src/process/ViewerProcess.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D scenes
3 | * Copyright 2021 Jose Juan Montes and contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 | import { SceneViewer } from "../SceneViewer";
8 |
9 | /**
10 | * A process that can be running in a DDDViewer instance.
11 | * Processes are updated every frame before drawing the scene.
12 | */
13 | abstract class ViewerProcess {
14 |
15 | sceneViewer: SceneViewer;
16 | finished: boolean = false;
17 | time: number = 0;
18 |
19 | constructor( sceneViewer: SceneViewer ) {
20 | this.sceneViewer = sceneViewer;
21 | this.finished = false;
22 | }
23 |
24 | update( deltaTime: number ): void {
25 | // TODO: Consider providing an (optional) initialize() lifecycle method for processes (to be run before the first frame)
26 | //if (this.time == 0) initialize();
27 | this.time += deltaTime;
28 | }
29 |
30 | }
31 |
32 | export { ViewerProcess };
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Jose Juan Montes and contributors
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/src/camera/BaseCameraController.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D scenes
3 | * Copyright 2021 Jose Juan Montes and Contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 | import { Camera } from "@babylonjs/core";
8 | import { SceneViewer } from "SceneViewer";
9 |
10 | /**
11 | * A Camera and Input controller.
12 | *
13 | * This allows controlling the main camera, which is the main interface for viewing.
14 | * Controllers process input devices if they wish to respond to user input.
15 | *
16 | * Client code may use custom controllers or disable these controllers
17 | * and position the camera manually.
18 | */
19 | abstract class BaseCameraController {
20 |
21 | protected dddViewer: SceneViewer;
22 |
23 | constructor(dddViewer: SceneViewer) {
24 |
25 | // Reference to DDDViewer
26 | this.dddViewer = dddViewer;
27 |
28 | // Babylon camera which we are controlling
29 | //this.camera = dddViewer.camera;
30 | }
31 |
32 | protected getCamera(): Camera {
33 | return this.dddViewer.camera;
34 | }
35 |
36 | abstract update(deltaTime: number): void;
37 |
38 | abstract activate(): void;
39 |
40 | }
41 |
42 | export { BaseCameraController };
--------------------------------------------------------------------------------
/examples/webpack_simple/src/index.template:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | DDD-Viewer Simple Example
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
Webpack Example DDD-Viewer
26 |
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/src/process/anim/TextAnimationProcess.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D models
3 | * Copyright 2021 Jose Juan Montes and contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 |
8 | import { SceneViewer } from "../../SceneViewer";
9 | import { AnimationProcess } from "./AnimationProcess";
10 |
11 | /**
12 | *
13 | */
14 | class TextAnimationProcess extends AnimationProcess {
15 |
16 | text: string;
17 |
18 | /**
19 | *
20 | * @param text Text to animate.
21 | * @param animTime Animation duration in seconds.
22 | */
23 | constructor( sceneViewer: SceneViewer, text: string, animTime: number ) {
24 | super( sceneViewer, animTime );
25 | this.text = text;
26 | }
27 |
28 | update( deltaTime: number ): void {
29 |
30 | super.update( deltaTime );
31 |
32 | const interpChars = Math.ceil(( this.text.length ) * this.interpFactor );
33 | const interpText = this.text.substr( 0, interpChars );
34 |
35 | this.sceneViewer.viewerState.sceneTitleText = interpText;
36 |
37 | if ( this.finished ) {
38 | this.sceneViewer.viewerState.sceneTitleText = null;
39 | }
40 | }
41 | }
42 |
43 | export { TextAnimationProcess };
44 |
--------------------------------------------------------------------------------
/src/camera/WalkCameraController.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D scenes
3 | * Copyright 2021 Jose Juan Montes and Contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 | import { Camera, Vector3 } from "@babylonjs/core";
8 | import { SceneViewer } from "SceneViewer";
9 | import { BaseCameraController } from "./BaseCameraController";
10 | import { FreeCameraController } from "./FreeCameraController";
11 |
12 | /**
13 | * DDD Viewer base layer class.
14 | */
15 | class WalkCameraController extends FreeCameraController {
16 |
17 | sceneCameraWalkHeight = 1.75; // 2.0;
18 |
19 | //falling = false;
20 |
21 | update(deltaTime: number): void {
22 | // Fix viewer to floor
23 | const terrainElevation = this.dddViewer.viewerState.positionTerrainElevation;
24 | if ( terrainElevation !== null && this.dddViewer.camera ) {
25 | this.getCamera().position.y = terrainElevation + this.sceneCameraWalkHeight; // 3.0;
26 | }
27 | }
28 |
29 | activate(): void {
30 | super.activate();
31 | //this.walkMode = true;
32 | this.dddViewer.camera!.inertia = 0.2; // 0.0;
33 | this.dddViewer.setMoveSpeed( this.dddViewer.viewerState.sceneMoveSpeed );
34 | }
35 |
36 | }
37 |
38 | export { WalkCameraController };
--------------------------------------------------------------------------------
/src/layers/Base3DLayer.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D scenes
3 | * Copyright 2021 Jose Juan Montes and contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 | import { SceneViewer } from "SceneViewer";
8 | import { LayerManager } from "./LayerManager";
9 |
10 | /**
11 | * DDD Viewer base layer class.
12 | */
13 | abstract class Base3DLayer {
14 |
15 | key: string;
16 | visible: boolean = true;
17 |
18 | protected dddViewer: SceneViewer | null;
19 | protected layerManager: LayerManager | null; // TODO: added for backwards compat (for convenience), should be removed
20 |
21 | constructor(key: string) {
22 | this.key = key;
23 | this.visible = true;
24 |
25 | this.dddViewer = null;
26 | this.layerManager = null;
27 | }
28 |
29 | abstract update(deltaTime: number): void;
30 |
31 | abstract clearScene(): void;
32 |
33 | setVisible(visible: boolean): void {
34 | this.visible = visible;
35 | }
36 |
37 | setViewer(dddViewer: SceneViewer | null): void {
38 | this.dddViewer = dddViewer;
39 | this.layerManager = dddViewer ? dddViewer.layerManager : null;
40 |
41 | if (!dddViewer) {
42 | this.clearScene();
43 | }
44 | }
45 |
46 | }
47 |
48 | export { Base3DLayer };
--------------------------------------------------------------------------------
/src/process/anim/DateTimeAnimationProcess.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D models
3 | * Copyright 2021 Jose Juan Montes and contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 |
8 | import { SceneViewer } from "../../SceneViewer";
9 | import { AnimationProcess } from "./AnimationProcess";
10 |
11 | class DateTimeAnimationProcess extends AnimationProcess {
12 |
13 | dtStart: Date;
14 | dtEnd: Date;
15 |
16 | constructor( sceneViewer: SceneViewer, dtStart: Date, dtEnd: Date, animTime: number ) {
17 |
18 | super(sceneViewer, animTime);
19 |
20 | this.dtStart = dtStart;
21 | this.dtEnd = dtEnd;
22 |
23 | //console.debug("Datetime anim from " + dtStart + " to " + dtEnd);
24 | console.debug("TODO: Restore missing call sceneViewer.lightSetupFromDatePos();");
25 | }
26 |
27 | update( deltaTime: number ): void {
28 |
29 | super.update(deltaTime);
30 |
31 | const interpTime = ( this.dtEnd.getTime() / 1000 - this.dtStart.getTime() / 1000 ) * this.interpFactor;
32 | this.sceneViewer.viewerState.positionDate = new Date( this.dtStart.getTime() + interpTime * 1000 );
33 |
34 | //console.debug("Datetime set by animation to: " + this.sceneViewer.viewerState.positionDate);
35 |
36 | this.sceneViewer.lightSetupFromDatePos();
37 | }
38 |
39 | }
40 |
41 | export { DateTimeAnimationProcess };
42 |
--------------------------------------------------------------------------------
/src/layers/LayerManager.ts:
--------------------------------------------------------------------------------
1 | import { SceneViewer } from "../SceneViewer";
2 | import { Base3DLayer } from "./Base3DLayer";
3 | import { GeoTile3DLayer } from "./GeoTile3DLayer";
4 |
5 |
6 | /**
7 | * Manages the list of layers known to DDD Viewer.
8 | */
9 | class LayerManager {
10 |
11 | sceneViewer: SceneViewer;
12 | layers: { [ key: string ]: Base3DLayer };
13 |
14 | constructor( sceneViewer: SceneViewer ) {
15 | this.sceneViewer = sceneViewer;
16 | this.layers = {};
17 | }
18 |
19 | update( deltaTime: number ): void {
20 | for (const key in this.layers) {
21 | // Load tiles dynamically as needed
22 | this.layers[key].update(deltaTime);
23 | }
24 | }
25 |
26 | /**
27 | * Adds a layer to DDD viewer.
28 | * @param key
29 | * @param layer
30 | */
31 | addLayer(layer: Base3DLayer): void {
32 | layer.setViewer(this.sceneViewer);
33 | this.layers[layer.key] = layer;
34 | }
35 |
36 | removeLayer(layer: Base3DLayer) {
37 | layer.setViewer(null); // have the layer cleanup itself from the scene
38 | delete this.layers[layer.key];
39 | }
40 |
41 | /**
42 | * Retrieves a layer from DDD viewer managed layers.
43 | * Returns null if the layer does not exist.
44 | */
45 | getLayer(key: string) {
46 | if (key in this.layers) {
47 | return this.layers[key];
48 | }
49 | return null;
50 | }
51 |
52 | }
53 |
54 | export { LayerManager };
55 |
--------------------------------------------------------------------------------
/tsdx.config.js:
--------------------------------------------------------------------------------
1 | // Not transpiled with TypeScript or Babel, so use plain Es6/Node.js!
2 | const replace = require("@rollup/plugin-replace");
3 |
4 | module.exports = {
5 | // This function will run for each entry/format/env combination
6 | rollup(config, opts) {
7 |
8 | // TODO: See https://github.com/formium/tsdx to see if options currently package.json
9 |
10 | // Added to workaround deprecation warning in @rollup/plugin-replace about 'preventAssignment' default value change
11 | config.plugins = config.plugins.map(p =>
12 | p.name === "replace"
13 | ? replace({ "process.env.NODE_ENV": JSON.stringify(opts.env), preventAssignment: true, })
14 | : p
15 | );
16 |
17 | // In order to bundle external deps in UMD format:
18 | // From: https://github.com/formium/tsdx/issues/179
19 | // and: https://github.com/formium/tsdx/issues/898
20 | if (config.output.format === "umd") {
21 | const origExternal = config.external;
22 | config.external = (id) => {
23 | //console.log(id);
24 | //if (id.startsWith("@babylonjs")) return true;
25 | //return origExternal(id);
26 | return false; // Embed all libraries by default
27 | };
28 | //config.output.globals["babylon"] = "BABYLON";
29 | }
30 |
31 | // Return final customized config for the plugin
32 | return config;
33 | },
34 | };
35 |
36 |
--------------------------------------------------------------------------------
/src/camera/WalkCollideCameraController.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D scenes
3 | * Copyright 2021 Jose Juan Montes and Contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 | import { Camera, Vector3 } from "@babylonjs/core";
8 | import { SceneViewer } from "SceneViewer";
9 | import { BaseCameraController } from "./BaseCameraController";
10 | import { WalkCameraController } from "./WalkCameraController";
11 |
12 | /**
13 | * DDD Viewer base layer class.
14 | */
15 | class WalkCollideCameraController extends WalkCameraController {
16 |
17 | velocity = new Vector3();
18 |
19 | gravity = -9.8;
20 |
21 | falling = false;
22 |
23 | fallStartDistance = 0.5;
24 |
25 | update(deltaTime: number): void {
26 | // Fix viewer to floor
27 | const terrainElevation = this.dddViewer.viewerState.positionTerrainElevation;
28 | if ( terrainElevation !== null && this.dddViewer.camera ) {
29 | const currentHeight = this.getCamera().position.y;
30 | const baseHeight = terrainElevation + this.sceneCameraWalkHeight;
31 | if (currentHeight > baseHeight + this.fallStartDistance) {
32 | this.falling = true;
33 | }
34 | if (this.falling) {
35 | this.velocity.y += (this.gravity * deltaTime);
36 | this.getCamera().position.addInPlace(this.velocity.scale(deltaTime));
37 | }
38 |
39 | if (!this.falling || this.getCamera().position.y < baseHeight) {
40 | this.falling = false;
41 | this.velocity.set(0, 0, 0);
42 | this.getCamera().position.y = terrainElevation + this.sceneCameraWalkHeight;
43 | }
44 |
45 | }
46 | }
47 |
48 | }
49 |
50 | export { WalkCollideCameraController };
--------------------------------------------------------------------------------
/src/index.ts:
--------------------------------------------------------------------------------
1 | /**
2 | * @file Automatically generated by barrelsby.
3 | */
4 |
5 | export * from "./DDDViewerConfig";
6 | export * from "./SceneViewer";
7 | export * from "./ViewerState";
8 | export * from "./camera/BaseCameraController";
9 | export * from "./camera/FreeCameraController";
10 | export * from "./camera/GeolocationCameraController";
11 | export * from "./camera/OrbitCameraController";
12 | export * from "./camera/PanningCameraController";
13 | export * from "./camera/WalkCameraController";
14 | export * from "./camera/WalkCollideCameraController";
15 | export * from "./core/DDDObjectRef";
16 | export * from "./core/ScenePosition";
17 | export * from "./format/DDDFormat";
18 | export * from "./format/GeoJSON";
19 | export * from "./layers/Base3DLayer";
20 | export * from "./layers/DDD3DLayer";
21 | export * from "./layers/GeoJson3DLayer";
22 | export * from "./layers/GeoTile3DLayer";
23 | export * from "./layers/LayerManager";
24 | export * from "./layers/OverlayLayer";
25 | export * from "./loading/QueueLoader";
26 | export * from "./process/ViewerProcess";
27 | export * from "./process/ViewerProcessManager";
28 | export * from "./process/anim/AnimationProcess";
29 | export * from "./process/anim/CameraMoveAnimationProcess";
30 | export * from "./process/anim/DateTimeAnimationProcess";
31 | export * from "./process/anim/TextAnimationProcess";
32 | export * from "./process/sequencer/ViewerSequencer";
33 | export * from "./render/environment/DefaultEnvironment";
34 | export * from "./render/materials/SkyboxMaterial";
35 | export * from "./render/materials/TerrainMaterial";
36 | export * from "./render/materials/TextMaterial";
37 | export * from "./render/pipeline/DefaultRenderPipeline";
38 | export * from "./render/skybox/CubemapSkybox";
39 | export * from "./render/skybox/DynamicSkybox";
40 | export * from "./render/skybox/Skybox";
41 |
--------------------------------------------------------------------------------
/src/process/ViewerProcessManager.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D models
3 | * Copyright 2021 Jose Juan Montes and contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 | import { SceneViewer } from "../SceneViewer";
8 | import { ViewerProcess } from "./ViewerProcess";
9 |
10 |
11 | class ViewerProcessManager {
12 |
13 | sceneViewer: SceneViewer;
14 | currentProcesses: ViewerProcess[];
15 |
16 | playing = true;
17 | currentTasks = [];
18 | time = 0.0;
19 |
20 | constructor( sceneViewer: SceneViewer ) {
21 |
22 | this.sceneViewer = sceneViewer;
23 | this.currentProcesses = [];
24 | }
25 |
26 | update( deltaTime: number ): void {
27 |
28 | if ( !( this.playing )) { return; }
29 |
30 | this.time += deltaTime;
31 |
32 | // Update all current tasks
33 | for ( const proc of this.currentProcesses ) {
34 | proc.update( deltaTime );
35 | }
36 |
37 | // Remove finished steps
38 | this.currentProcesses = this.currentProcesses.filter( ( item ) => { return ( ! item.finished ); } );
39 |
40 | }
41 |
42 | add( process: ViewerProcess ): void {
43 | //console.debug("Adding process: ", process);
44 |
45 | // Sanity check
46 | if (process.sceneViewer != this.sceneViewer) {
47 | throw new Error("Tried to add a ViewerProcess to a ViewerProcessManager which belongs ot a different SceneViewer.");
48 | }
49 |
50 | this.currentProcesses.push( process );
51 | }
52 |
53 | remove( process: ViewerProcess ): void {
54 | //console.debug("Removing process: ", process);
55 | this.currentProcesses = this.currentProcesses.filter(( item ) => { return ( item !== process ); });
56 | }
57 |
58 |
59 | }
60 |
61 | export { ViewerProcessManager };
62 |
63 |
--------------------------------------------------------------------------------
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | name: ddd-viewer build
2 | run-name: Full build has been triggered by (${{ github.actor }})
3 | on:
4 | push:
5 | tags:
6 | - 'v*'
7 | jobs:
8 | build:
9 | name: Build job on Node ${{ matrix.node }} and ${{ matrix.os }}
10 | runs-on: ${{ matrix.os }}
11 | continue-on-error: true
12 | strategy:
13 | matrix:
14 | node: [ '18.0', '20.0']
15 | os: [ubuntu-latest, windows-latest, macOS-latest]
16 | steps:
17 | - name: Checkout repo
18 | uses: actions/checkout@v2
19 |
20 | - name: Use Node ${{ matrix.node }}
21 | uses: actions/setup-node@v3
22 | with:
23 | node-version: ${{ matrix.node }}
24 |
25 | # - name: Remove lock files under windows systems
26 | # run: |
27 | # if exist "./package-lock.json" del "./package-lock.json"
28 | # if exist "./yarn-lock.json" del "./yarn-lock.json"
29 |
30 | - name: Remove lock files under non-windows systems
31 | run: |
32 | rm -rf ./package-lock.json
33 | rm -rf ./yarn-lock.json
34 | if: matrix.os != 'windows-latest'
35 |
36 | - name: Install dependencies
37 | run: |
38 | yarn
39 |
40 | - name: Lint
41 | run: yarn lint
42 |
43 | # - name: Audit
44 | # run: yarn audit
45 |
46 | - name: Test
47 | run: yarn test --ci --coverage --maxWorkers=2
48 |
49 | - name: Build
50 | env:
51 | NODE_OPTIONS: '--max_old_space_size=8192'
52 | run: yarn build
53 |
54 | - name: Deploy GitHub pages
55 | run: |
56 | mkdir -p ./examples/simple/lib/
57 | cp dist/ddd-viewer.umd.production.min.js examples/simple/lib/ddd-viewer.umd.production.min.js
58 | node ci/publish-gh-pages.js
59 | if: matrix.os != 'ubuntu-latest' && matrix.node == '20.0'
--------------------------------------------------------------------------------
/src/process/anim/AnimationProcess.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D scenes
3 | * Copyright 2021 Jose Juan Montes and contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 | import { EasingFunction, QuadraticEase } from "@babylonjs/core";
8 | import { SceneViewer } from "../../SceneViewer";
9 | import { ViewerProcess } from "../ViewerProcess";
10 |
11 | abstract class AnimationProcess extends ViewerProcess {
12 |
13 | sceneViewer: SceneViewer;
14 |
15 | animTime: number;
16 | time: number;
17 | interpFactor: number;
18 |
19 | easing: EasingFunction;
20 |
21 | /**
22 | *
23 | * @param sceneViewer
24 | * @param animTime if set to null, the Process must manually mark itself as finished
25 | */
26 | constructor(sceneViewer: SceneViewer, animTime: number | null = null) {
27 |
28 | super(sceneViewer);
29 |
30 | this.sceneViewer = sceneViewer;
31 |
32 | this.time = 0.0;
33 | this.interpFactor = 0.0; // Stored as a class property for convenience of derived classes
34 |
35 | this.animTime = animTime || 0;
36 |
37 | this.easing = new QuadraticEase();
38 | this.easing.setEasingMode(EasingFunction.EASINGMODE_EASEINOUT);
39 | }
40 |
41 | update( deltaTime: number): void {
42 |
43 | // Avoid calling parent just to update deltaTime, do it here for performance
44 | this.time += deltaTime;
45 |
46 | this.interpFactor = ( this.animTime > 0 ) ? (( this.time ) / ( this.animTime)) : 1.0;
47 | if (this.interpFactor > 1.0) this.interpFactor = 1.0;
48 |
49 | // Ease interpolation
50 | this.interpFactor = this.easing.ease(this.interpFactor);
51 |
52 | if (this.animTime != null && this.time >= this.animTime) {
53 | this.finished = true;
54 | }
55 | }
56 |
57 | }
58 |
59 | export { AnimationProcess };
--------------------------------------------------------------------------------
/src/loading/QueueLoader.ts:
--------------------------------------------------------------------------------
1 | /* eslint-disable @typescript-eslint/no-explicit-any */
2 |
3 | import { SceneLoader } from "@babylonjs/core";
4 | import { SceneViewer } from "../SceneViewer";
5 | //import "babylonjs-loaders";
6 |
7 |
8 | class QueueLoaderTask {
9 | url?: string;
10 | onSuccess?: any;
11 | onFailure?: any;
12 | }
13 |
14 | class QueueLoader {
15 |
16 | sceneViewer: SceneViewer;
17 |
18 | queue: any[];
19 |
20 | current: any[];
21 |
22 | concurrentTasks: number = 2; // 1 on mobile? 2 on PC?
23 |
24 |
25 | constructor( sceneViewer: SceneViewer ) {
26 | this.sceneViewer = sceneViewer;
27 | this.queue = [];
28 | this.current = [];
29 | }
30 |
31 | update(): void {
32 | //loadNext();
33 | }
34 |
35 | processNext(): void {
36 | if ( this.queue.length < 1 ) {
37 | return;
38 | }
39 |
40 | const task: any = this.queue.pop();
41 | this.processTask( task );
42 | }
43 |
44 | enqueueLoadModel( url: string, onSuccess: any, onFailure: any ): void {
45 | const task = { "url": url, "onSuccess": onSuccess, "onFailure": onFailure };
46 | this.queue.push(task);
47 | if ( this.current.length < this.concurrentTasks ) {
48 | this.processNext();
49 | }
50 | }
51 |
52 | processTask( task: {[key: string]: any} ): void {
53 | const url: string = task["url"];
54 | SceneLoader.ImportMesh( null, "", url, this.sceneViewer.scene,
55 | ( newMeshes, particleSystems, skeletons ) => {
56 | this.processNext();
57 | task.onSuccess( newMeshes, particleSystems, skeletons );
58 | },
59 | () => {
60 | },
61 | ( scene, msg, ex ) => {
62 | task.onFailure( scene, msg, ex );
63 | this.processNext();
64 | },
65 | ".glb" // this is to force format in case a blob URL is being used
66 | );
67 | }
68 |
69 | //loadResource() {
70 | //}
71 |
72 | }
73 |
74 | export { QueueLoader };
--------------------------------------------------------------------------------
/examples/webpack_simple/README.md:
--------------------------------------------------------------------------------
1 | ## Overview
2 |
3 | Webpack Simple is an incorporated ddd-viewer in one page with webpack.
4 |
5 | The example of Webpack Simple is perfect if you are thinking of incorporating the library into a project with webpack.
6 |
7 | ## Building the example
8 |
9 | **Installation**
10 |
11 | 1. Go to webpack simple with the terminal.
12 |
13 | 2. First you can init the draft with:
14 |
15 | `npm init`
16 |
17 | 3. After you you have to install the dependencies with:
18 |
19 | `npm install`
20 |
21 | ***NOTE:***
22 |
23 | *The library is now experimental, so it is not uploaded to npm, as seen in the package.json:*
24 |
25 | `"ddd-viewer": "file:../../ddd-viewer",`
26 |
27 | You have to make a local npm to be able to use the library then run this line from npm:
28 |
29 | `npm link ddd-viewer`
30 |
31 | 4. You will have the project ready now to run the server:
32 |
33 | `npm run serve`
34 |
35 | ## How do we use the library?
36 |
37 | You import the scene and the tiles:
38 |
39 | ```js
40 | import { SceneViewer } from 'ddd-viewer';
41 |
42 | `import { GeoTile3DLayer } from 'ddd-viewer';
43 | ```
44 |
45 | And after you init the viewer:
46 |
47 | ```js
48 | export function initViewer() {
49 |
50 | var dddviewer = window['ddd-viewer'];
51 |
52 | const dddConfig = {
53 | "defaultCoords": [-8.723, 42.238],
54 | //"defaultCoords": [-8.4069793, 43.3861094],
55 | "tileUrlBase": "https://3dsmaps.com/cache/ddd_http/",
56 | "assetsUrlbase": "https://3dsmaps.com/assets/",
57 | "materialsTextureSet": "default256",
58 | "geolocation": false
59 | }
60 |
61 | const canvas = document.getElementById('ddd-scene');
62 | const sceneViewer = new SceneViewer(canvas, dddConfig);
63 |
64 | const layerDddOsm3d = new GeoTile3DLayer();
65 | sceneViewer.layerManager.addLayer("ddd-osm-3d", layerDddOsm3d);
66 |
67 | }
68 | ```
69 |
70 | Finally you have to call the library when the page loads:
71 |
72 | ```js
73 | window.addEventListener("load", () => {
74 | initViewer();
75 | });
76 | ```
--------------------------------------------------------------------------------
/examples/simple/README.md:
--------------------------------------------------------------------------------
1 | ## Overview
2 |
3 | This an easy example of how to embed ddd-viewer into a simple html.
4 |
5 |
6 | ## Building the example
7 |
8 | **Using**
9 |
10 | For using this example you need to build `ddd-viewer.umd.production.min.js` and place it to the `lib/` folder.
11 |
12 | Open `index.html` in your favourite browser.
13 |
14 | Check the [project's README](../../README.md) for more information.
15 |
16 |
17 | ## How do we use the library?
18 |
19 | Import the UMD build into your `` element with a script tag:
20 | ```html
21 |
22 |
23 |
24 | ```
25 |
26 | We used Tailwind CSS library for presentation, but it`s not necessary for the viewer.
27 |
28 | We have to setup our html with a canvas element that is going to be our container for the 3D scene rendering.
29 |
30 | ```html
31 |
32 |
Simple Example DDD-Viewer
33 |
34 |
35 | ```
36 |
37 | We have to initialize the viewer passing it the configuration and the layers we want to show up:
38 |
39 | ```js
40 | function initViewer() {
41 |
42 | var dddviewer = window['ddd-viewer'];
43 |
44 | const dddConfig = {
45 | "defaultCoords": [-8.723, 42.238],
46 | //"defaultCoords": [-8.4069793, 43.3861094],
47 | "tileUrlBase": "https://3dsmaps.com/cache/ddd_http/",
48 | "assetsUrlbase": "https://3dsmaps.com/assets/",
49 | "materialsTextureSet": "default256",
50 | "geolocation": false
51 | }
52 |
53 | const canvas = document.getElementById('ddd-scene');
54 | const sceneViewer = new dddviewer.SceneViewer(canvas, dddConfig);
55 |
56 | const layerDddOsm3d = new dddviewer.GeoTile3DLayer();
57 | sceneViewer.layerManager.addLayer(layerDddOsm3d);
58 |
59 | // Events
60 | //window.addEventListener('resize', this.resize);
61 |
62 | }
63 | ```
64 |
65 | Finally you have to call the library when the page loads:
66 |
67 | ```js
68 | window.addEventListener("load", () => {
69 | initViewer();
70 | });
71 | ```
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | // see https://www.typescriptlang.org/tsconfig to better understand tsconfigs
3 | "include": [
4 | "src"
5 | //"types"
6 | ],
7 | "compilerOptions": {
8 | "baseUrl": "src",
9 | /*"paths": {
10 | "./main/*": ["main/*"],
11 | "./layers/*": ["layers/*"],
12 | "./loading/*": ["loading/*"],
13 | "./process/*": ["process/*"],
14 | "./render/*": ["render/*"],
15 | },*/
16 | "target": "es5",
17 | "module": "esnext",
18 | "types": [
19 | "ol",
20 | "proj4",
21 | "suncalc"
22 | ],
23 | "lib": [
24 | "DOM",
25 | "ESNext"
26 | ],
27 | "importHelpers": true,
28 | // output .d.ts declaration files for consumers
29 | "declaration": true,
30 | // output .js.map sourcemap files for consumers
31 | "sourceMap": true,
32 | // match output dir to input dir. e.g. dist/index instead of dist/src/index
33 | "rootDir": "./src",
34 | // stricter type-checking for stronger correctness. Recommended by TS
35 | "strict": true,
36 | // linter checks for common issues
37 | "noImplicitReturns": true,
38 | "noFallthroughCasesInSwitch": true,
39 | // noUnused* overlap with @typescript-eslint/no-unused-vars, can disable if duplicative
40 | "noUnusedLocals": false,
41 | "noUnusedParameters": false,
42 | // use Node's module resolution algorithm, instead of the legacy TS one
43 | "moduleResolution": "node",
44 | // transpile JSX to React.createElement
45 | //"jsx": "react",
46 | // interop between ESM and CJS modules. Recommended by TS
47 | "esModuleInterop": true,
48 | // significant perf increase by skipping checking .d.ts files, particularly those in node_modules. Recommended by TS
49 | "skipLibCheck": true,
50 | // error out if import and file system have a casing mismatch. Recommended by TS
51 | "forceConsistentCasingInFileNames": true,
52 | // `tsdx build` ignores this option, but it is commonly used when type-checking separately with `tsc`
53 | "noEmit": true
54 | }
55 | }
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/examples/simple/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | DDD-Viewer Simple Example
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
Simple Example DDD-Viewer
24 |
25 |
26 |
27 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "ddd-viewer",
3 | "version": "0.1.0",
4 | "license": "MIT",
5 | "author": "Jose Juan Montes",
6 | "contributors": [
7 | "Farvell"
8 | ],
9 | "description": "DDD(3Ds) Viewer library for DDD-generated GIS 3D scenes",
10 | "main": "dist/ddd-viewer.esm.js",
11 | "typings": "dist/index.d.ts",
12 | "files": [
13 | "dist"
14 | ],
15 | "engines": {
16 | "node": ">=10"
17 | },
18 | "scripts": {
19 | "dev": "barrelsby -d src --delete && tsdx watch --format esm --target web",
20 | "build-esm": "barrelsby -d src --delete && tsdx build --format esm --target web",
21 | "build-umd": "barrelsby -d src --delete && tsdx build --max_old_space_size=8192 --format umd --target web",
22 | "build": "barrelsby -d src --delete && tsdx build --max_old_space_size=8192 --format esm,umd --target web",
23 | "barrelsby": "barrelsby -d src --delete",
24 | "doc": "barrelsby -d src --delete && npx typedoc --out doc/api src/index.ts",
25 | "test": "tsdx test --passWithNoTests",
26 | "lint": "eslint . --ext .ts --fix",
27 | "_prepare": "tsdx build --format esm,umd --target web",
28 | "size": "size-limit",
29 | "analyze": "size-limit --why"
30 | },
31 | "husky": {
32 | "hooks": {
33 | "pre-commit": "npx lint-staged"
34 | }
35 | },
36 | "module": "dist/ddd-viewer.esm.js",
37 | "size-limit": [
38 | {
39 | "path": "dist/ddd-viewer.cjs.production.min.js",
40 | "limit": "10 KB"
41 | },
42 | {
43 | "path": "dist/ddd-viewer.esm.js",
44 | "limit": "10 KB"
45 | }
46 | ],
47 | "devDependencies": {
48 | "@rollup/plugin-node-resolve": "^15.2.1",
49 | "@size-limit/preset-small-lib": "^9.0.0",
50 | "@types/ol": "^6.5.1",
51 | "@types/proj4": "^2.5.0",
52 | "@types/suncalc": "^1.8.0",
53 | "@typescript-eslint/eslint-plugin": "^6.7.2",
54 | "@typescript-eslint/parser": "^6.7.2",
55 | "barrelsby": "^2.8.1",
56 | "eslint": "^8.50.0",
57 | "gh-pages": "^6.0.0",
58 | "husky": "^7.0.1",
59 | "lint-staged": "^14.0.1",
60 | "ol": "^6.5.0",
61 | "prettier": "^3.0.3",
62 | "proj4": "^2.7.2",
63 | "size-limit": "^9.0.0",
64 | "suncalc": "^1.8.0",
65 | "tsdx": "^0.14.1",
66 | "tslib": "^2.2.0",
67 | "typedoc": "^0.25.1",
68 | "typescript": "^4.3.2"
69 | },
70 | "dependencies": {
71 | "@babylonjs/core": "5.0.0-rc.4",
72 | "@babylonjs/loaders": "5.0.0-rc.4",
73 | "@babylonjs/materials": "5.0.0-rc.4",
74 | "earcut": "^2.2.2"
75 | },
76 | "lint-staged": {
77 | "*.ts": [
78 | "prettier -w",
79 | "eslint --fix"
80 | ]
81 | }
82 | }
83 |
--------------------------------------------------------------------------------
/src/camera/FreeCameraController.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D scenes
3 | * Copyright 2021 Jose Juan Montes and Contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 | import { Camera, UniversalCamera, Vector3 } from "@babylonjs/core";
8 | import { SceneViewer } from "SceneViewer";
9 | import { BaseCameraController } from "./BaseCameraController";
10 |
11 | /**
12 | * DDD Viewer base layer class.
13 | */
14 | class FreeCameraController extends BaseCameraController {
15 |
16 | fixMinHeight = false;
17 |
18 | update(deltaTime: number): void {
19 | // Fix viewer to floor
20 | if (this.fixMinHeight) {
21 | const terrainElevation = this.dddViewer.viewerState.positionTerrainElevation;
22 | if (terrainElevation && this.dddViewer.camera.position.y < ( terrainElevation + 1.0 )) {
23 | this.getCamera().position.y = terrainElevation + 1.0;
24 | }
25 | }
26 | }
27 |
28 | activate(): void {
29 | if (this.dddViewer.camera) {
30 | this.dddViewer.camera.customRenderTargets.length = 0; //4 = [];
31 | this.dddViewer.camera.detachControl();
32 | this.dddViewer.camera.dispose();
33 | }
34 |
35 | //console.debug("Creating free camera.");
36 | const camera = new UniversalCamera( "Camera", Vector3.Zero(), this.dddViewer.scene );
37 | camera.minZ = 1.0; // 0.1;
38 | camera.maxZ = 4500;
39 | camera.angularSensibility = 500.0;
40 | camera.touchAngularSensibility = 1000.0;
41 | //camera.touchMoveSensibility = 1.0;
42 | camera.inertia = 0.0;
43 | camera.keysUp.push( 87 );
44 | camera.keysDown.push( 83 );
45 | camera.keysLeft.push( 65 );
46 | camera.keysRight.push( 68 );
47 | camera.keysUpward.push( 69 );
48 | camera.keysDownward.push( 81 );
49 | camera.attachControl( this.dddViewer.engine.getRenderingCanvas(), true );
50 | camera.fov = 40.0 * ( Math.PI / 180.0 ); // 35.0 might be GM, 45.8... is default // 35
51 | const positionScene = this.dddViewer.wgs84ToScene( this.dddViewer.viewerState.positionWGS84 );
52 | camera.position = new Vector3( positionScene[0], this.dddViewer.viewerState.positionGroundHeight + this.dddViewer.viewerState.positionTerrainElevation + 1, positionScene[2]);
53 | camera.rotation = new Vector3(( 90.0 - this.dddViewer.viewerState.positionTilt ) * ( Math.PI / 180.0 ), this.dddViewer.viewerState.positionHeading * ( Math.PI / 180.0 ), 0.0 );
54 | //camera.cameraRotation = new Vector2(/* (90.0 - this.viewerState.positionTilt) * (Math.PI / 180.0) */ 0, this.viewerState.positionHeading * (Math.PI / 180.0));
55 | this.dddViewer.camera = camera;
56 | this.dddViewer.setMoveSpeed( this.dddViewer.viewerState.sceneMoveSpeed );
57 |
58 | this.dddViewer.updateRenderTargets();
59 | if (this.dddViewer.shadowGenerator) {
60 | this.dddViewer.shadowGenerator.splitFrustum();
61 | }
62 | }
63 |
64 | }
65 |
66 | export { FreeCameraController };
--------------------------------------------------------------------------------
/src/camera/OrbitCameraController.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D scenes
3 | * Copyright 2021 Jose Juan Montes and Contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 | import { ArcRotateCamera, BoundingInfo, Camera, Mesh, Vector3 } from "@babylonjs/core";
8 | import { SceneViewer } from "SceneViewer";
9 | import { BaseCameraController } from "./BaseCameraController";
10 |
11 | /**
12 | * DDD Viewer base layer class.
13 | */
14 | class OrbitCameraController extends BaseCameraController {
15 |
16 | update(deltaTime: number): void {
17 | // Fix viewer to floor
18 | const terrainElevation = this.dddViewer.viewerState.positionTerrainElevation;
19 | if (terrainElevation && this.dddViewer.camera.position.y < ( terrainElevation + 1.0 )) {
20 | this.getCamera().position.y = terrainElevation + 1.0;
21 | }
22 | }
23 |
24 | activate(): void {
25 |
26 | let targetCoords = Vector3.Zero();
27 | if ( this.dddViewer.selectedObject ) {
28 | const boundingBox: BoundingInfo = this.dddViewer.getBoundsRecursively( this.dddViewer.selectedObject!.mesh );
29 | //targetCoords = this.selectedMesh.absolutePosition;
30 | const minWorld = boundingBox.minimum;
31 | const maxWorld = boundingBox.maximum;
32 | targetCoords = new Vector3(( minWorld.x + maxWorld.x ) / 2, ( minWorld.y + maxWorld.y ) / 2, ( minWorld.z + maxWorld.z ) / 2 );
33 | }
34 |
35 | let distance = 75.0;
36 | if ( this.dddViewer.camera ) {
37 | distance = Vector3.Distance( this.dddViewer.camera.position, targetCoords );
38 |
39 | this.dddViewer.camera.customRenderTargets.length = 0; // = [];
40 |
41 | this.dddViewer.camera.detachControl();
42 | this.dddViewer.camera.dispose();
43 | }
44 |
45 | console.debug( "Creating orbit camera pointing to: " + targetCoords );
46 |
47 | const camera = new ArcRotateCamera( "Camera", -( 90 + this.dddViewer.viewerState.positionHeading ) * Math.PI / 180.0, this.dddViewer.viewerState.positionTilt * Math.PI / 180.0, distance, targetCoords, this.dddViewer.scene );
48 | camera.attachControl( this.dddViewer.engine.getRenderingCanvas(), true );
49 | camera.minZ = 0.5; // 1.0; // 0.1;
50 | //camera.maxZ = 2500; // Automatic? see focusOn()
51 | camera.lowerRadiusLimit = 15;
52 | camera.upperRadiusLimit = 1000;
53 | camera.upperBetaLimit = Math.PI; // /2; // Math.PI / 2 = limit to flat view
54 | camera.panningSensibility = 50.0; // 0.5;
55 | //camera.angularSensibility = 50.0;
56 | //camera.inertia = 0.10;
57 |
58 | //camera.multiTouchPanning = false;
59 | //camera.multiTouchPanAndZoom = false;
60 | //camera.pinchZoom = true;
61 |
62 | camera.useNaturalPinchZoom = true;
63 | camera.fov = 35.0 * ( Math.PI / 180.0 );
64 | this.dddViewer.camera = camera;
65 |
66 | this.dddViewer.updateRenderTargets();
67 | if (this.dddViewer.shadowGenerator) {
68 | this.dddViewer.shadowGenerator.splitFrustum();
69 | }
70 | }
71 |
72 | }
73 |
74 | export { OrbitCameraController };
--------------------------------------------------------------------------------
/src/render/materials/TextMaterial.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D scenes
3 | * Copyright 2021 Jose Juan Montes and Contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 | import { PBRCustomMaterial } from "@babylonjs/materials";
8 | import { BaseTexture, Color3, Scene, Texture, Vector2 } from "@babylonjs/core";
9 | import { SceneViewer } from "SceneViewer";
10 |
11 | /**
12 | */
13 | class TextMaterialWrapper {
14 |
15 | sceneViewer: SceneViewer;
16 | material: PBRCustomMaterial;
17 |
18 | options: any;
19 |
20 | constructor(sceneViewer: SceneViewer, atlasTexture: BaseTexture, atlasNormalTexture: BaseTexture | null, options: any = null) {
21 | this.sceneViewer = sceneViewer;
22 | this.options = options;
23 | this.material = this.initMaterial( this.sceneViewer.scene, atlasTexture, atlasNormalTexture);
24 | }
25 |
26 | initMaterial(scene: Scene, atlas: BaseTexture, atlasnormals: BaseTexture | null): PBRCustomMaterial {
27 |
28 | this.material = new PBRCustomMaterial("TextMaterial", scene);
29 | this.material.metallic = 0.05; // 0.0;
30 | this.material.roughness = 0.975; // 0.43 (asphalt); // 0.95;
31 | //this.material.indexOfRefraction = 1.4;
32 |
33 | //this.material.twoSidedLighting = true;
34 | //this.material.disableLighting = false;
35 | //this.material.ambientColor = new Color3(1.0, 1.0, 1.0); // Color3.Black();
36 | //this.material.disableBumpMap = true;
37 | //this.material.metallicspecularColor = new Color3(0.15, 0.15, 0.15); // Color3.Black();
38 | //this.material.specularIntensity = 1.0;
39 | //this.material.emissiveColor = new Color3(0.0, 0.0, 0.0); // Color3.Black();
40 | //this.material.emissiveIntensity = 0.0;
41 | //this.material.usePhysicalLightFalloff= false;
42 | //this.material.environmentIntensity = sceneViewer.baseEnvironmentIntensity; // This one is needed to avoid saturation due to env
43 |
44 | this.material.albedoTexture = atlas;
45 | if (atlasnormals !== null) {
46 | //this.material.bumpTexture = atlasnormals;
47 | this.material.bumpTexture = atlasnormals;
48 | }
49 |
50 | this.material.Fragment_Custom_Albedo(`
51 | vec3 txtColor = result;
52 | if (txtColor.r < 0.02) {
53 | discard;
54 | }
55 | //vec3 col = vec3(1.0, 0.8, 0.8);
56 | //vec3 col = vec3(1.0, 1.0, 1.0) * tmp;
57 | //col = vec3(col.r * result.r, col.g * result.g, col.b * result.b);
58 | vec3 col = vec3(0.0, 0.0, 0.0);
59 | surfaceAlbedo = col;
60 | `);
61 |
62 | /*
63 | this.material.onBindObservable.add(() => {
64 | this.update();
65 | });
66 | */
67 |
68 | return this.material;
69 | }
70 |
71 | update(): void {
72 | //this.material.getEffect().setTexture( "splatmap", this.splatMap );
73 | //this.material.getEffect().setTexture( "atlasNormalsSampler", this.atlasBumpTexture );
74 |
75 | //this.material.reflectionTexture = this.envReflectionProbe.cubeTexture;
76 | //this.material.reflectionTexture = this.scene.environmentTexture;
77 | //this.sceneViewer.scene.environmentTexture = this.sceneViewer.envReflectionProbe.cubeTexture;
78 | //this.scene.environmentTexture = this.envReflectionProbe.cubeTexture;
79 | }
80 |
81 | }
82 |
83 | export { TextMaterialWrapper };
84 |
--------------------------------------------------------------------------------
/src/ViewerState.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * DDDViewer - DDD(3Ds) Viewer library for DDD-generated GIS 3D scenes
3 | * Copyright 2021 Jose Juan Montes and contributors
4 | * MIT License (see LICENSE file)
5 | */
6 |
7 | import { DDDViewerConfig } from "./DDDViewerConfig";
8 |
9 | /**
10 | * Holds DDDViewer global state like viewer position, date/time, configuration...
11 | * Some internal values are also stored here for convenience (FPS, drawcalls, mobile detection...).
12 | * This object must be JSON-serializable.
13 | */
14 | class ViewerState {
15 |
16 | mapVisible = true;
17 | sceneVisible = false;
18 | dddConfig: DDDViewerConfig;
19 | isMobile = false;
20 | positionTileZoomLevel = 11;
21 | positionWGS84 = [ -8.726, 42.233 ]; // [0.0, 0.0];
22 |
23 | // Position in scene, in engine coordinates (elevation is Y)
24 | positionScene = [ 0, 0, 0 ];
25 | positionGroundHeight: number = 150.0;
26 | positionTerrainElevation = 0;
27 | positionHeading = 0.0;
28 | positionTilt = 0.0;
29 | positionName: string | null = null;
30 | positionDate: Date = new Date();
31 | positionDateSeconds: number = this.positionDate.getTime() / 1000;
32 | geolocationEnabled = false;
33 | timeScale = 24 * 2; // 24 * 2 = 48x faster (1 day = 30 min)
34 |
35 | // TODO: These nodes are instrumented: remove selectedMesh from here and use ids.
36 | // TODO: Try removing this and this.sceneViewer id still used
37 | sceneSelectedMesh = null;
38 | sceneSelectedMeshId: string | null = null;
39 |
40 | sceneFPS: number = 0;
41 | sceneDrawCalls: number = 0;
42 | sceneTriangles: number = 0;
43 |
44 | sceneShadowsEnabled = false;
45 | sceneTextsEnabled = false;
46 | scenePostprocessingEnabled = false;
47 | scenePickingEnabled = true;
48 | sceneViewModeShow = true;
49 | sceneSelectedShowNormals = true;
50 | sceneTileDrawDistance = 1;
51 | sceneMoveSpeed = 5;
52 | sceneEnvironmentProbe = 16; // 16; // null to use a static environment (should be associated to the skybox, but it's currently fixed)
53 | sceneSkybox = "/textures/TropicalSunnyDay"; // /textures/skybox/clouds1/clouds1 // "@dynamic"; // ""/textures/TropicalSunnyDay";
54 |
55 | // TODO: This shall be a per-layer setting
56 | sceneGroundTextureOverrideUrl: string | null = null;
57 |
58 | sceneTitleText:string | null = null;
59 |
60 | /**
61 | * 3dsmaps DDD tile server supports on-demand generation. When a tile that's not available is enqueued, it responds
62 | * with information about the job status. This array contains enqueued tiles status.
63 | */
64 | remoteQueueJobsStatus: any[] = [];
65 |
66 |
67 | constructor(dddConfig: DDDViewerConfig, initialCoords: number[] | null = null) {
68 |
69 | this.dddConfig = dddConfig;
70 |
71 | if (dddConfig.defaultCoords) {
72 | this.positionWGS84 = dddConfig.defaultCoords;
73 | }
74 |
75 | if (initialCoords) {
76 | this.positionWGS84 = initialCoords;
77 | }
78 |
79 | const shadowsEnabled = localStorage.getItem( "dddSceneShadowsEnabled" );
80 | this.sceneShadowsEnabled = shadowsEnabled ? JSON.parse( shadowsEnabled ) : this.sceneShadowsEnabled;
81 |
82 | const textsEnabled = localStorage.getItem( "dddSceneTextsEnabled" );
83 | this.sceneTextsEnabled = textsEnabled ? JSON.parse( textsEnabled ) : this.sceneTextsEnabled;
84 |
85 | this.sceneTileDrawDistance = dddConfig.sceneTileDrawDistanceDefault;
86 |
87 | // Start time
88 | this.positionDate.setHours( 11 );
89 | this.positionDate.setMinutes( 0 );
90 |
91 | }
92 | }
93 |
94 | export { ViewerState };
95 |
--------------------------------------------------------------------------------
/src/layers/OverlayLayer.ts:
--------------------------------------------------------------------------------
1 | import {
2 | AbstractMesh,
3 | Color3,
4 | Mesh,
5 | MeshBuilder,
6 | Node,
7 | Ray,
8 | StandardMaterial,
9 | Texture,
10 | TransformNode,
11 | Vector3,
12 | } from "@babylonjs/core";
13 | import { Coordinate } from "ol/coordinate";
14 | import * as extent from "ol/extent";
15 | import * as olProj from "ol/proj";
16 | import { createXYZ, extentFromProjection } from "ol/tilegrid";
17 | import TileGrid from "ol/tilegrid/TileGrid";
18 | import { SceneViewer } from "../SceneViewer";
19 | import { Base3DLayer } from "./Base3DLayer";
20 | import { GeoJson3DLayer } from "./GeoJson3DLayer";
21 |
22 | class OverlayLayer extends Base3DLayer {
23 | sourceLayerKey: string;
24 |
25 | items: HTMLElement[] = [];
26 |
27 | div: HTMLElement | null = null;
28 |
29 | template: string | null = null;
30 |
31 | maxDistance: number = 0;
32 |
33 | maxItems: number = 10;
34 |
35 | occlude: boolean = false;
36 |
37 | constructor(key: string, sourceLayerKey: string) {
38 | super(key);
39 | this.sourceLayerKey = sourceLayerKey;
40 | setTimeout(() => {
41 | this.createOverlayDiv();
42 | this.updateSceneFromFeatures();
43 | }, 0);
44 | }
45 |
46 | createOverlayDiv(): void {
47 | // Add an overlay DIV over the 3D canvas
48 | // FIXME: This should be created by the scene viewer, and other divs
49 | const sceneViewer: SceneViewer = this.layerManager!.sceneViewer;
50 | this.div = document.createElement("div");
51 | sceneViewer.element.appendChild(this.div);
52 | this.div.className = "ddd-layer-overlay";
53 |
54 | this.div.style.zIndex = "5";
55 | this.div.style.width = "100%";
56 | this.div.style.height = "100%";
57 | this.div.style.position = "absolute";
58 | this.div.style.top = "0";
59 | this.div.style.left = "0";
60 | this.div.style.right = "0";
61 | this.div.style.bottom = "0";
62 | this.div.style.pointerEvents = "none";
63 | }
64 |
65 | resizeOverlayDiv() {
66 | const sceneViewer: SceneViewer = this.layerManager!.sceneViewer;
67 | this.div!.style.width = sceneViewer.canvas.style.width;
68 | this.div!.style.height = sceneViewer.canvas.style.height;
69 | }
70 |
71 | update(): void {}
72 |
73 | setVisible(visible: boolean) {
74 | super.setVisible(visible);
75 | if (this.div) this.div.style.display == "visible" ? "block" : "none";
76 | /*
77 | for (let node of this.sceneNodes) {
78 | node.setEnabled(this.visible);
79 | }
80 | */
81 | }
82 |
83 | /**
84 | * Update scene generating a DIV for each feature in the source layer.
85 | */
86 | updateSceneFromFeatures() {
87 | const sourceLayer = (
88 | this.layerManager!.getLayer(this.sourceLayerKey)!
89 | );
90 | for (const feature of sourceLayer.featuresPoints) {
91 | const html =
92 | "Feature: " +
93 | feature +
94 | "
";
95 | const featureDiv = document.createElement("div");
96 | this.div!.appendChild(featureDiv);
97 | featureDiv.outerHTML = html;
98 | }
99 |
100 | /*
101 | for (let feature of this.featuresLines) {
102 | let marker = MeshBuilder.CreateLines("lineMarker", { points: feature.coordsScene }, sceneViewer.scene);
103 | marker.material = this.featureMaterial;
104 | marker.parent = this.rootNode;
105 | //this.sceneNodes.push(marker);
106 | }
107 | */
108 | }
109 |
110 | clearScene() {
111 | /*
112 | if (this.rootNode) {
113 | this.rootNode.parent = null;
114 | this.rootNode.dispose();
115 | this.rootNode = null;
116 | }
117 | */
118 | }
119 | }
120 |
121 | export { OverlayLayer };
122 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | [](https://github.com/blackyale/ddd-viewer/actions/workflows/build.yml)
2 |
3 | # DDD-Viewer
4 |
5 |
6 |
11 |
12 |
13 | > DDD-Viewer library for viewing DDD and OpenStreetMap data in 3D.
14 |
15 |
16 | ## Overview
17 |
18 | DDD-Viewer is an HTML5 library for 3D visualization of scenes generated by the [DDD tool](https://github.com/jjmontesl/ddd).
19 |
20 | In particular, DDD-Viewer allows to render and interact with 3D maps generated from [OpenStreetMap](https://www.openstreetmap.org/) and other datasouces.
21 |
22 | DDD-Viewer is a TypeScript library based on [BabylonJS](https://www.babylonjs.com/).
23 |
24 | You can embed DDD-Viewer scenes in your website or use it to build a custom application.
25 |
26 | *NOTE that this project is currently experimental and the data formats and library are expected to change.*
27 |
28 |
29 | ## Examples
30 |
31 | - DDD-Viewer-App at [3dsmaps.com](https://3dsmaps.com).
32 | - The [examples](examples/) directory contains simple usage examples.
33 |
34 | *TODO: Add 1-2 screenshots*
35 |
36 |
37 | ## Using the library
38 |
39 | DDD-Viewer is meant to be easily used as a standalone viewer for websites or
40 | as a library from 3rd party projects.
41 |
42 | Note that if serving your own copy of DDD-Viewer, you may wish to point your users to your own
43 | assets. See the [Configuration] and the [Assets] sections below for further information.
44 |
45 |
46 | ### From vanilla Javascript, with no bundler (\