babylon.viewer.d.ts 19 KB

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