Add full Blender desktop parity validation workflow
This commit is contained in:
@@ -13,8 +13,23 @@ export const BLENDER_WORKSPACE_IDS = [
|
||||
] as const;
|
||||
|
||||
export type WorkspaceId = typeof BLENDER_WORKSPACE_IDS[number];
|
||||
export type EditorType = "3D Viewport" | "Outliner" | "Properties" | "Timeline";
|
||||
export type BlenderMode = "Object" | "Edit" | "Pose";
|
||||
export type EditorType =
|
||||
| "3D Viewport"
|
||||
| "Outliner"
|
||||
| "Properties"
|
||||
| "Timeline"
|
||||
| "Dope Sheet"
|
||||
| "Image Editor"
|
||||
| "Render Result"
|
||||
| "Shader Editor"
|
||||
| "Compositor"
|
||||
| "Geometry Nodes"
|
||||
| "File Browser"
|
||||
| "Spreadsheet"
|
||||
| "Text Editor"
|
||||
| "Python Console"
|
||||
| "Info";
|
||||
export type BlenderMode = "Object" | "Edit" | "Pose" | "Sculpt" | "Texture Paint";
|
||||
|
||||
export interface RegionIR {
|
||||
id: string;
|
||||
@@ -75,17 +90,84 @@ function regions(): RegionIR[] {
|
||||
];
|
||||
}
|
||||
|
||||
function layoutAreas(): AreaIR[] {
|
||||
return [
|
||||
{ id: "viewport", editor: "3D Viewport", regions: regions(), rect: { x: 0, y: 0, width: 0.8, height: 0.78 }, maximized: false },
|
||||
{ id: "outliner", editor: "Outliner", regions: regions(), rect: { x: 0.8, y: 0, width: 0.2, height: 0.42 }, maximized: false },
|
||||
{ id: "properties", editor: "Properties", regions: regions(), rect: { x: 0.8, y: 0.42, width: 0.2, height: 0.36 }, maximized: false },
|
||||
{ id: "timeline", editor: "Timeline", regions: regions(), rect: { x: 0, y: 0.78, width: 1, height: 0.22 }, maximized: false },
|
||||
function area(id: string, editor: EditorType, x: number, y: number, width: number, height: number): AreaIR {
|
||||
return { id, editor, regions: regions(), rect: { x, y, width, height }, maximized: false };
|
||||
}
|
||||
|
||||
function workspaceAreas(id: WorkspaceId): AreaIR[] {
|
||||
const right = [
|
||||
area("outliner", "Outliner", 0.822, 0.819, 0.176, 0.179),
|
||||
area("properties", "Properties", 0.822, 0.022, 0.176, 0.794),
|
||||
];
|
||||
switch (id) {
|
||||
case "Layout":
|
||||
return [area("viewport", "3D Viewport", 0.001, 0.095, 0.819, 0.903), area("timeline", "Timeline", 0.001, 0.022, 0.819, 0.07), ...right];
|
||||
case "Modeling":
|
||||
case "Sculpting":
|
||||
return [area("viewport", "3D Viewport", 0.001, 0.022, 0.819, 0.976), ...right];
|
||||
case "UV Editing":
|
||||
case "Texture Paint":
|
||||
return [area("image-editor", "Image Editor", 0.001, 0.022, 0.409, 0.976), area("viewport", "3D Viewport", 0.412, 0.022, 0.408, 0.976), ...right];
|
||||
case "Shading":
|
||||
return [
|
||||
area("file-browser", "File Browser", 0.001, 0.511, 0.151, 0.487),
|
||||
area("viewport", "3D Viewport", 0.153, 0.511, 0.667, 0.487),
|
||||
area("image-editor", "Image Editor", 0.001, 0.022, 0.151, 0.487),
|
||||
area("shader-editor", "Shader Editor", 0.153, 0.022, 0.667, 0.487),
|
||||
...right,
|
||||
];
|
||||
case "Animation":
|
||||
return [
|
||||
area("camera-view", "3D Viewport", 0.001, 0.435, 0.291, 0.563),
|
||||
area("viewport", "3D Viewport", 0.294, 0.435, 0.526, 0.563),
|
||||
area("dope-sheet", "Dope Sheet", 0.001, 0.022, 0.819, 0.41),
|
||||
...right,
|
||||
];
|
||||
case "Rendering":
|
||||
return [area("render-result", "Render Result", 0.001, 0.095, 0.819, 0.903), area("timeline", "Timeline", 0.001, 0.022, 0.819, 0.07), area("properties", "Properties", 0.822, 0.022, 0.176, 0.976)];
|
||||
case "Compositing":
|
||||
return [area("image-editor", "Image Editor", 0.001, 0.552, 0.819, 0.446), area("properties", "Properties", 0.822, 0.552, 0.176, 0.446), area("compositor", "Compositor", 0.001, 0.071, 0.997, 0.476), area("timeline", "Timeline", 0.001, 0.022, 0.997, 0.046)];
|
||||
case "Geometry Nodes":
|
||||
return [
|
||||
area("spreadsheet", "Spreadsheet", 0.001, 0.552, 0.341, 0.446),
|
||||
area("viewport", "3D Viewport", 0.343, 0.552, 0.477, 0.446),
|
||||
area("geometry-nodes", "Geometry Nodes", 0.001, 0.095, 0.819, 0.452),
|
||||
area("timeline", "Timeline", 0.001, 0.022, 0.819, 0.07),
|
||||
...right,
|
||||
];
|
||||
case "Scripting":
|
||||
return [
|
||||
area("viewport", "3D Viewport", 0.001, 0.626, 0.291, 0.372),
|
||||
area("console", "Python Console", 0.001, 0.185, 0.291, 0.438),
|
||||
area("info", "Info", 0.001, 0.022, 0.291, 0.16),
|
||||
area("text-editor", "Text Editor", 0.294, 0.022, 0.526, 0.976),
|
||||
area("outliner", "Outliner", 0.822, 0.807, 0.176, 0.191),
|
||||
area("secondary-outliner", "Outliner", 0.822, 0.598, 0.176, 0.206),
|
||||
area("properties", "Properties", 0.822, 0.022, 0.176, 0.573),
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
function workspace(id: WorkspaceId): WorkspaceIR {
|
||||
return { id, name: id, areas: layoutAreas(), activeAreaId: "viewport", revision: 0 };
|
||||
const areas = workspaceAreas(id);
|
||||
const preferred = ({
|
||||
"UV Editing": "image-editor",
|
||||
"Texture Paint": "image-editor",
|
||||
Shading: "shader-editor",
|
||||
Animation: "dope-sheet",
|
||||
Rendering: "render-result",
|
||||
Compositing: "compositor",
|
||||
"Geometry Nodes": "geometry-nodes",
|
||||
Scripting: "text-editor",
|
||||
} as Partial<Record<WorkspaceId, string>>)[id];
|
||||
return { id, name: id, areas, activeAreaId: preferred ?? "viewport", revision: 0 };
|
||||
}
|
||||
|
||||
function defaultMode(id: WorkspaceId): BlenderMode {
|
||||
if (id === "Modeling" || id === "UV Editing") return "Edit";
|
||||
if (id === "Sculpting") return "Sculpt";
|
||||
if (id === "Texture Paint") return "Texture Paint";
|
||||
return "Object";
|
||||
}
|
||||
|
||||
export function createDefaultWebWorkspaceState(): WebWorkspaceState {
|
||||
@@ -120,6 +202,7 @@ export function reduceUICommand(state: WebWorkspaceState, command: UICommand): W
|
||||
workspaceId: command.workspaceId,
|
||||
activeAreaId: next.activeAreaId,
|
||||
activeEditor: next.areas.find((area) => area.id === next.activeAreaId)?.editor ?? "3D Viewport",
|
||||
mode: defaultMode(command.workspaceId),
|
||||
revision: state.context.revision + 1,
|
||||
},
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user