1
0
mirror of https://github.com/misskey-dev/misskey.git synced 2026-05-16 03:55:26 +02:00
This commit is contained in:
syuilo
2026-04-15 18:57:37 +09:00
parent 12e1b86b53
commit a3c3f7ba91
44 changed files with 72 additions and 13 deletions

View File

@@ -198,10 +198,12 @@ class ModelManager {
public bakeExcludeMeshes: BABYLON.Mesh[] = [];
private originalMeshes: BABYLON.Mesh[] = [];
private bakedMeshes: BABYLON.Mesh[] = [];
private hasTexture: boolean;
constructor(root: BABYLON.Mesh, originalMeshes: BABYLON.Mesh[], bakedCallback: (() => void) | null = null) {
constructor(root: BABYLON.Mesh, originalMeshes: BABYLON.Mesh[], hasTexture: boolean, bakedCallback: (() => void) | null = null) {
this.root = root;
this.originalMeshes = originalMeshes;
this.hasTexture = hasTexture;
this.bakedCallback = bakedCallback;
}
@@ -283,16 +285,17 @@ class ModelManager {
}
//newMesh.bakeCurrentTransformIntoVertices();
// TODO: 必要な時だけやる
if (newMesh.getVerticesData(BABYLON.VertexBuffer.UVKind) == null) {
const vertexCount = newMesh.getTotalVertices();
const uvs = new Array(vertexCount * 2).fill(0);
newMesh.setVerticesData(BABYLON.VertexBuffer.UVKind, uvs, false, 2);
}
if (newMesh.getVerticesData(BABYLON.VertexBuffer.UV2Kind) == null) {
const vertexCount = newMesh.getTotalVertices();
const uvs = new Array(vertexCount * 2).fill(0);
newMesh.setVerticesData(BABYLON.VertexBuffer.UV2Kind, uvs, false, 2);
if (this.hasTexture) {
if (newMesh.getVerticesData(BABYLON.VertexBuffer.UVKind) == null) {
const vertexCount = newMesh.getTotalVertices();
const uvs = new Array(vertexCount * 2).fill(0);
newMesh.setVerticesData(BABYLON.VertexBuffer.UVKind, uvs, false, 2);
}
if (newMesh.getVerticesData(BABYLON.VertexBuffer.UV2Kind) == null) {
const vertexCount = newMesh.getTotalVertices();
const uvs = new Array(vertexCount * 2).fill(0);
newMesh.setVerticesData(BABYLON.VertexBuffer.UV2Kind, uvs, false, 2);
}
}
toMerge.push(newMesh);
@@ -339,6 +342,7 @@ export type ObjectDef<OpSc extends OptionsSchema = OptionsSchema> = {
};
placement: 'top' | 'side' | 'bottom' | 'wall' | 'ceiling' | 'floor';
hasCollisions?: boolean;
hasTexture?: boolean;
//groupingMeshes: string[]; // multi-materialなメッシュは複数のメッシュに分割されるが、それだと不便な場合に追加の親メッシュでグルーピングするための指定
isChair?: boolean;
treatLoaderResult?: (loaderResult: BABYLON.AssetContainer) => void;
@@ -1148,6 +1152,20 @@ export class RoomEngine extends EventEmitter<RoomEngineEvents> {
// babylonによって自動で追加される右手系変換用ード
let subRoot = loaderResult.meshes[0] as BABYLON.TransformNode;
// 不要なUVを掃除
if (!def.hasTexture) {
for (const m of loaderResult.meshes) {
if (m.geometry != null) {
m.geometry.removeVerticesData(BABYLON.VertexBuffer.UVKind);
m.geometry.removeVerticesData(BABYLON.VertexBuffer.UV2Kind);
m.geometry.removeVerticesData(BABYLON.VertexBuffer.UV3Kind);
m.geometry.removeVerticesData(BABYLON.VertexBuffer.UV4Kind);
m.geometry.removeVerticesData(BABYLON.VertexBuffer.UV5Kind);
m.geometry.removeVerticesData(BABYLON.VertexBuffer.UV6Kind);
}
}
}
if (BAKE_TRANSFORM) {
subRoot.scaling = new BABYLON.Vector3(1, 1, 1);
subRoot.rotationQuaternion = null;
@@ -1309,7 +1327,7 @@ export class RoomEngine extends EventEmitter<RoomEngineEvents> {
root.rotation = args.rotation.clone();
root.metadata = metadata;
const model = new ModelManager(BAKE_TRANSFORM ? root : subRoot, loaderResult.meshes.filter(m => m.name !== '__root__'), (meshes) => {
const model = new ModelManager(BAKE_TRANSFORM ? root : subRoot, loaderResult.meshes.filter(m => m.name !== '__root__'), def.hasTexture, (meshes) => {
if (this.selected?.objectId === args.id) {
this.highlightMeshes(meshes);
}
@@ -2069,7 +2087,7 @@ export class RoomObjectPreviewEngine {
root.addChild(subRoot);
const model = new ModelManager(subRoot, loaderResult.meshes.filter(m => m !== subRoot), (meshes) => {
const model = new ModelManager(subRoot, loaderResult.meshes.filter(m => m !== subRoot), def.hasTexture, (meshes) => {
for (const m of meshes) {
const mesh = m;

View File

@@ -46,6 +46,7 @@ export const allInOnePc = defineObject({
},
},
placement: 'top',
hasTexture: true,
createInstance: async ({ room, scene, options, model }) => {
const matrix = model.root.getWorldMatrix(true);
const scale = new BABYLON.Vector3();

View File

@@ -27,6 +27,7 @@ export const aromaReedDiffuser = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: ({ options, model }) => {
const bottleMesh = model.findMesh('__X_BOTTLE__');
const bottleMaterial = bottleMesh.material as BABYLON.PBRMaterial;

View File

@@ -14,6 +14,7 @@ export const banknote = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: () => {
return {
interactions: {},

View File

@@ -22,6 +22,7 @@ export const bed = defineObject({
},
placement: 'floor',
hasCollisions: true,
hasTexture: true,
createInstance: ({ options, model }) => {
const bodyMesh = model.findMesh('__X_BODY__');
const bodyMaterial = bodyMesh.material as BABYLON.PBRMaterial;

View File

@@ -46,6 +46,7 @@ export const book = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: ({ options, model }) => {
const bodyMesh = model.findMesh('__X_BODY__');

View File

@@ -24,6 +24,7 @@ export const books = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: ({ scene, options, model }) => {
const coverMaterial = model.findMaterial('__X_COVER__');

View File

@@ -22,6 +22,7 @@ export const cactusS = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: ({ options, model }) => {
const potMesh = model.findMesh('__X_POT__');
const potMaterial = potMesh.material as BABYLON.PBRMaterial;

View File

@@ -23,6 +23,7 @@ export const cardboardBox = defineObject({
},
placement: 'top',
hasCollisions: true,
hasTexture: true,
createInstance: ({ scene, options, model }) => {
return {
onInited: () => {

View File

@@ -14,6 +14,7 @@ export const coffeeCup = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: () => {
return {
interactions: {},

View File

@@ -22,6 +22,7 @@ export const colorBox = defineObject({
},
placement: 'floor',
hasCollisions: true,
hasTexture: true,
createInstance: ({ options, model }) => {
const bodyMesh = model.findMesh('__X_BODY__');
const bodyMaterial = bodyMesh.material as BABYLON.PBRMaterial;

View File

@@ -16,6 +16,7 @@ export const cupNoodle = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: ({ scene, root }) => {
let yugeDispose: (() => void) | null = null;

View File

@@ -14,6 +14,7 @@ export const djMixer = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: () => {
return {
interactions: {},

View File

@@ -37,6 +37,7 @@ export const djPlayer = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: async ({ model, options, scene }) => {
const screenMesh = model.findMesh('__X_SCREEN__');
const screenMaterial = model.findMaterial('__X_SCREEN__');

View File

@@ -14,6 +14,7 @@ export const ductTape = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: () => {
return {
interactions: {},

View File

@@ -14,6 +14,7 @@ export const energyDrink = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: () => {
return {
interactions: {},

View File

@@ -14,6 +14,7 @@ export const envelope = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: () => {
return {
interactions: {},

View File

@@ -14,6 +14,7 @@ export const facialTissue = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: () => {
return {
interactions: {},

View File

@@ -14,6 +14,7 @@ export const hangingTShirt = defineObject({
},
placement: 'side',
hasCollisions: false,
hasTexture: true,
createInstance: () => {
return {
interactions: {},

View File

@@ -55,6 +55,7 @@ export const laptopPc = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: async ({ room, scene, options, model }) => {
const matrix = model.root.getWorldMatrix(true);
const scale = new BABYLON.Vector3();

View File

@@ -14,6 +14,7 @@ export const milk = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: () => {
return {
interactions: {},

View File

@@ -14,6 +14,7 @@ export const mixer = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: () => {
return {
interactions: {},

View File

@@ -13,6 +13,7 @@ export const monitor = defineObject({
default: {},
},
placement: 'top',
hasTexture: true,
createInstance: () => {
return {
interactions: {},

View File

@@ -14,6 +14,7 @@ export const monstera = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: () => {
return {
interactions: {},

View File

@@ -14,6 +14,7 @@ export const pachira = defineObject({
},
placement: 'top',
hasCollisions: true,
hasTexture: true,
createInstance: () => {
return {
interactions: {},

View File

@@ -27,6 +27,7 @@ export const petBottle = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: ({ model, options }) => {
const capMesh = model.findMesh('__X_CAP__');
const liquidMesh = model.findMesh('__X_LIQUID__');

View File

@@ -84,6 +84,7 @@ export const pictureFrame = defineObject({
},
placement: 'side',
hasCollisions: false,
hasTexture: true,
createInstance: async ({ scene, options, model }) => {
const frameMesh = model.findMesh('__X_FRAME__');
frameMesh.rotationQuaternion = null;

View File

@@ -14,6 +14,7 @@ export const plant = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: () => {
return {
interactions: {},

View File

@@ -13,6 +13,7 @@ export const plant2 = defineObject({
default: {},
},
placement: 'top',
hasTexture: true,
createInstance: () => {
return {
interactions: {},

View File

@@ -49,6 +49,7 @@ export const poster = defineObject({
},
placement: 'side',
hasCollisions: false,
hasTexture: true,
createInstance: async ({ scene, options, model }) => {
const pictureMesh = model.findMesh('__X_PICTURE__');
pictureMesh.rotationQuaternion = null;

View File

@@ -43,6 +43,7 @@ export const randomBooks = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: ({ options, model, scene, id }) => {
const bodyMesh = model.findMesh('__X_BODY__');
const tex = new BABYLON.Texture('/client-assets/room/objects/random-books/texture.png', scene, {

View File

@@ -14,6 +14,7 @@ export const roundRug = defineObject({
},
placement: 'floor',
hasCollisions: false,
hasTexture: true,
createInstance: () => {
return {
interactions: {},

View File

@@ -14,6 +14,7 @@ export const router = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: () => {
return {
interactions: {},

View File

@@ -14,6 +14,7 @@ export const snakeplant = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: () => {
return {
interactions: {},

View File

@@ -14,6 +14,7 @@ export const tabletopCalendar = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: () => {
return {
interactions: {},

View File

@@ -29,6 +29,7 @@ export const tabletopFlag = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: async ({ model, options, scene }) => {
const flagMesh = model.findMesh('__X_FLAG__');
const flagMaterial = model.findMaterial('__X_FLAG__');

View File

@@ -49,6 +49,7 @@ export const tabletopGlassPictureFrame = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: async ({ scene, options, model }) => {
const pictureMesh = model.findMesh('__X_PICTURE__');
const frameMesh = model.findMesh('__X_FRAME__');

View File

@@ -84,6 +84,7 @@ export const tabletopPictureFrame = defineObject({
},
placement: 'top',
hasCollisions: false,
hasTexture: true,
createInstance: async ({ scene, options, model }) => {
const frameMesh = model.findMesh('__X_FRAME__');
frameMesh.rotationQuaternion = null;

View File

@@ -49,6 +49,7 @@ export const tapestry = defineObject({
},
placement: 'side',
hasCollisions: false,
hasTexture: true,
createInstance: async ({ scene, options, model }) => {
const pictureMesh = model.findMesh('__X_PICTURE__');
pictureMesh.rotationQuaternion = null;

View File

@@ -31,6 +31,7 @@ export const tv = defineObject({
},
placement: 'top',
hasCollisions: true,
hasTexture: true,
createInstance: ({ options, room, model, scene }) => {
const matrix = model.root.getWorldMatrix(true);
const scale = new BABYLON.Vector3();

View File

@@ -45,6 +45,7 @@ export const wallCanvas = defineObject({
},
placement: 'side',
hasCollisions: false,
hasTexture: true,
createInstance: async ({ scene, options, model }) => {
const canvasMesh = model.findMesh('__X_CANVAS__');
canvasMesh.rotationQuaternion = null;

View File

@@ -49,6 +49,7 @@ export const wallGlassPictureFrame = defineObject({
},
placement: 'wall',
hasCollisions: false,
hasTexture: true,
createInstance: async ({ scene, options, model }) => {
const pictureMesh = model.findMesh('__X_PICTURE__');
const frameMesh = model.findMesh('__X_FRAME__');