mirror of
https://github.com/misskey-dev/misskey.git
synced 2026-05-16 03:55:26 +02:00
clean uv
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -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;
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -14,6 +14,7 @@ export const banknote = defineObject({
|
||||
},
|
||||
placement: 'top',
|
||||
hasCollisions: false,
|
||||
hasTexture: true,
|
||||
createInstance: () => {
|
||||
return {
|
||||
interactions: {},
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -46,6 +46,7 @@ export const book = defineObject({
|
||||
},
|
||||
placement: 'top',
|
||||
hasCollisions: false,
|
||||
hasTexture: true,
|
||||
createInstance: ({ options, model }) => {
|
||||
const bodyMesh = model.findMesh('__X_BODY__');
|
||||
|
||||
|
||||
@@ -24,6 +24,7 @@ export const books = defineObject({
|
||||
},
|
||||
placement: 'top',
|
||||
hasCollisions: false,
|
||||
hasTexture: true,
|
||||
createInstance: ({ scene, options, model }) => {
|
||||
const coverMaterial = model.findMaterial('__X_COVER__');
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -23,6 +23,7 @@ export const cardboardBox = defineObject({
|
||||
},
|
||||
placement: 'top',
|
||||
hasCollisions: true,
|
||||
hasTexture: true,
|
||||
createInstance: ({ scene, options, model }) => {
|
||||
return {
|
||||
onInited: () => {
|
||||
|
||||
@@ -14,6 +14,7 @@ export const coffeeCup = defineObject({
|
||||
},
|
||||
placement: 'top',
|
||||
hasCollisions: false,
|
||||
hasTexture: true,
|
||||
createInstance: () => {
|
||||
return {
|
||||
interactions: {},
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -16,6 +16,7 @@ export const cupNoodle = defineObject({
|
||||
},
|
||||
placement: 'top',
|
||||
hasCollisions: false,
|
||||
hasTexture: true,
|
||||
createInstance: ({ scene, root }) => {
|
||||
let yugeDispose: (() => void) | null = null;
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ export const djMixer = defineObject({
|
||||
},
|
||||
placement: 'top',
|
||||
hasCollisions: false,
|
||||
hasTexture: true,
|
||||
createInstance: () => {
|
||||
return {
|
||||
interactions: {},
|
||||
|
||||
@@ -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__');
|
||||
|
||||
@@ -14,6 +14,7 @@ export const ductTape = defineObject({
|
||||
},
|
||||
placement: 'top',
|
||||
hasCollisions: false,
|
||||
hasTexture: true,
|
||||
createInstance: () => {
|
||||
return {
|
||||
interactions: {},
|
||||
|
||||
@@ -14,6 +14,7 @@ export const energyDrink = defineObject({
|
||||
},
|
||||
placement: 'top',
|
||||
hasCollisions: false,
|
||||
hasTexture: true,
|
||||
createInstance: () => {
|
||||
return {
|
||||
interactions: {},
|
||||
|
||||
@@ -14,6 +14,7 @@ export const envelope = defineObject({
|
||||
},
|
||||
placement: 'top',
|
||||
hasCollisions: false,
|
||||
hasTexture: true,
|
||||
createInstance: () => {
|
||||
return {
|
||||
interactions: {},
|
||||
|
||||
@@ -14,6 +14,7 @@ export const facialTissue = defineObject({
|
||||
},
|
||||
placement: 'top',
|
||||
hasCollisions: false,
|
||||
hasTexture: true,
|
||||
createInstance: () => {
|
||||
return {
|
||||
interactions: {},
|
||||
|
||||
@@ -14,6 +14,7 @@ export const hangingTShirt = defineObject({
|
||||
},
|
||||
placement: 'side',
|
||||
hasCollisions: false,
|
||||
hasTexture: true,
|
||||
createInstance: () => {
|
||||
return {
|
||||
interactions: {},
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -14,6 +14,7 @@ export const milk = defineObject({
|
||||
},
|
||||
placement: 'top',
|
||||
hasCollisions: false,
|
||||
hasTexture: true,
|
||||
createInstance: () => {
|
||||
return {
|
||||
interactions: {},
|
||||
|
||||
@@ -14,6 +14,7 @@ export const mixer = defineObject({
|
||||
},
|
||||
placement: 'top',
|
||||
hasCollisions: false,
|
||||
hasTexture: true,
|
||||
createInstance: () => {
|
||||
return {
|
||||
interactions: {},
|
||||
|
||||
@@ -13,6 +13,7 @@ export const monitor = defineObject({
|
||||
default: {},
|
||||
},
|
||||
placement: 'top',
|
||||
hasTexture: true,
|
||||
createInstance: () => {
|
||||
return {
|
||||
interactions: {},
|
||||
|
||||
@@ -14,6 +14,7 @@ export const monstera = defineObject({
|
||||
},
|
||||
placement: 'top',
|
||||
hasCollisions: false,
|
||||
hasTexture: true,
|
||||
createInstance: () => {
|
||||
return {
|
||||
interactions: {},
|
||||
|
||||
@@ -14,6 +14,7 @@ export const pachira = defineObject({
|
||||
},
|
||||
placement: 'top',
|
||||
hasCollisions: true,
|
||||
hasTexture: true,
|
||||
createInstance: () => {
|
||||
return {
|
||||
interactions: {},
|
||||
|
||||
@@ -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__');
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -14,6 +14,7 @@ export const plant = defineObject({
|
||||
},
|
||||
placement: 'top',
|
||||
hasCollisions: false,
|
||||
hasTexture: true,
|
||||
createInstance: () => {
|
||||
return {
|
||||
interactions: {},
|
||||
|
||||
@@ -13,6 +13,7 @@ export const plant2 = defineObject({
|
||||
default: {},
|
||||
},
|
||||
placement: 'top',
|
||||
hasTexture: true,
|
||||
createInstance: () => {
|
||||
return {
|
||||
interactions: {},
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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, {
|
||||
|
||||
@@ -14,6 +14,7 @@ export const roundRug = defineObject({
|
||||
},
|
||||
placement: 'floor',
|
||||
hasCollisions: false,
|
||||
hasTexture: true,
|
||||
createInstance: () => {
|
||||
return {
|
||||
interactions: {},
|
||||
|
||||
@@ -14,6 +14,7 @@ export const router = defineObject({
|
||||
},
|
||||
placement: 'top',
|
||||
hasCollisions: false,
|
||||
hasTexture: true,
|
||||
createInstance: () => {
|
||||
return {
|
||||
interactions: {},
|
||||
|
||||
@@ -14,6 +14,7 @@ export const snakeplant = defineObject({
|
||||
},
|
||||
placement: 'top',
|
||||
hasCollisions: false,
|
||||
hasTexture: true,
|
||||
createInstance: () => {
|
||||
return {
|
||||
interactions: {},
|
||||
|
||||
@@ -14,6 +14,7 @@ export const tabletopCalendar = defineObject({
|
||||
},
|
||||
placement: 'top',
|
||||
hasCollisions: false,
|
||||
hasTexture: true,
|
||||
createInstance: () => {
|
||||
return {
|
||||
interactions: {},
|
||||
|
||||
@@ -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__');
|
||||
|
||||
@@ -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__');
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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__');
|
||||
|
||||
Reference in New Issue
Block a user