@ccpc/canvas 0.1.27 → 0.1.28
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/index.js +1 -0
- package/index.js.map +1 -0
- package/package.json +3 -3
package/index.js
CHANGED
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/types/type_define.ts","../src/toolkit/canvas_config.ts","../../../node_modules/.pnpm/three@0.181.2/node_modules/three/examples/jsm/controls/OrbitControls.js","../../../node_modules/.pnpm/three@0.181.2/node_modules/three/examples/jsm/lines/LineSegmentsGeometry.js","../../../node_modules/.pnpm/three@0.181.2/node_modules/three/examples/jsm/lines/LineMaterial.js","../../../node_modules/.pnpm/three@0.181.2/node_modules/three/examples/jsm/lines/LineSegments2.js","../../../node_modules/.pnpm/three@0.181.2/node_modules/three/examples/jsm/lines/LineGeometry.js","../../../node_modules/.pnpm/three@0.181.2/node_modules/three/examples/jsm/lines/Line2.js","../src/toolkit/three_util.ts","../src/render/render_hub.ts","../src/render/active_selection_op.ts","../src/render/c_renderer.ts","../src/controller/fn_key.ts","../src/controller/mouse_interactor.ts","../src/canvas/work_plane.ts","../src/controller/keyboard_interactor.ts","../src/canvas/c_canvas.ts","../src/controller/default_controller.ts"],"sourcesContent":["import { Vec2 } from '@ccpc/math'\nimport { FnKey } from '../controller/fn_key'\n/**\n * 原生鼠标事件\n */\nexport enum EN_NativeMouseEvent {\n MOUSE_DOWN = 'mousedown',\n MOUSE_MOVE = 'mousemove',\n MOUSE_UP = 'mouseup',\n WHEEL = 'wheel',\n CONTEXT_MENU = 'contextmenu',\n MOUSE_LEAVE = 'mouseleave',\n MOUSE_ENTER = 'mouseenter',\n}\n\n/**\n * 原生键盘事件\n */\nexport enum EN_NativeKeyboardEvent {\n KEY_DOWN = 'keydown',\n KEY_UP = 'keyup',\n KEY_PRESS = 'keypress',\n}\n\n/**\n * 自定义鼠标事件\n */\nexport enum EN_MouseEvent {\n MOUSE_MOVE = 'move',\n\n L_BUTTON_DOWN = 'l_down',\n L_BUTTON_UP = 'l_up',\n\n R_BUTTON_DOWN = 'r_down',\n R_BUTTON_UP = 'r_up',\n\n M_BUTTON_DOWN = 'm_down',\n M_BUTTON_UP = 'm_up',\n\n WHEEL_FORWARD = 'wheel+',\n WHEEL_BACKWARD = 'wheel-',\n WHEEL_START = 'wheel_start',\n WHEEL_END = 'wheel_end',\n\n /**右键单击*/\n R_CLICK = 'r_clk',\n /**立即触发的单击*/\n CLICK = 'clk',\n /**延迟触发的单击*/\n SGL_CLICK = 'sgl_clk',\n /**双击*/\n DBL_CLICK = 'db_clk',\n\n MOUSE_LEAVE = 'mouse_leave',\n MOUSE_ENTER = 'mouse_enter',\n}\n\n/**\n * 自定义键盘事件\n */\nexport enum EN_KeyboardEvent {\n KEY_DOWN = 'down',\n KEY_UP = 'up',\n KEY_PRESS = 'press'\n}\n\n/**\n * 鼠标事件参数类型\n */\nexport type IMouseEvent = {\n type: EN_MouseEvent,\n domEvent: MouseEvent,\n /**屏幕坐标*/\n pos: Vec2,\n fnKey: FnKey\n}\n\n/**\n * 键盘事件参数类型\n */\nexport type IKeyboardEvent = {\n type: EN_KeyboardEvent,\n domEvent: KeyboardEvent,\n fnKey: FnKey\n}\n","export const canvasConfig = {\r\n common: {\r\n /**鼠标从mousedown到mouseup的移动容差: 4px*/\r\n click_to_tolerance: 4,\r\n\r\n /**两次点击触发dbclick的间隔: 0.3s*/\r\n dbl_click_interval: 0.3 * 1e3,\r\n\r\n /**背景色*/\r\n color_background: 0x000000,\r\n },\r\n}\r\n","import {\n\tControls,\n\tMOUSE,\n\tQuaternion,\n\tSpherical,\n\tTOUCH,\n\tVector2,\n\tVector3,\n\tPlane,\n\tRay,\n\tMathUtils\n} from 'three';\n\n/**\n * Fires when the camera has been transformed by the controls.\n *\n * @event OrbitControls#change\n * @type {Object}\n */\nconst _changeEvent = { type: 'change' };\n\n/**\n * Fires when an interaction was initiated.\n *\n * @event OrbitControls#start\n * @type {Object}\n */\nconst _startEvent = { type: 'start' };\n\n/**\n * Fires when an interaction has finished.\n *\n * @event OrbitControls#end\n * @type {Object}\n */\nconst _endEvent = { type: 'end' };\n\nconst _ray = new Ray();\nconst _plane = new Plane();\nconst _TILT_LIMIT = Math.cos( 70 * MathUtils.DEG2RAD );\n\nconst _v = new Vector3();\nconst _twoPI = 2 * Math.PI;\n\nconst _STATE = {\n\tNONE: - 1,\n\tROTATE: 0,\n\tDOLLY: 1,\n\tPAN: 2,\n\tTOUCH_ROTATE: 3,\n\tTOUCH_PAN: 4,\n\tTOUCH_DOLLY_PAN: 5,\n\tTOUCH_DOLLY_ROTATE: 6\n};\nconst _EPS = 0.000001;\n\n\n/**\n * Orbit controls allow the camera to orbit around a target.\n *\n * OrbitControls performs orbiting, dollying (zooming), and panning. Unlike {@link TrackballControls},\n * it maintains the \"up\" direction `object.up` (+Y by default).\n *\n * - Orbit: Left mouse / touch: one-finger move.\n * - Zoom: Middle mouse, or mousewheel / touch: two-finger spread or squish.\n * - Pan: Right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move.\n *\n * ```js\n * const controls = new OrbitControls( camera, renderer.domElement );\n *\n * // controls.update() must be called after any manual changes to the camera's transform\n * camera.position.set( 0, 20, 100 );\n * controls.update();\n *\n * function animate() {\n *\n * \t// required if controls.enableDamping or controls.autoRotate are set to true\n * \tcontrols.update();\n *\n * \trenderer.render( scene, camera );\n *\n * }\n * ```\n *\n * @augments Controls\n * @three_import import { OrbitControls } from 'three/addons/controls/OrbitControls.js';\n */\nclass OrbitControls extends Controls {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Object3D} object - The object that is managed by the controls.\n\t * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n\t */\n\tconstructor( object, domElement = null ) {\n\n\t\tsuper( object, domElement );\n\n\t\tthis.state = _STATE.NONE;\n\n\t\t/**\n\t\t * The focus point of the controls, the `object` orbits around this.\n\t\t * It can be updated manually at any point to change the focus of the controls.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.target = new Vector3();\n\n\t\t/**\n\t\t * The focus point of the `minTargetRadius` and `maxTargetRadius` limits.\n\t\t * It can be updated manually at any point to change the center of interest\n\t\t * for the `target`.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.cursor = new Vector3();\n\n\t\t/**\n\t\t * How far you can dolly in (perspective camera only).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.minDistance = 0;\n\n\t\t/**\n\t\t * How far you can dolly out (perspective camera only).\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.maxDistance = Infinity;\n\n\t\t/**\n\t\t * How far you can zoom in (orthographic camera only).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.minZoom = 0;\n\n\t\t/**\n\t\t * How far you can zoom out (orthographic camera only).\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.maxZoom = Infinity;\n\n\t\t/**\n\t\t * How close you can get the target to the 3D `cursor`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.minTargetRadius = 0;\n\n\t\t/**\n\t\t * How far you can move the target from the 3D `cursor`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.maxTargetRadius = Infinity;\n\n\t\t/**\n\t\t * How far you can orbit vertically, lower limit. Range is `[0, Math.PI]` radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.minPolarAngle = 0;\n\n\t\t/**\n\t\t * How far you can orbit vertically, upper limit. Range is `[0, Math.PI]` radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI\n\t\t */\n\t\tthis.maxPolarAngle = Math.PI;\n\n\t\t/**\n\t\t * How far you can orbit horizontally, lower limit. If set, the interval `[ min, max ]`\n\t\t * must be a sub-interval of `[ - 2 PI, 2 PI ]`, with `( max - min < 2 PI )`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -Infinity\n\t\t */\n\t\tthis.minAzimuthAngle = - Infinity;\n\n\t\t/**\n\t\t * How far you can orbit horizontally, upper limit. If set, the interval `[ min, max ]`\n\t\t * must be a sub-interval of `[ - 2 PI, 2 PI ]`, with `( max - min < 2 PI )`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -Infinity\n\t\t */\n\t\tthis.maxAzimuthAngle = Infinity;\n\n\t\t/**\n\t\t * Set to `true` to enable damping (inertia), which can be used to give a sense of weight\n\t\t * to the controls. Note that if this is enabled, you must call `update()` in your animation\n\t\t * loop.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.enableDamping = false;\n\n\t\t/**\n\t\t * The damping inertia used if `enableDamping` is set to `true`.\n\t\t *\n\t\t * Note that for this to work, you must call `update()` in your animation loop.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.05\n\t\t */\n\t\tthis.dampingFactor = 0.05;\n\n\t\t/**\n\t\t * Enable or disable zooming (dollying) of the camera.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enableZoom = true;\n\n\t\t/**\n\t\t * Speed of zooming / dollying.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t/**\n\t\t * Enable or disable horizontal and vertical rotation of the camera.\n\t\t *\n\t\t * Note that it is possible to disable a single axis by setting the min and max of the\n\t\t * `minPolarAngle` or `minAzimuthAngle` to the same value, which will cause the vertical\n\t\t * or horizontal rotation to be fixed at that value.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enableRotate = true;\n\n\t\t/**\n\t\t * Speed of rotation.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t/**\n\t\t * How fast to rotate the camera when the keyboard is used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.keyRotateSpeed = 1.0;\n\n\t\t/**\n\t\t * Enable or disable camera panning.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enablePan = true;\n\n\t\t/**\n\t\t * Speed of panning.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.panSpeed = 1.0;\n\n\t\t/**\n\t\t * Defines how the camera's position is translated when panning. If `true`, the camera pans\n\t\t * in screen space. Otherwise, the camera pans in the plane orthogonal to the camera's up\n\t\t * direction.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.screenSpacePanning = true;\n\n\t\t/**\n\t\t * How fast to pan the camera when the keyboard is used in\n\t\t * pixels per keypress.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 7\n\t\t */\n\t\tthis.keyPanSpeed = 7.0;\n\n\t\t/**\n\t\t * Setting this property to `true` allows to zoom to the cursor's position.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.zoomToCursor = false;\n\n\t\t/**\n\t\t * Set to true to automatically rotate around the target\n\t\t *\n\t\t * Note that if this is enabled, you must call `update()` in your animation loop.\n\t\t * If you want the auto-rotate speed to be independent of the frame rate (the refresh\n\t\t * rate of the display), you must pass the time `deltaTime`, in seconds, to `update()`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoRotate = false;\n\n\t\t/**\n\t\t * How fast to rotate around the target if `autoRotate` is `true`. The default equates to 30 seconds\n\t\t * per orbit at 60fps.\n\t\t *\n\t\t * Note that if `autoRotate` is enabled, you must call `update()` in your animation loop.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.autoRotateSpeed = 2.0;\n\n\t\t/**\n\t\t * This object contains references to the keycodes for controlling camera panning.\n\t\t *\n\t\t * ```js\n\t\t * controls.keys = {\n\t\t * \tLEFT: 'ArrowLeft', //left arrow\n\t\t * \tUP: 'ArrowUp', // up arrow\n\t\t * \tRIGHT: 'ArrowRight', // right arrow\n\t\t * \tBOTTOM: 'ArrowDown' // down arrow\n\t\t * }\n\t\t * ```\n\t\t * @type {Object}\n\t\t */\n\t\tthis.keys = { LEFT: 'ArrowLeft', UP: 'ArrowUp', RIGHT: 'ArrowRight', BOTTOM: 'ArrowDown' };\n\n\t\t/**\n\t\t * This object contains references to the mouse actions used by the controls.\n\t\t *\n\t\t * ```js\n\t\t * controls.mouseButtons = {\n\t\t * \tLEFT: THREE.MOUSE.ROTATE,\n\t\t * \tMIDDLE: THREE.MOUSE.DOLLY,\n\t\t * \tRIGHT: THREE.MOUSE.PAN\n\t\t * }\n\t\t * ```\n\t\t * @type {Object}\n\t\t */\n\t\tthis.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };\n\n\t\t/**\n\t\t * This object contains references to the touch actions used by the controls.\n\t\t *\n\t\t * ```js\n\t\t * controls.mouseButtons = {\n\t\t * \tONE: THREE.TOUCH.ROTATE,\n\t\t * \tTWO: THREE.TOUCH.DOLLY_PAN\n\t\t * }\n\t\t * ```\n\t\t * @type {Object}\n\t\t */\n\t\tthis.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n\n\t\t/**\n\t\t * Used internally by `saveState()` and `reset()`.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.target0 = this.target.clone();\n\n\t\t/**\n\t\t * Used internally by `saveState()` and `reset()`.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.position0 = this.object.position.clone();\n\n\t\t/**\n\t\t * Used internally by `saveState()` and `reset()`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t// the target DOM element for key events\n\t\tthis._domElementKeyEvents = null;\n\n\t\t// internals\n\n\t\tthis._lastPosition = new Vector3();\n\t\tthis._lastQuaternion = new Quaternion();\n\t\tthis._lastTargetPosition = new Vector3();\n\n\t\t// so camera.up is the orbit axis\n\t\tthis._quat = new Quaternion().setFromUnitVectors( object.up, new Vector3( 0, 1, 0 ) );\n\t\tthis._quatInverse = this._quat.clone().invert();\n\n\t\t// current position in spherical coordinates\n\t\tthis._spherical = new Spherical();\n\t\tthis._sphericalDelta = new Spherical();\n\n\t\tthis._scale = 1;\n\t\tthis._panOffset = new Vector3();\n\n\t\tthis._rotateStart = new Vector2();\n\t\tthis._rotateEnd = new Vector2();\n\t\tthis._rotateDelta = new Vector2();\n\n\t\tthis._panStart = new Vector2();\n\t\tthis._panEnd = new Vector2();\n\t\tthis._panDelta = new Vector2();\n\n\t\tthis._dollyStart = new Vector2();\n\t\tthis._dollyEnd = new Vector2();\n\t\tthis._dollyDelta = new Vector2();\n\n\t\tthis._dollyDirection = new Vector3();\n\t\tthis._mouse = new Vector2();\n\t\tthis._performCursorZoom = false;\n\n\t\tthis._pointers = [];\n\t\tthis._pointerPositions = {};\n\n\t\tthis._controlActive = false;\n\n\t\t// event listeners\n\n\t\tthis._onPointerMove = onPointerMove.bind( this );\n\t\tthis._onPointerDown = onPointerDown.bind( this );\n\t\tthis._onPointerUp = onPointerUp.bind( this );\n\t\tthis._onContextMenu = onContextMenu.bind( this );\n\t\tthis._onMouseWheel = onMouseWheel.bind( this );\n\t\tthis._onKeyDown = onKeyDown.bind( this );\n\n\t\tthis._onTouchStart = onTouchStart.bind( this );\n\t\tthis._onTouchMove = onTouchMove.bind( this );\n\n\t\tthis._onMouseDown = onMouseDown.bind( this );\n\t\tthis._onMouseMove = onMouseMove.bind( this );\n\n\t\tthis._interceptControlDown = interceptControlDown.bind( this );\n\t\tthis._interceptControlUp = interceptControlUp.bind( this );\n\n\t\t//\n\n\t\tif ( this.domElement !== null ) {\n\n\t\t\tthis.connect( this.domElement );\n\n\t\t}\n\n\t\tthis.update();\n\n\t}\n\n\tconnect( element ) {\n\n\t\tsuper.connect( element );\n\n\t\tthis.domElement.addEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.addEventListener( 'pointercancel', this._onPointerUp );\n\n\t\tthis.domElement.addEventListener( 'contextmenu', this._onContextMenu );\n\t\tthis.domElement.addEventListener( 'wheel', this._onMouseWheel, { passive: false } );\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\t\tdocument.addEventListener( 'keydown', this._interceptControlDown, { passive: true, capture: true } );\n\n\t\tthis.domElement.style.touchAction = 'none'; // disable touch scroll\n\n\t}\n\n\tdisconnect() {\n\n\t\tthis.domElement.removeEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.removeEventListener( 'pointerup', this._onPointerUp );\n\t\tthis.domElement.removeEventListener( 'pointercancel', this._onPointerUp );\n\n\t\tthis.domElement.removeEventListener( 'wheel', this._onMouseWheel );\n\t\tthis.domElement.removeEventListener( 'contextmenu', this._onContextMenu );\n\n\t\tthis.stopListenToKeyEvents();\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\t\tdocument.removeEventListener( 'keydown', this._interceptControlDown, { capture: true } );\n\n\t\tthis.domElement.style.touchAction = 'auto';\n\n\t}\n\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t}\n\n\t/**\n\t * Get the current vertical rotation, in radians.\n\t *\n\t * @return {number} The current vertical rotation, in radians.\n\t */\n\tgetPolarAngle() {\n\n\t\treturn this._spherical.phi;\n\n\t}\n\n\t/**\n\t * Get the current horizontal rotation, in radians.\n\t *\n\t * @return {number} The current horizontal rotation, in radians.\n\t */\n\tgetAzimuthalAngle() {\n\n\t\treturn this._spherical.theta;\n\n\t}\n\n\t/**\n\t * Returns the distance from the camera to the target.\n\t *\n\t * @return {number} The distance from the camera to the target.\n\t */\n\tgetDistance() {\n\n\t\treturn this.object.position.distanceTo( this.target );\n\n\t}\n\n\t/**\n\t * Adds key event listeners to the given DOM element.\n\t * `window` is a recommended argument for using this method.\n\t *\n\t * @param {HTMLElement} domElement - The DOM element\n\t */\n\tlistenToKeyEvents( domElement ) {\n\n\t\tdomElement.addEventListener( 'keydown', this._onKeyDown );\n\t\tthis._domElementKeyEvents = domElement;\n\n\t}\n\n\t/**\n\t * Removes the key event listener previously defined with `listenToKeyEvents()`.\n\t */\n\tstopListenToKeyEvents() {\n\n\t\tif ( this._domElementKeyEvents !== null ) {\n\n\t\t\tthis._domElementKeyEvents.removeEventListener( 'keydown', this._onKeyDown );\n\t\t\tthis._domElementKeyEvents = null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Save the current state of the controls. This can later be recovered with `reset()`.\n\t */\n\tsaveState() {\n\n\t\tthis.target0.copy( this.target );\n\t\tthis.position0.copy( this.object.position );\n\t\tthis.zoom0 = this.object.zoom;\n\n\t}\n\n\t/**\n\t * Reset the controls to their state from either the last time the `saveState()`\n\t * was called, or the initial state.\n\t */\n\treset() {\n\n\t\tthis.target.copy( this.target0 );\n\t\tthis.object.position.copy( this.position0 );\n\t\tthis.object.zoom = this.zoom0;\n\n\t\tthis.object.updateProjectionMatrix();\n\t\tthis.dispatchEvent( _changeEvent );\n\n\t\tthis.update();\n\n\t\tthis.state = _STATE.NONE;\n\n\t}\n\n\tupdate( deltaTime = null ) {\n\n\t\tconst position = this.object.position;\n\n\t\t_v.copy( position ).sub( this.target );\n\n\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t_v.applyQuaternion( this._quat );\n\n\t\t// angle from z-axis around y-axis\n\t\tthis._spherical.setFromVector3( _v );\n\n\t\tif ( this.autoRotate && this.state === _STATE.NONE ) {\n\n\t\t\tthis._rotateLeft( this._getAutoRotationAngle( deltaTime ) );\n\n\t\t}\n\n\t\tif ( this.enableDamping ) {\n\n\t\t\tthis._spherical.theta += this._sphericalDelta.theta * this.dampingFactor;\n\t\t\tthis._spherical.phi += this._sphericalDelta.phi * this.dampingFactor;\n\n\t\t} else {\n\n\t\t\tthis._spherical.theta += this._sphericalDelta.theta;\n\t\t\tthis._spherical.phi += this._sphericalDelta.phi;\n\n\t\t}\n\n\t\t// restrict theta to be between desired limits\n\n\t\tlet min = this.minAzimuthAngle;\n\t\tlet max = this.maxAzimuthAngle;\n\n\t\tif ( isFinite( min ) && isFinite( max ) ) {\n\n\t\t\tif ( min < - Math.PI ) min += _twoPI; else if ( min > Math.PI ) min -= _twoPI;\n\n\t\t\tif ( max < - Math.PI ) max += _twoPI; else if ( max > Math.PI ) max -= _twoPI;\n\n\t\t\tif ( min <= max ) {\n\n\t\t\t\tthis._spherical.theta = Math.max( min, Math.min( max, this._spherical.theta ) );\n\n\t\t\t} else {\n\n\t\t\t\tthis._spherical.theta = ( this._spherical.theta > ( min + max ) / 2 ) ?\n\t\t\t\t\tMath.max( min, this._spherical.theta ) :\n\t\t\t\t\tMath.min( max, this._spherical.theta );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// restrict phi to be between desired limits\n\t\tthis._spherical.phi = Math.max( this.minPolarAngle, Math.min( this.maxPolarAngle, this._spherical.phi ) );\n\n\t\tthis._spherical.makeSafe();\n\n\n\t\t// move target to panned location\n\n\t\tif ( this.enableDamping === true ) {\n\n\t\t\tthis.target.addScaledVector( this._panOffset, this.dampingFactor );\n\n\t\t} else {\n\n\t\t\tthis.target.add( this._panOffset );\n\n\t\t}\n\n\t\t// Limit the target distance from the cursor to create a sphere around the center of interest\n\t\tthis.target.sub( this.cursor );\n\t\tthis.target.clampLength( this.minTargetRadius, this.maxTargetRadius );\n\t\tthis.target.add( this.cursor );\n\n\t\tlet zoomChanged = false;\n\t\t// adjust the camera position based on zoom only if we're not zooming to the cursor or if it's an ortho camera\n\t\t// we adjust zoom later in these cases\n\t\tif ( this.zoomToCursor && this._performCursorZoom || this.object.isOrthographicCamera ) {\n\n\t\t\tthis._spherical.radius = this._clampDistance( this._spherical.radius );\n\n\t\t} else {\n\n\t\t\tconst prevRadius = this._spherical.radius;\n\t\t\tthis._spherical.radius = this._clampDistance( this._spherical.radius * this._scale );\n\t\t\tzoomChanged = prevRadius != this._spherical.radius;\n\n\t\t}\n\n\t\t_v.setFromSpherical( this._spherical );\n\n\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t_v.applyQuaternion( this._quatInverse );\n\n\t\tposition.copy( this.target ).add( _v );\n\n\t\tthis.object.lookAt( this.target );\n\n\t\tif ( this.enableDamping === true ) {\n\n\t\t\tthis._sphericalDelta.theta *= ( 1 - this.dampingFactor );\n\t\t\tthis._sphericalDelta.phi *= ( 1 - this.dampingFactor );\n\n\t\t\tthis._panOffset.multiplyScalar( 1 - this.dampingFactor );\n\n\t\t} else {\n\n\t\t\tthis._sphericalDelta.set( 0, 0, 0 );\n\n\t\t\tthis._panOffset.set( 0, 0, 0 );\n\n\t\t}\n\n\t\t// adjust camera position\n\t\tif ( this.zoomToCursor && this._performCursorZoom ) {\n\n\t\t\tlet newRadius = null;\n\t\t\tif ( this.object.isPerspectiveCamera ) {\n\n\t\t\t\t// move the camera down the pointer ray\n\t\t\t\t// this method avoids floating point error\n\t\t\t\tconst prevRadius = _v.length();\n\t\t\t\tnewRadius = this._clampDistance( prevRadius * this._scale );\n\n\t\t\t\tconst radiusDelta = prevRadius - newRadius;\n\t\t\t\tthis.object.position.addScaledVector( this._dollyDirection, radiusDelta );\n\t\t\t\tthis.object.updateMatrixWorld();\n\n\t\t\t\tzoomChanged = !! radiusDelta;\n\n\t\t\t} else if ( this.object.isOrthographicCamera ) {\n\n\t\t\t\t// adjust the ortho camera position based on zoom changes\n\t\t\t\tconst mouseBefore = new Vector3( this._mouse.x, this._mouse.y, 0 );\n\t\t\t\tmouseBefore.unproject( this.object );\n\n\t\t\t\tconst prevZoom = this.object.zoom;\n\t\t\t\tthis.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom / this._scale ) );\n\t\t\t\tthis.object.updateProjectionMatrix();\n\n\t\t\t\tzoomChanged = prevZoom !== this.object.zoom;\n\n\t\t\t\tconst mouseAfter = new Vector3( this._mouse.x, this._mouse.y, 0 );\n\t\t\t\tmouseAfter.unproject( this.object );\n\n\t\t\t\tthis.object.position.sub( mouseAfter ).add( mouseBefore );\n\t\t\t\tthis.object.updateMatrixWorld();\n\n\t\t\t\tnewRadius = _v.length();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled.' );\n\t\t\t\tthis.zoomToCursor = false;\n\n\t\t\t}\n\n\t\t\t// handle the placement of the target\n\t\t\tif ( newRadius !== null ) {\n\n\t\t\t\tif ( this.screenSpacePanning ) {\n\n\t\t\t\t\t// position the orbit target in front of the new camera position\n\t\t\t\t\tthis.target.set( 0, 0, - 1 )\n\t\t\t\t\t\t.transformDirection( this.object.matrix )\n\t\t\t\t\t\t.multiplyScalar( newRadius )\n\t\t\t\t\t\t.add( this.object.position );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// get the ray and translation plane to compute target\n\t\t\t\t\t_ray.origin.copy( this.object.position );\n\t\t\t\t\t_ray.direction.set( 0, 0, - 1 ).transformDirection( this.object.matrix );\n\n\t\t\t\t\t// if the camera is 20 degrees above the horizon then don't adjust the focus target to avoid\n\t\t\t\t\t// extremely large values\n\t\t\t\t\tif ( Math.abs( this.object.up.dot( _ray.direction ) ) < _TILT_LIMIT ) {\n\n\t\t\t\t\t\tthis.object.lookAt( this.target );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_plane.setFromNormalAndCoplanarPoint( this.object.up, this.target );\n\t\t\t\t\t\t_ray.intersectPlane( _plane, this.target );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( this.object.isOrthographicCamera ) {\n\n\t\t\tconst prevZoom = this.object.zoom;\n\t\t\tthis.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom / this._scale ) );\n\n\t\t\tif ( prevZoom !== this.object.zoom ) {\n\n\t\t\t\tthis.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._scale = 1;\n\t\tthis._performCursorZoom = false;\n\n\t\t// update condition is:\n\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\tif ( zoomChanged ||\n\t\t\tthis._lastPosition.distanceToSquared( this.object.position ) > _EPS ||\n\t\t\t8 * ( 1 - this._lastQuaternion.dot( this.object.quaternion ) ) > _EPS ||\n\t\t\tthis._lastTargetPosition.distanceToSquared( this.target ) > _EPS ) {\n\n\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t\tthis._lastPosition.copy( this.object.position );\n\t\t\tthis._lastQuaternion.copy( this.object.quaternion );\n\t\t\tthis._lastTargetPosition.copy( this.target );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t_getAutoRotationAngle( deltaTime ) {\n\n\t\tif ( deltaTime !== null ) {\n\n\t\t\treturn ( _twoPI / 60 * this.autoRotateSpeed ) * deltaTime;\n\n\t\t} else {\n\n\t\t\treturn _twoPI / 60 / 60 * this.autoRotateSpeed;\n\n\t\t}\n\n\t}\n\n\t_getZoomScale( delta ) {\n\n\t\tconst normalizedDelta = Math.abs( delta * 0.01 );\n\t\treturn Math.pow( 0.95, this.zoomSpeed * normalizedDelta );\n\n\t}\n\n\t_rotateLeft( angle ) {\n\n\t\tthis._sphericalDelta.theta -= angle;\n\n\t}\n\n\t_rotateUp( angle ) {\n\n\t\tthis._sphericalDelta.phi -= angle;\n\n\t}\n\n\t_panLeft( distance, objectMatrix ) {\n\n\t\t_v.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t_v.multiplyScalar( - distance );\n\n\t\tthis._panOffset.add( _v );\n\n\t}\n\n\t_panUp( distance, objectMatrix ) {\n\n\t\tif ( this.screenSpacePanning === true ) {\n\n\t\t\t_v.setFromMatrixColumn( objectMatrix, 1 );\n\n\t\t} else {\n\n\t\t\t_v.setFromMatrixColumn( objectMatrix, 0 );\n\t\t\t_v.crossVectors( this.object.up, _v );\n\n\t\t}\n\n\t\t_v.multiplyScalar( distance );\n\n\t\tthis._panOffset.add( _v );\n\n\t}\n\n\t// deltaX and deltaY are in pixels; right and down are positive\n\t_pan( deltaX, deltaY ) {\n\n\t\tconst element = this.domElement;\n\n\t\tif ( this.object.isPerspectiveCamera ) {\n\n\t\t\t// perspective\n\t\t\tconst position = this.object.position;\n\t\t\t_v.copy( position ).sub( this.target );\n\t\t\tlet targetDistance = _v.length();\n\n\t\t\t// half of the fov is center to top of screen\n\t\t\ttargetDistance *= Math.tan( ( this.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t// we use only clientHeight here so aspect ratio does not distort speed\n\t\t\tthis._panLeft( 2 * deltaX * targetDistance / element.clientHeight, this.object.matrix );\n\t\t\tthis._panUp( 2 * deltaY * targetDistance / element.clientHeight, this.object.matrix );\n\n\t\t} else if ( this.object.isOrthographicCamera ) {\n\n\t\t\t// orthographic\n\t\t\tthis._panLeft( deltaX * ( this.object.right - this.object.left ) / this.object.zoom / element.clientWidth, this.object.matrix );\n\t\t\tthis._panUp( deltaY * ( this.object.top - this.object.bottom ) / this.object.zoom / element.clientHeight, this.object.matrix );\n\n\t\t} else {\n\n\t\t\t// camera neither orthographic nor perspective\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\tthis.enablePan = false;\n\n\t\t}\n\n\t}\n\n\t_dollyOut( dollyScale ) {\n\n\t\tif ( this.object.isPerspectiveCamera || this.object.isOrthographicCamera ) {\n\n\t\t\tthis._scale /= dollyScale;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tthis.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\t_dollyIn( dollyScale ) {\n\n\t\tif ( this.object.isPerspectiveCamera || this.object.isOrthographicCamera ) {\n\n\t\t\tthis._scale *= dollyScale;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tthis.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\t_updateZoomParameters( x, y ) {\n\n\t\tif ( ! this.zoomToCursor ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._performCursorZoom = true;\n\n\t\tconst rect = this.domElement.getBoundingClientRect();\n\t\tconst dx = x - rect.left;\n\t\tconst dy = y - rect.top;\n\t\tconst w = rect.width;\n\t\tconst h = rect.height;\n\n\t\tthis._mouse.x = ( dx / w ) * 2 - 1;\n\t\tthis._mouse.y = - ( dy / h ) * 2 + 1;\n\n\t\tthis._dollyDirection.set( this._mouse.x, this._mouse.y, 1 ).unproject( this.object ).sub( this.object.position ).normalize();\n\n\t}\n\n\t_clampDistance( dist ) {\n\n\t\treturn Math.max( this.minDistance, Math.min( this.maxDistance, dist ) );\n\n\t}\n\n\t//\n\t// event callbacks - update the object state\n\t//\n\n\t_handleMouseDownRotate( event ) {\n\n\t\tthis._rotateStart.set( event.clientX, event.clientY );\n\n\t}\n\n\t_handleMouseDownDolly( event ) {\n\n\t\tthis._updateZoomParameters( event.clientX, event.clientX );\n\t\tthis._dollyStart.set( event.clientX, event.clientY );\n\n\t}\n\n\t_handleMouseDownPan( event ) {\n\n\t\tthis._panStart.set( event.clientX, event.clientY );\n\n\t}\n\n\t_handleMouseMoveRotate( event ) {\n\n\t\tthis._rotateEnd.set( event.clientX, event.clientY );\n\n\t\tthis._rotateDelta.subVectors( this._rotateEnd, this._rotateStart ).multiplyScalar( this.rotateSpeed );\n\n\t\tconst element = this.domElement;\n\n\t\tthis._rotateLeft( _twoPI * this._rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\tthis._rotateUp( _twoPI * this._rotateDelta.y / element.clientHeight );\n\n\t\tthis._rotateStart.copy( this._rotateEnd );\n\n\t\tthis.update();\n\n\t}\n\n\t_handleMouseMoveDolly( event ) {\n\n\t\tthis._dollyEnd.set( event.clientX, event.clientY );\n\n\t\tthis._dollyDelta.subVectors( this._dollyEnd, this._dollyStart );\n\n\t\tif ( this._dollyDelta.y > 0 ) {\n\n\t\t\tthis._dollyOut( this._getZoomScale( this._dollyDelta.y ) );\n\n\t\t} else if ( this._dollyDelta.y < 0 ) {\n\n\t\t\tthis._dollyIn( this._getZoomScale( this._dollyDelta.y ) );\n\n\t\t}\n\n\t\tthis._dollyStart.copy( this._dollyEnd );\n\n\t\tthis.update();\n\n\t}\n\n\t_handleMouseMovePan( event ) {\n\n\t\tthis._panEnd.set( event.clientX, event.clientY );\n\n\t\tthis._panDelta.subVectors( this._panEnd, this._panStart ).multiplyScalar( this.panSpeed );\n\n\t\tthis._pan( this._panDelta.x, this._panDelta.y );\n\n\t\tthis._panStart.copy( this._panEnd );\n\n\t\tthis.update();\n\n\t}\n\n\t_handleMouseWheel( event ) {\n\n\t\tthis._updateZoomParameters( event.clientX, event.clientY );\n\n\t\tif ( event.deltaY < 0 ) {\n\n\t\t\tthis._dollyIn( this._getZoomScale( event.deltaY ) );\n\n\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\tthis._dollyOut( this._getZoomScale( event.deltaY ) );\n\n\t\t}\n\n\t\tthis.update();\n\n\t}\n\n\t_handleKeyDown( event ) {\n\n\t\tlet needsUpdate = false;\n\n\t\tswitch ( event.code ) {\n\n\t\t\tcase this.keys.UP:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tif ( this.enableRotate ) {\n\n\t\t\t\t\t\tthis._rotateUp( _twoPI * this.keyRotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( this.enablePan ) {\n\n\t\t\t\t\t\tthis._pan( 0, this.keyPanSpeed );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase this.keys.BOTTOM:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tif ( this.enableRotate ) {\n\n\t\t\t\t\t\tthis._rotateUp( - _twoPI * this.keyRotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( this.enablePan ) {\n\n\t\t\t\t\t\tthis._pan( 0, - this.keyPanSpeed );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase this.keys.LEFT:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tif ( this.enableRotate ) {\n\n\t\t\t\t\t\tthis._rotateLeft( _twoPI * this.keyRotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( this.enablePan ) {\n\n\t\t\t\t\t\tthis._pan( this.keyPanSpeed, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase this.keys.RIGHT:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tif ( this.enableRotate ) {\n\n\t\t\t\t\t\tthis._rotateLeft( - _twoPI * this.keyRotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( this.enablePan ) {\n\n\t\t\t\t\t\tthis._pan( - this.keyPanSpeed, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\t// prevent the browser from scrolling on cursor keys\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.update();\n\n\t\t}\n\n\n\t}\n\n\t_handleTouchStartRotate( event ) {\n\n\t\tif ( this._pointers.length === 1 ) {\n\n\t\t\tthis._rotateStart.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._rotateStart.set( x, y );\n\n\t\t}\n\n\t}\n\n\t_handleTouchStartPan( event ) {\n\n\t\tif ( this._pointers.length === 1 ) {\n\n\t\t\tthis._panStart.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._panStart.set( x, y );\n\n\t\t}\n\n\t}\n\n\t_handleTouchStartDolly( event ) {\n\n\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\tconst dx = event.pageX - position.x;\n\t\tconst dy = event.pageY - position.y;\n\n\t\tconst distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tthis._dollyStart.set( 0, distance );\n\n\t}\n\n\t_handleTouchStartDollyPan( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchStartDolly( event );\n\n\t\tif ( this.enablePan ) this._handleTouchStartPan( event );\n\n\t}\n\n\t_handleTouchStartDollyRotate( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchStartDolly( event );\n\n\t\tif ( this.enableRotate ) this._handleTouchStartRotate( event );\n\n\t}\n\n\t_handleTouchMoveRotate( event ) {\n\n\t\tif ( this._pointers.length == 1 ) {\n\n\t\t\tthis._rotateEnd.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._rotateEnd.set( x, y );\n\n\t\t}\n\n\t\tthis._rotateDelta.subVectors( this._rotateEnd, this._rotateStart ).multiplyScalar( this.rotateSpeed );\n\n\t\tconst element = this.domElement;\n\n\t\tthis._rotateLeft( _twoPI * this._rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\tthis._rotateUp( _twoPI * this._rotateDelta.y / element.clientHeight );\n\n\t\tthis._rotateStart.copy( this._rotateEnd );\n\n\t}\n\n\t_handleTouchMovePan( event ) {\n\n\t\tif ( this._pointers.length === 1 ) {\n\n\t\t\tthis._panEnd.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._panEnd.set( x, y );\n\n\t\t}\n\n\t\tthis._panDelta.subVectors( this._panEnd, this._panStart ).multiplyScalar( this.panSpeed );\n\n\t\tthis._pan( this._panDelta.x, this._panDelta.y );\n\n\t\tthis._panStart.copy( this._panEnd );\n\n\t}\n\n\t_handleTouchMoveDolly( event ) {\n\n\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\tconst dx = event.pageX - position.x;\n\t\tconst dy = event.pageY - position.y;\n\n\t\tconst distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tthis._dollyEnd.set( 0, distance );\n\n\t\tthis._dollyDelta.set( 0, Math.pow( this._dollyEnd.y / this._dollyStart.y, this.zoomSpeed ) );\n\n\t\tthis._dollyOut( this._dollyDelta.y );\n\n\t\tthis._dollyStart.copy( this._dollyEnd );\n\n\t\tconst centerX = ( event.pageX + position.x ) * 0.5;\n\t\tconst centerY = ( event.pageY + position.y ) * 0.5;\n\n\t\tthis._updateZoomParameters( centerX, centerY );\n\n\t}\n\n\t_handleTouchMoveDollyPan( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchMoveDolly( event );\n\n\t\tif ( this.enablePan ) this._handleTouchMovePan( event );\n\n\t}\n\n\t_handleTouchMoveDollyRotate( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchMoveDolly( event );\n\n\t\tif ( this.enableRotate ) this._handleTouchMoveRotate( event );\n\n\t}\n\n\t// pointers\n\n\t_addPointer( event ) {\n\n\t\tthis._pointers.push( event.pointerId );\n\n\t}\n\n\t_removePointer( event ) {\n\n\t\tdelete this._pointerPositions[ event.pointerId ];\n\n\t\tfor ( let i = 0; i < this._pointers.length; i ++ ) {\n\n\t\t\tif ( this._pointers[ i ] == event.pointerId ) {\n\n\t\t\t\tthis._pointers.splice( i, 1 );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_isTrackingPointer( event ) {\n\n\t\tfor ( let i = 0; i < this._pointers.length; i ++ ) {\n\n\t\t\tif ( this._pointers[ i ] == event.pointerId ) return true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t_trackPointer( event ) {\n\n\t\tlet position = this._pointerPositions[ event.pointerId ];\n\n\t\tif ( position === undefined ) {\n\n\t\t\tposition = new Vector2();\n\t\t\tthis._pointerPositions[ event.pointerId ] = position;\n\n\t\t}\n\n\t\tposition.set( event.pageX, event.pageY );\n\n\t}\n\n\t_getSecondPointerPosition( event ) {\n\n\t\tconst pointerId = ( event.pointerId === this._pointers[ 0 ] ) ? this._pointers[ 1 ] : this._pointers[ 0 ];\n\n\t\treturn this._pointerPositions[ pointerId ];\n\n\t}\n\n\t//\n\n\t_customWheelEvent( event ) {\n\n\t\tconst mode = event.deltaMode;\n\n\t\t// minimal wheel event altered to meet delta-zoom demand\n\t\tconst newEvent = {\n\t\t\tclientX: event.clientX,\n\t\t\tclientY: event.clientY,\n\t\t\tdeltaY: event.deltaY,\n\t\t};\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase 1: // LINE_MODE\n\t\t\t\tnewEvent.deltaY *= 16;\n\t\t\t\tbreak;\n\n\t\t\tcase 2: // PAGE_MODE\n\t\t\t\tnewEvent.deltaY *= 100;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\t// detect if event was triggered by pinching\n\t\tif ( event.ctrlKey && ! this._controlActive ) {\n\n\t\t\tnewEvent.deltaY *= 10;\n\n\t\t}\n\n\t\treturn newEvent;\n\n\t}\n\n}\n\nfunction onPointerDown( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tif ( this._pointers.length === 0 ) {\n\n\t\tthis.domElement.setPointerCapture( event.pointerId );\n\n\t\tthis.domElement.addEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.addEventListener( 'pointerup', this._onPointerUp );\n\n\t}\n\n\t//\n\n\tif ( this._isTrackingPointer( event ) ) return;\n\n\t//\n\n\tthis._addPointer( event );\n\n\tif ( event.pointerType === 'touch' ) {\n\n\t\tthis._onTouchStart( event );\n\n\t} else {\n\n\t\tthis._onMouseDown( event );\n\n\t}\n\n}\n\nfunction onPointerMove( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tif ( event.pointerType === 'touch' ) {\n\n\t\tthis._onTouchMove( event );\n\n\t} else {\n\n\t\tthis._onMouseMove( event );\n\n\t}\n\n}\n\nfunction onPointerUp( event ) {\n\n\tthis._removePointer( event );\n\n\tswitch ( this._pointers.length ) {\n\n\t\tcase 0:\n\n\t\t\tthis.domElement.releasePointerCapture( event.pointerId );\n\n\t\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\t\t\tthis.domElement.removeEventListener( 'pointerup', this._onPointerUp );\n\n\t\t\tthis.dispatchEvent( _endEvent );\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t\t\tbreak;\n\n\t\tcase 1:\n\n\t\t\tconst pointerId = this._pointers[ 0 ];\n\t\t\tconst position = this._pointerPositions[ pointerId ];\n\n\t\t\t// minimal placeholder event - allows state correction on pointer-up\n\t\t\tthis._onTouchStart( { pointerId: pointerId, pageX: position.x, pageY: position.y } );\n\n\t\t\tbreak;\n\n\t}\n\n}\n\nfunction onMouseDown( event ) {\n\n\tlet mouseAction;\n\n\tswitch ( event.button ) {\n\n\t\tcase 0:\n\n\t\t\tmouseAction = this.mouseButtons.LEFT;\n\t\t\tbreak;\n\n\t\tcase 1:\n\n\t\t\tmouseAction = this.mouseButtons.MIDDLE;\n\t\t\tbreak;\n\n\t\tcase 2:\n\n\t\t\tmouseAction = this.mouseButtons.RIGHT;\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tmouseAction = - 1;\n\n\t}\n\n\tswitch ( mouseAction ) {\n\n\t\tcase MOUSE.DOLLY:\n\n\t\t\tif ( this.enableZoom === false ) return;\n\n\t\t\tthis._handleMouseDownDolly( event );\n\n\t\t\tthis.state = _STATE.DOLLY;\n\n\t\t\tbreak;\n\n\t\tcase MOUSE.ROTATE:\n\n\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\t\tthis._handleMouseDownPan( event );\n\n\t\t\t\tthis.state = _STATE.PAN;\n\n\t\t\t} else {\n\n\t\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\t\tthis._handleMouseDownRotate( event );\n\n\t\t\t\tthis.state = _STATE.ROTATE;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase MOUSE.PAN:\n\n\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\t\tthis._handleMouseDownRotate( event );\n\n\t\t\t\tthis.state = _STATE.ROTATE;\n\n\t\t\t} else {\n\n\t\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\t\tthis._handleMouseDownPan( event );\n\n\t\t\t\tthis.state = _STATE.PAN;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t}\n\n\tif ( this.state !== _STATE.NONE ) {\n\n\t\tthis.dispatchEvent( _startEvent );\n\n\t}\n\n}\n\nfunction onMouseMove( event ) {\n\n\tswitch ( this.state ) {\n\n\t\tcase _STATE.ROTATE:\n\n\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\tthis._handleMouseMoveRotate( event );\n\n\t\t\tbreak;\n\n\t\tcase _STATE.DOLLY:\n\n\t\t\tif ( this.enableZoom === false ) return;\n\n\t\t\tthis._handleMouseMoveDolly( event );\n\n\t\t\tbreak;\n\n\t\tcase _STATE.PAN:\n\n\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\tthis._handleMouseMovePan( event );\n\n\t\t\tbreak;\n\n\t}\n\n}\n\nfunction onMouseWheel( event ) {\n\n\tif ( this.enabled === false || this.enableZoom === false || this.state !== _STATE.NONE ) return;\n\n\tevent.preventDefault();\n\n\tthis.dispatchEvent( _startEvent );\n\n\tthis._handleMouseWheel( this._customWheelEvent( event ) );\n\n\tthis.dispatchEvent( _endEvent );\n\n}\n\nfunction onKeyDown( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tthis._handleKeyDown( event );\n\n}\n\nfunction onTouchStart( event ) {\n\n\tthis._trackPointer( event );\n\n\tswitch ( this._pointers.length ) {\n\n\t\tcase 1:\n\n\t\t\tswitch ( this.touches.ONE ) {\n\n\t\t\t\tcase TOUCH.ROTATE:\n\n\t\t\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartRotate( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TOUCH.PAN:\n\n\t\t\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartPan( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tthis.state = _STATE.NONE;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase 2:\n\n\t\t\tswitch ( this.touches.TWO ) {\n\n\t\t\t\tcase TOUCH.DOLLY_PAN:\n\n\t\t\t\t\tif ( this.enableZoom === false && this.enablePan === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartDollyPan( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_DOLLY_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TOUCH.DOLLY_ROTATE:\n\n\t\t\t\t\tif ( this.enableZoom === false && this.enableRotate === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartDollyRotate( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_DOLLY_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tthis.state = _STATE.NONE;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t}\n\n\tif ( this.state !== _STATE.NONE ) {\n\n\t\tthis.dispatchEvent( _startEvent );\n\n\t}\n\n}\n\nfunction onTouchMove( event ) {\n\n\tthis._trackPointer( event );\n\n\tswitch ( this.state ) {\n\n\t\tcase _STATE.TOUCH_ROTATE:\n\n\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\tthis._handleTouchMoveRotate( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tcase _STATE.TOUCH_PAN:\n\n\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\tthis._handleTouchMovePan( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tcase _STATE.TOUCH_DOLLY_PAN:\n\n\t\t\tif ( this.enableZoom === false && this.enablePan === false ) return;\n\n\t\t\tthis._handleTouchMoveDollyPan( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tcase _STATE.TOUCH_DOLLY_ROTATE:\n\n\t\t\tif ( this.enableZoom === false && this.enableRotate === false ) return;\n\n\t\t\tthis._handleTouchMoveDollyRotate( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t}\n\n}\n\nfunction onContextMenu( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tevent.preventDefault();\n\n}\n\nfunction interceptControlDown( event ) {\n\n\tif ( event.key === 'Control' ) {\n\n\t\tthis._controlActive = true;\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\n\t\tdocument.addEventListener( 'keyup', this._interceptControlUp, { passive: true, capture: true } );\n\n\t}\n\n}\n\nfunction interceptControlUp( event ) {\n\n\tif ( event.key === 'Control' ) {\n\n\t\tthis._controlActive = false;\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\n\t\tdocument.removeEventListener( 'keyup', this._interceptControlUp, { passive: true, capture: true } );\n\n\t}\n\n}\n\nexport { OrbitControls };\n","import {\n\tBox3,\n\tFloat32BufferAttribute,\n\tInstancedBufferGeometry,\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tSphere,\n\tVector3,\n\tWireframeGeometry\n} from 'three';\n\nconst _box = new Box3();\nconst _vector = new Vector3();\n\n/**\n * A series of vertex pairs, forming line segments.\n *\n * This is used in {@link LineSegments2} to describe the shape.\n *\n * @augments InstancedBufferGeometry\n * @three_import import { LineSegmentsGeometry } from 'three/addons/lines/LineSegmentsGeometry.js';\n */\nclass LineSegmentsGeometry extends InstancedBufferGeometry {\n\n\t/**\n\t * Constructs a new line segments geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineSegmentsGeometry = true;\n\n\t\tthis.type = 'LineSegmentsGeometry';\n\n\t\tconst positions = [ - 1, 2, 0, 1, 2, 0, - 1, 1, 0, 1, 1, 0, - 1, 0, 0, 1, 0, 0, - 1, - 1, 0, 1, - 1, 0 ];\n\t\tconst uvs = [ - 1, 2, 1, 2, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 2, 1, - 2 ];\n\t\tconst index = [ 0, 2, 1, 2, 3, 1, 2, 4, 3, 4, 5, 3, 4, 6, 5, 6, 7, 5 ];\n\n\t\tthis.setIndex( index );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 transformation matrix to the geometry.\n\t *\n\t * @param {Matrix4} matrix - The matrix to apply.\n\t * @return {LineSegmentsGeometry} A reference to this instance.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined ) {\n\n\t\t\tstart.applyMatrix4( matrix );\n\n\t\t\tend.applyMatrix4( matrix );\n\n\t\t\tstart.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given line positions for this geometry. The length must be a multiple of six since\n\t * each line segment is defined by a start end vertex in the pattern `(xyz xyz)`.\n\t *\n\t * @param {Float32Array|Array<number>} array - The position data to set.\n\t * @return {LineSegmentsGeometry} A reference to this geometry.\n\t */\n\tsetPositions( array ) {\n\n\t\tlet lineSegments;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\tlineSegments = array;\n\n\t\t} else if ( Array.isArray( array ) ) {\n\n\t\t\tlineSegments = new Float32Array( array );\n\n\t\t}\n\n\t\tconst instanceBuffer = new InstancedInterleavedBuffer( lineSegments, 6, 1 ); // xyz, xyz\n\n\t\tthis.setAttribute( 'instanceStart', new InterleavedBufferAttribute( instanceBuffer, 3, 0 ) ); // xyz\n\t\tthis.setAttribute( 'instanceEnd', new InterleavedBufferAttribute( instanceBuffer, 3, 3 ) ); // xyz\n\n\t\tthis.instanceCount = this.attributes.instanceStart.count;\n\n\t\t//\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given line colors for this geometry. The length must be a multiple of six since\n\t * each line segment is defined by a start end color in the pattern `(rgb rgb)`.\n\t *\n\t * @param {Float32Array|Array<number>} array - The position data to set.\n\t * @return {LineSegmentsGeometry} A reference to this geometry.\n\t */\n\tsetColors( array ) {\n\n\t\tlet colors;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\tcolors = array;\n\n\t\t} else if ( Array.isArray( array ) ) {\n\n\t\t\tcolors = new Float32Array( array );\n\n\t\t}\n\n\t\tconst instanceColorBuffer = new InstancedInterleavedBuffer( colors, 6, 1 ); // rgb, rgb\n\n\t\tthis.setAttribute( 'instanceColorStart', new InterleavedBufferAttribute( instanceColorBuffer, 3, 0 ) ); // rgb\n\t\tthis.setAttribute( 'instanceColorEnd', new InterleavedBufferAttribute( instanceColorBuffer, 3, 3 ) ); // rgb\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Setups this line segments geometry from the given wireframe geometry.\n\t *\n\t * @param {WireframeGeometry} geometry - The geometry that should be used as a data source for this geometry.\n\t * @return {LineSegmentsGeometry} A reference to this geometry.\n\t */\n\tfromWireframeGeometry( geometry ) {\n\n\t\tthis.setPositions( geometry.attributes.position.array );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Setups this line segments geometry from the given edges geometry.\n\t *\n\t * @param {EdgesGeometry} geometry - The geometry that should be used as a data source for this geometry.\n\t * @return {LineSegmentsGeometry} A reference to this geometry.\n\t */\n\tfromEdgesGeometry( geometry ) {\n\n\t\tthis.setPositions( geometry.attributes.position.array );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Setups this line segments geometry from the given mesh.\n\t *\n\t * @param {Mesh} mesh - The mesh geometry that should be used as a data source for this geometry.\n\t * @return {LineSegmentsGeometry} A reference to this geometry.\n\t */\n\tfromMesh( mesh ) {\n\n\t\tthis.fromWireframeGeometry( new WireframeGeometry( mesh.geometry ) );\n\n\t\t// set colors, maybe\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Setups this line segments geometry from the given line segments.\n\t *\n\t * @param {LineSegments} lineSegments - The line segments that should be used as a data source for this geometry.\n\t * Assumes the source geometry is not using indices.\n\t * @return {LineSegmentsGeometry} A reference to this geometry.\n\t */\n\tfromLineSegments( lineSegments ) {\n\n\t\tconst geometry = lineSegments.geometry;\n\n\t\tthis.setPositions( geometry.attributes.position.array ); // assumes non-indexed\n\n\t\t// set colors, maybe\n\n\t\treturn this;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined && end !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( start );\n\n\t\t\t_box.setFromBufferAttribute( end );\n\n\t\t\tthis.boundingBox.union( _box );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined && end !== undefined ) {\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\tthis.boundingBox.getCenter( center );\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = start.count; i < il; i ++ ) {\n\n\t\t\t\t_vector.fromBufferAttribute( start, i );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t\t_vector.fromBufferAttribute( end, i );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\tconsole.error( 'THREE.LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\t// todo\n\n\t}\n\n}\n\nexport { LineSegmentsGeometry };\n","import {\n\tShaderLib,\n\tShaderMaterial,\n\tUniformsLib,\n\tUniformsUtils,\n\tVector2,\n} from 'three';\n\nUniformsLib.line = {\n\n\tworldUnits: { value: 1 },\n\tlinewidth: { value: 1 },\n\tresolution: { value: new Vector2( 1, 1 ) },\n\tdashOffset: { value: 0 },\n\tdashScale: { value: 1 },\n\tdashSize: { value: 1 },\n\tgapSize: { value: 1 } // todo FIX - maybe change to totalSize\n\n};\n\nShaderLib[ 'line' ] = {\n\n\tuniforms: UniformsUtils.merge( [\n\t\tUniformsLib.common,\n\t\tUniformsLib.fog,\n\t\tUniformsLib.line\n\t] ),\n\n\tvertexShader:\n\t/* glsl */`\n\t\t#include <common>\n\t\t#include <color_pars_vertex>\n\t\t#include <fog_pars_vertex>\n\t\t#include <logdepthbuf_pars_vertex>\n\t\t#include <clipping_planes_pars_vertex>\n\n\t\tuniform float linewidth;\n\t\tuniform vec2 resolution;\n\n\t\tattribute vec3 instanceStart;\n\t\tattribute vec3 instanceEnd;\n\n\t\tattribute vec3 instanceColorStart;\n\t\tattribute vec3 instanceColorEnd;\n\n\t\t#ifdef WORLD_UNITS\n\n\t\t\tvarying vec4 worldPos;\n\t\t\tvarying vec3 worldStart;\n\t\t\tvarying vec3 worldEnd;\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t#endif\n\n\t\t#else\n\n\t\t\tvarying vec2 vUv;\n\n\t\t#endif\n\n\t\t#ifdef USE_DASH\n\n\t\t\tuniform float dashScale;\n\t\t\tattribute float instanceDistanceStart;\n\t\t\tattribute float instanceDistanceEnd;\n\t\t\tvarying float vLineDistance;\n\n\t\t#endif\n\n\t\tvoid trimSegment( const in vec4 start, inout vec4 end ) {\n\n\t\t\t// trim end segment so it terminates between the camera plane and the near plane\n\n\t\t\t// conservative estimate of the near plane\n\t\t\tfloat a = projectionMatrix[ 2 ][ 2 ]; // 3nd entry in 3th column\n\t\t\tfloat b = projectionMatrix[ 3 ][ 2 ]; // 3nd entry in 4th column\n\t\t\tfloat nearEstimate = - 0.5 * b / a;\n\n\t\t\tfloat alpha = ( nearEstimate - start.z ) / ( end.z - start.z );\n\n\t\t\tend.xyz = mix( start.xyz, end.xyz, alpha );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#ifdef USE_COLOR\n\n\t\t\t\tvColor.xyz = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;\n\n\t\t\t#endif\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tvLineDistance = ( position.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd;\n\t\t\t\tvUv = uv;\n\n\t\t\t#endif\n\n\t\t\tfloat aspect = resolution.x / resolution.y;\n\n\t\t\t// camera space\n\t\t\tvec4 start = modelViewMatrix * vec4( instanceStart, 1.0 );\n\t\t\tvec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 );\n\n\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\tworldStart = start.xyz;\n\t\t\t\tworldEnd = end.xyz;\n\n\t\t\t#else\n\n\t\t\t\tvUv = uv;\n\n\t\t\t#endif\n\n\t\t\t// special case for perspective projection, and segments that terminate either in, or behind, the camera plane\n\t\t\t// clearly the gpu firmware has a way of addressing this issue when projecting into ndc space\n\t\t\t// but we need to perform ndc-space calculations in the shader, so we must address this issue directly\n\t\t\t// perhaps there is a more elegant solution -- WestLangley\n\n\t\t\tbool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); // 4th entry in the 3rd column\n\n\t\t\tif ( perspective ) {\n\n\t\t\t\tif ( start.z < 0.0 && end.z >= 0.0 ) {\n\n\t\t\t\t\ttrimSegment( start, end );\n\n\t\t\t\t} else if ( end.z < 0.0 && start.z >= 0.0 ) {\n\n\t\t\t\t\ttrimSegment( end, start );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// clip space\n\t\t\tvec4 clipStart = projectionMatrix * start;\n\t\t\tvec4 clipEnd = projectionMatrix * end;\n\n\t\t\t// ndc space\n\t\t\tvec3 ndcStart = clipStart.xyz / clipStart.w;\n\t\t\tvec3 ndcEnd = clipEnd.xyz / clipEnd.w;\n\n\t\t\t// direction\n\t\t\tvec2 dir = ndcEnd.xy - ndcStart.xy;\n\n\t\t\t// account for clip-space aspect ratio\n\t\t\tdir.x *= aspect;\n\t\t\tdir = normalize( dir );\n\n\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\tvec3 worldDir = normalize( end.xyz - start.xyz );\n\t\t\t\tvec3 tmpFwd = normalize( mix( start.xyz, end.xyz, 0.5 ) );\n\t\t\t\tvec3 worldUp = normalize( cross( worldDir, tmpFwd ) );\n\t\t\t\tvec3 worldFwd = cross( worldDir, worldUp );\n\t\t\t\tworldPos = position.y < 0.5 ? start: end;\n\n\t\t\t\t// height offset\n\t\t\t\tfloat hw = linewidth * 0.5;\n\t\t\t\tworldPos.xyz += position.x < 0.0 ? hw * worldUp : - hw * worldUp;\n\n\t\t\t\t// don't extend the line if we're rendering dashes because we\n\t\t\t\t// won't be rendering the endcaps\n\t\t\t\t#ifndef USE_DASH\n\n\t\t\t\t\t// cap extension\n\t\t\t\t\tworldPos.xyz += position.y < 0.5 ? - hw * worldDir : hw * worldDir;\n\n\t\t\t\t\t// add width to the box\n\t\t\t\t\tworldPos.xyz += worldFwd * hw;\n\n\t\t\t\t\t// endcaps\n\t\t\t\t\tif ( position.y > 1.0 || position.y < 0.0 ) {\n\n\t\t\t\t\t\tworldPos.xyz -= worldFwd * 2.0 * hw;\n\n\t\t\t\t\t}\n\n\t\t\t\t#endif\n\n\t\t\t\t// project the worldpos\n\t\t\t\tvec4 clip = projectionMatrix * worldPos;\n\n\t\t\t\t// shift the depth of the projected points so the line\n\t\t\t\t// segments overlap neatly\n\t\t\t\tvec3 clipPose = ( position.y < 0.5 ) ? ndcStart : ndcEnd;\n\t\t\t\tclip.z = clipPose.z * clip.w;\n\n\t\t\t#else\n\n\t\t\t\tvec2 offset = vec2( dir.y, - dir.x );\n\t\t\t\t// undo aspect ratio adjustment\n\t\t\t\tdir.x /= aspect;\n\t\t\t\toffset.x /= aspect;\n\n\t\t\t\t// sign flip\n\t\t\t\tif ( position.x < 0.0 ) offset *= - 1.0;\n\n\t\t\t\t// endcaps\n\t\t\t\tif ( position.y < 0.0 ) {\n\n\t\t\t\t\toffset += - dir;\n\n\t\t\t\t} else if ( position.y > 1.0 ) {\n\n\t\t\t\t\toffset += dir;\n\n\t\t\t\t}\n\n\t\t\t\t// adjust for linewidth\n\t\t\t\toffset *= linewidth;\n\n\t\t\t\t// adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...\n\t\t\t\toffset /= resolution.y;\n\n\t\t\t\t// select end\n\t\t\t\tvec4 clip = ( position.y < 0.5 ) ? clipStart : clipEnd;\n\n\t\t\t\t// back to clip space\n\t\t\t\toffset *= clip.w;\n\n\t\t\t\tclip.xy += offset;\n\n\t\t\t#endif\n\n\t\t\tgl_Position = clip;\n\n\t\t\tvec4 mvPosition = ( position.y < 0.5 ) ? start : end; // this is an approximation\n\n\t\t\t#include <logdepthbuf_vertex>\n\t\t\t#include <clipping_planes_vertex>\n\t\t\t#include <fog_vertex>\n\n\t\t}\n\t\t`,\n\n\tfragmentShader:\n\t/* glsl */`\n\t\tuniform vec3 diffuse;\n\t\tuniform float opacity;\n\t\tuniform float linewidth;\n\n\t\t#ifdef USE_DASH\n\n\t\t\tuniform float dashOffset;\n\t\t\tuniform float dashSize;\n\t\t\tuniform float gapSize;\n\n\t\t#endif\n\n\t\tvarying float vLineDistance;\n\n\t\t#ifdef WORLD_UNITS\n\n\t\t\tvarying vec4 worldPos;\n\t\t\tvarying vec3 worldStart;\n\t\t\tvarying vec3 worldEnd;\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t#endif\n\n\t\t#else\n\n\t\t\tvarying vec2 vUv;\n\n\t\t#endif\n\n\t\t#include <common>\n\t\t#include <color_pars_fragment>\n\t\t#include <fog_pars_fragment>\n\t\t#include <logdepthbuf_pars_fragment>\n\t\t#include <clipping_planes_pars_fragment>\n\n\t\tvec2 closestLineToLine(vec3 p1, vec3 p2, vec3 p3, vec3 p4) {\n\n\t\t\tfloat mua;\n\t\t\tfloat mub;\n\n\t\t\tvec3 p13 = p1 - p3;\n\t\t\tvec3 p43 = p4 - p3;\n\n\t\t\tvec3 p21 = p2 - p1;\n\n\t\t\tfloat d1343 = dot( p13, p43 );\n\t\t\tfloat d4321 = dot( p43, p21 );\n\t\t\tfloat d1321 = dot( p13, p21 );\n\t\t\tfloat d4343 = dot( p43, p43 );\n\t\t\tfloat d2121 = dot( p21, p21 );\n\n\t\t\tfloat denom = d2121 * d4343 - d4321 * d4321;\n\n\t\t\tfloat numer = d1343 * d4321 - d1321 * d4343;\n\n\t\t\tmua = numer / denom;\n\t\t\tmua = clamp( mua, 0.0, 1.0 );\n\t\t\tmub = ( d1343 + d4321 * ( mua ) ) / d4343;\n\t\t\tmub = clamp( mub, 0.0, 1.0 );\n\n\t\t\treturn vec2( mua, mub );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tfloat alpha = opacity;\n\t\t\tvec4 diffuseColor = vec4( diffuse, alpha );\n\n\t\t\t#include <clipping_planes_fragment>\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tif ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps\n\n\t\t\t\tif ( mod( vLineDistance + dashOffset, dashSize + gapSize ) > dashSize ) discard; // todo - FIX\n\n\t\t\t#endif\n\n\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t// Find the closest points on the view ray and the line segment\n\t\t\t\tvec3 rayEnd = normalize( worldPos.xyz ) * 1e5;\n\t\t\t\tvec3 lineDir = worldEnd - worldStart;\n\t\t\t\tvec2 params = closestLineToLine( worldStart, worldEnd, vec3( 0.0, 0.0, 0.0 ), rayEnd );\n\n\t\t\t\tvec3 p1 = worldStart + lineDir * params.x;\n\t\t\t\tvec3 p2 = rayEnd * params.y;\n\t\t\t\tvec3 delta = p1 - p2;\n\t\t\t\tfloat len = length( delta );\n\t\t\t\tfloat norm = len / linewidth;\n\n\t\t\t\t#ifndef USE_DASH\n\n\t\t\t\t\t#ifdef USE_ALPHA_TO_COVERAGE\n\n\t\t\t\t\t\tfloat dnorm = fwidth( norm );\n\t\t\t\t\t\talpha = 1.0 - smoothstep( 0.5 - dnorm, 0.5 + dnorm, norm );\n\n\t\t\t\t\t#else\n\n\t\t\t\t\t\tif ( norm > 0.5 ) {\n\n\t\t\t\t\t\t\tdiscard;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t#endif\n\n\t\t\t\t#endif\n\n\t\t\t#else\n\n\t\t\t\t#ifdef USE_ALPHA_TO_COVERAGE\n\n\t\t\t\t\t// artifacts appear on some hardware if a derivative is taken within a conditional\n\t\t\t\t\tfloat a = vUv.x;\n\t\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\t\tfloat len2 = a * a + b * b;\n\t\t\t\t\tfloat dlen = fwidth( len2 );\n\n\t\t\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\t\t\talpha = 1.0 - smoothstep( 1.0 - dlen, 1.0 + dlen, len2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t#else\n\n\t\t\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\t\t\tfloat a = vUv.x;\n\t\t\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\t\t\tfloat len2 = a * a + b * b;\n\n\t\t\t\t\t\tif ( len2 > 1.0 ) discard;\n\n\t\t\t\t\t}\n\n\t\t\t\t#endif\n\n\t\t\t#endif\n\n\t\t\t#include <logdepthbuf_fragment>\n\t\t\t#include <color_fragment>\n\n\t\t\tgl_FragColor = vec4( diffuseColor.rgb, alpha );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <colorspace_fragment>\n\t\t\t#include <fog_fragment>\n\t\t\t#include <premultiplied_alpha_fragment>\n\n\t\t}\n\t\t`\n};\n\n/**\n * A material for drawing wireframe-style geometries.\n *\n * Unlike {@link LineBasicMaterial}, it supports arbitrary line widths and allows using world units\n * instead of screen space units. This material is used with {@link LineSegments2} and {@link Line2}.\n *\n * This module can only be used with {@link WebGLRenderer}. When using {@link WebGPURenderer},\n * use {@link Line2NodeMaterial}.\n *\n * @augments ShaderMaterial\n * @three_import import { LineMaterial } from 'three/addons/lines/LineMaterial.js';\n */\nclass LineMaterial extends ShaderMaterial {\n\n\t/**\n\t * Constructs a new line segments geometry.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper( {\n\n\t\t\ttype: 'LineMaterial',\n\t\t\tuniforms: UniformsUtils.clone( ShaderLib[ 'line' ].uniforms ),\n\n\t\t\tvertexShader: ShaderLib[ 'line' ].vertexShader,\n\t\t\tfragmentShader: ShaderLib[ 'line' ].fragmentShader,\n\n\t\t\tclipping: true // required for clipping support\n\n\t\t} );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineMaterial = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * The material's color.\n\t *\n\t * @type {Color}\n\t * @default (1,1,1)\n\t */\n\tget color() {\n\n\t\treturn this.uniforms.diffuse.value;\n\n\t}\n\n\tset color( value ) {\n\n\t\tthis.uniforms.diffuse.value = value;\n\n\t}\n\n\t/**\n\t * Whether the material's sizes (width, dash gaps) are in world units.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t */\n\tget worldUnits() {\n\n\t\treturn 'WORLD_UNITS' in this.defines;\n\n\t}\n\n\tset worldUnits( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.defines.WORLD_UNITS = '';\n\n\t\t} else {\n\n\t\t\tdelete this.defines.WORLD_UNITS;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Controls line thickness in CSS pixel units when `worldUnits` is `false` (default),\n\t * or in world units when `worldUnits` is `true`.\n\t *\n\t * @type {number}\n\t * @default 1\n\t */\n\tget linewidth() {\n\n\t\treturn this.uniforms.linewidth.value;\n\n\t}\n\n\tset linewidth( value ) {\n\n\t\tif ( ! this.uniforms.linewidth ) return;\n\t\tthis.uniforms.linewidth.value = value;\n\n\t}\n\n\t/**\n\t * Whether the line is dashed, or solid.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t */\n\tget dashed() {\n\n\t\treturn 'USE_DASH' in this.defines;\n\n\t}\n\n\tset dashed( value ) {\n\n\t\tif ( ( value === true ) !== this.dashed ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.defines.USE_DASH = '';\n\n\t\t} else {\n\n\t\t\tdelete this.defines.USE_DASH;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * The scale of the dashes and gaps.\n\t *\n\t * @type {number}\n\t * @default 1\n\t */\n\tget dashScale() {\n\n\t\treturn this.uniforms.dashScale.value;\n\n\t}\n\n\tset dashScale( value ) {\n\n\t\tthis.uniforms.dashScale.value = value;\n\n\t}\n\n\t/**\n\t * The size of the dash.\n\t *\n\t * @type {number}\n\t * @default 1\n\t */\n\tget dashSize() {\n\n\t\treturn this.uniforms.dashSize.value;\n\n\t}\n\n\tset dashSize( value ) {\n\n\t\tthis.uniforms.dashSize.value = value;\n\n\t}\n\n\t/**\n\t * Where in the dash cycle the dash starts.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget dashOffset() {\n\n\t\treturn this.uniforms.dashOffset.value;\n\n\t}\n\n\tset dashOffset( value ) {\n\n\t\tthis.uniforms.dashOffset.value = value;\n\n\t}\n\n\t/**\n\t * The size of the gap.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget gapSize() {\n\n\t\treturn this.uniforms.gapSize.value;\n\n\t}\n\n\tset gapSize( value ) {\n\n\t\tthis.uniforms.gapSize.value = value;\n\n\t}\n\n\t/**\n\t * The opacity.\n\t *\n\t * @type {number}\n\t * @default 1\n\t */\n\tget opacity() {\n\n\t\treturn this.uniforms.opacity.value;\n\n\t}\n\n\tset opacity( value ) {\n\n\t\tif ( ! this.uniforms ) return;\n\t\tthis.uniforms.opacity.value = value;\n\n\t}\n\n\t/**\n\t * The size of the viewport, in screen pixels. This must be kept updated to make\n\t * screen-space rendering accurate.The `LineSegments2.onBeforeRender` callback\n\t * performs the update for visible objects.\n\t *\n\t * @type {Vector2}\n\t */\n\tget resolution() {\n\n\t\treturn this.uniforms.resolution.value;\n\n\t}\n\n\tset resolution( value ) {\n\n\t\tthis.uniforms.resolution.value.copy( value );\n\n\t}\n\n\t/**\n\t * Whether to use alphaToCoverage or not. When enabled, this can improve the\n\t * anti-aliasing of line edges when using MSAA.\n\t *\n\t * @type {boolean}\n\t */\n\tget alphaToCoverage() {\n\n\t\treturn 'USE_ALPHA_TO_COVERAGE' in this.defines;\n\n\t}\n\n\tset alphaToCoverage( value ) {\n\n\t\tif ( ! this.defines ) return;\n\n\t\tif ( ( value === true ) !== this.alphaToCoverage ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.defines.USE_ALPHA_TO_COVERAGE = '';\n\n\t\t} else {\n\n\t\t\tdelete this.defines.USE_ALPHA_TO_COVERAGE;\n\n\t\t}\n\n\t}\n\n}\n\nexport { LineMaterial };\n","import {\n\tBox3,\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tLine3,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tSphere,\n\tVector3,\n\tVector4\n} from 'three';\nimport { LineSegmentsGeometry } from './LineSegmentsGeometry.js';\nimport { LineMaterial } from './LineMaterial.js';\n\nconst _viewport = new Vector4();\n\nconst _start = new Vector3();\nconst _end = new Vector3();\n\nconst _start4 = new Vector4();\nconst _end4 = new Vector4();\n\nconst _ssOrigin = new Vector4();\nconst _ssOrigin3 = new Vector3();\nconst _mvMatrix = new Matrix4();\nconst _line = new Line3();\nconst _closestPoint = new Vector3();\n\nconst _box = new Box3();\nconst _sphere = new Sphere();\nconst _clipToWorldVector = new Vector4();\n\nlet _ray, _lineWidth;\n\n// Returns the margin required to expand by in world space given the distance from the camera,\n// line width, resolution, and camera projection\nfunction getWorldSpaceHalfWidth( camera, distance, resolution ) {\n\n\t// transform into clip space, adjust the x and y values by the pixel width offset, then\n\t// transform back into world space to get world offset. Note clip space is [-1, 1] so full\n\t// width does not need to be halved.\n\t_clipToWorldVector.set( 0, 0, - distance, 1.0 ).applyMatrix4( camera.projectionMatrix );\n\t_clipToWorldVector.multiplyScalar( 1.0 / _clipToWorldVector.w );\n\t_clipToWorldVector.x = _lineWidth / resolution.width;\n\t_clipToWorldVector.y = _lineWidth / resolution.height;\n\t_clipToWorldVector.applyMatrix4( camera.projectionMatrixInverse );\n\t_clipToWorldVector.multiplyScalar( 1.0 / _clipToWorldVector.w );\n\n\treturn Math.abs( Math.max( _clipToWorldVector.x, _clipToWorldVector.y ) );\n\n}\n\nfunction raycastWorldUnits( lineSegments, intersects ) {\n\n\tconst matrixWorld = lineSegments.matrixWorld;\n\tconst geometry = lineSegments.geometry;\n\tconst instanceStart = geometry.attributes.instanceStart;\n\tconst instanceEnd = geometry.attributes.instanceEnd;\n\tconst segmentCount = Math.min( geometry.instanceCount, instanceStart.count );\n\n\tfor ( let i = 0, l = segmentCount; i < l; i ++ ) {\n\n\t\t_line.start.fromBufferAttribute( instanceStart, i );\n\t\t_line.end.fromBufferAttribute( instanceEnd, i );\n\n\t\t_line.applyMatrix4( matrixWorld );\n\n\t\tconst pointOnLine = new Vector3();\n\t\tconst point = new Vector3();\n\n\t\t_ray.distanceSqToSegment( _line.start, _line.end, point, pointOnLine );\n\t\tconst isInside = point.distanceTo( pointOnLine ) < _lineWidth * 0.5;\n\n\t\tif ( isInside ) {\n\n\t\t\tintersects.push( {\n\t\t\t\tpoint,\n\t\t\t\tpointOnLine,\n\t\t\t\tdistance: _ray.origin.distanceTo( point ),\n\t\t\t\tobject: lineSegments,\n\t\t\t\tface: null,\n\t\t\t\tfaceIndex: i,\n\t\t\t\tuv: null,\n\t\t\t\tuv1: null,\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n}\n\nfunction raycastScreenSpace( lineSegments, camera, intersects ) {\n\n\tconst projectionMatrix = camera.projectionMatrix;\n\tconst material = lineSegments.material;\n\tconst resolution = material.resolution;\n\tconst matrixWorld = lineSegments.matrixWorld;\n\n\tconst geometry = lineSegments.geometry;\n\tconst instanceStart = geometry.attributes.instanceStart;\n\tconst instanceEnd = geometry.attributes.instanceEnd;\n\tconst segmentCount = Math.min( geometry.instanceCount, instanceStart.count );\n\n\tconst near = - camera.near;\n\n\t//\n\n\t// pick a point 1 unit out along the ray to avoid the ray origin\n\t// sitting at the camera origin which will cause \"w\" to be 0 when\n\t// applying the projection matrix.\n\t_ray.at( 1, _ssOrigin );\n\n\t// ndc space [ - 1.0, 1.0 ]\n\t_ssOrigin.w = 1;\n\t_ssOrigin.applyMatrix4( camera.matrixWorldInverse );\n\t_ssOrigin.applyMatrix4( projectionMatrix );\n\t_ssOrigin.multiplyScalar( 1 / _ssOrigin.w );\n\n\t// screen space\n\t_ssOrigin.x *= resolution.x / 2;\n\t_ssOrigin.y *= resolution.y / 2;\n\t_ssOrigin.z = 0;\n\n\t_ssOrigin3.copy( _ssOrigin );\n\n\t_mvMatrix.multiplyMatrices( camera.matrixWorldInverse, matrixWorld );\n\n\tfor ( let i = 0, l = segmentCount; i < l; i ++ ) {\n\n\t\t_start4.fromBufferAttribute( instanceStart, i );\n\t\t_end4.fromBufferAttribute( instanceEnd, i );\n\n\t\t_start4.w = 1;\n\t\t_end4.w = 1;\n\n\t\t// camera space\n\t\t_start4.applyMatrix4( _mvMatrix );\n\t\t_end4.applyMatrix4( _mvMatrix );\n\n\t\t// skip the segment if it's entirely behind the camera\n\t\tconst isBehindCameraNear = _start4.z > near && _end4.z > near;\n\t\tif ( isBehindCameraNear ) {\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\t// trim the segment if it extends behind camera near\n\t\tif ( _start4.z > near ) {\n\n\t\t\tconst deltaDist = _start4.z - _end4.z;\n\t\t\tconst t = ( _start4.z - near ) / deltaDist;\n\t\t\t_start4.lerp( _end4, t );\n\n\t\t} else if ( _end4.z > near ) {\n\n\t\t\tconst deltaDist = _end4.z - _start4.z;\n\t\t\tconst t = ( _end4.z - near ) / deltaDist;\n\t\t\t_end4.lerp( _start4, t );\n\n\t\t}\n\n\t\t// clip space\n\t\t_start4.applyMatrix4( projectionMatrix );\n\t\t_end4.applyMatrix4( projectionMatrix );\n\n\t\t// ndc space [ - 1.0, 1.0 ]\n\t\t_start4.multiplyScalar( 1 / _start4.w );\n\t\t_end4.multiplyScalar( 1 / _end4.w );\n\n\t\t// screen space\n\t\t_start4.x *= resolution.x / 2;\n\t\t_start4.y *= resolution.y / 2;\n\n\t\t_end4.x *= resolution.x / 2;\n\t\t_end4.y *= resolution.y / 2;\n\n\t\t// create 2d segment\n\t\t_line.start.copy( _start4 );\n\t\t_line.start.z = 0;\n\n\t\t_line.end.copy( _end4 );\n\t\t_line.end.z = 0;\n\n\t\t// get closest point on ray to segment\n\t\tconst param = _line.closestPointToPointParameter( _ssOrigin3, true );\n\t\t_line.at( param, _closestPoint );\n\n\t\t// check if the intersection point is within clip space\n\t\tconst zPos = MathUtils.lerp( _start4.z, _end4.z, param );\n\t\tconst isInClipSpace = zPos >= - 1 && zPos <= 1;\n\n\t\tconst isInside = _ssOrigin3.distanceTo( _closestPoint ) < _lineWidth * 0.5;\n\n\t\tif ( isInClipSpace && isInside ) {\n\n\t\t\t_line.start.fromBufferAttribute( instanceStart, i );\n\t\t\t_line.end.fromBufferAttribute( instanceEnd, i );\n\n\t\t\t_line.start.applyMatrix4( matrixWorld );\n\t\t\t_line.end.applyMatrix4( matrixWorld );\n\n\t\t\tconst pointOnLine = new Vector3();\n\t\t\tconst point = new Vector3();\n\n\t\t\t_ray.distanceSqToSegment( _line.start, _line.end, point, pointOnLine );\n\n\t\t\tintersects.push( {\n\t\t\t\tpoint: point,\n\t\t\t\tpointOnLine: pointOnLine,\n\t\t\t\tdistance: _ray.origin.distanceTo( point ),\n\t\t\t\tobject: lineSegments,\n\t\t\t\tface: null,\n\t\t\t\tfaceIndex: i,\n\t\t\t\tuv: null,\n\t\t\t\tuv1: null,\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * A series of lines drawn between pairs of vertices.\n *\n * This adds functionality beyond {@link LineSegments}, like arbitrary line width and changing width\n * to be in world units. {@link Line2} extends this object, forming a polyline instead of individual\n * segments.\n *\n * This module can only be used with {@link WebGLRenderer}. When using {@link WebGPURenderer},\n * import the class from `lines/webgpu/LineSegments2.js`.\n *\n * ```js\n * const geometry = new LineSegmentsGeometry();\n * geometry.setPositions( positions );\n * geometry.setColors( colors );\n *\n * const material = new LineMaterial( { linewidth: 5, vertexColors: true } };\n *\n * const lineSegments = new LineSegments2( geometry, material );\n * scene.add( lineSegments );\n * ```\n *\n * @augments Mesh\n * @three_import import { LineSegments2 } from 'three/addons/lines/LineSegments2.js';\n */\nclass LineSegments2 extends Mesh {\n\n\t/**\n\t * Constructs a new wide line.\n\t *\n\t * @param {LineSegmentsGeometry} [geometry] - The line geometry.\n\t * @param {LineMaterial} [material] - The line material.\n\t */\n\tconstructor( geometry = new LineSegmentsGeometry(), material = new LineMaterial( { color: Math.random() * 0xffffff } ) ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineSegments2 = true;\n\n\t\tthis.type = 'LineSegments2';\n\n\t}\n\n\t/**\n\t * Computes an array of distance values which are necessary for rendering dashed lines.\n\t * For each vertex in the geometry, the method calculates the cumulative length from the\n\t * current point to the very beginning of the line.\n\t *\n\t * @return {LineSegments2} A reference to this instance.\n\t */\n\tcomputeLineDistances() {\n\n\t\t// for backwards-compatibility, but could be a method of LineSegmentsGeometry...\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst instanceStart = geometry.attributes.instanceStart;\n\t\tconst instanceEnd = geometry.attributes.instanceEnd;\n\t\tconst lineDistances = new Float32Array( 2 * instanceStart.count );\n\n\t\tfor ( let i = 0, j = 0, l = instanceStart.count; i < l; i ++, j += 2 ) {\n\n\t\t\t_start.fromBufferAttribute( instanceStart, i );\n\t\t\t_end.fromBufferAttribute( instanceEnd, i );\n\n\t\t\tlineDistances[ j ] = ( j === 0 ) ? 0 : lineDistances[ j - 1 ];\n\t\t\tlineDistances[ j + 1 ] = lineDistances[ j ] + _start.distanceTo( _end );\n\n\t\t}\n\n\t\tconst instanceDistanceBuffer = new InstancedInterleavedBuffer( lineDistances, 2, 1 ); // d0, d1\n\n\t\tgeometry.setAttribute( 'instanceDistanceStart', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 0 ) ); // d0\n\t\tgeometry.setAttribute( 'instanceDistanceEnd', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 1 ) ); // d1\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this instance.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst worldUnits = this.material.worldUnits;\n\t\tconst camera = raycaster.camera;\n\n\t\tif ( camera === null && ! worldUnits ) {\n\n\t\t\tconsole.error( 'LineSegments2: \"Raycaster.camera\" needs to be set in order to raycast against LineSegments2 while worldUnits is set to false.' );\n\n\t\t}\n\n\t\tconst threshold = ( raycaster.params.Line2 !== undefined ) ? raycaster.params.Line2.threshold || 0 : 0;\n\n\t\t_ray = raycaster.ray;\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\n\t\t_lineWidth = material.linewidth + threshold;\n\n\t\t// check if we intersect the sphere bounds\n\t\tif ( geometry.boundingSphere === null ) {\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\n\t\t_sphere.copy( geometry.boundingSphere ).applyMatrix4( matrixWorld );\n\n\t\t// increase the sphere bounds by the worst case line screen space width\n\t\tlet sphereMargin;\n\t\tif ( worldUnits ) {\n\n\t\t\tsphereMargin = _lineWidth * 0.5;\n\n\t\t} else {\n\n\t\t\tconst distanceToSphere = Math.max( camera.near, _sphere.distanceToPoint( _ray.origin ) );\n\t\t\tsphereMargin = getWorldSpaceHalfWidth( camera, distanceToSphere, material.resolution );\n\n\t\t}\n\n\t\t_sphere.radius += sphereMargin;\n\n\t\tif ( _ray.intersectsSphere( _sphere ) === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// check if we intersect the box bounds\n\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\tgeometry.computeBoundingBox();\n\n\t\t}\n\n\t\t_box.copy( geometry.boundingBox ).applyMatrix4( matrixWorld );\n\n\t\t// increase the box bounds by the worst case line width\n\t\tlet boxMargin;\n\t\tif ( worldUnits ) {\n\n\t\t\tboxMargin = _lineWidth * 0.5;\n\n\t\t} else {\n\n\t\t\tconst distanceToBox = Math.max( camera.near, _box.distanceToPoint( _ray.origin ) );\n\t\t\tboxMargin = getWorldSpaceHalfWidth( camera, distanceToBox, material.resolution );\n\n\t\t}\n\n\t\t_box.expandByScalar( boxMargin );\n\n\t\tif ( _ray.intersectsBox( _box ) === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( worldUnits ) {\n\n\t\t\traycastWorldUnits( this, intersects );\n\n\t\t} else {\n\n\t\t\traycastScreenSpace( this, camera, intersects );\n\n\t\t}\n\n\t}\n\n\tonBeforeRender( renderer ) {\n\n\t\tconst uniforms = this.material.uniforms;\n\n\t\tif ( uniforms && uniforms.resolution ) {\n\n\t\t\trenderer.getViewport( _viewport );\n\t\t\tthis.material.uniforms.resolution.value.set( _viewport.z, _viewport.w );\n\n\t\t}\n\n\t}\n\n}\n\nexport { LineSegments2 };\n","import { LineSegmentsGeometry } from './LineSegmentsGeometry.js';\n\n/**\n * A chain of vertices, forming a polyline.\n *\n * This is used in {@link Line2} to describe the shape.\n *\n * ```js\n * const points = [\n * \tnew THREE.Vector3( - 10, 0, 0 ),\n * \tnew THREE.Vector3( 0, 5, 0 ),\n * \tnew THREE.Vector3( 10, 0, 0 ),\n * ];\n *\n * const geometry = new LineGeometry();\n * geometry.setFromPoints( points );\n * ```\n *\n * @augments LineSegmentsGeometry\n * @three_import import { LineLineGeometry2 } from 'three/addons/lines/LineGeometry.js';\n */\nclass LineGeometry extends LineSegmentsGeometry {\n\n\t/**\n\t * Constructs a new line geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineGeometry = true;\n\n\t\tthis.type = 'LineGeometry';\n\n\t}\n\n\t/**\n\t * Sets the given line positions for this geometry.\n\t *\n\t * @param {Float32Array|Array<number>} array - The position data to set.\n\t * @return {LineGeometry} A reference to this geometry.\n\t */\n\tsetPositions( array ) {\n\n\t\t// converts [ x1, y1, z1, x2, y2, z2, ... ] to pairs format\n\n\t\tconst length = array.length - 3;\n\t\tconst points = new Float32Array( 2 * length );\n\n\t\tfor ( let i = 0; i < length; i += 3 ) {\n\n\t\t\tpoints[ 2 * i ] = array[ i ];\n\t\t\tpoints[ 2 * i + 1 ] = array[ i + 1 ];\n\t\t\tpoints[ 2 * i + 2 ] = array[ i + 2 ];\n\n\t\t\tpoints[ 2 * i + 3 ] = array[ i + 3 ];\n\t\t\tpoints[ 2 * i + 4 ] = array[ i + 4 ];\n\t\t\tpoints[ 2 * i + 5 ] = array[ i + 5 ];\n\n\t\t}\n\n\t\tsuper.setPositions( points );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given line colors for this geometry.\n\t *\n\t * @param {Float32Array|Array<number>} array - The position data to set.\n\t * @return {LineGeometry} A reference to this geometry.\n\t */\n\tsetColors( array ) {\n\n\t\t// converts [ r1, g1, b1, r2, g2, b2, ... ] to pairs format\n\n\t\tconst length = array.length - 3;\n\t\tconst colors = new Float32Array( 2 * length );\n\n\t\tfor ( let i = 0; i < length; i += 3 ) {\n\n\t\t\tcolors[ 2 * i ] = array[ i ];\n\t\t\tcolors[ 2 * i + 1 ] = array[ i + 1 ];\n\t\t\tcolors[ 2 * i + 2 ] = array[ i + 2 ];\n\n\t\t\tcolors[ 2 * i + 3 ] = array[ i + 3 ];\n\t\t\tcolors[ 2 * i + 4 ] = array[ i + 4 ];\n\t\t\tcolors[ 2 * i + 5 ] = array[ i + 5 ];\n\n\t\t}\n\n\t\tsuper.setColors( colors );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Setups this line segments geometry from the given sequence of points.\n\t *\n\t * @param {Array<Vector3|Vector2>} points - An array of points in 2D or 3D space.\n\t * @return {LineGeometry} A reference to this geometry.\n\t */\n\tsetFromPoints( points ) {\n\n\t\t// converts a vector3 or vector2 array to pairs format\n\n\t\tconst length = points.length - 1;\n\t\tconst positions = new Float32Array( 6 * length );\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tpositions[ 6 * i ] = points[ i ].x;\n\t\t\tpositions[ 6 * i + 1 ] = points[ i ].y;\n\t\t\tpositions[ 6 * i + 2 ] = points[ i ].z || 0;\n\n\t\t\tpositions[ 6 * i + 3 ] = points[ i + 1 ].x;\n\t\t\tpositions[ 6 * i + 4 ] = points[ i + 1 ].y;\n\t\t\tpositions[ 6 * i + 5 ] = points[ i + 1 ].z || 0;\n\n\t\t}\n\n\t\tsuper.setPositions( positions );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Setups this line segments geometry from the given line.\n\t *\n\t * @param {Line} line - The line that should be used as a data source for this geometry.\n\t * @return {LineGeometry} A reference to this geometry.\n\t */\n\tfromLine( line ) {\n\n\t\tconst geometry = line.geometry;\n\n\t\tthis.setPositions( geometry.attributes.position.array ); // assumes non-indexed\n\n\t\t// set colors, maybe\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { LineGeometry };\n","import { LineSegments2 } from './LineSegments2.js';\nimport { LineGeometry } from './LineGeometry.js';\nimport { LineMaterial } from './LineMaterial.js';\n\n/**\n * A polyline drawn between vertices.\n *\n * This adds functionality beyond {@link Line}, like arbitrary line width and changing width to\n * be in world units.It extends {@link LineSegments2}, simplifying constructing segments from a\n * chain of points.\n *\n * This module can only be used with {@link WebGLRenderer}. When using {@link WebGPURenderer},\n * import the class from `lines/webgpu/Line2.js`.\n *\n * ```js\n * const geometry = new LineGeometry();\n * geometry.setPositions( positions );\n * geometry.setColors( colors );\n *\n * const material = new LineMaterial( { linewidth: 5, vertexColors: true } };\n *\n * const line = new Line2( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments LineSegments2\n * @three_import import { Line2 } from 'three/addons/lines/Line2.js';\n */\nclass Line2 extends LineSegments2 {\n\n\t/**\n\t * Constructs a new wide line.\n\t *\n\t * @param {LineGeometry} [geometry] - The line geometry.\n\t * @param {LineMaterial} [material] - The line material.\n\t */\n\tconstructor( geometry = new LineGeometry(), material = new LineMaterial( { color: Math.random() * 0xffffff } ) ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLine2 = true;\n\n\t\tthis.type = 'Line2';\n\n\t}\n\n}\n\nexport { Line2 };\n","import { Matrix4 } from '@ccpc/math';\r\nimport { Matrix4 as ThreeMatrix4 } from 'three';\r\n\r\nexport class ThreeUtil {\r\n public static mathMatrix4toThreeMatrix4(mat: Matrix4) {\r\n const [r0, r1, r2, r3] = mat.data;\r\n return new ThreeMatrix4().set(\r\n r0[0], r1[0], r2[0], r3[0],\r\n r0[1], r1[1], r2[1], r3[1],\r\n r0[2], r1[2], r2[2], r3[2],\r\n r0[3], r1[3], r2[3], r3[3],\r\n );\r\n }\r\n}\r\n","import { EN_AnchorX, EN_AnchorY, GNode, GRep, RenderEdge, RenderGroup, RenderMesh, RenderNode, RenderPoint, RenderText } from '@ccpc/core'\r\nimport { Vec3 } from '@ccpc/math'\r\nimport { BufferAttribute, BufferGeometry, Float32BufferAttribute, Group, Mesh, MeshBasicMaterial, Object3D, Points, PointsMaterial } from 'three'\r\nimport { Line2 } from 'three/examples/jsm/lines/Line2.js'\r\nimport { LineGeometry } from 'three/examples/jsm/lines/LineGeometry.js'\r\nimport { LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js'\r\nimport { Text } from 'troika-three-text'\r\nimport { ThreeUtil } from '../toolkit/three_util'\r\n\r\n/**\r\n * 渲染数据转换、缓存、管理\r\n */\r\nexport class RenderHub {\r\n\r\n /**\r\n * 渲染对象和GNode的映射\r\n */\r\n private _objectGNodeMap = new WeakMap<Object3D, GNode>\r\n\r\n /**\r\n * 添加GRep\r\n */\r\n public addGrep(grep: GRep) {\r\n const rNode = grep.toRenderNode()\r\n const allNodes = this._flatLeafRNodes(rNode)\r\n\r\n const group = new Group()\r\n for (const node of allNodes) {\r\n const obj = this._buildLeafObject3d(node)\r\n if (obj) {\r\n group.add(obj)\r\n this._objectGNodeMap.set(obj, node.gnode)\r\n }\r\n }\r\n\r\n return group\r\n }\r\n\r\n /**\r\n * 移除GRep\r\n */\r\n public removeGRep(_eId: number) {\r\n\r\n }\r\n\r\n /**\r\n * 根据渲染对象查GNode\r\n */\r\n public getGNodesByObject3d(obj: Object3D) {\r\n let cur: Object3D | null = obj\r\n while (cur) {\r\n const gnode = this._objectGNodeMap.get(cur)\r\n if (gnode) return gnode\r\n cur = cur.parent\r\n }\r\n return undefined\r\n }\r\n\r\n /**\r\n * 叶子节点拍平\r\n */\r\n private _flatLeafRNodes(rNode: RenderNode) {\r\n const result: Array<RenderNode> = []\r\n if (rNode instanceof RenderGroup) {\r\n rNode.children.forEach(child => {\r\n result.push(...this._flatLeafRNodes(child))\r\n })\r\n return result\r\n }\r\n\r\n result.push(rNode)\r\n return result\r\n }\r\n\r\n /**\r\n * 根据叶子 RenderNode 构建对应的 three Object3D\r\n */\r\n // TODO 拆成两步, 单独创建几何和材质\r\n private _buildLeafObject3d(rNode: RenderNode): Object3D | null {\r\n if (rNode instanceof RenderPoint) {\r\n const point = new Vec3(rNode.point)\r\n if (rNode.globalMatrix) {\r\n point.transform(rNode.globalMatrix)\r\n }\r\n\r\n const geo = new BufferGeometry()\r\n geo.setAttribute('position', new Float32BufferAttribute([point.x, point.y, point.z], 3))\r\n const pointStyle = rNode.style.point\r\n const pointMat = new PointsMaterial({\r\n color: pointStyle?.color ?? 0xffffff,\r\n size: pointStyle?.size ?? 8,\r\n sizeAttenuation: false,\r\n opacity: pointStyle?.opacity ?? 1,\r\n })\r\n if (pointMat.opacity < 1) {\r\n pointMat.transparent = true\r\n }\r\n\r\n return new Points(geo, pointMat)\r\n }\r\n\r\n if (rNode instanceof RenderEdge) {\r\n const positions: number[] = []\r\n for (const rawPoint of rNode.points) {\r\n const point = rawPoint.clone()\r\n if (rNode.globalMatrix) {\r\n point.transform(rNode.globalMatrix)\r\n }\r\n positions.push(point.x, point.y, point.z)\r\n }\r\n\r\n const geo = new LineGeometry()\r\n geo.setPositions(positions)\r\n\r\n const lineStyle = rNode.style.line\r\n const lineMat = new LineMaterial({\r\n color: lineStyle?.color ?? 0xffffff,\r\n linewidth: lineStyle?.width ?? 2,\r\n opacity: lineStyle?.opacity ?? 1,\r\n })\r\n\r\n if (lineMat.opacity < 1) {\r\n lineMat.transparent = true\r\n }\r\n\r\n return new Line2(geo, lineMat)\r\n }\r\n\r\n if (rNode instanceof RenderMesh) {\r\n const geo = new BufferGeometry()\r\n const position = rNode.getVerts()\r\n const indices = rNode.getIndices()\r\n const normals = rNode.getNormals()\r\n geo.setAttribute('position', new Float32BufferAttribute(position, 3))\r\n geo.setAttribute('normal', new Float32BufferAttribute(normals, 3))\r\n geo.setIndex(new BufferAttribute(indices, 1))\r\n\r\n const globalMatrix = rNode.globalMatrix\r\n if (globalMatrix) {\r\n geo.applyMatrix4(ThreeUtil.mathMatrix4toThreeMatrix4(globalMatrix))\r\n }\r\n\r\n const faceStyle = rNode.style.face\r\n const faceMat = new MeshBasicMaterial({\r\n color: faceStyle?.color ?? 0xffffff,\r\n opacity: faceStyle?.opacity ?? 1,\r\n })\r\n\r\n if (faceMat.opacity < 1) {\r\n faceMat.transparent = true\r\n }\r\n return new Mesh(geo, faceMat)\r\n }\r\n\r\n if (rNode instanceof RenderText) {\r\n const text = new Text()\r\n text.position.set(rNode.position.x, rNode.position.y, rNode.position.z)\r\n text.text = rNode.text\r\n\r\n const textStyle = rNode.style.text\r\n text.fontSize = textStyle?.fontSize ?? 16\r\n text.color = textStyle?.color ?? 0xffffff\r\n text.anchorX = textStyle?.anchorX ?? EN_AnchorX.Center\r\n text.anchorY = textStyle?.anchorY ?? EN_AnchorY.Middle\r\n\r\n if (rNode.globalMatrix) {\r\n text.applyMatrix4(ThreeUtil.mathMatrix4toThreeMatrix4(rNode.globalMatrix))\r\n }\r\n\r\n text.sync()\r\n\r\n return text\r\n }\r\n\r\n return null\r\n }\r\n}\r\n","import {\n EN_AnchorX,\n EN_AnchorY,\n GRep,\n RenderEdge,\n RenderMesh,\n RenderNode,\n RenderNodeUtil,\n RenderPoint,\n RenderText,\n} from '@ccpc/core'\nimport { Vec3 } from '@ccpc/math'\nimport {\n BufferAttribute,\n BufferGeometry,\n Float32BufferAttribute,\n Group,\n Mesh,\n MeshBasicMaterial,\n Object3D,\n Points,\n PointsMaterial,\n Scene,\n} from 'three'\nimport { Line2 } from 'three/examples/jsm/lines/Line2.js'\nimport { LineGeometry } from 'three/examples/jsm/lines/LineGeometry.js'\nimport { LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js'\nimport { Text } from 'troika-three-text'\nimport { ThreeUtil } from '../toolkit/three_util'\n\n/**\n * 高亮选中交互操作\n */\nexport class ActiveSelectionOp {\n private _activeGroup = new Group()\n\n private _selectionGroup = new Group()\n\n constructor(activeScene: Scene) {\n activeScene.add(this._activeGroup)\n activeScene.add(this._selectionGroup)\n }\n\n public clearActive() {\n this._clearGroup(this._activeGroup)\n }\n\n public clearSelection() {\n this._clearGroup(this._selectionGroup)\n }\n\n public drawActives(greps: GRep[]) {\n this.clearActive()\n greps.forEach(grep => {\n const group = this._buildOverlayGroup(grep)\n if (group.children.length) {\n this._activeGroup.add(group)\n }\n })\n }\n\n public drawSelections(greps: GRep[]) {\n this.clearSelection()\n greps.forEach(grep => {\n const group = this._buildOverlayGroup(grep)\n if (group.children.length) {\n this._selectionGroup.add(group)\n }\n })\n }\n\n /**\n * GRep转为可渲染Group\n */\n private _buildOverlayGroup(grep: GRep) {\n const group = new Group()\n const rNode = grep.toRenderNode()\n\n const allNodes = RenderNodeUtil.flatLeafRNodes(rNode)\n allNodes.forEach(node => {\n const obj = this._buildLeafObject(node)\n if (obj) {\n group.add(obj)\n }\n })\n\n return group\n }\n\n /**\n * 根据RenderNode构建渲染对象\n */\n private _buildLeafObject(rNode: RenderNode): Object3D | null {\n if (rNode instanceof RenderPoint) {\n const point = new Vec3(rNode.point)\n if (rNode.globalMatrix) {\n point.transform(rNode.globalMatrix)\n }\n\n const geo = new BufferGeometry()\n geo.setAttribute('position', new Float32BufferAttribute([point.x, point.y, point.z], 3))\n\n const pointStyle = rNode.style.point\n const mat = new PointsMaterial({\n color: pointStyle?.color ?? 0xffffff,\n size: pointStyle?.size ?? 8,\n sizeAttenuation: false,\n opacity: pointStyle?.opacity ?? 1,\n })\n if (mat.opacity < 1) {\n mat.transparent = true\n }\n\n return new Points(geo, mat)\n }\n\n if (rNode instanceof RenderEdge) {\n const positions: number[] = []\n for (const rawPoint of rNode.points) {\n const point = rawPoint.clone()\n if (rNode.globalMatrix) {\n point.transform(rNode.globalMatrix)\n }\n positions.push(point.x, point.y, point.z)\n }\n\n const geo = new LineGeometry()\n geo.setPositions(positions)\n\n const lineStyle = rNode.style.line\n const mat = new LineMaterial({\n color: lineStyle?.color ?? 0xffffff,\n linewidth: lineStyle?.width ?? 2,\n opacity: lineStyle?.opacity ?? 1,\n })\n if (mat.opacity < 1) {\n mat.transparent = true\n }\n\n return new Line2(geo, mat)\n }\n\n if (rNode instanceof RenderMesh) {\n const geo = new BufferGeometry()\n geo.setAttribute('position', new Float32BufferAttribute(rNode.getVerts(), 3))\n geo.setAttribute('normal', new Float32BufferAttribute(rNode.getNormals(), 3))\n geo.setIndex(new BufferAttribute(rNode.getIndices(), 1))\n\n if (rNode.globalMatrix) {\n geo.applyMatrix4(ThreeUtil.mathMatrix4toThreeMatrix4(rNode.globalMatrix))\n }\n\n const faceStyle = rNode.style.face\n const mat = new MeshBasicMaterial({\n color: faceStyle?.color ?? 0xffffff,\n opacity: faceStyle?.opacity ?? 1,\n })\n if (mat.opacity < 1) {\n mat.transparent = true\n }\n\n return new Mesh(geo, mat)\n }\n\n if (rNode instanceof RenderText) {\n const text = new Text()\n text.position.set(rNode.position.x, rNode.position.y, rNode.position.z)\n text.text = rNode.text\n\n const textStyle = rNode.style.text\n text.fontSize = textStyle?.fontSize ?? 16\n text.color = textStyle?.color ?? 0xffffff\n text.anchorX = textStyle?.anchorX ?? EN_AnchorX.Center\n text.anchorY = textStyle?.anchorY ?? EN_AnchorY.Middle\n\n if (rNode.globalMatrix) {\n text.applyMatrix4(ThreeUtil.mathMatrix4toThreeMatrix4(rNode.globalMatrix))\n }\n\n text.sync()\n return text\n }\n\n return null\n }\n\n /**\n * 清空渲染组\n */\n private _clearGroup(group: Group) {\n while (group.children.length) {\n const child = group.children.pop()\n child?.removeFromParent()\n }\n }\n}\n","import { Group, OrthographicCamera, Raycaster, Scene, SRGBColorSpace, Vector2, Vector3, WebGLRenderer } from 'three'\r\nimport { canvasConfig } from '../toolkit/canvas_config'\r\nimport { OrbitControls } from 'three/examples/jsm/Addons.js'\r\nimport { DisplayObject, DisplayObjectMgr, GNode, GRep, IMgrDisplayRenderData, IRender } from '@ccpc/core'\r\nimport { RenderHub } from './render_hub'\r\nimport { CONST, Ln3, Vec2, Vec3 } from '@ccpc/math'\r\nimport { ActiveSelectionOp } from './active_selection_op'\r\n\r\nexport class CRenderer extends IRender {\r\n private static readonly PICK_TOLERANCE = 16\r\n\r\n private _width: number\r\n\r\n private _height: number\r\n\r\n private _container: HTMLElement\r\n\r\n private _renderer: WebGLRenderer\r\n\r\n private _scene: Scene\r\n\r\n private _activeScene: Scene\r\n\r\n private _camera: OrthographicCamera\r\n\r\n private _cameraControls: OrbitControls\r\n\r\n /**\r\n * 数据转换器\r\n */\r\n private _renderHub: RenderHub\r\n\r\n private _activeSelectionOp: ActiveSelectionOp\r\n\r\n /**\r\n * displayId到Group映射\r\n */\r\n private _didToObject = new Map<number, Group>()\r\n\r\n // TODO 相关逻辑移动到canvas\r\n private _resizeObserver: ResizeObserver\r\n\r\n constructor(_container: HTMLElement) {\r\n super()\r\n this._container = _container\r\n this._width = this._container.clientWidth\r\n this._height = this._container.clientHeight\r\n\r\n this._renderer = new WebGLRenderer({\r\n antialias: true,\r\n })\r\n this._renderer.autoClear = false\r\n this._renderer.setPixelRatio(window.devicePixelRatio)\r\n this._renderer.setClearColor(canvasConfig.common.color_background)\r\n this._renderer.outputColorSpace = SRGBColorSpace\r\n this._renderer.setSize(this._width, this._height)\r\n this._container.appendChild(this._renderer.domElement)\r\n this._resizeObserver = new ResizeObserver(() => {\r\n this._onResize()\r\n })\r\n this._resizeObserver.observe(this._container)\r\n\r\n this._scene = new Scene()\r\n this._activeScene = new Scene()\r\n\r\n const aspect = this._width / this._height\r\n const vh = 300\r\n const vw = vh * aspect\r\n this._camera = new OrthographicCamera(-vw / 2, vw / 2, vh / 2, -vh / 2, 0.1, 100)\r\n this._camera.position.set(0, 0, 20)\r\n\r\n this._cameraControls = new OrbitControls(this._camera, this._renderer.domElement)\r\n this._cameraControls.enableRotate = false\r\n this._cameraControls.enablePan = true\r\n\r\n this._renderHub = new RenderHub()\r\n this._activeSelectionOp = new ActiveSelectionOp(this._activeScene)\r\n\r\n // TODO 测试代码\r\n // this._scene.add(new AxesHelper(30))\r\n\r\n this.render()\r\n }\r\n\r\n /**\r\n * 修改完场景后,调update才会真正刷新\r\n */\r\n public updateView(): void {\r\n // TODO 添加renderState控制\r\n // 当前 render loop 持续执行,这里先保留空实现\r\n }\r\n\r\n public updateImmediately(): void {\r\n\r\n }\r\n\r\n /**\r\n * 根据渲染数据更新显示对象\r\n */\r\n private _updateDisplayByRenderData(renderData: IMgrDisplayRenderData) {\r\n const { id, gRep } = renderData\r\n const display = DisplayObjectMgr.instance().getDisplay(id)\r\n if (display) {\r\n if (gRep) {\r\n const obj = this._didToObject.get(display.id)\r\n if (obj) {\r\n this._removeGrepByDisplayId(id)\r\n this._addGrepByDisplay(display, gRep)\r\n } else {\r\n this._addGrepByDisplay(display, gRep)\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * 根据显示对象添加GRep\r\n */\r\n private _addGrepByDisplay(display: DisplayObject, gRep: GRep) {\r\n const dId = display.id\r\n const group = this._renderHub.addGrep(gRep)\r\n this._scene.add(group)\r\n this._didToObject.set(dId, group)\r\n group.visible = display.testVisible()\r\n }\r\n\r\n /**\r\n * 根据显示对象移除GRep\r\n */\r\n private _removeGrepByDisplayId(dId: number) {\r\n const group = this._didToObject.get(dId)\r\n if (!group) return false\r\n this._didToObject.delete(dId)\r\n group.removeFromParent()\r\n // TODO 内存释放,优先级提高\r\n }\r\n\r\n public render = () => {\r\n requestAnimationFrame(this.render)\r\n\r\n const { update, remove } = DisplayObjectMgr.instance().onBeforeRender()\r\n remove.forEach(dId => {\r\n this._removeGrepByDisplayId(dId)\r\n })\r\n update.forEach(renderData => {\r\n this._updateDisplayByRenderData(renderData)\r\n })\r\n\r\n this._cameraControls.update()\r\n this._renderer.clear()\r\n this._renderer.render(this._scene, this._camera)\r\n this._renderer.clearDepth()\r\n this._renderer.render(this._activeScene, this._camera)\r\n }\r\n\r\n /**\r\n * NDC转屏幕坐标\r\n */\r\n public NDCToScreen(ndcX: number, ndcY: number) {\r\n const screenPos = new Vec2()\r\n screenPos.x = (this._width * (ndcX + 1)) / 2\r\n screenPos.y = (this._height * (1 - ndcY)) / 2\r\n return screenPos\r\n }\r\n\r\n /**\r\n * 屏幕坐标转NDC\r\n */\r\n public screenToNDC(screenPos: Vec2) {\r\n const pos = new Vec2()\r\n pos.x = (screenPos.x / this._width) * 2 - 1\r\n pos.y = -(screenPos.y / this._height) * 2 + 1\r\n return pos\r\n }\r\n\r\n /**\r\n * NDC坐标转世界坐标\r\n */\r\n public NDCToWorld(ndcX: number, ndcY: number) {\r\n const ndc = new Vector3(ndcX, ndcY, 0)\r\n const worldPos = ndc.unproject(this._camera)\r\n return new Vec3(worldPos)\r\n }\r\n\r\n /**\r\n * 世界坐标转NDC坐标\r\n */\r\n public worldToNDC(worldPos: Vec3) {\r\n const p = new Vector3(worldPos.x, worldPos.y, 0).project(this._camera)\r\n return new Vec2(p.x, p.y)\r\n }\r\n\r\n /**\r\n * 生成相机射线\r\n */\r\n public generateCameraRay(screenPos: Vec2) {\r\n const raycaster = new Raycaster()\r\n const ndc = this.screenToNDC(screenPos)\r\n const pos = new Vector2(ndc.x, ndc.y)\r\n raycaster.setFromCamera(pos, this._camera)\r\n const { ray } = raycaster\r\n const lineRay = new Ln3(ray.origin, ray.direction, [0, 1])\r\n lineRay.extend(CONST.MODEL_MAX_LENGTH * 100, true)\r\n return lineRay\r\n }\r\n\r\n /**\r\n * 根据屏幕坐标拾取\r\n */\r\n public pick(screenX: number, screenY: number): GNode[] {\r\n const raycaster = new Raycaster()\r\n const ndc = this.screenToNDC(new Vec2(screenX, screenY))\r\n raycaster.setFromCamera(new Vector2(ndc.x, ndc.y), this._camera)\r\n raycaster.params.Line2 = { threshold: CRenderer.PICK_TOLERANCE }\r\n const intersects = raycaster.intersectObjects(this._scene.children, true)\r\n const result: GNode[] = []\r\n const seen = new Set<number>()\r\n\r\n for (const hit of intersects) {\r\n const gnode = this._renderHub.getGNodesByObject3d(hit.object)\r\n if (!gnode) continue\r\n if (seen.has(gnode.globalID)) continue\r\n\r\n seen.add(gnode.globalID)\r\n result.push(gnode)\r\n }\r\n return result\r\n }\r\n\r\n public override clearActive(): void {\r\n this._activeSelectionOp.clearActive()\r\n }\r\n\r\n public override clearSelection(): void {\r\n this._activeSelectionOp.clearSelection()\r\n }\r\n\r\n public drawSelections(greps: GRep[]): void {\r\n this._activeSelectionOp.drawSelections(greps)\r\n }\r\n\r\n public drawActives(greps: GRep[]): void {\r\n this._activeSelectionOp.drawActives(greps)\r\n }\r\n\r\n /**\r\n * 监听画布大小变化\r\n */\r\n // TODO 需要重构\r\n protected _onResize() {\r\n this._width = this._container.clientWidth\r\n this._height = this._container.clientHeight\r\n this._renderer.setSize(this._width, this._height)\r\n\r\n const aspect = this._width / this._height\r\n const vh = 300\r\n const vw = vh * aspect\r\n this._camera.left = -vw / 2\r\n this._camera.right = vw / 2\r\n this._camera.top = vh / 2\r\n this._camera.bottom = -vh / 2\r\n this._camera.updateProjectionMatrix()\r\n }\r\n\r\n // TODO 补充完整\r\n public destroy() {\r\n this._resizeObserver.disconnect()\r\n this._renderer.dispose()\r\n this._renderer.domElement.remove()\r\n }\r\n}\r\n","/**\r\n * 事件的fn状态\r\n */\r\nexport class FnKey {\r\n private _ctrlKey: boolean;\r\n\r\n private _altKey: boolean;\r\n\r\n private _shiftKey: boolean;\r\n\r\n private _metaKey: boolean;\r\n\r\n constructor(event: MouseEvent | KeyboardEvent) {\r\n this._ctrlKey = event.ctrlKey;\r\n this._altKey = event.altKey;\r\n this._shiftKey = event.shiftKey;\r\n this._metaKey = event.metaKey;\r\n }\r\n\r\n public get ctrlKey() {\r\n return this._ctrlKey;\r\n }\r\n\r\n public get altKey() {\r\n return this._altKey;\r\n }\r\n\r\n public get shiftKey() {\r\n return this._shiftKey;\r\n }\r\n\r\n public get metaKey() {\r\n return this._metaKey;\r\n }\r\n}\r\n","import { Vec2 } from '@ccpc/math';\r\nimport { ICCanvas } from '../canvas/i_c_canvas';\r\nimport { IProcessMouseEvent } from './i_mouse_controller';\r\nimport { EN_MouseEvent, EN_NativeMouseEvent } from '../types/type_define';\r\nimport { FnKey } from './fn_key';\r\nimport { canvasConfig } from '../toolkit/canvas_config';\r\n/**\r\n * 鼠标事件监听器\r\n */\r\nexport class MouseInteractor {\r\n /**触发鼠标事件的容器*/\r\n private _container: HTMLElement;\r\n\r\n /**画布*/\r\n // TODO _canvas暂时没用到,需要视具体情况定\r\n private _canvas: ICCanvas;\r\n\r\n /**鼠标事件处理器*/\r\n private _mouseControllers: Array<IProcessMouseEvent> = [];\r\n\r\n /**鼠标是否按下*/\r\n private _mouseDown = false;\r\n\r\n /**鼠标左键按下位置*/\r\n private _lMouseDownPos?: Vec2;\r\n\r\n /**鼠标中键按下位置*/\r\n private _mMouseDownPos?: Vec2;\r\n\r\n /**鼠标右键按下位置*/\r\n private _rMouseDownPos?: Vec2;\r\n\r\n /**双击判定定时器*/\r\n private _dblClickTimeout?: number;\r\n\r\n private _lastLMouseUpPos?: Vec2;\r\n\r\n /**滚轮滚动中*/\r\n private _wheeling = false;\r\n\r\n private _wheelTimer?: number;\r\n\r\n constructor(canvas: ICCanvas, container: HTMLElement, controllers: Array<IProcessMouseEvent>) {\r\n this._canvas = canvas;\r\n this._container = container;\r\n this._mouseControllers = controllers;\r\n }\r\n\r\n public startListening() {\r\n this._container.addEventListener(EN_NativeMouseEvent.MOUSE_DOWN, this._onMouseDown);\r\n this._container.addEventListener(EN_NativeMouseEvent.MOUSE_MOVE, this._onMouseMove);\r\n this._container.addEventListener(EN_NativeMouseEvent.MOUSE_UP, this._onMouseUp);\r\n this._container.addEventListener(EN_NativeMouseEvent.WHEEL, this._onMouseWheel);\r\n this._container.addEventListener(EN_NativeMouseEvent.CONTEXT_MENU, this._onContextMenu);\r\n this._container.addEventListener(EN_NativeMouseEvent.MOUSE_LEAVE, this._onMouseLeave);\r\n this._container.addEventListener(EN_NativeMouseEvent.MOUSE_ENTER, this._onMouseEnter);\r\n }\r\n\r\n public stopListening() {\r\n this._container.removeEventListener(EN_NativeMouseEvent.MOUSE_DOWN, this._onMouseDown);\r\n this._container.removeEventListener(EN_NativeMouseEvent.MOUSE_MOVE, this._onMouseMove);\r\n this._container.removeEventListener(EN_NativeMouseEvent.MOUSE_UP, this._onMouseUp);\r\n this._container.removeEventListener(EN_NativeMouseEvent.WHEEL, this._onMouseWheel);\r\n this._container.removeEventListener(EN_NativeMouseEvent.CONTEXT_MENU, this._onContextMenu);\r\n this._container.removeEventListener(EN_NativeMouseEvent.MOUSE_LEAVE, this._onMouseLeave);\r\n this._container.removeEventListener(EN_NativeMouseEvent.MOUSE_ENTER, this._onMouseEnter);\r\n }\r\n\r\n private _onMouseDown = (e: MouseEvent) => {\r\n const pos = this._getScreenPos(e);\r\n this._mouseDown = true;\r\n let consumed = false;\r\n if (e.button === 0) {\r\n this._lMouseDownPos = pos.clone();\r\n consumed = this._processMouseEvent(EN_MouseEvent.L_BUTTON_DOWN, e);\r\n } else if (e.button === 1) {\r\n this._mMouseDownPos = pos.clone();\r\n consumed = this._processMouseEvent(EN_MouseEvent.M_BUTTON_DOWN, e);\r\n } else if (e.button === 2) {\r\n this._rMouseDownPos = pos.clone();\r\n consumed = this._processMouseEvent(EN_MouseEvent.R_BUTTON_DOWN, e);\r\n }\r\n if (consumed) {\r\n e.stopPropagation();\r\n }\r\n }\r\n\r\n private _onMouseMove = (e: MouseEvent) => {\r\n let consumed = false;\r\n consumed = this._processMouseEvent(EN_MouseEvent.MOUSE_MOVE, e)\r\n if (consumed) {\r\n e.stopPropagation();\r\n }\r\n }\r\n\r\n private _onMouseUp = (e: MouseEvent) => {\r\n const pos = this._getScreenPos(e);\r\n this._mouseDown = false;\r\n let consumed = false;\r\n if (e.button === 0) {\r\n if (this._lMouseDownPos && this._lMouseDownPos.sqDistanceTo(pos) < canvasConfig.common.click_to_tolerance) {\r\n this._processMouseEvent(EN_MouseEvent.CLICK, e);\r\n }\r\n if (!this._dblClickTimeout) {\r\n // 未在双击判定时间内触发,为延迟单击\r\n this._dblClickTimeout = window.setTimeout(() => {\r\n delete this._dblClickTimeout;\r\n this._processMouseEvent(EN_MouseEvent.SGL_CLICK, e);\r\n }, canvasConfig.common.dbl_click_interval)\r\n } else {\r\n // 双击时间内再次触发,根据距离判断是否真正双击\r\n window.clearTimeout(this._dblClickTimeout);\r\n if (this._lastLMouseUpPos && this._lastLMouseUpPos.sqDistanceTo(pos) < canvasConfig.common.click_to_tolerance) {\r\n delete this._dblClickTimeout;\r\n this._processMouseEvent(EN_MouseEvent.DBL_CLICK, e);\r\n } else {\r\n this._dblClickTimeout = window.setTimeout(() => {\r\n delete this._dblClickTimeout;\r\n this._processMouseEvent(EN_MouseEvent.SGL_CLICK, e);\r\n }, canvasConfig.common.dbl_click_interval)\r\n }\r\n }\r\n this._lastLMouseUpPos = pos.clone();\r\n consumed = this._processMouseEvent(EN_MouseEvent.L_BUTTON_UP, e);\r\n delete this._lMouseDownPos;\r\n } else if (e.button === 1) {\r\n delete this._mMouseDownPos;\r\n consumed = this._processMouseEvent(EN_MouseEvent.M_BUTTON_UP, e);\r\n } else if (e.button === 2) {\r\n consumed = this._processMouseEvent(EN_MouseEvent.R_BUTTON_UP, e);\r\n if (!consumed &&\r\n this._rMouseDownPos &&\r\n this._rMouseDownPos.sqDistanceTo(pos) < canvasConfig.common.click_to_tolerance\r\n ) {\r\n consumed = this._processMouseEvent(EN_MouseEvent.R_CLICK, e);\r\n delete this._rMouseDownPos;\r\n }\r\n }\r\n if (consumed) {\r\n e.stopPropagation();\r\n }\r\n }\r\n\r\n private _onMouseWheel = (e: WheelEvent) => {\r\n const stopWheel = () => {\r\n if (this._wheeling === true) {\r\n this._wheeling = false;\r\n delete this._wheelTimer;\r\n this._processMouseEvent(EN_MouseEvent.WHEEL_END, e);\r\n }\r\n }\r\n\r\n if (this._wheelTimer !== undefined) {\r\n window.clearTimeout(this._wheelTimer);\r\n }\r\n\r\n if (!this._wheeling) {\r\n this._wheeling = true;\r\n this._processMouseEvent(EN_MouseEvent.WHEEL_START, e);\r\n }\r\n this._wheelTimer = window.setTimeout(stopWheel, 500);\r\n\r\n const consumed = this._processMouseEvent(\r\n e.deltaY < 0 ?\r\n EN_MouseEvent.WHEEL_FORWARD :\r\n EN_MouseEvent.WHEEL_BACKWARD, e);\r\n if (consumed) {\r\n e.stopPropagation();\r\n }\r\n }\r\n\r\n private _onContextMenu = (e: MouseEvent) => {\r\n e.preventDefault();\r\n }\r\n\r\n private _onMouseLeave = (e: MouseEvent) => {\r\n this._processMouseEvent(EN_MouseEvent.MOUSE_LEAVE, e);\r\n delete this._lMouseDownPos;\r\n }\r\n\r\n private _onMouseEnter = (e: MouseEvent) => {\r\n this._processMouseEvent(EN_MouseEvent.MOUSE_ENTER, e);\r\n }\r\n\r\n private _processMouseEvent(type: EN_MouseEvent, domEvent: MouseEvent): boolean {\r\n let consumed = false;\r\n const fnKey = new FnKey(domEvent);\r\n for (let i = 0; i < this._mouseControllers.length; i++) {\r\n const controller = this._mouseControllers[i];\r\n consumed = controller.processMouseEvent({\r\n type,\r\n domEvent,\r\n pos: this._getScreenPos(domEvent),\r\n fnKey,\r\n });\r\n if (consumed) break;\r\n }\r\n return consumed;\r\n }\r\n\r\n /**\r\n * 获取相对于canvas的屏幕坐标\r\n */\r\n private _getScreenPos(e: MouseEvent) {\r\n const rect = this._container.getBoundingClientRect();\r\n const x = e.clientX - rect.left;\r\n const y = e.clientY - rect.top;\r\n return new Vec2(x, y);\r\n }\r\n}\r\n","import { Plane } from '@ccpc/math'\r\n\r\nexport class WorkPlane {\r\n // private _name = '工作平面'\r\n\r\n private _plane: Plane\r\n\r\n constructor()\r\n constructor(plane: Plane)\r\n constructor(plane?: Plane) {\r\n const oPlane = plane || Plane.XOY()\r\n this._plane = oPlane\r\n }\r\n\r\n public get plane() {\r\n return this._plane\r\n }\r\n\r\n public set plane(plane: Plane) {\r\n this._plane = plane\r\n }\r\n\r\n public clone() {\r\n const cl = new WorkPlane()\r\n cl.plane = this._plane.clone()\r\n return cl\r\n }\r\n}\r\n","import { EN_KeyboardEvent, EN_NativeKeyboardEvent } from '../types/type_define';\r\nimport { FnKey } from './fn_key';\r\nimport { IProcessKeyboardEvent } from './i_keyboard_controller';\r\n\r\n/**\r\n * 键盘事件监听器\r\n */\r\nexport class KeyboardInteractor {\r\n /**键盘事件处理器*/\r\n private _mouseControllers: Array<IProcessKeyboardEvent> = [];\r\n\r\n constructor(controllers: Array<IProcessKeyboardEvent>) {\r\n this._mouseControllers = controllers;\r\n }\r\n\r\n public startListening() {\r\n window.addEventListener(EN_NativeKeyboardEvent.KEY_DOWN, this._onKeyDown);\r\n window.addEventListener(EN_NativeKeyboardEvent.KEY_UP, this._onKeyUp);\r\n window.addEventListener(EN_NativeKeyboardEvent.KEY_DOWN, this._onKeyPress);\r\n }\r\n\r\n public stopListening() {\r\n window.removeEventListener(EN_NativeKeyboardEvent.KEY_DOWN, this._onKeyDown);\r\n window.removeEventListener(EN_NativeKeyboardEvent.KEY_UP, this._onKeyUp);\r\n window.removeEventListener(EN_NativeKeyboardEvent.KEY_DOWN, this._onKeyPress);\r\n }\r\n\r\n private _onKeyDown = (e: KeyboardEvent) => {\r\n this._processKeyboardEvent(EN_KeyboardEvent.KEY_DOWN, e);\r\n }\r\n\r\n private _onKeyUp = (e: KeyboardEvent) => {\r\n this._processKeyboardEvent(EN_KeyboardEvent.KEY_UP, e);\r\n }\r\n\r\n private _onKeyPress = (e: KeyboardEvent) => {\r\n this._processKeyboardEvent(EN_KeyboardEvent.KEY_PRESS, e);\r\n }\r\n\r\n private _processKeyboardEvent(type: EN_KeyboardEvent, domEvent: KeyboardEvent): boolean {\r\n let consumed = false;\r\n const fnKey = new FnKey(domEvent);\r\n for (let i = 0; i < this._mouseControllers.length; i++) {\r\n const controller = this._mouseControllers[i];\r\n consumed = controller.processKeyboardEvent({\r\n type,\r\n domEvent,\r\n fnKey,\r\n });\r\n if (consumed) break;\r\n }\r\n return consumed;\r\n }\r\n}\r\n","import { GNode, ModelView } from '@ccpc/core'\nimport { ICCanvas } from './i_c_canvas'\nimport { CRenderer } from '../render/c_renderer'\nimport { MouseInteractor } from '../controller/mouse_interactor'\nimport { IProcessEvent } from '../controller/i_process_event'\nimport { WorkPlane } from './work_plane'\nimport { alg, CONST, Ln3, Plane, Vec2, Vec3 } from '@ccpc/math'\nimport { KeyboardInteractor } from '../controller/keyboard_interactor'\n\n// TODO 先简单分层,canvas中只持有renderer\nexport class CCanvas implements ICCanvas {\n /**\n * 画布容器\n */\n private _container: HTMLElement\n\n private _renderer: CRenderer\n\n /**\n * 鼠标事件监听器\n */\n private _mouseInteractor: MouseInteractor\n\n /**\n * 键盘事件监听器\n */\n private _keyboardInteractor: KeyboardInteractor\n\n constructor(container: HTMLElement, evtProcess: Array<IProcessEvent>) {\n this._container = container\n this._mouseInteractor = new MouseInteractor(this, this._container, evtProcess)\n this._keyboardInteractor = new KeyboardInteractor(evtProcess)\n this._renderer = new CRenderer(this._container)\n }\n\n public get container() {\n return this._container\n }\n\n /**\n * 开启事件监听\n */\n public startListening() {\n this._mouseInteractor.startListening()\n this._keyboardInteractor.startListening()\n }\n\n /**\n * 停止监听\n */\n public stopListening() {\n this._mouseInteractor.stopListening()\n this._keyboardInteractor.stopListening()\n }\n\n /**\n * 给模型层视图绑定渲染器实例\n */\n public resetModelView(modelView: ModelView) {\n modelView.iRender = this._renderer\n }\n\n /**\n * 获取当前工作平面\n */\n public getWorkPlane() {\n return new WorkPlane()\n }\n\n /**\n * NDC转屏幕坐标\n */\n public NDCToScreen(ndcX: number, ndcY: number) {\n return this._renderer.NDCToScreen(ndcX, ndcY)\n }\n\n /**\n * 屏幕坐标转NDC\n */\n public screenToNDC(screenPos: Vec2) {\n return this._renderer.screenToNDC(screenPos)\n }\n\n /**\n * 屏幕坐标投影到世界坐标系中的指定平面上\n * @param screenPos 屏幕坐标\n * @param plane 世界坐标系下的平面\n */\n public screenToWorldPlane(screenPos: Vec2, plane: Plane) {\n const ray = this._renderer.generateCameraRay(screenPos)\n ray.extendDouble(CONST.MODEL_MAX_LENGTH)\n const pts = alg.X.curveSurface(ray, plane)\n if (!pts.length) return Vec3.O()\n return pts[0]\n }\n\n /**\n * 屏幕坐标转当前工作平面下的世界坐标\n */\n public screenToWorkPlane(screenPos: Vec2) {\n const { plane } = this.getWorkPlane()\n const p = this.screenToWorldPlane(screenPos, plane)\n return p\n }\n\n /**\n * 世界坐标转屏幕坐标\n */\n public worldToScreen(worldPos: Vec3) {\n const ndc = this._renderer.worldToNDC(worldPos)\n return this.NDCToScreen(ndc.x, ndc.y)\n }\n\n /**\n * 屏幕坐标转换为指定平面下的二维局部坐标\n * @param screenPos 屏幕坐标\n * @param plane 目标平面\n */\n public screenToPlaneLocal(screenPos: Vec2, plane: Plane) {\n const pt3 = this.screenToWorldPlane(screenPos, plane)\n return plane.getUVAt(pt3)\n }\n\n /**\n * 屏幕坐标转换为当前工作平面下的二维局部坐标\n * @param screenPos 屏幕坐标\n */\n public screenToWorkPlaneLocal(screenPos: Vec2) {\n const { plane } = this.getWorkPlane()\n return this.screenToPlaneLocal(screenPos, plane)\n }\n\n /**\n * 获取当前工作平面下,1世界单位对应多少像素\n */\n public pixelsPerUnit() {\n const { plane } = this.getWorkPlane()\n const p1 = plane.getPtAt({ x: 0, y: 0 })\n const p2 = plane.getPtAt({ x: 1, y: 0 })\n\n const s1 = this.worldToScreen(p1)\n const s2 = this.worldToScreen(p2)\n\n return s1.distanceTo(s2)\n }\n\n /**\n * 生成相机射线\n */\n public generateCameraRay(screenPos: Vec2): Ln3 {\n return this._renderer.generateCameraRay(screenPos)\n }\n\n public pick(screenX: number, screenY: number): GNode[] {\n return this._renderer.pick(screenX, screenY)\n }\n\n // TODO 补充完整\n public destroy() {\n this.stopListening()\n }\n}\n","import { EN_KeyboardEvent, EN_MouseEvent, IKeyboardEvent, IMouseEvent } from '../types/type_define';\r\nimport { IKeyboardController } from './i_keyboard_controller';\r\nimport { IMouseController } from './i_mouse_controller';\r\n\r\nexport class DefaultController implements IMouseController, IKeyboardController {\r\n public processKeyboardEvent(event: IKeyboardEvent): boolean {\r\n switch (event.type) {\r\n case EN_KeyboardEvent.KEY_DOWN:\r\n return this.onKeyDown(event);\r\n case EN_KeyboardEvent.KEY_UP:\r\n return this.onKeyUp(event);\r\n case EN_KeyboardEvent.KEY_PRESS:\r\n return this.onKeyPress(event);\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n public processMouseEvent(event: IMouseEvent): boolean {\r\n switch (event.type) {\r\n case EN_MouseEvent.MOUSE_ENTER:\r\n return this.onMouseEnter(event);\r\n case EN_MouseEvent.MOUSE_MOVE:\r\n return this.onMouseMove(event);\r\n case EN_MouseEvent.MOUSE_LEAVE:\r\n return this.onMouseLeave(event);\r\n case EN_MouseEvent.L_BUTTON_DOWN:\r\n return this.onLButtonDown(event);\r\n case EN_MouseEvent.L_BUTTON_UP:\r\n return this.onLButtonUp(event);\r\n case EN_MouseEvent.R_BUTTON_DOWN:\r\n return this.onRButtonDown(event);\r\n case EN_MouseEvent.R_BUTTON_UP:\r\n return this.onRButtonUp(event);\r\n case EN_MouseEvent.M_BUTTON_DOWN:\r\n return this.onMButtonDown(event);\r\n case EN_MouseEvent.M_BUTTON_UP:\r\n return this.onMButtonUp(event);\r\n case EN_MouseEvent.WHEEL_FORWARD:\r\n return this.onWheelForward(event);\r\n case EN_MouseEvent.WHEEL_BACKWARD:\r\n return this.onWheelBackward(event);\r\n case EN_MouseEvent.CLICK:\r\n return this.onClick(event);\r\n case EN_MouseEvent.SGL_CLICK:\r\n return this.onSglClick(event);\r\n case EN_MouseEvent.DBL_CLICK:\r\n return this.onDblClick(event);\r\n case EN_MouseEvent.R_CLICK:\r\n return this.onRClick(event);\r\n default:\r\n return false;\r\n }\r\n }\r\n\r\n public onMouseEnter(_evt: IMouseEvent): boolean {\r\n return false;\r\n }\r\n\r\n public onMouseMove(_evt: IMouseEvent): boolean {\r\n return false;\r\n }\r\n\r\n public onLButtonDown(_evt: IMouseEvent): boolean {\r\n return false;\r\n }\r\n public onLButtonUp(_evt: IMouseEvent): boolean {\r\n return false;\r\n }\r\n\r\n public onRClick(_evt: IMouseEvent): boolean {\r\n return false;\r\n }\r\n\r\n public onRButtonDown(_evt: IMouseEvent): boolean {\r\n return false;\r\n }\r\n\r\n public onRButtonUp(_evt: IMouseEvent): boolean {\r\n return false;\r\n }\r\n\r\n public onMButtonDown(_evt: IMouseEvent): boolean {\r\n return false;\r\n }\r\n\r\n public onMButtonUp(_evt: IMouseEvent): boolean {\r\n return false;\r\n }\r\n\r\n public onWheelForward(_evt: IMouseEvent): boolean {\r\n return false;\r\n }\r\n\r\n public onWheelBackward(_evt: IMouseEvent): boolean {\r\n return false;\r\n }\r\n\r\n public onClick(_evt: IMouseEvent): boolean {\r\n return false;\r\n }\r\n\r\n public onSglClick(_evt: IMouseEvent): boolean {\r\n return false;\r\n }\r\n\r\n public onDblClick(_evt: IMouseEvent): boolean {\r\n return false;\r\n }\r\n\r\n public onMouseLeave(_evt: IMouseEvent): boolean {\r\n return false;\r\n }\r\n\r\n public onKeyDown(_evt: IKeyboardEvent): boolean {\r\n return false;\r\n }\r\n\r\n public onKeyUp(_evt: IKeyboardEvent): boolean {\r\n return false;\r\n }\r\n\r\n public onKeyPress(_evt: IKeyboardEvent): boolean {\r\n return false;\r\n }\r\n}\r\n"],"names":["EN_NativeMouseEvent","EN_NativeKeyboardEvent","EN_MouseEvent","EN_KeyboardEvent","canvasConfig","_changeEvent","_startEvent","_endEvent","_ray","Ray","_plane","Plane","_TILT_LIMIT","MathUtils","_v","Vector3","_twoPI","_STATE","_EPS","OrbitControls","Controls","object","domElement","MOUSE","TOUCH","Quaternion","Spherical","Vector2","onPointerMove","onPointerDown","onPointerUp","onContextMenu","onMouseWheel","onKeyDown","onTouchStart","onTouchMove","onMouseDown","onMouseMove","interceptControlDown","interceptControlUp","element","deltaTime","position","min","max","zoomChanged","prevRadius","newRadius","radiusDelta","mouseBefore","prevZoom","mouseAfter","delta","normalizedDelta","angle","distance","objectMatrix","deltaX","deltaY","targetDistance","dollyScale","x","y","rect","dx","dy","w","h","dist","event","needsUpdate","centerX","centerY","i","pointerId","mode","newEvent","mouseAction","_box","Box3","_vector","LineSegmentsGeometry","InstancedBufferGeometry","positions","uvs","index","Float32BufferAttribute","matrix","start","end","array","lineSegments","instanceBuffer","InstancedInterleavedBuffer","InterleavedBufferAttribute","colors","instanceColorBuffer","geometry","mesh","WireframeGeometry","Sphere","center","maxRadiusSq","il","UniformsLib","ShaderLib","UniformsUtils","LineMaterial","ShaderMaterial","parameters","value","_viewport","Vector4","_start","_end","_start4","_end4","_ssOrigin","_ssOrigin3","_mvMatrix","Matrix4","_line","Line3","_closestPoint","_sphere","_clipToWorldVector","_lineWidth","getWorldSpaceHalfWidth","camera","resolution","raycastWorldUnits","intersects","matrixWorld","instanceStart","instanceEnd","segmentCount","l","pointOnLine","point","raycastScreenSpace","projectionMatrix","near","deltaDist","t","param","zPos","isInClipSpace","isInside","LineSegments2","Mesh","material","lineDistances","j","instanceDistanceBuffer","raycaster","worldUnits","threshold","sphereMargin","distanceToSphere","boxMargin","distanceToBox","renderer","uniforms","LineGeometry","length","points","line","Line2","ThreeUtil","mat","r0","r1","r2","r3","ThreeMatrix4","RenderHub","grep","rNode","allNodes","group","Group","node","obj","_eId","cur","gnode","result","RenderGroup","child","RenderPoint","Vec3","geo","BufferGeometry","pointStyle","pointMat","PointsMaterial","Points","RenderEdge","rawPoint","lineStyle","lineMat","RenderMesh","indices","normals","BufferAttribute","globalMatrix","faceStyle","faceMat","MeshBasicMaterial","RenderText","text","Text","textStyle","EN_AnchorX","EN_AnchorY","ActiveSelectionOp","activeScene","greps","RenderNodeUtil","_CRenderer","IRender","_container","update","remove","DisplayObjectMgr","dId","renderData","WebGLRenderer","SRGBColorSpace","Scene","aspect","vh","vw","OrthographicCamera","id","gRep","display","ndcX","ndcY","screenPos","Vec2","pos","worldPos","p","Raycaster","ndc","ray","lineRay","Ln3","CONST","screenX","screenY","seen","hit","CRenderer","FnKey","MouseInteractor","canvas","container","controllers","e","consumed","stopWheel","type","domEvent","fnKey","WorkPlane","plane","oPlane","cl","KeyboardInteractor","CCanvas","evtProcess","modelView","pts","alg","pt3","p1","p2","s1","s2","DefaultController","_evt"],"mappings":"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A;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqNV;AAAA;AAAA,IACU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+JX;AAcA,MAAMG,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","x_google_ignoreList":[2,3,4,5,6,7]}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ccpc/canvas",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.28",
|
|
4
4
|
"description": "Canvas rendering layer for editor",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./index.js",
|
|
8
8
|
"types": "./types/index.d.ts",
|
|
9
9
|
"peerDependencies": {
|
|
10
|
-
"@ccpc/core": "^0.1.
|
|
11
|
-
"@ccpc/math": "^0.1.
|
|
10
|
+
"@ccpc/core": "^0.1.28",
|
|
11
|
+
"@ccpc/math": "^0.1.28"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"three": "^0.181.1",
|