configuration.ts 14 KB

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