sdk.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import cover from './cover'
  2. import { loadLib } from '@/utils'
  3. import type { ModelAttrs, Model, GuidePath, GuidePaths } from '@/store'
  4. import type { Emitter } from 'mitt'
  5. type SceneModelAttrs = ModelAttrs & { select: boolean }
  6. export type SceneModel = ToChangeAPI<Omit<SceneModelAttrs, 'position' | 'rotation'>>
  7. & {
  8. bus: Emitter<
  9. Pick<SceneModelAttrs, 'select'> &
  10. {
  11. loadError: void,
  12. loadDone: void,
  13. loadProgress: number,
  14. changeSelect: boolean,
  15. transformChanged: {
  16. position?: SceneLocalPos,
  17. scale?: number,
  18. rotation?: SceneLocalPos,
  19. bottom?: number
  20. }
  21. }
  22. >
  23. destroy: () => void
  24. enterRotateMode: () => void
  25. enterMoveMode: () => void
  26. leaveTransform: () => void
  27. }
  28. export type AddModelProps = Pick<Model, 'type' | 'url' | 'id'> & ModelAttrs
  29. export type SceneGuidePath = Pick<GuidePath, 'position' | 'target' | 'speed' | 'time'>
  30. export interface SceneGuide {
  31. bus: Emitter<{ changePoint: number; playComplete: void }>
  32. play: () => void
  33. pause: () => void
  34. clear: () => void
  35. }
  36. export type ScenePos = { localPos: SceneLocalPos, modelId: Model['id'] }
  37. export type ScreenPos = {
  38. trueSide: boolean,
  39. pos: ScreenLocalPos,
  40. modelId: Model['id']
  41. }
  42. export interface CameraComeToProps {
  43. position: SceneLocalPos;
  44. target?: SceneLocalPos;
  45. dur?: number,
  46. modelId?: Model['id'],
  47. distance?: 1 | 2 | 3
  48. }
  49. export type CalcPathProps = [[SceneGuidePath, SceneGuidePath], Partial<Pick<SceneGuidePath, 'time' | 'speed'>>]
  50. export interface SDK {
  51. layout: HTMLDivElement,
  52. sceneBus: Emitter<{ 'cameraChange': void }>
  53. addModel: (props: AddModelProps) => SceneModel
  54. calcPathInfo: (paths: CalcPathProps[0], info: CalcPathProps[1]) => Required<CalcPathProps[1]>
  55. getPositionByScreen: (screenPos: ScreenLocalPos, modelId?: Model['id']) => ScenePos | null
  56. getScreenByPosition: (localPos: SceneLocalPos, modelId?: Model['id']) => ScreenPos | null
  57. screenshot: (width: number, height: number) => Promise<string>
  58. getPose: () => { position: SceneLocalPos, target: SceneLocalPos }
  59. comeTo: (pos: CameraComeToProps) => void
  60. enterSceneGuide: (data: SceneGuidePath[]) => SceneGuide
  61. }
  62. export let sdk: SDK
  63. export type InialSDKProps = { layout: HTMLDivElement }
  64. let initialed = false
  65. export const initialSDK = async (props: InialSDKProps) => {
  66. if (initialed) return;
  67. initialed = true
  68. const libs = [
  69. `./lib/proj4/proj4.js`,
  70. `./lib/jquery/jquery-3.1.1.min.js`,
  71. `./lib/other/BinaryHeap.js`,
  72. `./lib/tween/tween.min.js`,
  73. ]
  74. await Promise.all(libs.map(loadLib))
  75. await loadLib(`/lib/potree/potree.js`)
  76. const localSdk = cover(props.layout) as unknown as SDK
  77. sdk = localSdk
  78. sdk.layout = props.layout
  79. }
  80. export default sdk