@combos-fun/plugin-renderer-3d-event 0.0.44 → 0.0.46

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.
package/agent-skill.md CHANGED
@@ -1,87 +1,80 @@
1
1
  # `@combos-fun/plugin-renderer-3d-event` — Agent notes
2
2
 
3
- Pointer / touch input for the 3D pipeline via Three.js `Raycaster`. Pointer events on the WebGL canvas are converted to NDC, raycast against tagged meshes, and forwarded as `tap` / `touchstart` / `touchmove` / `touchend` on the `Event3D` Component.
3
+ Pointer/touch picking for the 3D pipeline. Canvas pointer events are raycast through the active Three camera and emitted by `Event3D`.
4
4
 
5
- There is **no keyboard** API here (same as 2D `plugin-renderer-event`). `surface.input` in host templates is a design hint, not a runtime switch.
6
-
7
- ## When to read
8
-
9
- Read for any 3D input task: tap a mesh, drag, pick a model, or wire UI-like 3D objects.
5
+ Prerequisite: follow the parent `@combos-fun/plugin-renderer-3d` skill for system order, hierarchy, and object tagging. Use `Event3D`, not the 2D `Event`.
10
6
 
11
7
  ## Public API
12
8
 
13
9
  ```ts
14
10
  import {
15
- Event3DSystem,
16
11
  Event3D,
12
+ Event3DSystem,
17
13
  type Event3DParams,
14
+ type Event3DParam,
15
+ type Event3DHitArea,
16
+ type Event3DHitAreaType,
18
17
  type Event3DSystemParams,
19
18
  } from '@combos-fun/plugin-renderer-3d-event';
20
19
  ```
21
20
 
22
- `componentName = 'Event3D'`, `systemName = 'Event3DSystem'`. Use `game.getSystem(Event3DSystem)`, not a string.
21
+ `componentName = 'Event3D'`; `systemName = 'Event3DSystem'`; `Event3DSystemParams` is empty. This package has no keyboard API.
23
22
 
24
- Hit testing uses the GameObject's mesh (every 3D renderer tags `Object3D.userData.combosGameObjectId`). `InstancedMesh` hits use `intersection.instanceId` → `userData.combosInstanceGameObjectIds`.
23
+ ## Hit area
25
24
 
26
- Optional `hitArea` adds an invisible pick mesh (`box` / `sphere` / `plane`) under the `Transform3D` root use it for empty parents or a simpler volume than a GLB:
25
+ `Event3DParams` contains optional `hitArea`. Without one, officially tagged visual meshes are pickable. An invisible hit area also makes an empty GameObject pickable:
27
26
 
28
- ```ts
29
- new Event3D({
30
- hitArea: { type: 'box', width: 1, height: 2, depth: 1 },
31
- })
32
- ```
27
+ | Type | Fields and defaults |
28
+ |------|---------------------|
29
+ | `box` | `width: 1`, `height: 1`, `depth: 1` |
30
+ | `sphere` | `radius: 0.5` |
31
+ | `plane` | `width: 1`, `height: 1` |
33
32
 
34
- ### Events emitted by the `Event3D` component
33
+ Unknown hit-area types create no mesh. Changing `hitArea` disposes the previous geometry/material and creates a replacement.
35
34
 
36
- `touchstart`, `touchmove`, `touchend`, `tap`, `touchendoutside`, `touchcancel`.
35
+ ## Events and payload
37
36
 
38
- Callback payload:
37
+ Emitted names: `touchstart`, `touchmove`, `touchend`, `tap`, `touchendoutside`, `touchcancel`.
39
38
 
40
39
  ```ts
41
- (payload) => {
40
+ event3D.on('tap', (payload) => {
42
41
  payload.stopPropagation();
43
- payload.data.pointerId;
44
- payload.data.position; // canvas-pixel space
45
- payload.data.localPosition; // hit point in the mesh's local space (x/y/z)
46
- payload.gameObject;
47
- };
42
+ payload.data.pointerId; // browser pointer id
43
+ payload.data.position; // { x, y }, canvas-local CSS pixels
44
+ payload.data.localPosition; // { x, y, z }, intersected object's local space
45
+ payload.gameObject; // resolved tagged GameObject
46
+ });
48
47
  ```
49
48
 
50
- ## Required setup
51
-
52
- - Add `Renderer3DSystem` before `Event3DSystem`.
53
- - Put `Event3D` on the same GameObject as the visual (`Model3D`, `Graphics3D`, `Img3D`, …).
54
- - Meshes must already be in the scene (the matching 3D renderer system must be registered).
49
+ ## Runtime and lifecycle
55
50
 
56
- ## Runtime behaviour
51
+ - The nearest ray intersection that resolves to a GameObject with `Event3D` wins; intersections without `Event3D` are skipped.
52
+ - `touchstart` records the pressed target. `touchmove` emits only on the object currently under the pointer.
53
+ - Releasing on the original target emits `touchend` then `tap`.
54
+ - Releasing elsewhere emits `touchendoutside` on the pressed target; if another target is under the pointer, it also receives `touchend`.
55
+ - Pointer cancel/leave emits `touchcancel` on the pressed target.
56
+ - `stopPropagation()` forwards to the underlying browser event's `stopPropagation`.
57
+ - Removing `Event3D` removes its hit area, listeners, and pending pointer records. System destruction removes canvas listeners and all hit areas.
57
58
 
58
- - First raycast hit that belongs to a GameObject with `Event3D` wins.
59
- - `tap` fires on `pointerup` when the press and release hit the same GameObject.
60
- - `touchendoutside` fires when the pointer is released on a different object (or none).
59
+ ## Package-specific pitfalls
61
60
 
62
- ## Common pitfalls
63
-
64
- | Symptom | Fix |
65
- |---------|-----|
66
- | `tap` never fires | Add `Event3DSystem`, attach `Event3D` on the **same** GO as the mesh |
67
- | Hits the wrong object | First mesh along the ray wins; move the camera or the mesh |
68
- | Nothing is pickable | Confirm the 3D renderer tagged the mesh (official `plugin-renderer-3d-*` systems do) |
69
- | Using 2D `Event` / `EventSystem` in a 3D game | Use `Event3D` / `Event3DSystem` — Pixi hit-areas do not apply |
61
+ - Custom Three objects must be tagged through `attachVisual` or `tagObject3D`.
62
+ - A transparent hit area remains raycastable and can be the nearest hit.
63
+ - Pixi hit areas and 2D `EventSystem` do not participate in this raycast.
70
64
 
71
65
  ## Minimal example
72
66
 
73
67
  ```ts
74
- import { Event3D } from '@combos-fun/plugin-renderer-3d-event';
75
- import { Graphics3D } from '@combos-fun/plugin-renderer-3d-graphics';
76
-
77
68
  const box = new GameObject('box');
78
- box.addComponent(new Graphics3D({ shape: 'box', width: 1, height: 1, depth: 1, color: 0xffaa00 }));
79
- box.addComponent(new Event3D());
80
- box.getComponent(Event3D)!.on('tap', () => {
81
- /* handle */
69
+ box.addComponent(new Graphics3D({ shape: 'box', color: 0xffaa00 }));
70
+ box.addComponent(new Event3D({
71
+ hitArea: { type: 'box', width: 1, height: 1, depth: 1 },
72
+ }));
73
+ box.getComponent(Event3D)!.on('tap', ({ gameObject }) => {
74
+ // handle gameObject
82
75
  });
83
76
  ```
84
77
 
85
78
  ## Verification
86
79
 
87
- `pnpm --filter @combos-fun/plugin-renderer-3d-event run build`.
80
+ `pnpm --filter @combos-fun/plugin-renderer-3d-event run build`
@@ -6,6 +6,10 @@ var pluginRenderer3d = require('@combos-fun/plugin-renderer-3d');
6
6
  var three = require('three');
7
7
 
8
8
  class Event3D extends engine.Component {
9
+ constructor() {
10
+ super(...arguments);
11
+ this.hitArea = undefined;
12
+ }
9
13
  static { this.componentName = 'Event3D'; }
10
14
  init(params) {
11
15
  params && Object.assign(this, params);
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-renderer-3d-event.cjs.js","sources":["../lib/component.ts","../lib/system.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport type { GameObject } from '@combos-fun/engine';\n\ntype TouchEventName = 'touchstart' | 'touchmove' | 'touchend' | 'tap' | 'touchendoutside' | 'touchcancel';\n\nexport type Event3DHitAreaType = 'box' | 'sphere' | 'plane';\n\nexport interface Event3DHitArea {\n type: Event3DHitAreaType | string;\n width?: number;\n height?: number;\n depth?: number;\n radius?: number;\n}\n\nexport type Event3DParam = {\n stopPropagation: () => void,\n data: {\n pointerId: number,\n position: {\n x: number,\n y: number,\n },\n localPosition: {\n x: number,\n y: number,\n z: number,\n },\n },\n gameObject: GameObject,\n};\n\nexport interface Event3DParams {\n hitArea?: Event3DHitArea;\n}\n\nexport default class Event3D extends Component<Event3DParams> {\n static componentName = 'Event3D';\n\n hitArea?: Event3DHitArea;\n\n init(params?: Event3DParams) {\n params && Object.assign(this, params);\n }\n\n emit(eventName: TouchEventName, ...args: [Event3DParam]): boolean\n emit<T extends string>(eventName: Exclude<T, TouchEventName>, ...args: any[]): boolean\n emit(en: string, ...args: any[]) {\n return super.emit(en, ...args);\n }\n\n once(eventName: TouchEventName, fn: (arg: Event3DParam) => void, context?: any): this\n once<T extends string>(eventName: Exclude<T, TouchEventName>, fn: (...args: any[]) => void, context?: any): this\n once(en: string, fn: (...args: any[]) => void, context?: any) {\n return super.once(en, fn, context);\n }\n\n on(eventName: TouchEventName, fn: (arg: Event3DParam) => void, context?: any): this\n on<T extends string>(eventName: Exclude<T, TouchEventName>, fn: (...args: any[]) => void, context?: any): this\n on(en: string, fn: (...args: any[]) => void, context?: any) {\n return super.on(en, fn, context);\n }\n}\n","import { decorators, ComponentChanged, OBSERVER_TYPE, GameObject } from '@combos-fun/engine';\nimport {\n Renderer3D,\n Renderer3DSystem,\n gameObjectIdFromIntersection,\n tagObject3D,\n} from '@combos-fun/plugin-renderer-3d';\nimport {\n BoxGeometry,\n Mesh,\n MeshBasicMaterial,\n PlaneGeometry,\n Raycaster,\n SphereGeometry,\n Vector2,\n Vector3,\n} from 'three';\nimport Event3D from './component';\nimport type { Event3DHitArea } from './component';\n\nexport interface Event3DSystemParams {}\n\ninterface PointerHit {\n gameObject: GameObject;\n component: Event3D;\n local: Vector3;\n}\n\n@decorators.componentObserver({\n Event3D: [{ prop: ['hitArea'], deep: true }],\n})\nexport default class Event3DSystem extends Renderer3D {\n static systemName = 'Event3DSystem';\n name: string = 'Event3DSystem';\n\n private raycaster = new Raycaster();\n private ndc = new Vector2();\n private localScratch = new Vector3();\n private downByPointer = new Map<number, PointerHit>();\n private hitAreas = new Map<number, Mesh>();\n private canvas: HTMLCanvasElement | null = null;\n\n private onPointerDown = (e: PointerEvent) => this.handlePointer(e, 'touchstart');\n private onPointerMove = (e: PointerEvent) => this.handlePointer(e, 'touchmove');\n private onPointerUp = (e: PointerEvent) => this.handlePointer(e, 'touchend');\n private onPointerCancel = (e: PointerEvent) => this.handlePointer(e, 'touchcancel');\n\n init(_params?: Event3DSystemParams) {\n const renderer3DSystem = this.game.getSystem(Renderer3DSystem) as Renderer3DSystem;\n renderer3DSystem.rendererManager.register(this);\n\n this.canvas = this.threeContext.renderer.domElement;\n this.canvas.style.touchAction = 'none';\n this.canvas.addEventListener('pointerdown', this.onPointerDown);\n this.canvas.addEventListener('pointermove', this.onPointerMove);\n this.canvas.addEventListener('pointerup', this.onPointerUp);\n this.canvas.addEventListener('pointercancel', this.onPointerCancel);\n this.canvas.addEventListener('pointerleave', this.onPointerCancel);\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.componentName !== 'Event3D') return;\n const component = changed.component as Event3D;\n if (changed.type === OBSERVER_TYPE.ADD) {\n this.syncHitArea(changed.gameObject, component);\n return;\n }\n if (changed.type === OBSERVER_TYPE.CHANGE) {\n this.syncHitArea(changed.gameObject, component);\n return;\n }\n if (changed.type === OBSERVER_TYPE.REMOVE) {\n this.removeHitArea(changed.gameObject.id);\n changed.component.removeAllListeners();\n for (const [pointerId, hit] of this.downByPointer) {\n if (hit.gameObject.id === changed.gameObject.id) {\n this.downByPointer.delete(pointerId);\n }\n }\n }\n }\n\n private syncHitArea(gameObject: GameObject, component: Event3D) {\n this.removeHitArea(gameObject.id);\n if (!component.hitArea) return;\n const mesh = this.createHitAreaMesh(component.hitArea);\n if (!mesh) return;\n tagObject3D(mesh, gameObject.id);\n mesh.name = '__hitArea';\n this.threeContext.attachVisual(gameObject.id, mesh, gameObject);\n this.hitAreas.set(gameObject.id, mesh);\n }\n\n private createHitAreaMesh(hitArea: Event3DHitArea): Mesh | null {\n const type = String(hitArea.type || 'box').toLowerCase();\n let geometry;\n if (type === 'sphere') {\n geometry = new SphereGeometry(hitArea.radius ?? 0.5, 16, 12);\n } else if (type === 'plane') {\n geometry = new PlaneGeometry(hitArea.width ?? 1, hitArea.height ?? 1);\n } else if (type === 'box') {\n geometry = new BoxGeometry(hitArea.width ?? 1, hitArea.height ?? 1, hitArea.depth ?? 1);\n } else {\n return null;\n }\n const material = new MeshBasicMaterial({\n transparent: true,\n opacity: 0,\n depthWrite: false,\n });\n const mesh = new Mesh(geometry, material);\n mesh.visible = true;\n return mesh;\n }\n\n private removeHitArea(id: number) {\n const mesh = this.hitAreas.get(id);\n if (!mesh) return;\n this.threeContext.detachVisual(id, mesh);\n mesh.geometry.dispose();\n (mesh.material as MeshBasicMaterial).dispose();\n this.hitAreas.delete(id);\n }\n\n rendererUpdate(_gameObject: GameObject) {}\n\n onDestroy() {\n if (!this.canvas) return;\n this.canvas.removeEventListener('pointerdown', this.onPointerDown);\n this.canvas.removeEventListener('pointermove', this.onPointerMove);\n this.canvas.removeEventListener('pointerup', this.onPointerUp);\n this.canvas.removeEventListener('pointercancel', this.onPointerCancel);\n this.canvas.removeEventListener('pointerleave', this.onPointerCancel);\n this.canvas = null;\n this.downByPointer.clear();\n for (const [id] of this.hitAreas) {\n this.removeHitArea(id);\n }\n this.hitAreas.clear();\n }\n\n private handlePointer(e: PointerEvent, kind: 'touchstart' | 'touchmove' | 'touchend' | 'touchcancel') {\n const hit = this.hitFromEvent(e);\n const canvasPos = this.canvasPosition(e);\n\n if (kind === 'touchstart') {\n if (!hit) return;\n this.downByPointer.set(e.pointerId, hit);\n this.emitOn(hit, 'touchstart', e, canvasPos);\n return;\n }\n\n if (kind === 'touchmove') {\n if (!hit) return;\n this.emitOn(hit, 'touchmove', e, canvasPos);\n return;\n }\n\n const down = this.downByPointer.get(e.pointerId);\n this.downByPointer.delete(e.pointerId);\n\n if (kind === 'touchcancel') {\n if (down) this.emitOn(down, 'touchcancel', e, canvasPos);\n return;\n }\n\n if (hit && down && hit.gameObject.id === down.gameObject.id) {\n this.emitOn(hit, 'touchend', e, canvasPos);\n this.emitOn(hit, 'tap', e, canvasPos);\n return;\n }\n\n if (down) {\n this.emitOn(down, 'touchendoutside', e, canvasPos);\n }\n if (hit) {\n this.emitOn(hit, 'touchend', e, canvasPos);\n }\n }\n\n private emitOn(\n hit: PointerHit,\n eventName: 'touchstart' | 'touchmove' | 'touchend' | 'tap' | 'touchendoutside' | 'touchcancel',\n e: PointerEvent,\n canvasPos: { x: number; y: number },\n ) {\n let stopped = false;\n hit.component.emit(eventName, {\n stopPropagation: () => { stopped = true; },\n data: {\n pointerId: e.pointerId,\n position: canvasPos,\n localPosition: {\n x: hit.local.x,\n y: hit.local.y,\n z: hit.local.z,\n },\n },\n gameObject: hit.gameObject,\n });\n if (stopped) {\n e.stopPropagation();\n }\n }\n\n private canvasPosition(e: PointerEvent) {\n const rect = this.canvas.getBoundingClientRect();\n return {\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n };\n }\n\n private hitFromEvent(e: PointerEvent): PointerHit | null {\n if (!this.canvas) return null;\n const rect = this.canvas.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return null;\n\n this.ndc.set(\n ((e.clientX - rect.left) / rect.width) * 2 - 1,\n -((e.clientY - rect.top) / rect.height) * 2 + 1,\n );\n this.raycaster.setFromCamera(this.ndc, this.threeContext.camera);\n const intersections = this.raycaster.intersectObjects(this.threeContext.scene.children, true);\n\n for (const intersection of intersections) {\n const id = gameObjectIdFromIntersection(intersection);\n if (id == null) continue;\n const gameObject = this.game.gameObjects.find((go) => go.id === id);\n if (!gameObject) continue;\n const component = gameObject.getComponent(Event3D) as Event3D | undefined;\n if (!component) continue;\n\n this.localScratch.copy(intersection.point);\n intersection.object.worldToLocal(this.localScratch);\n return {\n gameObject,\n component,\n local: this.localScratch.clone(),\n };\n }\n return null;\n }\n}\n"],"names":["Component","Renderer3D","Raycaster","Vector2","Vector3","Renderer3DSystem","OBSERVER_TYPE","tagObject3D","SphereGeometry","PlaneGeometry","BoxGeometry","MeshBasicMaterial","Mesh","gameObjectIdFromIntersection","__decorate","decorators"],"mappings":"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"}
1
+ {"version":3,"file":"plugin-renderer-3d-event.cjs.js","sources":["../lib/component.ts","../lib/system.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport type { GameObject } from '@combos-fun/engine';\n\ntype TouchEventName = 'touchstart' | 'touchmove' | 'touchend' | 'tap' | 'touchendoutside' | 'touchcancel';\n\nexport type Event3DHitAreaType = 'box' | 'sphere' | 'plane';\n\nexport interface Event3DHitArea {\n type: Event3DHitAreaType | string;\n width?: number;\n height?: number;\n depth?: number;\n radius?: number;\n}\n\nexport type Event3DParam = {\n stopPropagation: () => void,\n data: {\n pointerId: number,\n position: {\n x: number,\n y: number,\n },\n localPosition: {\n x: number,\n y: number,\n z: number,\n },\n },\n gameObject: GameObject,\n};\n\nexport interface Event3DParams {\n hitArea?: Event3DHitArea;\n}\n\nexport default class Event3D extends Component<Event3DParams> {\n static componentName = 'Event3D';\n\n hitArea: Event3DHitArea = undefined;\n\n init(params?: Event3DParams) {\n params && Object.assign(this, params);\n }\n\n emit(eventName: TouchEventName, ...args: [Event3DParam]): boolean\n emit<T extends string>(eventName: Exclude<T, TouchEventName>, ...args: any[]): boolean\n emit(en: string, ...args: any[]) {\n return super.emit(en, ...args);\n }\n\n once(eventName: TouchEventName, fn: (arg: Event3DParam) => void, context?: any): this\n once<T extends string>(eventName: Exclude<T, TouchEventName>, fn: (...args: any[]) => void, context?: any): this\n once(en: string, fn: (...args: any[]) => void, context?: any) {\n return super.once(en, fn, context);\n }\n\n on(eventName: TouchEventName, fn: (arg: Event3DParam) => void, context?: any): this\n on<T extends string>(eventName: Exclude<T, TouchEventName>, fn: (...args: any[]) => void, context?: any): this\n on(en: string, fn: (...args: any[]) => void, context?: any) {\n return super.on(en, fn, context);\n }\n}\n","import { decorators, ComponentChanged, OBSERVER_TYPE, GameObject } from '@combos-fun/engine';\nimport {\n Renderer3D,\n Renderer3DSystem,\n gameObjectIdFromIntersection,\n tagObject3D,\n} from '@combos-fun/plugin-renderer-3d';\nimport {\n BoxGeometry,\n Mesh,\n MeshBasicMaterial,\n PlaneGeometry,\n Raycaster,\n SphereGeometry,\n Vector2,\n Vector3,\n} from 'three';\nimport Event3D from './component';\nimport type { Event3DHitArea } from './component';\n\nexport interface Event3DSystemParams {}\n\ninterface PointerHit {\n gameObject: GameObject;\n component: Event3D;\n local: Vector3;\n}\n\n@decorators.componentObserver({\n Event3D: [{ prop: ['hitArea'], deep: true }],\n})\nexport default class Event3DSystem extends Renderer3D {\n static systemName = 'Event3DSystem';\n name: string = 'Event3DSystem';\n\n private raycaster = new Raycaster();\n private ndc = new Vector2();\n private localScratch = new Vector3();\n private downByPointer = new Map<number, PointerHit>();\n private hitAreas = new Map<number, Mesh>();\n private canvas: HTMLCanvasElement | null = null;\n\n private onPointerDown = (e: PointerEvent) => this.handlePointer(e, 'touchstart');\n private onPointerMove = (e: PointerEvent) => this.handlePointer(e, 'touchmove');\n private onPointerUp = (e: PointerEvent) => this.handlePointer(e, 'touchend');\n private onPointerCancel = (e: PointerEvent) => this.handlePointer(e, 'touchcancel');\n\n init(_params?: Event3DSystemParams) {\n const renderer3DSystem = this.game.getSystem(Renderer3DSystem) as Renderer3DSystem;\n renderer3DSystem.rendererManager.register(this);\n\n this.canvas = this.threeContext.renderer.domElement;\n this.canvas.style.touchAction = 'none';\n this.canvas.addEventListener('pointerdown', this.onPointerDown);\n this.canvas.addEventListener('pointermove', this.onPointerMove);\n this.canvas.addEventListener('pointerup', this.onPointerUp);\n this.canvas.addEventListener('pointercancel', this.onPointerCancel);\n this.canvas.addEventListener('pointerleave', this.onPointerCancel);\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.componentName !== 'Event3D') return;\n const component = changed.component as Event3D;\n if (changed.type === OBSERVER_TYPE.ADD) {\n this.syncHitArea(changed.gameObject, component);\n return;\n }\n if (changed.type === OBSERVER_TYPE.CHANGE) {\n this.syncHitArea(changed.gameObject, component);\n return;\n }\n if (changed.type === OBSERVER_TYPE.REMOVE) {\n this.removeHitArea(changed.gameObject.id);\n changed.component.removeAllListeners();\n for (const [pointerId, hit] of this.downByPointer) {\n if (hit.gameObject.id === changed.gameObject.id) {\n this.downByPointer.delete(pointerId);\n }\n }\n }\n }\n\n private syncHitArea(gameObject: GameObject, component: Event3D) {\n this.removeHitArea(gameObject.id);\n if (!component.hitArea) return;\n const mesh = this.createHitAreaMesh(component.hitArea);\n if (!mesh) return;\n tagObject3D(mesh, gameObject.id);\n mesh.name = '__hitArea';\n this.threeContext.attachVisual(gameObject.id, mesh, gameObject);\n this.hitAreas.set(gameObject.id, mesh);\n }\n\n private createHitAreaMesh(hitArea: Event3DHitArea): Mesh | null {\n const type = String(hitArea.type || 'box').toLowerCase();\n let geometry;\n if (type === 'sphere') {\n geometry = new SphereGeometry(hitArea.radius ?? 0.5, 16, 12);\n } else if (type === 'plane') {\n geometry = new PlaneGeometry(hitArea.width ?? 1, hitArea.height ?? 1);\n } else if (type === 'box') {\n geometry = new BoxGeometry(hitArea.width ?? 1, hitArea.height ?? 1, hitArea.depth ?? 1);\n } else {\n return null;\n }\n const material = new MeshBasicMaterial({\n transparent: true,\n opacity: 0,\n depthWrite: false,\n });\n const mesh = new Mesh(geometry, material);\n mesh.visible = true;\n return mesh;\n }\n\n private removeHitArea(id: number) {\n const mesh = this.hitAreas.get(id);\n if (!mesh) return;\n this.threeContext.detachVisual(id, mesh);\n mesh.geometry.dispose();\n (mesh.material as MeshBasicMaterial).dispose();\n this.hitAreas.delete(id);\n }\n\n rendererUpdate(_gameObject: GameObject) {}\n\n onDestroy() {\n if (!this.canvas) return;\n this.canvas.removeEventListener('pointerdown', this.onPointerDown);\n this.canvas.removeEventListener('pointermove', this.onPointerMove);\n this.canvas.removeEventListener('pointerup', this.onPointerUp);\n this.canvas.removeEventListener('pointercancel', this.onPointerCancel);\n this.canvas.removeEventListener('pointerleave', this.onPointerCancel);\n this.canvas = null;\n this.downByPointer.clear();\n for (const [id] of this.hitAreas) {\n this.removeHitArea(id);\n }\n this.hitAreas.clear();\n }\n\n private handlePointer(e: PointerEvent, kind: 'touchstart' | 'touchmove' | 'touchend' | 'touchcancel') {\n const hit = this.hitFromEvent(e);\n const canvasPos = this.canvasPosition(e);\n\n if (kind === 'touchstart') {\n if (!hit) return;\n this.downByPointer.set(e.pointerId, hit);\n this.emitOn(hit, 'touchstart', e, canvasPos);\n return;\n }\n\n if (kind === 'touchmove') {\n if (!hit) return;\n this.emitOn(hit, 'touchmove', e, canvasPos);\n return;\n }\n\n const down = this.downByPointer.get(e.pointerId);\n this.downByPointer.delete(e.pointerId);\n\n if (kind === 'touchcancel') {\n if (down) this.emitOn(down, 'touchcancel', e, canvasPos);\n return;\n }\n\n if (hit && down && hit.gameObject.id === down.gameObject.id) {\n this.emitOn(hit, 'touchend', e, canvasPos);\n this.emitOn(hit, 'tap', e, canvasPos);\n return;\n }\n\n if (down) {\n this.emitOn(down, 'touchendoutside', e, canvasPos);\n }\n if (hit) {\n this.emitOn(hit, 'touchend', e, canvasPos);\n }\n }\n\n private emitOn(\n hit: PointerHit,\n eventName: 'touchstart' | 'touchmove' | 'touchend' | 'tap' | 'touchendoutside' | 'touchcancel',\n e: PointerEvent,\n canvasPos: { x: number; y: number },\n ) {\n let stopped = false;\n hit.component.emit(eventName, {\n stopPropagation: () => { stopped = true; },\n data: {\n pointerId: e.pointerId,\n position: canvasPos,\n localPosition: {\n x: hit.local.x,\n y: hit.local.y,\n z: hit.local.z,\n },\n },\n gameObject: hit.gameObject,\n });\n if (stopped) {\n e.stopPropagation();\n }\n }\n\n private canvasPosition(e: PointerEvent) {\n const rect = this.canvas.getBoundingClientRect();\n return {\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n };\n }\n\n private hitFromEvent(e: PointerEvent): PointerHit | null {\n if (!this.canvas) return null;\n const rect = this.canvas.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return null;\n\n this.ndc.set(\n ((e.clientX - rect.left) / rect.width) * 2 - 1,\n -((e.clientY - rect.top) / rect.height) * 2 + 1,\n );\n this.raycaster.setFromCamera(this.ndc, this.threeContext.camera);\n const intersections = this.raycaster.intersectObjects(this.threeContext.scene.children, true);\n\n for (const intersection of intersections) {\n const id = gameObjectIdFromIntersection(intersection);\n if (id == null) continue;\n const gameObject = this.game.gameObjects.find((go) => go.id === id);\n if (!gameObject) continue;\n const component = gameObject.getComponent(Event3D) as Event3D | undefined;\n if (!component) continue;\n\n this.localScratch.copy(intersection.point);\n intersection.object.worldToLocal(this.localScratch);\n return {\n gameObject,\n component,\n local: this.localScratch.clone(),\n };\n }\n return null;\n }\n}\n"],"names":["Component","Renderer3D","Raycaster","Vector2","Vector3","Renderer3DSystem","OBSERVER_TYPE","tagObject3D","SphereGeometry","PlaneGeometry","BoxGeometry","MeshBasicMaterial","Mesh","gameObjectIdFromIntersection","__decorate","decorators"],"mappings":"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"}
@@ -1 +1 @@
1
- "use strict";var e=require("tslib"),t=require("@combos-fun/engine"),n=require("@combos-fun/plugin-renderer-3d"),i=require("three");class o extends t.Component{static{this.componentName="Event3D"}init(e){e&&Object.assign(this,e)}emit(e,...t){return super.emit(e,...t)}once(e,t,n){return super.once(e,t,n)}on(e,t,n){return super.on(e,t,n)}}let s=class extends n.Renderer3D{constructor(){super(...arguments),this.name="Event3DSystem",this.raycaster=new i.Raycaster,this.ndc=new i.Vector2,this.localScratch=new i.Vector3,this.downByPointer=new Map,this.hitAreas=new Map,this.canvas=null,this.onPointerDown=e=>this.handlePointer(e,"touchstart"),this.onPointerMove=e=>this.handlePointer(e,"touchmove"),this.onPointerUp=e=>this.handlePointer(e,"touchend"),this.onPointerCancel=e=>this.handlePointer(e,"touchcancel")}static{this.systemName="Event3DSystem"}init(e){this.game.getSystem(n.Renderer3DSystem).rendererManager.register(this),this.canvas=this.threeContext.renderer.domElement,this.canvas.style.touchAction="none",this.canvas.addEventListener("pointerdown",this.onPointerDown),this.canvas.addEventListener("pointermove",this.onPointerMove),this.canvas.addEventListener("pointerup",this.onPointerUp),this.canvas.addEventListener("pointercancel",this.onPointerCancel),this.canvas.addEventListener("pointerleave",this.onPointerCancel)}componentChanged(e){if("Event3D"!==e.componentName)return;const n=e.component;if(e.type!==t.OBSERVER_TYPE.ADD)if(e.type!==t.OBSERVER_TYPE.CHANGE){if(e.type===t.OBSERVER_TYPE.REMOVE){this.removeHitArea(e.gameObject.id),e.component.removeAllListeners();for(const[t,n]of this.downByPointer)n.gameObject.id===e.gameObject.id&&this.downByPointer.delete(t)}}else this.syncHitArea(e.gameObject,n);else this.syncHitArea(e.gameObject,n)}syncHitArea(e,t){if(this.removeHitArea(e.id),!t.hitArea)return;const i=this.createHitAreaMesh(t.hitArea);i&&(n.tagObject3D(i,e.id),i.name="__hitArea",this.threeContext.attachVisual(e.id,i,e),this.hitAreas.set(e.id,i))}createHitAreaMesh(e){const t=String(e.type||"box").toLowerCase();let n;if("sphere"===t)n=new i.SphereGeometry(e.radius??.5,16,12);else if("plane"===t)n=new i.PlaneGeometry(e.width??1,e.height??1);else{if("box"!==t)return null;n=new i.BoxGeometry(e.width??1,e.height??1,e.depth??1)}const o=new i.MeshBasicMaterial({transparent:!0,opacity:0,depthWrite:!1}),s=new i.Mesh(n,o);return s.visible=!0,s}removeHitArea(e){const t=this.hitAreas.get(e);t&&(this.threeContext.detachVisual(e,t),t.geometry.dispose(),t.material.dispose(),this.hitAreas.delete(e))}rendererUpdate(e){}onDestroy(){if(this.canvas){this.canvas.removeEventListener("pointerdown",this.onPointerDown),this.canvas.removeEventListener("pointermove",this.onPointerMove),this.canvas.removeEventListener("pointerup",this.onPointerUp),this.canvas.removeEventListener("pointercancel",this.onPointerCancel),this.canvas.removeEventListener("pointerleave",this.onPointerCancel),this.canvas=null,this.downByPointer.clear();for(const[e]of this.hitAreas)this.removeHitArea(e);this.hitAreas.clear()}}handlePointer(e,t){const n=this.hitFromEvent(e),i=this.canvasPosition(e);if("touchstart"===t){if(!n)return;return this.downByPointer.set(e.pointerId,n),void this.emitOn(n,"touchstart",e,i)}if("touchmove"===t){if(!n)return;return void this.emitOn(n,"touchmove",e,i)}const o=this.downByPointer.get(e.pointerId);if(this.downByPointer.delete(e.pointerId),"touchcancel"!==t){if(n&&o&&n.gameObject.id===o.gameObject.id)return this.emitOn(n,"touchend",e,i),void this.emitOn(n,"tap",e,i);o&&this.emitOn(o,"touchendoutside",e,i),n&&this.emitOn(n,"touchend",e,i)}else o&&this.emitOn(o,"touchcancel",e,i)}emitOn(e,t,n,i){let o=!1;e.component.emit(t,{stopPropagation:()=>{o=!0},data:{pointerId:n.pointerId,position:i,localPosition:{x:e.local.x,y:e.local.y,z:e.local.z}},gameObject:e.gameObject}),o&&n.stopPropagation()}canvasPosition(e){const t=this.canvas.getBoundingClientRect();return{x:e.clientX-t.left,y:e.clientY-t.top}}hitFromEvent(e){if(!this.canvas)return null;const t=this.canvas.getBoundingClientRect();if(0===t.width||0===t.height)return null;this.ndc.set((e.clientX-t.left)/t.width*2-1,-(e.clientY-t.top)/t.height*2+1),this.raycaster.setFromCamera(this.ndc,this.threeContext.camera);const i=this.raycaster.intersectObjects(this.threeContext.scene.children,!0);for(const e of i){const t=n.gameObjectIdFromIntersection(e);if(null==t)continue;const i=this.game.gameObjects.find(e=>e.id===t);if(!i)continue;const s=i.getComponent(o);if(s)return this.localScratch.copy(e.point),e.object.worldToLocal(this.localScratch),{gameObject:i,component:s,local:this.localScratch.clone()}}return null}};s=e.__decorate([t.decorators.componentObserver({Event3D:[{prop:["hitArea"],deep:!0}]})],s);var r=s;exports.Event3D=o,exports.Event3DSystem=r;
1
+ "use strict";var e=require("tslib"),t=require("@combos-fun/engine"),n=require("@combos-fun/plugin-renderer-3d"),i=require("three");class o extends t.Component{constructor(){super(...arguments),this.hitArea=void 0}static{this.componentName="Event3D"}init(e){e&&Object.assign(this,e)}emit(e,...t){return super.emit(e,...t)}once(e,t,n){return super.once(e,t,n)}on(e,t,n){return super.on(e,t,n)}}let s=class extends n.Renderer3D{constructor(){super(...arguments),this.name="Event3DSystem",this.raycaster=new i.Raycaster,this.ndc=new i.Vector2,this.localScratch=new i.Vector3,this.downByPointer=new Map,this.hitAreas=new Map,this.canvas=null,this.onPointerDown=e=>this.handlePointer(e,"touchstart"),this.onPointerMove=e=>this.handlePointer(e,"touchmove"),this.onPointerUp=e=>this.handlePointer(e,"touchend"),this.onPointerCancel=e=>this.handlePointer(e,"touchcancel")}static{this.systemName="Event3DSystem"}init(e){this.game.getSystem(n.Renderer3DSystem).rendererManager.register(this),this.canvas=this.threeContext.renderer.domElement,this.canvas.style.touchAction="none",this.canvas.addEventListener("pointerdown",this.onPointerDown),this.canvas.addEventListener("pointermove",this.onPointerMove),this.canvas.addEventListener("pointerup",this.onPointerUp),this.canvas.addEventListener("pointercancel",this.onPointerCancel),this.canvas.addEventListener("pointerleave",this.onPointerCancel)}componentChanged(e){if("Event3D"!==e.componentName)return;const n=e.component;if(e.type!==t.OBSERVER_TYPE.ADD)if(e.type!==t.OBSERVER_TYPE.CHANGE){if(e.type===t.OBSERVER_TYPE.REMOVE){this.removeHitArea(e.gameObject.id),e.component.removeAllListeners();for(const[t,n]of this.downByPointer)n.gameObject.id===e.gameObject.id&&this.downByPointer.delete(t)}}else this.syncHitArea(e.gameObject,n);else this.syncHitArea(e.gameObject,n)}syncHitArea(e,t){if(this.removeHitArea(e.id),!t.hitArea)return;const i=this.createHitAreaMesh(t.hitArea);i&&(n.tagObject3D(i,e.id),i.name="__hitArea",this.threeContext.attachVisual(e.id,i,e),this.hitAreas.set(e.id,i))}createHitAreaMesh(e){const t=String(e.type||"box").toLowerCase();let n;if("sphere"===t)n=new i.SphereGeometry(e.radius??.5,16,12);else if("plane"===t)n=new i.PlaneGeometry(e.width??1,e.height??1);else{if("box"!==t)return null;n=new i.BoxGeometry(e.width??1,e.height??1,e.depth??1)}const o=new i.MeshBasicMaterial({transparent:!0,opacity:0,depthWrite:!1}),s=new i.Mesh(n,o);return s.visible=!0,s}removeHitArea(e){const t=this.hitAreas.get(e);t&&(this.threeContext.detachVisual(e,t),t.geometry.dispose(),t.material.dispose(),this.hitAreas.delete(e))}rendererUpdate(e){}onDestroy(){if(this.canvas){this.canvas.removeEventListener("pointerdown",this.onPointerDown),this.canvas.removeEventListener("pointermove",this.onPointerMove),this.canvas.removeEventListener("pointerup",this.onPointerUp),this.canvas.removeEventListener("pointercancel",this.onPointerCancel),this.canvas.removeEventListener("pointerleave",this.onPointerCancel),this.canvas=null,this.downByPointer.clear();for(const[e]of this.hitAreas)this.removeHitArea(e);this.hitAreas.clear()}}handlePointer(e,t){const n=this.hitFromEvent(e),i=this.canvasPosition(e);if("touchstart"===t){if(!n)return;return this.downByPointer.set(e.pointerId,n),void this.emitOn(n,"touchstart",e,i)}if("touchmove"===t){if(!n)return;return void this.emitOn(n,"touchmove",e,i)}const o=this.downByPointer.get(e.pointerId);if(this.downByPointer.delete(e.pointerId),"touchcancel"!==t){if(n&&o&&n.gameObject.id===o.gameObject.id)return this.emitOn(n,"touchend",e,i),void this.emitOn(n,"tap",e,i);o&&this.emitOn(o,"touchendoutside",e,i),n&&this.emitOn(n,"touchend",e,i)}else o&&this.emitOn(o,"touchcancel",e,i)}emitOn(e,t,n,i){let o=!1;e.component.emit(t,{stopPropagation:()=>{o=!0},data:{pointerId:n.pointerId,position:i,localPosition:{x:e.local.x,y:e.local.y,z:e.local.z}},gameObject:e.gameObject}),o&&n.stopPropagation()}canvasPosition(e){const t=this.canvas.getBoundingClientRect();return{x:e.clientX-t.left,y:e.clientY-t.top}}hitFromEvent(e){if(!this.canvas)return null;const t=this.canvas.getBoundingClientRect();if(0===t.width||0===t.height)return null;this.ndc.set((e.clientX-t.left)/t.width*2-1,-(e.clientY-t.top)/t.height*2+1),this.raycaster.setFromCamera(this.ndc,this.threeContext.camera);const i=this.raycaster.intersectObjects(this.threeContext.scene.children,!0);for(const e of i){const t=n.gameObjectIdFromIntersection(e);if(null==t)continue;const i=this.game.gameObjects.find(e=>e.id===t);if(!i)continue;const s=i.getComponent(o);if(s)return this.localScratch.copy(e.point),e.object.worldToLocal(this.localScratch),{gameObject:i,component:s,local:this.localScratch.clone()}}return null}};s=e.__decorate([t.decorators.componentObserver({Event3D:[{prop:["hitArea"],deep:!0}]})],s);var r=s;exports.Event3D=o,exports.Event3DSystem=r;
@@ -59,7 +59,7 @@ interface Event3DParams {
59
59
  }
60
60
  declare class Event3D extends Component<Event3DParams> {
61
61
  static componentName: string;
62
- hitArea?: Event3DHitArea;
62
+ hitArea: Event3DHitArea;
63
63
  init(params?: Event3DParams): void;
64
64
  emit(eventName: TouchEventName, ...args: [Event3DParam]): boolean;
65
65
  emit<T extends string>(eventName: Exclude<T, TouchEventName>, ...args: any[]): boolean;
@@ -4,6 +4,10 @@ import { Renderer3D, Renderer3DSystem, tagObject3D, gameObjectIdFromIntersection
4
4
  import { Raycaster, Vector2, Vector3, SphereGeometry, PlaneGeometry, BoxGeometry, MeshBasicMaterial, Mesh } from 'three';
5
5
 
6
6
  class Event3D extends Component {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.hitArea = undefined;
10
+ }
7
11
  static { this.componentName = 'Event3D'; }
8
12
  init(params) {
9
13
  params && Object.assign(this, params);
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-renderer-3d-event.esm.js","sources":["../lib/component.ts","../lib/system.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport type { GameObject } from '@combos-fun/engine';\n\ntype TouchEventName = 'touchstart' | 'touchmove' | 'touchend' | 'tap' | 'touchendoutside' | 'touchcancel';\n\nexport type Event3DHitAreaType = 'box' | 'sphere' | 'plane';\n\nexport interface Event3DHitArea {\n type: Event3DHitAreaType | string;\n width?: number;\n height?: number;\n depth?: number;\n radius?: number;\n}\n\nexport type Event3DParam = {\n stopPropagation: () => void,\n data: {\n pointerId: number,\n position: {\n x: number,\n y: number,\n },\n localPosition: {\n x: number,\n y: number,\n z: number,\n },\n },\n gameObject: GameObject,\n};\n\nexport interface Event3DParams {\n hitArea?: Event3DHitArea;\n}\n\nexport default class Event3D extends Component<Event3DParams> {\n static componentName = 'Event3D';\n\n hitArea?: Event3DHitArea;\n\n init(params?: Event3DParams) {\n params && Object.assign(this, params);\n }\n\n emit(eventName: TouchEventName, ...args: [Event3DParam]): boolean\n emit<T extends string>(eventName: Exclude<T, TouchEventName>, ...args: any[]): boolean\n emit(en: string, ...args: any[]) {\n return super.emit(en, ...args);\n }\n\n once(eventName: TouchEventName, fn: (arg: Event3DParam) => void, context?: any): this\n once<T extends string>(eventName: Exclude<T, TouchEventName>, fn: (...args: any[]) => void, context?: any): this\n once(en: string, fn: (...args: any[]) => void, context?: any) {\n return super.once(en, fn, context);\n }\n\n on(eventName: TouchEventName, fn: (arg: Event3DParam) => void, context?: any): this\n on<T extends string>(eventName: Exclude<T, TouchEventName>, fn: (...args: any[]) => void, context?: any): this\n on(en: string, fn: (...args: any[]) => void, context?: any) {\n return super.on(en, fn, context);\n }\n}\n","import { decorators, ComponentChanged, OBSERVER_TYPE, GameObject } from '@combos-fun/engine';\nimport {\n Renderer3D,\n Renderer3DSystem,\n gameObjectIdFromIntersection,\n tagObject3D,\n} from '@combos-fun/plugin-renderer-3d';\nimport {\n BoxGeometry,\n Mesh,\n MeshBasicMaterial,\n PlaneGeometry,\n Raycaster,\n SphereGeometry,\n Vector2,\n Vector3,\n} from 'three';\nimport Event3D from './component';\nimport type { Event3DHitArea } from './component';\n\nexport interface Event3DSystemParams {}\n\ninterface PointerHit {\n gameObject: GameObject;\n component: Event3D;\n local: Vector3;\n}\n\n@decorators.componentObserver({\n Event3D: [{ prop: ['hitArea'], deep: true }],\n})\nexport default class Event3DSystem extends Renderer3D {\n static systemName = 'Event3DSystem';\n name: string = 'Event3DSystem';\n\n private raycaster = new Raycaster();\n private ndc = new Vector2();\n private localScratch = new Vector3();\n private downByPointer = new Map<number, PointerHit>();\n private hitAreas = new Map<number, Mesh>();\n private canvas: HTMLCanvasElement | null = null;\n\n private onPointerDown = (e: PointerEvent) => this.handlePointer(e, 'touchstart');\n private onPointerMove = (e: PointerEvent) => this.handlePointer(e, 'touchmove');\n private onPointerUp = (e: PointerEvent) => this.handlePointer(e, 'touchend');\n private onPointerCancel = (e: PointerEvent) => this.handlePointer(e, 'touchcancel');\n\n init(_params?: Event3DSystemParams) {\n const renderer3DSystem = this.game.getSystem(Renderer3DSystem) as Renderer3DSystem;\n renderer3DSystem.rendererManager.register(this);\n\n this.canvas = this.threeContext.renderer.domElement;\n this.canvas.style.touchAction = 'none';\n this.canvas.addEventListener('pointerdown', this.onPointerDown);\n this.canvas.addEventListener('pointermove', this.onPointerMove);\n this.canvas.addEventListener('pointerup', this.onPointerUp);\n this.canvas.addEventListener('pointercancel', this.onPointerCancel);\n this.canvas.addEventListener('pointerleave', this.onPointerCancel);\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.componentName !== 'Event3D') return;\n const component = changed.component as Event3D;\n if (changed.type === OBSERVER_TYPE.ADD) {\n this.syncHitArea(changed.gameObject, component);\n return;\n }\n if (changed.type === OBSERVER_TYPE.CHANGE) {\n this.syncHitArea(changed.gameObject, component);\n return;\n }\n if (changed.type === OBSERVER_TYPE.REMOVE) {\n this.removeHitArea(changed.gameObject.id);\n changed.component.removeAllListeners();\n for (const [pointerId, hit] of this.downByPointer) {\n if (hit.gameObject.id === changed.gameObject.id) {\n this.downByPointer.delete(pointerId);\n }\n }\n }\n }\n\n private syncHitArea(gameObject: GameObject, component: Event3D) {\n this.removeHitArea(gameObject.id);\n if (!component.hitArea) return;\n const mesh = this.createHitAreaMesh(component.hitArea);\n if (!mesh) return;\n tagObject3D(mesh, gameObject.id);\n mesh.name = '__hitArea';\n this.threeContext.attachVisual(gameObject.id, mesh, gameObject);\n this.hitAreas.set(gameObject.id, mesh);\n }\n\n private createHitAreaMesh(hitArea: Event3DHitArea): Mesh | null {\n const type = String(hitArea.type || 'box').toLowerCase();\n let geometry;\n if (type === 'sphere') {\n geometry = new SphereGeometry(hitArea.radius ?? 0.5, 16, 12);\n } else if (type === 'plane') {\n geometry = new PlaneGeometry(hitArea.width ?? 1, hitArea.height ?? 1);\n } else if (type === 'box') {\n geometry = new BoxGeometry(hitArea.width ?? 1, hitArea.height ?? 1, hitArea.depth ?? 1);\n } else {\n return null;\n }\n const material = new MeshBasicMaterial({\n transparent: true,\n opacity: 0,\n depthWrite: false,\n });\n const mesh = new Mesh(geometry, material);\n mesh.visible = true;\n return mesh;\n }\n\n private removeHitArea(id: number) {\n const mesh = this.hitAreas.get(id);\n if (!mesh) return;\n this.threeContext.detachVisual(id, mesh);\n mesh.geometry.dispose();\n (mesh.material as MeshBasicMaterial).dispose();\n this.hitAreas.delete(id);\n }\n\n rendererUpdate(_gameObject: GameObject) {}\n\n onDestroy() {\n if (!this.canvas) return;\n this.canvas.removeEventListener('pointerdown', this.onPointerDown);\n this.canvas.removeEventListener('pointermove', this.onPointerMove);\n this.canvas.removeEventListener('pointerup', this.onPointerUp);\n this.canvas.removeEventListener('pointercancel', this.onPointerCancel);\n this.canvas.removeEventListener('pointerleave', this.onPointerCancel);\n this.canvas = null;\n this.downByPointer.clear();\n for (const [id] of this.hitAreas) {\n this.removeHitArea(id);\n }\n this.hitAreas.clear();\n }\n\n private handlePointer(e: PointerEvent, kind: 'touchstart' | 'touchmove' | 'touchend' | 'touchcancel') {\n const hit = this.hitFromEvent(e);\n const canvasPos = this.canvasPosition(e);\n\n if (kind === 'touchstart') {\n if (!hit) return;\n this.downByPointer.set(e.pointerId, hit);\n this.emitOn(hit, 'touchstart', e, canvasPos);\n return;\n }\n\n if (kind === 'touchmove') {\n if (!hit) return;\n this.emitOn(hit, 'touchmove', e, canvasPos);\n return;\n }\n\n const down = this.downByPointer.get(e.pointerId);\n this.downByPointer.delete(e.pointerId);\n\n if (kind === 'touchcancel') {\n if (down) this.emitOn(down, 'touchcancel', e, canvasPos);\n return;\n }\n\n if (hit && down && hit.gameObject.id === down.gameObject.id) {\n this.emitOn(hit, 'touchend', e, canvasPos);\n this.emitOn(hit, 'tap', e, canvasPos);\n return;\n }\n\n if (down) {\n this.emitOn(down, 'touchendoutside', e, canvasPos);\n }\n if (hit) {\n this.emitOn(hit, 'touchend', e, canvasPos);\n }\n }\n\n private emitOn(\n hit: PointerHit,\n eventName: 'touchstart' | 'touchmove' | 'touchend' | 'tap' | 'touchendoutside' | 'touchcancel',\n e: PointerEvent,\n canvasPos: { x: number; y: number },\n ) {\n let stopped = false;\n hit.component.emit(eventName, {\n stopPropagation: () => { stopped = true; },\n data: {\n pointerId: e.pointerId,\n position: canvasPos,\n localPosition: {\n x: hit.local.x,\n y: hit.local.y,\n z: hit.local.z,\n },\n },\n gameObject: hit.gameObject,\n });\n if (stopped) {\n e.stopPropagation();\n }\n }\n\n private canvasPosition(e: PointerEvent) {\n const rect = this.canvas.getBoundingClientRect();\n return {\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n };\n }\n\n private hitFromEvent(e: PointerEvent): PointerHit | null {\n if (!this.canvas) return null;\n const rect = this.canvas.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return null;\n\n this.ndc.set(\n ((e.clientX - rect.left) / rect.width) * 2 - 1,\n -((e.clientY - rect.top) / rect.height) * 2 + 1,\n );\n this.raycaster.setFromCamera(this.ndc, this.threeContext.camera);\n const intersections = this.raycaster.intersectObjects(this.threeContext.scene.children, true);\n\n for (const intersection of intersections) {\n const id = gameObjectIdFromIntersection(intersection);\n if (id == null) continue;\n const gameObject = this.game.gameObjects.find((go) => go.id === id);\n if (!gameObject) continue;\n const component = gameObject.getComponent(Event3D) as Event3D | undefined;\n if (!component) continue;\n\n this.localScratch.copy(intersection.point);\n intersection.object.worldToLocal(this.localScratch);\n return {\n gameObject,\n component,\n local: this.localScratch.clone(),\n };\n }\n return null;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin-renderer-3d-event.esm.js","sources":["../lib/component.ts","../lib/system.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport type { GameObject } from '@combos-fun/engine';\n\ntype TouchEventName = 'touchstart' | 'touchmove' | 'touchend' | 'tap' | 'touchendoutside' | 'touchcancel';\n\nexport type Event3DHitAreaType = 'box' | 'sphere' | 'plane';\n\nexport interface Event3DHitArea {\n type: Event3DHitAreaType | string;\n width?: number;\n height?: number;\n depth?: number;\n radius?: number;\n}\n\nexport type Event3DParam = {\n stopPropagation: () => void,\n data: {\n pointerId: number,\n position: {\n x: number,\n y: number,\n },\n localPosition: {\n x: number,\n y: number,\n z: number,\n },\n },\n gameObject: GameObject,\n};\n\nexport interface Event3DParams {\n hitArea?: Event3DHitArea;\n}\n\nexport default class Event3D extends Component<Event3DParams> {\n static componentName = 'Event3D';\n\n hitArea: Event3DHitArea = undefined;\n\n init(params?: Event3DParams) {\n params && Object.assign(this, params);\n }\n\n emit(eventName: TouchEventName, ...args: [Event3DParam]): boolean\n emit<T extends string>(eventName: Exclude<T, TouchEventName>, ...args: any[]): boolean\n emit(en: string, ...args: any[]) {\n return super.emit(en, ...args);\n }\n\n once(eventName: TouchEventName, fn: (arg: Event3DParam) => void, context?: any): this\n once<T extends string>(eventName: Exclude<T, TouchEventName>, fn: (...args: any[]) => void, context?: any): this\n once(en: string, fn: (...args: any[]) => void, context?: any) {\n return super.once(en, fn, context);\n }\n\n on(eventName: TouchEventName, fn: (arg: Event3DParam) => void, context?: any): this\n on<T extends string>(eventName: Exclude<T, TouchEventName>, fn: (...args: any[]) => void, context?: any): this\n on(en: string, fn: (...args: any[]) => void, context?: any) {\n return super.on(en, fn, context);\n }\n}\n","import { decorators, ComponentChanged, OBSERVER_TYPE, GameObject } from '@combos-fun/engine';\nimport {\n Renderer3D,\n Renderer3DSystem,\n gameObjectIdFromIntersection,\n tagObject3D,\n} from '@combos-fun/plugin-renderer-3d';\nimport {\n BoxGeometry,\n Mesh,\n MeshBasicMaterial,\n PlaneGeometry,\n Raycaster,\n SphereGeometry,\n Vector2,\n Vector3,\n} from 'three';\nimport Event3D from './component';\nimport type { Event3DHitArea } from './component';\n\nexport interface Event3DSystemParams {}\n\ninterface PointerHit {\n gameObject: GameObject;\n component: Event3D;\n local: Vector3;\n}\n\n@decorators.componentObserver({\n Event3D: [{ prop: ['hitArea'], deep: true }],\n})\nexport default class Event3DSystem extends Renderer3D {\n static systemName = 'Event3DSystem';\n name: string = 'Event3DSystem';\n\n private raycaster = new Raycaster();\n private ndc = new Vector2();\n private localScratch = new Vector3();\n private downByPointer = new Map<number, PointerHit>();\n private hitAreas = new Map<number, Mesh>();\n private canvas: HTMLCanvasElement | null = null;\n\n private onPointerDown = (e: PointerEvent) => this.handlePointer(e, 'touchstart');\n private onPointerMove = (e: PointerEvent) => this.handlePointer(e, 'touchmove');\n private onPointerUp = (e: PointerEvent) => this.handlePointer(e, 'touchend');\n private onPointerCancel = (e: PointerEvent) => this.handlePointer(e, 'touchcancel');\n\n init(_params?: Event3DSystemParams) {\n const renderer3DSystem = this.game.getSystem(Renderer3DSystem) as Renderer3DSystem;\n renderer3DSystem.rendererManager.register(this);\n\n this.canvas = this.threeContext.renderer.domElement;\n this.canvas.style.touchAction = 'none';\n this.canvas.addEventListener('pointerdown', this.onPointerDown);\n this.canvas.addEventListener('pointermove', this.onPointerMove);\n this.canvas.addEventListener('pointerup', this.onPointerUp);\n this.canvas.addEventListener('pointercancel', this.onPointerCancel);\n this.canvas.addEventListener('pointerleave', this.onPointerCancel);\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.componentName !== 'Event3D') return;\n const component = changed.component as Event3D;\n if (changed.type === OBSERVER_TYPE.ADD) {\n this.syncHitArea(changed.gameObject, component);\n return;\n }\n if (changed.type === OBSERVER_TYPE.CHANGE) {\n this.syncHitArea(changed.gameObject, component);\n return;\n }\n if (changed.type === OBSERVER_TYPE.REMOVE) {\n this.removeHitArea(changed.gameObject.id);\n changed.component.removeAllListeners();\n for (const [pointerId, hit] of this.downByPointer) {\n if (hit.gameObject.id === changed.gameObject.id) {\n this.downByPointer.delete(pointerId);\n }\n }\n }\n }\n\n private syncHitArea(gameObject: GameObject, component: Event3D) {\n this.removeHitArea(gameObject.id);\n if (!component.hitArea) return;\n const mesh = this.createHitAreaMesh(component.hitArea);\n if (!mesh) return;\n tagObject3D(mesh, gameObject.id);\n mesh.name = '__hitArea';\n this.threeContext.attachVisual(gameObject.id, mesh, gameObject);\n this.hitAreas.set(gameObject.id, mesh);\n }\n\n private createHitAreaMesh(hitArea: Event3DHitArea): Mesh | null {\n const type = String(hitArea.type || 'box').toLowerCase();\n let geometry;\n if (type === 'sphere') {\n geometry = new SphereGeometry(hitArea.radius ?? 0.5, 16, 12);\n } else if (type === 'plane') {\n geometry = new PlaneGeometry(hitArea.width ?? 1, hitArea.height ?? 1);\n } else if (type === 'box') {\n geometry = new BoxGeometry(hitArea.width ?? 1, hitArea.height ?? 1, hitArea.depth ?? 1);\n } else {\n return null;\n }\n const material = new MeshBasicMaterial({\n transparent: true,\n opacity: 0,\n depthWrite: false,\n });\n const mesh = new Mesh(geometry, material);\n mesh.visible = true;\n return mesh;\n }\n\n private removeHitArea(id: number) {\n const mesh = this.hitAreas.get(id);\n if (!mesh) return;\n this.threeContext.detachVisual(id, mesh);\n mesh.geometry.dispose();\n (mesh.material as MeshBasicMaterial).dispose();\n this.hitAreas.delete(id);\n }\n\n rendererUpdate(_gameObject: GameObject) {}\n\n onDestroy() {\n if (!this.canvas) return;\n this.canvas.removeEventListener('pointerdown', this.onPointerDown);\n this.canvas.removeEventListener('pointermove', this.onPointerMove);\n this.canvas.removeEventListener('pointerup', this.onPointerUp);\n this.canvas.removeEventListener('pointercancel', this.onPointerCancel);\n this.canvas.removeEventListener('pointerleave', this.onPointerCancel);\n this.canvas = null;\n this.downByPointer.clear();\n for (const [id] of this.hitAreas) {\n this.removeHitArea(id);\n }\n this.hitAreas.clear();\n }\n\n private handlePointer(e: PointerEvent, kind: 'touchstart' | 'touchmove' | 'touchend' | 'touchcancel') {\n const hit = this.hitFromEvent(e);\n const canvasPos = this.canvasPosition(e);\n\n if (kind === 'touchstart') {\n if (!hit) return;\n this.downByPointer.set(e.pointerId, hit);\n this.emitOn(hit, 'touchstart', e, canvasPos);\n return;\n }\n\n if (kind === 'touchmove') {\n if (!hit) return;\n this.emitOn(hit, 'touchmove', e, canvasPos);\n return;\n }\n\n const down = this.downByPointer.get(e.pointerId);\n this.downByPointer.delete(e.pointerId);\n\n if (kind === 'touchcancel') {\n if (down) this.emitOn(down, 'touchcancel', e, canvasPos);\n return;\n }\n\n if (hit && down && hit.gameObject.id === down.gameObject.id) {\n this.emitOn(hit, 'touchend', e, canvasPos);\n this.emitOn(hit, 'tap', e, canvasPos);\n return;\n }\n\n if (down) {\n this.emitOn(down, 'touchendoutside', e, canvasPos);\n }\n if (hit) {\n this.emitOn(hit, 'touchend', e, canvasPos);\n }\n }\n\n private emitOn(\n hit: PointerHit,\n eventName: 'touchstart' | 'touchmove' | 'touchend' | 'tap' | 'touchendoutside' | 'touchcancel',\n e: PointerEvent,\n canvasPos: { x: number; y: number },\n ) {\n let stopped = false;\n hit.component.emit(eventName, {\n stopPropagation: () => { stopped = true; },\n data: {\n pointerId: e.pointerId,\n position: canvasPos,\n localPosition: {\n x: hit.local.x,\n y: hit.local.y,\n z: hit.local.z,\n },\n },\n gameObject: hit.gameObject,\n });\n if (stopped) {\n e.stopPropagation();\n }\n }\n\n private canvasPosition(e: PointerEvent) {\n const rect = this.canvas.getBoundingClientRect();\n return {\n x: e.clientX - rect.left,\n y: e.clientY - rect.top,\n };\n }\n\n private hitFromEvent(e: PointerEvent): PointerHit | null {\n if (!this.canvas) return null;\n const rect = this.canvas.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return null;\n\n this.ndc.set(\n ((e.clientX - rect.left) / rect.width) * 2 - 1,\n -((e.clientY - rect.top) / rect.height) * 2 + 1,\n );\n this.raycaster.setFromCamera(this.ndc, this.threeContext.camera);\n const intersections = this.raycaster.intersectObjects(this.threeContext.scene.children, true);\n\n for (const intersection of intersections) {\n const id = gameObjectIdFromIntersection(intersection);\n if (id == null) continue;\n const gameObject = this.game.gameObjects.find((go) => go.id === id);\n if (!gameObject) continue;\n const component = gameObject.getComponent(Event3D) as Event3D | undefined;\n if (!component) continue;\n\n this.localScratch.copy(intersection.point);\n intersection.object.worldToLocal(this.localScratch);\n return {\n gameObject,\n component,\n local: this.localScratch.clone(),\n };\n }\n return null;\n }\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@combos-fun/plugin-renderer-3d-event",
3
- "version": "0.0.44",
3
+ "version": "0.0.46",
4
4
  "description": "Pointer / touch event input via Three.js raycasting",
5
5
  "main": "index.js",
6
6
  "module": "dist/plugin-renderer-3d-event.esm.js",
@@ -27,8 +27,8 @@
27
27
  },
28
28
  "dependencies": {
29
29
  "three": "^0.172.0",
30
- "@combos-fun/engine": "0.0.44",
31
- "@combos-fun/plugin-renderer-3d": "0.0.44"
30
+ "@combos-fun/engine": "0.0.46",
31
+ "@combos-fun/plugin-renderer-3d": "0.0.46"
32
32
  },
33
33
  "keywords": [
34
34
  "combos-fun",