|
|
@ -54,10 +54,41 @@ export default abstract class BaseInteraction { |
|
|
alphaToCoverage: true |
|
|
alphaToCoverage: true |
|
|
}) |
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* 物品是否"单点", 不允许连线 |
|
|
|
|
|
*/ |
|
|
|
|
|
get isSinglePointMode(): boolean { |
|
|
|
|
|
return false |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
constructor(itemTypeName: string) { |
|
|
constructor(itemTypeName: string) { |
|
|
this.itemTypeName = itemTypeName |
|
|
this.itemTypeName = itemTypeName |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
createPointOfItem(catchPoint: ItemJson, point: THREE.Vector3): ItemJson { |
|
|
|
|
|
const renderer = getRenderer(this.itemTypeName) |
|
|
|
|
|
|
|
|
|
|
|
const defaultScale = renderer.defaultScale |
|
|
|
|
|
const defaultRotation = renderer.defaultRotation |
|
|
|
|
|
|
|
|
|
|
|
_.extend(catchPoint, { |
|
|
|
|
|
id: system.createUUID(), |
|
|
|
|
|
t: this.itemTypeName, |
|
|
|
|
|
v: true, |
|
|
|
|
|
tf: [ |
|
|
|
|
|
[point.x, point.y, point.z], |
|
|
|
|
|
[defaultRotation.x, defaultRotation.y, defaultRotation.z], |
|
|
|
|
|
[defaultScale.x, defaultScale.y, defaultScale.z] |
|
|
|
|
|
], |
|
|
|
|
|
dt: { |
|
|
|
|
|
in: [] as string[], |
|
|
|
|
|
out: [] as string[], |
|
|
|
|
|
center: [] as string[] |
|
|
|
|
|
} |
|
|
|
|
|
}) |
|
|
|
|
|
return catchPoint |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 拖拽点开始 |
|
|
* 拖拽点开始 |
|
|
*/ |
|
|
*/ |
|
|
@ -125,8 +156,15 @@ export default abstract class BaseInteraction { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (this.linkStartPointId) { |
|
|
if (this.linkStartPointId) { |
|
|
|
|
|
if (this.isSinglePointMode) { |
|
|
|
|
|
// 单点模式不需要起始点
|
|
|
|
|
|
this.linkStartPointId = undefined |
|
|
|
|
|
this.linkStartPointObject = undefined |
|
|
|
|
|
|
|
|
|
|
|
} else { |
|
|
this.linkStartPointObject = this.viewport.entityManager.findObjectsById(this.linkStartPointId)?.[0] |
|
|
this.linkStartPointObject = this.viewport.entityManager.findObjectsById(this.linkStartPointId)?.[0] |
|
|
} |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
pdFn = this.mousedown.bind(this) |
|
|
pdFn = this.mousedown.bind(this) |
|
|
this.canvas.addEventListener('pointerdown', pdFn) |
|
|
this.canvas.addEventListener('pointerdown', pdFn) |
|
|
@ -266,9 +304,29 @@ export default abstract class BaseInteraction { |
|
|
} |
|
|
} |
|
|
this.lastClickTime = now |
|
|
this.lastClickTime = now |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 如果正式的点命中到同类型的节点上,则不添加新的点,只牵线到该点
|
|
|
// 如果正式的点命中到同类型的节点上,则不添加新的点,只牵线到该点
|
|
|
let catchPoint: ItemJson | null = this.viewport.stateManager.findItemByPosition(point, this.itemTypeName) |
|
|
let catchPoint: ItemJson | null = this.viewport.stateManager.findItemByPosition(point, this.itemTypeName) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (this.isSinglePointMode) { |
|
|
|
|
|
// 单点模式,直接添加点
|
|
|
|
|
|
if (catchPoint) { |
|
|
|
|
|
// 如果已经有点了,则不再添加
|
|
|
|
|
|
system.msg('Point already exists at this position.') |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 则添加一个新的点
|
|
|
|
|
|
const stateManager = this.viewport.stateManager |
|
|
|
|
|
stateManager.beginStateUpdate({ createFromInteraction: true }) |
|
|
|
|
|
catchPoint = {} as ItemJson |
|
|
|
|
|
catchPoint = this.createPointOfItem(catchPoint, point) |
|
|
|
|
|
stateManager.vdata.items.push(catchPoint) |
|
|
|
|
|
stateManager.endStateUpdate() |
|
|
|
|
|
return |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
let from: ItemJson | undefined = undefined |
|
|
let from: ItemJson | undefined = undefined |
|
|
if (this.linkStartPointId) { |
|
|
if (this.linkStartPointId) { |
|
|
from = this.viewport.stateManager.findItemById(this.linkStartPointId) |
|
|
from = this.viewport.stateManager.findItemById(this.linkStartPointId) |
|
|
@ -300,28 +358,9 @@ export default abstract class BaseInteraction { |
|
|
stateManager.endStateUpdate() |
|
|
stateManager.endStateUpdate() |
|
|
|
|
|
|
|
|
} else { |
|
|
} else { |
|
|
const renderer = getRenderer(this.itemTypeName) |
|
|
|
|
|
|
|
|
|
|
|
const defaultScale = renderer.defaultScale |
|
|
|
|
|
const defaultRotation = renderer.defaultRotation |
|
|
|
|
|
|
|
|
|
|
|
// 添加正式点
|
|
|
// 添加正式点
|
|
|
catchPoint = { |
|
|
catchPoint = {} as ItemJson |
|
|
id: system.createUUID(), |
|
|
catchPoint = this.createPointOfItem(catchPoint, point) |
|
|
t: this.itemTypeName, |
|
|
|
|
|
v: true, |
|
|
|
|
|
tf: [ |
|
|
|
|
|
[point.x, point.y, point.z], |
|
|
|
|
|
[defaultRotation.x, defaultRotation.y, defaultRotation.z], |
|
|
|
|
|
[defaultScale.x, defaultScale.y, defaultScale.z] |
|
|
|
|
|
], |
|
|
|
|
|
dt: { |
|
|
|
|
|
in: [] as string[], |
|
|
|
|
|
out: [] as string[], |
|
|
|
|
|
center: [] as string[] |
|
|
|
|
|
} |
|
|
|
|
|
} as ItemJson |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 提交状态管理器
|
|
|
// 提交状态管理器
|
|
|
const stateManager = this.viewport.stateManager |
|
|
const stateManager = this.viewport.stateManager |
|
|
@ -396,6 +435,8 @@ export default abstract class BaseInteraction { |
|
|
const obj = new CSS2DObject(div) |
|
|
const obj = new CSS2DObject(div) |
|
|
return obj |
|
|
return obj |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
export interface DragOption { |
|
|
export interface DragOption { |
|
|
|