babylon.viewer.d.ts 19 KB

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