1
0
mirror of https://github.com/misskey-dev/misskey.git synced 2026-05-22 15:14:16 +02:00
This commit is contained in:
syuilo
2026-04-03 11:18:23 +09:00
parent 1c610ce825
commit d3da77c307
2 changed files with 21 additions and 21 deletions

View File

@@ -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,
})); }));
} }

View File

@@ -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);
} }