Skip to content

Controls: Require element in connect() #30772

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 21, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 20 additions & 8 deletions editor/js/EditorControls.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import * as THREE from 'three';

class EditorControls extends THREE.EventDispatcher {

constructor( object, domElement ) {
constructor( object ) {

super();

Expand Down Expand Up @@ -34,6 +34,8 @@ class EditorControls extends THREE.EventDispatcher {
var pointers = [];
var pointerPositions = {};

var domElement = null;

// events

var changeEvent = { type: 'change' };
Expand Down Expand Up @@ -269,21 +271,31 @@ class EditorControls extends THREE.EventDispatcher {

}

this.dispose = function () {
this.connect = function ( element ) {

if ( domElement !== null ) this.disconnect();

domElement = element;

domElement.addEventListener( 'contextmenu', contextmenu );
domElement.addEventListener( 'dblclick', onMouseUp );
domElement.addEventListener( 'wheel', onMouseWheel, { passive: false } );

domElement.addEventListener( 'pointerdown', onPointerDown );

};

this.disconnect = function () {

domElement.removeEventListener( 'contextmenu', contextmenu );
domElement.removeEventListener( 'dblclick', onMouseUp );
domElement.removeEventListener( 'wheel', onMouseWheel );

domElement.removeEventListener( 'pointerdown', onPointerDown );

};
domElement = null;

domElement.addEventListener( 'contextmenu', contextmenu );
domElement.addEventListener( 'dblclick', onMouseUp );
domElement.addEventListener( 'wheel', onMouseWheel, { passive: false } );

domElement.addEventListener( 'pointerdown', onPointerDown );
};

// touch

Expand Down
7 changes: 5 additions & 2 deletions editor/js/Viewport.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ function Viewport( editor ) {
let objectRotationOnDown = null;
let objectScaleOnDown = null;

const transformControls = new TransformControls( camera, container.dom );
const transformControls = new TransformControls( camera );
transformControls.addEventListener( 'axis-changed', function () {

if ( editor.viewportShading !== 'realistic' ) render();
Expand Down Expand Up @@ -274,7 +274,7 @@ function Viewport( editor ) {
// controls need to be added *after* main logic,
// otherwise controls.enabled doesn't work.

const controls = new EditorControls( camera, container.dom );
const controls = new EditorControls( camera );
controls.addEventListener( 'change', function () {

signals.cameraChanged.dispatch( camera );
Expand Down Expand Up @@ -345,6 +345,9 @@ function Viewport( editor ) {

}

controls.connect( newRenderer.domElement );
transformControls.connect( newRenderer.domElement );

renderer = newRenderer;

renderer.setAnimationLoop( animate );
Expand Down
6 changes: 4 additions & 2 deletions examples/jsm/controls/ArcballControls.js
Original file line number Diff line number Diff line change
Expand Up @@ -441,13 +441,15 @@ class ArcballControls extends Controls {

if ( domElement !== null ) {

this.connect();
this.connect( domElement );

}

}

connect() {
connect( element ) {

super.connect( element );

this.domElement.style.touchAction = 'none';
this._devPxRatio = window.devicePixelRatio;
Expand Down
6 changes: 4 additions & 2 deletions examples/jsm/controls/DragControls.js
Original file line number Diff line number Diff line change
Expand Up @@ -122,13 +122,15 @@ class DragControls extends Controls {

if ( domElement !== null ) {

this.connect();
this.connect( domElement );

}

}

connect() {
connect( element ) {

super.connect( element );

this.domElement.addEventListener( 'pointermove', this._onPointerMove );
this.domElement.addEventListener( 'pointerdown', this._onPointerDown );
Expand Down
6 changes: 4 additions & 2 deletions examples/jsm/controls/FirstPersonControls.js
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ class FirstPersonControls extends Controls {

if ( domElement !== null ) {

this.connect();
this.connect( domElement );

this.handleResize();

Expand All @@ -174,7 +174,9 @@ class FirstPersonControls extends Controls {

}

connect() {
connect( element ) {

super.connect( element );

window.addEventListener( 'keydown', this._onKeyDown );
window.addEventListener( 'keyup', this._onKeyUp );
Expand Down
6 changes: 4 additions & 2 deletions examples/jsm/controls/FlyControls.js
Original file line number Diff line number Diff line change
Expand Up @@ -89,13 +89,15 @@ class FlyControls extends Controls {

if ( domElement !== null ) {

this.connect();
this.connect( domElement );

}

}

connect() {
connect( element ) {

super.connect( element );

window.addEventListener( 'keydown', this._onKeyDown );
window.addEventListener( 'keyup', this._onKeyUp );
Expand Down
6 changes: 4 additions & 2 deletions examples/jsm/controls/OrbitControls.js
Original file line number Diff line number Diff line change
Expand Up @@ -453,15 +453,17 @@ class OrbitControls extends Controls {

if ( this.domElement !== null ) {

this.connect();
this.connect( this.domElement );

}

this.update();

}

connect() {
connect( element ) {

super.connect( element );

this.domElement.addEventListener( 'pointerdown', this._onPointerDown );
this.domElement.addEventListener( 'pointercancel', this._onPointerUp );
Expand Down
6 changes: 4 additions & 2 deletions examples/jsm/controls/PointerLockControls.js
Original file line number Diff line number Diff line change
Expand Up @@ -109,13 +109,15 @@ class PointerLockControls extends Controls {

if ( this.domElement !== null ) {

this.connect();
this.connect( this.domElement );

}

}

connect() {
connect( element ) {

super.connect( element );

this.domElement.ownerDocument.addEventListener( 'mousemove', this._onMouseMove );
this.domElement.ownerDocument.addEventListener( 'pointerlockchange', this._onPointerlockChange );
Expand Down
6 changes: 4 additions & 2 deletions examples/jsm/controls/TrackballControls.js
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ class TrackballControls extends Controls {

if ( domElement !== null ) {

this.connect();
this.connect( domElement );

this.handleResize();

Expand All @@ -268,7 +268,9 @@ class TrackballControls extends Controls {

}

connect() {
connect( element ) {

super.connect( element );

window.addEventListener( 'keydown', this._onKeyDown );
window.addEventListener( 'keyup', this._onKeyUp );
Expand Down
6 changes: 4 additions & 2 deletions examples/jsm/controls/TransformControls.js
Original file line number Diff line number Diff line change
Expand Up @@ -358,13 +358,15 @@ class TransformControls extends Controls {

if ( domElement !== null ) {

this.connect();
this.connect( domElement );

}

}

connect() {
connect( element ) {

super.connect( element );

this.domElement.addEventListener( 'pointerdown', this._onPointerDown );
this.domElement.addEventListener( 'pointermove', this._onPointerHover );
Expand Down
17 changes: 16 additions & 1 deletion src/extras/Controls.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,23 @@ class Controls extends EventDispatcher {
/**
* Connects the controls to the DOM. This method has so called "side effects" since
* it adds the module's event listeners to the DOM.
*
* @param {HTMLDOMElement} element - The DOM element to connect to.
*/
connect() {}
connect( element ) {

if ( element === undefined ) {

console.warn( 'THREE.Controls: connect() now requires an element.' );
return;

}

if ( this.domElement !== null ) this.disconnect();

this.domElement = element;

}

/**
* Disconnects the controls from the DOM.
Expand Down
Loading