mirror of
https://github.com/misskey-dev/misskey.git
synced 2026-05-23 11:04:10 +02:00
collision
This commit is contained in:
@@ -17,8 +17,9 @@
|
|||||||
* - メッシュ名を __TOP__ で始めると、その面の上にモノを置けることを示す。当該メッシュはレンダリングでは表示されません。
|
* - メッシュ名を __TOP__ で始めると、その面の上にモノを置けることを示す。当該メッシュはレンダリングでは表示されません。
|
||||||
* - メッシュ名を __SIDE__ で始めると、その面にモノを貼り付けられることを示す。当該メッシュはレンダリングでは表示されません。
|
* - メッシュ名を __SIDE__ で始めると、その面にモノを貼り付けられることを示す。当該メッシュはレンダリングでは表示されません。
|
||||||
* - なお、現状 __TOP__ / __SIDE__ メッシュは単一の面でなければなりません。つまりArray Modifierなどを適用した状態では正しく動作しません。
|
* - なお、現状 __TOP__ / __SIDE__ メッシュは単一の面でなければなりません。つまりArray Modifierなどを適用した状態では正しく動作しません。
|
||||||
* - メッシュ名を __COLLISION__ で始めると、コリジョン用メッシュとして扱われます。このメッシュはシーク時のレイのヒットチェックにも使われます。当該メッシュはレンダリングでは表示されません。
|
* - メッシュ名を __COLLISION__ で始めると、コリジョン用メッシュとして扱われます。当該メッシュはレンダリングでは表示されません。
|
||||||
* - コリジョン用メッシュが無い場合、すべてのメッシュがコリジョン用メッシュとして扱われますが、例えば網目のようなメッシュではレイが隙間を通り抜けて後ろにあるオブジェクトにヒットしてしまうなどの問題が発生します。
|
* - メッシュ名を __PICK__ で始めると、レイのヒットチェック用メッシュとして扱われます。当該メッシュはレンダリングでは表示されません。
|
||||||
|
* - __PICK__が無い場合、すべてのメッシュをヒットチェックメッシュとして扱いますが、例えば網目のようなメッシュではレイが隙間を通り抜けて後ろにあるオブジェクトにヒットしてしまうなどの問題が発生します。
|
||||||
* - シェイプキーを使用する場合、normalのエクスポートが有効だと面のレンダリングがおかしくなる場合があります。その場合は無効化してください。
|
* - シェイプキーを使用する場合、normalのエクスポートが有効だと面のレンダリングがおかしくなる場合があります。その場合は無効化してください。
|
||||||
* - 後からモデルを調整したくなった時に備え、モディファイアを駆使するなどして、なるべく非破壊的なモデリングを心がけることを推奨します。
|
* - 後からモデルを調整したくなった時に備え、モディファイアを駆使するなどして、なるべく非破壊的なモデリングを心がけることを推奨します。
|
||||||
* - パーツ的に分かれていることが自然なメッシュについても、できるだけマージせす、別々のメッシュのままにしてください。
|
* - パーツ的に分かれていることが自然なメッシュについても、できるだけマージせす、別々のメッシュのままにしてください。
|
||||||
@@ -39,6 +40,8 @@ const SNAPSHOT_RENDERING = false; // 実験的
|
|||||||
const SNAPSHOT_RENDERING_NON_SUPPORTED_OBJECTS = ['tv', 'aquarium', 'lavaLamp'];
|
const SNAPSHOT_RENDERING_NON_SUPPORTED_OBJECTS = ['tv', 'aquarium', 'lavaLamp'];
|
||||||
const IGNORE_OBJECTS: string[] = []; // for debug
|
const IGNORE_OBJECTS: string[] = []; // for debug
|
||||||
|
|
||||||
|
const SYSTEM_MESH_NAMES = ['__TOP__', '__SIDE__', '__PICK__', '__COLLISION__', '__COLLISION_AUTO_GENERATED_INTERNALY__'];
|
||||||
|
|
||||||
import * as BABYLON from '@babylonjs/core';
|
import * as BABYLON from '@babylonjs/core';
|
||||||
import { AxesViewer } from '@babylonjs/core/Debug/axesViewer';
|
import { AxesViewer } from '@babylonjs/core/Debug/axesViewer';
|
||||||
import { registerBuiltInLoaders } from '@babylonjs/loaders/dynamic';
|
import { registerBuiltInLoaders } from '@babylonjs/loaders/dynamic';
|
||||||
@@ -209,7 +212,7 @@ class ModelManager {
|
|||||||
}
|
}
|
||||||
this.bakedMeshes = [];
|
this.bakedMeshes = [];
|
||||||
|
|
||||||
const excludeMeshes = [...this.bakeExcludeMeshes, ...this.root.getChildMeshes().filter(m => m.name.includes('__TOP__') || m.name.includes('__SIDE__') || m.name.includes('__COLLISION__'))];
|
const excludeMeshes = [...this.bakeExcludeMeshes, ...this.root.getChildMeshes().filter(m => SYSTEM_MESH_NAMES.some(s => m.name.includes(s)))];
|
||||||
|
|
||||||
const childMeshes = this.root.getChildMeshes().filter(m => !excludeMeshes.some(x => x === m) && m.isVisible);
|
const childMeshes = this.root.getChildMeshes().filter(m => !excludeMeshes.some(x => x === m) && m.isVisible);
|
||||||
|
|
||||||
@@ -308,6 +311,7 @@ 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';
|
||||||
|
noCollisions?: boolean;
|
||||||
//groupingMeshes: string[]; // multi-materialなメッシュは複数のメッシュに分割されるが、それだと不便な場合に追加の親メッシュでグルーピングするための指定
|
//groupingMeshes: string[]; // multi-materialなメッシュは複数のメッシュに分割されるが、それだと不便な場合に追加の親メッシュでグルーピングするための指定
|
||||||
isChair?: boolean;
|
isChair?: boolean;
|
||||||
treatLoaderResult?: (loaderResult: BABYLON.AssetContainer) => void;
|
treatLoaderResult?: (loaderResult: BABYLON.AssetContainer) => void;
|
||||||
@@ -386,24 +390,33 @@ function enableObjectCollision(meshes: BABYLON.Mesh[]) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hasCollisionMesh) {
|
if (hasCollisionMesh) {
|
||||||
for (const mesh of meshes) {
|
|
||||||
mesh.checkCollisions = true;
|
|
||||||
mesh.metadata ??= {};
|
|
||||||
mesh.metadata.isCollision = true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (const mesh of meshes) {
|
for (const mesh of meshes) {
|
||||||
if (mesh.name.includes('__COLLISION__')) {
|
if (mesh.name.includes('__COLLISION__')) {
|
||||||
mesh.checkCollisions = true;
|
mesh.checkCollisions = true;
|
||||||
mesh.metadata ??= {};
|
|
||||||
mesh.metadata.isCollision = true;
|
|
||||||
} else {
|
} else {
|
||||||
mesh.checkCollisions = false;
|
mesh.checkCollisions = false;
|
||||||
mesh.metadata ??= {};
|
|
||||||
mesh.metadata.isCollision = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// なんかうまくいかない
|
||||||
|
//const boundingInfo = getMeshesBoundingBox(meshes.filter(m => m.isEnabled() && m.isVisible));
|
||||||
|
//const collider = meshes.find(m => m.name.includes('__COLLISION_AUTO_GENERATED_INTERNALY__'))!;
|
||||||
|
//if (collider == null) return;
|
||||||
|
////collider.position.y = ((boundingInfo.maximum.y + boundingInfo.minimum.y) / 2) / WORLD_SCALE;
|
||||||
|
//collider.scaling = new BABYLON.Vector3(
|
||||||
|
// (boundingInfo.maximum.x - boundingInfo.minimum.x) || 1,
|
||||||
|
// (boundingInfo.maximum.y - boundingInfo.minimum.y) || 1,
|
||||||
|
// (boundingInfo.maximum.z - boundingInfo.minimum.z) || 1,
|
||||||
|
//);
|
||||||
|
//collider.checkCollisions = true;
|
||||||
|
//collider.isVisible = true;
|
||||||
|
|
||||||
|
for (const mesh of meshes) {
|
||||||
|
mesh.checkCollisions = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -709,8 +722,9 @@ export class RoomEngine {
|
|||||||
|
|
||||||
this.selectObject(null);
|
this.selectObject(null);
|
||||||
|
|
||||||
|
// TODO: __PICK__考慮
|
||||||
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.objectEntities.has(m.metadata.objectId));
|
(m) => 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;
|
||||||
@@ -1063,6 +1077,7 @@ export class RoomEngine {
|
|||||||
options: any;
|
options: any;
|
||||||
}) {
|
}) {
|
||||||
const def = getObjectDef(args.type);
|
const def = getObjectDef(args.type);
|
||||||
|
const collisionsDisabled = def.placement === 'ceiling' || def.noCollisions;
|
||||||
|
|
||||||
const root = new BABYLON.TransformNode(`object_${args.id}_${args.type}`, this.scene);
|
const root = new BABYLON.TransformNode(`object_${args.id}_${args.type}`, this.scene);
|
||||||
|
|
||||||
@@ -1213,6 +1228,10 @@ export class RoomEngine {
|
|||||||
root.addChild(subRoot);
|
root.addChild(subRoot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//const internalCollider = BABYLON.MeshBuilder.CreateBox(`__COLLISION_AUTO_GENERATED_INTERNALY__${root.name}`, { width: 0, height: 0, depth: 0 }, this.scene);
|
||||||
|
//internalCollider.isVisible = false;
|
||||||
|
//internalCollider.parent = root;
|
||||||
|
|
||||||
root.position = args.position.clone();
|
root.position = args.position.clone();
|
||||||
root.rotation = args.rotation.clone();
|
root.rotation = args.rotation.clone();
|
||||||
root.metadata = metadata;
|
root.metadata = metadata;
|
||||||
@@ -1228,7 +1247,7 @@ export class RoomEngine {
|
|||||||
|
|
||||||
mesh.metadata = metadata;
|
mesh.metadata = metadata;
|
||||||
|
|
||||||
if (mesh.name.includes('__COLLISION__') || mesh.name.includes('__TOP__') || mesh.name.includes('__SIDE__')) {
|
if (SYSTEM_MESH_NAMES.some(n => mesh.name.includes(n))) {
|
||||||
mesh.receiveShadows = false;
|
mesh.receiveShadows = false;
|
||||||
mesh.isVisible = false;
|
mesh.isVisible = false;
|
||||||
} else {
|
} else {
|
||||||
@@ -1269,7 +1288,9 @@ export class RoomEngine {
|
|||||||
if (!this.scene.meshes.includes(mesh)) this.scene.addMesh(mesh);
|
if (!this.scene.meshes.includes(mesh)) this.scene.addMesh(mesh);
|
||||||
}
|
}
|
||||||
|
|
||||||
enableObjectCollision(meshes);
|
if (!collisionsDisabled) {
|
||||||
|
enableObjectCollision(meshes);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const objectInstance = await def.createInstance({
|
const objectInstance = await def.createInstance({
|
||||||
@@ -1307,7 +1328,9 @@ export class RoomEngine {
|
|||||||
|
|
||||||
model.bakeMesh();
|
model.bakeMesh();
|
||||||
|
|
||||||
enableObjectCollision(root.getChildMeshes());
|
if (!collisionsDisabled) {
|
||||||
|
enableObjectCollision(root.getChildMeshes());
|
||||||
|
}
|
||||||
|
|
||||||
this.objectEntities.set(args.id, { instance: objectInstance, rootMesh: root, model });
|
this.objectEntities.set(args.id, { instance: objectInstance, rootMesh: root, model });
|
||||||
|
|
||||||
@@ -1575,6 +1598,7 @@ export class RoomEngine {
|
|||||||
const id = genId();
|
const id = genId();
|
||||||
|
|
||||||
const def = getObjectDef(type);
|
const def = getObjectDef(type);
|
||||||
|
const collisionsDisabled = def.placement === 'ceiling' || def.noCollisions;
|
||||||
|
|
||||||
const options = deepClone(def.options.default);
|
const options = deepClone(def.options.default);
|
||||||
|
|
||||||
@@ -1617,7 +1641,9 @@ export class RoomEngine {
|
|||||||
// todo
|
// todo
|
||||||
},
|
},
|
||||||
onDone: () => { // todo: sticky状態などを引数でもらうようにしたい
|
onDone: () => { // todo: sticky状態などを引数でもらうようにしたい
|
||||||
enableObjectCollision(root.getChildMeshes());
|
if (!collisionsDisabled) {
|
||||||
|
enableObjectCollision(root.getChildMeshes());
|
||||||
|
}
|
||||||
|
|
||||||
this.ui.isGrabbingForInstall = false;
|
this.ui.isGrabbingForInstall = false;
|
||||||
|
|
||||||
@@ -1956,7 +1982,7 @@ export class RoomObjectPreviewEngine {
|
|||||||
// シェイプキー(morph)を考慮してbounding boxを更新するために必要
|
// シェイプキー(morph)を考慮してbounding boxを更新するために必要
|
||||||
mesh.refreshBoundingInfo({ applyMorph: true });
|
mesh.refreshBoundingInfo({ applyMorph: true });
|
||||||
|
|
||||||
if (mesh.name.includes('__COLLISION__') || mesh.name.includes('__TOP__') || mesh.name.includes('__SIDE__')) {
|
if (SYSTEM_MESH_NAMES.some(n => mesh.name.includes(n))) {
|
||||||
mesh.receiveShadows = false;
|
mesh.receiveShadows = false;
|
||||||
mesh.isVisible = false;
|
mesh.isVisible = false;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ export const a4Case = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ options, model }) => {
|
createInstance: ({ options, model }) => {
|
||||||
const bodyMesh = model.findMesh('__X_BODY__');
|
const bodyMesh = model.findMesh('__X_BODY__');
|
||||||
const bodyMaterial = bodyMesh.material as BABYLON.PBRMaterial;
|
const bodyMaterial = bodyMesh.material as BABYLON.PBRMaterial;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const aircon = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'wall',
|
placement: 'wall',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ export const aquarium = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ scene, root }) => {
|
createInstance: ({ scene, root }) => {
|
||||||
return {
|
return {
|
||||||
onInited: () => {
|
onInited: () => {
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ export const aromaReedDiffuser = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ options, model }) => {
|
createInstance: ({ options, model }) => {
|
||||||
const bottleMesh = model.findMesh('__X_BOTTLE__');
|
const bottleMesh = model.findMesh('__X_BOTTLE__');
|
||||||
const bottleMaterial = bottleMesh.material as BABYLON.PBRMaterial;
|
const bottleMaterial = bottleMesh.material as BABYLON.PBRMaterial;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const banknote = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ export const beamLamp = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ room, root, scene }) => {
|
createInstance: ({ room, root, scene }) => {
|
||||||
return {
|
return {
|
||||||
onInited: () => {
|
onInited: () => {
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ export const blind = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'bottom',
|
placement: 'bottom',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ options, model }) => {
|
createInstance: ({ options, model }) => {
|
||||||
const temp = createOverridedStates({
|
const temp = createOverridedStates({
|
||||||
angle: () => options.angle,
|
angle: () => options.angle,
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ export const book = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ options, model }) => {
|
createInstance: ({ options, model }) => {
|
||||||
const bodyMesh = model.findMesh('__X_BODY__');
|
const bodyMesh = model.findMesh('__X_BODY__');
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ export const books = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ scene, options, model }) => {
|
createInstance: ({ scene, options, model }) => {
|
||||||
const coverMaterial = model.findMaterial('__X_COVER__');
|
const coverMaterial = model.findMaterial('__X_COVER__');
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ export const cactusS = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ options, model }) => {
|
createInstance: ({ options, model }) => {
|
||||||
const potMesh = model.findMesh('__X_POT__');
|
const potMesh = model.findMesh('__X_POT__');
|
||||||
const potMaterial = potMesh.material as BABYLON.PBRMaterial;
|
const potMaterial = potMesh.material as BABYLON.PBRMaterial;
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ export const ceilingFanLight = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'ceiling',
|
placement: 'ceiling',
|
||||||
|
noCollisions: true,
|
||||||
receiveShadows: false,
|
receiveShadows: false,
|
||||||
castShadows: false,
|
castShadows: false,
|
||||||
createInstance: ({ scene, model }) => {
|
createInstance: ({ scene, model }) => {
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const coffeeCup = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ export const cupNoodle = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ scene, root }) => {
|
createInstance: ({ scene, root }) => {
|
||||||
let yugeDispose: (() => void) | null = null;
|
let yugeDispose: (() => void) | null = null;
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const custardPudding = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const djMixer = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ export const djPlayer = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: async ({ model, options, scene }) => {
|
createInstance: async ({ model, options, scene }) => {
|
||||||
const screenMesh = model.findMesh('__X_SCREEN__');
|
const screenMesh = model.findMesh('__X_SCREEN__');
|
||||||
const screenMaterial = model.findMaterial('__X_SCREEN__');
|
const screenMaterial = model.findMaterial('__X_SCREEN__');
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const ductTape = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const emptyBento = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const energyDrink = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const envelope = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const facialTissue = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const hangingTShirt = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'side',
|
placement: 'side',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const icosahedron = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const keyboard = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ export const laptopPc = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: async ({ room, scene, options, model }) => {
|
createInstance: async ({ room, scene, options, model }) => {
|
||||||
const matrix = model.root.getWorldMatrix(true);
|
const matrix = model.root.getWorldMatrix(true);
|
||||||
const scale = new BABYLON.Vector3();
|
const scale = new BABYLON.Vector3();
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const lavaLamp = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ room, scene, root }) => {
|
createInstance: ({ room, scene, root }) => {
|
||||||
return {
|
return {
|
||||||
onInited: () => {
|
onInited: () => {
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const miPlate = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const miPlateDisplayed = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const milk = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const mixer = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ export const monitorSpeaker = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ options, model }) => {
|
createInstance: ({ options, model }) => {
|
||||||
const bodyMesh = model.findMesh('__X_BODY__');
|
const bodyMesh = model.findMesh('__X_BODY__');
|
||||||
const bodyMaterial = bodyMesh.material as BABYLON.PBRMaterial;
|
const bodyMaterial = bodyMesh.material as BABYLON.PBRMaterial;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const monstera = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ export const mug = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ scene, root }) => {
|
createInstance: ({ scene, root }) => {
|
||||||
let yugeDispose: (() => void) | null = null;
|
let yugeDispose: (() => void) | null = null;
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ export const newtonsCradle = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ options, model }) => {
|
createInstance: ({ options, model }) => {
|
||||||
const frameMaterial = model.findMaterial('__X_FRAME__');
|
const frameMaterial = model.findMaterial('__X_FRAME__');
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ export const petBottle = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ model, options }) => {
|
createInstance: ({ model, options }) => {
|
||||||
const capMesh = model.findMesh('__X_CAP__');
|
const capMesh = model.findMesh('__X_CAP__');
|
||||||
const liquidMesh = model.findMesh('__X_LIQUID__');
|
const liquidMesh = model.findMesh('__X_LIQUID__');
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ export const pictureFrame = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'side',
|
placement: 'side',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: async ({ scene, options, model }) => {
|
createInstance: async ({ scene, options, model }) => {
|
||||||
const frameMesh = model.findMesh('__X_FRAME__');
|
const frameMesh = model.findMesh('__X_FRAME__');
|
||||||
frameMesh.rotationQuaternion = null;
|
frameMesh.rotationQuaternion = null;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const pizza = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const plant = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ export const poster = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'side',
|
placement: 'side',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: async ({ scene, options, model }) => {
|
createInstance: async ({ scene, options, model }) => {
|
||||||
const pictureMesh = model.findMesh('__X_PICTURE__');
|
const pictureMesh = model.findMesh('__X_PICTURE__');
|
||||||
pictureMesh.rotationQuaternion = null;
|
pictureMesh.rotationQuaternion = null;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const powerStrip = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ export const radiometer = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ scene, model }) => {
|
createInstance: ({ scene, model }) => {
|
||||||
const vanes = model.findTransformNode('__X_VANES__');
|
const vanes = model.findTransformNode('__X_VANES__');
|
||||||
model.bakeExcludeMeshes = [...vanes.getChildMeshes()];
|
model.bakeExcludeMeshes = [...vanes.getChildMeshes()];
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ export const randomBooks = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ options, model, scene, id }) => {
|
createInstance: ({ options, model, scene, id }) => {
|
||||||
const bodyMesh = model.findMesh('__X_BODY__');
|
const bodyMesh = model.findMesh('__X_BODY__');
|
||||||
const tex = new BABYLON.Texture('/client-assets/room/objects/random-books/texture.png', scene, {
|
const tex = new BABYLON.Texture('/client-assets/room/objects/random-books/texture.png', scene, {
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const rolledUpPoster = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const roundRug = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'floor',
|
placement: 'floor',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const router = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const siphon = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const snakeplant = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ export const speaker = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ options, model }) => {
|
createInstance: ({ options, model }) => {
|
||||||
const outerMesh = model.findMesh('__X_COVER__');
|
const outerMesh = model.findMesh('__X_COVER__');
|
||||||
const outerMaterial = outerMesh.material as BABYLON.PBRMaterial;
|
const outerMaterial = outerMesh.material as BABYLON.PBRMaterial;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const sprayer = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const tabletopCalendar = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ export const tabletopDigitalClock = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ root, room, options, model, scene }) => {
|
createInstance: ({ root, room, options, model, scene }) => {
|
||||||
const light = new BABYLON.SpotLight('', new BABYLON.Vector3(0, 3/*cm*/, 1/*cm*/), new BABYLON.Vector3(0, 0, 1), Math.PI / 1, 2, scene, room?.lightContainer != null);
|
const light = new BABYLON.SpotLight('', new BABYLON.Vector3(0, 3/*cm*/, 1/*cm*/), new BABYLON.Vector3(0, 0, 1), Math.PI / 1, 2, scene, room?.lightContainer != null);
|
||||||
light.parent = root;
|
light.parent = root;
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ export const tabletopFlag = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: async ({ model, options, scene }) => {
|
createInstance: async ({ model, options, scene }) => {
|
||||||
const flagMesh = model.findMesh('__X_FLAG__');
|
const flagMesh = model.findMesh('__X_FLAG__');
|
||||||
const flagMaterial = model.findMaterial('__X_FLAG__');
|
const flagMaterial = model.findMaterial('__X_FLAG__');
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ export const tabletopGlassPictureFrame = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: async ({ scene, options, model }) => {
|
createInstance: async ({ scene, options, model }) => {
|
||||||
const pictureMesh = model.findMesh('__X_PICTURE__');
|
const pictureMesh = model.findMesh('__X_PICTURE__');
|
||||||
const frameMesh = model.findMesh('__X_FRAME__');
|
const frameMesh = model.findMesh('__X_FRAME__');
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ export const tabletopIronFrameStand = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ options, model }) => {
|
createInstance: ({ options, model }) => {
|
||||||
const frameMaterial = model.findMaterial('__X_FRAME__');
|
const frameMaterial = model.findMaterial('__X_FRAME__');
|
||||||
const boardMaterial = model.findMaterial('__X_BOARD__');
|
const boardMaterial = model.findMaterial('__X_BOARD__');
|
||||||
|
|||||||
@@ -83,6 +83,7 @@ export const tabletopPictureFrame = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: async ({ scene, options, model }) => {
|
createInstance: async ({ scene, options, model }) => {
|
||||||
const frameMesh = model.findMesh('__X_FRAME__');
|
const frameMesh = model.findMesh('__X_FRAME__');
|
||||||
frameMesh.rotationQuaternion = null;
|
frameMesh.rotationQuaternion = null;
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ export const tapestry = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'side',
|
placement: 'side',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: async ({ scene, options, model }) => {
|
createInstance: async ({ scene, options, model }) => {
|
||||||
const pictureMesh = model.findMesh('__X_PICTURE__');
|
const pictureMesh = model.findMesh('__X_PICTURE__');
|
||||||
pictureMesh.rotationQuaternion = null;
|
pictureMesh.rotationQuaternion = null;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const tetrapod = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const twistedCubeObjet = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const usedTissue = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'top',
|
placement: 'top',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ export const wallCanvas = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'side',
|
placement: 'side',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: async ({ scene, options, model }) => {
|
createInstance: async ({ scene, options, model }) => {
|
||||||
const canvasMesh = model.findMesh('__X_CANVAS__');
|
const canvasMesh = model.findMesh('__X_CANVAS__');
|
||||||
canvasMesh.rotationQuaternion = null;
|
canvasMesh.rotationQuaternion = null;
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ export const wallClock = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'side',
|
placement: 'side',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ room, root, options, model }) => {
|
createInstance: ({ room, root, options, model }) => {
|
||||||
const hourHand = model.findMesh('HandH');
|
const hourHand = model.findMesh('HandH');
|
||||||
const minuteHand = model.findMesh('HandM');
|
const minuteHand = model.findMesh('HandM');
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ export const wallGlassPictureFrame = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'wall',
|
placement: 'wall',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: async ({ scene, options, model }) => {
|
createInstance: async ({ scene, options, model }) => {
|
||||||
const pictureMesh = model.findMesh('__X_PICTURE__');
|
const pictureMesh = model.findMesh('__X_PICTURE__');
|
||||||
const frameMesh = model.findMesh('__X_FRAME__');
|
const frameMesh = model.findMesh('__X_FRAME__');
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ export const wallMirror = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'side',
|
placement: 'side',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: async ({ options, model }) => {
|
createInstance: async ({ options, model }) => {
|
||||||
const frameMaterial = model.findMaterial('__X_FRAME__');
|
const frameMaterial = model.findMaterial('__X_FRAME__');
|
||||||
const frameMesh = model.findMesh('__X_FRAME__');
|
const frameMesh = model.findMesh('__X_FRAME__');
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ export const woodRingsPendantLight = defineObject({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
placement: 'ceiling',
|
placement: 'ceiling',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: ({ room, scene, options, model }) => {
|
createInstance: ({ room, scene, options, model }) => {
|
||||||
const shadeMaterial = model.findMaterial('__X_SHADE__');
|
const shadeMaterial = model.findMaterial('__X_SHADE__');
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ export const woodSoundAbsorbingPanel = defineObject({
|
|||||||
default: {},
|
default: {},
|
||||||
},
|
},
|
||||||
placement: 'side',
|
placement: 'side',
|
||||||
|
noCollisions: true,
|
||||||
createInstance: () => {
|
createInstance: () => {
|
||||||
return {
|
return {
|
||||||
interactions: {},
|
interactions: {},
|
||||||
|
|||||||
Reference in New Issue
Block a user