Add support for 3d models in assets and attachments

This commit is contained in:
2026-01-13 13:46:28 +01:00
parent e3d3a62f84
commit f215ef9aba
20 changed files with 15057 additions and 24 deletions

View File

@@ -1,5 +1,6 @@
import { isAudioAsset } from "../media/audio.js";
import { isCodeAsset, isGifAsset, isVideoAsset, isVideoElement } from "../broadcast/assetKinds.js";
import { isCodeAsset, isGifAsset, isModelAsset, isVideoAsset, isVideoElement } from "../broadcast/assetKinds.js";
import { createModelManager } from "../media/modelManager.js";
import {
ensureLayerPosition as ensureLayerPositionForState,
getLayerOrder as getLayerOrderForState,
@@ -75,6 +76,7 @@ export function createAdminConsole({
const aspectLockState = new Map();
const commitSizeChange = debounce(() => applyTransformFromInputs(), 180);
const audioUnlockEvents = ["pointerdown", "keydown", "touchstart"];
const modelManager = createModelManager({ requestDraw: () => requestDraw() });
let drawPending = false;
let layerOrder = [];
@@ -693,7 +695,11 @@ export function createAdminConsole({
let drawSource = null;
let ready = false;
let showPlayOverlay = false;
if (isVideoAsset(asset) || isGifAsset(asset)) {
if (isModelAsset(asset)) {
const model = modelManager.ensureModel(asset);
drawSource = model?.canvas || null;
ready = !!model?.ready;
} else if (isVideoAsset(asset) || isGifAsset(asset)) {
drawSource = ensureCanvasPreview(asset);
ready = isDrawable(drawSource);
showPlayOverlay = true;
@@ -978,6 +984,7 @@ export function createAdminConsole({
IMAGE: "Image",
VIDEO: "Video",
AUDIO: "Audio",
MODEL: "3D Model",
SCRIPT: "Script",
OTHER: "Other",
};
@@ -1020,6 +1027,7 @@ export function createAdminConsole({
function clearMedia(assetId) {
mediaCache.delete(assetId);
modelManager.clearModel(assetId);
const cachedPreview = previewCache.get(assetId);
if (cachedPreview && cachedPreview.startsWith("blob:")) {
URL.revokeObjectURL(cachedPreview);
@@ -1143,6 +1151,10 @@ export function createAdminConsole({
return null;
}
if (isModelAsset(asset)) {
return null;
}
if (isVideoAsset(asset)) {
return null;
}