configuration.ts 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539
  1. import { ITemplateConfiguration } from './../templateManager';
  2. import { EngineOptions, IGlowLayerOptions, DepthOfFieldEffectBlurLevel } from 'babylonjs';
  3. export function getConfigurationKey(key: string, configObject: any) {
  4. let splits = key.split('.');
  5. if (splits.length === 0 || !configObject) return;
  6. else if (splits.length === 1) {
  7. if (configObject[key] !== undefined) {
  8. return configObject[key];
  9. }
  10. } else {
  11. let firstKey = splits.shift();
  12. return getConfigurationKey(splits.join("."), configObject[firstKey!])
  13. }
  14. }
  15. export interface ViewerConfiguration {
  16. // configuration version
  17. version?: string;
  18. extends?: string; // is this configuration extending an existing configuration?
  19. pageUrl?: string; // will be used for sharing and other fun stuff. This is the page showing the model (not the model's url!)
  20. configuration?: string | {
  21. url?: string;
  22. payload?: any;
  23. mapper?: string; // json (default), html, yaml, xml, etc'. if not provided, file extension will be used.
  24. };
  25. // names of functions in the window context.
  26. observers?: IObserversConfiguration;
  27. canvasElement?: string; // if there is a need to override the standard implementation - ID of HTMLCanvasElement
  28. model?: IModelConfiguration | string;
  29. scene?: ISceneConfiguration;
  30. optimizer?: ISceneOptimizerConfiguration | boolean;
  31. // at the moment, support only a single camera.
  32. camera?: ICameraConfiguration,
  33. skybox?: boolean | ISkyboxConfiguration;
  34. ground?: boolean | IGroundConfiguration;
  35. lights?: { [name: string]: boolean | ILightConfiguration },
  36. // engine configuration. optional!
  37. engine?: {
  38. renderInBackground?: boolean;
  39. antialiasing?: boolean;
  40. disableResize?: boolean;
  41. engineOptions?: EngineOptions;
  42. adaptiveQuality?: boolean;
  43. },
  44. //templateStructure?: ITemplateStructure,
  45. templates?: {
  46. main: ITemplateConfiguration,
  47. [key: string]: ITemplateConfiguration
  48. };
  49. customShaders?: {
  50. shaders?: {
  51. [key: string]: string;
  52. };
  53. includes?: {
  54. [key: string]: string;
  55. }
  56. }
  57. loaderPlugins?: {
  58. extendedMaterial?: boolean;
  59. msftLod?: boolean;
  60. telemetry?: boolean;
  61. minecraft?: boolean;
  62. [propName: string]: boolean | undefined;
  63. };
  64. // features that are being tested.
  65. // those features' syntax will change and move out!
  66. // Don't use in production (or be ready to make the changes :) )
  67. lab?: {
  68. flashlight?: boolean | {
  69. exponent?: number;
  70. angle?: number;
  71. intensity?: number;
  72. diffuse?: { r: number, g: number, b: number };
  73. specular?: { r: number, g: number, b: number };
  74. }
  75. hideLoadingDelay?: number;
  76. assetsRootURL?: string;
  77. environmentMainColor?: { r: number, g: number, b: number };
  78. environmentMap?: {
  79. /**
  80. * Environment map texture path in relative to the asset folder.
  81. */
  82. texture: string;
  83. /**
  84. * Default rotation to apply to the environment map.
  85. */
  86. rotationY: number;
  87. /**
  88. * Tint level of the main color on the environment map.
  89. */
  90. tintLevel: number;
  91. }
  92. defaultRenderingPipelines?: boolean | IDefaultRenderingPipelineConfiguration;
  93. }
  94. }
  95. /**
  96. * Defines an animation to be applied to a model (translation, scale or rotation).
  97. */
  98. export interface IModelAnimationConfiguration {
  99. /**
  100. * Time of animation, in seconds
  101. */
  102. time?: number;
  103. /**
  104. * Scale to apply
  105. */
  106. scaling?: {
  107. x: number;
  108. y: number;
  109. z: number;
  110. };
  111. /**
  112. * Easing function to apply
  113. * See SPECTRE.EasingFunction
  114. */
  115. easingFunction?: number;
  116. /**
  117. * An Easing mode to apply to the easing function
  118. * See BABYLON.EasingFunction
  119. */
  120. easingMode?: number;
  121. }
  122. export interface IDefaultRenderingPipelineConfiguration {
  123. sharpenEnabled?: boolean;
  124. bloomEnabled?: boolean;
  125. bloomThreshold?: number;
  126. depthOfFieldEnabled?: boolean;
  127. depthOfFieldBlurLevel?: DepthOfFieldEffectBlurLevel;
  128. fxaaEnabled?: boolean;
  129. imageProcessingEnabled?: boolean;
  130. defaultPipelineTextureType?: number;
  131. bloomScale?: number;
  132. chromaticAberrationEnabled?: boolean;
  133. grainEnabled?: boolean;
  134. bloomKernel?: number;
  135. hardwareScaleLevel?: number;
  136. bloomWeight?: number;
  137. hdr?: boolean;
  138. samples?: number;
  139. glowLayerEnabled?: boolean;
  140. }
  141. export interface IModelConfiguration {
  142. id?: string;
  143. url?: string;
  144. root?: string; //optional
  145. file?: string | File; // is a file being loaded? root and url ignored
  146. loader?: string; // obj, gltf?
  147. position?: { x: number, y: number, z: number };
  148. rotation?: { x: number, y: number, z: number, w?: number };
  149. scaling?: { x: number, y: number, z: number };
  150. parentObjectIndex?: number; // the index of the parent object of the model in the loaded meshes array.
  151. castShadow?: boolean;
  152. receiveShadows?: boolean;
  153. normalize?: boolean | {
  154. center?: boolean;
  155. unitSize?: boolean;
  156. parentIndex?: number;
  157. }; // should the model be scaled to unit-size
  158. title?: string;
  159. subtitle?: string;
  160. thumbnail?: string; // URL or data-url
  161. animation?: {
  162. autoStart?: boolean | string;
  163. playOnce?: boolean;
  164. autoStartIndex?: number;
  165. }
  166. entryAnimation?: IModelAnimationConfiguration;
  167. exitAnimation?: IModelAnimationConfiguration;
  168. material?: {
  169. directEnabled?: boolean;
  170. directIntensity?: number;
  171. emissiveIntensity?: number;
  172. environmentIntensity?: number;
  173. [propName: string]: any;
  174. }
  175. /**
  176. * Rotation offset axis definition
  177. */
  178. rotationOffsetAxis?: {
  179. x: number;
  180. y: number;
  181. z: number;
  182. };
  183. /**
  184. * the offset angle
  185. */
  186. rotationOffsetAngle?: number;
  187. loaderConfiguration?: {
  188. maxLODsToLoad?: number;
  189. progressiveLoading?: boolean;
  190. }
  191. // [propName: string]: any; // further configuration, like title and creator
  192. }
  193. export interface ISkyboxConfiguration {
  194. cubeTexture?: {
  195. noMipMap?: boolean;
  196. gammaSpace?: boolean;
  197. url?: string | Array<string>;
  198. };
  199. color?: { r: number, g: number, b: number };
  200. pbr?: boolean; // deprecated
  201. scale?: number;
  202. blur?: number; // deprecated
  203. material?: {
  204. imageProcessingConfiguration?: IImageProcessingConfiguration;
  205. [propName: string]: any;
  206. };
  207. infiniteDistance?: boolean;
  208. }
  209. export interface IGroundConfiguration {
  210. size?: number;
  211. receiveShadows?: boolean;
  212. shadowLevel?: number;
  213. shadowOnly?: boolean; // deprecated
  214. mirror?: boolean | {
  215. sizeRatio?: number;
  216. blurKernel?: number;
  217. amount?: number;
  218. fresnelWeight?: number;
  219. fallOffDistance?: number;
  220. textureType?: number;
  221. };
  222. texture?: string;
  223. color?: { r: number, g: number, b: number };
  224. opacity?: number;
  225. material?: {
  226. [propName: string]: any;
  227. };
  228. }
  229. export interface ISceneConfiguration {
  230. debug?: boolean;
  231. clearColor?: { r: number, g: number, b: number, a: number };
  232. mainColor?: { r?: number, g?: number, b?: number };
  233. imageProcessingConfiguration?: IImageProcessingConfiguration;
  234. environmentTexture?: string;
  235. colorGrading?: IColorGradingConfiguration;
  236. environmentRotationY?: number;
  237. /**
  238. * Deprecated, please use default rendering pipeline
  239. */
  240. glow?: boolean | IGlowLayerOptions;
  241. disableHdr?: boolean;
  242. renderInBackground?: boolean;
  243. disableCameraControl?: boolean;
  244. animationPropertiesOverride?: {
  245. [propName: string]: any;
  246. };
  247. defaultMaterial?: {
  248. materialType: "standard" | "pbr";
  249. [propName: string]: any;
  250. };
  251. flags?: {
  252. shadowsEnabled?: boolean;
  253. particlesEnabled?: boolean;
  254. collisionsEnabled?: boolean;
  255. lightsEnabled?: boolean;
  256. texturesEnabled?: boolean;
  257. lensFlaresEnabled?: boolean;
  258. proceduralTexturesEnabled?: boolean;
  259. renderTargetsEnabled?: boolean;
  260. spritesEnabled?: boolean;
  261. skeletonsEnabled?: boolean;
  262. audioEnabled?: boolean;
  263. }
  264. }
  265. /**
  266. * The Color Grading Configuration groups the different settings used to define the color grading used in the viewer.
  267. */
  268. export interface IColorGradingConfiguration {
  269. /**
  270. * Transform data string, encoded as determined by transformDataFormat.
  271. */
  272. transformData: string;
  273. /**
  274. * The encoding format of TransformData (currently only raw-base16 is supported).
  275. */
  276. transformDataFormat: string;
  277. /**
  278. * The weight of the transform
  279. */
  280. transformWeight: number;
  281. /**
  282. * Color curve colorFilterHueGlobal value
  283. */
  284. colorFilterHueGlobal: number;
  285. /**
  286. * Color curve colorFilterHueShadows value
  287. */
  288. colorFilterHueShadows: number;
  289. /**
  290. * Color curve colorFilterHueMidtones value
  291. */
  292. colorFilterHueMidtones: number;
  293. /**
  294. * Color curve colorFilterHueHighlights value
  295. */
  296. colorFilterHueHighlights: number;
  297. /**
  298. * Color curve colorFilterDensityGlobal value
  299. */
  300. colorFilterDensityGlobal: number;
  301. /**
  302. * Color curve colorFilterDensityShadows value
  303. */
  304. colorFilterDensityShadows: number;
  305. /**
  306. * Color curve colorFilterDensityMidtones value
  307. */
  308. colorFilterDensityMidtones: number;
  309. /**
  310. * Color curve colorFilterDensityHighlights value
  311. */
  312. colorFilterDensityHighlights: number;
  313. /**
  314. * Color curve saturationGlobal value
  315. */
  316. saturationGlobal: number;
  317. /**
  318. * Color curve saturationShadows value
  319. */
  320. saturationShadows: number;
  321. /**
  322. * Color curve saturationMidtones value
  323. */
  324. saturationMidtones: number;
  325. /**
  326. * Color curve saturationHighlights value
  327. */
  328. saturationHighlights: number;
  329. /**
  330. * Color curve exposureGlobal value
  331. */
  332. exposureGlobal: number;
  333. /**
  334. * Color curve exposureShadows value
  335. */
  336. exposureShadows: number;
  337. /**
  338. * Color curve exposureMidtones value
  339. */
  340. exposureMidtones: number;
  341. /**
  342. * Color curve exposureHighlights value
  343. */
  344. exposureHighlights: number;
  345. }
  346. export interface ISceneOptimizerConfiguration {
  347. targetFrameRate?: number;
  348. trackerDuration?: number;
  349. autoGeneratePriorities?: boolean;
  350. improvementMode?: boolean;
  351. degradation?: string; // low, moderate, high
  352. types?: {
  353. texture?: ISceneOptimizerParameters;
  354. hardwareScaling?: ISceneOptimizerParameters;
  355. shadow?: ISceneOptimizerParameters;
  356. postProcess?: ISceneOptimizerParameters;
  357. lensFlare?: ISceneOptimizerParameters;
  358. particles?: ISceneOptimizerParameters;
  359. renderTarget?: ISceneOptimizerParameters;
  360. mergeMeshes?: ISceneOptimizerParameters;
  361. }
  362. custom?: string;
  363. }
  364. export interface IObserversConfiguration {
  365. onEngineInit?: string;
  366. onSceneInit?: string;
  367. onModelLoaded?: string;
  368. }
  369. export interface ICameraConfiguration {
  370. position?: { x: number, y: number, z: number };
  371. rotation?: { x: number, y: number, z: number, w: number };
  372. fov?: number;
  373. fovMode?: number;
  374. minZ?: number;
  375. maxZ?: number;
  376. inertia?: number;
  377. exposure?: number;
  378. pinchPrecision?: number;
  379. behaviors?: {
  380. [name: string]: number | {
  381. type: number;
  382. [propName: string]: any;
  383. };
  384. };
  385. disableCameraControl?: boolean;
  386. disableCtrlForPanning?: boolean;
  387. disableAutoFocus?: boolean;
  388. [propName: string]: any;
  389. }
  390. export interface ILightConfiguration {
  391. type: number;
  392. name?: string;
  393. disabled?: boolean;
  394. position?: { x: number, y: number, z: number };
  395. target?: { x: number, y: number, z: number };
  396. direction?: { x: number, y: number, z: number };
  397. diffuse?: { r: number, g: number, b: number };
  398. specular?: { r: number, g: number, b: number };
  399. intensity?: number;
  400. intensityMode?: number;
  401. radius?: number;
  402. shadownEnabled?: boolean; // only on specific lights!
  403. shadowConfig?: {
  404. useBlurExponentialShadowMap?: boolean;
  405. useBlurCloseExponentialShadowMap?: boolean;
  406. useKernelBlur?: boolean;
  407. blurKernel?: number;
  408. blurScale?: number;
  409. minZ?: number;
  410. maxZ?: number;
  411. frustumSize?: number;
  412. angleScale?: number;
  413. frustumEdgeFalloff?: number;
  414. [propName: string]: any;
  415. };
  416. spotAngle?: number;
  417. shadowFieldOfView?: number;
  418. shadowBufferSize?: number;
  419. shadowFrustumSize?: number;
  420. shadowMinZ?: number;
  421. shadowMaxZ?: number;
  422. [propName: string]: any;
  423. // no behaviors for light at the moment, but allowing configuration for future reference.
  424. behaviors?: {
  425. [name: string]: number | {
  426. type: number;
  427. [propName: string]: any;
  428. };
  429. };
  430. }
  431. export interface ISceneOptimizerParameters {
  432. priority?: number;
  433. maximumSize?: number;
  434. step?: number;
  435. }
  436. export interface IImageProcessingConfiguration {
  437. colorGradingEnabled?: boolean;
  438. colorCurvesEnabled?: boolean;
  439. colorCurves?: {
  440. globalHue?: number;
  441. globalDensity?: number;
  442. globalSaturation?: number;
  443. globalExposure?: number;
  444. highlightsHue?: number;
  445. highlightsDensity?: number;
  446. highlightsSaturation?: number;
  447. highlightsExposure?: number;
  448. midtonesHue?: number;
  449. midtonesDensity?: number;
  450. midtonesSaturation?: number;
  451. midtonesExposure?: number;
  452. shadowsHue?: number;
  453. shadowsDensity?: number;
  454. shadowsSaturation?: number;
  455. shadowsExposure?: number;
  456. };
  457. colorGradingWithGreenDepth?: boolean;
  458. colorGradingBGR?: boolean;
  459. exposure?: number;
  460. toneMappingEnabled?: boolean;
  461. contrast?: number;
  462. vignetteEnabled?: boolean;
  463. vignetteStretch?: number;
  464. vignetteCentreX?: number;
  465. vignetteCentreY?: number;
  466. vignetteWeight?: number;
  467. vignetteColor?: { r: number, g: number, b: number, a?: number };
  468. vignetteCameraFov?: number;
  469. vignetteBlendMode?: number;
  470. vignetteM?: boolean;
  471. applyByPostProcess?: boolean;
  472. isEnabled?: boolean;
  473. }