mirror of
https://github.com/misskey-dev/misskey.git
synced 2026-06-05 12:54:09 +02:00
wip
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -103,6 +103,8 @@ type ObjectDef<OpSc extends OptionsSchema = OptionsSchema> = {
|
|||||||
default: GetOptionsSchemaValues<OpSc>;
|
default: GetOptionsSchemaValues<OpSc>;
|
||||||
};
|
};
|
||||||
placement: 'top' | 'side' | 'bottom' | 'wall' | 'ceiling' | 'floor';
|
placement: 'top' | 'side' | 'bottom' | 'wall' | 'ceiling' | 'floor';
|
||||||
|
//groupingMeshes: string[]; // multi-materialなメッシュは複数のメッシュに分割されるが、それだと不便な場合に追加の親メッシュでグルーピングするための指定
|
||||||
|
mergeMeshes?: string[] | null; // multi-materialなメッシュは複数のメッシュに分割されるが、それだと不便な場合にメッシュをマージするための指定
|
||||||
isChair?: boolean;
|
isChair?: boolean;
|
||||||
createInstance: (args: {
|
createInstance: (args: {
|
||||||
room: RoomEngine;
|
room: RoomEngine;
|
||||||
@@ -793,6 +795,20 @@ export class RoomEngine {
|
|||||||
|
|
||||||
const loaderResult = await BABYLON.ImportMeshAsync(`/client-assets/room/objects/${camelToKebab(args.type)}/${camelToKebab(args.type)}.glb`, this.scene);
|
const loaderResult = await BABYLON.ImportMeshAsync(`/client-assets/room/objects/${camelToKebab(args.type)}/${camelToKebab(args.type)}.glb`, this.scene);
|
||||||
|
|
||||||
|
// babylonによって自動で追加される右手系変換用ノード
|
||||||
|
const subRoot = loaderResult.meshes[0];
|
||||||
|
subRoot.scaling = subRoot.scaling.scale(WORLD_SCALE);// cmをmに
|
||||||
|
|
||||||
|
if (def.mergeMeshes != null) {
|
||||||
|
for (const groupingMeshKeyword of def.mergeMeshes) {
|
||||||
|
const meshes = loaderResult.meshes.filter(m => m.name.includes(groupingMeshKeyword));
|
||||||
|
const merged = BABYLON.Mesh.MergeMeshes(meshes as BABYLON.Mesh[], true, true, undefined, false, true);
|
||||||
|
merged.name = `${groupingMeshKeyword}.grouped`;
|
||||||
|
merged.setParent(subRoot);
|
||||||
|
loaderResult.meshes.push(merged);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let hasCollisionMesh = false;
|
let hasCollisionMesh = false;
|
||||||
for (const mesh of loaderResult.meshes) {
|
for (const mesh of loaderResult.meshes) {
|
||||||
if (mesh.name.includes('__COLLISION__')) {
|
if (mesh.name.includes('__COLLISION__')) {
|
||||||
@@ -808,10 +824,6 @@ export class RoomEngine {
|
|||||||
isCollision: !hasCollisionMesh,
|
isCollision: !hasCollisionMesh,
|
||||||
};
|
};
|
||||||
|
|
||||||
// babylonによって自動で追加される右手系変換用ノード
|
|
||||||
const subRoot = loaderResult.meshes[0];
|
|
||||||
subRoot.scaling = subRoot.scaling.scale(WORLD_SCALE);// cmをmに
|
|
||||||
|
|
||||||
root.addChild(subRoot);
|
root.addChild(subRoot);
|
||||||
|
|
||||||
root.position = args.position.clone();
|
root.position = args.position.clone();
|
||||||
@@ -1071,20 +1083,35 @@ export class RoomEngine {
|
|||||||
|
|
||||||
const materials = new WeakMap<BABYLON.Material, BABYLON.Material>();
|
const materials = new WeakMap<BABYLON.Material, BABYLON.Material>();
|
||||||
|
|
||||||
for (const m of ghost.getChildMeshes()) {
|
for (const m of ghost.getChildMeshes() as BABYLON.Mesh[]) {
|
||||||
m.metadata = { isGhost: true };
|
m.metadata = { isGhost: true };
|
||||||
m.checkCollisions = false;
|
m.checkCollisions = false;
|
||||||
|
|
||||||
if (m.material) {
|
if (m.material == null) continue;
|
||||||
if (materials.has(m.material)) {
|
|
||||||
m.material = materials.get(m.material)!;
|
if (materials.has(m.material)) {
|
||||||
} else {
|
m.material = materials.get(m.material)!;
|
||||||
const mat = m.material.clone(`${m.material.name}_ghost`);
|
continue;
|
||||||
mat.alpha = 0.3;
|
}
|
||||||
mat.transparencyMode = BABYLON.Material.MATERIAL_ALPHABLEND;
|
|
||||||
materials.set(m.material, mat);
|
if (m.subMeshes != null && m.subMeshes.length > 0 && m.material.subMaterials != null) {
|
||||||
m.material = mat;
|
const multiGhostMaterial = m.material.clone(`${m.material.name}_ghost`) as BABYLON.MultiMaterial;
|
||||||
|
|
||||||
|
for (let i = 0; i < multiGhostMaterial.subMaterials.length; i++) {
|
||||||
|
const subMaterial = multiGhostMaterial.subMaterials[i];
|
||||||
|
const ghostMaterial = subMaterial.clone(`${subMaterial.name}_ghost`);
|
||||||
|
ghostMaterial.alpha = 0.3;
|
||||||
|
ghostMaterial.transparencyMode = BABYLON.Material.MATERIAL_ALPHABLEND;
|
||||||
|
multiGhostMaterial.subMaterials[i] = ghostMaterial;
|
||||||
|
materials.set(m.material, multiGhostMaterial);
|
||||||
|
m.material = multiGhostMaterial;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
const ghostMaterial = m.material.clone(`${m.material.name}_ghost`);
|
||||||
|
ghostMaterial.alpha = 0.3;
|
||||||
|
ghostMaterial.transparencyMode = BABYLON.Material.MATERIAL_ALPHABLEND;
|
||||||
|
materials.set(m.material, ghostMaterial);
|
||||||
|
m.material = ghostMaterial;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,28 @@ export const books = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
createInstance: () => {
|
mergeMeshes: ['__X_BOOK_1__', '__X_BOOK_2__', '__X_BOOK_3__', '__X_BOOK_4__', '__X_BOOK_5__', '__X_BOOK_6__', '__X_BOOK_7__', '__X_BOOK_8__', '__X_BOOK_9__', '__X_BOOK_10__'],
|
||||||
|
createInstance: ({ findMesh, root }) => {
|
||||||
|
console.log(root.getChildMeshes().map((m) => m.name));
|
||||||
|
|
||||||
|
const bookMeshes = [
|
||||||
|
findMesh('__X_BOOK_1__'),
|
||||||
|
findMesh('__X_BOOK_2__'),
|
||||||
|
findMesh('__X_BOOK_3__'),
|
||||||
|
findMesh('__X_BOOK_4__'),
|
||||||
|
findMesh('__X_BOOK_5__'),
|
||||||
|
findMesh('__X_BOOK_6__'),
|
||||||
|
findMesh('__X_BOOK_7__'),
|
||||||
|
findMesh('__X_BOOK_8__'),
|
||||||
|
findMesh('__X_BOOK_9__'),
|
||||||
|
findMesh('__X_BOOK_10__'),
|
||||||
|
];
|
||||||
|
|
||||||
|
for (const mesh of bookMeshes) {
|
||||||
|
mesh.position.z -= Math.random() * 0.005/*cm*/;
|
||||||
|
mesh.position.y += Math.random() * 0.0025/*cm*/;
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user