feat(web): complete portable Blender feature gaps
This commit is contained in:
@@ -9,11 +9,20 @@ import type { LODManifest } from "./simplify";
|
||||
import type { DepsgraphEvaluationIR } from "./depsgraph";
|
||||
import type { SculptMeshAttributesIR, SculptStrokeIR } from "./sculpt";
|
||||
import type { GeometryNodeGraphIR } from "./geometry-nodes";
|
||||
import type { PhysicsSimulationManifestIR } from "./physics-simulation";
|
||||
import type {
|
||||
PhysicsClothSettings,
|
||||
PhysicsFluidSettings,
|
||||
PhysicsParticleCacheSettings,
|
||||
PhysicsRigidBodySettings,
|
||||
PhysicsSimulationManifestIR,
|
||||
PhysicsSimulationPlaybackSettings,
|
||||
PhysicsSoftBodySettings,
|
||||
} from "./physics-simulation";
|
||||
import type { ShaderGraphIR } from "./shader-graph";
|
||||
import type { ShaderCompileReport } from "./shader-compiler";
|
||||
import type { NlaMoveStripCommand, NlaTrackIR } from "./nla";
|
||||
import type { RenderCapabilityRequest } from "./render-capabilities";
|
||||
import type { RenderRoutingRequestIR } from "./render-routing";
|
||||
import type { CapabilityGateResult } from "./capability-gates";
|
||||
import type { NonMeshGeometryChunk } from "./nonmesh-binary";
|
||||
import type {
|
||||
@@ -27,6 +36,7 @@ import type { PaintPBVHCapabilityRequest } from "./paint-pbvh-capability";
|
||||
import type { LibraryMainAppendReceiptIR, LibraryMainAppendRequestIR } from "./library-main-append";
|
||||
import type { BlenderOperatorDescriptor, BlenderOperatorPropertySpec, BlenderOperatorInvocation, BlenderOperatorPropertyValue } from "./blender-operator";
|
||||
import type { SequencerTimelineIR } from "./sequencer";
|
||||
import type { CompositorGraphIR } from "./compositor";
|
||||
|
||||
export interface MeshGeometryBuffer {
|
||||
schemaVersion: 1;
|
||||
@@ -81,6 +91,28 @@ export type MeshPrimitive = "CUBE" | "PLANE" | "UV_SPHERE" | "ICO_SPHERE" | "CYL
|
||||
export type MeshEditOperation = "MERGE" | "DISSOLVE" | "EXTRUDE" | "INSET" | "BEVEL" | "LOOP_CUT" | "SUBDIVIDE" | "FILL" | "TRIANGULATE" | "RECALCULATE_NORMALS" | "BRIDGE_LOOPS" | "DELETE";
|
||||
export type FCurveInterpolation = "CONSTANT" | "LINEAR" | "BEZIER";
|
||||
export type KeyframeHandle = [number, number];
|
||||
export interface FCurvePoint {
|
||||
frame: number;
|
||||
value: number;
|
||||
handleLeft?: KeyframeHandle;
|
||||
handleRight?: KeyframeHandle;
|
||||
interpolation?: FCurveInterpolation;
|
||||
}
|
||||
export interface ActionGroupDefinition {
|
||||
name: string;
|
||||
paths: string[];
|
||||
}
|
||||
export interface KeyingSetPathDefinition {
|
||||
path: string;
|
||||
arrayIndex?: number;
|
||||
}
|
||||
export type ArmatureEditOperation =
|
||||
| { operation: "ADD"; name: string; parentName?: string | null; head: [number, number, number]; tail: [number, number, number]; roll?: number; connected?: boolean }
|
||||
| { operation: "DELETE"; boneName: string }
|
||||
| { operation: "RENAME"; boneName: string; name: string }
|
||||
| { operation: "EXTRUDE"; boneName: string; name: string; tail: [number, number, number] }
|
||||
| { operation: "DUPLICATE"; boneName: string; name: string; offset?: [number, number, number] };
|
||||
export type PoseConstraintType = "COPY_LOCATION" | "COPY_ROTATION" | "COPY_SCALE" | "IK" | "TRACK_TO";
|
||||
|
||||
export type WebEngineEditCommand =
|
||||
| { type: "setFrame"; frame: number }
|
||||
@@ -99,8 +131,19 @@ export type WebEngineEditCommand =
|
||||
| { type: "setObjectTransform"; objectId: string; translation: [number, number, number]; rotationEuler: [number, number, number]; scale: [number, number, number] }
|
||||
| { type: "setArmatureBones"; objectId: string; bones: Array<{ name: string; parentName: string | null; head: [number, number, number]; tail: [number, number, number]; roll: number; connected?: boolean }> }
|
||||
| { type: "setPoseBoneTransform"; objectId: string; boneName: string; translation: [number, number, number]; rotationEuler: [number, number, number]; scale: [number, number, number] }
|
||||
| { type: "armatureEditOperations"; objectId: string; operations: ArmatureEditOperation[] }
|
||||
| { type: "setBoneRoll"; objectId: string; boneName: string; roll: number }
|
||||
| { type: "setBoneSymmetry"; objectId: string; enabled: boolean }
|
||||
| { type: "setBoneParenting"; objectId: string; boneName: string; parentName: string | null; connected: boolean }
|
||||
| { type: "setPoseConstraint"; objectId: string; boneName: string; constraintName: string; constraintType: PoseConstraintType | null; targetObjectId?: string | null; targetBoneName?: string; influence?: number; enabled?: boolean }
|
||||
| { type: "translateMeshVertices"; meshId: string; vertexIndices: number[]; offset: [number, number, number] }
|
||||
| { type: "meshEdit"; meshId: string; operation: MeshEditOperation; selectionMode: MeshElementMode; elementIndices: number[]; offset?: [number, number, number]; amount?: number; segments?: number }
|
||||
| { type: "meshSubdivide"; meshId: string; selectionMode: MeshElementMode; elementIndices: number[]; segments?: number }
|
||||
| { type: "meshTriangulate"; meshId: string; faceIndices: number[] }
|
||||
| { type: "meshRecalculateNormals"; meshId: string; faceIndices: number[] }
|
||||
| { type: "meshBridgeLoops"; meshId: string; edgeIndices: number[] }
|
||||
| { type: "meshDeleteElements"; meshId: string; selectionMode: MeshElementMode; elementIndices: number[] }
|
||||
| { type: "meshUVProject"; meshId: string; faceIndices: number[]; method: "PLANAR" | "CUBE" | "CYLINDER" | "SPHERE"; seamEdgeIndices?: number[] }
|
||||
| { type: "createUVMap"; meshId: string; name: string }
|
||||
| { type: "setActiveUVMap"; meshId: string; name: string }
|
||||
| { type: "unwrapUV"; meshId: string; faceIndices: number[]; method: "PLANAR" | "CUBE" }
|
||||
@@ -115,6 +158,11 @@ export type WebEngineEditCommand =
|
||||
| { type: "createAction"; name: string; objectId?: string }
|
||||
| { type: "removeAction"; actionId: string }
|
||||
| { type: "setKeyframe"; animationId: string; path: string; frame: number; value?: number[]; handleLeft?: KeyframeHandle; handleRight?: KeyframeHandle; interpolation?: FCurveInterpolation }
|
||||
| { type: "setFCurveKeyframes"; animationId: string; path: string; points: FCurvePoint[] }
|
||||
| { type: "setDriverExpression"; animationId: string; path: string; expression: string }
|
||||
| { type: "setActionGroups"; animationId: string; groups: ActionGroupDefinition[] }
|
||||
| { type: "setKeyingSet"; sceneId: string; name: string; paths: KeyingSetPathDefinition[]; active?: boolean }
|
||||
| { type: "bakeAnimation"; objectId: string; frameStart: number; frameEnd: number; step?: number }
|
||||
| { type: "setTimelineMarkers"; dataId: string; markers: Array<{ frame: number; name: string }> }
|
||||
| { type: "setFCurveInterpolation"; animationId: string; path: string; interpolation: FCurveInterpolation }
|
||||
| { type: "setActiveAction"; objectId: string; actionId: string | null }
|
||||
@@ -130,10 +178,14 @@ export type WebEngineEditCommand =
|
||||
| { type: "createCurve"; curveType: "CURVE"; name?: string; controlPoints: number[]; cyclic?: boolean; resolution?: number }
|
||||
| { type: "deleteNonMeshData"; dataId: string }
|
||||
| { type: "setCurveControlPoints"; dataId: string; controlPoints: number[]; splineOffsets?: number[]; resolution?: number }
|
||||
| { type: "setCurveBevel"; dataId: string; bevelDepth?: number; bevelResolution?: number; bevelFactorStart?: number; bevelFactorEnd?: number }
|
||||
| { type: "setCurveTaper"; dataId: string; taperObjectId: string | null; taperRadiusMode?: number }
|
||||
| { type: "convertCurveType"; dataId: string; targetType: "CURVE" | "SURFACE" }
|
||||
| { type: "setCurveHandle"; dataId: string; pointIndex: number; side: "LEFT" | "RIGHT"; position: [number, number, number] }
|
||||
| { type: "setCurveTopology"; dataId: string; baseRevision?: number; splineTypes?: NonMeshCurveSplineType[]; cyclicU?: boolean[]; cyclicV?: boolean[]; handleTypes?: number[]; handlePoints?: number[] }
|
||||
| { type: "setCurveSplines"; dataId: string; splineTypes: NonMeshCurveSplineType[]; splineOffsets: number[]; ordersU: number[]; controlPoints: number[]; pointWeights: number[]; cyclicU: boolean[]; handleTypes: number[]; handlePoints: number[] }
|
||||
| { type: "setSurfaceTopology"; dataId: string; splineDimensions: Array<{ u: number; v: number; orderU: number; orderV: number }>; controlPoints: number[]; pointWeights: number[]; cyclicU: boolean[]; cyclicV: boolean[] }
|
||||
| { type: "setSurfaceResolution"; dataId: string; resolutionU: number; resolutionV?: number }
|
||||
| { type: "setFontBody"; dataId: string; body: string }
|
||||
| { type: "setFontProperties"; dataId: string; properties: Partial<NonMeshFontPropertiesIR> }
|
||||
| { type: "setFontAdvanced"; dataId: string; characters: NonMeshFontCharacterIR[]; textBoxes: NonMeshFontTextBoxIR[]; activeTextBox: number }
|
||||
@@ -152,6 +204,10 @@ export type WebEngineEditCommand =
|
||||
| { type: "insertGreasePencilFrame"; dataId: string; layerId: string; frame: number; duration?: number }
|
||||
| { type: "removeGreasePencilFrame"; dataId: string; layerId: string; frame: number }
|
||||
| { type: "setGreasePencilStrokes"; dataId: string; layerId: string; frame: number; baseRevision?: number; strokes: Array<{ cyclic?: boolean; materialIndex?: number; points: Array<{ position: [number, number, number]; radius?: number; opacity?: number; vertexColor?: [number, number, number, number] }> }> }
|
||||
| { type: "setGreasePencilDrawing"; dataId: string; layerId: string; frame: number; drawingId?: string; baseRevision?: number; strokes: Array<{ cyclic?: boolean; materialIndex?: number; points: Array<{ position: [number, number, number]; radius?: number; opacity?: number; vertexColor?: [number, number, number, number] }> }> }
|
||||
| { type: "setGreasePencilMaterial"; dataId: string; layerId: string; frame: number; materialIndex: number; strokeIndices?: number[]; baseRevision?: number }
|
||||
| { type: "setGreasePencilSelection"; dataId: string; layerId: string; frame: number; pointIndices?: number[]; strokeIndices?: number[]; mode?: "REPLACE" | "ADD" | "SUBTRACT" | "TOGGLE"; baseRevision?: number }
|
||||
| { type: "setGreasePencilInterpolate"; dataId: string; layerId: string; sourceFrame: number; targetFrame: number; factor: number; baseRevision?: number }
|
||||
| { type: "setVertexColors"; meshId: string; attributeName: string; domain: "POINT" | "CORNER"; indices: number[]; colors: number[] }
|
||||
| { type: "setVertexWeights"; objectId: string; vertexGroup: string; indices: number[]; values: number[]; normalize?: boolean; limit?: number; mirror?: boolean; mirrorAxis?: 0 | 1 | 2; mirrorTolerance?: number }
|
||||
| { type: "setLightProperties"; dataId: string; properties: { type?: "POINT" | "SUN" | "SPOT" | "AREA"; areaShape?: 0 | 1 | 4 | 5; diffuseFactor?: number; specularFactor?: number; transmissionFactor?: number; volumeFactor?: number; attenuationDistance?: number; shadowFilterRadius?: number; shadowMaximumResolution?: number; shadowJitterOverblur?: number; cascadeMaxDistance?: number; cascadeExponent?: number; cascadeFade?: number; cascadeCount?: number; areaSizeZ?: number; clipStart?: number; color?: [number, number, number]; energy?: number; exposure?: number; temperature?: number; useTemperature?: boolean; castsShadow?: boolean; radius?: number; spotAngle?: number; spotBlend?: number; areaSize?: number; areaSizeY?: number; areaSpread?: number; sunAngle?: number } }
|
||||
@@ -163,7 +219,16 @@ export type WebEngineEditCommand =
|
||||
| { type: "setSceneUnitSettings"; dataId: string; properties: { system?: number; scaleLength?: number; rotationSystem?: number; lengthUnit?: number; massUnit?: number; timeUnit?: number; temperatureUnit?: number } }
|
||||
| { type: "setSceneTimelineSettings"; dataId: string; properties: { fps?: number; fpsBase?: number; frameStep?: number; usePreviewRange?: boolean; previewStart?: number; previewEnd?: number } }
|
||||
| { type: "setScenePipelineSettings"; dataId: string; properties: { useCompositor?: boolean; useSequencer?: boolean; noOverwrite?: boolean; saveOutput?: boolean; alphaPremultiplied?: boolean } }
|
||||
| { type: "renderFrame"; dataId: string; frame?: number; route?: RenderRoutingRequestIR }
|
||||
| { type: "renderAnimation"; dataId: string; frameStart?: number; frameEnd?: number; step?: number; route?: RenderRoutingRequestIR }
|
||||
| { type: "setRenderPasses"; dataId: string; layerName: string; passes: { passMask?: number; cryptomatteMask?: number; cryptomatteLevels?: number; alphaThreshold?: number } }
|
||||
| { type: "setCameraView"; dataId: string; cameraObjectId: string | null }
|
||||
| { type: "setLightLinking"; dataId: string; target?: "OBJECT" | "WORLD"; lightgroup: string | null }
|
||||
| { type: "setSequencerStrips"; sceneId: string; timeline: SequencerTimelineIR }
|
||||
| { type: "setSequencerStripModifiers"; sceneId: string; stripId: string; modifiers: Array<{ id: string; type: string; enabled?: boolean; properties?: Record<string, unknown> }> }
|
||||
| { type: "setSequencerTransitions"; sceneId: string; timeline: SequencerTimelineIR }
|
||||
| { type: "setSequencerColorBalance"; sceneId: string; stripId: string; colorBalance: { lift: [number, number, number]; gamma: [number, number, number]; gain: [number, number, number]; exposure?: number; contrast?: number; saturation?: number } }
|
||||
| { type: "setCompositorNodeGraph"; sceneId: string; graph: CompositorGraphIR }
|
||||
| { type: "setSceneBindings"; dataId: string; properties: { cameraObjectId?: string | null; worldId?: string | null } }
|
||||
| { type: "setSceneViewLayerSettings"; dataId: string; layerName: string; properties: { useRender?: boolean; useFreestyle?: boolean; samples?: number } }
|
||||
| { type: "setSceneCollectionSettings"; dataId: string; layerName: string; collectionId: string; properties: { exclude?: boolean; holdout?: boolean; indirectOnly?: boolean; hide?: boolean } }
|
||||
@@ -178,10 +243,18 @@ export type WebEngineEditCommand =
|
||||
| { type: "setSceneSamplingSettings"; dataId: string; properties: { pixelAspectX?: number; pixelAspectY?: number; filterSize?: number; dither?: number } }
|
||||
| { type: "setSceneMultiviewSettings"; dataId: string; properties: { enabled?: boolean; viewsFormat?: 0 | 1; imageViewsFormat?: 0 | 1 | 2; stereoDisplayMode?: 0 | 1 | 2 | 3 | 4; interlaceSwap?: boolean; sideBySideCrossed?: boolean; squeezedFrame?: boolean } }
|
||||
| { type: "setSceneStampSettings"; dataId: string; properties: { stampMask?: number; fontId?: number; userText?: string; foreground?: [number, number, number, number]; background?: [number, number, number, number] } }
|
||||
| { type: "setTrackingMarkers"; clipId: string; trackId: string; markers: TrackingMarkerIR[]; sourceSha256?: string }
|
||||
| { type: "setTrackingSolve"; clipId: string; solve: CameraSolveIR; sourceSha256?: string }
|
||||
| { type: "setMaskSpline"; maskId: string; layerId: string; spline: MaskSplineIR }
|
||||
| { type: "setMaskPoint"; maskId: string; layerId: string; splineId: string; point: MaskPointIR }
|
||||
| { type: "setSceneLineSettings"; dataId: string; properties: { mode?: 1 | 2; thickness?: number } }
|
||||
| { type: "setSceneViewLayerPassSettings"; dataId: string; layerName: string; properties: { passMask?: number; cryptomatteMask?: number; cryptomatteLevels?: number; alphaThreshold?: number } }
|
||||
| { type: "setSceneViewLayerAOVs"; dataId: string; layerName: string; aovs: Array<{ name: string; type: 0 | 1 }> }
|
||||
| { type: "setSceneViewLayerLightgroups"; dataId: string; layerName: string; lightgroups: string[] }
|
||||
| { type: "clearObjectTransform"; objectId: string; channels: Array<"LOCATION" | "ROTATION" | "SCALE"> }
|
||||
| { type: "createObjectData"; objectType: "CAMERA" | "LIGHT" | "EMPTY" | "ARMATURE"; name?: string }
|
||||
| { type: "setObjectSelection"; objectId: string; selected: boolean; active?: boolean }
|
||||
| { type: "setCollectionVisibility"; collectionId: string; viewportVisible?: boolean; renderVisible?: boolean }
|
||||
| { type: "setObjectLightgroup"; objectId: string; lightgroup: string | null }
|
||||
| { type: "setWorldLightgroup"; dataId: string; lightgroup: string | null }
|
||||
| { type: "setMetaballElements"; dataId: string; elements: Array<{ type: number; position: [number, number, number]; radius: number; scale: [number, number, number] }> }
|
||||
@@ -189,6 +262,11 @@ export type WebEngineEditCommand =
|
||||
| { type: "setSculptMeshAttributes"; attributes: SculptMeshAttributesIR }
|
||||
| { type: "setGeometryNodeGraph"; meshId: string; graph: GeometryNodeGraphIR }
|
||||
| { type: "setPhysicsSimulation"; manifest: PhysicsSimulationManifestIR }
|
||||
| { type: "setRigidBodySettings"; objectId: string; family?: "RIGID_BODY" | "SOFT_BODY"; settings: PhysicsRigidBodySettings | PhysicsSoftBodySettings }
|
||||
| { type: "setClothSettings"; objectId: string; settings: PhysicsClothSettings }
|
||||
| { type: "setFluidSettings"; objectId: string; settings: PhysicsFluidSettings }
|
||||
| { type: "setParticleCache"; objectId: string; settings: PhysicsParticleCacheSettings }
|
||||
| { type: "setSimulationPlayback"; settings: PhysicsSimulationPlaybackSettings }
|
||||
| { type: "setShaderGraph"; materialId: string; graph: ShaderGraphIR }
|
||||
| { type: "setNLAStack"; objectId: string; tracks: NlaTrackIR[]; baseRevision?: number }
|
||||
| NlaMoveStripCommand
|
||||
@@ -201,6 +279,31 @@ export type WebEngineOperatorPropertySpec = BlenderOperatorPropertySpec;
|
||||
export type WebEngineOperatorDescriptor = BlenderOperatorDescriptor;
|
||||
export type WebEngineOperatorInvocation = BlenderOperatorInvocation;
|
||||
|
||||
export type RNAPropertyValue = boolean | number | string | null;
|
||||
export interface RNADataBlockDescriptor {
|
||||
type: string;
|
||||
name: string;
|
||||
libraryLinked: boolean;
|
||||
editable: boolean;
|
||||
}
|
||||
export interface RNAPropertyDescriptor {
|
||||
identifier: string;
|
||||
name: string;
|
||||
description?: string;
|
||||
type: "BOOLEAN" | "INT" | "FLOAT" | "STRING" | "ENUM";
|
||||
subtype?: number;
|
||||
arrayLength: number;
|
||||
readonly: boolean;
|
||||
value?: RNAPropertyValue | RNAPropertyValue[];
|
||||
enumItems?: Array<{ identifier: string; name: string; value: number }>;
|
||||
}
|
||||
export interface RNACollectionDescriptor {
|
||||
identifier: string;
|
||||
name: string;
|
||||
itemType?: string;
|
||||
items: Array<{ name: string; type?: string }>;
|
||||
}
|
||||
|
||||
/** Read-only commands supported by the stable Worker-to-WASM JSON facade. */
|
||||
export type WebEngineJsonCommand =
|
||||
| "snapshot"
|
||||
@@ -211,7 +314,16 @@ export type WebEngineJsonCommand =
|
||||
| "undo"
|
||||
| "redo"
|
||||
| "listBlenderOperators"
|
||||
| "invokeBlenderOperator";
|
||||
| "invokeBlenderOperator"
|
||||
| "assetMark"
|
||||
| "assetCatalog"
|
||||
| "libraryLink"
|
||||
| "libraryOverride"
|
||||
| "libraryReload"
|
||||
| "listRNADataBlocks"
|
||||
| "readRNAProperties"
|
||||
| "setRNAProperty"
|
||||
| "listRNACollections";
|
||||
|
||||
export type WebEngineRequest =
|
||||
| { requestId: string; command: { type: "init" } }
|
||||
@@ -311,3 +423,4 @@ export type WebEngineResponse =
|
||||
| { kind: "progress"; requestId: string; progress: ProgressEvent }
|
||||
| { kind: "result"; requestId: string; ok: true; result: WebEngineResult }
|
||||
| { kind: "result"; requestId: string; ok: false; error: ErrorReport };
|
||||
import type { CameraSolveIR, MaskPointIR, MaskSplineIR, TrackingMarkerIR } from "./tracking-mask";
|
||||
|
||||
Reference in New Issue
Block a user