sdk.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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 ModelAttrRange = {
  29. [key in 'opacity' | 'bottom' | 'scale' as `${key}Range`]: {
  30. min: number,
  31. max: number,
  32. step: number
  33. }
  34. }
  35. export type AddModelProps = Pick<Model, 'type' | 'url' | 'id'>
  36. & ModelAttrs
  37. & ModelAttrRange
  38. export type SceneGuidePath = Pick<GuidePath, 'position' | 'target' | 'speed' | 'time'>
  39. export interface SceneGuide {
  40. bus: Emitter<{ changePoint: number; playComplete: void }>
  41. play: () => void
  42. pause: () => void
  43. clear: () => void
  44. }
  45. export type ScenePos = { localPos: SceneLocalPos, modelId: Model['id'] }
  46. export type ScreenPos = {
  47. trueSide: boolean,
  48. pos: ScreenLocalPos,
  49. modelId: Model['id']
  50. }
  51. export interface CameraComeToProps {
  52. position: SceneLocalPos;
  53. target?: SceneLocalPos;
  54. dur?: number,
  55. modelId?: Model['id'],
  56. distance?: 1 | 2 | 3
  57. }
  58. export type CalcPathProps = [[SceneGuidePath, SceneGuidePath], Partial<Pick<SceneGuidePath, 'time' | 'speed'>>]
  59. export interface SDK {
  60. layout: HTMLDivElement,
  61. sceneBus: Emitter<{ 'cameraChange': void }>
  62. addModel: (props: AddModelProps) => SceneModel
  63. calcPathInfo: (paths: CalcPathProps[0], info: CalcPathProps[1]) => Required<CalcPathProps[1]>
  64. getPositionByScreen: (screenPos: ScreenLocalPos, modelId?: Model['id']) => ScenePos | null
  65. getScreenByPosition: (localPos: SceneLocalPos, modelId?: Model['id']) => ScreenPos | null
  66. screenshot: (width: number, height: number) => Promise<string>
  67. getPose: () => { position: SceneLocalPos, target: SceneLocalPos }
  68. comeTo: (pos: CameraComeToProps) => void
  69. enterSceneGuide: (data: SceneGuidePath[]) => SceneGuide
  70. }
  71. export let sdk: SDK
  72. export type InialSDKProps = { layout: HTMLDivElement }
  73. let initialed = false
  74. export const initialSDK = async (props: InialSDKProps) => {
  75. if (initialed) return;
  76. initialed = true
  77. const libs = [
  78. `./lib/proj4/proj4.js`,
  79. `./lib/jquery/jquery-3.1.1.min.js`,
  80. `./lib/other/BinaryHeap.js`,
  81. `./lib/tween/tween.min.js`,
  82. ]
  83. await Promise.all(libs.map(loadLib))
  84. await loadLib(`./lib/potree/potree.js`)
  85. const localSdk = cover(props.layout, true) as unknown as SDK
  86. sdk = localSdk
  87. sdk.layout = props.layout
  88. }
  89. export default sdk