From a178bc11b7a88080754cc19a49376e680169480c Mon Sep 17 00:00:00 2001 From: cptbtptpbcptdtptp Date: Thu, 2 Feb 2023 14:23:12 +0800 Subject: [PATCH 1/4] feat: input framecount --- packages/core/src/input/InputManager.ts | 22 +++++++++---------- packages/core/src/input/interface/IInput.ts | 2 +- .../src/input/keyboard/KeyboardManager.ts | 10 +++++++-- .../core/src/input/pointer/PointerManager.ts | 7 ++++-- packages/core/src/input/wheel/WheelManager.ts | 5 ++++- 5 files changed, 29 insertions(+), 17 deletions(-) diff --git a/packages/core/src/input/InputManager.ts b/packages/core/src/input/InputManager.ts index 50987d507d..a3490709a6 100644 --- a/packages/core/src/input/InputManager.ts +++ b/packages/core/src/input/InputManager.ts @@ -11,9 +11,9 @@ import { Vector3 } from "@oasis-engine/math"; * InputManager manages device input such as mouse, touch, keyboard, etc. */ export class InputManager { + private _engine: Engine; /** Sometimes the input module will not be initialized, such as off-screen rendering. */ private _initialized: boolean = false; - private _curFrameCount: number = 0; private _wheelManager: WheelManager; private _pointerManager: PointerManager; private _keyboardManager: KeyboardManager; @@ -71,7 +71,7 @@ export class InputManager { if (key === undefined) { return this._keyboardManager._curFrameDownList.length > 0; } else { - return this._keyboardManager._downKeyToFrameCountMap[key] === this._curFrameCount; + return this._keyboardManager._downKeyToFrameCountMap[key] === this._engine.time.frameCount; } } else { return false; @@ -88,7 +88,7 @@ export class InputManager { if (key === undefined) { return this._keyboardManager._curFrameUpList.length > 0; } else { - return this._keyboardManager._upKeyToFrameCountMap[key] === this._curFrameCount; + return this._keyboardManager._upKeyToFrameCountMap[key] === this._engine.time.frameCount; } } else { return false; @@ -122,7 +122,7 @@ export class InputManager { if (pointerButton === undefined) { return this._pointerManager._downList.length > 0; } else { - return this._pointerManager._downMap[_pointerBin2DecMap[pointerButton]] === this._curFrameCount; + return this._pointerManager._downMap[_pointerBin2DecMap[pointerButton]] === this._engine.time.frameCount; } } else { return false; @@ -139,7 +139,7 @@ export class InputManager { if (pointerButton === undefined) { return this._pointerManager._upList.length > 0; } else { - return this._pointerManager._upMap[_pointerBin2DecMap[pointerButton]] === this._curFrameCount; + return this._pointerManager._upMap[_pointerBin2DecMap[pointerButton]] === this._engine.time.frameCount; } } else { return false; @@ -150,12 +150,13 @@ export class InputManager { * @internal */ constructor(engine: Engine) { + this._engine = engine; // @ts-ignore const canvas = engine._canvas._webCanvas; if (typeof OffscreenCanvas === "undefined" || !(canvas instanceof OffscreenCanvas)) { - this._wheelManager = new WheelManager(canvas); - this._pointerManager = new PointerManager(engine, canvas); - this._keyboardManager = new KeyboardManager(canvas); + this._wheelManager = new WheelManager(engine); + this._pointerManager = new PointerManager(engine); + this._keyboardManager = new KeyboardManager(engine); this._onBlur = this._onBlur.bind(this); window.addEventListener("blur", this._onBlur); this._onFocus = this._onFocus.bind(this); @@ -169,10 +170,9 @@ export class InputManager { */ _update(): void { if (this._initialized) { - ++this._curFrameCount; this._wheelManager._update(); - this._pointerManager._update(this._curFrameCount); - this._keyboardManager._update(this._curFrameCount); + this._pointerManager._update(); + this._keyboardManager._update(); } } diff --git a/packages/core/src/input/interface/IInput.ts b/packages/core/src/input/interface/IInput.ts index cfc0a20867..49ed3e24b2 100644 --- a/packages/core/src/input/interface/IInput.ts +++ b/packages/core/src/input/interface/IInput.ts @@ -2,7 +2,7 @@ export interface IInput { /** * Handler function updated every frame. */ - _update(frameCount?: number): void; + _update(): void; /** * Function called when the engine is destroyed. */ diff --git a/packages/core/src/input/keyboard/KeyboardManager.ts b/packages/core/src/input/keyboard/KeyboardManager.ts index a068bd7986..f76c686ee3 100644 --- a/packages/core/src/input/keyboard/KeyboardManager.ts +++ b/packages/core/src/input/keyboard/KeyboardManager.ts @@ -1,3 +1,4 @@ +import { Engine } from "../../Engine"; import { DisorderedArray } from "../../DisorderedArray"; import { Keys } from "../enums/Keys"; import { IInput } from "../interface/IInput"; @@ -21,6 +22,7 @@ export class KeyboardManager implements IInput { /** @internal */ _curFrameUpList: DisorderedArray = new DisorderedArray(); + private _engine: Engine; private _htmlCanvas: HTMLCanvasElement; private _nativeEvents: KeyboardEvent[] = []; private _hadListener: boolean = false; @@ -28,7 +30,10 @@ export class KeyboardManager implements IInput { /** * Create a KeyboardManager. */ - constructor(htmlCanvas: HTMLCanvasElement) { + constructor(engine: Engine) { + // @ts-ignore + const htmlCanvas = engine._canvas._webCanvas; + this._engine = engine; this._htmlCanvas = htmlCanvas; // Need to set tabIndex to make the canvas focus. htmlCanvas.tabIndex = htmlCanvas.tabIndex; @@ -41,11 +46,12 @@ export class KeyboardManager implements IInput { /** * @internal */ - _update(frameCount: number): void { + _update(): void { const { _nativeEvents: nativeEvents, _curFrameDownList: curFrameDownList, _curFrameUpList: curFrameUpList } = this; curFrameDownList.length = 0; curFrameUpList.length = 0; if (nativeEvents.length > 0) { + const frameCount = this._engine.time.frameCount; const { _curHeldDownKeyToIndexMap: curHeldDownKeyToIndexMap, _curFrameHeldDownList: curFrameHeldDownList, diff --git a/packages/core/src/input/pointer/PointerManager.ts b/packages/core/src/input/pointer/PointerManager.ts index e37129a3b5..36b486dbb9 100644 --- a/packages/core/src/input/pointer/PointerManager.ts +++ b/packages/core/src/input/pointer/PointerManager.ts @@ -45,7 +45,9 @@ export class PointerManager implements IInput { * @param engine - The current engine instance * @param htmlCanvas - HTMLCanvasElement */ - constructor(engine: Engine, htmlCanvas: HTMLCanvasElement) { + constructor(engine: Engine) { + // @ts-ignore + const htmlCanvas = engine._canvas._webCanvas; this._engine = engine; this._canvas = engine.canvas; this._htmlCanvas = htmlCanvas; @@ -63,7 +65,7 @@ export class PointerManager implements IInput { /** * @internal */ - _update(frameCount: number): void { + _update(): void { const { _pointers: pointers, _nativeEvents: nativeEvents } = this; /** Clean up the pointer released in the previous frame. */ let lastIndex = pointers.length - 1; @@ -90,6 +92,7 @@ export class PointerManager implements IInput { this._buttons = PointerButton.None; lastIndex = pointers.length - 1; if (lastIndex >= 0) { + const frameCount = this._engine.time.frameCount; const updatePointer = this._engine.physicsManager._initialized ? this._updatePointerWithPhysics : this._updatePointerWithoutPhysics; diff --git a/packages/core/src/input/wheel/WheelManager.ts b/packages/core/src/input/wheel/WheelManager.ts index 7f9967b76b..a1cf8f2d58 100644 --- a/packages/core/src/input/wheel/WheelManager.ts +++ b/packages/core/src/input/wheel/WheelManager.ts @@ -1,4 +1,5 @@ import { Vector3 } from "@oasis-engine/math"; +import { Engine } from "../../Engine"; import { IInput } from "../interface/IInput"; /** @@ -16,7 +17,9 @@ export class WheelManager implements IInput { /** * Create a KeyboardManager. */ - constructor(htmlCanvas: HTMLCanvasElement) { + constructor(engine: Engine) { + // @ts-ignore + const htmlCanvas = engine._canvas._webCanvas; this._onWheelEvent = this._onWheelEvent.bind(this); htmlCanvas.addEventListener("wheel", this._onWheelEvent); this._canvas = htmlCanvas; From 01b311b64ef2225d87f4dd1f2e35d5e55dc8eca5 Mon Sep 17 00:00:00 2001 From: cptbtptpbcptdtptp Date: Fri, 3 Feb 2023 11:13:41 +0800 Subject: [PATCH 2/4] feat: opt input --- packages/core/src/input/InputManager.ts | 124 +++++++++++------- packages/core/src/input/enums/InputType.ts | 19 +++ packages/core/src/input/index.ts | 3 + packages/core/src/input/interface/IInput.ts | 13 +- .../src/input/keyboard/KeyboardManager.ts | 61 +++++---- .../core/src/input/pointer/PointerManager.ts | 60 ++++----- packages/core/src/input/wheel/WheelManager.ts | 47 ++++--- 7 files changed, 194 insertions(+), 133 deletions(-) create mode 100644 packages/core/src/input/enums/InputType.ts diff --git a/packages/core/src/input/InputManager.ts b/packages/core/src/input/InputManager.ts index a3490709a6..fbc825551f 100644 --- a/packages/core/src/input/InputManager.ts +++ b/packages/core/src/input/InputManager.ts @@ -6,6 +6,8 @@ import { PointerManager } from "./pointer/PointerManager"; import { PointerButton, _pointerBin2DecMap } from "./enums/PointerButton"; import { WheelManager } from "./wheel/WheelManager"; import { Vector3 } from "@oasis-engine/math"; +import { IInput } from "./interface/IInput"; +import { InputType } from "./enums/InputType"; /** * InputManager manages device input such as mouse, touch, keyboard, etc. @@ -14,26 +16,27 @@ export class InputManager { private _engine: Engine; /** Sometimes the input module will not be initialized, such as off-screen rendering. */ private _initialized: boolean = false; - private _wheelManager: WheelManager; - private _pointerManager: PointerManager; - private _keyboardManager: KeyboardManager; + private _inputInstances: IInput[] = new Array(InputType.length); /** * Pointer list. */ get pointers(): Readonly { - return this._initialized ? this._pointerManager._pointers : []; + const pointerManager = this.getInput(InputType.Pointer); + return pointerManager ? pointerManager._pointers : []; } /** * Whether to handle multi-pointer. */ get multiPointerEnabled(): boolean { - return this._initialized ? this._pointerManager._multiPointerEnabled : false; + const pointerManager = this.getInput(InputType.Pointer); + return pointerManager ? pointerManager._multiPointerEnabled : false; } set multiPointerEnabled(enabled: boolean) { - this._initialized && (this._pointerManager._multiPointerEnabled = enabled); + const pointerManager = this.getInput(InputType.Pointer); + pointerManager && (pointerManager._multiPointerEnabled = enabled); } /** @@ -41,7 +44,26 @@ export class InputManager { * @returns Change value */ get wheelDelta(): Readonly { - return this._initialized ? this._wheelManager._delta : null; + const wheelManager = this.getInput(InputType.Wheel); + return wheelManager ? wheelManager._delta : null; + } + + /** + * Get an instance of this input type. + * @param inputType - The type of this input + * @returns Instance of this input + */ + getInput(inputType: InputType): T { + return this._inputInstances[inputType] as T; + } + + /** + * Add an instance of an input type + * @param inputType - The type of this input + * @param input - An instance of this input type + */ + addInput(inputType: InputType, input: IInput): void { + this._inputInstances[inputType] = input; } /** @@ -50,11 +72,12 @@ export class InputManager { * @returns Whether the key is being held down */ isKeyHeldDown(key?: Keys): boolean { - if (this._initialized) { + const keyboardManager = this.getInput(InputType.Keyboard); + if (keyboardManager) { if (key === undefined) { - return this._keyboardManager._curFrameHeldDownList.length > 0; + return keyboardManager._curFrameHeldDownList.length > 0; } else { - return this._keyboardManager._curHeldDownKeyToIndexMap[key] != null; + return keyboardManager._curHeldDownKeyToIndexMap[key] != null; } } else { return false; @@ -67,11 +90,12 @@ export class InputManager { * @returns Whether the key starts to be pressed down during the current frame */ isKeyDown(key?: Keys): boolean { - if (this._initialized) { + const keyboardManager = this.getInput(InputType.Keyboard); + if (keyboardManager) { if (key === undefined) { - return this._keyboardManager._curFrameDownList.length > 0; + return keyboardManager._curFrameDownList.length > 0; } else { - return this._keyboardManager._downKeyToFrameCountMap[key] === this._engine.time.frameCount; + return keyboardManager._downKeyToFrameCountMap[key] === this._engine.time._frameCount; } } else { return false; @@ -84,11 +108,12 @@ export class InputManager { * @returns Whether the key is released during the current frame */ isKeyUp(key?: Keys): boolean { - if (this._initialized) { + const keyboardManager = this.getInput(InputType.Keyboard); + if (keyboardManager) { if (key === undefined) { - return this._keyboardManager._curFrameUpList.length > 0; + return keyboardManager._curFrameUpList.length > 0; } else { - return this._keyboardManager._upKeyToFrameCountMap[key] === this._engine.time.frameCount; + return keyboardManager._upKeyToFrameCountMap[key] === this._engine.time._frameCount; } } else { return false; @@ -101,11 +126,12 @@ export class InputManager { * @returns Whether the pointer is being held down */ isPointerHeldDown(pointerButton?: PointerButton): boolean { - if (this._initialized) { + const pointerManager = this.getInput(InputType.Pointer); + if (pointerManager) { if (pointerButton === undefined) { - return this._pointerManager._buttons !== 0; + return pointerManager._buttons !== 0; } else { - return (this._pointerManager._buttons & pointerButton) !== 0; + return (pointerManager._buttons & pointerButton) !== 0; } } else { return false; @@ -118,11 +144,12 @@ export class InputManager { * @returns Whether the pointer starts to be pressed down during the current frame */ isPointerDown(pointerButton?: PointerButton): boolean { - if (this._initialized) { + const pointerManager = this.getInput(InputType.Pointer); + if (pointerManager) { if (pointerButton === undefined) { - return this._pointerManager._downList.length > 0; + return pointerManager._downList.length > 0; } else { - return this._pointerManager._downMap[_pointerBin2DecMap[pointerButton]] === this._engine.time.frameCount; + return pointerManager._downMap[_pointerBin2DecMap[pointerButton]] === this._engine.time._frameCount; } } else { return false; @@ -135,11 +162,12 @@ export class InputManager { * @returns Whether the pointer is released during the current frame */ isPointerUp(pointerButton?: PointerButton): boolean { - if (this._initialized) { + const pointerManager = this.getInput(InputType.Pointer); + if (pointerManager) { if (pointerButton === undefined) { - return this._pointerManager._upList.length > 0; + return pointerManager._upList.length > 0; } else { - return this._pointerManager._upMap[_pointerBin2DecMap[pointerButton]] === this._engine.time.frameCount; + return pointerManager._upMap[_pointerBin2DecMap[pointerButton]] === this._engine.time._frameCount; } } else { return false; @@ -152,11 +180,11 @@ export class InputManager { constructor(engine: Engine) { this._engine = engine; // @ts-ignore - const canvas = engine._canvas._webCanvas; + const canvas = engine.canvas._webCanvas; if (typeof OffscreenCanvas === "undefined" || !(canvas instanceof OffscreenCanvas)) { - this._wheelManager = new WheelManager(engine); - this._pointerManager = new PointerManager(engine); - this._keyboardManager = new KeyboardManager(engine); + this.addInput(InputType.Wheel, new WheelManager(engine)); + this.addInput(InputType.Pointer, new PointerManager(engine)); + this.addInput(InputType.Keyboard, new KeyboardManager(engine)); this._onBlur = this._onBlur.bind(this); window.addEventListener("blur", this._onBlur); this._onFocus = this._onFocus.bind(this); @@ -169,10 +197,12 @@ export class InputManager { * @internal */ _update(): void { - if (this._initialized) { - this._wheelManager._update(); - this._pointerManager._update(); - this._keyboardManager._update(); + if (!this._initialized) { + return; + } + const { _inputInstances: inputInstances } = this; + for (let i = 0, l = InputType.length; i < l; i++) { + inputInstances[i]?._update(); } } @@ -180,24 +210,28 @@ export class InputManager { * @internal */ _destroy(): void { - if (this._initialized) { - window.removeEventListener("blur", this._onBlur); - window.removeEventListener("focus", this._onFocus); - this._wheelManager._destroy(); - this._pointerManager._destroy(); - this._keyboardManager._destroy(); + if (!this._initialized) { + return; + } + window.removeEventListener("blur", this._onBlur); + window.removeEventListener("focus", this._onFocus); + const { _inputInstances: inputInstances } = this; + for (let i = 0, l = InputType.length; i < l; i++) { + inputInstances[i]?._destroy(); } } private _onBlur(): void { - this._wheelManager._onBlur(); - this._pointerManager._onBlur(); - this._keyboardManager._onBlur(); + const { _inputInstances: inputInstances } = this; + for (let i = 0, l = InputType.length; i < l; i++) { + inputInstances[i] && (inputInstances[i].focus = false); + } } private _onFocus(): void { - this._wheelManager._onFocus(); - this._pointerManager._onFocus(); - this._keyboardManager._onFocus(); + const { _inputInstances: inputInstances } = this; + for (let i = 0, l = InputType.length; i < l; i++) { + inputInstances[i] && (inputInstances[i].focus = true); + } } } diff --git a/packages/core/src/input/enums/InputType.ts b/packages/core/src/input/enums/InputType.ts new file mode 100644 index 0000000000..b8f36eae76 --- /dev/null +++ b/packages/core/src/input/enums/InputType.ts @@ -0,0 +1,19 @@ +/** + * Several known input types and other types to be extended. + */ +export enum InputType { + Pointer = 0, + Wheel = 1, + Keyboard = 2, + XInput1 = 3, + XInput2 = 4, + XInput3 = 5, + XInput4 = 6, + XInput5 = 7, + XInput6 = 8, + XInput7 = 9, + XInput8 = 10, + XInput9 = 11, + XInput10 = 12, + length = 13 +} diff --git a/packages/core/src/input/index.ts b/packages/core/src/input/index.ts index 8edd5391dc..0b0b5e55fd 100644 --- a/packages/core/src/input/index.ts +++ b/packages/core/src/input/index.ts @@ -3,3 +3,6 @@ export { Pointer } from "./pointer/Pointer"; export { InputManager } from "./InputManager"; export { Keys } from "./enums/Keys"; export { PointerButton } from "./enums/PointerButton"; +export { WheelManager } from "./wheel/WheelManager"; +export { PointerManager } from "./pointer/PointerManager"; +export { KeyboardManager } from "./keyboard/KeyBoardManager"; diff --git a/packages/core/src/input/interface/IInput.ts b/packages/core/src/input/interface/IInput.ts index 49ed3e24b2..cc9cbcdf18 100644 --- a/packages/core/src/input/interface/IInput.ts +++ b/packages/core/src/input/interface/IInput.ts @@ -1,4 +1,9 @@ export interface IInput { + /** + * If the input has focus. + */ + get focus(): boolean; + set focus(value: boolean); /** * Handler function updated every frame. */ @@ -7,12 +12,4 @@ export interface IInput { * Function called when the engine is destroyed. */ _destroy(): void; - /** - * Function called when focused. - */ - _onFocus(): void; - /** - * Function called when focus is lost. - */ - _onBlur(): void; } diff --git a/packages/core/src/input/keyboard/KeyboardManager.ts b/packages/core/src/input/keyboard/KeyboardManager.ts index f76c686ee3..c151faf4ce 100644 --- a/packages/core/src/input/keyboard/KeyboardManager.ts +++ b/packages/core/src/input/keyboard/KeyboardManager.ts @@ -25,8 +25,23 @@ export class KeyboardManager implements IInput { private _engine: Engine; private _htmlCanvas: HTMLCanvasElement; private _nativeEvents: KeyboardEvent[] = []; + private _focus: boolean = true; private _hadListener: boolean = false; + /** + * If the input has focus. + */ + get focus(): boolean { + return this._focus; + } + + set focus(value: boolean) { + if (this._focus !== value) { + this._focus = value; + value ? this._addListener() : this._removeListener(); + } + } + /** * Create a KeyboardManager. */ @@ -38,9 +53,7 @@ export class KeyboardManager implements IInput { // Need to set tabIndex to make the canvas focus. htmlCanvas.tabIndex = htmlCanvas.tabIndex; this._onKeyEvent = this._onKeyEvent.bind(this); - htmlCanvas.addEventListener("keydown", this._onKeyEvent); - htmlCanvas.addEventListener("keyup", this._onKeyEvent); - this._hadListener = true; + this._addListener(); } /** @@ -92,7 +105,23 @@ export class KeyboardManager implements IInput { /** * @internal */ - _onFocus(): void { + _destroy(): void { + if (this._hadListener) { + this._htmlCanvas.removeEventListener("keydown", this._onKeyEvent); + this._htmlCanvas.removeEventListener("keyup", this._onKeyEvent); + this._hadListener = false; + } + this._curHeldDownKeyToIndexMap = null; + this._upKeyToFrameCountMap = null; + this._downKeyToFrameCountMap = null; + this._nativeEvents = null; + + this._curFrameHeldDownList = null; + this._curFrameDownList = null; + this._curFrameUpList = null; + } + + private _addListener(): void { if (!this._hadListener) { this._htmlCanvas.addEventListener("keydown", this._onKeyEvent); this._htmlCanvas.addEventListener("keyup", this._onKeyEvent); @@ -100,10 +129,7 @@ export class KeyboardManager implements IInput { } } - /** - * @internal - */ - _onBlur(): void { + private _removeListener(): void { if (this._hadListener) { this._htmlCanvas.removeEventListener("keydown", this._onKeyEvent); this._htmlCanvas.removeEventListener("keyup", this._onKeyEvent); @@ -116,25 +142,6 @@ export class KeyboardManager implements IInput { } } - /** - * @internal - */ - _destroy(): void { - if (this._hadListener) { - this._htmlCanvas.removeEventListener("keydown", this._onKeyEvent); - this._htmlCanvas.removeEventListener("keyup", this._onKeyEvent); - this._hadListener = false; - } - this._curHeldDownKeyToIndexMap = null; - this._upKeyToFrameCountMap = null; - this._downKeyToFrameCountMap = null; - this._nativeEvents = null; - - this._curFrameHeldDownList = null; - this._curFrameDownList = null; - this._curFrameUpList = null; - } - private _onKeyEvent(evt: KeyboardEvent): void { this._nativeEvents.push(evt); } diff --git a/packages/core/src/input/pointer/PointerManager.ts b/packages/core/src/input/pointer/PointerManager.ts index 36b486dbb9..72b5d430e0 100644 --- a/packages/core/src/input/pointer/PointerManager.ts +++ b/packages/core/src/input/pointer/PointerManager.ts @@ -38,26 +38,40 @@ export class PointerManager implements IInput { private _htmlCanvas: HTMLCanvasElement; private _nativeEvents: PointerEvent[] = []; private _pointerPool: Pointer[]; + private _focus: boolean = true; private _hadListener: boolean = false; + /** + * If the input has focus. + */ + get focus(): boolean { + return this._focus; + } + + set focus(value: boolean) { + if (this._focus !== value) { + this._focus = value; + value ? this._addListener() : this._removeListener(); + } + } + /** * Create a PointerManager. * @param engine - The current engine instance * @param htmlCanvas - HTMLCanvasElement */ constructor(engine: Engine) { - // @ts-ignore - const htmlCanvas = engine._canvas._webCanvas; this._engine = engine; this._canvas = engine.canvas; - this._htmlCanvas = htmlCanvas; - htmlCanvas.oncontextmenu = (event: UIEvent) => { + // @ts-ignore + this._htmlCanvas = engine.canvas._webCanvas; + this._htmlCanvas.oncontextmenu = (event: UIEvent) => { return false; }; this._onPointerEvent = this._onPointerEvent.bind(this); this._updatePointerWithPhysics = this._updatePointerWithPhysics.bind(this); this._updatePointerWithoutPhysics = this._updatePointerWithoutPhysics.bind(this); - this._onFocus(); + this._addListener(); // If there are no compatibility issues, navigator.maxTouchPoints should be used here. this._pointerPool = new Array(11); } @@ -110,7 +124,14 @@ export class PointerManager implements IInput { /** * @internal */ - _onFocus(): void { + _destroy(): void { + this._removeListener(); + this._pointerPool.length = 0; + this._htmlCanvas = null; + this._engine = null; + } + + private _addListener(): void { if (!this._hadListener) { const { _htmlCanvas: htmlCanvas, _onPointerEvent: onPointerEvent } = this; htmlCanvas.addEventListener("pointerdown", onPointerEvent); @@ -122,10 +143,7 @@ export class PointerManager implements IInput { } } - /** - * @internal - */ - _onBlur(): void { + private _removeListener(): void { if (this._hadListener) { const { _htmlCanvas: htmlCanvas, _onPointerEvent: onPointerEvent } = this; htmlCanvas.removeEventListener("pointerdown", onPointerEvent); @@ -144,28 +162,6 @@ export class PointerManager implements IInput { } } - /** - * @internal - */ - _destroy(): void { - // @ts-ignore - if (this._hadListener) { - const { _htmlCanvas: htmlCanvas, _onPointerEvent: onPointerEvent } = this; - htmlCanvas.removeEventListener("pointerdown", onPointerEvent); - htmlCanvas.removeEventListener("pointerup", onPointerEvent); - htmlCanvas.removeEventListener("pointerout", onPointerEvent); - htmlCanvas.removeEventListener("pointermove", onPointerEvent); - htmlCanvas.removeEventListener("pointercancel", onPointerEvent); - this._hadListener = false; - } - this._pointerPool.length = 0; - this._pointers.length = 0; - this._downList.length = 0; - this._upList.length = 0; - this._htmlCanvas = null; - this._engine = null; - } - private _onPointerEvent(evt: PointerEvent) { evt.cancelable && evt.preventDefault(); evt.type === "pointerdown" && this._htmlCanvas.focus(); diff --git a/packages/core/src/input/wheel/WheelManager.ts b/packages/core/src/input/wheel/WheelManager.ts index a1cf8f2d58..05511e4e98 100644 --- a/packages/core/src/input/wheel/WheelManager.ts +++ b/packages/core/src/input/wheel/WheelManager.ts @@ -12,18 +12,31 @@ export class WheelManager implements IInput { private _nativeEvents: WheelEvent[] = []; private _canvas: HTMLCanvasElement; - private _hadListener: boolean; + private _focus: boolean = true; + private _hadListener: boolean = false; + + /** + * If the input has focus. + */ + get focus(): boolean { + return this._focus; + } + + set focus(value: boolean) { + if (this._focus !== value) { + this._focus = value; + value ? this._addListener() : this._removeListener(); + } + } /** * Create a KeyboardManager. */ constructor(engine: Engine) { // @ts-ignore - const htmlCanvas = engine._canvas._webCanvas; + this._canvas = engine.canvas._webCanvas; this._onWheelEvent = this._onWheelEvent.bind(this); - htmlCanvas.addEventListener("wheel", this._onWheelEvent); - this._canvas = htmlCanvas; - this._hadListener = true; + this._addListener(); } /** @@ -47,17 +60,20 @@ export class WheelManager implements IInput { /** * @internal */ - _onFocus(): void { + _destroy(): void { + this._removeListener(); + this._delta = null; + this._nativeEvents = null; + } + + private _addListener(): void { if (!this._hadListener) { this._canvas.addEventListener("wheel", this._onWheelEvent); this._hadListener = true; } } - /** - * @internal - */ - _onBlur(): void { + private _removeListener(): void { if (this._hadListener) { this._canvas.removeEventListener("wheel", this._onWheelEvent); this._nativeEvents.length = 0; @@ -66,17 +82,6 @@ export class WheelManager implements IInput { } } - /** - * @internal - */ - _destroy(): void { - if (this._hadListener) { - this._canvas.removeEventListener("wheel", this._onWheelEvent); - this._hadListener = false; - } - this._nativeEvents = null; - } - private _onWheelEvent(evt: WheelEvent): void { evt.cancelable && evt.preventDefault(); this._nativeEvents.push(evt); From bc7461767ed25adb143f15e61db707670653d97c Mon Sep 17 00:00:00 2001 From: cptbtptpbcptdtptp Date: Fri, 3 Feb 2023 11:36:50 +0800 Subject: [PATCH 3/4] feat: opt input --- packages/core/src/input/enums/InputType.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/core/src/input/enums/InputType.ts b/packages/core/src/input/enums/InputType.ts index b8f36eae76..c1a2e0d620 100644 --- a/packages/core/src/input/enums/InputType.ts +++ b/packages/core/src/input/enums/InputType.ts @@ -2,18 +2,32 @@ * Several known input types and other types to be extended. */ export enum InputType { + /** The pointer input will be triggered when the user touches (such as a mouse, pen or contact point on a touch-enable surface). */ Pointer = 0, + /** The wheel input fires when the user scrolls the mouse wheel or similar hardware device. */ Wheel = 1, + /** The keyboard input fires when the user presses or lifts a keyboard key. */ Keyboard = 2, + /** Input to be expanded. */ XInput1 = 3, + /** Input to be expanded. */ XInput2 = 4, + /** Input to be expanded. */ XInput3 = 5, + /** Input to be expanded. */ XInput4 = 6, + /** Input to be expanded. */ XInput5 = 7, + /** Input to be expanded. */ XInput6 = 8, + /** Input to be expanded. */ XInput7 = 9, + /** Input to be expanded. */ XInput8 = 10, + /** Input to be expanded. */ XInput9 = 11, + /** Input to be expanded. */ XInput10 = 12, + /** The maximum count of inputs at the same time. */ length = 13 } From 89bc39064e18d34af649879c25cefa2527a35aea Mon Sep 17 00:00:00 2001 From: cptbtptpbcptdtptp Date: Fri, 3 Feb 2023 15:33:07 +0800 Subject: [PATCH 4/4] feat: opt input --- packages/core/src/input/pointer/PointerManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/input/pointer/PointerManager.ts b/packages/core/src/input/pointer/PointerManager.ts index f358e7b712..e610e05769 100644 --- a/packages/core/src/input/pointer/PointerManager.ts +++ b/packages/core/src/input/pointer/PointerManager.ts @@ -72,7 +72,7 @@ export class PointerManager implements IInput { this._updatePointerWithPhysics = this._updatePointerWithPhysics.bind(this); this._updatePointerWithoutPhysics = this._updatePointerWithoutPhysics.bind(this); this._addListener(); - // If there are no compatibility issues, navigator.maxTouchPoints should be used here. + // If there are no compatibility issues, navigator.maxTouchPoints should be used here this._pointerPool = new Array(11); }