Improved file extension handling, custom url modifiers, in asset import, add IObject3D.autoUpgradeChildren, IObject3D.acceptChildEvents, handle NaN in autoScale, center, camera near far, preRender, postRender events to RenderManager, use EventListener2 in some places, add modelRootScale to viewer options, Update Readme, some minor fixes,
1 год назад Improved file extension handling, custom url modifiers, in asset import, add IObject3D.autoUpgradeChildren, IObject3D.acceptChildEvents, handle NaN in autoScale, center, camera near far, preRender, postRender events to RenderManager, use EventListener2 in some places, add modelRootScale to viewer options, Update Readme, some minor fixes,
1 год назад Improved file extension handling, custom url modifiers, in asset import, add IObject3D.autoUpgradeChildren, IObject3D.acceptChildEvents, handle NaN in autoScale, center, camera near far, preRender, postRender events to RenderManager, use EventListener2 in some places, add modelRootScale to viewer options, Update Readme, some minor fixes,
1 год назад |
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459 |
- import {IMaterial, IMaterialEventMap} from './IMaterial'
- import {Box3, EventListener2, Object3D, Object3DEventMap, Sphere, Vector3} from 'three'
- import {ChangeEvent, IUiConfigContainer, UiObjectConfig} from 'uiconfig.js'
- import {IGeometry, IGeometryEventMap} from './IGeometry'
- import {IImportResultUserData} from '../assetmanager'
- import {GLTF} from 'three/examples/jsm/loaders/GLTFLoader.js'
- import {ICamera, type ICameraSetDirtyOptions} from './ICamera'
-
- // export type IObject3DEventTypes = 'dispose' | 'materialUpdate' | 'objectUpdate' | 'textureUpdate' | 'geometryChanged' |
- // 'materialChanged' | 'geometryUpdate' | 'added' | 'removed' | 'select' | 'beforeDeserialize' |
- // 'setView' | 'activateMain' | 'cameraUpdate' // from camera
- // | string
- // export interface IObject3DEvent<T extends string = IObject3DEventTypes> extends Event {
- // type: T
- // object?: IObject3D // object that triggered the event, target might be parent in case of bubbleToParent
- // bubbleToParent?: boolean // bubble event to parent root
- // change?: string // todo - add to new type...
- // material?: IMaterial|undefined|IMaterial[] // from materialUpdate and materialChanged
- // oldMaterial?: IMaterial|undefined|IMaterial[] // from materialChanged
- // geometry?: IGeometry|undefined // from geometryUpdate, geometryChanged
- // oldGeometry?: IGeometry|undefined // from geometryChanged
- // source?: any // todo - add to new type...
- // }
-
- declare module 'three'{
- export interface Object3DEventMap{
- select: { // todo
- ui?: boolean
- focusCamera?: boolean
- bubbleToParent?: boolean
- object: IObject3D
- value?: IObject3D /* | Material*/ // todo is this required?
-
- source?: string // who is triggering the event. so that recursive events can be prevented
- } /* & IObjectSetDirtyOptions*/
- }
- }
- // [key: keyof Object3DEventMap]: Object3DEventMap[key] & {
- // bubbleToParent?: boolean
- // }
- export interface IObject3DEventMap extends Object3DEventMap{
- dispose: {
- // object: IObject3D
- // todo
- bubbleToParent: false
- }
- materialUpdate: {
- // object: IObject3D
- material: IMaterial|IMaterial[]
- }
- objectUpdate: {
- object: IObject3D
- change?: string
- args?: any[]
- bubbleToParent: boolean
- }
- textureUpdate: {
- // object: IObject3D
- // todo
- }
- geometryChanged: {
- object: IObject3D
- geometry: IGeometry|null
- oldGeometry: IGeometry|null
- bubbleToParent: boolean
- }
- materialChanged: {
- object: IObject3D
- material: IMaterial|IMaterial[]|null
- oldMaterial: IMaterial|IMaterial[]|null
- bubbleToParent: boolean
- }
- geometryUpdate: {
- object: IObject3D
- geometry: IGeometry
- // oldGeometry: IGeometry
- bubbleToParent: boolean
- }
- added: {
- // object: IObject3D
- // todo
- }
- removed: {
- // object: IObject3D
- // todo
- }
- beforeDeserialize: { // from material
- material: IMaterial
- // todo
- } & IMaterialEventMap['beforeDeserialize']
- setView: {
- ui?: boolean
- camera: ICamera
- bubbleToParent: boolean
- // object: IObject3D
- // todo
- }
- activateMain: {
- ui?: boolean
- camera?: ICamera | null
- bubbleToParent: boolean
- // object: IObject3D
-
- }
- cameraUpdate: {
- ui?: boolean
- camera?: ICamera
- // object: IObject3D
- bubbleToParent: boolean
- // todo
- } & ICameraSetDirtyOptions
- }
- // Record<keyof IObject3DEventMap0, IObject3DEventMap0[keyof IObject3DEventMap0] & {
- // // bubbleToParent?: boolean
- // }>
-
- export interface ISetDirtyCommonOptions {
- /**
- * Trigger UI Config Refresh along with setDirty.
- * Default `true`. Set to `false` to prevent UI Config refresh.
- */
- refreshUi?: boolean
-
- /**
- * Enable/disable frame fade using {@link FrameFadePlugin}
- * Default `true`. when the plugin is enabled and has corresponding flags enabled
- */
- frameFade?: boolean // for plugins
- /**
- * Duration for `frameFade` in ms. Check {@link FrameFadePlugin} for more details.
- */
- fadeDuration?: number // for plugins
-
- /**
- * Event from uiconfig.js when some value changes from the UI.
- */
- uiChangeEvent?: ChangeEvent,
-
- }
-
- export interface IObjectSetDirtyOptions extends ISetDirtyCommonOptions{
- /**
- * Bubble event to parent root(scene).
- */
- bubbleToParent?: boolean
- /**
- * Change identifier that triggered the setDirty call.
- */
- change?: string | keyof IObject3D
- /**
- * Update scene(bounds, shadows, plugins, etc) after setting dirty.
- */
- refreshScene?: boolean
-
- /**
- * Indicate whether the geometry has been changed to properly refresh plugins like ground, shadows.
- */
- geometryChanged?: boolean
-
- /**
- * update scene after setting dirty
- *
- * @deprecated use {@link refreshScene} instead
- */
- sceneUpdate?: boolean
-
- /**
- * Source identifier of who is triggering the event. so that recursive events can be prevented
- */
- source?: string
-
- /**
- * Key to identify the change. This is used to identify the change in the event. Can be used interchangeably with {@link change}.
- * Set from `onChange3` etc.
- */
- key?: string
-
- /**
- * Set to true if this is the last value in a user input chain. (like when mouse up on slider)
- */
- last?: boolean
- /**
- * Indicates that this change in from an `undo` operation.
- */
- undo?: boolean
-
- // value: any;
- // oldValue: any;
-
- // [key: string]: any
- }
-
- export interface IObjectProcessor { // todo, should be viewer
- processObject: (object: IObject3D) => void
- }
-
- export interface IObject3DUserData extends IImportResultUserData {
- uuid?: string
-
- /**
- * When true, this object will not be exported when exporting the scene with {@link AssetExporter.exportObject}
- */
- excludeFromExport?: boolean
-
- autoCentered?: boolean
- isCentered?: boolean
-
- autoScaleRadius?: number
- autoScaled?: boolean
-
- geometriesCentered?: boolean
-
- /**
- * should this object be taken into account when calculating bounding box, default true
- */
- bboxVisible?: boolean
-
- /**
- * Is centered in a parent object.
- */
- pseudoCentered?: boolean
-
- license?: string
-
- /**
- * When false, this object will not be selectable when clicking on it.
- */
- userSelectable?: boolean
-
- /**
- * Disables `bubbleToParent` in setDirty calls on the object. As an effect scene, viewer are not updated on property change. See progressive-hdr-shadows-exp or any baker.
- */
- autoUpdateParent?: boolean
-
- /**
- * For Physics plugins
- */
- physicsMass?: number
-
- /**
- * see {@link GLTFAnimationPlugin}
- */
- // eslint-disable-next-line @typescript-eslint/naming-convention
- gltfAnim_SyncMaxDuration?: boolean
-
- // region root scene model root
-
- /**
- * is it modelRoot in RootScene, used during serialization nad traversing ancestors
- */
- rootSceneModelRoot?: boolean
- __gltfAsset?: GLTF['asset']
- __gltfExtras?: GLTF['userData']
- // endregion
-
-
-
- __objectSetup?: boolean
- __meshSetup?: boolean
- // [key: string]: any // commented for noe
-
- // legacy
- /**
- * @deprecated
- */
- dispose?: any
- /**
- * @deprecated
- */
- setMaterial?: any
- /**
- * @deprecated
- */
- setGeometry?: any
- /**
- * @deprecated
- */
- setDirty?: any
-
- /**
- * Used in {@link GLTFObject3DExtrasExtension} and {@link iObjectCommons.upgradeObject3D}
- */
- __keepShadowDef?: boolean
- /**
- * Events that should be bubbled to parent root without the need to set bubbleToParent in the event.
- * todo: remove support for this
- */
- __autoBubbleToParentEvents?: string[]
-
- [key: string]: any
- }
-
- export interface IObject3D<TE extends IObject3DEventMap = IObject3DEventMap> extends Object3D<TE>, IUiConfigContainer {
- assetType: 'model' | 'light' | 'camera' | 'widget'
- isLight?: boolean
- isCamera?: boolean
- isMesh?: boolean
- isMeshLine?: boolean
- isLine?: boolean
- isLine2?: boolean
- isLineSegments?: boolean
- isLineSegments2?: boolean
- // isGroup?: boolean
- isScene?: boolean
- // isHelper?: boolean
- isWidget?: boolean
- readonly isObject3D: true
-
- material?: IMaterial | IMaterial[]
- /**
- * Same as material but always returns an array.
- * To set, just set `material` property
- */
- readonly materials?: IMaterial[]
- // eslint-disable-next-line @typescript-eslint/naming-convention
- _currentMaterial?: IMaterial | IMaterial[] | null
- geometry?: IGeometry
- morphTargetDictionary?: Record<string, number>
- morphTargetInfluences?: number[]
- updateMorphTargets?(): void
-
- // eslint-disable-next-line @typescript-eslint/naming-convention
- _currentGeometry?: IGeometry | null
-
- /**
- * Dispatches 'objectUpdate' event on object.
- * @param e
- */
- setDirty(e?: IObjectSetDirtyOptions): void
-
- /**
- * Parent/Ancestor of this object to bubble events to. This is set internally by setupObject3D.
- */
- parentRoot?: IObject3D | null
-
- uiConfig?: UiObjectConfig
- refreshUi(): void
-
- // Note: for userData: add _ in front of for private use, which is preserved while cloning but not serialisation, and __ for private use, which is not preserved while cloning and serialisation
- userData: IObject3DUserData
-
- /**
- * Scales the object to fit the given radius.
- *
- * @param autoScaleRadius - optional (taken from userData.autoScaleRadius by default)
- * @param isCentered - optional (taken from userData.isCentered by default)
- * @param setDirty - true by default
- * @param undo - undo any previous autoScale operation
- */
- autoScale?(autoScaleRadius?: number, isCentered?: boolean, setDirty?: boolean, undo?: boolean): this
-
- /**
- * Moves the bounding box center of the object to the center of the world
- *
- * @param setDirty - calls {@link setDirty} @default true
- * @param undo - undo any previous autoCenter operation
- */
- autoCenter?(setDirty?: boolean, undo?: boolean): this
-
- /**
- * Moves the object pivot to the center of the bounding box.
- *
- * The object will rotate around the new pivot.
- *
- * @param setDirty - calls {@link setDirty} @default true
- * @returns undo function
- */
- pivotToBoundsCenter?(setDirty?: boolean): () => void
-
- /**
- * Moves the object pivot to the given point
- *
- * The object will rotate around the new pivot.
- *
- * @param point - point to move the pivot to
- * @param setDirty - calls {@link setDirty} @default true
- * @returns undo function
- */
- pivotToPoint?(point: Vector3, setDirty?: boolean): this
-
- /**
- * @deprecated use object directly
- */
- modelObject: this
-
-
- // eslint-disable-next-line @typescript-eslint/naming-convention
- _onGeometryUpdate?: EventListener2<'geometryUpdate', IGeometryEventMap, IGeometry>
-
-
- objectProcessor?: IObjectProcessor
-
- // __disposed?: boolean
- /**
- * @param removeFromParent - remove from parent. Default true
- */
- dispose(removeFromParent?: boolean): void;
-
- /**
- * A promise can be set by the object to indicate that the object is loading.
- * This can be used by the scene, viewer, plugins to defer actions until the object is loaded.
- */
- _loadingPromise?: Promise<void>
-
- /**
- * For InstancedMesh, SkinnedMesh etc
- */
- boundingBox?: Box3 | null
- /**
- * For InstancedMesh, SkinnedMesh etc
- */
- boundingSphere?: Sphere | null
- /**
- * For InstancedMesh, SkinnedMesh etc
- * Computes bounding box, updating {@link boundingBox | .boundingBox} attribute.
- * @remarks Bounding boxes aren't computed by default. They need to be explicitly computed, otherwise they are `null`.
- */
- computeBoundingBox?(): void;
-
- /**
- * For InstancedMesh, SkinnedMesh etc
- * Computes bounding sphere, updating {@link boundingSphere | .boundingSphere} attribute.
- * @remarks bounding spheres aren't computed by default. They need to be explicitly computed, otherwise they are `null`.
- */
- computeBoundingSphere?(): void;
-
- /**
- * For LineSegments, Line2 etc
- */
- computeLineDistances?(): void
-
- /**
- * Set to `false` to disable propagation of any events from its children.
- */
- acceptChildEvents?: boolean
- /**
- * Set to `false` to disable automatic call of `upgradeObject3D` when a child is added.
- */
- autoUpgradeChildren?: boolean
-
- // region inherited type fixes
-
- traverse(callback: (object: IObject3D) => void): void
- traverseVisible(callback: (object: IObject3D) => void): void
- traverseAncestors(callback: (object: IObject3D) => void): void
- getObjectById<T extends IObject3D = IObject3D>(id: number): T | undefined
- getObjectByName<T extends IObject3D = IObject3D>(name: string): T | undefined
- getObjectByProperty<T extends IObject3D = IObject3D>(name: string, value: string): T | undefined
- copy(source: this, recursive?: boolean, ...args: any[]): this
- clone(recursive?: boolean): this
- add(...object: Object3D[]): this
- remove(...object: IObject3D[]): this
- parent: IObject3D | null
- children: IObject3D[]
-
- // endregion
-
- }
-
|