sdk.ts 3.0 KB

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