|
|
|
@ -11,6 +11,7 @@ import { Viewer } from '../GraphicsSystem/Viewer';
|
|
|
|
|
import { SelectMarquee } from '../UI/JsPlugin/SelectMarquee';
|
|
|
|
|
import { Editor, EditorService } from './Editor';
|
|
|
|
|
import { PointPick } from './PointPick';
|
|
|
|
|
import { SelectSetBase } from './SelectBase';
|
|
|
|
|
import { SelectBox, SelectType } from './SelectBox';
|
|
|
|
|
import { Filter } from './SelectFilter';
|
|
|
|
|
import { SelectPick } from './SelectPick';
|
|
|
|
@ -19,61 +20,81 @@ import { TransMode } from './TranstrolControl/TransformServices';
|
|
|
|
|
|
|
|
|
|
export class SelectControls implements EditorService
|
|
|
|
|
{
|
|
|
|
|
get IsReady()
|
|
|
|
|
private _SelectCss: SelectMarquee;
|
|
|
|
|
private _Editor: Editor;
|
|
|
|
|
private _Viewer: Viewer;
|
|
|
|
|
private _SelectSet: SelectSet = new SelectSet(true);
|
|
|
|
|
Filter: Filter;
|
|
|
|
|
private _SelectType: SelectType = SelectType.None;
|
|
|
|
|
private _FirstPickPoint: Vector3;
|
|
|
|
|
|
|
|
|
|
constructor(view: Viewer, ed: Editor)
|
|
|
|
|
{
|
|
|
|
|
return this.m_Editor.InputState <= InputState.Select;
|
|
|
|
|
this._Editor = ed;
|
|
|
|
|
this._Viewer = view;
|
|
|
|
|
this._SelectCss = new SelectMarquee(this._Viewer);
|
|
|
|
|
this.RegisterEvent();
|
|
|
|
|
}
|
|
|
|
|
async Doit(e: MouseEvent)
|
|
|
|
|
|
|
|
|
|
get IsReady()
|
|
|
|
|
{
|
|
|
|
|
return this.onMouseDown(e);
|
|
|
|
|
return this._Editor.InputState <= InputState.Select;
|
|
|
|
|
}
|
|
|
|
|
private m_SelectCss: SelectMarquee;
|
|
|
|
|
private m_Editor: Editor;
|
|
|
|
|
private m_Viewer: Viewer;
|
|
|
|
|
private m_SelectSet: SelectSet = new SelectSet(true);
|
|
|
|
|
m_Filter: Filter;
|
|
|
|
|
private m_SelectType: SelectType = SelectType.None;
|
|
|
|
|
private m_FirstPickPoint: Vector3;
|
|
|
|
|
|
|
|
|
|
constructor(view: Viewer, ed: Editor)
|
|
|
|
|
async Doit(e: MouseEvent)
|
|
|
|
|
{
|
|
|
|
|
this.m_Editor = ed;
|
|
|
|
|
this.m_Viewer = view;
|
|
|
|
|
this.m_SelectCss = new SelectMarquee(this.m_Viewer);
|
|
|
|
|
this.RegisterEvent();
|
|
|
|
|
if ((this._Editor.InputState & InputState.SelectIng) && e.button === MouseKey.Right)
|
|
|
|
|
{
|
|
|
|
|
this.RestState();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
//左键 并且准备好时.
|
|
|
|
|
if (e.button !== MouseKey.Left || !this.IsReady)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
this.LeftClick();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
get SelectSet()
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 返回当前的选择集,每次重新选择都会返回一个新的SelectSet
|
|
|
|
|
* 不要对返回的对象注入函数,操作AddSelect,而是使用`app.Editor.SelectCtrl.AddSelect`;
|
|
|
|
|
*/
|
|
|
|
|
get SelectSet(): SelectSet
|
|
|
|
|
{
|
|
|
|
|
return this.m_SelectSet;
|
|
|
|
|
return this._SelectSet;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
set SelectType(type: SelectType)
|
|
|
|
|
{
|
|
|
|
|
this.m_SelectType = type;
|
|
|
|
|
this.m_SelectCss.selectType = type;
|
|
|
|
|
this._SelectType = type;
|
|
|
|
|
this._SelectCss.selectType = type;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RegisterEvent()
|
|
|
|
|
{
|
|
|
|
|
let ed = this.m_Editor;
|
|
|
|
|
end(ed.MouseCtrl, ed.MouseCtrl.updateWordPoint, () => { this.onMouseMove() });
|
|
|
|
|
end(ed.KeyCtrl, ed.KeyCtrl.OnKeyDown, (e) => { this.onKeyDown(e) });
|
|
|
|
|
let ed = this._Editor;
|
|
|
|
|
end(ed.MouseCtrl, ed.MouseCtrl.updateWordPoint, () => { this.OnMouseMove() });
|
|
|
|
|
end(ed.KeyCtrl, ed.KeyCtrl.OnKeyDown, (e: KeyboardEvent) => { this.OnKeyDown(e) });
|
|
|
|
|
end(app.Viewer.CameraCtrl, app.Viewer.CameraCtrl.Update, () =>
|
|
|
|
|
{
|
|
|
|
|
if (this.m_FirstPickPoint)
|
|
|
|
|
if (this._FirstPickPoint)
|
|
|
|
|
{
|
|
|
|
|
let vp = app.Viewer.WorldToScreen(this.m_FirstPickPoint.clone());
|
|
|
|
|
this.m_SelectCss.SetStart(vp.x, vp.y);
|
|
|
|
|
this.m_SelectCss.Update();
|
|
|
|
|
let vp = app.Viewer.WorldToScreen(this._FirstPickPoint.clone());
|
|
|
|
|
this._SelectCss.SetStart(vp.x, vp.y);
|
|
|
|
|
this._SelectCss.Update();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UpdateView()
|
|
|
|
|
{
|
|
|
|
|
this.m_Viewer.OutlinePass.selectedObjects = this.m_SelectSet.SelectObjectList;
|
|
|
|
|
this.m_Viewer.UpdateRender();
|
|
|
|
|
this._Viewer.OutlinePass.selectedObjects = this._SelectSet.SelectObjectList;
|
|
|
|
|
this._Viewer.UpdateRender();
|
|
|
|
|
|
|
|
|
|
if (this.m_Viewer.OutlinePass.selectedObjects.length > 0)
|
|
|
|
|
if (this._Viewer.OutlinePass.selectedObjects.length > 0)
|
|
|
|
|
{
|
|
|
|
|
let obj = this.m_Viewer.OutlinePass.selectedObjects[0];
|
|
|
|
|
let obj = this._Viewer.OutlinePass.selectedObjects[0];
|
|
|
|
|
|
|
|
|
|
let ocs: Matrix4;
|
|
|
|
|
let ent = GetEntity(obj);
|
|
|
|
@ -89,37 +110,16 @@ export class SelectControls implements EditorService
|
|
|
|
|
else
|
|
|
|
|
ocs = obj.matrixWorld.clone();
|
|
|
|
|
|
|
|
|
|
this.m_Editor.transCtrl.m_Ents = this.SelectSet.SelectEntityList;
|
|
|
|
|
this.m_Editor.transCtrl.Matrix = ocs;
|
|
|
|
|
this.m_Editor.transCtrl.Mode = TransMode.Move;
|
|
|
|
|
this.m_Editor.transCtrl.Enable = true;
|
|
|
|
|
this._Editor.transCtrl.m_Ents = this.SelectSet.SelectEntityList;
|
|
|
|
|
this._Editor.transCtrl.Matrix = ocs;
|
|
|
|
|
this._Editor.transCtrl.Mode = TransMode.Move;
|
|
|
|
|
this._Editor.transCtrl.Enable = true;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
this.m_Editor.transCtrl.Enable = false;
|
|
|
|
|
this._Editor.transCtrl.Enable = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
removeSnapCall;
|
|
|
|
|
|
|
|
|
|
removeSnap()
|
|
|
|
|
{
|
|
|
|
|
if (this.removeSnapCall)
|
|
|
|
|
this.removeSnapCall();
|
|
|
|
|
}
|
|
|
|
|
onMouseDown(e: MouseEvent)
|
|
|
|
|
{
|
|
|
|
|
if ((this.m_Editor.InputState & InputState.SelectIng) && e.button === MouseKey.Right)
|
|
|
|
|
{
|
|
|
|
|
this.RestState();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
//左键 并且准备好时.
|
|
|
|
|
if (e.button !== MouseKey.Left || !this.IsReady)
|
|
|
|
|
return false;
|
|
|
|
|
|
|
|
|
|
this.LeftClick();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 模拟左键点击.
|
|
|
|
@ -127,34 +127,34 @@ export class SelectControls implements EditorService
|
|
|
|
|
*/
|
|
|
|
|
LeftClick(checkPick = true)
|
|
|
|
|
{
|
|
|
|
|
let pt = this.m_Editor.MouseCtrl.m_CurMousePointVCS;
|
|
|
|
|
let pt = this._Editor.MouseCtrl.m_CurMousePointVCS;
|
|
|
|
|
let isRemove = app.Editor.KeyCtrl.KeyIsDown(KeyCode.ShiftLeft);
|
|
|
|
|
//如果还没选择 那么
|
|
|
|
|
if ((this.m_Editor.InputState & InputState.SelectIng) === InputState.None)
|
|
|
|
|
if ((this._Editor.InputState & InputState.SelectIng) === InputState.None)
|
|
|
|
|
{
|
|
|
|
|
if (checkPick)
|
|
|
|
|
{
|
|
|
|
|
let selectObj = PointPick(pt, this.m_Viewer);
|
|
|
|
|
let selectObj = PointPick(pt, this._Viewer);
|
|
|
|
|
if (selectObj.length > 0)
|
|
|
|
|
{
|
|
|
|
|
let selectData = new SelectPick(this.m_Viewer, pt.clone());
|
|
|
|
|
let selectData = new SelectPick(this._Viewer, pt.clone());
|
|
|
|
|
selectData.m_SelectList.push(selectObj[0]);
|
|
|
|
|
if (isRemove)
|
|
|
|
|
this.m_SelectSet.RemoveSelect(selectData);
|
|
|
|
|
this.RemoveSelect(selectData);
|
|
|
|
|
else
|
|
|
|
|
this.m_SelectSet.AddSelect(selectData);
|
|
|
|
|
this.AddSelect(selectData);
|
|
|
|
|
this.UpdateView();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.m_FirstPickPoint = app.Editor.MouseCtrl.m_CurMousePointWCS.clone();
|
|
|
|
|
this._FirstPickPoint = app.Editor.MouseCtrl.m_CurMousePointWCS.clone();
|
|
|
|
|
|
|
|
|
|
this.m_Editor.InputState = InputState.SelectIng;
|
|
|
|
|
this._Editor.InputState = InputState.SelectIng;
|
|
|
|
|
app.Viewer.PreViewer.Cursor.Mode = CursorMode.GetPoint;
|
|
|
|
|
this.m_SelectCss.SetStart(pt.x, pt.y);
|
|
|
|
|
this.m_SelectCss.SetEnd(pt.x, pt.y);
|
|
|
|
|
this.m_SelectCss.Show();
|
|
|
|
|
this._SelectCss.SetStart(pt.x, pt.y);
|
|
|
|
|
this._SelectCss.SetEnd(pt.x, pt.y);
|
|
|
|
|
this._SelectCss.Show();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@ -162,9 +162,9 @@ export class SelectControls implements EditorService
|
|
|
|
|
if (selectBox.m_SelectList.length > 0)
|
|
|
|
|
{
|
|
|
|
|
if (isRemove)
|
|
|
|
|
this.m_SelectSet.RemoveSelect(selectBox);
|
|
|
|
|
this.RemoveSelect(selectBox);
|
|
|
|
|
else
|
|
|
|
|
this.m_SelectSet.AddSelect(selectBox);
|
|
|
|
|
this.AddSelect(selectBox);
|
|
|
|
|
this.UpdateView();
|
|
|
|
|
}
|
|
|
|
|
this.RestState();
|
|
|
|
@ -175,52 +175,71 @@ export class SelectControls implements EditorService
|
|
|
|
|
|
|
|
|
|
SelectByCss()
|
|
|
|
|
{
|
|
|
|
|
let selectBox = new SelectBox(this.m_Viewer, this.m_SelectCss.start, this.m_SelectCss.end);
|
|
|
|
|
if (this.m_SelectType !== SelectType.None)
|
|
|
|
|
selectBox.m_SelectType = this.m_SelectType;
|
|
|
|
|
let selectBox = new SelectBox(this._Viewer, this._SelectCss.start, this._SelectCss.end);
|
|
|
|
|
if (this._SelectType !== SelectType.None)
|
|
|
|
|
selectBox.m_SelectType = this._SelectType;
|
|
|
|
|
else
|
|
|
|
|
selectBox.m_SelectType = this.m_SelectCss.end.x > this.m_SelectCss.start.x ? SelectType.W : SelectType.C;
|
|
|
|
|
selectBox.Select(undefined, this.m_Filter);
|
|
|
|
|
selectBox.m_SelectType = this._SelectCss.end.x > this._SelectCss.start.x ? SelectType.W : SelectType.C;
|
|
|
|
|
selectBox.Select(undefined, this.Filter);
|
|
|
|
|
return selectBox;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onMouseMove()
|
|
|
|
|
OnMouseMove()
|
|
|
|
|
{
|
|
|
|
|
if (this.m_Editor.InputState === InputState.SelectIng)
|
|
|
|
|
if (this._Editor.InputState === InputState.SelectIng)
|
|
|
|
|
{
|
|
|
|
|
let pt = this.m_Editor.MouseCtrl.m_CurMousePointVCS;
|
|
|
|
|
this.m_SelectCss.SetEnd(pt.x, pt.y)
|
|
|
|
|
let pt = this._Editor.MouseCtrl.m_CurMousePointVCS;
|
|
|
|
|
this._SelectCss.SetEnd(pt.x, pt.y);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onKeyDown(e: KeyboardEvent)
|
|
|
|
|
OnKeyDown(e: KeyboardEvent)
|
|
|
|
|
{
|
|
|
|
|
if (e.keyCode == KeyBoard.Escape)
|
|
|
|
|
{
|
|
|
|
|
this.Cancel();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RestState()
|
|
|
|
|
{
|
|
|
|
|
this.m_FirstPickPoint = undefined;
|
|
|
|
|
this.m_SelectCss.Hide();
|
|
|
|
|
this._FirstPickPoint = undefined;
|
|
|
|
|
this._SelectCss.Hide();
|
|
|
|
|
app.Viewer.PreViewer.Cursor.Mode = CursorMode.None;
|
|
|
|
|
this.m_Editor.InputState &= ~InputState.SelectIng;
|
|
|
|
|
this._Editor.InputState &= ~InputState.SelectIng;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Cancel()
|
|
|
|
|
{
|
|
|
|
|
this.RestState();
|
|
|
|
|
this.m_SelectSet = new SelectSet(true);
|
|
|
|
|
this._SelectSet = new SelectSet(true);
|
|
|
|
|
this.UpdateView();
|
|
|
|
|
|
|
|
|
|
this.CanenEvent();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AddSelect(selectData: SelectSetBase)
|
|
|
|
|
{
|
|
|
|
|
this._SelectSet.AddSelect(selectData);
|
|
|
|
|
this.UpdateSelectEvent();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RemoveSelect(selectData: SelectSetBase)
|
|
|
|
|
{
|
|
|
|
|
this._SelectSet.RemoveSelect(selectData);
|
|
|
|
|
this.UpdateSelectEvent();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UpdateSelectEvent()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
EndSelectEvent()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CanenEvent()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|