123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- import cover from './cover'
- import { loadLib } from '@/utils'
- import type { FuseModelAttrs, FuseModel, GuidePath } from '@/store'
- import type { Emitter } from 'mitt'
- type SceneModelAttrs = FuseModelAttrs & { select: boolean }
- export type SceneModel = ToChangeAPI<Omit<SceneModelAttrs, 'position' | 'rotation'>>
- & {
- bus: Emitter<
- Pick<SceneModelAttrs, 'select'> &
- {
- loadError: void,
- loadDone: void,
- loadProgress: number,
- changeSelect: boolean,
- transformChanged: {
- position?: SceneLocalPos,
- scale?: number,
- rotation?: SceneLocalPos,
- bottom?: number
- }
- }
- >
- destroy: () => void
- enterRotateMode: () => void
- enterMoveMode: () => void
- leaveTransform: () => void
- }
- export type ModelAttrRange = {
- [key in 'opacity' | 'bottom' | 'scale' as `${key}Range`]: {
- min: number,
- max: number,
- step: number
- }
- }
- export type AddModelProps = Pick<FuseModel, 'url' | 'id'>
- & FuseModelAttrs
- & { type: 'laser' | 'glb' }
- & ModelAttrRange
- export type SceneGuidePath = Pick<GuidePath, 'position' | 'target' | 'speed' | 'time'>
- export interface SceneGuide {
- bus: Emitter<{ changePoint: number; playComplete: void }>
- play: () => void
- pause: () => void
- clear: () => void
- }
- export type ScenePos = { localPos: SceneLocalPos, modelId: FuseModel['id'] }
- export type ScreenPos = {
- trueSide: boolean,
- pos: ScreenLocalPos,
- modelId: FuseModel['id']
- }
- export interface CameraComeToProps {
- position: SceneLocalPos;
- target?: SceneLocalPos;
- dur?: number,
- modelId?: FuseModel['id'],
- distance?: 1 | 2 | 3
- }
- export type CalcPathProps = [[SceneGuidePath, SceneGuidePath], Partial<Pick<SceneGuidePath, 'time' | 'speed'>>]
- export interface SDK {
- layout: HTMLDivElement,
- sceneBus: Emitter<{ 'cameraChange': void }>
- addModel: (props: AddModelProps) => SceneModel
- calcPathInfo: (paths: CalcPathProps[0], info: CalcPathProps[1]) => Required<CalcPathProps[1]>
- getPositionByScreen: (screenPos: ScreenLocalPos, modelId?: FuseModel['id']) => ScenePos | null
- getScreenByPosition: (localPos: SceneLocalPos, modelId?: FuseModel['id']) => ScreenPos | null
- screenshot: (width: number, height: number) => Promise<string>
- getPose: () => { position: SceneLocalPos, target: SceneLocalPos }
- comeTo: (pos: CameraComeToProps) => void
- enterSceneGuide: (data: SceneGuidePath[]) => SceneGuide
- }
-
- export let sdk: SDK
- export type InialSDKProps = { layout: HTMLDivElement }
- export let initialed = false
- export const initialSDK = async (props: InialSDKProps) => {
- if (initialed) return;
- initialed = true
- const libs = [
- `./lib/proj4/proj4.js`,
- `./lib/jquery/jquery-3.1.1.min.js`,
- `./lib/other/BinaryHeap.js`,
- `./lib/tween/tween.min.js`,
- ]
- await Promise.all(libs.map(loadLib))
- await loadLib(`./lib/potree/potree.js`)
- const localSdk = cover(props.layout, true) as unknown as SDK
- sdk = localSdk
- sdk.layout = props.layout
- }
- export default sdk
|