babylon.viewer.module.d.ts 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486
  1. /// <reference types="babylonjs"/>
  2. declare module BabylonViewer {
  3. export let disableInit: boolean;
  4. export interface ITemplateConfiguration {
  5. location?: string;
  6. html?: string;
  7. id?: string;
  8. params?: {
  9. [key: string]: string | number | boolean | object;
  10. };
  11. events?: {
  12. pointerdown?: boolean | {
  13. [id: string]: boolean;
  14. };
  15. pointerup?: boolean | {
  16. [id: string]: boolean;
  17. };
  18. pointermove?: boolean | {
  19. [id: string]: boolean;
  20. };
  21. pointerover?: boolean | {
  22. [id: string]: boolean;
  23. };
  24. pointerout?: boolean | {
  25. [id: string]: boolean;
  26. };
  27. pointerenter?: boolean | {
  28. [id: string]: boolean;
  29. };
  30. pointerleave?: boolean | {
  31. [id: string]: boolean;
  32. };
  33. pointercancel?: boolean | {
  34. [id: string]: boolean;
  35. };
  36. click?: boolean | {
  37. [id: string]: boolean;
  38. };
  39. dragstart?: boolean | {
  40. [id: string]: boolean;
  41. };
  42. drop?: boolean | {
  43. [id: string]: boolean;
  44. };
  45. [key: string]: boolean | {
  46. [id: string]: boolean;
  47. } | undefined;
  48. };
  49. }
  50. export interface EventCallback {
  51. event: Event;
  52. template: Template;
  53. selector: string;
  54. payload?: any;
  55. }
  56. class TemplateManager {
  57. containerElement: HTMLElement;
  58. onInit: BABYLON.Observable<Template>;
  59. onLoaded: BABYLON.Observable<Template>;
  60. onStateChange: BABYLON.Observable<Template>;
  61. onAllLoaded: BABYLON.Observable<TemplateManager>;
  62. onEventTriggered: BABYLON.Observable<EventCallback>;
  63. eventManager: EventManager;
  64. private templates;
  65. constructor(containerElement: HTMLElement);
  66. initTemplate(templates: {
  67. [key: string]: ITemplateConfiguration;
  68. }): void;
  69. private buildHTMLTree(templates);
  70. getCanvas(): HTMLCanvasElement | null;
  71. getTemplate(name: string): Template | undefined;
  72. private checkLoadedState();
  73. }
  74. class Template {
  75. name: string;
  76. private _configuration;
  77. onInit: BABYLON.Observable<Template>;
  78. onLoaded: BABYLON.Observable<Template>;
  79. onAppended: BABYLON.Observable<Template>;
  80. onStateChange: BABYLON.Observable<Template>;
  81. onEventTriggered: BABYLON.Observable<EventCallback>;
  82. isLoaded: boolean;
  83. isShown: boolean;
  84. parent: HTMLElement;
  85. initPromise: Promise<Template>;
  86. private fragment;
  87. constructor(name: string, _configuration: ITemplateConfiguration);
  88. readonly configuration: ITemplateConfiguration;
  89. getChildElements(): Array<string>;
  90. appendTo(parent: HTMLElement): void;
  91. show(visibilityFunction?: (template: Template) => Promise<Template>): Promise<Template>;
  92. hide(visibilityFunction?: (template: Template) => Promise<Template>): Promise<Template>;
  93. dispose(): void;
  94. private registerEvents();
  95. }
  96. class ViewerManager {
  97. private viewers;
  98. onViewerAdded: (viewer: AbstractViewer) => void;
  99. onViewerAddedObservable: BABYLON.Observable<AbstractViewer>;
  100. constructor();
  101. addViewer(viewer: AbstractViewer): void;
  102. getViewerById(id: string): AbstractViewer;
  103. getViewerByHTMLElement(element: HTMLElement): AbstractViewer | undefined;
  104. getViewerPromiseById(id: string): Promise<AbstractViewer>;
  105. private _onViewerAdded(viewer);
  106. }
  107. export let viewerManager: ViewerManager;
  108. export const enum CameraBehavior {
  109. AUTOROTATION = 0,
  110. BOUNCING = 1,
  111. FRAMING = 2,
  112. }
  113. export function InitTags(selector?: string): void;
  114. class EventManager {
  115. private templateManager;
  116. private callbacksContainer;
  117. constructor(templateManager: TemplateManager);
  118. registerCallback(templateName: string, callback: (eventData: EventCallback) => void, eventType?: string, selector?: string): void;
  119. unregisterCallback(templateName: string, callback?: (eventData: EventCallback) => void, eventType?: string, selector?: string): void;
  120. private eventTriggered(data);
  121. }
  122. class PromiseObservable<T> extends BABYLON.Observable<T> {
  123. notifyWithPromise(eventData: T, mask?: number, target?: any, currentTarget?: any): Promise<any>;
  124. }
  125. export interface IMapper {
  126. map(rawSource: any): ViewerConfiguration;
  127. }
  128. class MapperManager {
  129. private mappers;
  130. static DefaultMapper: string;
  131. constructor();
  132. getMapper(type: string): IMapper;
  133. registerMapper(type: string, mapper: IMapper): void;
  134. }
  135. export let mapperManager: MapperManager;
  136. class ConfigurationLoader {
  137. private configurationCache;
  138. constructor();
  139. loadConfiguration(initConfig?: ViewerConfiguration): Promise<ViewerConfiguration>;
  140. getConfigurationType(type: string): void;
  141. private loadFile(url);
  142. }
  143. export let configurationLoader: ConfigurationLoader;
  144. /////> configuration
  145. export interface ViewerConfiguration {
  146. // configuration version
  147. version?: string;
  148. extends?: string; // is this configuration extending an existing configuration?
  149. pageUrl?: string; // will be used for sharing and other fun stuff. This is the page showing the model (not the model's url!)
  150. configuration?: string | {
  151. url?: string;
  152. payload?: any;
  153. mapper?: string; // json (default), html, yaml, xml, etc'. if not provided, file extension will be used.
  154. };
  155. // names of functions in the window context.
  156. observers?: IObserversConfiguration;
  157. canvasElement?: string; // if there is a need to override the standard implementation - ID of HTMLCanvasElement
  158. model?: IModelConfiguration | string;
  159. scene?: ISceneConfiguration;
  160. optimizer?: ISceneOptimizerConfiguration | boolean;
  161. // at the moment, support only a single camera.
  162. camera?: ICameraConfiguration,
  163. skybox?: boolean | ISkyboxConfiguration;
  164. ground?: boolean | IGroundConfiguration;
  165. lights?: { [name: string]: boolean | ILightConfiguration },
  166. // engine configuration. optional!
  167. engine?: {
  168. antialiasing?: boolean;
  169. disableResize?: boolean;
  170. engineOptions?: { [key: string]: any };
  171. adaptiveQuality?: boolean;
  172. },
  173. //templateStructure?: ITemplateStructure,
  174. templates?: {
  175. main: ITemplateConfiguration,
  176. [key: string]: ITemplateConfiguration
  177. };
  178. customShaders?: {
  179. shaders?: {
  180. [key: string]: string;
  181. };
  182. includes?: {
  183. [key: string]: string;
  184. }
  185. }
  186. // features that are being tested.
  187. // those features' syntax will change and move out!
  188. // Don't use in production (or be ready to make the changes :) )
  189. lab?: {
  190. flashlight?: boolean | {
  191. exponent?: number;
  192. angle?: number;
  193. intensity?: number;
  194. diffuse?: { r: number, g: number, b: number };
  195. specular?: { r: number, g: number, b: number };
  196. }
  197. hideLoadingDelay?: number;
  198. }
  199. }
  200. export interface IModelConfiguration {
  201. url?: string;
  202. loader?: string; // obj, gltf?
  203. position?: { x: number, y: number, z: number };
  204. rotation?: { x: number, y: number, z: number, w?: number };
  205. scaling?: { x: number, y: number, z: number };
  206. parentObjectIndex?: number; // the index of the parent object of the model in the loaded meshes array.
  207. castShadow?: boolean;
  208. normalize?: boolean | {
  209. center?: boolean;
  210. unitSize?: boolean;
  211. parentIndex?: number;
  212. }; // shoud the model be scaled to unit-size
  213. title?: string;
  214. subtitle?: string;
  215. thumbnail?: string; // URL or data-url
  216. // [propName: string]: any; // further configuration, like title and creator
  217. }
  218. export interface ISkyboxConfiguration {
  219. cubeTexture?: {
  220. noMipMap?: boolean;
  221. gammaSpace?: boolean;
  222. url?: string | Array<string>;
  223. };
  224. color?: { r: number, g: number, b: number };
  225. pbr?: boolean; // deprecated
  226. scale?: number;
  227. blur?: number; // deprecated
  228. material?: {
  229. imageProcessingConfiguration?: IImageProcessingConfiguration;
  230. [propName: string]: any;
  231. };
  232. infiniteDIstance?: boolean;
  233. }
  234. export interface IGroundConfiguration {
  235. size?: number;
  236. receiveShadows?: boolean;
  237. shadowLevel?: number;
  238. shadowOnly?: boolean; // deprecated
  239. mirror?: boolean | {
  240. sizeRatio?: number;
  241. blurKernel?: number;
  242. amount?: number;
  243. fresnelWeight?: number;
  244. fallOffDistance?: number;
  245. textureType?: number;
  246. };
  247. texture?: string;
  248. color?: { r: number, g: number, b: number };
  249. opacity?: number;
  250. material?: { // deprecated!
  251. [propName: string]: any;
  252. };
  253. }
  254. export interface ISceneConfiguration {
  255. debug?: boolean;
  256. autoRotate?: boolean; // deprecated
  257. rotationSpeed?: number; // deprecated
  258. defaultCamera?: boolean; // deprecated
  259. defaultLight?: boolean; // deprecated
  260. clearColor?: { r: number, g: number, b: number, a: number };
  261. imageProcessingConfiguration?: IImageProcessingConfiguration;
  262. environmentTexture?: string;
  263. }
  264. export interface ISceneOptimizerConfiguration {
  265. targetFrameRate?: number;
  266. trackerDuration?: number;
  267. autoGeneratePriorities?: boolean;
  268. improvementMode?: boolean;
  269. degradation?: string; // low, moderate, high
  270. types?: {
  271. texture?: ISceneOptimizerParameters;
  272. hardwareScaling?: ISceneOptimizerParameters;
  273. shadow?: ISceneOptimizerParameters;
  274. postProcess?: ISceneOptimizerParameters;
  275. lensFlare?: ISceneOptimizerParameters;
  276. particles?: ISceneOptimizerParameters;
  277. renderTarget?: ISceneOptimizerParameters;
  278. mergeMeshes?: ISceneOptimizerParameters;
  279. }
  280. }
  281. export interface IObserversConfiguration {
  282. onEngineInit?: string;
  283. onSceneInit?: string;
  284. onModelLoaded?: string;
  285. }
  286. export interface ICameraConfiguration {
  287. position?: { x: number, y: number, z: number };
  288. rotation?: { x: number, y: number, z: number, w: number };
  289. fov?: number;
  290. fovMode?: number;
  291. minZ?: number;
  292. maxZ?: number;
  293. inertia?: number;
  294. behaviors?: {
  295. [name: string]: number | {
  296. type: number;
  297. [propName: string]: any;
  298. };
  299. };
  300. [propName: string]: any;
  301. }
  302. export interface ILightConfiguration {
  303. type: number;
  304. name?: string;
  305. disabled?: boolean;
  306. position?: { x: number, y: number, z: number };
  307. target?: { x: number, y: number, z: number };
  308. direction?: { x: number, y: number, z: number };
  309. diffuse?: { r: number, g: number, b: number };
  310. specular?: { r: number, g: number, b: number };
  311. intensity?: number;
  312. intensityMode?: number;
  313. radius?: number;
  314. shadownEnabled?: boolean; // only on specific lights!
  315. shadowConfig?: {
  316. useBlurExponentialShadowMap?: boolean;
  317. useKernelBlur?: boolean;
  318. blurKernel?: number;
  319. blurScale?: number;
  320. minZ?: number;
  321. maxZ?: number;
  322. frustumSize?: number;
  323. angleScale?: number;
  324. [propName: string]: any;
  325. }
  326. [propName: string]: any;
  327. // no behaviors for light at the moment, but allowing configuration for future reference.
  328. behaviors?: {
  329. [name: string]: number | {
  330. type: number;
  331. [propName: string]: any;
  332. };
  333. };
  334. }
  335. export interface ISceneOptimizerParameters {
  336. priority?: number;
  337. maximumSize?: number;
  338. step?: number;
  339. }
  340. export interface IImageProcessingConfiguration {
  341. colorGradingEnabled?: boolean;
  342. colorCurvesEnabled?: boolean;
  343. colorCurves?: {
  344. globalHue?: number;
  345. globalDensity?: number;
  346. globalSaturation?: number;
  347. globalExposure?: number;
  348. highlightsHue?: number;
  349. highlightsDensity?: number;
  350. highlightsSaturation?: number;
  351. highlightsExposure?: number;
  352. midtonesHue?: number;
  353. midtonesDensity?: number;
  354. midtonesSaturation?: number;
  355. midtonesExposure?: number;
  356. shadowsHue?: number;
  357. shadowsDensity?: number;
  358. shadowsSaturation?: number;
  359. shadowsExposure?: number;
  360. };
  361. colorGradingWithGreenDepth?: boolean;
  362. colorGradingBGR?: boolean;
  363. exposure?: number;
  364. toneMappingEnabled?: boolean;
  365. contrast?: number;
  366. vignetteEnabled?: boolean;
  367. vignetteStretch?: number;
  368. vignetteCentreX?: number;
  369. vignetteCentreY?: number;
  370. vignetteWeight?: number;
  371. vignetteColor?: { r: number, g: number, b: number, a?: number };
  372. vignetteCameraFov?: number;
  373. vignetteBlendMode?: number;
  374. vignetteM?: boolean;
  375. applyByPostProcess?: boolean;
  376. }
  377. /////>configuration
  378. /////<viewer
  379. export abstract class AbstractViewer {
  380. containerElement: HTMLElement;
  381. templateManager: TemplateManager;
  382. camera: BABYLON.ArcRotateCamera;
  383. engine: BABYLON.Engine;
  384. scene: BABYLON.Scene;
  385. baseId: string;
  386. canvas: HTMLCanvasElement;
  387. protected configuration: ViewerConfiguration;
  388. environmentHelper: BABYLON.EnvironmentHelper;
  389. protected defaultHighpTextureType: number;
  390. protected shadowGeneratorBias: number;
  391. protected defaultPipelineTextureType: number;
  392. protected maxShadows: number;
  393. onSceneInitObservable: BABYLON.Observable<BABYLON.Scene>;
  394. onEngineInitObservable: BABYLON.Observable<BABYLON.Engine>;
  395. onModelLoadedObservable: BABYLON.Observable<BABYLON.AbstractMesh[]>;
  396. onModelLoadProgressObservable: BABYLON.Observable<BABYLON.SceneLoaderProgressEvent>;
  397. onModelLoadErrorObservable: BABYLON.Observable<{ message: string; exception: any }>;
  398. onLoaderInitObservable: BABYLON.Observable<BABYLON.ISceneLoaderPlugin | BABYLON.ISceneLoaderPluginAsync>;
  399. onInitDoneObservable: BABYLON.Observable<AbstractViewer>;
  400. constructor(containerElement: HTMLElement, initialConfiguration?: ViewerConfiguration);
  401. getBaseId(): string;
  402. protected abstract prepareContainerElement(): any;
  403. protected onTemplatesLoaded(): Promise<AbstractViewer>;
  404. protected initEngine(): Promise<BABYLON.Engine>;
  405. protected initScene(): Promise<BABYLON.Scene>;
  406. dispose(): void;
  407. loadModel(model?: any, clearScene?: boolean): Promise<BABYLON.Scene>;
  408. lastUsedLoader: BABYLON.ISceneLoaderPlugin | BABYLON.ISceneLoaderPluginAsync;
  409. sceneOptimizer: BABYLON.SceneOptimizer;
  410. protected registeredOnBeforerenderFunctions: Array<() => void>;
  411. isCanvasInDOM(): boolean;
  412. protected resize: () => void;
  413. protected render: () => void;
  414. updateConfiguration(newConfiguration: Partial<ViewerConfiguration>): void;
  415. protected configureEnvironment(skyboxConifguration?: ISkyboxConfiguration | boolean, groundConfiguration?: IGroundConfiguration | boolean): void;
  416. protected configureScene(sceneConfig: ISceneConfiguration, optimizerConfig?: ISceneOptimizerConfiguration): void;
  417. protected configureOptimizer(optimizerConfig: ISceneOptimizerConfiguration | boolean): void;
  418. protected configureObservers(observersConfiguration: IObserversConfiguration): void;
  419. protected configureCamera(cameraConfig: ICameraConfiguration, focusMeshes: Array<BABYLON.AbstractMesh>): void;
  420. protected configureLights(lightsConfiguration: { [name: string]: ILightConfiguration | boolean }, focusMeshes: Array<BABYLON.AbstractMesh>): void;
  421. protected configureModel(modelConfiguration: Partial<IModelConfiguration>, focusMeshes: Array<BABYLON.AbstractMesh>): void;
  422. dispose(): void;
  423. protected initEnvironment(focusMeshes: Array<BABYLON.AbstractMesh>): Promise<BABYLON.Scene>;
  424. protected injectCustomShaders(): void;
  425. protected extendClassWithConfig(object: any, config: any): void;
  426. protected handleHardwareLimitations(): void;
  427. }
  428. export class DefaultViewer extends AbstractViewer {
  429. containerElement: HTMLElement;
  430. camera: BABYLON.ArcRotateCamera;
  431. constructor(containerElement: HTMLElement, initialConfiguration?: ViewerConfiguration);
  432. initScene(): Promise<BABYLON.Scene>;
  433. protected onTemplatesLoaded(): Promise<AbstractViewer>;
  434. protected prepareContainerElement(): void;
  435. loadModel(model?: any): Promise<BABYLON.Scene>;
  436. initEnvironment(focusMeshes?: Array<BABYLON.AbstractMesh>): Promise<BABYLON.Scene>;
  437. showOverlayScreen(subScreen: string): Promise<Template>;
  438. hideOverlayScreen(): Promise<Template>;
  439. showLoadingScreen(): Promise<Template>;
  440. hideLoadingScreen(): Promise<Template>;
  441. }
  442. }