diff options
Diffstat (limited to 'release')
14 files changed, 216 insertions, 33 deletions
diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py index 11e1115fa4c..1c861aa3be2 100644 --- a/release/scripts/modules/bpy_types.py +++ b/release/scripts/modules/bpy_types.py @@ -673,6 +673,10 @@ class Panel(StructRNA, _GenericUI, metaclass=RNAMeta): __slots__ = () +class UIList(StructRNA, _GenericUI, metaclass=RNAMeta): + __slots__ = () + + class Header(StructRNA, _GenericUI, metaclass=RNAMeta): __slots__ = () diff --git a/release/scripts/startup/bl_ui/__init__.py b/release/scripts/startup/bl_ui/__init__.py index e4be84d5396..aa1a8a9a25b 100644 --- a/release/scripts/startup/bl_ui/__init__.py +++ b/release/scripts/startup/bl_ui/__init__.py @@ -132,3 +132,9 @@ def register(): def unregister(): bpy.utils.unregister_module(__name__) + +# Define a default UIList, when a list does not need any custom drawing... +class UI_UL_list(bpy.types.UIList): + pass + +bpy.utils.register_class(UI_UL_list) diff --git a/release/scripts/startup/bl_ui/properties_data_armature.py b/release/scripts/startup/bl_ui/properties_data_armature.py index 845beb0f862..1643210704e 100644 --- a/release/scripts/startup/bl_ui/properties_data_armature.py +++ b/release/scripts/startup/bl_ui/properties_data_armature.py @@ -124,7 +124,7 @@ class DATA_PT_bone_groups(ArmatureButtonsPanel, Panel): rows = 2 if group: rows = 5 - row.template_list(pose, "bone_groups", pose.bone_groups, "active_index", rows=rows) + row.template_list("UI_UL_list", "", pose, "bone_groups", pose.bone_groups, "active_index", rows=rows) col = row.column(align=True) col.active = (ob.proxy is None) @@ -184,7 +184,7 @@ class DATA_PT_pose_library(ArmatureButtonsPanel, Panel): if poselib: # list of poses in pose library row = layout.row() - row.template_list(poselib, "pose_markers", poselib.pose_markers, "active_index", rows=5) + row.template_list("UI_UL_list", "", poselib, "pose_markers", poselib.pose_markers, "active_index", rows=5) # column of operators for active pose # - goes beside list diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py index e33bed7ec6d..7a7c847f040 100644 --- a/release/scripts/startup/bl_ui/properties_data_mesh.py +++ b/release/scripts/startup/bl_ui/properties_data_mesh.py @@ -18,7 +18,7 @@ # <pep8 compliant> import bpy -from bpy.types import Menu, Panel +from bpy.types import Menu, Panel, UIList from rna_prop_ui import PropertyPanel @@ -54,6 +54,57 @@ class MESH_MT_shape_key_specials(Menu): layout.operator("object.shape_key_add", icon='ZOOMIN', text="New Shape From Mix").from_mix = True +class MESH_UL_vgroups(UIList): + def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): + if not isinstance(item, bpy.types.VertexGroup): + return + vgroup = item + if self.layout_type in {'DEFAULT', 'COMPACT'}: + layout.label(vgroup.name, icon_value=icon) + icon = 'LOCKED' if vgroup.lock_weight else 'UNLOCKED' + layout.prop(vgroup, "lock_weight", text="", icon=icon, emboss=False) + elif self.layout_type in {'GRID'}: + layout.alignment = 'CENTER' + layout.label("", icon_value=icon) + + +class MESH_UL_shape_keys(UIList): + def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): + if not isinstance(item, bpy.types.ShapeKey): + return + obj = active_data + key = data + key_block = item + if self.layout_type in {'DEFAULT', 'COMPACT'}: + split = layout.split(0.66, False) + split.label(item.name, icon_value=icon) + row = split.row(True) + if key_block.mute or (obj.mode == 'EDIT' and not (obj.use_shape_key_edit_mode and obj.type == 'MESH')): + row.active = False + if not item.relative_key or index > 0: + row.prop(key_block, "value", text="", emboss=False) + else: + row.label("") + row.prop(key_block, "mute", text="", emboss=False) + elif self.layout_type in {'GRID'}: + layout.alignment = 'CENTER' + layout.label("", icon_value=icon) + + +class MESH_UL_uvmaps_vcols(UIList): + def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): + if not isinstance(item, (bpy.types.MeshTexturePolyLayer, bpy.types.MeshLoopColorLayer)): + print(item.__class__) + return + if self.layout_type in {'DEFAULT', 'COMPACT'}: + layout.label(item.name, icon_value=icon) + icon = 'RESTRICT_RENDER_OFF' if item.active_render else 'RESTRICT_RENDER_ON' + layout.prop(item, "active_render", text="", icon=icon, emboss=False) + elif self.layout_type in {'GRID'}: + layout.alignment = 'CENTER' + layout.label("", icon_value=icon) + + class MeshButtonsPanel(): bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' @@ -144,7 +195,8 @@ class DATA_PT_vertex_groups(MeshButtonsPanel, Panel): rows = 5 row = layout.row() - row.template_list(ob, "vertex_groups", ob.vertex_groups, "active_index", rows=rows) + row.template_list("MESH_UL_vgroups", "", ob, "vertex_groups", ob.vertex_groups, "active_index", rows=rows) + col = row.column(align=True) col.operator("object.vertex_group_add", icon='ZOOMIN', text="") @@ -202,7 +254,7 @@ class DATA_PT_shape_keys(MeshButtonsPanel, Panel): rows = 2 if kb: rows = 5 - row.template_list(key, "key_blocks", ob, "active_shape_key_index", rows=rows) + row.template_list("MESH_UL_shape_keys", "", key, "key_blocks", ob, "active_shape_key_index", rows=rows) col = row.column() @@ -282,7 +334,7 @@ class DATA_PT_uv_texture(MeshButtonsPanel, Panel): row = layout.row() col = row.column() - col.template_list(me, "uv_textures", me.uv_textures, "active_index", rows=2) + col.template_list("MESH_UL_uvmaps_vcols", "", me, "uv_textures", me.uv_textures, "active_index", rows=2) col = row.column(align=True) col.operator("mesh.uv_texture_add", icon='ZOOMIN', text="") @@ -305,7 +357,7 @@ class DATA_PT_vertex_colors(MeshButtonsPanel, Panel): row = layout.row() col = row.column() - col.template_list(me, "vertex_colors", me.vertex_colors, "active_index", rows=2) + col.template_list("MESH_UL_uvmaps_vcols", "", me, "vertex_colors", me.vertex_colors, "active_index", rows=2) col = row.column(align=True) col.operator("mesh.vertex_color_add", icon='ZOOMIN', text="") diff --git a/release/scripts/startup/bl_ui/properties_mask_common.py b/release/scripts/startup/bl_ui/properties_mask_common.py index 208b0a63075..ea04b79357e 100644 --- a/release/scripts/startup/bl_ui/properties_mask_common.py +++ b/release/scripts/startup/bl_ui/properties_mask_common.py @@ -22,7 +22,25 @@ # menus are referenced `as is` import bpy -from bpy.types import Menu +from bpy.types import Menu, UIList + + +class MASK_UL_layers(UIList): + def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): + if not isinstance(item, bpy.types.MaskLayer): + return + mask = item + if self.layout_type in {'DEFAULT', 'COMPACT'}: + split = layout.split() + split.label(mask.name, icon_value=icon) + row = split.row(align=True) + row.prop(mask, "alpha", text="", emboss=False) + row.prop(mask, "hide", text="", emboss=False) + row.prop(mask, "hide_select", text="", emboss=False) + row.prop(mask, "hide_render", text="", emboss=False) + elif self.layout_type in {'GRID'}: + layout.alignment = 'CENTER' + layout.label("", icon_value=icon) class MASK_PT_mask: @@ -69,8 +87,7 @@ class MASK_PT_layers: rows = 5 if active_layer else 2 row = layout.row() - row.template_list(mask, "layers", - mask, "active_layer_index", rows=rows) + row.template_list("MASK_UL_layers", "", mask, "layers", mask, "active_layer_index", rows=rows) sub = row.column(align=True) diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py index 951644db752..df676499cfb 100644 --- a/release/scripts/startup/bl_ui/properties_material.py +++ b/release/scripts/startup/bl_ui/properties_material.py @@ -18,7 +18,7 @@ # <pep8 compliant> import bpy -from bpy.types import Menu, Panel +from bpy.types import Menu, Panel, UIList from rna_prop_ui import PropertyPanel @@ -69,6 +69,26 @@ class MATERIAL_MT_specials(Menu): layout.operator("material.paste", icon='PASTEDOWN') +class MATERIAL_UL_matslots(UIList): + def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): + if not isinstance(item, bpy.types.MaterialSlot): + return + ob = data + slot = item + ma = slot.material + if self.layout_type in {'DEFAULT', 'COMPACT'}: + layout.label(ma.name if ma else "", icon_value=icon) + if ma and not context.scene.render.use_shading_nodes: + manode = ma.active_node_material + if manode: + layout.label("Node %s" % manode.name, icon_value=layout.icon(manode)) + elif ma.use_nodes: + layout.label("Node <none>") + elif self.layout_type in {'GRID'}: + layout.alignment = 'CENTER' + layout.label("", icon_value=icon) + + class MaterialButtonsPanel(): bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' @@ -104,7 +124,7 @@ class MATERIAL_PT_context_material(MaterialButtonsPanel, Panel): if ob: row = layout.row() - row.template_list(ob, "material_slots", ob, "active_material_index", rows=2) + row.template_list("MATERIAL_UL_matslots", "", ob, "material_slots", ob, "active_material_index", rows=2) col = row.column(align=True) col.operator("object.material_slot_add", icon='ZOOMIN', text="") diff --git a/release/scripts/startup/bl_ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py index 2c2ced5db0c..90dcf594137 100644 --- a/release/scripts/startup/bl_ui/properties_particle.py +++ b/release/scripts/startup/bl_ui/properties_particle.py @@ -96,7 +96,7 @@ class PARTICLE_PT_context_particles(ParticleButtonsPanel, Panel): if ob: row = layout.row() - row.template_list(ob, "particle_systems", ob.particle_systems, "active_index", rows=2) + row.template_list("UI_UL_list", "", ob, "particle_systems", ob.particle_systems, "active_index", rows=2) col = row.column(align=True) col.operator("object.particle_system_add", icon='ZOOMIN', text="") @@ -636,7 +636,7 @@ class PARTICLE_PT_physics(ParticleButtonsPanel, Panel): layout.label(text="Fluid interaction:") row = layout.row() - row.template_list(psys, "targets", psys, "active_particle_target_index") + row.template_list("UI_UL_list", "", psys, "targets", psys, "active_particle_target_index") col = row.column() sub = col.row() @@ -702,7 +702,7 @@ class PARTICLE_PT_boidbrain(ParticleButtonsPanel, Panel): # Currently boids can only use the first state so these are commented out for now. #row = layout.row() - #row.template_list(boids, "states", boids, "active_boid_state_index", compact="True") + #row.template_list("UI_UL_list", "", boids, "states", boids, "active_boid_state_index", compact="True") #col = row.row() #sub = col.row(align=True) #sub.operator("boid.state_add", icon='ZOOMIN', text="") @@ -723,7 +723,7 @@ class PARTICLE_PT_boidbrain(ParticleButtonsPanel, Panel): row.label(text="") row = layout.row() - row.template_list(state, "rules", state, "active_boid_rule_index") + row.template_list("UI_UL_list", "", state, "rules", state, "active_boid_rule_index") col = row.column() sub = col.row() @@ -886,7 +886,7 @@ class PARTICLE_PT_render(ParticleButtonsPanel, Panel): if part.use_group_count and not part.use_whole_group: row = layout.row() - row.template_list(part, "dupli_weights", part, "active_dupliweight_index") + row.template_list("UI_UL_list", "", part, "dupli_weights", part, "active_dupliweight_index") col = row.column() sub = col.row() diff --git a/release/scripts/startup/bl_ui/properties_physics_common.py b/release/scripts/startup/bl_ui/properties_physics_common.py index 405e877d1e2..b70ff322765 100644 --- a/release/scripts/startup/bl_ui/properties_physics_common.py +++ b/release/scripts/startup/bl_ui/properties_physics_common.py @@ -85,7 +85,7 @@ def point_cache_ui(self, context, cache, enabled, cachetype): layout.context_pointer_set("point_cache", cache) row = layout.row() - row.template_list(cache, "point_caches", cache.point_caches, "active_index", rows=2) + row.template_list("UI_UL_list", "", cache, "point_caches", cache.point_caches, "active_index", rows=2) col = row.column(align=True) col.operator("ptcache.add", icon='ZOOMIN', text="") col.operator("ptcache.remove", icon='ZOOMOUT', text="") diff --git a/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py b/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py index 1df2936b2d4..b102f1b09d0 100644 --- a/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py +++ b/release/scripts/startup/bl_ui/properties_physics_dynamicpaint.py @@ -18,13 +18,35 @@ # <pep8 compliant> import bpy -from bpy.types import Panel +from bpy.types import Panel, UIList from bl_ui.properties_physics_common import (point_cache_ui, effector_weights_ui, ) +class PHYSICS_UL_dynapaint_surfaces(UIList): + def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): + if not isinstance(item, bpy.types.DynamicPaintSurface): + return + surf = item + sticon = layout.enum_item_icon(surf, "surface_type", surf.surface_type) + if self.layout_type in {'DEFAULT', 'COMPACT'}: + row = layout.row(align=True) + row.label(text="", icon_value=icon) + row.label(text=surf.name, icon_value=sticon) + row = layout.row(align=True) + if surf.use_color_preview: + row.prop(surf, "show_preview", text="", emboss=False, + icon='RESTRICT_VIEW_OFF' if surf.show_preview else 'RESTRICT_VIEW_ON') + row.prop(surf, "is_active", text="") + elif self.layout_type in {'GRID'}: + layout.alignment = 'CENTER' + row = layout.row(align=True) + row.label(text="", icon_value=icon) + row.label(text="", icon_value=sticon) + + class PhysicButtonsPanel(): bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' @@ -58,7 +80,8 @@ class PHYSICS_PT_dynamic_paint(PhysicButtonsPanel, Panel): surface = canvas.canvas_surfaces.active row = layout.row() - row.template_list(canvas, "canvas_surfaces", canvas.canvas_surfaces, "active_index", rows=2) + row.template_list("PHYSICS_UL_dynapaint_surfaces", "", canvas, "canvas_surfaces", + canvas.canvas_surfaces, "active_index", rows=2) col = row.column(align=True) col.operator("dpaint.surface_slot_add", icon='ZOOMIN', text="") diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py index 3fdcf946180..6f0cf6bc691 100644 --- a/release/scripts/startup/bl_ui/properties_render.py +++ b/release/scripts/startup/bl_ui/properties_render.py @@ -19,7 +19,7 @@ # <pep8 compliant> import bpy -from bpy.types import Menu, Panel +from bpy.types import Menu, Panel, UIList class RENDER_MT_presets(Menu): @@ -43,6 +43,24 @@ class RENDER_MT_framerate_presets(Menu): draw = Menu.draw_preset +class RENDER_UL_renderlayers(UIList): + def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): + if not isinstance(item, bpy.types.SceneRenderLayer): + return + layer = item + if self.layout_type in {'DEFAULT', 'COMPACT'}: + layout.label(layer.name, icon_value=icon) + layout.prop(layer, "use", text="", index=index) + elif self.layout_type in {'GRID'}: + layout.alignment = 'CENTER' + layout.label("", icon_value=icon) + +# else if (RNA_struct_is_a(itemptr->type, &RNA_SceneRenderLayer)) { +# uiItemL(sub, name, icon); +# uiBlockSetEmboss(block, UI_EMBOSS); +# uiDefButR(block, OPTION, 0, "", 0, 0, UI_UNIT_X, UI_UNIT_Y, itemptr, "use", 0, 0, 0, 0, 0, NULL); +# } + class RenderButtonsPanel(): bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' @@ -84,7 +102,7 @@ class RENDER_PT_layers(RenderButtonsPanel, Panel): rd = scene.render row = layout.row() - row.template_list(rd, "layers", rd.layers, "active_index", rows=2) + row.template_list("RENDER_UL_renderlayers", "", rd, "layers", rd.layers, "active_index", rows=2) col = row.column(align=True) col.operator("scene.render_layer_add", icon='ZOOMIN', text="") diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py index 518b253d0b0..100c7d93c77 100644 --- a/release/scripts/startup/bl_ui/properties_scene.py +++ b/release/scripts/startup/bl_ui/properties_scene.py @@ -18,10 +18,23 @@ # <pep8 compliant> import bpy -from bpy.types import Panel +from bpy.types import Panel, UIList from rna_prop_ui import PropertyPanel +class SCENE_UL_keying_set_paths(UIList): + def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): + if not isinstance(item, bpy.types.KeyingSetPath): + return + kspath = item + icon = layout.enum_item_icon(kspath, "id_type", kspath.id_type) + if self.layout_type in {'DEFAULT', 'COMPACT'}: + layout.label(kspath.data_path, icon_value=icon) + elif self.layout_type in {'GRID'}: + layout.alignment = 'CENTER' + layout.label("", icon_value=icon) + + class SceneButtonsPanel(): bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' @@ -107,7 +120,7 @@ class SCENE_PT_keying_sets(SceneButtonsPanel, Panel): row = layout.row() col = row.column() - col.template_list(scene, "keying_sets", scene.keying_sets, "active_index", rows=2) + col.template_list("UI_UL_list", "", scene, "keying_sets", scene.keying_sets, "active_index", rows=2) col = row.column(align=True) col.operator("anim.keying_set_add", icon='ZOOMIN', text="") @@ -151,7 +164,7 @@ class SCENE_PT_keying_set_paths(SceneButtonsPanel, Panel): row = layout.row() col = row.column() - col.template_list(ks, "paths", ks.paths, "active_index", rows=2) + col.template_list("SCENE_UL_keying_set_paths", "", ks, "paths", ks.paths, "active_index", rows=2) col = row.column(align=True) col.operator("anim.keying_set_path_add", icon='ZOOMIN', text="") diff --git a/release/scripts/startup/bl_ui/properties_texture.py b/release/scripts/startup/bl_ui/properties_texture.py index e623d034b48..33b8e126398 100644 --- a/release/scripts/startup/bl_ui/properties_texture.py +++ b/release/scripts/startup/bl_ui/properties_texture.py @@ -18,7 +18,7 @@ # <pep8 compliant> import bpy -from bpy.types import Menu, Panel +from bpy.types import Menu, Panel, UIList from bpy.types import (Brush, Lamp, @@ -55,6 +55,23 @@ class TEXTURE_MT_envmap_specials(Menu): layout.operator("texture.envmap_clear", icon='FILE_REFRESH') layout.operator("texture.envmap_clear_all", icon='FILE_REFRESH') + +class TEXTURE_UL_texslots(UIList): + def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): + if not (item is None or isinstance(item, bpy.types.MaterialTextureSlot)): + return + ma = data + slot = item + tex = slot.texture if slot else None + if self.layout_type in {'DEFAULT', 'COMPACT'}: + layout.label(tex.name if tex else "", icon_value=icon) + if tex: + layout.prop(ma, "use_textures", text="", index=index) + elif self.layout_type in {'GRID'}: + layout.alignment = 'CENTER' + layout.label("", icon_value=icon) + + from bl_ui.properties_material import active_node_mat @@ -142,7 +159,7 @@ class TEXTURE_PT_context_texture(TextureButtonsPanel, Panel): if tex_collection: row = layout.row() - row.template_list(idblock, "texture_slots", idblock, "active_texture_index", rows=2) + row.template_list("TEXTURE_UL_texslots", "", idblock, "texture_slots", idblock, "active_texture_index", rows=2) col = row.column(align=True) col.operator("texture.slot_move", text="", icon='TRIA_UP').type = 'UP' diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py index cb88226b55a..cf5b94277e7 100644 --- a/release/scripts/startup/bl_ui/space_clip.py +++ b/release/scripts/startup/bl_ui/space_clip.py @@ -19,7 +19,19 @@ # <pep8-80 compliant> import bpy -from bpy.types import Panel, Header, Menu +from bpy.types import Panel, Header, Menu, UIList + + +class CLIP_UL_tracking_objects(UIList): + def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): + if not (item is None or isinstance(item, bpy.types.MovieTrackingObject)): + return + tobj = item + if self.layout_type in {'DEFAULT', 'COMPACT'}: + layout.label(tobj.name, icon='CAMERA_DATA' if tobj.is_camera else 'OBJECT_DATA') + elif self.layout_type in {'GRID'}: + layout.alignment = 'CENTER' + layout.label("", icon='CAMERA_DATA' if tobj.is_camera else 'OBJECT_DATA') class CLIP_HT_header(Header): @@ -471,8 +483,7 @@ class CLIP_PT_objects(CLIP_PT_clip_view_panel, Panel): tracking = sc.clip.tracking row = layout.row() - row.template_list(tracking, "objects", - tracking, "active_object_index", rows=3) + row.template_list("CLIP_UL_tracking_objects", "", tracking, "objects", tracking, "active_object_index", rows=3) sub = row.column(align=True) @@ -728,7 +739,7 @@ class CLIP_PT_stabilization(CLIP_PT_reconstruction_panel, Panel): layout.active = stab.use_2d_stabilization row = layout.row() - row.template_list(stab, "tracks", stab, "active_track_index", rows=3) + row.template_list("UI_UL_list", "", stab, "tracks", stab, "active_track_index", rows=3) sub = row.column(align=True) diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py index 09b32cd0c56..fb5e4a56aa1 100644 --- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -1167,7 +1167,8 @@ class VIEW3D_PT_tools_particlemode(View3DPanel, Panel): if pe.type == 'PARTICLES': if ob.particle_systems: if len(ob.particle_systems) > 1: - layout.template_list(ob, "particle_systems", ob.particle_systems, "active_index", rows=2, maxrows=3) + layout.template_list("UI_UL_list", "", ob, "particle_systems", + ob.particle_systems, "active_index", rows=2, maxrows=3) ptcache = ob.particle_systems.active.point_cache else: @@ -1176,7 +1177,8 @@ class VIEW3D_PT_tools_particlemode(View3DPanel, Panel): ptcache = md.point_cache if ptcache and len(ptcache.point_caches) > 1: - layout.template_list(ptcache, "point_caches", ptcache.point_caches, "active_index", rows=2, maxrows=3) + layout.template_list("UI_UL_list", "", ptcache, "point_caches", ptcache.point_caches, "active_index", + rows=2, maxrows=3) if not pe.is_editable: layout.label(text="Point cache must be baked") |