(function (global) { 'use strict'; var WorkbenchAgent = global.PWAgent; var U = global.PWAgentUtil; var nodeId = U && U.nodeId; var walk = U && U.walk; if (!WorkbenchAgent) { console.error('[调试工作台] agent-pick 需先加载 agent-core'); return; } WorkbenchAgent.prototype._setPickMode = function (mode) { this._pickMode = mode === 'inspect' ? 'inspect' : 'game'; document.documentElement.classList.toggle('pw-inspect', this._pickMode === 'inspect'); this._bindCanvasPick(this._isActive('pick')); return this._pickMode; }; WorkbenchAgent.prototype._bindCanvasPick = function (on) { var canvas = document.getElementById('GameCanvas'); if (!canvas) return; canvas.removeEventListener('pointerdown', this._onPickDown, true); if (on && this._pickMode === 'inspect') { if (!this._onPickDown) { var self = this; this._onPickDown = function (ev) { if (self._pickMode !== 'inspect') return; ev.preventDefault(); ev.stopPropagation(); var uuid = self._hitTest(ev.clientX, ev.clientY); self._selectNode(uuid); if (self._isActive('inspector') || self._isActive('hierarchy')) { self._post({ type: 'event', name: 'hier.diff', data: self._getHierTree() }); } }; } canvas.addEventListener('pointerdown', this._onPickDown, true); } }; WorkbenchAgent.prototype._hitTest = function (clientX, clientY) { var cc = this.cc; var canvas = document.getElementById('GameCanvas'); if (!cc || !canvas) return ''; var scene = cc.director.getScene(); if (!scene) return ''; var stack = []; walk(scene, function (n) { stack.push(n); }); for (var i = stack.length - 1; i >= 0; i--) { var node = stack[i]; if (!node || !node.activeInHierarchy) continue; var uit = node.getComponent && node.getComponent(cc.UITransform); if (!uit) continue; var box = this._nodeClientRect(node); if (!box) continue; if (clientX >= box.left && clientX <= box.right && clientY >= box.top && clientY <= box.bottom) { return nodeId(node); } } return ''; }; WorkbenchAgent.prototype._ensureOverlay = function () { var el = document.getElementById('pw-pick-overlay'); if (!el) { el = document.createElement('div'); el.id = 'pw-pick-overlay'; el.className = 'pw-pick-overlay'; el.hidden = true; document.body.appendChild(el); } this._overlay = el; }; WorkbenchAgent.prototype._nodeClientRect = function (node) { var cc = this.cc; var canvas = document.getElementById('GameCanvas'); if (!cc || !canvas || !node || !node.isValid) return null; var uit = node.getComponent && node.getComponent(cc.UITransform); if (!uit || typeof uit.getBoundingBoxToWorld !== 'function') return null; var box = uit.getBoundingBoxToWorld(); if (!box) return null; var canvasRect = canvas.getBoundingClientRect(); var vs = cc.view && cc.view.getVisibleSize ? cc.view.getVisibleSize() : { width: canvasRect.width, height: canvasRect.height }; var vw = Math.max(1, vs.width); var vh = Math.max(1, vs.height); var corners = [ { x: box.x, y: box.y }, { x: box.x + box.width, y: box.y }, { x: box.x + box.width, y: box.y + box.height }, { x: box.x, y: box.y + box.height }, ]; var xs = []; var ys = []; for (var i = 0; i < 4; i++) { xs.push(canvasRect.left + (corners[i].x / vw + 0.5) * canvasRect.width); ys.push(canvasRect.top + (0.5 - corners[i].y / vh) * canvasRect.height); } var left = Math.min.apply(null, xs); var right = Math.max.apply(null, xs); var top = Math.min.apply(null, ys); var bottom = Math.max.apply(null, ys); return { left: left, top: top, right: right, bottom: bottom, width: Math.max(2, right - left), height: Math.max(2, bottom - top) }; }; WorkbenchAgent.prototype._updateOverlay = function () { var node = this._findNode(this._selectedUuid); var overlay = this._overlay; if (!overlay) return; if (!node) { overlay.hidden = true; return; } var box = this._nodeClientRect(node); if (!box) { overlay.hidden = true; return; } overlay.hidden = false; overlay.style.position = 'fixed'; overlay.style.left = box.left + 'px'; overlay.style.top = box.top + 'px'; overlay.style.width = box.width + 'px'; overlay.style.height = box.height + 'px'; }; WorkbenchAgent.prototype._getOverlayRect = function () { var overlay = this._overlay; if (!overlay || overlay.hidden) return null; return { left: parseFloat(overlay.style.left) || 0, top: parseFloat(overlay.style.top) || 0, width: parseFloat(overlay.style.width) || 0, height: parseFloat(overlay.style.height) || 0, }; }; })(window);