ソースを参照

Merge remote-tracking branch 'upstream/master' into Env

sebastien 7 年 前
コミット
16f9f869a4
100 ファイル変更18947 行追加17674 行削除
  1. 1 1
      .gitignore
  2. 17040 16867
      Playground/babylon.d.txt
  3. BIN
      Playground/textures/360photo.jpg
  4. 15 3
      Tools/Gulp/config.json
  5. 4 3
      Tools/Gulp/gulpfile.js
  6. 1 1
      Tools/Gulp/package.json
  7. 15 0
      Viewer/acorn
  8. 7 0
      Viewer/acorn.cmd
  9. 15 0
      Viewer/ansi-html
  10. 7 0
      Viewer/ansi-html.cmd
  11. 0 97
      Viewer/assets/deepmerge.min.js
  12. 0 1
      Viewer/assets/es6-promise.min.js
  13. 0 29
      Viewer/assets/handlebars.min.js
  14. 0 210
      Viewer/assets/pep.min.js
  15. 15 0
      Viewer/atob
  16. 7 0
      Viewer/atob.cmd
  17. 15 0
      Viewer/errno
  18. 7 0
      Viewer/errno.cmd
  19. 15 0
      Viewer/esparse
  20. 7 0
      Viewer/esparse.cmd
  21. 15 0
      Viewer/esvalidate
  22. 7 0
      Viewer/esvalidate.cmd
  23. 15 0
      Viewer/handlebars
  24. 7 0
      Viewer/handlebars.cmd
  25. 15 0
      Viewer/he
  26. 7 0
      Viewer/he.cmd
  27. 15 0
      Viewer/html-minifier
  28. 7 0
      Viewer/html-minifier.cmd
  29. 15 0
      Viewer/import-local-fixture
  30. 7 0
      Viewer/import-local-fixture.cmd
  31. 15 0
      Viewer/internal-ip
  32. 7 0
      Viewer/internal-ip.cmd
  33. 15 0
      Viewer/json5
  34. 7 0
      Viewer/json5.cmd
  35. 15 0
      Viewer/miller-rabin
  36. 7 0
      Viewer/miller-rabin.cmd
  37. 15 0
      Viewer/mime
  38. 7 0
      Viewer/mime.cmd
  39. 15 0
      Viewer/mkdirp
  40. 7 0
      Viewer/mkdirp.cmd
  41. 15 0
      Viewer/multicast-dns
  42. 7 0
      Viewer/multicast-dns.cmd
  43. 6 1
      Viewer/package.json
  44. 15 0
      Viewer/rimraf
  45. 7 0
      Viewer/rimraf.cmd
  46. 15 0
      Viewer/semver
  47. 7 0
      Viewer/semver.cmd
  48. 15 0
      Viewer/sha.js
  49. 7 0
      Viewer/sha.js.cmd
  50. 1 0
      Viewer/src/assets/font.ts
  51. 5 0
      Viewer/src/assets/img.ts
  52. 3 0
      Viewer/src/assets/index.ts
  53. 9 0
      Viewer/src/assets/templates.ts
  54. 532 0
      Viewer/src/configuration/configuration.d.ts
  55. 1 431
      Viewer/src/configuration/configuration.ts
  56. 8 0
      Viewer/src/configuration/configurationCompatibility.d.ts
  57. 1 1
      Viewer/src/configuration/configurationCompatibility.ts
  58. 12 0
      Viewer/src/configuration/configurationContainer.ts
  59. 5 0
      Viewer/src/configuration/globals.d.ts
  60. 6 0
      Viewer/src/configuration/globals.ts
  61. 1 0
      Viewer/src/configuration/index.d.ts
  62. 2 1
      Viewer/src/configuration/index.ts
  63. 24 0
      Viewer/src/configuration/interfaces/cameraConfiguration.ts
  64. 101 0
      Viewer/src/configuration/interfaces/colorGradingConfiguration.ts
  65. 21 0
      Viewer/src/configuration/interfaces/defaultRenderingPipelineConfiguration.ts
  66. 20 0
      Viewer/src/configuration/interfaces/groundConfiguration.ts
  67. 38 0
      Viewer/src/configuration/interfaces/imageProcessingConfiguration.ts
  68. 13 0
      Viewer/src/configuration/interfaces/index.ts
  69. 42 0
      Viewer/src/configuration/interfaces/lightConfiguration.ts
  70. 29 0
      Viewer/src/configuration/interfaces/modelAnimationConfiguration.ts
  71. 63 0
      Viewer/src/configuration/interfaces/modelConfiguration.ts
  72. 5 0
      Viewer/src/configuration/interfaces/observersConfiguration.ts
  73. 40 0
      Viewer/src/configuration/interfaces/sceneConfiguration.ts
  74. 24 0
      Viewer/src/configuration/interfaces/sceneOptimizerConfiguration.ts
  75. 19 0
      Viewer/src/configuration/interfaces/skyboxConfiguration.ts
  76. 46 0
      Viewer/src/configuration/interfaces/templateConfiguration.ts
  77. 26 0
      Viewer/src/configuration/loader.d.ts
  78. 1 1
      Viewer/src/configuration/loader.ts
  79. 42 0
      Viewer/src/configuration/mappers.d.ts
  80. 1 1
      Viewer/src/configuration/mappers.ts
  81. 6 0
      Viewer/src/configuration/types/default.d.ts
  82. 17 14
      Viewer/src/configuration/types/default.ts
  83. 5 0
      Viewer/src/configuration/types/environmentMap.d.ts
  84. 6 0
      Viewer/src/configuration/types/extended.d.ts
  85. 13 0
      Viewer/src/configuration/types/index.d.ts
  86. 1 1
      Viewer/src/configuration/types/index.ts
  87. 6 0
      Viewer/src/configuration/types/minimal.d.ts
  88. 10 8
      Viewer/src/configuration/types/minimal.ts
  89. 9 0
      Viewer/src/configuration/types/shadowLight.d.ts
  90. 35 0
      Viewer/src/eventManager.d.ts
  91. 1 0
      Viewer/src/externalModules.d.ts
  92. 24 0
      Viewer/src/helper.d.ts
  93. 11 0
      Viewer/src/helper/deepmerge.d.ts
  94. 5 0
      Viewer/src/helper.ts
  95. 28 0
      Viewer/src/index.d.ts
  96. 2 3
      Viewer/src/index.ts
  97. 11 0
      Viewer/src/initializer.d.ts
  98. 5 0
      Viewer/src/interfaces.d.ts
  99. 126 0
      Viewer/src/labs/environmentSerializer.d.ts
  100. 0 0
      Viewer/src/labs/texture.d.ts

+ 1 - 1
.gitignore

@@ -178,7 +178,7 @@ dist/preview release/viewer/babylon.d.ts
 dist/preview release/viewer/babylonjs.loaders.d.ts
 dist/preview release/viewer/babylon.glTF2Interface.d.ts
 Viewer/dist/viewer.max.js
-!Viewer/src/externalModules.d.ts
+!Viewer/src/**/*.d.ts
 Viewer/tests/unit/src/**/*.js
 Viewer/tests/Lib/**/*.js
 Viewer/tests/commons/**/*.js

ファイルの差分が大きいため隠しています
+ 17040 - 16867
Playground/babylon.d.txt


BIN
Playground/textures/360photo.jpg


+ 15 - 3
Tools/Gulp/config.json

@@ -115,7 +115,8 @@
             "backgroundMaterial",
             "environmentHelper",
             "particleHelper",
-            "videoDome"
+            "videoDome",
+            "photoDome"
         ],
         "minimal": [
             "freeCamera",
@@ -1225,6 +1226,16 @@
                 "meshBuilder",
                 "additionalTextures"
             ]
+        },
+        "photoDome": {
+            "files": [
+                "../../src/Helpers/babylon.photoDome.js"
+            ],
+            "dependUpon": [
+                "core",
+                "meshBuilder",
+                "additionalTextures"
+            ]
         }
     },
     "typescript": [
@@ -1714,6 +1725,7 @@
                     "../../gui/src/3D/controls/button3D.ts",
                     "../../gui/src/3D/controls/holographicButton.ts",
                     "../../gui/src/3D/controls/stackPanel3D.ts",
+                    "../../gui/src/3D/controls/volumeBasedPanel.ts",
                     "../../gui/src/3D/controls/spherePanel.ts"
                 ],
                 "shaderFiles": [
@@ -1835,8 +1847,8 @@
             "srcOutputDirectory": "../../Viewer/",
             "dtsBundle": {
                 "name": "babylonjs-viewer",
-                "main": "../../Viewer/src/index.d.ts",
-                "out": "../../dist/preview release/viewer/babylon.viewer.module.d.ts",
+                "main": "../../Viewer/dist/build/src/index.d.ts",
+                "out": "../../../../dist/preview release/viewer/babylon.viewer.module.d.ts",
                 "prependText": "/// <reference path=\"./babylon.d.ts\"/>\n/// <reference path=\"./babylon.glTF2Interface.d.ts\"/>\n/// <reference path=\"./babylonjs.loaders.d.ts\"/>\ndeclare module \"babylonjs-loaders\"{ export=BABYLON;}\n"
             },
             "outputs": [

+ 4 - 3
Tools/Gulp/gulpfile.js

@@ -466,12 +466,13 @@ var buildExternalLibrary = function (library, settings, watch) {
                         // create the file
                         dtsBundle.bundle(settings.build.dtsBundle);
                         // prepend the needed reference
-                        fs.readFile(settings.build.dtsBundle.out, function (err, data) {
+                        let fileLocation = path.join(path.dirname(settings.build.dtsBundle.main), settings.build.dtsBundle.out);
+                        fs.readFile(fileLocation, function (err, data) {
                             if (err) throw err;
                             data = settings.build.dtsBundle.prependText + '\n' + data.toString();
-                            fs.writeFile(settings.build.dtsBundle.out, data);
+                            fs.writeFile(fileLocation, data);
                             var newData = processViewerDeclaration(data);
-                            fs.writeFile(settings.build.dtsBundle.out.replace('.module', ''), newData);
+                            fs.writeFile(fileLocation.replace('.module', ''), newData);
                         });
                     });
                 }

+ 1 - 1
Tools/Gulp/package.json

@@ -62,7 +62,7 @@
         "webpack-stream": "^4.0.1"
     },
     "scripts": {
-        "install": "npm --prefix ../../Playground/ install ../../Playground/ && npm --prefix ../../tests/unit/ install ../../tests/unit/ && npm --prefix ../../Viewer/tests/ install ../../Viewer/tests/ && gulp deployLocalDev"
+        "install": "npm --prefix ../../Playground/ install ../../Playground/ && npm --prefix ../../tests/unit/ install ../../tests/unit/ && npm --prefix ../../Viewer/tests/ install ../../Viewer/tests/ && npm --prefix ../../Viewer/ install ../../Viewer/ && gulp deployLocalDev"
     },
     "dependencies": {
         "dts-bundle": "^0.7.3",

+ 15 - 0
Viewer/acorn

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/node_modules/acorn/bin/acorn" "$@"
+  ret=$?
+else 
+  node  "$basedir/node_modules/acorn/bin/acorn" "$@"
+  ret=$?
+fi
+exit $ret

+ 7 - 0
Viewer/acorn.cmd

@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+  "%~dp0\node.exe"  "%~dp0\node_modules\acorn\bin\acorn" %*
+) ELSE (
+  @SETLOCAL
+  @SET PATHEXT=%PATHEXT:;.JS;=;%
+  node  "%~dp0\node_modules\acorn\bin\acorn" %*
+)

+ 15 - 0
Viewer/ansi-html

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/node_modules/ansi-html/bin/ansi-html" "$@"
+  ret=$?
+else 
+  node  "$basedir/node_modules/ansi-html/bin/ansi-html" "$@"
+  ret=$?
+fi
+exit $ret

+ 7 - 0
Viewer/ansi-html.cmd

@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+  "%~dp0\node.exe"  "%~dp0\node_modules\ansi-html\bin\ansi-html" %*
+) ELSE (
+  @SETLOCAL
+  @SET PATHEXT=%PATHEXT:;.JS;=;%
+  node  "%~dp0\node_modules\ansi-html\bin\ansi-html" %*
+)

+ 0 - 97
Viewer/assets/deepmerge.min.js

@@ -1,97 +0,0 @@
-(function (global, factory) {
-	typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-	typeof define === 'function' && define.amd ? define(factory) :
-	(global.deepmerge = factory());
-}(this, (function () { 'use strict';
-
-var isMergeableObject = function isMergeableObject(value) {
-	return isNonNullObject(value)
-		&& !isSpecial(value)
-};
-
-function isNonNullObject(value) {
-	return !!value && typeof value === 'object'
-}
-
-function isSpecial(value) {
-	var stringValue = Object.prototype.toString.call(value);
-
-	return stringValue === '[object RegExp]'
-		|| stringValue === '[object Date]'
-		|| isReactElement(value)
-}
-
-// see https://github.com/facebook/react/blob/b5ac963fb791d1298e7f396236383bc955f916c1/src/isomorphic/classic/element/ReactElement.js#L21-L25
-var canUseSymbol = typeof Symbol === 'function' && Symbol.for;
-var REACT_ELEMENT_TYPE = canUseSymbol ? Symbol.for('react.element') : 0xeac7;
-
-function isReactElement(value) {
-	return value.$$typeof === REACT_ELEMENT_TYPE
-}
-
-function emptyTarget(val) {
-	return Array.isArray(val) ? [] : {}
-}
-
-function cloneUnlessOtherwiseSpecified(value, optionsArgument) {
-	var clone = !optionsArgument || optionsArgument.clone !== false;
-
-	return (clone && isMergeableObject(value))
-		? deepmerge(emptyTarget(value), value, optionsArgument)
-		: value
-}
-
-function defaultArrayMerge(target, source, optionsArgument) {
-	return target.concat(source).map(function(element) {
-		return cloneUnlessOtherwiseSpecified(element, optionsArgument)
-	})
-}
-
-function mergeObject(target, source, optionsArgument) {
-	var destination = {};
-	if (isMergeableObject(target)) {
-		Object.keys(target).forEach(function(key) {
-			destination[key] = cloneUnlessOtherwiseSpecified(target[key], optionsArgument);
-		});
-	}
-	Object.keys(source).forEach(function(key) {
-		if (!isMergeableObject(source[key]) || !target[key]) {
-			destination[key] = cloneUnlessOtherwiseSpecified(source[key], optionsArgument);
-		} else {
-			destination[key] = deepmerge(target[key], source[key], optionsArgument);
-		}
-	});
-	return destination
-}
-
-function deepmerge(target, source, optionsArgument) {
-	var sourceIsArray = Array.isArray(source);
-	var targetIsArray = Array.isArray(target);
-	var options = optionsArgument || { arrayMerge: defaultArrayMerge };
-	var sourceAndTargetTypesMatch = sourceIsArray === targetIsArray;
-
-	if (!sourceAndTargetTypesMatch) {
-		return cloneUnlessOtherwiseSpecified(source, optionsArgument)
-	} else if (sourceIsArray) {
-		var arrayMerge = options.arrayMerge || defaultArrayMerge;
-		return arrayMerge(target, source, optionsArgument)
-	} else {
-		return mergeObject(target, source, optionsArgument)
-	}
-}
-
-deepmerge.all = function deepmergeAll(array, optionsArgument) {
-	if (!Array.isArray(array)) {
-		throw new Error('first argument should be an array')
-	}
-
-	return array.reduce(function(prev, next) {
-		return deepmerge(prev, next, optionsArgument)
-	}, {})
-};
-
-var deepmerge_1 = deepmerge;
-
-return deepmerge_1;
-
-})));

ファイルの差分が大きいため隠しています
+ 0 - 1
Viewer/assets/es6-promise.min.js


ファイルの差分が大きいため隠しています
+ 0 - 29
Viewer/assets/handlebars.min.js


ファイルの差分が大きいため隠しています
+ 0 - 210
Viewer/assets/pep.min.js


+ 15 - 0
Viewer/atob

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/node_modules/atob/bin/atob.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/node_modules/atob/bin/atob.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 7 - 0
Viewer/atob.cmd

@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+  "%~dp0\node.exe"  "%~dp0\node_modules\atob\bin\atob.js" %*
+) ELSE (
+  @SETLOCAL
+  @SET PATHEXT=%PATHEXT:;.JS;=;%
+  node  "%~dp0\node_modules\atob\bin\atob.js" %*
+)

+ 15 - 0
Viewer/errno

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/node_modules/errno/cli.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/node_modules/errno/cli.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 7 - 0
Viewer/errno.cmd

@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+  "%~dp0\node.exe"  "%~dp0\node_modules\errno\cli.js" %*
+) ELSE (
+  @SETLOCAL
+  @SET PATHEXT=%PATHEXT:;.JS;=;%
+  node  "%~dp0\node_modules\errno\cli.js" %*
+)

+ 15 - 0
Viewer/esparse

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/node_modules/esprima/bin/esparse.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/node_modules/esprima/bin/esparse.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 7 - 0
Viewer/esparse.cmd

@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+  "%~dp0\node.exe"  "%~dp0\node_modules\esprima\bin\esparse.js" %*
+) ELSE (
+  @SETLOCAL
+  @SET PATHEXT=%PATHEXT:;.JS;=;%
+  node  "%~dp0\node_modules\esprima\bin\esparse.js" %*
+)

+ 15 - 0
Viewer/esvalidate

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/node_modules/esprima/bin/esvalidate.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/node_modules/esprima/bin/esvalidate.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 7 - 0
Viewer/esvalidate.cmd

@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+  "%~dp0\node.exe"  "%~dp0\node_modules\esprima\bin\esvalidate.js" %*
+) ELSE (
+  @SETLOCAL
+  @SET PATHEXT=%PATHEXT:;.JS;=;%
+  node  "%~dp0\node_modules\esprima\bin\esvalidate.js" %*
+)

+ 15 - 0
Viewer/handlebars

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/node_modules/handlebars/bin/handlebars" "$@"
+  ret=$?
+else 
+  node  "$basedir/node_modules/handlebars/bin/handlebars" "$@"
+  ret=$?
+fi
+exit $ret

+ 7 - 0
Viewer/handlebars.cmd

@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+  "%~dp0\node.exe"  "%~dp0\node_modules\handlebars\bin\handlebars" %*
+) ELSE (
+  @SETLOCAL
+  @SET PATHEXT=%PATHEXT:;.JS;=;%
+  node  "%~dp0\node_modules\handlebars\bin\handlebars" %*
+)

+ 15 - 0
Viewer/he

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/node_modules/he/bin/he" "$@"
+  ret=$?
+else 
+  node  "$basedir/node_modules/he/bin/he" "$@"
+  ret=$?
+fi
+exit $ret

+ 7 - 0
Viewer/he.cmd

@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+  "%~dp0\node.exe"  "%~dp0\node_modules\he\bin\he" %*
+) ELSE (
+  @SETLOCAL
+  @SET PATHEXT=%PATHEXT:;.JS;=;%
+  node  "%~dp0\node_modules\he\bin\he" %*
+)

+ 15 - 0
Viewer/html-minifier

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/node_modules/html-minifier/cli.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/node_modules/html-minifier/cli.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 7 - 0
Viewer/html-minifier.cmd

@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+  "%~dp0\node.exe"  "%~dp0\node_modules\html-minifier\cli.js" %*
+) ELSE (
+  @SETLOCAL
+  @SET PATHEXT=%PATHEXT:;.JS;=;%
+  node  "%~dp0\node_modules\html-minifier\cli.js" %*
+)

+ 15 - 0
Viewer/import-local-fixture

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/node_modules/import-local/fixtures/cli.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/node_modules/import-local/fixtures/cli.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 7 - 0
Viewer/import-local-fixture.cmd

@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+  "%~dp0\node.exe"  "%~dp0\node_modules\import-local\fixtures\cli.js" %*
+) ELSE (
+  @SETLOCAL
+  @SET PATHEXT=%PATHEXT:;.JS;=;%
+  node  "%~dp0\node_modules\import-local\fixtures\cli.js" %*
+)

+ 15 - 0
Viewer/internal-ip

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/node_modules/internal-ip/cli.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/node_modules/internal-ip/cli.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 7 - 0
Viewer/internal-ip.cmd

@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+  "%~dp0\node.exe"  "%~dp0\node_modules\internal-ip\cli.js" %*
+) ELSE (
+  @SETLOCAL
+  @SET PATHEXT=%PATHEXT:;.JS;=;%
+  node  "%~dp0\node_modules\internal-ip\cli.js" %*
+)

+ 15 - 0
Viewer/json5

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/node_modules/json5/lib/cli.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/node_modules/json5/lib/cli.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 7 - 0
Viewer/json5.cmd

@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+  "%~dp0\node.exe"  "%~dp0\node_modules\json5\lib\cli.js" %*
+) ELSE (
+  @SETLOCAL
+  @SET PATHEXT=%PATHEXT:;.JS;=;%
+  node  "%~dp0\node_modules\json5\lib\cli.js" %*
+)

+ 15 - 0
Viewer/miller-rabin

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/node_modules/miller-rabin/bin/miller-rabin" "$@"
+  ret=$?
+else 
+  node  "$basedir/node_modules/miller-rabin/bin/miller-rabin" "$@"
+  ret=$?
+fi
+exit $ret

+ 7 - 0
Viewer/miller-rabin.cmd

@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+  "%~dp0\node.exe"  "%~dp0\node_modules\miller-rabin\bin\miller-rabin" %*
+) ELSE (
+  @SETLOCAL
+  @SET PATHEXT=%PATHEXT:;.JS;=;%
+  node  "%~dp0\node_modules\miller-rabin\bin\miller-rabin" %*
+)

+ 15 - 0
Viewer/mime

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/node_modules/mime/cli.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/node_modules/mime/cli.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 7 - 0
Viewer/mime.cmd

@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+  "%~dp0\node.exe"  "%~dp0\node_modules\mime\cli.js" %*
+) ELSE (
+  @SETLOCAL
+  @SET PATHEXT=%PATHEXT:;.JS;=;%
+  node  "%~dp0\node_modules\mime\cli.js" %*
+)

+ 15 - 0
Viewer/mkdirp

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/node_modules/mkdirp/bin/cmd.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/node_modules/mkdirp/bin/cmd.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 7 - 0
Viewer/mkdirp.cmd

@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+  "%~dp0\node.exe"  "%~dp0\node_modules\mkdirp\bin\cmd.js" %*
+) ELSE (
+  @SETLOCAL
+  @SET PATHEXT=%PATHEXT:;.JS;=;%
+  node  "%~dp0\node_modules\mkdirp\bin\cmd.js" %*
+)

+ 15 - 0
Viewer/multicast-dns

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/node_modules/multicast-dns/cli.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/node_modules/multicast-dns/cli.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 7 - 0
Viewer/multicast-dns.cmd

@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+  "%~dp0\node.exe"  "%~dp0\node_modules\multicast-dns\cli.js" %*
+) ELSE (
+  @SETLOCAL
+  @SET PATHEXT=%PATHEXT:;.JS;=;%
+  node  "%~dp0\node_modules\multicast-dns\cli.js" %*
+)

+ 6 - 1
Viewer/package.json

@@ -23,9 +23,12 @@
     },
     "homepage": "https://github.com/BabylonJS/Babylon.js#readme",
     "devDependencies": {
+        "@types/handlebars": "^4.0.37",
         "@types/node": "^8.9.4",
         "base64-font-loader": "0.0.4",
         "base64-image-loader": "^1.2.1",
+        "deepmerge": "^2.1.1",
+        "handlebars": "^4.0.11",
         "html-loader": "^0.5.5",
         "json-loader": "^0.5.7",
         "ts-loader": "^2.3.7",
@@ -34,5 +37,7 @@
         "webpack": "^3.11.0",
         "webpack-dev-server": "^2.11.2"
     },
-    "dependencies": {}
+    "dependencies": {
+        "pepjs": "^0.4.3"
+    }
 }

+ 15 - 0
Viewer/rimraf

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/node_modules/rimraf/bin.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/node_modules/rimraf/bin.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 7 - 0
Viewer/rimraf.cmd

@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+  "%~dp0\node.exe"  "%~dp0\node_modules\rimraf\bin.js" %*
+) ELSE (
+  @SETLOCAL
+  @SET PATHEXT=%PATHEXT:;.JS;=;%
+  node  "%~dp0\node_modules\rimraf\bin.js" %*
+)

+ 15 - 0
Viewer/semver

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/node_modules/semver/bin/semver" "$@"
+  ret=$?
+else 
+  node  "$basedir/node_modules/semver/bin/semver" "$@"
+  ret=$?
+fi
+exit $ret

+ 7 - 0
Viewer/semver.cmd

@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+  "%~dp0\node.exe"  "%~dp0\node_modules\semver\bin\semver" %*
+) ELSE (
+  @SETLOCAL
+  @SET PATHEXT=%PATHEXT:;.JS;=;%
+  node  "%~dp0\node_modules\semver\bin\semver" %*
+)

+ 15 - 0
Viewer/sha.js

@@ -0,0 +1,15 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*) basedir=`cygpath -w "$basedir"`;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  "$basedir/node"  "$basedir/node_modules/sha.js/bin.js" "$@"
+  ret=$?
+else 
+  node  "$basedir/node_modules/sha.js/bin.js" "$@"
+  ret=$?
+fi
+exit $ret

+ 7 - 0
Viewer/sha.js.cmd

@@ -0,0 +1,7 @@
+@IF EXIST "%~dp0\node.exe" (
+  "%~dp0\node.exe"  "%~dp0\node_modules\sha.js\bin.js" %*
+) ELSE (
+  @SETLOCAL
+  @SET PATHEXT=%PATHEXT:;.JS;=;%
+  node  "%~dp0\node_modules\sha.js\bin.js" %*
+)

+ 1 - 0
Viewer/src/assets/font.ts

@@ -0,0 +1 @@
+export const babylonFont = require('../../assets/babylon.woff');

+ 5 - 0
Viewer/src/assets/img.ts

@@ -0,0 +1,5 @@
+export const babylonLogo = require('../../assets/img/BabylonJS_Logo_Small.png');
+export const close = require('../../assets/img/close.png');
+export const fullscreen = require('../../assets/img/fullscreen.png');
+export const helpCircle = require('../../assets/img/help-circle.png');
+export const loading = require('../../assets/img/loading.png');

+ 3 - 0
Viewer/src/assets/index.ts

@@ -0,0 +1,3 @@
+export * from './font';
+export * from './img';
+export * from './templates';

+ 9 - 0
Viewer/src/assets/templates.ts

@@ -0,0 +1,9 @@
+export const defaultTemplate = require('../../assets/templates/default/defaultTemplate.html');
+export const defaultViewer = require('../../assets/templates/default/defaultViewer.html');
+export const error = require('../../assets/templates/default/error.html');
+export const fillContainer = require('../../assets/templates/default/fillContainer.html');
+export const help = require('../../assets/templates/default/help.html');
+export const loadingScreen = require('../../assets/templates/default/loadingScreen.html');
+export const navbar = require('../../assets/templates/default/navbar.html');
+export const overlay = require('../../assets/templates/default/overlay.html');
+export const share = require('../../assets/templates/default/share.html');

+ 532 - 0
Viewer/src/configuration/configuration.d.ts

@@ -0,0 +1,532 @@
+import { ITemplateConfiguration } from './../templateManager';
+import { EngineOptions, IGlowLayerOptions, DepthOfFieldEffectBlurLevel } from 'babylonjs';
+export declare function getConfigurationKey(key: string, configObject: any): any;
+export interface ViewerConfiguration {
+    version?: string;
+    extends?: string;
+    pageUrl?: string;
+    configuration?: string | {
+        url?: string;
+        payload?: any;
+        mapper?: string;
+    };
+    observers?: IObserversConfiguration;
+    canvasElement?: string;
+    model?: IModelConfiguration | string;
+    scene?: ISceneConfiguration;
+    optimizer?: ISceneOptimizerConfiguration | boolean;
+    camera?: ICameraConfiguration;
+    skybox?: boolean | ISkyboxConfiguration;
+    ground?: boolean | IGroundConfiguration;
+    lights?: {
+        [name: string]: number | boolean | ILightConfiguration;
+    };
+    engine?: {
+        renderInBackground?: boolean;
+        antialiasing?: boolean;
+        disableResize?: boolean;
+        engineOptions?: EngineOptions;
+        adaptiveQuality?: boolean;
+    };
+    templates?: {
+        main: ITemplateConfiguration;
+        [key: string]: ITemplateConfiguration;
+    };
+    customShaders?: {
+        shaders?: {
+            [key: string]: string;
+        };
+        includes?: {
+            [key: string]: string;
+        };
+    };
+    loaderPlugins?: {
+        extendedMaterial?: boolean;
+        msftLod?: boolean;
+        telemetry?: boolean;
+        minecraft?: boolean;
+        [propName: string]: boolean | undefined;
+    };
+    lab?: {
+        flashlight?: boolean | {
+            exponent?: number;
+            angle?: number;
+            intensity?: number;
+            diffuse?: {
+                r: number;
+                g: number;
+                b: number;
+            };
+            specular?: {
+                r: number;
+                g: number;
+                b: number;
+            };
+        };
+        hideLoadingDelay?: number;
+        assetsRootURL?: string;
+        environmentMainColor?: {
+            r: number;
+            g: number;
+            b: number;
+        };
+        environmentMap?: {
+            /**
+             * Environment map texture path in relative to the asset folder.
+             */
+            texture: string;
+            /**
+             * Default rotation to apply to the environment map.
+             */
+            rotationY: number;
+            /**
+             * Tint level of the main color on the environment map.
+             */
+            tintLevel: number;
+        };
+        defaultRenderingPipelines?: boolean | IDefaultRenderingPipelineConfiguration;
+        globalLightRotation?: number;
+    };
+}
+/**
+ * Defines an animation to be applied to a model (translation, scale or rotation).
+ */
+export interface IModelAnimationConfiguration {
+    /**
+     * Time of animation, in seconds
+     */
+    time?: number;
+    /**
+     * Scale to apply
+     */
+    scaling?: {
+        x: number;
+        y: number;
+        z: number;
+    };
+    /**
+     * Easing function to apply
+     * See SPECTRE.EasingFunction
+     */
+    easingFunction?: number;
+    /**
+     * An Easing mode to apply to the easing function
+     * See BABYLON.EasingFunction
+     */
+    easingMode?: number;
+}
+export interface IDefaultRenderingPipelineConfiguration {
+    sharpenEnabled?: boolean;
+    bloomEnabled?: boolean;
+    bloomThreshold?: number;
+    depthOfFieldEnabled?: boolean;
+    depthOfFieldBlurLevel?: DepthOfFieldEffectBlurLevel;
+    fxaaEnabled?: boolean;
+    imageProcessingEnabled?: boolean;
+    defaultPipelineTextureType?: number;
+    bloomScale?: number;
+    chromaticAberrationEnabled?: boolean;
+    grainEnabled?: boolean;
+    bloomKernel?: number;
+    hardwareScaleLevel?: number;
+    bloomWeight?: number;
+    hdr?: boolean;
+    samples?: number;
+    glowLayerEnabled?: boolean;
+}
+export interface IModelConfiguration {
+    id?: string;
+    url?: string;
+    root?: string;
+    file?: string | File;
+    loader?: string;
+    position?: {
+        x: number;
+        y: number;
+        z: number;
+    };
+    rotation?: {
+        x: number;
+        y: number;
+        z: number;
+        w?: number;
+    };
+    scaling?: {
+        x: number;
+        y: number;
+        z: number;
+    };
+    parentObjectIndex?: number;
+    castShadow?: boolean;
+    receiveShadows?: boolean;
+    normalize?: boolean | {
+        center?: boolean;
+        unitSize?: boolean;
+        parentIndex?: number;
+    };
+    title?: string;
+    subtitle?: string;
+    thumbnail?: string;
+    animation?: {
+        autoStart?: boolean | string;
+        playOnce?: boolean;
+        autoStartIndex?: number;
+    };
+    entryAnimation?: IModelAnimationConfiguration;
+    exitAnimation?: IModelAnimationConfiguration;
+    material?: {
+        directEnabled?: boolean;
+        directIntensity?: number;
+        emissiveIntensity?: number;
+        environmentIntensity?: number;
+        [propName: string]: any;
+    };
+    /**
+     * Rotation offset axis definition
+     */
+    rotationOffsetAxis?: {
+        x: number;
+        y: number;
+        z: number;
+    };
+    /**
+     * the offset angle
+     */
+    rotationOffsetAngle?: number;
+    loaderConfiguration?: {
+        maxLODsToLoad?: number;
+        progressiveLoading?: boolean;
+    };
+}
+export interface ISkyboxConfiguration {
+    cubeTexture?: {
+        noMipMap?: boolean;
+        gammaSpace?: boolean;
+        url?: string | Array<string>;
+    };
+    color?: {
+        r: number;
+        g: number;
+        b: number;
+    };
+    pbr?: boolean;
+    scale?: number;
+    blur?: number;
+    material?: {
+        imageProcessingConfiguration?: IImageProcessingConfiguration;
+        [propName: string]: any;
+    };
+    infiniteDistance?: boolean;
+}
+export interface IGroundConfiguration {
+    size?: number;
+    receiveShadows?: boolean;
+    shadowLevel?: number;
+    shadowOnly?: boolean;
+    mirror?: boolean | {
+        sizeRatio?: number;
+        blurKernel?: number;
+        amount?: number;
+        fresnelWeight?: number;
+        fallOffDistance?: number;
+        textureType?: number;
+    };
+    texture?: string;
+    color?: {
+        r: number;
+        g: number;
+        b: number;
+    };
+    opacity?: number;
+    material?: {
+        [propName: string]: any;
+    };
+}
+export interface ISceneConfiguration {
+    debug?: boolean;
+    clearColor?: {
+        r: number;
+        g: number;
+        b: number;
+        a: number;
+    };
+    mainColor?: {
+        r?: number;
+        g?: number;
+        b?: number;
+    };
+    imageProcessingConfiguration?: IImageProcessingConfiguration;
+    environmentTexture?: string;
+    colorGrading?: IColorGradingConfiguration;
+    environmentRotationY?: number;
+    /**
+     * Deprecated, please use default rendering pipeline
+     */
+    glow?: boolean | IGlowLayerOptions;
+    disableHdr?: boolean;
+    renderInBackground?: boolean;
+    disableCameraControl?: boolean;
+    animationPropertiesOverride?: {
+        [propName: string]: any;
+    };
+    defaultMaterial?: {
+        materialType: "standard" | "pbr";
+        [propName: string]: any;
+    };
+    flags?: {
+        shadowsEnabled?: boolean;
+        particlesEnabled?: boolean;
+        collisionsEnabled?: boolean;
+        lightsEnabled?: boolean;
+        texturesEnabled?: boolean;
+        lensFlaresEnabled?: boolean;
+        proceduralTexturesEnabled?: boolean;
+        renderTargetsEnabled?: boolean;
+        spritesEnabled?: boolean;
+        skeletonsEnabled?: boolean;
+        audioEnabled?: boolean;
+    };
+}
+/**
+ * The Color Grading Configuration groups the different settings used to define the color grading used in the viewer.
+ */
+export interface IColorGradingConfiguration {
+    /**
+     * Transform data string, encoded as determined by transformDataFormat.
+     */
+    transformData: string;
+    /**
+     * The encoding format of TransformData (currently only raw-base16 is supported).
+     */
+    transformDataFormat: string;
+    /**
+     * The weight of the transform
+     */
+    transformWeight: number;
+    /**
+     * Color curve colorFilterHueGlobal value
+     */
+    colorFilterHueGlobal: number;
+    /**
+     * Color curve colorFilterHueShadows value
+     */
+    colorFilterHueShadows: number;
+    /**
+     * Color curve colorFilterHueMidtones value
+     */
+    colorFilterHueMidtones: number;
+    /**
+     * Color curve colorFilterHueHighlights value
+     */
+    colorFilterHueHighlights: number;
+    /**
+     * Color curve colorFilterDensityGlobal value
+     */
+    colorFilterDensityGlobal: number;
+    /**
+     * Color curve colorFilterDensityShadows value
+     */
+    colorFilterDensityShadows: number;
+    /**
+     * Color curve colorFilterDensityMidtones value
+     */
+    colorFilterDensityMidtones: number;
+    /**
+     * Color curve colorFilterDensityHighlights value
+     */
+    colorFilterDensityHighlights: number;
+    /**
+     * Color curve saturationGlobal value
+     */
+    saturationGlobal: number;
+    /**
+     * Color curve saturationShadows value
+     */
+    saturationShadows: number;
+    /**
+     * Color curve saturationMidtones value
+     */
+    saturationMidtones: number;
+    /**
+     * Color curve saturationHighlights value
+     */
+    saturationHighlights: number;
+    /**
+     * Color curve exposureGlobal value
+     */
+    exposureGlobal: number;
+    /**
+     * Color curve exposureShadows value
+     */
+    exposureShadows: number;
+    /**
+     * Color curve exposureMidtones value
+     */
+    exposureMidtones: number;
+    /**
+     * Color curve exposureHighlights value
+     */
+    exposureHighlights: number;
+}
+export interface ISceneOptimizerConfiguration {
+    targetFrameRate?: number;
+    trackerDuration?: number;
+    autoGeneratePriorities?: boolean;
+    improvementMode?: boolean;
+    degradation?: string;
+    types?: {
+        texture?: ISceneOptimizerParameters;
+        hardwareScaling?: ISceneOptimizerParameters;
+        shadow?: ISceneOptimizerParameters;
+        postProcess?: ISceneOptimizerParameters;
+        lensFlare?: ISceneOptimizerParameters;
+        particles?: ISceneOptimizerParameters;
+        renderTarget?: ISceneOptimizerParameters;
+        mergeMeshes?: ISceneOptimizerParameters;
+    };
+    custom?: string;
+}
+export interface IObserversConfiguration {
+    onEngineInit?: string;
+    onSceneInit?: string;
+    onModelLoaded?: string;
+}
+export interface ICameraConfiguration {
+    position?: {
+        x: number;
+        y: number;
+        z: number;
+    };
+    rotation?: {
+        x: number;
+        y: number;
+        z: number;
+        w: number;
+    };
+    fov?: number;
+    fovMode?: number;
+    minZ?: number;
+    maxZ?: number;
+    inertia?: number;
+    exposure?: number;
+    pinchPrecision?: number;
+    behaviors?: {
+        [name: string]: boolean | number | ICameraBehaviorConfiguration;
+    };
+    disableCameraControl?: boolean;
+    disableCtrlForPanning?: boolean;
+    disableAutoFocus?: boolean;
+    [propName: string]: any;
+}
+export interface ICameraBehaviorConfiguration {
+    type: number;
+    [propName: string]: any;
+}
+export interface ILightConfiguration {
+    type: number;
+    name?: string;
+    disabled?: boolean;
+    position?: {
+        x: number;
+        y: number;
+        z: number;
+    };
+    target?: {
+        x: number;
+        y: number;
+        z: number;
+    };
+    direction?: {
+        x: number;
+        y: number;
+        z: number;
+    };
+    diffuse?: {
+        r: number;
+        g: number;
+        b: number;
+    };
+    specular?: {
+        r: number;
+        g: number;
+        b: number;
+    };
+    intensity?: number;
+    intensityMode?: number;
+    radius?: number;
+    shadownEnabled?: boolean;
+    shadowConfig?: {
+        useBlurExponentialShadowMap?: boolean;
+        useBlurCloseExponentialShadowMap?: boolean;
+        useKernelBlur?: boolean;
+        blurKernel?: number;
+        blurScale?: number;
+        minZ?: number;
+        maxZ?: number;
+        frustumSize?: number;
+        angleScale?: number;
+        frustumEdgeFalloff?: number;
+        [propName: string]: any;
+    };
+    spotAngle?: number;
+    shadowFieldOfView?: number;
+    shadowBufferSize?: number;
+    shadowFrustumSize?: number;
+    shadowMinZ?: number;
+    shadowMaxZ?: number;
+    [propName: string]: any;
+    behaviors?: {
+        [name: string]: number | {
+            type: number;
+            [propName: string]: any;
+        };
+    };
+}
+export interface ISceneOptimizerParameters {
+    priority?: number;
+    maximumSize?: number;
+    step?: number;
+}
+export interface IImageProcessingConfiguration {
+    colorGradingEnabled?: boolean;
+    colorCurvesEnabled?: boolean;
+    colorCurves?: {
+        globalHue?: number;
+        globalDensity?: number;
+        globalSaturation?: number;
+        globalExposure?: number;
+        highlightsHue?: number;
+        highlightsDensity?: number;
+        highlightsSaturation?: number;
+        highlightsExposure?: number;
+        midtonesHue?: number;
+        midtonesDensity?: number;
+        midtonesSaturation?: number;
+        midtonesExposure?: number;
+        shadowsHue?: number;
+        shadowsDensity?: number;
+        shadowsSaturation?: number;
+        shadowsExposure?: number;
+    };
+    colorGradingWithGreenDepth?: boolean;
+    colorGradingBGR?: boolean;
+    exposure?: number;
+    toneMappingEnabled?: boolean;
+    contrast?: number;
+    vignetteEnabled?: boolean;
+    vignetteStretch?: number;
+    vignetteCentreX?: number;
+    vignetteCentreY?: number;
+    vignetteWeight?: number;
+    vignetteColor?: {
+        r: number;
+        g: number;
+        b: number;
+        a?: number;
+    };
+    vignetteCameraFov?: number;
+    vignetteBlendMode?: number;
+    vignetteM?: boolean;
+    applyByPostProcess?: boolean;
+    isEnabled?: boolean;
+}

+ 1 - 431
Viewer/src/configuration/configuration.ts

@@ -1,5 +1,5 @@
-import { ITemplateConfiguration } from './../templateManager';
 import { EngineOptions, IGlowLayerOptions, DepthOfFieldEffectBlurLevel } from 'babylonjs';
+import { IObserversConfiguration, IModelConfiguration, ISceneConfiguration, ISceneOptimizerConfiguration, ICameraConfiguration, ISkyboxConfiguration, IGroundConfiguration, ILightConfiguration, IDefaultRenderingPipelineConfiguration, ITemplateConfiguration } from './interfaces';
 
 export function getConfigurationKey(key: string, configObject: any) {
     let splits = key.split('.');
@@ -112,434 +112,4 @@ export interface ViewerConfiguration {
         defaultRenderingPipelines?: boolean | IDefaultRenderingPipelineConfiguration;
         globalLightRotation?: number;
     }
-}
-
-/**
- * Defines an animation to be applied to a model (translation, scale or rotation).
- */
-export interface IModelAnimationConfiguration {
-    /**
-     * Time of animation, in seconds
-     */
-    time?: number;
-
-    /**
-     * Scale to apply
-     */
-    scaling?: {
-        x: number;
-        y: number;
-        z: number;
-    };
-
-    /**
-     * Easing function to apply
-     * See SPECTRE.EasingFunction
-     */
-    easingFunction?: number;
-
-    /**
-     * An Easing mode to apply to the easing function
-     * See BABYLON.EasingFunction
-     */
-    easingMode?: number;
-}
-
-
-export interface IDefaultRenderingPipelineConfiguration {
-    sharpenEnabled?: boolean;
-    bloomEnabled?: boolean;
-    bloomThreshold?: number;
-    depthOfFieldEnabled?: boolean;
-    depthOfFieldBlurLevel?: DepthOfFieldEffectBlurLevel;
-    fxaaEnabled?: boolean;
-    imageProcessingEnabled?: boolean;
-    defaultPipelineTextureType?: number;
-    bloomScale?: number;
-    chromaticAberrationEnabled?: boolean;
-    grainEnabled?: boolean;
-    bloomKernel?: number;
-    hardwareScaleLevel?: number;
-    bloomWeight?: number;
-    hdr?: boolean;
-    samples?: number;
-    glowLayerEnabled?: boolean;
-}
-
-export interface IModelConfiguration {
-    id?: string;
-    url?: string;
-    root?: string; //optional
-    file?: string | File; // is a file being loaded? root and url ignored
-    loader?: string; // obj, gltf?
-    position?: { x: number, y: number, z: number };
-    rotation?: { x: number, y: number, z: number, w?: number };
-    scaling?: { x: number, y: number, z: number };
-    parentObjectIndex?: number; // the index of the parent object of the model in the loaded meshes array.
-
-    castShadow?: boolean;
-    receiveShadows?: boolean;
-    normalize?: boolean | {
-        center?: boolean;
-        unitSize?: boolean;
-        parentIndex?: number;
-    }; // should the model be scaled to unit-size
-
-    title?: string;
-    subtitle?: string;
-    thumbnail?: string; // URL or data-url
-
-    animation?: {
-        autoStart?: boolean | string;
-        playOnce?: boolean;
-        autoStartIndex?: number;
-    }
-
-    entryAnimation?: IModelAnimationConfiguration;
-    exitAnimation?: IModelAnimationConfiguration;
-
-    material?: {
-        directEnabled?: boolean;
-        directIntensity?: number;
-        emissiveIntensity?: number;
-        environmentIntensity?: number;
-        [propName: string]: any;
-    }
-
-    /** 
-     * Rotation offset axis definition
-     */
-    rotationOffsetAxis?: {
-        x: number;
-        y: number;
-        z: number;
-    };
-
-    /**
-     * the offset angle
-     */
-    rotationOffsetAngle?: number;
-
-    loaderConfiguration?: {
-        maxLODsToLoad?: number;
-        progressiveLoading?: boolean;
-    }
-
-    // [propName: string]: any; // further configuration, like title and creator
-}
-
-export interface ISkyboxConfiguration {
-    cubeTexture?: {
-        noMipMap?: boolean;
-        gammaSpace?: boolean;
-        url?: string | Array<string>;
-    };
-    color?: { r: number, g: number, b: number };
-    pbr?: boolean; // deprecated
-    scale?: number;
-    blur?: number; // deprecated
-    material?: {
-        imageProcessingConfiguration?: IImageProcessingConfiguration;
-        [propName: string]: any;
-    };
-    infiniteDistance?: boolean;
-
-}
-
-export interface IGroundConfiguration {
-    size?: number;
-    receiveShadows?: boolean;
-    shadowLevel?: number;
-    shadowOnly?: boolean; // deprecated
-    mirror?: boolean | {
-        sizeRatio?: number;
-        blurKernel?: number;
-        amount?: number;
-        fresnelWeight?: number;
-        fallOffDistance?: number;
-        textureType?: number;
-    };
-    texture?: string;
-    color?: { r: number, g: number, b: number };
-    opacity?: number;
-    material?: {
-        [propName: string]: any;
-    };
-}
-
-export interface ISceneConfiguration {
-    debug?: boolean;
-    clearColor?: { r: number, g: number, b: number, a: number };
-    mainColor?: { r?: number, g?: number, b?: number };
-    imageProcessingConfiguration?: IImageProcessingConfiguration;
-    environmentTexture?: string;
-    colorGrading?: IColorGradingConfiguration;
-    environmentRotationY?: number;
-    /**
-     * Deprecated, please use default rendering pipeline
-     */
-    glow?: boolean | IGlowLayerOptions;
-    disableHdr?: boolean;
-    renderInBackground?: boolean;
-    disableCameraControl?: boolean;
-    animationPropertiesOverride?: {
-        [propName: string]: any;
-    };
-    defaultMaterial?: {
-        materialType: "standard" | "pbr";
-        [propName: string]: any;
-    };
-    flags?: {
-        shadowsEnabled?: boolean;
-        particlesEnabled?: boolean;
-        collisionsEnabled?: boolean;
-        lightsEnabled?: boolean;
-        texturesEnabled?: boolean;
-        lensFlaresEnabled?: boolean;
-        proceduralTexturesEnabled?: boolean;
-        renderTargetsEnabled?: boolean;
-        spritesEnabled?: boolean;
-        skeletonsEnabled?: boolean;
-        audioEnabled?: boolean;
-    }
-}
-
-/**
- * The Color Grading Configuration groups the different settings used to define the color grading used in the viewer.
- */
-export interface IColorGradingConfiguration {
-
-    /**
-     * Transform data string, encoded as determined by transformDataFormat.
-     */
-    transformData: string;
-
-    /**
-     * The encoding format of TransformData (currently only raw-base16 is supported).
-     */
-    transformDataFormat: string;
-
-    /**
-     * The weight of the transform
-     */
-    transformWeight: number;
-
-    /**
-     * Color curve colorFilterHueGlobal value
-     */
-    colorFilterHueGlobal: number;
-
-    /**
-     * Color curve colorFilterHueShadows value
-     */
-    colorFilterHueShadows: number;
-
-    /**
-     * Color curve colorFilterHueMidtones value
-     */
-    colorFilterHueMidtones: number;
-
-    /**
-     * Color curve colorFilterHueHighlights value
-     */
-    colorFilterHueHighlights: number;
-
-    /**
-     * Color curve colorFilterDensityGlobal value
-     */
-    colorFilterDensityGlobal: number;
-
-    /**
-     * Color curve colorFilterDensityShadows value
-     */
-    colorFilterDensityShadows: number;
-
-    /**
-     * Color curve colorFilterDensityMidtones value
-     */
-    colorFilterDensityMidtones: number;
-
-    /**
-     * Color curve colorFilterDensityHighlights value
-     */
-    colorFilterDensityHighlights: number;
-
-    /**
-     * Color curve saturationGlobal value
-     */
-    saturationGlobal: number;
-
-    /**
-     * Color curve saturationShadows value
-     */
-    saturationShadows: number;
-
-    /**
-     * Color curve saturationMidtones value
-     */
-    saturationMidtones: number;
-
-    /**
-     * Color curve saturationHighlights value
-     */
-    saturationHighlights: number;
-
-    /**
-     * Color curve exposureGlobal value
-     */
-    exposureGlobal: number;
-
-    /**
-     * Color curve exposureShadows value
-     */
-    exposureShadows: number;
-
-    /**
-     * Color curve exposureMidtones value
-     */
-    exposureMidtones: number;
-
-    /**
-     * Color curve exposureHighlights value
-     */
-    exposureHighlights: number;
-
-}
-
-export interface ISceneOptimizerConfiguration {
-    targetFrameRate?: number;
-    trackerDuration?: number;
-    autoGeneratePriorities?: boolean;
-    improvementMode?: boolean;
-    degradation?: string; // low, moderate, high
-    types?: {
-        texture?: ISceneOptimizerParameters;
-        hardwareScaling?: ISceneOptimizerParameters;
-        shadow?: ISceneOptimizerParameters;
-        postProcess?: ISceneOptimizerParameters;
-        lensFlare?: ISceneOptimizerParameters;
-        particles?: ISceneOptimizerParameters;
-        renderTarget?: ISceneOptimizerParameters;
-        mergeMeshes?: ISceneOptimizerParameters;
-    }
-    custom?: string;
-}
-
-export interface IObserversConfiguration {
-    onEngineInit?: string;
-    onSceneInit?: string;
-    onModelLoaded?: string;
-}
-
-export interface ICameraConfiguration {
-    position?: { x: number, y: number, z: number };
-    rotation?: { x: number, y: number, z: number, w: number };
-    fov?: number;
-    fovMode?: number;
-    minZ?: number;
-    maxZ?: number;
-    inertia?: number;
-    exposure?: number;
-    pinchPrecision?: number;
-    behaviors?: {
-        [name: string]: boolean | number | ICameraBehaviorConfiguration;
-    };
-    disableCameraControl?: boolean;
-    disableCtrlForPanning?: boolean;
-    disableAutoFocus?: boolean;
-
-    [propName: string]: any;
-}
-
-export interface ICameraBehaviorConfiguration {
-    type: number;
-    [propName: string]: any;
-}
-
-export interface ILightConfiguration {
-    type: number;
-    name?: string;
-    disabled?: boolean;
-    position?: { x: number, y: number, z: number };
-    target?: { x: number, y: number, z: number };
-    direction?: { x: number, y: number, z: number };
-    diffuse?: { r: number, g: number, b: number };
-    specular?: { r: number, g: number, b: number };
-    intensity?: number;
-    intensityMode?: number;
-    radius?: number;
-    shadownEnabled?: boolean; // only on specific lights!
-    shadowConfig?: {
-        useBlurExponentialShadowMap?: boolean;
-        useBlurCloseExponentialShadowMap?: boolean;
-        useKernelBlur?: boolean;
-        blurKernel?: number;
-        blurScale?: number;
-        minZ?: number;
-        maxZ?: number;
-        frustumSize?: number;
-        angleScale?: number;
-        frustumEdgeFalloff?: number;
-        [propName: string]: any;
-    };
-    spotAngle?: number;
-    shadowFieldOfView?: number;
-    shadowBufferSize?: number;
-    shadowFrustumSize?: number;
-    shadowMinZ?: number;
-    shadowMaxZ?: number;
-    [propName: string]: any;
-
-    // no behaviors for light at the moment, but allowing configuration for future reference.
-    behaviors?: {
-        [name: string]: number | {
-            type: number;
-            [propName: string]: any;
-        };
-    };
-}
-
-export interface ISceneOptimizerParameters {
-    priority?: number;
-    maximumSize?: number;
-    step?: number;
-}
-
-export interface IImageProcessingConfiguration {
-    colorGradingEnabled?: boolean;
-    colorCurvesEnabled?: boolean;
-    colorCurves?: {
-        globalHue?: number;
-        globalDensity?: number;
-        globalSaturation?: number;
-        globalExposure?: number;
-        highlightsHue?: number;
-        highlightsDensity?: number;
-        highlightsSaturation?: number;
-        highlightsExposure?: number;
-        midtonesHue?: number;
-        midtonesDensity?: number;
-        midtonesSaturation?: number;
-        midtonesExposure?: number;
-        shadowsHue?: number;
-        shadowsDensity?: number;
-        shadowsSaturation?: number;
-        shadowsExposure?: number;
-    };
-    colorGradingWithGreenDepth?: boolean;
-    colorGradingBGR?: boolean;
-    exposure?: number;
-    toneMappingEnabled?: boolean;
-    contrast?: number;
-    vignetteEnabled?: boolean;
-    vignetteStretch?: number;
-    vignetteCentreX?: number;
-    vignetteCentreY?: number;
-    vignetteWeight?: number;
-    vignetteColor?: { r: number, g: number, b: number, a?: number };
-    vignetteCameraFov?: number;
-    vignetteBlendMode?: number;
-    vignetteM?: boolean;
-    applyByPostProcess?: boolean;
-    isEnabled?: boolean;
 }

+ 8 - 0
Viewer/src/configuration/configurationCompatibility.d.ts

@@ -0,0 +1,8 @@
+import { ViewerConfiguration } from './';
+/**
+ * This function will make sure the configuration file is taking deprecated fields into account
+ * and is setting them to the correct keys and values.
+ *
+ * @param configuration The configuration to process. Mutable!
+ */
+export declare function processConfigurationCompatibility(configuration: ViewerConfiguration): void;

+ 1 - 1
Viewer/src/configuration/configurationCompatibility.ts

@@ -1,4 +1,4 @@
-import { ViewerConfiguration, getConfigurationKey } from './'
+import { ViewerConfiguration, getConfigurationKey } from './configuration'
 /**
  * This function will make sure the configuration file is taking deprecated fields into account
  * and is setting them to the correct keys and values.

+ 12 - 0
Viewer/src/configuration/configurationContainer.ts

@@ -0,0 +1,12 @@
+import { ViewerConfiguration } from './configuration';
+import { Color3 } from 'babylonjs';
+
+export class ConfigurationContainer {
+
+    public configuration: ViewerConfiguration;
+
+    public viewerId: string;
+
+    public mainColor: Color3 = Color3.White();
+    public reflectionColor: Color3 = Color3.White();
+}

+ 5 - 0
Viewer/src/configuration/globals.d.ts

@@ -0,0 +1,5 @@
+export declare class ViewerGlobals {
+    disableInit: boolean;
+    disableWebGL2Support: boolean;
+}
+export declare let viewerGlobals: ViewerGlobals;

+ 6 - 0
Viewer/src/configuration/globals.ts

@@ -1,8 +1,14 @@
+import { Engine } from "babylonjs";
+
 export class ViewerGlobals {
 
     public disableInit: boolean = false;
     public disableWebGL2Support: boolean = false;
 
+    public get version(): string {
+        return Engine.Version;
+    }
+
 }
 
 export let viewerGlobals: ViewerGlobals = new ViewerGlobals();

+ 1 - 0
Viewer/src/configuration/index.d.ts

@@ -0,0 +1 @@
+export * from './configuration';

+ 2 - 1
Viewer/src/configuration/index.ts

@@ -1 +1,2 @@
-export * from './configuration';
+export * from './configuration';
+export * from './interfaces';

+ 24 - 0
Viewer/src/configuration/interfaces/cameraConfiguration.ts

@@ -0,0 +1,24 @@
+export interface ICameraConfiguration {
+    position?: { x: number, y: number, z: number };
+    rotation?: { x: number, y: number, z: number, w: number };
+    fov?: number;
+    fovMode?: number;
+    minZ?: number;
+    maxZ?: number;
+    inertia?: number;
+    exposure?: number;
+    pinchPrecision?: number;
+    behaviors?: {
+        [name: string]: boolean | number | ICameraBehaviorConfiguration;
+    };
+    disableCameraControl?: boolean;
+    disableCtrlForPanning?: boolean;
+    disableAutoFocus?: boolean;
+
+    [propName: string]: any;
+}
+
+export interface ICameraBehaviorConfiguration {
+    type: number;
+    [propName: string]: any;
+}

+ 101 - 0
Viewer/src/configuration/interfaces/colorGradingConfiguration.ts

@@ -0,0 +1,101 @@
+/**
+ * The Color Grading Configuration groups the different settings used to define the color grading used in the viewer.
+ */
+export interface IColorGradingConfiguration {
+
+    /**
+     * Transform data string, encoded as determined by transformDataFormat.
+     */
+    transformData: string;
+
+    /**
+     * The encoding format of TransformData (currently only raw-base16 is supported).
+     */
+    transformDataFormat: string;
+
+    /**
+     * The weight of the transform
+     */
+    transformWeight: number;
+
+    /**
+     * Color curve colorFilterHueGlobal value
+     */
+    colorFilterHueGlobal: number;
+
+    /**
+     * Color curve colorFilterHueShadows value
+     */
+    colorFilterHueShadows: number;
+
+    /**
+     * Color curve colorFilterHueMidtones value
+     */
+    colorFilterHueMidtones: number;
+
+    /**
+     * Color curve colorFilterHueHighlights value
+     */
+    colorFilterHueHighlights: number;
+
+    /**
+     * Color curve colorFilterDensityGlobal value
+     */
+    colorFilterDensityGlobal: number;
+
+    /**
+     * Color curve colorFilterDensityShadows value
+     */
+    colorFilterDensityShadows: number;
+
+    /**
+     * Color curve colorFilterDensityMidtones value
+     */
+    colorFilterDensityMidtones: number;
+
+    /**
+     * Color curve colorFilterDensityHighlights value
+     */
+    colorFilterDensityHighlights: number;
+
+    /**
+     * Color curve saturationGlobal value
+     */
+    saturationGlobal: number;
+
+    /**
+     * Color curve saturationShadows value
+     */
+    saturationShadows: number;
+
+    /**
+     * Color curve saturationMidtones value
+     */
+    saturationMidtones: number;
+
+    /**
+     * Color curve saturationHighlights value
+     */
+    saturationHighlights: number;
+
+    /**
+     * Color curve exposureGlobal value
+     */
+    exposureGlobal: number;
+
+    /**
+     * Color curve exposureShadows value
+     */
+    exposureShadows: number;
+
+    /**
+     * Color curve exposureMidtones value
+     */
+    exposureMidtones: number;
+
+    /**
+     * Color curve exposureHighlights value
+     */
+    exposureHighlights: number;
+
+}

+ 21 - 0
Viewer/src/configuration/interfaces/defaultRenderingPipelineConfiguration.ts

@@ -0,0 +1,21 @@
+import { DepthOfFieldEffectBlurLevel } from 'babylonjs';
+
+export interface IDefaultRenderingPipelineConfiguration {
+    sharpenEnabled?: boolean;
+    bloomEnabled?: boolean;
+    bloomThreshold?: number;
+    depthOfFieldEnabled?: boolean;
+    depthOfFieldBlurLevel?: DepthOfFieldEffectBlurLevel;
+    fxaaEnabled?: boolean;
+    imageProcessingEnabled?: boolean;
+    defaultPipelineTextureType?: number;
+    bloomScale?: number;
+    chromaticAberrationEnabled?: boolean;
+    grainEnabled?: boolean;
+    bloomKernel?: number;
+    hardwareScaleLevel?: number;
+    bloomWeight?: number;
+    hdr?: boolean;
+    samples?: number;
+    glowLayerEnabled?: boolean;
+}

+ 20 - 0
Viewer/src/configuration/interfaces/groundConfiguration.ts

@@ -0,0 +1,20 @@
+export interface IGroundConfiguration {
+    size?: number;
+    receiveShadows?: boolean;
+    shadowLevel?: number;
+    shadowOnly?: boolean; // deprecated
+    mirror?: boolean | {
+        sizeRatio?: number;
+        blurKernel?: number;
+        amount?: number;
+        fresnelWeight?: number;
+        fallOffDistance?: number;
+        textureType?: number;
+    };
+    texture?: string;
+    color?: { r: number, g: number, b: number };
+    opacity?: number;
+    material?: {
+        [propName: string]: any;
+    };
+}

+ 38 - 0
Viewer/src/configuration/interfaces/imageProcessingConfiguration.ts

@@ -0,0 +1,38 @@
+export interface IImageProcessingConfiguration {
+    colorGradingEnabled?: boolean;
+    colorCurvesEnabled?: boolean;
+    colorCurves?: {
+        globalHue?: number;
+        globalDensity?: number;
+        globalSaturation?: number;
+        globalExposure?: number;
+        highlightsHue?: number;
+        highlightsDensity?: number;
+        highlightsSaturation?: number;
+        highlightsExposure?: number;
+        midtonesHue?: number;
+        midtonesDensity?: number;
+        midtonesSaturation?: number;
+        midtonesExposure?: number;
+        shadowsHue?: number;
+        shadowsDensity?: number;
+        shadowsSaturation?: number;
+        shadowsExposure?: number;
+    };
+    colorGradingWithGreenDepth?: boolean;
+    colorGradingBGR?: boolean;
+    exposure?: number;
+    toneMappingEnabled?: boolean;
+    contrast?: number;
+    vignetteEnabled?: boolean;
+    vignetteStretch?: number;
+    vignetteCentreX?: number;
+    vignetteCentreY?: number;
+    vignetteWeight?: number;
+    vignetteColor?: { r: number, g: number, b: number, a?: number };
+    vignetteCameraFov?: number;
+    vignetteBlendMode?: number;
+    vignetteM?: boolean;
+    applyByPostProcess?: boolean;
+    isEnabled?: boolean;
+}

+ 13 - 0
Viewer/src/configuration/interfaces/index.ts

@@ -0,0 +1,13 @@
+export * from './cameraConfiguration';
+export * from './colorGradingConfiguration';
+export * from './defaultRenderingPipelineConfiguration';
+export * from './groundConfiguration';
+export * from './imageProcessingConfiguration';
+export * from './lightConfiguration';
+export * from './modelAnimationConfiguration';
+export * from './modelConfiguration';
+export * from './observersConfiguration';
+export * from './sceneConfiguration';
+export * from './sceneOptimizerConfiguration';
+export * from './skyboxConfiguration';
+export * from './templateConfiguration';

+ 42 - 0
Viewer/src/configuration/interfaces/lightConfiguration.ts

@@ -0,0 +1,42 @@
+export interface ILightConfiguration {
+    type: number;
+    name?: string;
+    disabled?: boolean;
+    position?: { x: number, y: number, z: number };
+    target?: { x: number, y: number, z: number };
+    direction?: { x: number, y: number, z: number };
+    diffuse?: { r: number, g: number, b: number };
+    specular?: { r: number, g: number, b: number };
+    intensity?: number;
+    intensityMode?: number;
+    radius?: number;
+    shadownEnabled?: boolean; // only on specific lights!
+    shadowConfig?: {
+        useBlurExponentialShadowMap?: boolean;
+        useBlurCloseExponentialShadowMap?: boolean;
+        useKernelBlur?: boolean;
+        blurKernel?: number;
+        blurScale?: number;
+        minZ?: number;
+        maxZ?: number;
+        frustumSize?: number;
+        angleScale?: number;
+        frustumEdgeFalloff?: number;
+        [propName: string]: any;
+    };
+    spotAngle?: number;
+    shadowFieldOfView?: number;
+    shadowBufferSize?: number;
+    shadowFrustumSize?: number;
+    shadowMinZ?: number;
+    shadowMaxZ?: number;
+    [propName: string]: any;
+
+    // no behaviors for light at the moment, but allowing configuration for future reference.
+    behaviors?: {
+        [name: string]: number | {
+            type: number;
+            [propName: string]: any;
+        };
+    };
+}

+ 29 - 0
Viewer/src/configuration/interfaces/modelAnimationConfiguration.ts

@@ -0,0 +1,29 @@
+/**
+ * Defines an animation to be applied to a model (translation, scale or rotation).
+ */
+export interface IModelAnimationConfiguration {
+    /**
+     * Time of animation, in seconds
+     */
+    time?: number;
+
+    /**
+     * Scale to apply
+     */
+    scaling?: {
+        x: number;
+        y: number;
+        z: number;
+    };
+
+    /**
+     * Easing function to apply
+     */
+    easingFunction?: number;
+
+    /**
+     * An Easing mode to apply to the easing function
+     * See BABYLON.EasingFunction
+     */
+    easingMode?: number;
+}

+ 63 - 0
Viewer/src/configuration/interfaces/modelConfiguration.ts

@@ -0,0 +1,63 @@
+import { IModelAnimationConfiguration } from "./modelAnimationConfiguration";
+
+export interface IModelConfiguration {
+    id?: string;
+    url?: string;
+    root?: string; //optional
+    file?: string | File; // is a file being loaded? root and url ignored
+    loader?: string; // obj, gltf?
+    position?: { x: number, y: number, z: number };
+    rotation?: { x: number, y: number, z: number, w?: number };
+    scaling?: { x: number, y: number, z: number };
+    parentObjectIndex?: number; // the index of the parent object of the model in the loaded meshes array.
+
+    castShadow?: boolean;
+    receiveShadows?: boolean;
+    normalize?: boolean | {
+        center?: boolean;
+        unitSize?: boolean;
+        parentIndex?: number;
+    }; // should the model be scaled to unit-size
+
+    title?: string;
+    subtitle?: string;
+    thumbnail?: string; // URL or data-url
+
+    animation?: {
+        autoStart?: boolean | string;
+        playOnce?: boolean;
+        autoStartIndex?: number;
+    }
+
+    entryAnimation?: IModelAnimationConfiguration;
+    exitAnimation?: IModelAnimationConfiguration;
+
+    material?: {
+        directEnabled?: boolean;
+        directIntensity?: number;
+        emissiveIntensity?: number;
+        environmentIntensity?: number;
+        [propName: string]: any;
+    }
+
+    /** 
+     * Rotation offset axis definition
+     */
+    rotationOffsetAxis?: {
+        x: number;
+        y: number;
+        z: number;
+    };
+
+    /**
+     * the offset angle
+     */
+    rotationOffsetAngle?: number;
+
+    loaderConfiguration?: {
+        maxLODsToLoad?: number;
+        progressiveLoading?: boolean;
+    }
+
+    // [propName: string]: any; // further configuration, like title and creator
+}

+ 5 - 0
Viewer/src/configuration/interfaces/observersConfiguration.ts

@@ -0,0 +1,5 @@
+export interface IObserversConfiguration {
+    onEngineInit?: string;
+    onSceneInit?: string;
+    onModelLoaded?: string;
+}

+ 40 - 0
Viewer/src/configuration/interfaces/sceneConfiguration.ts

@@ -0,0 +1,40 @@
+import { IImageProcessingConfiguration } from "./imageProcessingConfiguration";
+import { IColorGradingConfiguration } from "./colorGradingConfiguration";
+import { IGlowLayerOptions } from "babylonjs";
+
+export interface ISceneConfiguration {
+    debug?: boolean;
+    clearColor?: { r: number, g: number, b: number, a: number };
+    mainColor?: { r?: number, g?: number, b?: number };
+    imageProcessingConfiguration?: IImageProcessingConfiguration;
+    environmentTexture?: string;
+    colorGrading?: IColorGradingConfiguration;
+    environmentRotationY?: number;
+    /**
+     * Deprecated, please use default rendering pipeline
+     */
+    glow?: boolean | IGlowLayerOptions;
+    disableHdr?: boolean;
+    renderInBackground?: boolean;
+    disableCameraControl?: boolean;
+    animationPropertiesOverride?: {
+        [propName: string]: any;
+    };
+    defaultMaterial?: {
+        materialType: "standard" | "pbr";
+        [propName: string]: any;
+    };
+    flags?: {
+        shadowsEnabled?: boolean;
+        particlesEnabled?: boolean;
+        collisionsEnabled?: boolean;
+        lightsEnabled?: boolean;
+        texturesEnabled?: boolean;
+        lensFlaresEnabled?: boolean;
+        proceduralTexturesEnabled?: boolean;
+        renderTargetsEnabled?: boolean;
+        spritesEnabled?: boolean;
+        skeletonsEnabled?: boolean;
+        audioEnabled?: boolean;
+    }
+}

+ 24 - 0
Viewer/src/configuration/interfaces/sceneOptimizerConfiguration.ts

@@ -0,0 +1,24 @@
+export interface ISceneOptimizerConfiguration {
+    targetFrameRate?: number;
+    trackerDuration?: number;
+    autoGeneratePriorities?: boolean;
+    improvementMode?: boolean;
+    degradation?: string; // low, moderate, high
+    types?: {
+        texture?: ISceneOptimizerParameters;
+        hardwareScaling?: ISceneOptimizerParameters;
+        shadow?: ISceneOptimizerParameters;
+        postProcess?: ISceneOptimizerParameters;
+        lensFlare?: ISceneOptimizerParameters;
+        particles?: ISceneOptimizerParameters;
+        renderTarget?: ISceneOptimizerParameters;
+        mergeMeshes?: ISceneOptimizerParameters;
+    }
+    custom?: string;
+}
+
+export interface ISceneOptimizerParameters {
+    priority?: number;
+    maximumSize?: number;
+    step?: number;
+}

+ 19 - 0
Viewer/src/configuration/interfaces/skyboxConfiguration.ts

@@ -0,0 +1,19 @@
+import { IImageProcessingConfiguration } from "./imageProcessingConfiguration";
+
+export interface ISkyboxConfiguration {
+    cubeTexture?: {
+        noMipMap?: boolean;
+        gammaSpace?: boolean;
+        url?: string | Array<string>;
+    };
+    color?: { r: number, g: number, b: number };
+    pbr?: boolean; // deprecated
+    scale?: number;
+    blur?: number; // deprecated
+    material?: {
+        imageProcessingConfiguration?: IImageProcessingConfiguration;
+        [propName: string]: any;
+    };
+    infiniteDistance?: boolean;
+
+}

+ 46 - 0
Viewer/src/configuration/interfaces/templateConfiguration.ts

@@ -0,0 +1,46 @@
+/**
+ * A single template configuration object
+ */
+export interface ITemplateConfiguration {
+    /**
+     * can be either the id of the template's html element or a URL.
+     * See - http://doc.babylonjs.com/extensions/the_templating_system#location-vs-html
+     */
+    location?: string; // #template-id OR http://example.com/loading.html
+    /**
+     * If no location is provided you can provide here the raw html of this template.
+     * See http://doc.babylonjs.com/extensions/the_templating_system#location-vs-html
+     */
+    html?: string; // raw html string
+    id?: string;
+    /**
+     * Parameters that will be delivered to the template and will render it accordingly.
+     */
+    params?: { [key: string]: string | number | boolean | object };
+    /**
+     * Events to attach to this template.
+     * event name is the key. the value can either be a boolean (attach to the parent element)
+     * or a map of html id elements.
+     * 
+     * See - http://doc.babylonjs.com/extensions/the_templating_system#event-binding
+     */
+    events?: {
+        // pointer events
+        pointerdown?: boolean | { [id: string]: boolean; };
+        pointerup?: boolean | { [id: string]: boolean; };
+        pointermove?: boolean | { [id: string]: boolean; };
+        pointerover?: boolean | { [id: string]: boolean; };
+        pointerout?: boolean | { [id: string]: boolean; };
+        pointerenter?: boolean | { [id: string]: boolean; };
+        pointerleave?: boolean | { [id: string]: boolean; };
+        pointercancel?: boolean | { [id: string]: boolean; };
+        //click, just in case
+        click?: boolean | { [id: string]: boolean; };
+        // drag and drop
+        dragstart?: boolean | { [id: string]: boolean; };
+        drop?: boolean | { [id: string]: boolean; };
+
+
+        [key: string]: boolean | { [id: string]: boolean; } | undefined;
+    }
+}

+ 26 - 0
Viewer/src/configuration/loader.d.ts

@@ -0,0 +1,26 @@
+import { ViewerConfiguration } from './configuration';
+/**
+ * The configuration loader will load the configuration object from any source and will use the defined mapper to
+ * parse the object and return a conform ViewerConfiguration.
+ * It is a private member of the scene.
+ */
+export declare class ConfigurationLoader {
+    private _enableCache;
+    private _configurationCache;
+    private _loadRequests;
+    constructor(_enableCache?: boolean);
+    /**
+     * load a configuration object that is defined in the initial configuration provided.
+     * The viewer configuration can extend different types of configuration objects and have an extra configuration defined.
+     *
+     * @param initConfig the initial configuration that has the definitions of further configuration to load.
+     * @param callback an optional callback that will be called sync, if noconfiguration needs to be loaded or configuration is payload-only
+     * @returns A promise that delivers the extended viewer configuration, when done.
+     */
+    loadConfiguration(initConfig?: ViewerConfiguration, callback?: (config: ViewerConfiguration) => void): Promise<ViewerConfiguration>;
+    /**
+     * Dispose the configuration loader. This will cancel file requests, if active.
+     */
+    dispose(): void;
+    private _loadFile(url);
+}

+ 1 - 1
Viewer/src/configuration/loader.ts

@@ -3,7 +3,7 @@ import { ViewerConfiguration } from './configuration';
 import { getConfigurationType } from './types';
 import { processConfigurationCompatibility } from './configurationCompatibility';
 
-import * as deepmerge from '../../assets/deepmerge.min.js';
+import { deepmerge } from '../helper/';
 import { Tools, IFileRequest } from 'babylonjs';
 
 /**

+ 42 - 0
Viewer/src/configuration/mappers.d.ts

@@ -0,0 +1,42 @@
+import { ViewerConfiguration } from './configuration';
+/**
+ * This is the mapper's interface. Implement this function to create your own mapper and register it at the mapper manager
+ */
+export interface IMapper {
+    map(rawSource: any): ViewerConfiguration;
+}
+/**
+ * The MapperManager manages the different implemented mappers.
+ * It allows the user to register new mappers as well and use them to parse their own configuration data
+ */
+export declare class MapperManager {
+    private _mappers;
+    /**
+     * The default mapper is the JSON mapper.
+     */
+    static DefaultMapper: string;
+    constructor();
+    /**
+     * Get a specific configuration mapper.
+     *
+     * @param type the name of the mapper to load
+     */
+    getMapper(type: string): IMapper;
+    /**
+     * Use this functio to register your own configuration mapper.
+     * After a mapper is registered, it can be used to parse the specific type fo configuration to the standard ViewerConfiguration.
+     * @param type the name of the mapper. This will be used to define the configuration type and/or to get the mapper
+     * @param mapper The implemented mapper
+     */
+    registerMapper(type: string, mapper: IMapper): void;
+    /**
+     * Dispose the mapper manager and all of its mappers.
+     */
+    dispose(): void;
+}
+/**
+ * mapperManager is a singleton of the type MapperManager.
+ * The mapperManager can be disposed directly with calling mapperManager.dispose()
+ * or indirectly with using BabylonViewer.disposeAll()
+ */
+export declare let mapperManager: MapperManager;

+ 1 - 1
Viewer/src/configuration/mappers.ts

@@ -1,7 +1,7 @@
 import { Tools } from 'babylonjs';
 import { ViewerConfiguration } from './configuration';
 
-import { kebabToCamel } from '../helper';
+import { kebabToCamel } from '../helper/';
 
 /**
  * This is the mapper's interface. Implement this function to create your own mapper and register it at the mapper manager

+ 6 - 0
Viewer/src/configuration/types/default.d.ts

@@ -0,0 +1,6 @@
+import { ViewerConfiguration } from './../configuration';
+/**
+ * The default configuration of the viewer, including templates (canvas, overly, loading screen)
+ * This configuration doesn't hold specific parameters, and only defines objects that are needed for the viewer to fully work correctly.
+ */
+export declare let defaultConfiguration: ViewerConfiguration;

+ 17 - 14
Viewer/src/configuration/types/default.ts

@@ -1,4 +1,7 @@
-import { ViewerConfiguration } from './../configuration';
+import { ViewerConfiguration } from '../configuration';
+import { defaultTemplate, fillContainer, loadingScreen, defaultViewer, navbar, overlay, help, share, error } from 'babylonjs-viewer-assets';
+import { babylonFont } from 'babylonjs-viewer-assets';
+import * as images from 'babylonjs-viewer-assets';
 
 /**
  * The default configuration of the viewer, including templates (canvas, overly, loading screen)
@@ -8,33 +11,33 @@ export let defaultConfiguration: ViewerConfiguration = {
     version: "3.2.0-alpha4",
     templates: {
         main: {
-            html: require("../../../assets/templates/default/defaultTemplate.html"),
+            html: defaultTemplate,
             params: {
-                babylonFont: require('../../../assets/babylon.woff'),
+                babylonFont: babylonFont,
                 noEscape: true
             }
         },
         fillContainer: {
-            html: require("../../../assets/templates/default/fillContainer.html"),
+            html: fillContainer,
             params: {
                 disable: false
             }
         },
         loadingScreen: {
-            html: require("../../../assets/templates/default/loadingScreen.html"),
+            html: loadingScreen,
             params: {
                 backgroundColor: "#000000",
-                loadingImage: require('../../../assets/img/loading.png')
+                loadingImage: images.loading
             }
         },
         viewer: {
-            html: require("../../../assets/templates/default/defaultViewer.html"),
+            html: defaultViewer,
             params: {
                 enableDragAndDrop: false
             }
         },
         navBar: {
-            html: require("../../../assets/templates/default/navbar.html"),
+            html: navbar,
             params: {
                 speedList: {
                     "0.5x": "0.5",
@@ -42,7 +45,7 @@ export let defaultConfiguration: ViewerConfiguration = {
                     "1.5x": "1.5",
                     "2.0x": "2.0",
                 },
-                logoImage: require('../../../assets/img/BabylonJS_Logo_Small.png'),
+                logoImage: images.babylonLogo,
                 logoText: 'BabylonJS',
                 logoLink: 'https://babylonjs.com',
                 hideHelp: true,
@@ -62,20 +65,20 @@ export let defaultConfiguration: ViewerConfiguration = {
             }
         },
         overlay: {
-            html: require("../../../assets/templates/default/overlay.html"),
+            html: overlay,
             params: {
-                closeImage: require('../../../assets/img/close.png'),
+                closeImage: images.close,
                 closeText: 'Close'
             }
         },
         help: {
-            html: require("../../../assets/templates/default/help.html")
+            html: help
         },
         share: {
-            html: require("../../../assets/templates/default/share.html")
+            html: share
         },
         error: {
-            html: require("../../../assets/templates/default/error.html")
+            html: error
         }
 
     },

+ 5 - 0
Viewer/src/configuration/types/environmentMap.d.ts

@@ -0,0 +1,5 @@
+import { ViewerConfiguration } from './../configuration';
+/**
+ * Lab-oriented default .env support
+ */
+export declare const environmentMapConfiguration: ViewerConfiguration;

+ 6 - 0
Viewer/src/configuration/types/extended.d.ts

@@ -0,0 +1,6 @@
+import { ViewerConfiguration } from './../configuration';
+/**
+ * The viewer's "extended" configuration.
+ * This configuration defines specific obejcts and parameters that we think make any model look good.
+ */
+export declare let extendedConfiguration: ViewerConfiguration;

+ 13 - 0
Viewer/src/configuration/types/index.d.ts

@@ -0,0 +1,13 @@
+import { minimalConfiguration } from './minimal';
+import { defaultConfiguration } from './default';
+import { ViewerConfiguration } from '../configuration';
+/**
+ * Get the configuration type you need to use as the base for your viewer.
+ * The types can either be a single string, or comma separated types that will extend each other. for example:
+ *
+ * "default, environmentMap" will first load the default configuration and will extend it using the environmentMap configuration.
+ *
+ * @param types a comma-separated string of the type(s) or configuration to load.
+ */
+declare let getConfigurationType: (types: string) => ViewerConfiguration;
+export { getConfigurationType, defaultConfiguration, minimalConfiguration };

+ 1 - 1
Viewer/src/configuration/types/index.ts

@@ -4,7 +4,7 @@ import { extendedConfiguration } from './extended';
 import { ViewerConfiguration } from '../configuration';
 import { shadowDirectionalLightConfiguration, shadowSpotlLightConfiguration } from './shadowLight';
 import { environmentMapConfiguration } from './environmentMap';
-import * as deepmerge from '../../../assets/deepmerge.min.js';
+import { deepmerge } from '../../helper/';
 
 /**
  * Get the configuration type you need to use as the base for your viewer.

+ 6 - 0
Viewer/src/configuration/types/minimal.d.ts

@@ -0,0 +1,6 @@
+import { ViewerConfiguration } from './../configuration';
+/**
+ * The minimal configuration needed to make the viewer work.
+ * Some functionalities might not work correctly (like fill-screen)
+ */
+export declare let minimalConfiguration: ViewerConfiguration;

+ 10 - 8
Viewer/src/configuration/types/minimal.ts

@@ -1,4 +1,6 @@
 import { ViewerConfiguration } from './../configuration';
+import { defaultTemplate, fillContainer, loadingScreen, defaultViewer, overlay, error } from 'babylonjs-viewer-assets';
+import { loading, close } from 'babylonjs-viewer-assets';
 
 /**
  * The minimal configuration needed to make the viewer work.
@@ -8,33 +10,33 @@ export let minimalConfiguration: ViewerConfiguration = {
     version: "0.1",
     templates: {
         main: {
-            html: require("../../../assets/templates/default/defaultTemplate.html")
+            html: defaultTemplate
         },
         fillContainer: {
-            html: require("../../../assets/templates/default/fillContainer.html"),
+            html: fillContainer,
             params: {
                 disable: false
             }
         },
         loadingScreen: {
-            html: require("../../../assets/templates/default/loadingScreen.html"),
+            html: loadingScreen,
             params: {
                 backgroundColor: "#000000",
-                loadingImage: require('../../../assets/img/loading.png')
+                loadingImage: loading
             }
         },
         viewer: {
-            html: require("../../../assets/templates/default/defaultViewer.html"),
+            html: defaultViewer,
         },
         overlay: {
-            html: require("../../../assets/templates/default/overlay.html"),
+            html: overlay,
             params: {
-                closeImage: require('../../../assets/img/close.png'),
+                closeImage: close,
                 closeText: 'Close'
             }
         },
         error: {
-            html: require("../../../assets/templates/default/error.html")
+            html: error
         }
 
     },

+ 9 - 0
Viewer/src/configuration/types/shadowLight.d.ts

@@ -0,0 +1,9 @@
+import { ViewerConfiguration } from './../configuration';
+/**
+ * Defines a default directional shadow light for normalized objects (!)
+ */
+export declare const shadowDirectionalLightConfiguration: ViewerConfiguration;
+/**
+ * Defines a default shadow-enabled spot light for normalized objects.
+ */
+export declare const shadowSpotlLightConfiguration: ViewerConfiguration;

+ 35 - 0
Viewer/src/eventManager.d.ts

@@ -0,0 +1,35 @@
+import { EventCallback, TemplateManager } from "./templateManager";
+/**
+ * The EventManager is in charge of registering user interctions with the viewer.
+ * It is used in the TemplateManager
+ */
+export declare class EventManager {
+    private _templateManager;
+    private _callbacksContainer;
+    constructor(_templateManager: TemplateManager);
+    /**
+     * Register a new callback to a specific template.
+     * The best example for the usage can be found in the DefaultViewer
+     *
+     * @param templateName the templateName to register the event to
+     * @param callback The callback to be executed
+     * @param eventType the type of event to register
+     * @param selector an optional selector. if not defined the parent object in the template will be selected
+     */
+    registerCallback(templateName: string, callback: (eventData: EventCallback) => void, eventType?: string, selector?: string): void;
+    /**
+     * This will remove a registered event from the defined template.
+     * Each one of the variables apart from the template name are optional, but one must be provided.
+     *
+     * @param templateName the templateName
+     * @param callback the callback to remove (optional)
+     * @param eventType the event type to remove (optional)
+     * @param selector the selector from which to remove the event (optional)
+     */
+    unregisterCallback(templateName: string, callback: (eventData: EventCallback) => void, eventType?: string, selector?: string): void;
+    private _eventTriggered(data);
+    /**
+     * Dispose the event manager
+     */
+    dispose(): void;
+}

+ 1 - 0
Viewer/src/externalModules.d.ts

@@ -1,3 +1,4 @@
+/// <reference path="../../dist/babylon.glTF2Interface.d.ts"/>
 /// <reference path="../../dist/preview release/loaders/babylonjs.loaders.d.ts"/>
 
 declare module "babylonjs-loaders" {

+ 24 - 0
Viewer/src/helper.d.ts

@@ -0,0 +1,24 @@
+/**
+ * Is the provided string a URL?
+ *
+ * @param urlToCheck the url to inspect
+ */
+export declare function isUrl(urlToCheck: string): boolean;
+/**
+ * Convert a string from kebab-case to camelCase
+ * @param s string to convert
+ */
+export declare function kebabToCamel(s: any): any;
+/**
+ * Convert a string from camelCase to kebab-case
+ * @param str string to convert
+ */
+export declare function camelToKebab(str: any): any;
+/**
+ * This will extend an object with configuration values.
+ * What it practically does it take the keys from the configuration and set them on the object.
+ * I the configuration is a tree, it will traverse into the tree.
+ * @param object the object to extend
+ * @param config the configuration object that will extend the object
+ */
+export declare function extendClassWithConfig(object: any, config: any): void;

+ 11 - 0
Viewer/src/helper/deepmerge.d.ts

@@ -0,0 +1,11 @@
+interface Ideepmerge {
+    (a: any, b: any, options?: any): any;
+    all(array: Array<any>, options?: any): any;
+    default: Ideepmerge;
+}
+declare const deepmerge: Ideepmerge;
+
+declare module "deepmerge" {
+    export default deepmerge;
+    export = deepmerge;
+}

+ 5 - 0
Viewer/src/helper.ts

@@ -1,3 +1,8 @@
+import * as deepmerge from 'deepmerge';
+
+let expDm = deepmerge['default'];
+export { expDm as deepmerge };
+
 /**
  * Is the provided string a URL?
  * 

+ 28 - 0
Viewer/src/index.d.ts

@@ -0,0 +1,28 @@
+/// <reference path="../../dist/babylon.glTF2Interface.d.ts" />
+import { mapperManager } from './configuration/mappers';
+import { viewerGlobals } from './configuration/globals';
+import { viewerManager } from './viewer/viewerManager';
+import { DefaultViewer } from './viewer/defaultViewer';
+import { AbstractViewer } from './viewer/viewer';
+import { telemetryManager } from './telemetryManager';
+import { ModelLoader } from './loader/modelLoader';
+import { ViewerModel, ModelState } from './model/viewerModel';
+import { AnimationPlayMode, AnimationState } from './model/modelAnimation';
+import { ILoaderPlugin } from './loader/plugins/loaderPlugin';
+/**
+ * BabylonJS Viewer
+ *
+ * An HTML-Based viewer for 3D models, based on BabylonJS and its extensions.
+ */
+import * as BABYLON from 'babylonjs';
+import 'babylonjs-loaders';
+import 'pep';
+import { InitTags } from './initializer';
+declare let disableInit: boolean;
+/**
+ * Dispose all viewers currently registered
+ */
+declare function disposeAll(): void;
+declare const Version: string;
+export { BABYLON, Version, InitTags, DefaultViewer, AbstractViewer, viewerGlobals, telemetryManager, disableInit, viewerManager, mapperManager, disposeAll, ModelLoader, ViewerModel, AnimationPlayMode, AnimationState, ModelState, ILoaderPlugin };
+export * from './configuration';

+ 2 - 3
Viewer/src/index.ts

@@ -1,4 +1,3 @@
-/// <reference path="../../dist/babylon.glTF2Interface.d.ts"/>
 import { mapperManager } from './configuration/mappers';
 import { viewerGlobals } from './configuration/globals';
 import { viewerManager } from './viewer/viewerManager';
@@ -20,7 +19,7 @@ import * as BABYLON from 'babylonjs';
 
 // load needed modules.
 import 'babylonjs-loaders';
-import 'pep';
+import 'pepjs';
 
 import { initListeners, InitTags } from './initializer';
 
@@ -40,7 +39,7 @@ function disposeAll() {
     telemetryManager.dispose();
 }
 
-const Version = BABYLON.Engine.Version;
+const Version = viewerGlobals.version;
 
 console.log("Babylon.js viewer (v" + Version + ")");
 

+ 11 - 0
Viewer/src/initializer.d.ts

@@ -0,0 +1,11 @@
+/**
+ * Will attach an init function the the DOMContentLoaded event.
+ * The init function will be removed automatically after the event was triggered.
+ */
+export declare function initListeners(): void;
+/**
+ * Select all HTML tags on the page that match the selector and initialize a viewer
+ *
+ * @param selector the selector to initialize the viewer on (default is 'babylon')
+ */
+export declare function InitTags(selector?: string): void;

+ 5 - 0
Viewer/src/interfaces.d.ts

@@ -0,0 +1,5 @@
+export declare const enum CameraBehavior {
+    AUTOROTATION = 0,
+    BOUNCING = 1,
+    FRAMING = 2,
+}

+ 126 - 0
Viewer/src/labs/environmentSerializer.d.ts

@@ -0,0 +1,126 @@
+import { Vector3 } from "babylonjs";
+import { TextureCube } from './texture';
+/**
+ * Spherical polynomial coefficients (counter part to spherical harmonic coefficients used in shader irradiance calculation)
+ * @ignoreChildren
+ */
+export interface SphericalPolynomalCoefficients {
+    x: Vector3;
+    y: Vector3;
+    z: Vector3;
+    xx: Vector3;
+    yy: Vector3;
+    zz: Vector3;
+    yz: Vector3;
+    zx: Vector3;
+    xy: Vector3;
+}
+/**
+ * Wraps data and maps required for environments with physically based rendering
+ */
+export interface PBREnvironment {
+    /**
+     * Spherical Polynomial Coefficients representing an irradiance map
+     */
+    irradiancePolynomialCoefficients: SphericalPolynomalCoefficients;
+    /**
+     * Specular cubemap
+     */
+    specularTexture?: TextureCube;
+    /**
+     * A scale factor applied to RGB values after reading from environment maps
+     */
+    textureIntensityScale: number;
+}
+/**
+         * Environment map representations: layouts, projections and approximations
+         */
+export declare type MapType = 'irradiance_sh_coefficients_9' | 'cubemap_faces';
+/**
+ * Image type used for environment map
+ */
+export declare type ImageType = 'png';
+/**
+ * A generic field in JSON that report's its type
+ */
+export interface TypedObject<T> {
+    type: T;
+}
+/**
+ * Describes a range of bytes starting at byte pos (inclusive) and finishing at byte pos + length - 1
+ */
+export interface ByteRange {
+    pos: number;
+    length: number;
+}
+/**
+ * Complete Spectre Environment JSON Descriptor
+ */
+export interface EnvJsonDescriptor {
+    radiance: TypedObject<MapType>;
+    irradiance: TypedObject<MapType>;
+    specular: TypedObject<MapType>;
+}
+/**
+ * Spherical harmonic coefficients to provide an irradiance map
+ */
+export interface IrradianceSHCoefficients9 extends TypedObject<MapType> {
+    l00: Array<number>;
+    l1_1: Array<number>;
+    l10: Array<number>;
+    l11: Array<number>;
+    l2_2: Array<number>;
+    l2_1: Array<number>;
+    l20: Array<number>;
+    l21: Array<number>;
+    l22: Array<number>;
+}
+/**
+ * A generic set of images, where the image content is specified by byte ranges in the mipmaps field
+ */
+export interface ImageSet<T> extends TypedObject<MapType> {
+    imageType: ImageType;
+    width: number;
+    height: number;
+    mipmaps: Array<T>;
+    multiplier: number;
+}
+/**
+ * A set of cubemap faces
+ */
+export declare type CubemapFaces = ImageSet<Array<ByteRange>>;
+/**
+ * A single image containing an atlas of equirectangular-projection maps across all mip levels
+ */
+export declare type EquirectangularMipmapAtlas = ImageSet<ByteRange>;
+/**
+ * A static class proving methods to aid parsing Spectre environment files
+ */
+export declare class EnvironmentDeserializer {
+    /**
+     * Parses an arraybuffer into a new PBREnvironment object
+     * @param arrayBuffer The arraybuffer of the Spectre environment file
+     * @return a PBREnvironment object
+     */
+    static Parse(arrayBuffer: ArrayBuffer): PBREnvironment;
+    /**
+     * Convert from irradiance to outgoing radiance for Lambertian BDRF, suitable for efficient shader evaluation.
+     *	  L = (1/pi) * E * rho
+     *
+     * This is done by an additional scale by 1/pi, so is a fairly trivial operation but important conceptually.
+     * @param harmonics Spherical harmonic coefficients (9)
+     */
+    private static _ConvertSHIrradianceToLambertianRadiance(harmonics);
+    /**
+     * Convert spherical harmonics to spherical polynomial coefficients
+     * @param harmonics Spherical harmonic coefficients (9)
+     * @param outPolynomialCoefficents Polynomial coefficients (9) object to store result
+     */
+    private static _ConvertSHToSP(harmonics, outPolynomialCoefficents);
+    /**
+     * Multiplies harmonic coefficients in place
+     * @param harmonics Spherical harmonic coefficients (9)
+     * @param scaleFactor Value to multiply by
+     */
+    private static _ScaleSH(harmonics, scaleFactor);
+}

+ 0 - 0
Viewer/src/labs/texture.d.ts


この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません