@viniciusgoncalves/three-toolkit 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/selector.ts"],"sourcesContent":["export { Selector } from './selector.js';\n","import { Camera, Object3D, Raycaster, Vector2 } from 'three';\nimport { Coordinates } from 'core-toolkit';\n\nexport class Selector {\n public enabled: boolean = true;\n\n private readonly selection: Object3D[] = [];\n private canvas: HTMLCanvasElement;\n private camera: Camera;\n private readonly objects: Object3D[];\n private readonly raycaster: Raycaster;\n\n // #region Parameters\n public filterVisible: boolean = true;\n public clearSelectionOnSelectNothing: boolean = true;\n // #endregion\n\n // #region Callbacks\n private trySelectCallback = (event: PointerEvent) => {\n this.trySelect(event);\n };\n public onAddToSelection: ((object: Object3D) => void)[] = [];\n public onRemoveFromSelection: ((object: Object3D) => void)[] = [];\n // #endregion\n\n public constructor(canvas: HTMLCanvasElement, camera: Camera, objects: Object3D[] = []) {\n this.canvas = canvas;\n this.canvas.addEventListener('pointerdown', this.trySelectCallback);\n\n this.camera = camera;\n this.objects = objects;\n\n this.raycaster = new Raycaster();\n }\n\n public setCanvas(canvas: HTMLCanvasElement): Selector {\n this.canvas.removeEventListener('pointerdown', this.trySelectCallback);\n this.canvas = canvas;\n this.canvas.addEventListener('pointerdown', this.trySelectCallback);\n return this;\n }\n\n public setCamera(camera: Camera): Selector {\n this.camera = camera;\n return this;\n }\n\n public setObjects(objects: Object3D[]): Selector {\n this.objects.splice(0);\n this.objects.push(...objects);\n return this;\n }\n\n public setContext(canvas: HTMLCanvasElement, camera: Camera, objects: Object3D[]): Selector {\n return this.setCanvas(canvas).setCamera(camera).setObjects(objects);\n }\n\n public addObjects(...objects: Object3D[]): Selector {\n this.objects.push(...objects);\n return this;\n }\n\n public addToSelection(object: Object3D): Selector {\n if (this.selection.some((object) => object.uuid === object.uuid)) return this;\n\n this.selection.push(object);\n for (const callback of this.onAddToSelection) callback(object);\n return this;\n }\n\n public removeFromSelection(object: Object3D): Selector {\n const index = this.selection.findIndex((object) => object.uuid === object.uuid);\n if (index === -1) return this;\n\n this.selection.push(object);\n for (const callback of this.onRemoveFromSelection) callback(object);\n return this;\n }\n\n public clearSelection(): Selector {\n this.selection.forEach((object) => this.removeFromSelection(object));\n return this;\n }\n\n private trySelect(event: PointerEvent): Object3D | null {\n if (!this.enabled || this.objects.length === 0) return null;\n\n const ndc = Coordinates.getNormalizedDeviceCoordinates(event, this.canvas);\n const coordinates = new Vector2(ndc[0], ndc[1]);\n this.raycaster.setFromCamera(coordinates, this.camera);\n\n const objs = this.filterVisible ? this.objects.filter((obj) => obj.visible) : this.objects;\n const intersections = this.raycaster.intersectObjects(objs);\n\n if (intersections.length === 0) {\n if (this.clearSelectionOnSelectNothing) this.clearSelection();\n return null;\n }\n\n this.addToSelection(intersections[0].object);\n return intersections[0].object;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAqD;AACrD,0BAA4B;AAErB,IAAM,WAAN,MAAe;AAAA;AAAA,EAsBb,YAAY,QAA2B,QAAgB,UAAsB,CAAC,GAAG;AArBxF,SAAO,UAAmB;AAE1B,SAAiB,YAAwB,CAAC;AAO1C;AAAA,SAAO,gBAAyB;AAChC,SAAO,gCAAyC;AAIhD;AAAA;AAAA,SAAQ,oBAAoB,CAAC,UAAwB;AACnD,WAAK,UAAU,KAAK;AAAA,IACtB;AACA,SAAO,mBAAmD,CAAC;AAC3D,SAAO,wBAAwD,CAAC;AAI9D,SAAK,SAAS;AACd,SAAK,OAAO,iBAAiB,eAAe,KAAK,iBAAiB;AAElE,SAAK,SAAS;AACd,SAAK,UAAU;AAEf,SAAK,YAAY,IAAI,uBAAU;AAAA,EACjC;AAAA,EAEO,UAAU,QAAqC;AACpD,SAAK,OAAO,oBAAoB,eAAe,KAAK,iBAAiB;AACrE,SAAK,SAAS;AACd,SAAK,OAAO,iBAAiB,eAAe,KAAK,iBAAiB;AAClE,WAAO;AAAA,EACT;AAAA,EAEO,UAAU,QAA0B;AACzC,SAAK,SAAS;AACd,WAAO;AAAA,EACT;AAAA,EAEO,WAAW,SAA+B;AAC/C,SAAK,QAAQ,OAAO,CAAC;AACrB,SAAK,QAAQ,KAAK,GAAG,OAAO;AAC5B,WAAO;AAAA,EACT;AAAA,EAEO,WAAW,QAA2B,QAAgB,SAA+B;AAC1F,WAAO,KAAK,UAAU,MAAM,EAAE,UAAU,MAAM,EAAE,WAAW,OAAO;AAAA,EACpE;AAAA,EAEO,cAAc,SAA+B;AAClD,SAAK,QAAQ,KAAK,GAAG,OAAO;AAC5B,WAAO;AAAA,EACT;AAAA,EAEO,eAAe,QAA4B;AAChD,QAAI,KAAK,UAAU,KAAK,CAACA,YAAWA,QAAO,SAASA,QAAO,IAAI,EAAG,QAAO;AAEzE,SAAK,UAAU,KAAK,MAAM;AAC1B,eAAW,YAAY,KAAK,iBAAkB,UAAS,MAAM;AAC7D,WAAO;AAAA,EACT;AAAA,EAEO,oBAAoB,QAA4B;AACrD,UAAM,QAAQ,KAAK,UAAU,UAAU,CAACA,YAAWA,QAAO,SAASA,QAAO,IAAI;AAC9E,QAAI,UAAU,GAAI,QAAO;AAEzB,SAAK,UAAU,KAAK,MAAM;AAC1B,eAAW,YAAY,KAAK,sBAAuB,UAAS,MAAM;AAClE,WAAO;AAAA,EACT;AAAA,EAEO,iBAA2B;AAChC,SAAK,UAAU,QAAQ,CAAC,WAAW,KAAK,oBAAoB,MAAM,CAAC;AACnE,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU,OAAsC;AACtD,QAAI,CAAC,KAAK,WAAW,KAAK,QAAQ,WAAW,EAAG,QAAO;AAEvD,UAAM,MAAM,gCAAY,+BAA+B,OAAO,KAAK,MAAM;AACzE,UAAM,cAAc,IAAI,qBAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC9C,SAAK,UAAU,cAAc,aAAa,KAAK,MAAM;AAErD,UAAM,OAAO,KAAK,gBAAgB,KAAK,QAAQ,OAAO,CAAC,QAAQ,IAAI,OAAO,IAAI,KAAK;AACnF,UAAM,gBAAgB,KAAK,UAAU,iBAAiB,IAAI;AAE1D,QAAI,cAAc,WAAW,GAAG;AAC9B,UAAI,KAAK,8BAA+B,MAAK,eAAe;AAC5D,aAAO;AAAA,IACT;AAEA,SAAK,eAAe,cAAc,CAAC,EAAE,MAAM;AAC3C,WAAO,cAAc,CAAC,EAAE;AAAA,EAC1B;AACF;","names":["object"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/selector.ts"],"sourcesContent":["export { Selector } from './selector.js';\n","import { Camera, Object3D, Raycaster, Vector2 } from 'three';\nimport { Coordinates } from 'core-toolkit';\n\nexport class Selector {\n public enabled: boolean = true;\n\n public readonly selection: Object3D[] = [];\n private canvas: HTMLCanvasElement;\n private camera: Camera;\n private readonly objects: Object3D[];\n private readonly raycaster: Raycaster;\n\n // #region Parameters\n public filterVisible: boolean = true;\n public clearSelectionOnSelectNothing: boolean = true;\n // #endregion\n\n // #region Callbacks\n private trySelectCallback = (event: PointerEvent) => {\n this.trySelect(event);\n };\n public onAddToSelection: ((object: Object3D) => void)[] = [];\n public onRemoveFromSelection: ((object: Object3D) => void)[] = [];\n // #endregion\n\n public constructor(canvas: HTMLCanvasElement, camera: Camera, objects: Object3D[] = []) {\n this.canvas = canvas;\n this.canvas.addEventListener('pointerdown', this.trySelectCallback);\n\n this.camera = camera;\n this.objects = objects;\n\n this.raycaster = new Raycaster();\n }\n\n public setCanvas(canvas: HTMLCanvasElement): Selector {\n this.canvas.removeEventListener('pointerdown', this.trySelectCallback);\n this.canvas = canvas;\n this.canvas.addEventListener('pointerdown', this.trySelectCallback);\n return this;\n }\n\n public setCamera(camera: Camera): Selector {\n this.camera = camera;\n return this;\n }\n\n public setObjects(objects: Object3D[]): Selector {\n this.objects.splice(0);\n this.objects.push(...objects);\n return this;\n }\n\n public setContext(canvas: HTMLCanvasElement, camera: Camera, objects: Object3D[]): Selector {\n return this.setCanvas(canvas).setCamera(camera).setObjects(objects);\n }\n\n public addObjects(...objects: Object3D[]): Selector {\n this.objects.push(...objects);\n return this;\n }\n\n public addToSelection(object: Object3D): Selector {\n if (this.selection.some((object) => object.uuid === object.uuid)) return this;\n\n this.selection.push(object);\n for (const callback of this.onAddToSelection) callback(object);\n return this;\n }\n\n public removeFromSelection(object: Object3D): Selector {\n const index = this.selection.findIndex((object) => object.uuid === object.uuid);\n if (index === -1) return this;\n\n this.selection.push(object);\n for (const callback of this.onRemoveFromSelection) callback(object);\n return this;\n }\n\n public clearSelection(): Selector {\n this.selection.forEach((object) => this.removeFromSelection(object));\n return this;\n }\n\n private trySelect(event: PointerEvent): Object3D | null {\n if (!this.enabled || this.objects.length === 0) return null;\n\n const ndc = Coordinates.getNormalizedDeviceCoordinates(event, this.canvas);\n const coordinates = new Vector2(ndc[0], ndc[1]);\n this.raycaster.setFromCamera(coordinates, this.camera);\n\n const objs = this.filterVisible ? this.objects.filter((obj) => obj.visible) : this.objects;\n const intersections = this.raycaster.intersectObjects(objs);\n\n if (intersections.length === 0) {\n if (this.clearSelectionOnSelectNothing) this.clearSelection();\n return null;\n }\n\n this.addToSelection(intersections[0].object);\n return intersections[0].object;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAAqD;AACrD,0BAA4B;AAErB,IAAM,WAAN,MAAe;AAAA;AAAA,EAsBb,YAAY,QAA2B,QAAgB,UAAsB,CAAC,GAAG;AArBxF,SAAO,UAAmB;AAE1B,SAAgB,YAAwB,CAAC;AAOzC;AAAA,SAAO,gBAAyB;AAChC,SAAO,gCAAyC;AAIhD;AAAA;AAAA,SAAQ,oBAAoB,CAAC,UAAwB;AACnD,WAAK,UAAU,KAAK;AAAA,IACtB;AACA,SAAO,mBAAmD,CAAC;AAC3D,SAAO,wBAAwD,CAAC;AAI9D,SAAK,SAAS;AACd,SAAK,OAAO,iBAAiB,eAAe,KAAK,iBAAiB;AAElE,SAAK,SAAS;AACd,SAAK,UAAU;AAEf,SAAK,YAAY,IAAI,uBAAU;AAAA,EACjC;AAAA,EAEO,UAAU,QAAqC;AACpD,SAAK,OAAO,oBAAoB,eAAe,KAAK,iBAAiB;AACrE,SAAK,SAAS;AACd,SAAK,OAAO,iBAAiB,eAAe,KAAK,iBAAiB;AAClE,WAAO;AAAA,EACT;AAAA,EAEO,UAAU,QAA0B;AACzC,SAAK,SAAS;AACd,WAAO;AAAA,EACT;AAAA,EAEO,WAAW,SAA+B;AAC/C,SAAK,QAAQ,OAAO,CAAC;AACrB,SAAK,QAAQ,KAAK,GAAG,OAAO;AAC5B,WAAO;AAAA,EACT;AAAA,EAEO,WAAW,QAA2B,QAAgB,SAA+B;AAC1F,WAAO,KAAK,UAAU,MAAM,EAAE,UAAU,MAAM,EAAE,WAAW,OAAO;AAAA,EACpE;AAAA,EAEO,cAAc,SAA+B;AAClD,SAAK,QAAQ,KAAK,GAAG,OAAO;AAC5B,WAAO;AAAA,EACT;AAAA,EAEO,eAAe,QAA4B;AAChD,QAAI,KAAK,UAAU,KAAK,CAACA,YAAWA,QAAO,SAASA,QAAO,IAAI,EAAG,QAAO;AAEzE,SAAK,UAAU,KAAK,MAAM;AAC1B,eAAW,YAAY,KAAK,iBAAkB,UAAS,MAAM;AAC7D,WAAO;AAAA,EACT;AAAA,EAEO,oBAAoB,QAA4B;AACrD,UAAM,QAAQ,KAAK,UAAU,UAAU,CAACA,YAAWA,QAAO,SAASA,QAAO,IAAI;AAC9E,QAAI,UAAU,GAAI,QAAO;AAEzB,SAAK,UAAU,KAAK,MAAM;AAC1B,eAAW,YAAY,KAAK,sBAAuB,UAAS,MAAM;AAClE,WAAO;AAAA,EACT;AAAA,EAEO,iBAA2B;AAChC,SAAK,UAAU,QAAQ,CAAC,WAAW,KAAK,oBAAoB,MAAM,CAAC;AACnE,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU,OAAsC;AACtD,QAAI,CAAC,KAAK,WAAW,KAAK,QAAQ,WAAW,EAAG,QAAO;AAEvD,UAAM,MAAM,gCAAY,+BAA+B,OAAO,KAAK,MAAM;AACzE,UAAM,cAAc,IAAI,qBAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC9C,SAAK,UAAU,cAAc,aAAa,KAAK,MAAM;AAErD,UAAM,OAAO,KAAK,gBAAgB,KAAK,QAAQ,OAAO,CAAC,QAAQ,IAAI,OAAO,IAAI,KAAK;AACnF,UAAM,gBAAgB,KAAK,UAAU,iBAAiB,IAAI;AAE1D,QAAI,cAAc,WAAW,GAAG;AAC9B,UAAI,KAAK,8BAA+B,MAAK,eAAe;AAC5D,aAAO;AAAA,IACT;AAEA,SAAK,eAAe,cAAc,CAAC,EAAE,MAAM;AAC3C,WAAO,cAAc,CAAC,EAAE;AAAA,EAC1B;AACF;","names":["object"]}
package/dist/index.d.cts CHANGED
@@ -2,7 +2,7 @@ import { Object3D, Camera } from 'three';
2
2
 
3
3
  declare class Selector {
4
4
  enabled: boolean;
5
- private readonly selection;
5
+ readonly selection: Object3D[];
6
6
  private canvas;
7
7
  private camera;
8
8
  private readonly objects;
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ import { Object3D, Camera } from 'three';
2
2
 
3
3
  declare class Selector {
4
4
  enabled: boolean;
5
- private readonly selection;
5
+ readonly selection: Object3D[];
6
6
  private canvas;
7
7
  private camera;
8
8
  private readonly objects;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/selector.ts"],"sourcesContent":["import { Camera, Object3D, Raycaster, Vector2 } from 'three';\nimport { Coordinates } from 'core-toolkit';\n\nexport class Selector {\n public enabled: boolean = true;\n\n private readonly selection: Object3D[] = [];\n private canvas: HTMLCanvasElement;\n private camera: Camera;\n private readonly objects: Object3D[];\n private readonly raycaster: Raycaster;\n\n // #region Parameters\n public filterVisible: boolean = true;\n public clearSelectionOnSelectNothing: boolean = true;\n // #endregion\n\n // #region Callbacks\n private trySelectCallback = (event: PointerEvent) => {\n this.trySelect(event);\n };\n public onAddToSelection: ((object: Object3D) => void)[] = [];\n public onRemoveFromSelection: ((object: Object3D) => void)[] = [];\n // #endregion\n\n public constructor(canvas: HTMLCanvasElement, camera: Camera, objects: Object3D[] = []) {\n this.canvas = canvas;\n this.canvas.addEventListener('pointerdown', this.trySelectCallback);\n\n this.camera = camera;\n this.objects = objects;\n\n this.raycaster = new Raycaster();\n }\n\n public setCanvas(canvas: HTMLCanvasElement): Selector {\n this.canvas.removeEventListener('pointerdown', this.trySelectCallback);\n this.canvas = canvas;\n this.canvas.addEventListener('pointerdown', this.trySelectCallback);\n return this;\n }\n\n public setCamera(camera: Camera): Selector {\n this.camera = camera;\n return this;\n }\n\n public setObjects(objects: Object3D[]): Selector {\n this.objects.splice(0);\n this.objects.push(...objects);\n return this;\n }\n\n public setContext(canvas: HTMLCanvasElement, camera: Camera, objects: Object3D[]): Selector {\n return this.setCanvas(canvas).setCamera(camera).setObjects(objects);\n }\n\n public addObjects(...objects: Object3D[]): Selector {\n this.objects.push(...objects);\n return this;\n }\n\n public addToSelection(object: Object3D): Selector {\n if (this.selection.some((object) => object.uuid === object.uuid)) return this;\n\n this.selection.push(object);\n for (const callback of this.onAddToSelection) callback(object);\n return this;\n }\n\n public removeFromSelection(object: Object3D): Selector {\n const index = this.selection.findIndex((object) => object.uuid === object.uuid);\n if (index === -1) return this;\n\n this.selection.push(object);\n for (const callback of this.onRemoveFromSelection) callback(object);\n return this;\n }\n\n public clearSelection(): Selector {\n this.selection.forEach((object) => this.removeFromSelection(object));\n return this;\n }\n\n private trySelect(event: PointerEvent): Object3D | null {\n if (!this.enabled || this.objects.length === 0) return null;\n\n const ndc = Coordinates.getNormalizedDeviceCoordinates(event, this.canvas);\n const coordinates = new Vector2(ndc[0], ndc[1]);\n this.raycaster.setFromCamera(coordinates, this.camera);\n\n const objs = this.filterVisible ? this.objects.filter((obj) => obj.visible) : this.objects;\n const intersections = this.raycaster.intersectObjects(objs);\n\n if (intersections.length === 0) {\n if (this.clearSelectionOnSelectNothing) this.clearSelection();\n return null;\n }\n\n this.addToSelection(intersections[0].object);\n return intersections[0].object;\n }\n}\n"],"mappings":";AAAA,SAA2B,WAAW,eAAe;AACrD,SAAS,mBAAmB;AAErB,IAAM,WAAN,MAAe;AAAA;AAAA,EAsBb,YAAY,QAA2B,QAAgB,UAAsB,CAAC,GAAG;AArBxF,SAAO,UAAmB;AAE1B,SAAiB,YAAwB,CAAC;AAO1C;AAAA,SAAO,gBAAyB;AAChC,SAAO,gCAAyC;AAIhD;AAAA;AAAA,SAAQ,oBAAoB,CAAC,UAAwB;AACnD,WAAK,UAAU,KAAK;AAAA,IACtB;AACA,SAAO,mBAAmD,CAAC;AAC3D,SAAO,wBAAwD,CAAC;AAI9D,SAAK,SAAS;AACd,SAAK,OAAO,iBAAiB,eAAe,KAAK,iBAAiB;AAElE,SAAK,SAAS;AACd,SAAK,UAAU;AAEf,SAAK,YAAY,IAAI,UAAU;AAAA,EACjC;AAAA,EAEO,UAAU,QAAqC;AACpD,SAAK,OAAO,oBAAoB,eAAe,KAAK,iBAAiB;AACrE,SAAK,SAAS;AACd,SAAK,OAAO,iBAAiB,eAAe,KAAK,iBAAiB;AAClE,WAAO;AAAA,EACT;AAAA,EAEO,UAAU,QAA0B;AACzC,SAAK,SAAS;AACd,WAAO;AAAA,EACT;AAAA,EAEO,WAAW,SAA+B;AAC/C,SAAK,QAAQ,OAAO,CAAC;AACrB,SAAK,QAAQ,KAAK,GAAG,OAAO;AAC5B,WAAO;AAAA,EACT;AAAA,EAEO,WAAW,QAA2B,QAAgB,SAA+B;AAC1F,WAAO,KAAK,UAAU,MAAM,EAAE,UAAU,MAAM,EAAE,WAAW,OAAO;AAAA,EACpE;AAAA,EAEO,cAAc,SAA+B;AAClD,SAAK,QAAQ,KAAK,GAAG,OAAO;AAC5B,WAAO;AAAA,EACT;AAAA,EAEO,eAAe,QAA4B;AAChD,QAAI,KAAK,UAAU,KAAK,CAACA,YAAWA,QAAO,SAASA,QAAO,IAAI,EAAG,QAAO;AAEzE,SAAK,UAAU,KAAK,MAAM;AAC1B,eAAW,YAAY,KAAK,iBAAkB,UAAS,MAAM;AAC7D,WAAO;AAAA,EACT;AAAA,EAEO,oBAAoB,QAA4B;AACrD,UAAM,QAAQ,KAAK,UAAU,UAAU,CAACA,YAAWA,QAAO,SAASA,QAAO,IAAI;AAC9E,QAAI,UAAU,GAAI,QAAO;AAEzB,SAAK,UAAU,KAAK,MAAM;AAC1B,eAAW,YAAY,KAAK,sBAAuB,UAAS,MAAM;AAClE,WAAO;AAAA,EACT;AAAA,EAEO,iBAA2B;AAChC,SAAK,UAAU,QAAQ,CAAC,WAAW,KAAK,oBAAoB,MAAM,CAAC;AACnE,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU,OAAsC;AACtD,QAAI,CAAC,KAAK,WAAW,KAAK,QAAQ,WAAW,EAAG,QAAO;AAEvD,UAAM,MAAM,YAAY,+BAA+B,OAAO,KAAK,MAAM;AACzE,UAAM,cAAc,IAAI,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC9C,SAAK,UAAU,cAAc,aAAa,KAAK,MAAM;AAErD,UAAM,OAAO,KAAK,gBAAgB,KAAK,QAAQ,OAAO,CAAC,QAAQ,IAAI,OAAO,IAAI,KAAK;AACnF,UAAM,gBAAgB,KAAK,UAAU,iBAAiB,IAAI;AAE1D,QAAI,cAAc,WAAW,GAAG;AAC9B,UAAI,KAAK,8BAA+B,MAAK,eAAe;AAC5D,aAAO;AAAA,IACT;AAEA,SAAK,eAAe,cAAc,CAAC,EAAE,MAAM;AAC3C,WAAO,cAAc,CAAC,EAAE;AAAA,EAC1B;AACF;","names":["object"]}
1
+ {"version":3,"sources":["../src/selector.ts"],"sourcesContent":["import { Camera, Object3D, Raycaster, Vector2 } from 'three';\nimport { Coordinates } from 'core-toolkit';\n\nexport class Selector {\n public enabled: boolean = true;\n\n public readonly selection: Object3D[] = [];\n private canvas: HTMLCanvasElement;\n private camera: Camera;\n private readonly objects: Object3D[];\n private readonly raycaster: Raycaster;\n\n // #region Parameters\n public filterVisible: boolean = true;\n public clearSelectionOnSelectNothing: boolean = true;\n // #endregion\n\n // #region Callbacks\n private trySelectCallback = (event: PointerEvent) => {\n this.trySelect(event);\n };\n public onAddToSelection: ((object: Object3D) => void)[] = [];\n public onRemoveFromSelection: ((object: Object3D) => void)[] = [];\n // #endregion\n\n public constructor(canvas: HTMLCanvasElement, camera: Camera, objects: Object3D[] = []) {\n this.canvas = canvas;\n this.canvas.addEventListener('pointerdown', this.trySelectCallback);\n\n this.camera = camera;\n this.objects = objects;\n\n this.raycaster = new Raycaster();\n }\n\n public setCanvas(canvas: HTMLCanvasElement): Selector {\n this.canvas.removeEventListener('pointerdown', this.trySelectCallback);\n this.canvas = canvas;\n this.canvas.addEventListener('pointerdown', this.trySelectCallback);\n return this;\n }\n\n public setCamera(camera: Camera): Selector {\n this.camera = camera;\n return this;\n }\n\n public setObjects(objects: Object3D[]): Selector {\n this.objects.splice(0);\n this.objects.push(...objects);\n return this;\n }\n\n public setContext(canvas: HTMLCanvasElement, camera: Camera, objects: Object3D[]): Selector {\n return this.setCanvas(canvas).setCamera(camera).setObjects(objects);\n }\n\n public addObjects(...objects: Object3D[]): Selector {\n this.objects.push(...objects);\n return this;\n }\n\n public addToSelection(object: Object3D): Selector {\n if (this.selection.some((object) => object.uuid === object.uuid)) return this;\n\n this.selection.push(object);\n for (const callback of this.onAddToSelection) callback(object);\n return this;\n }\n\n public removeFromSelection(object: Object3D): Selector {\n const index = this.selection.findIndex((object) => object.uuid === object.uuid);\n if (index === -1) return this;\n\n this.selection.push(object);\n for (const callback of this.onRemoveFromSelection) callback(object);\n return this;\n }\n\n public clearSelection(): Selector {\n this.selection.forEach((object) => this.removeFromSelection(object));\n return this;\n }\n\n private trySelect(event: PointerEvent): Object3D | null {\n if (!this.enabled || this.objects.length === 0) return null;\n\n const ndc = Coordinates.getNormalizedDeviceCoordinates(event, this.canvas);\n const coordinates = new Vector2(ndc[0], ndc[1]);\n this.raycaster.setFromCamera(coordinates, this.camera);\n\n const objs = this.filterVisible ? this.objects.filter((obj) => obj.visible) : this.objects;\n const intersections = this.raycaster.intersectObjects(objs);\n\n if (intersections.length === 0) {\n if (this.clearSelectionOnSelectNothing) this.clearSelection();\n return null;\n }\n\n this.addToSelection(intersections[0].object);\n return intersections[0].object;\n }\n}\n"],"mappings":";AAAA,SAA2B,WAAW,eAAe;AACrD,SAAS,mBAAmB;AAErB,IAAM,WAAN,MAAe;AAAA;AAAA,EAsBb,YAAY,QAA2B,QAAgB,UAAsB,CAAC,GAAG;AArBxF,SAAO,UAAmB;AAE1B,SAAgB,YAAwB,CAAC;AAOzC;AAAA,SAAO,gBAAyB;AAChC,SAAO,gCAAyC;AAIhD;AAAA;AAAA,SAAQ,oBAAoB,CAAC,UAAwB;AACnD,WAAK,UAAU,KAAK;AAAA,IACtB;AACA,SAAO,mBAAmD,CAAC;AAC3D,SAAO,wBAAwD,CAAC;AAI9D,SAAK,SAAS;AACd,SAAK,OAAO,iBAAiB,eAAe,KAAK,iBAAiB;AAElE,SAAK,SAAS;AACd,SAAK,UAAU;AAEf,SAAK,YAAY,IAAI,UAAU;AAAA,EACjC;AAAA,EAEO,UAAU,QAAqC;AACpD,SAAK,OAAO,oBAAoB,eAAe,KAAK,iBAAiB;AACrE,SAAK,SAAS;AACd,SAAK,OAAO,iBAAiB,eAAe,KAAK,iBAAiB;AAClE,WAAO;AAAA,EACT;AAAA,EAEO,UAAU,QAA0B;AACzC,SAAK,SAAS;AACd,WAAO;AAAA,EACT;AAAA,EAEO,WAAW,SAA+B;AAC/C,SAAK,QAAQ,OAAO,CAAC;AACrB,SAAK,QAAQ,KAAK,GAAG,OAAO;AAC5B,WAAO;AAAA,EACT;AAAA,EAEO,WAAW,QAA2B,QAAgB,SAA+B;AAC1F,WAAO,KAAK,UAAU,MAAM,EAAE,UAAU,MAAM,EAAE,WAAW,OAAO;AAAA,EACpE;AAAA,EAEO,cAAc,SAA+B;AAClD,SAAK,QAAQ,KAAK,GAAG,OAAO;AAC5B,WAAO;AAAA,EACT;AAAA,EAEO,eAAe,QAA4B;AAChD,QAAI,KAAK,UAAU,KAAK,CAACA,YAAWA,QAAO,SAASA,QAAO,IAAI,EAAG,QAAO;AAEzE,SAAK,UAAU,KAAK,MAAM;AAC1B,eAAW,YAAY,KAAK,iBAAkB,UAAS,MAAM;AAC7D,WAAO;AAAA,EACT;AAAA,EAEO,oBAAoB,QAA4B;AACrD,UAAM,QAAQ,KAAK,UAAU,UAAU,CAACA,YAAWA,QAAO,SAASA,QAAO,IAAI;AAC9E,QAAI,UAAU,GAAI,QAAO;AAEzB,SAAK,UAAU,KAAK,MAAM;AAC1B,eAAW,YAAY,KAAK,sBAAuB,UAAS,MAAM;AAClE,WAAO;AAAA,EACT;AAAA,EAEO,iBAA2B;AAChC,SAAK,UAAU,QAAQ,CAAC,WAAW,KAAK,oBAAoB,MAAM,CAAC;AACnE,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU,OAAsC;AACtD,QAAI,CAAC,KAAK,WAAW,KAAK,QAAQ,WAAW,EAAG,QAAO;AAEvD,UAAM,MAAM,YAAY,+BAA+B,OAAO,KAAK,MAAM;AACzE,UAAM,cAAc,IAAI,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;AAC9C,SAAK,UAAU,cAAc,aAAa,KAAK,MAAM;AAErD,UAAM,OAAO,KAAK,gBAAgB,KAAK,QAAQ,OAAO,CAAC,QAAQ,IAAI,OAAO,IAAI,KAAK;AACnF,UAAM,gBAAgB,KAAK,UAAU,iBAAiB,IAAI;AAE1D,QAAI,cAAc,WAAW,GAAG;AAC9B,UAAI,KAAK,8BAA+B,MAAK,eAAe;AAC5D,aAAO;AAAA,IACT;AAEA,SAAK,eAAe,cAAc,CAAC,EAAE,MAAM;AAC3C,WAAO,cAAc,CAAC,EAAE;AAAA,EAC1B;AACF;","names":["object"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@viniciusgoncalves/three-toolkit",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "main": "dist/index.cjs",
5
5
  "module": "dist/index.mjs",
6
6
  "types": "dist/index.d.ts",