@volter/editor-blender 0.1.150 → 0.1.152
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +18 -9
- package/README.md +5 -5
- package/contributions/blender-animation-editors.tsx +17 -69
- package/contributions/blender-display-settings.ts +36 -0
- package/contributions/blender-export-gltf.ts +228 -0
- package/contributions/blender-export.verbs.ts +39 -0
- package/contributions/blender-gltf-export.verbs.ts +312 -0
- package/contributions/blender-header-menus.tsx +37 -133
- package/contributions/blender-icon-trace.mjs +8 -98
- package/contributions/blender-icons.source.mjs +96 -860
- package/contributions/blender-mixer-pose.ts +369 -0
- package/contributions/blender-model-opening.tsx +26 -56
- package/contributions/blender-node-editor.document.tsx +30 -181
- package/contributions/blender-node-geometry.ts +44 -230
- package/contributions/blender-node-panels.source.mjs +7 -121
- package/contributions/blender-outliner-authoring.ts +61 -415
- package/contributions/blender-outliner-model.ts +15 -112
- package/contributions/blender-play-area.tsx +99 -0
- package/contributions/blender-playback-movie.ts +409 -0
- package/contributions/blender-pose.ts +18 -368
- package/contributions/blender-properties-context.ts +1 -1
- package/contributions/blender-properties-model.ts +59 -91
- package/contributions/blender-properties-tab.tsx +3 -50
- package/contributions/blender-properties-view.tsx +39 -181
- package/contributions/blender-remedy.ts +14 -0
- package/contributions/blender-runtime-skin.ts +103 -99
- package/contributions/blender-runtime.document.tsx +170 -618
- package/contributions/blender-scene-mixer.ts +51 -0
- package/contributions/blender-screenshot.service.ts +28 -0
- package/contributions/blender-timeline-geometry.ts +16 -136
- package/contributions/blender-timeline.document.tsx +145 -333
- package/contributions/blender-uv-editor.document.tsx +48 -112
- package/contributions/blender-uv-geometry.ts +14 -179
- package/contributions/blender-version.status.tsx +45 -31
- package/contributions/blender.environment.ts +2 -2
- package/contributions/blender.icons.json +0 -9
- package/contributions/blender.keymap.ts +9 -51
- package/contributions/blender.node-panels.json +4 -13
- package/contributions/blender.page.ts +64 -0
- package/contributions/blender.status.tsx +8 -150
- package/contributions/blender.style.ts +25 -152
- package/contributions/blender.verbs.ts +52 -0
- package/contributions/model.layout.ts +2 -34
- package/contributions/models.finder.ts +3 -30
- package/contributions/properties-bone-constraints.inspector.tsx +1 -16
- package/contributions/properties-bone.inspector.tsx +2 -31
- package/contributions/properties-collection.inspector.tsx +1 -34
- package/contributions/properties-constraints.inspector.tsx +1 -21
- package/contributions/properties-data.inspector.tsx +2 -39
- package/contributions/properties-material.inspector.tsx +2 -33
- package/contributions/properties-modifiers.inspector.tsx +2 -30
- package/contributions/properties-object.inspector.tsx +2 -44
- package/contributions/properties-output.inspector.tsx +1 -27
- package/contributions/properties-particles.inspector.tsx +2 -46
- package/contributions/properties-physics.inspector.tsx +2 -41
- package/contributions/properties-render.inspector.tsx +1 -45
- package/contributions/properties-scene.inspector.tsx +1 -35
- package/contributions/properties-texture.inspector.tsx +1 -49
- package/contributions/properties-view-layer.inspector.tsx +1 -29
- package/contributions/properties-world.inspector.tsx +2 -39
- package/contributions/shading.layout.ts +3 -78
- package/contributions/uv-editing.layout.ts +3 -70
- package/dist-node/serving.mjs +13 -32
- package/host/blender-runtime-host.ts +795 -412
- package/host/scene-sound.ts +143 -0
- package/node/blender-mcp.ts +52 -95
- package/package.json +1221 -46
- package/producticons/blender-icons.otf +0 -0
- package/producticons/blender-product-icon-theme.json +129 -0
- package/serving/blender-routes.ts +9 -48
- package/serving/blender-wasm-artifact.ts +29 -166
- package/serving/index.ts +1 -1
- package/src/api.ts +9 -0
- package/src/layouts.tsx +1 -17
- package/src/looks.ts +1 -12
- package/src/model-document-saving.ts +25 -0
- package/src/node-view-state.ts +3 -25
- package/src/play-mode.ts +13 -42
- package/src/play-tool.ts +44 -0
- package/src/presentation.ts +6 -18
- package/src/regions.ts +3 -43
- package/src/start-document.ts +15 -0
- package/src/timeline-view-state.ts +4 -39
- package/src/uv-view-state.ts +4 -20
- package/themes/blender.json +299 -0
- package/view/blender-view-routes.ts +1 -1
- package/contributions/blender-game-panel.tsx +0 -809
- package/contributions/blender-palette.source.mjs +0 -350
- package/contributions/blender-play-skin.ts +0 -508
- package/contributions/blender-screenshot.menu.ts +0 -32
- package/contributions/blender.command.ts +0 -109
- package/contributions/blender.palette.json +0 -102
- package/src/play-live.ts +0 -27
|
@@ -1,32 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BLENDER'S MODIFIERS TAB, as a Properties section (WORK.md §Blender in the
|
|
3
|
-
* tab is Blender, "Inspection parity", I2): the STACK, each modifier its own
|
|
4
|
-
* panel with its own settings, with the generic view beneath under "All
|
|
5
|
-
* properties".
|
|
6
|
-
*
|
|
7
|
-
* THE SPECIFICATION IS `scripts/startup/bl_ui/properties_data_modifier.py` at
|
|
8
|
-
* the engine's pin, and reading it is what decided the shape here. That file
|
|
9
|
-
* is barely a panel list at all: `DATA_PT_modifiers.draw` is `Add Modifier`
|
|
10
|
-
* plus `layout.template_modifiers()`, and the per-modifier panels are built in
|
|
11
|
-
* C from each type's own RNA (`MOD_*.cc`'s `panel_draw`). There is no Python
|
|
12
|
-
* table of sixty modifier types to transcribe — and transcribing one would be
|
|
13
|
-
* a COPY of Blender's layout, which the ruling forbids, and would go stale the
|
|
14
|
-
* first time a modifier gained a property.
|
|
15
|
-
*
|
|
16
|
-
* So the stack is derived instead: each member of `ob.modifiers` is a panel
|
|
17
|
-
* headed by the four toggles every modifier has (`ModifierData`'s own
|
|
18
|
-
* `show_viewport` / `show_render` / `show_in_editmode` / `show_on_cage`,
|
|
19
|
-
* which is the header row `template_modifiers` draws), followed by every
|
|
20
|
-
* property THIS MODIFIER'S OWN struct declares — `andDeclared`, which reads
|
|
21
|
-
* `BlenderRnaRow.group`, RNA's own answer to "which struct declares this".
|
|
22
|
-
* For a Subdivision modifier that is exactly `SubsurfModifier`'s levels,
|
|
23
|
-
* render_levels, quality, uv_smooth and the rest, in RNA's order.
|
|
24
|
-
*
|
|
25
|
-
* The ACTIVE modifier (`buttons_context_path_modifier`, which the door reports
|
|
26
|
-
* as `activeModifier`) is marked, the way Blender outlines the active panel.
|
|
27
|
-
*
|
|
28
|
-
* It stands when: the object's type is in `buttons_context.cc`'s modifier set.
|
|
29
|
-
*/
|
|
1
|
+
/** Blender’s Modifiers Properties tab follows scripts/startup/bl_ui/properties_data_modifier.py at the engine pin. Curated panels read the RNA context’s datablocks; the generic view remains under All properties. Match tab availability and engine-specific panels against the live context. */
|
|
30
2
|
import { blenderPropertiesTabMatch, blenderPropertiesTabSection } from './blender-properties-tab';
|
|
31
3
|
import type { BlenderCuratedPanel } from './blender-properties-view';
|
|
32
4
|
|
|
@@ -37,7 +9,7 @@ const CURATED: readonly BlenderCuratedPanel[] = [
|
|
|
37
9
|
collection: true,
|
|
38
10
|
active: 'activeModifier',
|
|
39
11
|
// `ModifierData`'s own, in the order `template_modifiers` heads a panel
|
|
40
|
-
// with them; everything after these is the type's own
|
|
12
|
+
// with them; everything after these is the type's own.
|
|
41
13
|
properties: [
|
|
42
14
|
'name',
|
|
43
15
|
'type',
|
|
@@ -1,34 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BLENDER'S OBJECT TAB, as a Properties section (WORK.md §Blender in the tab
|
|
3
|
-
* is Blender, "Inspection parity", I2). The body is Blender's own panels, in
|
|
4
|
-
* Blender's own order, over the RNA door; the generic view of every property
|
|
5
|
-
* the object has stays beneath them under "All properties".
|
|
6
|
-
*
|
|
7
|
-
* THE SPECIFICATION IS `scripts/startup/bl_ui/properties_object.py`, read at
|
|
8
|
-
* the engine's pin. Its `classes` tuple at the foot of the file is the panel
|
|
9
|
-
* ORDER, each class's `bl_label` the title, each `layout.prop(ob, "x")` an
|
|
10
|
-
* entry below in the order the draw function lists it, and `bl_options =
|
|
11
|
-
* {'DEFAULT_CLOSED'}` a `closed: true`. Blender's UI layer is never run,
|
|
12
|
-
* ported or recorded — the Python is read as a statement of WHICH properties
|
|
13
|
-
* this tab shows, and our widgets draw them from the door's rows.
|
|
14
|
-
*
|
|
15
|
-
* WHAT THE TRANSCRIPTION DELIBERATELY DROPS:
|
|
16
|
-
* - type-only `poll`/`if` branches. `show_all_edges` is mesh-only in Python; here
|
|
17
|
-
* it is simply not on a Camera's RNA, so it does not draw. Same outcome,
|
|
18
|
-
* from the datablock rather than from a copy of Blender's conditions.
|
|
19
|
-
* Rotation mode is a value on every object, so its draw branch is retained.
|
|
20
|
-
* - `OBJECT_PT_context_object` (`bl_label = ""`) — the breadcrumb row, which
|
|
21
|
-
* is the host's identity row here.
|
|
22
|
-
* - the four panels whose datablock is NOT the object: Motion Paths reads
|
|
23
|
-
* `ob.animation_visualization` and `ob.motion_path`, Light/Shadow Linking
|
|
24
|
-
* their collections. The context door names the object, so those are
|
|
25
|
-
* reached by drilling their POINTER row in the generic view beneath — a
|
|
26
|
-
* curated panel addresses one of the TAB's own datablocks, and inventing a
|
|
27
|
-
* second addressing scheme to reach a sub-struct is the kind of machinery
|
|
28
|
-
* the generic view exists to make unnecessary.
|
|
29
|
-
*
|
|
30
|
-
* It stands when: `buttons_context_path_object` — there is an active object.
|
|
31
|
-
*/
|
|
1
|
+
/** Blender’s Object Properties tab follows scripts/startup/bl_ui/properties_object.py at the engine pin. Curated panels read the RNA context’s datablocks; the generic view remains under All properties. Match tab availability and engine-specific panels against the live context. */
|
|
32
2
|
|
|
33
3
|
import { blenderPropertiesTabMatch, blenderPropertiesTabSection } from './blender-properties-tab';
|
|
34
4
|
import type { BlenderCuratedPanel } from './blender-properties-view';
|
|
@@ -196,19 +166,7 @@ export const order = 70;
|
|
|
196
166
|
* object group (Object … Material), then Texture. The presentation draws a
|
|
197
167
|
* separator wherever this changes. */
|
|
198
168
|
export const railGroup = 'object';
|
|
199
|
-
/**
|
|
200
|
-
* per screen in the startup file, and at factory settings the Layout
|
|
201
|
-
* workspace's is OBJECT:
|
|
202
|
-
*
|
|
203
|
-
* bpy.data.screens['Layout'].areas[PROPERTIES].spaces[0].context -> 'OBJECT'
|
|
204
|
-
*
|
|
205
|
-
* (measured against Blender 5.2.0 LTS at `--factory-startup`, walk 5 parity
|
|
206
|
-
* row 3; the other screens read OBJECT, MODIFIER, WORLD, DATA, TOOL, OUTPUT
|
|
207
|
-
* and RENDER, so a per-workspace default is the next fidelity step and this
|
|
208
|
-
* one declaration is the Layout/Model answer). Without it the rail opened on
|
|
209
|
-
* Render — the first tab in `ED_buttons_tabs_list`'s order — and a person
|
|
210
|
-
* selecting the cube got Sampling and Light Paths where Blender shows
|
|
211
|
-
* Transform. */
|
|
169
|
+
/** The Model Properties rail opens on Object, matching the factory Layout workspace’s context. */
|
|
212
170
|
export const railDefault = true;
|
|
213
171
|
export const match = blenderPropertiesTabMatch(TAB);
|
|
214
172
|
export default blenderPropertiesTabSection(TAB);
|
|
@@ -1,30 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BLENDER'S OUTPUT TAB, as a Properties section (WORK.md §Blender in the tab
|
|
3
|
-
* is Blender, "Inspection parity", I2). Blender's own panels over the RNA
|
|
4
|
-
* door, with the generic view beneath under "All properties".
|
|
5
|
-
*
|
|
6
|
-
* THE SPECIFICATION IS `scripts/startup/bl_ui/properties_output.py` at the
|
|
7
|
-
* engine's pin — `classes` (`:728-748`) is the panel order, `bl_label` the
|
|
8
|
-
* title, each `layout.prop(rd, "x")` an entry in the order the draw function
|
|
9
|
-
* lists it. Blender's UI layer is never run, ported or recorded.
|
|
10
|
-
*
|
|
11
|
-
* THE TAB'S DATABLOCK IS `scene.render`, and three panels reach past it: Frame
|
|
12
|
-
* Range is the SCENE's own `frame_start`/`frame_end`/`frame_step` (`:151`),
|
|
13
|
-
* Output's Color Management is `rd.image_settings` (`:371`), and Encoding is
|
|
14
|
-
* `rd.ffmpeg` (`:499`). The context door names each beside the render
|
|
15
|
-
* settings as one of this tab's paths and the rows say which they come from
|
|
16
|
-
* ({@link BlenderCuratedProperty}).
|
|
17
|
-
*
|
|
18
|
-
* WHAT THE TRANSCRIPTION DELIBERATELY DROPS:
|
|
19
|
-
* - the preset menus (`RENDER_PT_format_presets` `:15`,
|
|
20
|
-
* `RENDER_MT_framerate_presets` `:28`, `RENDER_PT_ffmpeg_presets` `:22`)
|
|
21
|
-
* and `template_image_settings`/`template_image_views` — operator and
|
|
22
|
-
* template widgets. Inspection parity, not editing parity.
|
|
23
|
-
* - `RENDER_PT_output_pixel_density` (`:396`), whose body is a preset menu
|
|
24
|
-
* plus two properties behind it; the two are named here.
|
|
25
|
-
*
|
|
26
|
-
* It stands when: `buttons_context_path_scene` — the same path as Render.
|
|
27
|
-
*/
|
|
1
|
+
/** Blender’s Output Properties tab follows scripts/startup/bl_ui/properties_output.py at the engine pin. Curated panels read the RNA context’s datablocks; the generic view remains under All properties. Match tab availability and engine-specific panels against the live context. */
|
|
28
2
|
import { blenderPropertiesTabMatch, blenderPropertiesTabSection } from './blender-properties-tab';
|
|
29
3
|
import type { BlenderCuratedPanel } from './blender-properties-view';
|
|
30
4
|
|
|
@@ -1,48 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BLENDER'S PARTICLES TAB, as a Properties section (WORK.md §Blender in the
|
|
3
|
-
* tab is Blender, "Inspection parity", I2). Blender's own panels over the RNA
|
|
4
|
-
* door, with the generic view beneath under "All properties".
|
|
5
|
-
*
|
|
6
|
-
* THE SPECIFICATION IS `scripts/startup/bl_ui/properties_particle.py` at the
|
|
7
|
-
* engine's pin — `classes` (`:2248-2302`) is the panel order, `bl_label` the
|
|
8
|
-
* title, each `layout.prop(part, "x")` an entry. Blender's UI layer is never
|
|
9
|
-
* run, ported or recorded.
|
|
10
|
-
*
|
|
11
|
-
* NEARLY EVERY PANEL DRAWS `psys.settings`, NOT THE SYSTEM. `part` in these
|
|
12
|
-
* draw functions is `particle_get_settings(context)` (`:40-46`), which is the
|
|
13
|
-
* active system's ParticleSettings — a datablock of its own. The system
|
|
14
|
-
* itself carries only a handful (`seed`, `parent`, `child_seed`, the
|
|
15
|
-
* vertex-group names, `use_hair_dynamics`). The context door names both, plus
|
|
16
|
-
* the hair-dynamics cloth settings, as this tab's paths, and each row says
|
|
17
|
-
* which it comes from.
|
|
18
|
-
*
|
|
19
|
-
* THE TYPE POLLS ARE READ, and this tab is why `when` exists. Blender gates
|
|
20
|
-
* these panels on values rather than on structure: `settings.type == 'HAIR'`
|
|
21
|
-
* (Hair Dynamics `:362`, Hair Shape `:2205`), `settings.physics_type` in
|
|
22
|
-
* NEWTON/FLUID or == BOIDS (`:1161`, `:1195`, `:1222`, `:934`),
|
|
23
|
-
* `settings.render_type` (`:1449`, `:1507`, `:1536`), `settings.child_type`
|
|
24
|
-
* (`:1743`, `:1778`), `settings.is_fluid` (`:272`). Every one of those
|
|
25
|
-
* properties is on the same struct under every mode, so RNA cannot answer the
|
|
26
|
-
* poll and the condition is read from the ENGINE's live value instead — a copy
|
|
27
|
-
* of Blender's test, never of its branching.
|
|
28
|
-
*
|
|
29
|
-
* WHAT THE TRANSCRIPTION DELIBERATELY DROPS:
|
|
30
|
-
* - `PARTICLE_PT_context_particles` (`:156`, `bl_label = ""`) — the systems
|
|
31
|
-
* list plus the settings ID template. The list itself is the first panel
|
|
32
|
-
* here, as a collection with the active system marked; the `template_ID`
|
|
33
|
-
* row is an editing widget.
|
|
34
|
-
* - the Boids panels (`:931`-`:1045`) and the fluid-spring panels
|
|
35
|
-
* (`:835`-`:928`): both read sub-structs of the settings (`part.boids`,
|
|
36
|
-
* `part.fluid`), which stand as POINTER rows in the Physics panel and
|
|
37
|
-
* drill. Naming a fourth and fifth datablock on this tab to reach a mode
|
|
38
|
-
* almost nothing uses is the machinery the generic view exists to avoid.
|
|
39
|
-
* - `PARTICLE_PT_boidbrain` (`:1254`) — a rules list with per-rule operators.
|
|
40
|
-
* - `template_curve_mapping` (the clump and roughness curves) — a curve
|
|
41
|
-
* widget this view does not draw.
|
|
42
|
-
* - `PARTICLE_PT_custom_props` (`:2243`), IDProperties rather than RNA.
|
|
43
|
-
*
|
|
44
|
-
* It stands when: `buttons_context_path_particle` — `ob->type == OB_MESH`.
|
|
45
|
-
*/
|
|
1
|
+
/** Blender’s Particles Properties tab follows scripts/startup/bl_ui/properties_particle.py at the engine pin. Curated panels read the RNA context’s datablocks; the generic view remains under All properties. Match tab availability and engine-specific panels against the live context. */
|
|
46
2
|
import { blenderPropertiesTabMatch, blenderPropertiesTabSection } from './blender-properties-tab';
|
|
47
3
|
import type { BlenderCuratedPanel } from './blender-properties-view';
|
|
48
4
|
|
|
@@ -193,7 +149,7 @@ const CURATED: readonly BlenderCuratedPanel[] = [
|
|
|
193
149
|
},
|
|
194
150
|
{
|
|
195
151
|
// PARTICLE_PT_physics, :730. `boids` and `fluid` are the two mode
|
|
196
|
-
// sub-structs whose own panels are one drill away
|
|
152
|
+
// sub-structs whose own panels are one drill away.
|
|
197
153
|
title: 'Physics',
|
|
198
154
|
closed: true,
|
|
199
155
|
from: 'Settings',
|
|
@@ -1,42 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* BLENDER'S PHYSICS TAB, as a Properties section (WORK.md §Blender in the tab
|
|
3
|
-
* is Blender, "Inspection parity", I2). Blender's own panels over the RNA
|
|
4
|
-
* door, with the generic view beneath under "All properties".
|
|
5
|
-
*
|
|
6
|
-
* THE SPECIFICATION IS SEVEN FILES, not one: `properties_physics_common.py`
|
|
7
|
-
* carries the tab's own header block, and `properties_physics_rigidbody.py`,
|
|
8
|
-
* `_rigidbody_constraint.py`, `_cloth.py`, `_softbody.py`, `_field.py`
|
|
9
|
-
* (Force Fields AND Collision), `_fluid.py` and `_dynamicpaint.py` each carry
|
|
10
|
-
* one simulation. Each panel below cites its file and line. Blender's UI
|
|
11
|
-
* layer is never run, ported or recorded.
|
|
12
|
-
*
|
|
13
|
-
* THE "ENABLE BUTTONS" ROW IS NOT DRAWN, AND WHAT IT SAYS STILL IS.
|
|
14
|
-
* `PHYSICS_PT_add` (`properties_physics_common.py:55`) is a grid of
|
|
15
|
-
* `object.modifier_add` / `rigidbody.object_add` OPERATORS — editing, not
|
|
16
|
-
* inspection (ARCHITECTURE-CORE §Blender north star), and this view draws
|
|
17
|
-
* properties. What that row COMMUNICATES is which simulations the object has,
|
|
18
|
-
* and that is exactly which panels stand here: the context door resolves a
|
|
19
|
-
* path per simulation the way `physics_add`/`physics_add_special` test for
|
|
20
|
-
* one — the data for `obj.rigid_body`, `obj.rigid_body_constraint`,
|
|
21
|
-
* `obj.soft_body`, `obj.collision` and `obj.field`, and a MODIFIER of the
|
|
22
|
-
* right type for cloth, fluid and dynamic paint (Blender's `context.cloth` is
|
|
23
|
-
* the ClothModifier, and the panels read its `settings` structs). An absent
|
|
24
|
-
* simulation is an absent path and its panels do not draw.
|
|
25
|
-
*
|
|
26
|
-
* FLUID AND DYNAMIC PAINT STOP AT THEIR TYPE. Both are a modifier whose whole
|
|
27
|
-
* panel set is per-`fluid_type` / per-`ui_type` — domain, flow and effector
|
|
28
|
-
* are three different property surfaces, and dynamic paint's canvas splits
|
|
29
|
-
* again per surface. What stands here is the modifier's type row and the
|
|
30
|
-
* pointer to the settings struct the type selects, which drills into the
|
|
31
|
-
* generic view; transcribing three or four alternative panel sets each is the
|
|
32
|
-
* machinery the generic view exists to make unnecessary. Stated, not
|
|
33
|
-
* silently partial.
|
|
34
|
-
*
|
|
35
|
-
* It stands when: `buttons_context_path_object` — Physics shares Object's
|
|
36
|
-
* path, so the engine grants it whenever it grants Object. It is
|
|
37
|
-
* context-gated rather than standing because the Properties editor follows
|
|
38
|
-
* the ACTIVE OBJECT, not the row that was clicked.
|
|
39
|
-
*/
|
|
1
|
+
|
|
40
2
|
import { blenderPropertiesTabMatch, blenderPropertiesTabSection } from './blender-properties-tab';
|
|
41
3
|
import type { BlenderCuratedPanel } from './blender-properties-view';
|
|
42
4
|
|
|
@@ -578,8 +540,7 @@ const CURATED: readonly BlenderCuratedPanel[] = [
|
|
|
578
540
|
],
|
|
579
541
|
},
|
|
580
542
|
{
|
|
581
|
-
// properties_physics_fluid.py
|
|
582
|
-
// type and the settings pointer.
|
|
543
|
+
// properties_physics_fluid.py: show the type and settings pointers; each pointer drills into its properties.
|
|
583
544
|
title: 'Fluid',
|
|
584
545
|
from: 'Fluid',
|
|
585
546
|
properties: ['fluid_type', 'domain_settings', 'flow_settings', 'effector_settings'],
|
|
@@ -1,48 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BLENDER'S RENDER TAB, as a Properties section (WORK.md §Blender in the tab
|
|
3
|
-
* is Blender, "Inspection parity", I2). Blender's own panels over the RNA
|
|
4
|
-
* door, with the generic view beneath under "All properties".
|
|
5
|
-
*
|
|
6
|
-
* THE SPECIFICATION IS `scripts/startup/bl_ui/properties_render.py` at the
|
|
7
|
-
* engine's pin — `classes` (`:1186-1236`) is the panel order, `bl_label` the
|
|
8
|
-
* title, each `layout.prop(…)` an entry, `bl_parent_id` a `sub`. Blender's UI
|
|
9
|
-
* layer is never run, ported or recorded.
|
|
10
|
-
*
|
|
11
|
-
* THIS TAB IS WHERE THE ENGINE POLLS BECOME REAL, and it is the ONE `poll`
|
|
12
|
-
* this transcription reads. Every other condition is dropped because RNA
|
|
13
|
-
* already answers it — a property a datablock does not carry does not draw.
|
|
14
|
-
* `COMPAT_ENGINES` is different in kind: `scene.eevee` and `scene.display`
|
|
15
|
-
* exist under every engine, so nothing about the datablock says whether
|
|
16
|
-
* Blender would draw the panel. Each panel below carries Blender's own LIST
|
|
17
|
-
* (`COMPAT_ENGINES`, once per class) and it is checked against the ENGINE's
|
|
18
|
-
* live answer — `rna_context`'s `engine`, which is `scene.render.engine`,
|
|
19
|
-
* which is what `context.engine` is. The three ids a script can name here are
|
|
20
|
-
* CYCLES, BLENDER_EEVEE and BLENDER_WORKBENCH (`session.py::_register_engine`);
|
|
21
|
-
* the factory engine is BLENDER_EEVEE (`wasm/BUNDLE.json`), so the EEVEE
|
|
22
|
-
* panels are what a fresh file draws. Cycles' own panels are the add-on's, not
|
|
23
|
-
* `bl_ui`'s, and are therefore not in this file's specification.
|
|
24
|
-
*
|
|
25
|
-
* SEVERAL PANELS DRAW TWO DATABLOCKS IN ONE LIST — `RENDER_PT_eevee_film`
|
|
26
|
-
* (`:757`) takes `filter_size` and `film_transparent` off `scene.render` and
|
|
27
|
-
* `use_overscan`/`overscan_size` off `scene.eevee`, in that order. The
|
|
28
|
-
* qualified property form keeps the row in Blender's position while naming
|
|
29
|
-
* the datablock it comes from (`BlenderCuratedProperty`); the context door
|
|
30
|
-
* names every one of them as this tab's own paths.
|
|
31
|
-
*
|
|
32
|
-
* WHAT THE TRANSCRIPTION DELIBERATELY DROPS:
|
|
33
|
-
* - every operator and preset menu: `RENDER_PT_format_presets`,
|
|
34
|
-
* `RENDER_PT_eevee_raytracing_presets` (`:380`), the light-probe bake
|
|
35
|
-
* buttons. Inspection parity, not editing parity.
|
|
36
|
-
* - `template_curve_mapping` (the motion-blur shutter curve `:283`, the
|
|
37
|
-
* colour-management curves `:185`) and `template_colormanaged_view_settings`
|
|
38
|
-
* — curve widgets, which this view does not draw; the datablock is one
|
|
39
|
-
* drill away in the generic view beneath.
|
|
40
|
-
* - `RENDER_PT_hydra_debug` (`:1165`): its engine is HYDRA_STORM, which this
|
|
41
|
-
* build does not register, and its poll also wants a developer-UI
|
|
42
|
-
* preference.
|
|
43
|
-
*
|
|
44
|
-
* It stands when: `buttons_context_path_scene` — a scene always resolves.
|
|
45
|
-
*/
|
|
1
|
+
/** Blender’s Render Properties tab follows scripts/startup/bl_ui/properties_render.py at the engine pin. Curated panels read the RNA context’s datablocks; the generic view remains under All properties. Match tab availability and engine-specific panels against the live context. */
|
|
46
2
|
import { blenderPropertiesTabMatch, blenderPropertiesTabSection } from './blender-properties-tab';
|
|
47
3
|
import type { BlenderCuratedPanel } from './blender-properties-view';
|
|
48
4
|
|
|
@@ -1,38 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* BLENDER'S SCENE TAB, as a Properties section (WORK.md §Blender in the tab
|
|
3
|
-
* is Blender, "Inspection parity", I2). Blender's own panels over the RNA
|
|
4
|
-
* door, with the generic view beneath under "All properties".
|
|
5
|
-
*
|
|
6
|
-
* THE SPECIFICATION IS `scripts/startup/bl_ui/properties_scene.py` at the
|
|
7
|
-
* engine's pin — its `classes` tuple (`:471-488`) is the panel order,
|
|
8
|
-
* `bl_label` the title, each `layout.prop(scene, "x")` an entry in the order
|
|
9
|
-
* the draw function lists it, `bl_options = {'DEFAULT_CLOSED'}` a `closed`
|
|
10
|
-
* and `bl_parent_id` a `sub`. Blender's UI layer is never run, ported or
|
|
11
|
-
* recorded.
|
|
12
|
-
*
|
|
13
|
-
* SEVERAL OF THESE PANELS DRAW A SUB-STRUCT RATHER THAN THE SCENE: Units is
|
|
14
|
-
* `scene.unit_settings`, Rigid Body World is `scene.rigidbody_world`, Light
|
|
15
|
-
* Probes is `scene.eevee`. The context door names each of those beside the
|
|
16
|
-
* scene as one of this tab's own datablocks (`session.py::rna_context`), the
|
|
17
|
-
* way it already named the Output tab's `image_settings`, and each panel says
|
|
18
|
-
* which it reads with `from`. An absent one — a file with no rigid body world
|
|
19
|
-
* — is an absent path, and the panel does not draw: the same answer
|
|
20
|
-
* `RigidBodySubPanel.poll` gives (`:361-367`), from the door rather than from
|
|
21
|
-
* a copy of its condition.
|
|
22
|
-
*
|
|
23
|
-
* WHAT THE TRANSCRIPTION DELIBERATELY DROPS:
|
|
24
|
-
* - `SCENE_PT_context_scene` (`:37`, `bl_label = ""`) — the scene ID
|
|
25
|
-
* template, which is the host's identity row here.
|
|
26
|
-
* - the operator rows: `rigidbody.world_add`/`_remove` (`:357-359`), the
|
|
27
|
-
* keying-set list's add/remove, `object.lightprobe_cache_bake` (`:447`).
|
|
28
|
-
* Inspection parity, not editing parity (ARCHITECTURE-CORE §Blender north
|
|
29
|
-
* star) — an operator is not a property and this view draws properties.
|
|
30
|
-
* - `SCENE_PT_custom_props` (`:467`). Custom properties are IDProperties;
|
|
31
|
-
* they are not in `bl_rna.properties` and the door answers RNA. Same
|
|
32
|
-
* reading as the Object tab's.
|
|
33
|
-
*
|
|
34
|
-
* It stands when: `buttons_context_path_scene` — a scene always resolves.
|
|
35
|
-
*/
|
|
1
|
+
|
|
36
2
|
import { blenderPropertiesTabMatch, blenderPropertiesTabSection } from './blender-properties-tab';
|
|
37
3
|
import type { BlenderCuratedPanel } from './blender-properties-view';
|
|
38
4
|
import { resolveBlenderSubject } from './blender-properties-model';
|
|
@@ -1,52 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BLENDER'S TEXTURE TAB, as a Properties section (WORK.md §Blender in the tab
|
|
3
|
-
* is Blender, "Inspection parity", I2). Blender's own panels over the RNA
|
|
4
|
-
* door, with the generic view beneath under "All properties".
|
|
5
|
-
*
|
|
6
|
-
* THE SPECIFICATION IS `scripts/startup/bl_ui/properties_texture.py` at the
|
|
7
|
-
* engine's pin — `classes` (`:958-986`) is the panel order and `bl_label` the
|
|
8
|
-
* title — AND `space_buttons/buttons_texture.cc`, which is the only thing
|
|
9
|
-
* that can say WHICH texture this tab is about. Blender's UI layer is never
|
|
10
|
-
* run, ported or recorded.
|
|
11
|
-
*
|
|
12
|
-
* THIS TAB HAS NO DATABLOCK OF ITS OWN; IT HAS A USER.
|
|
13
|
-
* `buttons_texture_users_from_context` (`buttons_texture.cc:244-366`) walks
|
|
14
|
-
* the context for every struct holding a texture pointer, in this order: the
|
|
15
|
-
* scene's compositing node tree ("Compositor"), the active line style's slots
|
|
16
|
-
* and node tree ("Line Style"), the object's modifiers ("Modifiers"), the
|
|
17
|
-
* ACTIVE particle system's `part.mtex[]` ("Particles"), the object's force
|
|
18
|
-
* field when its type is TEXTURE ("Fields"), and the active paint brush's own
|
|
19
|
-
* two slots ("Brush"). `buttons_texture_context_compute` (`:369`) then takes
|
|
20
|
-
* user `ct->index` — 0 unless a person picks another from the menu — and the
|
|
21
|
-
* texture it points at is `context.texture`. The door mirrors that walk in
|
|
22
|
-
* the C's own order and names the resolved texture as this tab's first path,
|
|
23
|
-
* the holder as its second, and `bpy.data.textures` as its third; the whole
|
|
24
|
-
* user list is on the context as `textureUsers` for anything that wants it.
|
|
25
|
-
*
|
|
26
|
-
* A LIGHT IS NOT A TEXTURE USER AT THIS PIN, and it is worth saying because
|
|
27
|
-
* older Blenders make it a reasonable guess: the C never looks at `ob->data`.
|
|
28
|
-
* Lamp textures went with 2.8's renderer rewrite. Measured, not remembered.
|
|
29
|
-
*
|
|
30
|
-
* THE TYPE PANELS ARE THE `when` MECHANISM'S OTHER HOME. `TextureTypePanel`
|
|
31
|
-
* (`:167`) is `tex.type == cls.tex_type and not tex.use_nodes`, once per type
|
|
32
|
-
* — every one of those properties lives on the same `Texture` struct under
|
|
33
|
-
* every type, so RNA cannot answer it and the condition is read from the
|
|
34
|
-
* engine's live value.
|
|
35
|
-
*
|
|
36
|
-
* WHAT THE TRANSCRIPTION DELIBERATELY DROPS:
|
|
37
|
-
* - `TEXTURE_PT_preview` (`:68`) and `TEXTURE_PT_context` (`:99`) — a
|
|
38
|
-
* `template_preview` render and the user-picker/ID templates. The picker
|
|
39
|
-
* is an editing widget; what it selects is the context door's answer here.
|
|
40
|
-
* - `TEXTURE_PT_node` (`:143`), `template_node_view` over the active texture
|
|
41
|
-
* node — the read-only node view is I5.
|
|
42
|
-
* - `template_image` (`:404`) and `template_color_ramp` (`:910`) — an image
|
|
43
|
-
* browser and a ramp widget; the `image` pointer and the `color_ramp`
|
|
44
|
-
* pointer stand and drill.
|
|
45
|
-
* - `TEXTURE_PT_custom_props` (`:953`), IDProperties rather than RNA.
|
|
46
|
-
*
|
|
47
|
-
* It stands when: the door's mirror of `buttons_texture_context_compute`
|
|
48
|
-
* finds a user, or the file holds textures at all.
|
|
49
|
-
*/
|
|
1
|
+
/** Blender’s Texture Properties tab follows scripts/startup/bl_ui/properties_texture.py at the engine pin. Curated panels read the RNA context’s datablocks; the generic view remains under All properties. Match tab availability and engine-specific panels against the live context. */
|
|
50
2
|
import { blenderPropertiesTabMatch, blenderPropertiesTabSection } from './blender-properties-tab';
|
|
51
3
|
import type { BlenderCuratedPanel } from './blender-properties-view';
|
|
52
4
|
|
|
@@ -1,32 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BLENDER'S VIEW LAYER TAB, as a Properties section (WORK.md §Blender in the
|
|
3
|
-
* tab is Blender, "Inspection parity", I2). Blender's own panels over the RNA
|
|
4
|
-
* door, with the generic view beneath under "All properties".
|
|
5
|
-
*
|
|
6
|
-
* THE SPECIFICATION IS `scripts/startup/bl_ui/properties_view_layer.py` at the
|
|
7
|
-
* engine's pin — `classes` (`:345-360`) is the panel order, `bl_label` the
|
|
8
|
-
* title, each `layout.prop(view_layer, "x")` an entry. Blender's UI layer is
|
|
9
|
-
* never run, ported or recorded.
|
|
10
|
-
*
|
|
11
|
-
* THE PASSES PANEL IS TWO PANELS UNDER TWO ENGINES, and that is why this tab
|
|
12
|
-
* reads `COMPAT_ENGINES`. `VIEWLAYER_PT_eevee_layer_passes_data` (`:111`) and
|
|
13
|
-
* `VIEWLAYER_PT_workbench_layer_passes_data` (`:137`) carry the SAME
|
|
14
|
-
* `bl_label` ("Data") and differ only by engine — Workbench shows three
|
|
15
|
-
* passes where EEVEE shows seven, off the same `ViewLayer` datablock. Nothing
|
|
16
|
-
* about the datablock could say which; `rna_context`'s `engine` does. The
|
|
17
|
-
* Light panel (`:156`) is EEVEE-only for the same reason, and it also reads
|
|
18
|
-
* `view_layer.eevee`, which the context door names beside the layer.
|
|
19
|
-
*
|
|
20
|
-
* WHAT THE TRANSCRIPTION DELIBERATELY DROPS: `VIEWLAYER_PT_context_layer`
|
|
21
|
-
* (`:51`, `bl_label = ""`) — the layer search template, the host's identity
|
|
22
|
-
* row here; `VIEWLAYER_PT_layer_custom_props` (`:340`), IDProperties rather
|
|
23
|
-
* than RNA; and the AOV / light-group add-remove operators, which are
|
|
24
|
-
* editing rather than inspection. The two lists themselves are here as their
|
|
25
|
-
* collections.
|
|
26
|
-
*
|
|
27
|
-
* It stands when: `buttons_context_path_view_layer` — the window's view layer
|
|
28
|
-
* always resolves.
|
|
29
|
-
*/
|
|
1
|
+
/** Blender’s View Layer Properties tab follows scripts/startup/bl_ui/properties_view_layer.py at the engine pin. Curated panels read the RNA context’s datablocks; the generic view remains under All properties. Match tab availability and engine-specific panels against the live context. */
|
|
30
2
|
import { blenderPropertiesTabMatch, blenderPropertiesTabSection } from './blender-properties-tab';
|
|
31
3
|
import type { BlenderCuratedPanel } from './blender-properties-view';
|
|
32
4
|
|
|
@@ -1,48 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* BLENDER'S WORLD TAB, as a Properties section (WORK.md §Blender in the tab
|
|
3
|
-
* is Blender, "Inspection parity", I2). Blender's own panels over the RNA
|
|
4
|
-
* door, with the generic view beneath under "All properties".
|
|
5
|
-
*
|
|
6
|
-
* THE SPECIFICATION IS `scripts/startup/bl_ui/properties_world.py` at the
|
|
7
|
-
* engine's pin — `classes` (`:266-278`) is the panel order, `bl_label` the
|
|
8
|
-
* title, each `layout.prop(world, "x")` an entry. Blender's UI layer is never
|
|
9
|
-
* run, ported or recorded.
|
|
10
|
-
*
|
|
11
|
-
* SURFACE AND VOLUME ARE A NODE TREE, AND THIS IS NOT THE NODE VIEW.
|
|
12
|
-
* `EEVEE_WORLD_PT_surface` (`:109`) asks the world's node tree for its EEVEE
|
|
13
|
-
* output node and draws that node's `Surface` input with
|
|
14
|
-
* `template_node_view`; Volume (`:140`) is the same call on the `Volume`
|
|
15
|
-
* input. Reading those values as a flat list means walking the tree back
|
|
16
|
-
* through its links, which is I5's read-only node view (§Inspection parity,
|
|
17
|
-
* I5) — half of it here would be a second, worse implementation of the same
|
|
18
|
-
* walk. Exactly the reading the Material tab already made for its own Surface
|
|
19
|
-
* panel. What stands in these two panels is what the WORLD datablock itself
|
|
20
|
-
* holds: `use_nodes` and the `node_tree` pointer, which drills into the
|
|
21
|
-
* generic view, plus the volume flag Blender's own panel reads off the world
|
|
22
|
-
* (`use_eevee_finite_volume`, `:159`).
|
|
23
|
-
*
|
|
24
|
-
* THE TAB'S TONE IS THE SHADING RED. `UI_icons.hh:193` declares WORLD under
|
|
25
|
-
* `DEF_ICON_SHADING`, the same group as Material — corrected from a guess
|
|
26
|
-
* during I2's first landing, and the reason the scene group is four tabs
|
|
27
|
-
* rather than six.
|
|
28
|
-
*
|
|
29
|
-
* WHAT THE TRANSCRIPTION DELIBERATELY DROPS: `WORLD_PT_context_world`
|
|
30
|
-
* (`:24`, `bl_label = ""`) — the world ID template, the host's identity row
|
|
31
|
-
* here; the `world.convert_volume_to_mesh` operator (`:165`); and
|
|
32
|
-
* `WORLD_PT_custom_props` (`:99`), IDProperties rather than RNA.
|
|
33
|
-
*
|
|
34
|
-
* It stands when: `buttons_context_path_world` returns true from the scene
|
|
35
|
-
* alone, so the tab stands even when the scene holds no world — and then
|
|
36
|
-
* every panel here finds no datablock and none of them draw.
|
|
37
|
-
*/
|
|
1
|
+
/** Blender’s World Properties tab follows scripts/startup/bl_ui/properties_world.py at the engine pin. Curated panels read the RNA context’s datablocks; the generic view remains under All properties. Match tab availability and engine-specific panels against the live context. */
|
|
38
2
|
import { blenderPropertiesTabMatch, blenderPropertiesTabSection } from './blender-properties-tab';
|
|
39
3
|
import type { BlenderCuratedPanel } from './blender-properties-view';
|
|
40
4
|
|
|
41
5
|
/** `properties_world.py`, panel by panel. Line numbers are that file's. */
|
|
42
6
|
const CURATED: readonly BlenderCuratedPanel[] = [
|
|
43
7
|
{
|
|
44
|
-
// EEVEE_WORLD_PT_surface, :109
|
|
45
|
-
// world's own node properties rather than the shader's inputs.
|
|
8
|
+
// EEVEE_WORLD_PT_surface, :109. Read the world’s node properties; shader inputs belong to its node tree.
|
|
46
9
|
title: 'Surface',
|
|
47
10
|
engine: ['BLENDER_EEVEE'],
|
|
48
11
|
properties: ['use_nodes', 'node_tree'],
|
|
@@ -1,56 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The SHADING workspace — Blender's own: the 3D viewport over the Shader
|
|
3
|
-
* Editor, with the Outliner above the Properties editor on the right.
|
|
4
|
-
*
|
|
5
|
-
* THE PROPORTIONS ARE BLENDER'S, MEASURED THROUGH bpy on the engine in the
|
|
6
|
-
* tab (2026-09-19), not eyeballed from a screenshot:
|
|
7
|
-
* `bpy.data.workspaces['Shading'].screens[0].areas` answers, in a 1920-wide
|
|
8
|
-
* window, PROPERTIES `x1579 y23 w339 h839`, OUTLINER `x1579 y865 w339 h189`,
|
|
9
|
-
* VIEW_3D `x294 y540 w1282 h514`, NODE_EDITOR `x294 y23 w1282 h514`,
|
|
10
|
-
* FILE_BROWSER `x2 y540 w289 h514` and IMAGE_EDITOR `x2 y23 w289 h514`.
|
|
11
|
-
*
|
|
12
|
-
* AND THE ARRANGEMENT IS A LIVE CAPTURE, not a hand-derived one
|
|
13
|
-
* (`workspace-preset-layouts.ts`: "Shipped defaults are authored by arranging
|
|
14
|
-
* live and snapshotting `toJSON`" — never hand-written JSON). Hand-deriving it
|
|
15
|
-
* from Model's cost exactly what that rule exists to prevent: sizes authored
|
|
16
|
-
* against Model's 928-px grid were applied to an 824-px container, the dock
|
|
17
|
-
* measured `grid 1920×802 in a 1920×824 container` and warned that it was
|
|
18
|
-
* "forcing one relayout" (measured live, 2026-09-19 — and measured again on
|
|
19
|
-
* three Model/Sculpt switches with no Shading in them, which raised nothing,
|
|
20
|
-
* so the warning was this arrangement's own). What ships is the settled grid,
|
|
21
|
-
* with two sizes set back to the measurement: the vertical split to an exact
|
|
22
|
-
* 50/50 of the grid's own height, and the right column to Model's 306/173/755,
|
|
23
|
-
* which is the same column and already carries Blender's 0.177/0.184.
|
|
24
|
-
*
|
|
25
|
-
* Two readings out of that, and both are in `shading-arrangement.json`:
|
|
26
|
-
* the right column is 339/1920 = 0.177 of the window with the Outliner taking
|
|
27
|
-
* 189/1028 = 0.184 of it — the SAME column the Modeling workspace has, which
|
|
28
|
-
* is why this arrangement is Model's with one change; and the centre column is
|
|
29
|
-
* split EXACTLY 50/50, 514 over 514 of the 1031 px between the top bar and the
|
|
30
|
-
* status bar. On the captured 928-px grid that is 464/464, which is the size
|
|
31
|
-
* `volter:bottom-center` was already carrying at `"visible": false`.
|
|
32
|
-
*
|
|
33
|
-
* WHICH AREA THE SHADER EDITOR IS, AND WHAT IT IS MADE OF. Blender's node
|
|
34
|
-
* editor is the area BELOW the viewport — and an AREA IS AN EDITOR GROUP
|
|
35
|
-
* (orchestrator ruling 2026-09-19), not the bottom utility drawer. So Shading
|
|
36
|
-
* declares it as an `areas` entry holding the `blender-node-editor.document`
|
|
37
|
-
* contribution, the dock puts it in `volter:area:shader` below the centre at
|
|
38
|
-
* Blender's own 50/50, and the frame's layout host puts the same document in
|
|
39
|
-
* a second VS Code editor group. The drawer is `hidden` here, as it is in
|
|
40
|
-
* Model: Blender's Shading screen has no utility strip.
|
|
41
|
-
*
|
|
42
|
-
* WHAT IS NOT REPRODUCED, named rather than silently dropped: Blender's
|
|
43
|
-
* Shading workspace also carries a File Browser over an Image Editor in a
|
|
44
|
-
* 289-px LEFT column (15.0 % of the window). Neither editor exists here yet —
|
|
45
|
-
* the image/texture view is I5's Texture Paint unit and the asset browser is
|
|
46
|
-
* a different surface — and §Editor chrome's rule is that a reserved panel
|
|
47
|
-
* ships WITH its capability, never as empty chrome. The column arrives with
|
|
48
|
-
* the editors that fill it.
|
|
49
|
-
*
|
|
50
|
-
* THE STRIP GROWS ONLY AS A VIEW LANDS (§Editor chrome; WORK.md I5). Shading
|
|
51
|
-
* appears in the workspace strip because this contribution exists, and this
|
|
52
|
-
* contribution exists because the node view does.
|
|
53
|
-
*/
|
|
1
|
+
/** The Shading workspace places the Shader Editor below the 3D view in equal halves, with Outliner over Properties at right. The arrangement is a captured dock layout. File Browser and Image Editor areas are omitted until their editors exist. */
|
|
54
2
|
|
|
55
3
|
import type { WorkspaceLayoutContribution } from '@volter/sdk/looks';
|
|
56
4
|
import { BLENDER_REGIONS } from '../src/regions';
|
|
@@ -71,32 +19,9 @@ export const layout: WorkspaceLayoutContribution = {
|
|
|
71
19
|
header: 'shown',
|
|
72
20
|
shelf: 'shown',
|
|
73
21
|
inspector: 'properties',
|
|
74
|
-
//
|
|
75
|
-
// area beyond the viewport, the node editor and the right column, and the
|
|
76
|
-
// node editor is not a drawer utility — it is an AREA, which is an EDITOR
|
|
77
|
-
// GROUP (the ruling below). Leaving the drawer `shown` would paint an
|
|
78
|
-
// empty utility strip Blender's own screen does not have.
|
|
22
|
+
// Hide the utility drawer; the Shader Editor is a document area.
|
|
79
23
|
drawer: 'hidden',
|
|
80
24
|
},
|
|
81
|
-
//
|
|
82
|
-
//
|
|
83
|
-
// RULED 2026-09-19 (orchestrator): "A Blender editor AREA is an editor
|
|
84
|
-
// group; the drawer holds utilities." Blender's Shading screen splits the
|
|
85
|
-
// centre TOP AND BOTTOM — VIEW_3D `x294 y540 w1282 h514` over NODE_EDITOR
|
|
86
|
-
// `x294 y23 w1282 h514`, measured through bpy on the engine — and both the
|
|
87
|
-
// dock and the Code-OSS frame have exactly that shape in editor groups. So
|
|
88
|
-
// the Shader Editor is a `workspace.document` this workspace opens into
|
|
89
|
-
// `volter:area:shader`, not a `workspace.utility` in the drawer.
|
|
90
|
-
//
|
|
91
|
-
// AND THAT IS WHAT RETIRED THE DRAWER RACE BY CONSTRUCTION. Switching to UV
|
|
92
|
-
// Editing kept opening the Shader Editor — and the cause was NOT the dock
|
|
93
|
-
// ordering the previous landing named: `uv-editing-arrangement.json`'s
|
|
94
|
-
// mechanical substitution had missed two of the seven occurrences (the
|
|
95
|
-
// panel record's `params.utilityId` and its `title`), so the leaf carrying
|
|
96
|
-
// the UV panel's id rendered the NODE editor and called itself "Shader
|
|
97
|
-
// Editor". A view that is not in the drawer cannot have that defect at all.
|
|
98
|
-
//
|
|
99
|
-
// THE RATIO IS BLENDER'S OWN: 514 of the 1028 px the centre column spans,
|
|
100
|
-
// an exact 0.5 to within the 1-px splitter.
|
|
25
|
+
// Open the Shader Editor in the bottom editor group at half the centre-column height.
|
|
101
26
|
areas: [{ id: 'shader', document: 'blender-node-editor.document', place: 'below', ratio: 0.5 }],
|
|
102
27
|
};
|