| @@ -1,12 +1,12 @@ | |||
| { | |||
| "name": "threepipe", | |||
| "version": "0.0.48", | |||
| "version": "0.0.49", | |||
| "lockfileVersion": 3, | |||
| "requires": true, | |||
| "packages": { | |||
| "": { | |||
| "name": "threepipe", | |||
| "version": "0.0.48", | |||
| "version": "0.0.49", | |||
| "license": "Apache-2.0", | |||
| "dependencies": { | |||
| "@types/three": "https://github.com/repalash/three-ts-types/releases/download/v0.158.1004/package.tgz", | |||
| @@ -1,6 +1,6 @@ | |||
| { | |||
| "name": "threepipe", | |||
| "version": "0.0.48", | |||
| "version": "0.0.49", | |||
| "description": "A modern 3D viewer framework built on top of three.js, written in TypeScript, designed to make creating high-quality, modular, and extensible 3D experiences on the web simple and enjoyable.", | |||
| "main": "dist/index.js", | |||
| "module": "dist/index.mjs", | |||
| @@ -189,6 +189,20 @@ export function makeIObject3DUiConfig(this: IObject3D, isMesh?:boolean): UiObjec | |||
| return this.pivotToBoundsCenter?.(true) // return value is the undo function | |||
| }, | |||
| }, | |||
| { | |||
| type: 'button', | |||
| label: 'Delete Object', | |||
| tags: ['context-menu'], | |||
| value: async()=>{ | |||
| const res = await ThreeViewer.Dialog.confirm('Delete Object: Are you sure you want to delete this object?') | |||
| if (!res) return | |||
| const parent = this.parent | |||
| this.dispose(true) | |||
| return ()=>{ // undo | |||
| if (parent) parent.add(this) | |||
| } | |||
| }, | |||
| }, | |||
| { | |||
| type: 'folder', | |||
| label: 'Rotate model', | |||
| @@ -86,13 +86,13 @@ export class PickingPlugin extends AViewerPluginSync<PickingPluginEventMap> { | |||
| return this._picker?.selectedObject as T || undefined | |||
| } | |||
| setSelectedObject(object: IObject3D|undefined, focusCamera = false) { // todo: listen to object disposed | |||
| setSelectedObject(object: IObject3D|undefined, focusCamera = false, trackUndo = true) { // todo: listen to object disposed | |||
| const disabled = this.isDisabled() | |||
| if (disabled && !object) return | |||
| if (!this._picker) return | |||
| const t = this.autoFocus | |||
| this.autoFocus = false | |||
| this._picker.selectedObject = object || null | |||
| this._picker.setSelected(object || null, trackUndo) | |||
| this.autoFocus = t | |||
| if (!disabled && object && (t || focusCamera)) this.focusObject(object) | |||
| } | |||
| @@ -203,7 +203,7 @@ export class PickingPlugin extends AViewerPluginSync<PickingPluginEventMap> { | |||
| s?.traverseAncestors((o) => { | |||
| if (o === this._viewer?.scene) inScene = true | |||
| }) | |||
| if (!inScene) this.setSelectedObject(undefined) | |||
| if (!inScene) this.setSelectedObject(undefined, false, false) | |||
| } | |||
| protected _viewerListeners = { | |||
| @@ -219,7 +219,7 @@ export class PickingPlugin extends AViewerPluginSync<PickingPluginEventMap> { | |||
| private _onObjectSelectEvent: EventListener2<'select', ISceneEventMap, IScene> = (e)=>{ | |||
| if (e.source === PickingPlugin.PluginType) return | |||
| if (e.object === undefined && e.value === undefined) console.error('e.object or e.value must be set for picking, can be null to unselect') | |||
| else this.setSelectedObject(e.object || e.value, this.autoFocus || e.focusCamera) | |||
| else this.setSelectedObject(e.object || e.value, this.autoFocus || e.focusCamera, true) | |||
| } | |||
| private _selectedObjectChanged: EventListener2<'selectedObjectChanged', ObjectPickerEventMap, ObjectPicker> = (e: any) => { | |||
| @@ -99,17 +99,17 @@ export class ObjectPicker extends EventDispatcher<ObjectPickerEventMap> { | |||
| } | |||
| set selectedObject(object) { | |||
| this._setSelected(object) | |||
| this.setSelected(object) | |||
| } | |||
| private _setSelected(object: IObject3D|null, record = true) { | |||
| setSelected(object: IObject3D|null, record = true) { | |||
| if (!this._selected.length && !object || this._selected.length === 1 && this._selected[0] === object) return | |||
| const current = [...this._selected] | |||
| this._selected = object ? Array.isArray(object) ? [...object] : [object] : [] | |||
| this.dispatchEvent({type: 'selectedObjectChanged', object: this.selectedObject}) | |||
| record && this.undoManager?.record({ | |||
| undo: () => this._setSelected(current.length ? current[0] : null, false), | |||
| redo: () => this._setSelected(object, false), | |||
| undo: () => this.setSelected(current.length ? current[0] : null, false), | |||
| redo: () => this.setSelected(object, false), | |||
| }) | |||
| } | |||
| @@ -1 +1 @@ | |||
| export const VERSION = '0.0.48' | |||
| export const VERSION = '0.0.49' | |||