mirror of
https://github.com/misskey-dev/misskey.git
synced 2026-05-22 15:14:16 +02:00
wip
This commit is contained in:
@@ -284,10 +284,10 @@ onMounted(async () => {
|
|||||||
if (v == null) {
|
if (v == null) {
|
||||||
interacions.value = [];
|
interacions.value = [];
|
||||||
} else {
|
} else {
|
||||||
interacions.value = Object.entries(v.objectEntity.interactions).map(([interactionId, interactionInfo]) => ({
|
interacions.value = Object.entries(v.objectEntity.instance.interactions).map(([interactionId, interactionInfo]) => ({
|
||||||
id: interactionId,
|
id: interactionId,
|
||||||
label: interactionInfo.label,
|
label: interactionInfo.label,
|
||||||
isPrimary: v.objectEntity.primaryInteraction === interactionId,
|
isPrimary: v.objectEntity.instance.primaryInteraction === interactionId,
|
||||||
fn: interactionInfo.fn,
|
fn: interactionInfo.fn,
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -363,7 +363,6 @@ export class RoomEngine {
|
|||||||
} | null = null;
|
} | null = null;
|
||||||
public selected = shallowRef<{
|
public selected = shallowRef<{
|
||||||
objectId: string;
|
objectId: string;
|
||||||
objectMesh: BABYLON.Mesh;
|
|
||||||
objectEntity: RoomEngine['objectEntities'] extends Map<string, infer V> ? V : never;
|
objectEntity: RoomEngine['objectEntities'] extends Map<string, infer V> ? V : never;
|
||||||
objectState: RoomStateObject<any>;
|
objectState: RoomStateObject<any>;
|
||||||
objectDef: ObjectDef;
|
objectDef: ObjectDef;
|
||||||
@@ -382,7 +381,7 @@ export class RoomEngine {
|
|||||||
private xGridPreviewPlane: BABYLON.Mesh;
|
private xGridPreviewPlane: BABYLON.Mesh;
|
||||||
private yGridPreviewPlane: BABYLON.Mesh;
|
private yGridPreviewPlane: BABYLON.Mesh;
|
||||||
private zGridPreviewPlane: BABYLON.Mesh;
|
private zGridPreviewPlane: BABYLON.Mesh;
|
||||||
private selectionOutlineLayer: BABYLON.SelectionOutlineLayer;
|
private selectionOutlineLayer: BABYLON.SelectionOutlineLayer | null = null;
|
||||||
public isEditMode = ref(false);
|
public isEditMode = ref(false);
|
||||||
public isSitting = ref(false);
|
public isSitting = ref(false);
|
||||||
public ui = reactive({
|
public ui = reactive({
|
||||||
@@ -608,14 +607,16 @@ export class RoomEngine {
|
|||||||
this.zGridPreviewPlane.isPickable = false;
|
this.zGridPreviewPlane.isPickable = false;
|
||||||
this.zGridPreviewPlane.isVisible = false;
|
this.zGridPreviewPlane.isVisible = false;
|
||||||
|
|
||||||
// 重い。edit modeのときだけ有効にするようにしたい
|
|
||||||
//this.selectionOutlineLayer = new BABYLON.SelectionOutlineLayer('outliner', this.scene);
|
|
||||||
|
|
||||||
watch(this.isEditMode, (v) => {
|
watch(this.isEditMode, (v) => {
|
||||||
if (v) {
|
if (v) {
|
||||||
|
this.selectionOutlineLayer = new BABYLON.SelectionOutlineLayer('outliner', this.scene);
|
||||||
|
|
||||||
for (const entity of this.objectEntities.values()) {
|
for (const entity of this.objectEntities.values()) {
|
||||||
entity.instance.resetTemporaryState?.();
|
entity.instance.resetTemporaryState?.();
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
this.selectionOutlineLayer.dispose();
|
||||||
|
this.selectionOutlineLayer = null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -648,13 +649,13 @@ export class RoomEngine {
|
|||||||
this.selectObject(null);
|
this.selectObject(null);
|
||||||
|
|
||||||
const pickingInfo = this.scene.pick(this.scene.pointerX, this.scene.pointerY,
|
const pickingInfo = this.scene.pick(this.scene.pointerX, this.scene.pointerY,
|
||||||
(m) => m.metadata?.isCollision && m.metadata?.objectId != null && this.objectMeshs.has(m.metadata.objectId));
|
(m) => m.metadata?.isCollision && m.metadata?.objectId != null && this.objectEntities.has(m.metadata.objectId));
|
||||||
|
|
||||||
if (pickingInfo.pickedMesh != null) {
|
if (pickingInfo.pickedMesh != null) {
|
||||||
const oid = pickingInfo.pickedMesh.metadata.objectId;
|
const oid = pickingInfo.pickedMesh.metadata.objectId;
|
||||||
if (oid != null && this.objectMeshs.has(oid)) {
|
if (oid != null && this.objectEntities.has(oid)) {
|
||||||
const o = this.objectMeshs.get(oid)!;
|
const o = this.objectEntities.get(oid)!;
|
||||||
const boundingInfo = getMeshesBoundingBox(o.getChildMeshes());
|
const boundingInfo = getMeshesBoundingBox(o.rootMesh.getChildMeshes());
|
||||||
this.camera.setTarget(boundingInfo.center);
|
this.camera.setTarget(boundingInfo.center);
|
||||||
this.selectObject(oid);
|
this.selectObject(oid);
|
||||||
}
|
}
|
||||||
@@ -694,19 +695,18 @@ export class RoomEngine {
|
|||||||
|
|
||||||
public selectObject(objectId: string | null) {
|
public selectObject(objectId: string | null) {
|
||||||
if (this.selected.value != null) {
|
if (this.selected.value != null) {
|
||||||
this.selectionOutlineLayer.clearSelection();
|
if (this.selectionOutlineLayer != null) this.selectionOutlineLayer.clearSelection();
|
||||||
this.selected.value = null;
|
this.selected.value = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (objectId != null) {
|
if (objectId != null) {
|
||||||
const mesh = this.objectMeshs.get(objectId);
|
const entity = this.objectEntities.get(objectId);
|
||||||
if (mesh != null) {
|
if (entity != null) {
|
||||||
this.selectionOutlineLayer.addSelection(mesh.getChildMeshes());
|
if (this.selectionOutlineLayer != null) this.selectionOutlineLayer.addSelection(entity.rootMesh.getChildMeshes());
|
||||||
const state = this.roomState.installedObjects.find(o => o.id === objectId)!;
|
const state = this.roomState.installedObjects.find(o => o.id === objectId)!;
|
||||||
this.selected.value = {
|
this.selected.value = {
|
||||||
objectId,
|
objectId,
|
||||||
objectMesh: mesh,
|
objectEntity: entity,
|
||||||
objectEntity: this.objectEntities.get(objectId)!,
|
|
||||||
objectState: state,
|
objectState: state,
|
||||||
objectDef: getObjectDef(state.type),
|
objectDef: getObjectDef(state.type),
|
||||||
};
|
};
|
||||||
@@ -1084,14 +1084,14 @@ export class RoomEngine {
|
|||||||
public beginSelectedInstalledObjectGrabbing() {
|
public beginSelectedInstalledObjectGrabbing() {
|
||||||
if (this.selected.value == null) return;
|
if (this.selected.value == null) return;
|
||||||
|
|
||||||
const selectedObject = this.selected.value.objectMesh;
|
const selectedObject = this.selected.value.objectEntity.rootMesh;
|
||||||
this.selectionOutlineLayer.clearSelection();
|
if (this.selectionOutlineLayer != null) this.selectionOutlineLayer.clearSelection();
|
||||||
|
|
||||||
// 子から先に適用していく
|
// 子から先に適用していく
|
||||||
const setStickyParentRecursively = (mesh: BABYLON.AbstractMesh) => {
|
const setStickyParentRecursively = (mesh: BABYLON.AbstractMesh) => {
|
||||||
const stickyObjectIds = Array.from(this.roomState.installedObjects.filter(o => o.sticky === mesh.metadata.objectId)).map(o => o.id);
|
const stickyObjectIds = Array.from(this.roomState.installedObjects.filter(o => o.sticky === mesh.metadata.objectId)).map(o => o.id);
|
||||||
for (const soid of stickyObjectIds) {
|
for (const soid of stickyObjectIds) {
|
||||||
const soMesh = this.objectMeshs.get(soid)!;
|
const soMesh = this.objectEntities.get(soid)!.rootMesh;
|
||||||
setStickyParentRecursively(soMesh);
|
setStickyParentRecursively(soMesh);
|
||||||
soMesh.setParent(mesh);
|
soMesh.setParent(mesh);
|
||||||
}
|
}
|
||||||
@@ -1153,7 +1153,7 @@ export class RoomEngine {
|
|||||||
const removeStickyParentRecursively = (mesh: BABYLON.Mesh) => {
|
const removeStickyParentRecursively = (mesh: BABYLON.Mesh) => {
|
||||||
const stickyObjectIds = Array.from(this.roomState.installedObjects.filter(o => o.sticky === mesh.metadata.objectId)).map(o => o.id);
|
const stickyObjectIds = Array.from(this.roomState.installedObjects.filter(o => o.sticky === mesh.metadata.objectId)).map(o => o.id);
|
||||||
for (const soid of stickyObjectIds) {
|
for (const soid of stickyObjectIds) {
|
||||||
const soMesh = this.objectMeshs.get(soid)!;
|
const soMesh = this.objectEntities.get(soid)!.rootMesh;
|
||||||
soMesh.setParent(null);
|
soMesh.setParent(null);
|
||||||
removeStickyParentRecursively(soMesh);
|
removeStickyParentRecursively(soMesh);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user