babylon.viewer.d.ts 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  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. root?: string;
  185. loader?: string; // obj, gltf?
  186. position?: { x: number, y: number, z: number };
  187. rotation?: { x: number, y: number, z: number, w?: number };
  188. scaling?: { x: number, y: number, z: number };
  189. parentObjectIndex?: number; // the index of the parent object of the model in the loaded meshes array.
  190. castShadow?: boolean;
  191. normalize?: boolean | {
  192. center?: boolean;
  193. unitSize?: boolean;
  194. parentIndex?: number;
  195. }; // shoud the model be scaled to unit-size
  196. title?: string;
  197. subtitle?: string;
  198. thumbnail?: string; // URL or data-url
  199. animation?: {
  200. autoStart?: boolean | string;
  201. playOnce?: boolean;
  202. }
  203. // [propName: string]: any; // further configuration, like title and creator
  204. }
  205. export interface ISkyboxConfiguration {
  206. cubeTexture?: {
  207. noMipMap?: boolean;
  208. gammaSpace?: boolean;
  209. url?: string | Array<string>;
  210. };
  211. color?: { r: number, g: number, b: number };
  212. pbr?: boolean; // deprecated
  213. scale?: number;
  214. blur?: number; // deprecated
  215. material?: {
  216. imageProcessingConfiguration?: IImageProcessingConfiguration;
  217. [propName: string]: any;
  218. };
  219. infiniteDIstance?: boolean;
  220. }
  221. export interface IGroundConfiguration {
  222. size?: number;
  223. receiveShadows?: boolean;
  224. shadowLevel?: number;
  225. shadowOnly?: boolean; // deprecated
  226. mirror?: boolean | {
  227. sizeRatio?: number;
  228. blurKernel?: number;
  229. amount?: number;
  230. fresnelWeight?: number;
  231. fallOffDistance?: number;
  232. textureType?: number;
  233. };
  234. texture?: string;
  235. color?: { r: number, g: number, b: number };
  236. opacity?: number;
  237. material?: { // deprecated!
  238. [propName: string]: any;
  239. };
  240. }
  241. export interface ISceneConfiguration {
  242. debug?: boolean;
  243. autoRotate?: boolean; // deprecated
  244. rotationSpeed?: number; // deprecated
  245. defaultCamera?: boolean; // deprecated
  246. defaultLight?: boolean; // deprecated
  247. clearColor?: { r: number, g: number, b: number, a: number };
  248. imageProcessingConfiguration?: IImageProcessingConfiguration;
  249. environmentTexture?: string;
  250. }
  251. export interface ISceneOptimizerConfiguration {
  252. targetFrameRate?: number;
  253. trackerDuration?: number;
  254. autoGeneratePriorities?: boolean;
  255. improvementMode?: boolean;
  256. degradation?: string; // low, moderate, high
  257. types?: {
  258. texture?: ISceneOptimizerParameters;
  259. hardwareScaling?: ISceneOptimizerParameters;
  260. shadow?: ISceneOptimizerParameters;
  261. postProcess?: ISceneOptimizerParameters;
  262. lensFlare?: ISceneOptimizerParameters;
  263. particles?: ISceneOptimizerParameters;
  264. renderTarget?: ISceneOptimizerParameters;
  265. mergeMeshes?: ISceneOptimizerParameters;
  266. }
  267. }
  268. export interface IObserversConfiguration {
  269. onEngineInit?: string;
  270. onSceneInit?: string;
  271. onModelLoaded?: string;
  272. }
  273. export interface ICameraConfiguration {
  274. position?: { x: number, y: number, z: number };
  275. rotation?: { x: number, y: number, z: number, w: number };
  276. fov?: number;
  277. fovMode?: number;
  278. minZ?: number;
  279. maxZ?: number;
  280. inertia?: number;
  281. behaviors?: {
  282. [name: string]: number | {
  283. type: number;
  284. [propName: string]: any;
  285. };
  286. };
  287. [propName: string]: any;
  288. }
  289. export interface ILightConfiguration {
  290. type: number;
  291. name?: string;
  292. disabled?: boolean;
  293. position?: { x: number, y: number, z: number };
  294. target?: { x: number, y: number, z: number };
  295. direction?: { x: number, y: number, z: number };
  296. diffuse?: { r: number, g: number, b: number };
  297. specular?: { r: number, g: number, b: number };
  298. intensity?: number;
  299. intensityMode?: number;
  300. radius?: number;
  301. shadownEnabled?: boolean; // only on specific lights!
  302. shadowConfig?: {
  303. useBlurExponentialShadowMap?: boolean;
  304. useKernelBlur?: boolean;
  305. blurKernel?: number;
  306. blurScale?: number;
  307. minZ?: number;
  308. maxZ?: number;
  309. frustumSize?: number;
  310. angleScale?: number;
  311. [propName: string]: any;
  312. }
  313. [propName: string]: any;
  314. // no behaviors for light at the moment, but allowing configuration for future reference.
  315. behaviors?: {
  316. [name: string]: number | {
  317. type: number;
  318. [propName: string]: any;
  319. };
  320. };
  321. }
  322. export interface ISceneOptimizerParameters {
  323. priority?: number;
  324. maximumSize?: number;
  325. step?: number;
  326. }
  327. export interface IImageProcessingConfiguration {
  328. colorGradingEnabled?: boolean;
  329. colorCurvesEnabled?: boolean;
  330. colorCurves?: {
  331. globalHue?: number;
  332. globalDensity?: number;
  333. globalSaturation?: number;
  334. globalExposure?: number;
  335. highlightsHue?: number;
  336. highlightsDensity?: number;
  337. highlightsSaturation?: number;
  338. highlightsExposure?: number;
  339. midtonesHue?: number;
  340. midtonesDensity?: number;
  341. midtonesSaturation?: number;
  342. midtonesExposure?: number;
  343. shadowsHue?: number;
  344. shadowsDensity?: number;
  345. shadowsSaturation?: number;
  346. shadowsExposure?: number;
  347. };
  348. colorGradingWithGreenDepth?: boolean;
  349. colorGradingBGR?: boolean;
  350. exposure?: number;
  351. toneMappingEnabled?: boolean;
  352. contrast?: number;
  353. vignetteEnabled?: boolean;
  354. vignetteStretch?: number;
  355. vignetteCentreX?: number;
  356. vignetteCentreY?: number;
  357. vignetteWeight?: number;
  358. vignetteColor?: { r: number, g: number, b: number, a?: number };
  359. vignetteCameraFov?: number;
  360. vignetteBlendMode?: number;
  361. vignetteM?: boolean;
  362. applyByPostProcess?: boolean;
  363. }
  364. /////>configuration
  365. export enum AnimationPlayMode {
  366. ONCE = 0,
  367. LOOP = 1,
  368. }
  369. export enum AnimationState {
  370. INIT = 0,
  371. PLAYING = 1,
  372. PAUSED = 2,
  373. STOPPED = 3,
  374. ENDED = 4,
  375. }
  376. export interface IModelAnimation extends BABYLON.IDisposable {
  377. readonly state: AnimationState;
  378. readonly name: string;
  379. readonly frames: number;
  380. readonly currentFrame: number;
  381. readonly fps: number;
  382. speedRatio: number;
  383. playMode: AnimationPlayMode;
  384. start(): any;
  385. stop(): any;
  386. pause(): any;
  387. reset(): any;
  388. restart(): any;
  389. goToFrame(frameNumber: number): any;
  390. }
  391. export enum ModelState {
  392. INIT,
  393. LOADING,
  394. LOADED,
  395. ERROR
  396. }
  397. export class ModelLoader {
  398. constructor(viewer: AbstractViewer);
  399. load(modelConfiguration: IModelConfiguration): ViewerModel;
  400. dispose(): void;
  401. }
  402. export class ViewerModel {
  403. constructor(scene: BABYLON.Scene, modelConfiguration: IModelConfiguration, disableAutoLoad: boolean);
  404. loader: BABYLON.ISceneLoaderPlugin | BABYLON.ISceneLoaderPluginAsync;
  405. meshes: Array<BABYLON.AbstractMesh>;
  406. ootMesh: BABYLON.AbstractMesh;
  407. particleSystems: Array<BABYLON.ParticleSystem>;
  408. skeletons: Array<BABYLON.Skeleton>;
  409. currentAnimation: IModelAnimation;
  410. onLoadedObservable: BABYLON.Observable<ViewerModel>;
  411. onLoadProgressObservable: BABYLON.Observable<BABYLON.SceneLoaderProgressEvent>;
  412. onLoadErrorObservable: BABYLON.Observable<{
  413. message: string;
  414. exception: any;
  415. }>;
  416. onAfterConfigure: BABYLON.Observable<ViewerModel>;
  417. state: ModelState;
  418. loadId: number;
  419. load(): void;
  420. initAnimations(): void;
  421. getAnimations(): Array<IModelAnimation>;
  422. getAnimationNames(): string[];
  423. playAnimation(name: string): IModelAnimation;
  424. dispose(): void;
  425. }
  426. /////<viewer
  427. export abstract class AbstractViewer {
  428. containerElement: HTMLElement;
  429. templateManager: TemplateManager;
  430. engine: BABYLON.Engine;
  431. scene: BABYLON.Scene;
  432. camera: BABYLON.ArcRotateCamera;
  433. sceneOptimizer: BABYLON.SceneOptimizer;
  434. baseId: string;
  435. models: Array<ViewerModel>;
  436. modelLoader: ModelLoader;
  437. lastUsedLoader: BABYLON.ISceneLoaderPlugin | BABYLON.ISceneLoaderPluginAsync;
  438. protected configuration: ViewerConfiguration;
  439. environmentHelper: BABYLON.EnvironmentHelper;
  440. protected defaultHighpTextureType: number;
  441. protected shadowGeneratorBias: number;
  442. protected defaultPipelineTextureType: number;
  443. protected maxShadows: number;
  444. readonly isHdrSupported: boolean;
  445. protected _isDisposed: boolean;
  446. onSceneInitObservable: BABYLON.Observable<BABYLON.Scene>;
  447. onEngineInitObservable: BABYLON.Observable<BABYLON.Engine>;
  448. onModelLoadedObservable: BABYLON.Observable<ViewerModel>;
  449. onModelLoadProgressObservable: BABYLON.Observable<BABYLON.SceneLoaderProgressEvent>;
  450. onModelLoadErrorObservable: BABYLON.Observable<{
  451. message: string;
  452. exception: any;
  453. }>;
  454. onLoaderInitObservable: BABYLON.Observable<BABYLON.ISceneLoaderPlugin | BABYLON.ISceneLoaderPluginAsync>;
  455. onInitDoneObservable: BABYLON.Observable<AbstractViewer>;
  456. canvas: HTMLCanvasElement;
  457. protected registeredOnBeforerenderFunctions: Array<() => void>;
  458. constructor(containerElement: HTMLElement, initialConfiguration?: ViewerConfiguration);
  459. getBaseId(): string;
  460. isCanvasInDOM(): boolean;
  461. protected resize: () => void;
  462. protected render: () => void;
  463. updateConfiguration(newConfiguration?: Partial<ViewerConfiguration>): void;
  464. protected configureEnvironment(skyboxConifguration?: ISkyboxConfiguration | boolean, groundConfiguration?: IGroundConfiguration | boolean): Promise<BABYLON.Scene> | undefined;
  465. protected configureScene(sceneConfig: ISceneConfiguration, optimizerConfig?: ISceneOptimizerConfiguration): void;
  466. protected configureOptimizer(optimizerConfig: ISceneOptimizerConfiguration | boolean): void;
  467. protected configureObservers(observersConfiguration: IObserversConfiguration): void;
  468. protected configureCamera(cameraConfig: ICameraConfiguration, model?: ViewerModel): void;
  469. protected configureLights(lightsConfiguration?: {
  470. [name: string]: ILightConfiguration | boolean;
  471. }, model?: ViewerModel): void;
  472. protected configureModel(modelConfiguration: Partial<IModelConfiguration>, model?: ViewerModel): void;
  473. dispose(): void;
  474. protected abstract prepareContainerElement(): any;
  475. protected onTemplatesLoaded(): Promise<AbstractViewer>;
  476. protected initEngine(): Promise<BABYLON.Engine>;
  477. protected initScene(): Promise<BABYLON.Scene>;
  478. initModel(modelConfig?: any, clearScene?: boolean): ViewerModel
  479. loadModel(modelConfig?: any, clearScene?: boolean): Promise<ViewerModel>;
  480. protected initEnvironment(viewerModel?: ViewerModel): Promise<BABYLON.Scene>;
  481. protected handleHardwareLimitations(): void;
  482. protected injectCustomShaders(): void;
  483. protected extendClassWithConfig(object: any, config: any): void;
  484. }
  485. export class DefaultViewer extends AbstractViewer {
  486. containerElement: HTMLElement;
  487. camera: BABYLON.ArcRotateCamera;
  488. constructor(containerElement: HTMLElement, initialConfiguration?: ViewerConfiguration);
  489. initScene(): Promise<BABYLON.Scene>;
  490. protected onTemplatesLoaded(): Promise<AbstractViewer>;
  491. protected prepareContainerElement(): void;
  492. loadModel(model?: any): Promise<ViewerModel>;
  493. initEnvironment(viewerModel?: ViewerModel): Promise<BABYLON.Scene>;
  494. showOverlayScreen(subScreen: string): Promise<Template>;
  495. hideOverlayScreen(): Promise<Template>;
  496. showLoadingScreen(): Promise<Template>;
  497. hideLoadingScreen(): Promise<Template>;
  498. }
  499. }