@volter/editor-blender 0.1.0

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.
Files changed (58) hide show
  1. package/LICENSE +1409 -0
  2. package/README.md +17 -0
  3. package/contributions/blender-header-menus.tsx +483 -0
  4. package/contributions/blender-icon-trace.mjs +403 -0
  5. package/contributions/blender-icons.source.mjs +2925 -0
  6. package/contributions/blender-node-editor.document.tsx +1402 -0
  7. package/contributions/blender-node-geometry.ts +1138 -0
  8. package/contributions/blender-node-panels.source.mjs +485 -0
  9. package/contributions/blender-outliner-authoring.ts +1729 -0
  10. package/contributions/blender-outliner-model.ts +389 -0
  11. package/contributions/blender-palette.source.mjs +319 -0
  12. package/contributions/blender-properties-model.ts +351 -0
  13. package/contributions/blender-properties-tab.tsx +100 -0
  14. package/contributions/blender-properties-view.tsx +1191 -0
  15. package/contributions/blender-runtime-skin.ts +619 -0
  16. package/contributions/blender-runtime.document.tsx +232 -0
  17. package/contributions/blender-timeline-geometry.ts +323 -0
  18. package/contributions/blender-timeline.document.tsx +1056 -0
  19. package/contributions/blender-uv-editor.document.tsx +483 -0
  20. package/contributions/blender-uv-geometry.ts +305 -0
  21. package/contributions/blender-version.status.tsx +93 -0
  22. package/contributions/blender.command.ts +102 -0
  23. package/contributions/blender.icons.json +1247 -0
  24. package/contributions/blender.icons.traced.json +1561 -0
  25. package/contributions/blender.keymap.ts +39 -0
  26. package/contributions/blender.node-panels.json +2436 -0
  27. package/contributions/blender.palette.json +93 -0
  28. package/contributions/blender.status.tsx +263 -0
  29. package/contributions/blender.style.ts +271 -0
  30. package/contributions/model.layout.ts +53 -0
  31. package/contributions/models.finder.ts +59 -0
  32. package/contributions/properties-bone-constraints.inspector.tsx +50 -0
  33. package/contributions/properties-bone.inspector.tsx +184 -0
  34. package/contributions/properties-collection.inspector.tsx +96 -0
  35. package/contributions/properties-constraints.inspector.tsx +69 -0
  36. package/contributions/properties-data.inspector.tsx +229 -0
  37. package/contributions/properties-material.inspector.tsx +121 -0
  38. package/contributions/properties-modifiers.inspector.tsx +74 -0
  39. package/contributions/properties-object.inspector.tsx +215 -0
  40. package/contributions/properties-output.inspector.tsx +210 -0
  41. package/contributions/properties-particles.inspector.tsx +494 -0
  42. package/contributions/properties-physics.inspector.tsx +614 -0
  43. package/contributions/properties-render.inspector.tsx +446 -0
  44. package/contributions/properties-scene.inspector.tsx +174 -0
  45. package/contributions/properties-texture.inspector.tsx +300 -0
  46. package/contributions/properties-view-layer.inspector.tsx +145 -0
  47. package/contributions/properties-world.inspector.tsx +130 -0
  48. package/contributions/sculpt.layout.ts +25 -0
  49. package/contributions/shading.layout.ts +99 -0
  50. package/contributions/texture.layout.ts +16 -0
  51. package/contributions/uv-editing.layout.ts +93 -0
  52. package/host/blender-runtime-host.ts +1256 -0
  53. package/package.json +77 -0
  54. package/src/layouts.tsx +48 -0
  55. package/src/looks.ts +14 -0
  56. package/src/node-view-state.ts +125 -0
  57. package/src/timeline-view-state.ts +154 -0
  58. package/src/uv-view-state.ts +125 -0
@@ -0,0 +1,614 @@
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
+ */
40
+ import { blenderPropertiesTabMatch, blenderPropertiesTabSection } from './blender-properties-tab';
41
+ import type { BlenderCuratedPanel } from './blender-properties-view';
42
+
43
+ const CURATED: readonly BlenderCuratedPanel[] = [
44
+ {
45
+ // PHYSICS_PT_rigid_body, properties_physics_rigidbody.py:22.
46
+ title: 'Rigid Body',
47
+ from: 'Rigid Body',
48
+ properties: ['type'],
49
+ sub: [
50
+ // PHYSICS_PT_rigid_body_settings, :60.
51
+ { title: 'Settings', from: 'Rigid Body', properties: ['mass', 'kinematic', 'enabled'] },
52
+ {
53
+ // PHYSICS_PT_rigid_body_collisions, :96.
54
+ title: 'Collisions',
55
+ from: 'Rigid Body',
56
+ properties: ['collision_shape', 'mesh_source', 'use_deform'],
57
+ sub: [
58
+ // PHYSICS_PT_rigid_body_collisions_surface, :149.
59
+ {
60
+ title: 'Surface Response',
61
+ closed: true,
62
+ from: 'Rigid Body',
63
+ properties: ['friction', 'restitution'],
64
+ },
65
+ // PHYSICS_PT_rigid_body_collisions_sensitivity, :181.
66
+ {
67
+ title: 'Sensitivity',
68
+ closed: true,
69
+ from: 'Rigid Body',
70
+ properties: ['use_margin', 'collision_margin'],
71
+ },
72
+ // PHYSICS_PT_rigid_body_collisions_collections, :222.
73
+ {
74
+ title: 'Collections',
75
+ closed: true,
76
+ from: 'Rigid Body',
77
+ properties: ['collision_collections'],
78
+ },
79
+ ],
80
+ },
81
+ {
82
+ // PHYSICS_PT_rigid_body_dynamics, :248 — `obj.rigid_body.type ==
83
+ // 'ACTIVE'` is in its poll (:277).
84
+ title: 'Dynamics',
85
+ closed: true,
86
+ from: 'Rigid Body',
87
+ when: [{ from: 'Rigid Body', property: 'type', is: ['ACTIVE'] }],
88
+ properties: ['linear_damping', 'angular_damping'],
89
+ sub: [
90
+ // PHYSICS_PT_rigid_body_dynamics_deactivation, :287.
91
+ {
92
+ title: 'Deactivation',
93
+ closed: true,
94
+ from: 'Rigid Body',
95
+ properties: [
96
+ 'use_deactivation',
97
+ 'use_start_deactivated',
98
+ 'deactivate_linear_velocity',
99
+ 'deactivate_angular_velocity',
100
+ ],
101
+ },
102
+ ],
103
+ },
104
+ ],
105
+ },
106
+ {
107
+ // PHYSICS_PT_rigid_body_constraint,
108
+ // properties_physics_rigidbody_constraint.py:16.
109
+ title: 'Rigid Body Constraint',
110
+ from: 'Rigid Body Constraint',
111
+ properties: ['type'],
112
+ sub: [
113
+ // _settings, :39.
114
+ {
115
+ title: 'Settings',
116
+ from: 'Rigid Body Constraint',
117
+ properties: ['enabled', 'disable_collisions', 'use_breaking', 'breaking_threshold'],
118
+ },
119
+ // _objects, :74.
120
+ {
121
+ title: 'Objects',
122
+ from: 'Rigid Body Constraint',
123
+ properties: ['object1', 'object2'],
124
+ },
125
+ // _override_iterations, :99.
126
+ {
127
+ title: 'Override Iterations',
128
+ closed: true,
129
+ from: 'Rigid Body Constraint',
130
+ properties: ['use_override_solver_iterations', 'solver_iterations'],
131
+ },
132
+ {
133
+ // _limits, :129 — an empty body with a Linear (:152) and an Angular
134
+ // (:215) child.
135
+ title: 'Limits',
136
+ closed: true,
137
+ from: 'Rigid Body Constraint',
138
+ properties: [],
139
+ sub: [
140
+ {
141
+ title: 'Linear',
142
+ from: 'Rigid Body Constraint',
143
+ properties: [
144
+ 'use_limit_lin_x',
145
+ 'limit_lin_x_lower',
146
+ 'limit_lin_x_upper',
147
+ 'use_limit_lin_y',
148
+ 'limit_lin_y_lower',
149
+ 'limit_lin_y_upper',
150
+ 'use_limit_lin_z',
151
+ 'limit_lin_z_lower',
152
+ 'limit_lin_z_upper',
153
+ ],
154
+ },
155
+ {
156
+ title: 'Angular',
157
+ from: 'Rigid Body Constraint',
158
+ properties: [
159
+ 'use_limit_ang_x',
160
+ 'limit_ang_x_lower',
161
+ 'limit_ang_x_upper',
162
+ 'use_limit_ang_y',
163
+ 'limit_ang_y_lower',
164
+ 'limit_ang_y_upper',
165
+ 'use_limit_ang_z',
166
+ 'limit_ang_z_lower',
167
+ 'limit_ang_z_upper',
168
+ ],
169
+ },
170
+ ],
171
+ },
172
+ {
173
+ // _motor, :287, with its Linear (:354) and Angular (:310) children.
174
+ title: 'Motor',
175
+ closed: true,
176
+ from: 'Rigid Body Constraint',
177
+ properties: [],
178
+ sub: [
179
+ {
180
+ title: 'Linear',
181
+ from: 'Rigid Body Constraint',
182
+ properties: ['use_motor_lin', 'motor_lin_target_velocity', 'motor_lin_max_impulse'],
183
+ },
184
+ {
185
+ title: 'Angular',
186
+ from: 'Rigid Body Constraint',
187
+ properties: ['use_motor_ang', 'motor_ang_target_velocity', 'motor_ang_max_impulse'],
188
+ },
189
+ ],
190
+ },
191
+ {
192
+ // _springs, :396 — the per-axis stiffness/damping rows are its two
193
+ // children and stay in the generic view beneath.
194
+ title: 'Springs',
195
+ closed: true,
196
+ from: 'Rigid Body Constraint',
197
+ properties: ['spring_type'],
198
+ },
199
+ ],
200
+ },
201
+ {
202
+ // PHYSICS_PT_cloth, properties_physics_cloth.py:38 — `cloth =
203
+ // md.settings` (:58), which the door names as this path.
204
+ title: 'Cloth',
205
+ from: 'Cloth',
206
+ properties: ['quality', 'time_scale'],
207
+ sub: [
208
+ {
209
+ // _physical_properties, :66.
210
+ title: 'Physical Properties',
211
+ from: 'Cloth',
212
+ properties: ['mass', 'air_damping', 'bending_model'],
213
+ sub: [
214
+ // _stiffness, :94.
215
+ {
216
+ title: 'Stiffness',
217
+ from: 'Cloth',
218
+ properties: [
219
+ 'tension_stiffness',
220
+ 'compression_stiffness',
221
+ 'shear_stiffness',
222
+ 'bending_stiffness',
223
+ ],
224
+ },
225
+ // _damping, :129.
226
+ {
227
+ title: 'Damping',
228
+ from: 'Cloth',
229
+ properties: [
230
+ 'tension_damping',
231
+ 'compression_damping',
232
+ 'shear_damping',
233
+ 'bending_damping',
234
+ ],
235
+ },
236
+ // _internal_springs, :164 — `use_internal_springs` is the header.
237
+ {
238
+ title: 'Internal Springs',
239
+ closed: true,
240
+ from: 'Cloth',
241
+ properties: [
242
+ 'use_internal_springs',
243
+ 'internal_spring_max_length',
244
+ 'internal_spring_max_diversion',
245
+ 'internal_spring_normal_check',
246
+ 'internal_tension_stiffness',
247
+ 'internal_compression_stiffness',
248
+ 'internal_tension_stiffness_max',
249
+ 'internal_compression_stiffness_max',
250
+ 'vertex_group_intern',
251
+ ],
252
+ },
253
+ // _pressure, :210 — `use_pressure` is the header.
254
+ {
255
+ title: 'Pressure',
256
+ closed: true,
257
+ from: 'Cloth',
258
+ properties: [
259
+ 'use_pressure',
260
+ 'uniform_pressure_force',
261
+ 'use_pressure_volume',
262
+ 'target_volume',
263
+ 'pressure_factor',
264
+ 'fluid_density',
265
+ 'vertex_group_pressure',
266
+ ],
267
+ },
268
+ ],
269
+ },
270
+ // _cache, :257 — `point_cache_ui(self, md.point_cache, …)`, and the
271
+ // point cache is the MODIFIER's, not the settings'.
272
+ { title: 'Cache', closed: true, from: 'Cloth Modifier', properties: ['point_cache'] },
273
+ // _shape, :272.
274
+ {
275
+ title: 'Shape',
276
+ closed: true,
277
+ from: 'Cloth',
278
+ properties: [
279
+ 'vertex_group_mass',
280
+ 'pin_stiffness',
281
+ 'use_sewing_springs',
282
+ 'sewing_force_max',
283
+ 'shrink_min',
284
+ 'use_dynamic_mesh',
285
+ 'rest_shape_key',
286
+ ],
287
+ },
288
+ {
289
+ // _collision, :326 — `collision_quality` is the cloth SETTINGS', the
290
+ // two children read `md.collision_settings`.
291
+ title: 'Collisions',
292
+ closed: true,
293
+ from: 'Cloth',
294
+ properties: ['collision_quality'],
295
+ sub: [
296
+ // _object_collision, :351.
297
+ {
298
+ title: 'Object Collisions',
299
+ from: 'Cloth Collisions',
300
+ properties: [
301
+ 'use_collision',
302
+ 'distance_min',
303
+ 'impulse_clamp',
304
+ 'vertex_group_object_collisions',
305
+ 'collection',
306
+ ],
307
+ },
308
+ // _self_collision, :391.
309
+ {
310
+ title: 'Self Collisions',
311
+ from: 'Cloth Collisions',
312
+ properties: [
313
+ 'use_self_collision',
314
+ 'self_friction',
315
+ 'self_distance_min',
316
+ 'self_impulse_clamp',
317
+ ],
318
+ },
319
+ ],
320
+ },
321
+ // _field_weights, :489 — `effector_weights_ui` over the settings' own.
322
+ {
323
+ title: 'Field Weights',
324
+ closed: true,
325
+ from: 'Cloth',
326
+ properties: ['effector_weights'],
327
+ },
328
+ ],
329
+ },
330
+ {
331
+ // PHYSICS_PT_softbody, properties_physics_softbody.py:31 — `softbody =
332
+ // md.settings`, which is `obj.soft_body`.
333
+ title: 'Soft Body',
334
+ from: 'Soft Body',
335
+ properties: ['collision_collection'],
336
+ sub: [
337
+ // _object, :49.
338
+ {
339
+ title: 'Object',
340
+ closed: true,
341
+ from: 'Soft Body',
342
+ properties: ['friction', 'mass', 'vertex_group_mass'],
343
+ },
344
+ // _simulation, :81.
345
+ { title: 'Simulation', closed: true, from: 'Soft Body', properties: ['speed'] },
346
+ // _goal, :118 — `use_goal` is the header checkbox.
347
+ {
348
+ title: 'Goal',
349
+ closed: true,
350
+ from: 'Soft Body',
351
+ properties: ['use_goal', 'vertex_group_goal'],
352
+ sub: [
353
+ // _goal_strengths, :147.
354
+ {
355
+ title: 'Strengths',
356
+ closed: true,
357
+ from: 'Soft Body',
358
+ properties: ['goal_default', 'goal_min', 'goal_max'],
359
+ },
360
+ // _goal_settings, :177.
361
+ {
362
+ title: 'Settings',
363
+ closed: true,
364
+ from: 'Soft Body',
365
+ properties: ['goal_spring', 'goal_friction'],
366
+ },
367
+ ],
368
+ },
369
+ // _edge, :204 — `use_edges` is the header checkbox.
370
+ {
371
+ title: 'Edges',
372
+ closed: true,
373
+ from: 'Soft Body',
374
+ properties: [
375
+ 'use_edges',
376
+ 'vertex_group_spring',
377
+ 'pull',
378
+ 'push',
379
+ 'damping',
380
+ 'plastic',
381
+ 'bend',
382
+ 'spring_length',
383
+ 'use_edge_collision',
384
+ 'use_face_collision',
385
+ ],
386
+ sub: [
387
+ // _edge_aerodynamics, :259.
388
+ {
389
+ title: 'Aerodynamics',
390
+ closed: true,
391
+ from: 'Soft Body',
392
+ properties: ['aerodynamics_type', 'aero'],
393
+ },
394
+ // _edge_stiffness, :286.
395
+ {
396
+ title: 'Stiffness',
397
+ closed: true,
398
+ from: 'Soft Body',
399
+ properties: ['use_stiff_quads', 'shear'],
400
+ },
401
+ ],
402
+ },
403
+ // _collision, :314 — `use_self_collision` is the header checkbox.
404
+ {
405
+ title: 'Self Collision',
406
+ closed: true,
407
+ from: 'Soft Body',
408
+ properties: [
409
+ 'use_self_collision',
410
+ 'collision_type',
411
+ 'ball_size',
412
+ 'ball_stiff',
413
+ 'ball_damp',
414
+ ],
415
+ },
416
+ {
417
+ // _solver, :353.
418
+ title: 'Solver',
419
+ closed: true,
420
+ from: 'Soft Body',
421
+ properties: ['step_min', 'step_max', 'use_auto_step', 'error_threshold'],
422
+ sub: [
423
+ // _solver_diagnostics, :382.
424
+ {
425
+ title: 'Diagnostics',
426
+ closed: true,
427
+ from: 'Soft Body',
428
+ properties: ['use_diagnose', 'use_estimate_matrix'],
429
+ },
430
+ // _solver_helpers, :405.
431
+ {
432
+ title: 'Helpers',
433
+ closed: true,
434
+ from: 'Soft Body',
435
+ properties: ['choke', 'fuzzy'],
436
+ },
437
+ ],
438
+ },
439
+ // _field_weights, :432.
440
+ {
441
+ title: 'Field Weights',
442
+ closed: true,
443
+ from: 'Soft Body',
444
+ properties: ['effector_weights'],
445
+ },
446
+ // _cache, :103 — the modifier's, as Cloth's is.
447
+ { title: 'Cache', closed: true, from: 'Soft Body Modifier', properties: ['point_cache'] },
448
+ ],
449
+ },
450
+ {
451
+ // PHYSICS_PT_field, properties_physics_field.py:33.
452
+ title: 'Force Fields',
453
+ from: 'Force Field',
454
+ properties: ['type'],
455
+ sub: [
456
+ {
457
+ // _field_settings, :58 — one draw function for every field type; the
458
+ // rows a type does not carry are simply not on its RNA.
459
+ title: 'Settings',
460
+ from: 'Force Field',
461
+ properties: [
462
+ 'shape',
463
+ 'strength',
464
+ 'flow',
465
+ 'apply_to_location',
466
+ 'apply_to_rotation',
467
+ 'source_object',
468
+ 'use_smoke_density',
469
+ 'falloff_power',
470
+ 'use_max_distance',
471
+ 'distance_max',
472
+ 'texture_mode',
473
+ 'texture_nabla',
474
+ 'use_object_coords',
475
+ 'use_2d_force',
476
+ 'guide_free',
477
+ 'use_guide_path_add',
478
+ 'use_guide_path_weight',
479
+ 'guide_clump_amount',
480
+ 'guide_clump_shape',
481
+ 'guide_minimum',
482
+ ],
483
+ sub: [
484
+ {
485
+ // _field_settings_kink, :149 — `ob.field.type == 'GUIDE'` (:157).
486
+ title: 'Kink',
487
+ from: 'Force Field',
488
+ when: [{ from: 'Force Field', property: 'type', is: ['GUIDE'] }],
489
+ properties: [
490
+ 'guide_kink_type',
491
+ 'guide_kink_axis',
492
+ 'guide_kink_frequency',
493
+ 'guide_kink_shape',
494
+ 'guide_kink_amplitude',
495
+ ],
496
+ },
497
+ {
498
+ // _field_settings_texture_select, :187 — `type == 'TEXTURE'`.
499
+ title: 'Texture',
500
+ from: 'Force Field',
501
+ when: [{ from: 'Force Field', property: 'type', is: ['TEXTURE'] }],
502
+ properties: ['texture'],
503
+ },
504
+ ],
505
+ },
506
+ {
507
+ // _field_falloff, :213 — `type not in {'NONE', 'GUIDE'}` (:221).
508
+ title: 'Falloff',
509
+ from: 'Force Field',
510
+ when: [{ from: 'Force Field', property: 'type', isNot: ['NONE', 'GUIDE'] }],
511
+ properties: ['falloff_type'],
512
+ sub: [
513
+ {
514
+ // _field_falloff_angular, :242 — `falloff_type == 'CONE'`.
515
+ title: 'Angular',
516
+ from: 'Force Field',
517
+ when: [{ from: 'Force Field', property: 'falloff_type', is: ['CONE'] }],
518
+ properties: [
519
+ 'radial_falloff',
520
+ 'use_radial_min',
521
+ 'radial_min',
522
+ 'use_radial_max',
523
+ 'radial_max',
524
+ ],
525
+ },
526
+ {
527
+ // _field_falloff_radial, :285 — `falloff_type == 'TUBE'`.
528
+ title: 'Radial',
529
+ from: 'Force Field',
530
+ when: [{ from: 'Force Field', property: 'falloff_type', is: ['TUBE'] }],
531
+ properties: [
532
+ 'radial_falloff',
533
+ 'use_radial_min',
534
+ 'radial_min',
535
+ 'use_radial_max',
536
+ 'radial_max',
537
+ ],
538
+ },
539
+ ],
540
+ },
541
+ ],
542
+ },
543
+ {
544
+ // PHYSICS_PT_collision, properties_physics_field.py:334 — `settings =
545
+ // md.settings`, which is `obj.collision`. `use` is the header checkbox
546
+ // drawn by `PHYSICS_PT_add` (`properties_physics_common.py:81`).
547
+ title: 'Collision',
548
+ from: 'Collision',
549
+ properties: ['use', 'absorption'],
550
+ sub: [
551
+ // _collision_particle, :368.
552
+ {
553
+ title: 'Particle',
554
+ from: 'Collision',
555
+ properties: [
556
+ 'permeability',
557
+ 'stickiness',
558
+ 'use_particle_kill',
559
+ 'damping_factor',
560
+ 'damping_random',
561
+ 'friction_factor',
562
+ 'friction_random',
563
+ ],
564
+ },
565
+ // _collision_softbody, :418.
566
+ {
567
+ title: 'Softbody & Cloth',
568
+ from: 'Collision',
569
+ properties: [
570
+ 'damping',
571
+ 'thickness_outer',
572
+ 'thickness_inner',
573
+ 'cloth_friction',
574
+ 'use_culling',
575
+ 'use_normal',
576
+ ],
577
+ },
578
+ ],
579
+ },
580
+ {
581
+ // properties_physics_fluid.py — see the header for why this stops at the
582
+ // type and the settings pointer.
583
+ title: 'Fluid',
584
+ from: 'Fluid',
585
+ properties: ['fluid_type', 'domain_settings', 'flow_settings', 'effector_settings'],
586
+ },
587
+ {
588
+ // properties_physics_dynamicpaint.py, same reading.
589
+ title: 'Dynamic Paint',
590
+ from: 'Dynamic Paint',
591
+ properties: ['ui_type', 'canvas_settings', 'brush_settings'],
592
+ },
593
+ ];
594
+
595
+ const TAB = { id: 'physics', curated: CURATED } as const;
596
+
597
+ export const point = 'selection.inspector';
598
+ export const title = 'Physics';
599
+ /** `blender.icons.json` — Blender's own mark, TRACED from
600
+ * `release/datafiles/icons_svg/` at the engine's pin (the icon this tab draws
601
+ * is named in `buttons_context_items`, `makesrna/intern/rna_space.cc:579`),
602
+ * and tinted by the group `UI_icons.hh` declares it in. */
603
+ export const icon = 'properties-physics';
604
+ /** `ED_buttons_tabs_list` (`space_buttons.cc:218-252`) is the rail's order;
605
+ * these are that order, spaced so a tab can be inserted between two. */
606
+ export const order = 100;
607
+ /** THE RAIL'S GROUPS, from `ED_buttons_tabs_list`'s own `add_spacer()` calls
608
+ * (`space_buttons/space_buttons.cc:201-255`): the tool tab, then the scene
609
+ * group (Render, Output, View Layer, Scene, World), then Collection, then the
610
+ * object group (Object … Material), then Texture. The presentation draws a
611
+ * separator wherever this changes. */
612
+ export const railGroup = 'object';
613
+ export const match = blenderPropertiesTabMatch(TAB);
614
+ export default blenderPropertiesTabSection(TAB);