Modeling: Set shape key default value to 1.0
When adding a shape key, set its blend value to 1.0 / 100%. There is no practical use case where user wants to add shape key but not work on it. New shape keys at value 0 have no purpose. Adding shape key should be interpreted by Blender as user wanting to sculpt/model on it. Also, being at 1.0 initially doesn't change anything visually, because key isn't edited yet and it doesn't deform mesh. The default value of the shape key is also set to 1.0. When using right-click to reset values, user most often wants to return to 1 (which is "correct" state of deformation without multiplication) rather than 0 (which is no deformation at all). Co-authored-by: Sybren A. Stüvel <sybren@blender.org> Pull Request: https://projects.blender.org/blender/blender/pulls/133399
This commit is contained in:
committed by
Sybren A. Stüvel
parent
8678766c5a
commit
7158e02aed
@@ -2009,6 +2009,7 @@ def blen_read_shapes(fbx_tmpl, fbx_data, objects, me, scene):
|
|||||||
if me.shape_keys is None:
|
if me.shape_keys is None:
|
||||||
objects[0].shape_key_add(name="Basis", from_mix=False)
|
objects[0].shape_key_add(name="Basis", from_mix=False)
|
||||||
kb = objects[0].shape_key_add(name=elem_name_utf8, from_mix=False)
|
kb = objects[0].shape_key_add(name=elem_name_utf8, from_mix=False)
|
||||||
|
kb.value = 0.0
|
||||||
me.shape_keys.use_relative = True # Should already be set as such.
|
me.shape_keys.use_relative = True # Should already be set as such.
|
||||||
|
|
||||||
# Only need to set the shape key co if there are any non-zero dvcos.
|
# Only need to set the shape key co if there are any non-zero dvcos.
|
||||||
|
|||||||
@@ -388,8 +388,8 @@ def do_primitives(gltf, mesh_idx, skin_idx, mesh, ob):
|
|||||||
if sk_name is None:
|
if sk_name is None:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
ob.shape_key_add(name=sk_name)
|
key_block = ob.shape_key_add(name=sk_name)
|
||||||
key_block = mesh.shape_keys.key_blocks[sk_name]
|
key_block.value = 0.0
|
||||||
key_block.points.foreach_set('co', squish(sk_vert_locs[sk_i], np.float32))
|
key_block.points.foreach_set('co', squish(sk_vert_locs[sk_i], np.float32))
|
||||||
|
|
||||||
sk_i += 1
|
sk_i += 1
|
||||||
|
|||||||
@@ -372,6 +372,7 @@ class ShapeTransfer(Operator):
|
|||||||
if len(me.shape_keys.key_blocks) == 1:
|
if len(me.shape_keys.key_blocks) == 1:
|
||||||
key.name = "Basis"
|
key.name = "Basis"
|
||||||
key = ob.shape_key_add(from_mix=False) # we need a rest
|
key = ob.shape_key_add(from_mix=False) # we need a rest
|
||||||
|
key.value = 0.0
|
||||||
key.name = name
|
key.name = name
|
||||||
ob.active_shape_key_index = len(me.shape_keys.key_blocks) - 1
|
ob.active_shape_key_index = len(me.shape_keys.key_blocks) - 1
|
||||||
ob.show_only_shape_key = True
|
ob.show_only_shape_key = True
|
||||||
|
|||||||
@@ -143,6 +143,9 @@ static void object_shape_key_add(bContext *C, Object *ob, const bool from_mix)
|
|||||||
Main *bmain = CTX_data_main(C);
|
Main *bmain = CTX_data_main(C);
|
||||||
KeyBlock *kb = BKE_object_shapekey_insert(bmain, ob, nullptr, from_mix);
|
KeyBlock *kb = BKE_object_shapekey_insert(bmain, ob, nullptr, from_mix);
|
||||||
if (kb) {
|
if (kb) {
|
||||||
|
/* Shapekeys created via this operator should get default value 1.0. */
|
||||||
|
kb->curval = 1.0f;
|
||||||
|
|
||||||
Key *key = BKE_key_from_object(ob);
|
Key *key = BKE_key_from_object(ob);
|
||||||
/* for absolute shape keys, new keys may not be added last */
|
/* for absolute shape keys, new keys may not be added last */
|
||||||
ob->shapenr = BLI_findindex(&key->block, kb) + 1;
|
ob->shapenr = BLI_findindex(&key->block, kb) + 1;
|
||||||
|
|||||||
@@ -964,6 +964,7 @@ static void rna_def_keyblock(BlenderRNA *brna)
|
|||||||
prop = RNA_def_property(srna, "value", PROP_FLOAT, PROP_FACTOR);
|
prop = RNA_def_property(srna, "value", PROP_FLOAT, PROP_FACTOR);
|
||||||
RNA_def_property_float_sdna(prop, nullptr, "curval");
|
RNA_def_property_float_sdna(prop, nullptr, "curval");
|
||||||
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
|
RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY);
|
||||||
|
RNA_def_property_float_default(prop, 1.0f);
|
||||||
RNA_def_property_float_funcs(
|
RNA_def_property_float_funcs(
|
||||||
prop, nullptr, "rna_ShapeKey_value_set", "rna_ShapeKey_value_range");
|
prop, nullptr, "rna_ShapeKey_value_set", "rna_ShapeKey_value_range");
|
||||||
RNA_def_property_ui_range(prop, -10.0f, 10.0f, 10, 3);
|
RNA_def_property_ui_range(prop, -10.0f, 10.0f, 10, 3);
|
||||||
|
|||||||
@@ -458,6 +458,10 @@ static PointerRNA rna_Object_shape_key_add(
|
|||||||
KeyBlock *kb = nullptr;
|
KeyBlock *kb = nullptr;
|
||||||
|
|
||||||
if ((kb = BKE_object_shapekey_insert(bmain, ob, name, from_mix))) {
|
if ((kb = BKE_object_shapekey_insert(bmain, ob, name, from_mix))) {
|
||||||
|
/* Set the initial blend value. */
|
||||||
|
kb->curval = 1.0f;
|
||||||
|
CLAMP(kb->curval, kb->slidermin, kb->slidermax);
|
||||||
|
|
||||||
PointerRNA keyptr = RNA_pointer_create_discrete(
|
PointerRNA keyptr = RNA_pointer_create_discrete(
|
||||||
(ID *)BKE_key_from_object(ob), &RNA_ShapeKey, kb);
|
(ID *)BKE_key_from_object(ob), &RNA_ShapeKey, kb);
|
||||||
WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
|
WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, ob);
|
||||||
|
|||||||
@@ -249,6 +249,7 @@ class SubDataDriverRemovalTest(AbstractEmptyDriverTest, unittest.TestCase):
|
|||||||
def test_remove_shapekey(self):
|
def test_remove_shapekey(self):
|
||||||
self.obj.shape_key_add(name="base")
|
self.obj.shape_key_add(name="base")
|
||||||
test_key = self.obj.shape_key_add(name="test")
|
test_key = self.obj.shape_key_add(name="test")
|
||||||
|
test_key.value = 0.0
|
||||||
# Due to the weirdness of shapekeys, this is an ID.
|
# Due to the weirdness of shapekeys, this is an ID.
|
||||||
shape_key_id = self.obj.data.shape_keys
|
shape_key_id = self.obj.data.shape_keys
|
||||||
self.assertEqual(len(shape_key_id.key_blocks), 2)
|
self.assertEqual(len(shape_key_id.key_blocks), 2)
|
||||||
|
|||||||
@@ -126,8 +126,9 @@ def ctx_editmode_mesh():
|
|||||||
def ctx_editmode_mesh_extra():
|
def ctx_editmode_mesh_extra():
|
||||||
bpy.ops.wm.read_factory_settings(use_empty=False)
|
bpy.ops.wm.read_factory_settings(use_empty=False)
|
||||||
bpy.ops.object.vertex_group_add()
|
bpy.ops.object.vertex_group_add()
|
||||||
bpy.ops.object.shape_key_add(from_mix=False)
|
bpy.ops.object.shape_key_add(from_mix=False) # Basis Key
|
||||||
bpy.ops.object.shape_key_add(from_mix=True)
|
shape_key = bpy.ops.object.shape_key_add(from_mix=True)
|
||||||
|
shape_key.value = 0.0
|
||||||
bpy.ops.mesh.uv_texture_add()
|
bpy.ops.mesh.uv_texture_add()
|
||||||
bpy.ops.object.material_slot_add()
|
bpy.ops.object.material_slot_add()
|
||||||
# editmode last!
|
# editmode last!
|
||||||
|
|||||||
@@ -422,8 +422,9 @@ def ctx_editmode_mesh():
|
|||||||
|
|
||||||
def ctx_editmode_mesh_extra():
|
def ctx_editmode_mesh_extra():
|
||||||
bpy.ops.object.vertex_group_add()
|
bpy.ops.object.vertex_group_add()
|
||||||
bpy.ops.object.shape_key_add(from_mix=False)
|
bpy.ops.object.shape_key_add(from_mix=False) # Basis Key
|
||||||
bpy.ops.object.shape_key_add(from_mix=True)
|
shape_key = bpy.ops.object.shape_key_add(from_mix=True)
|
||||||
|
shape_key.value = 0.0
|
||||||
bpy.ops.mesh.uv_texture_add()
|
bpy.ops.mesh.uv_texture_add()
|
||||||
bpy.ops.mesh.vertex_color_add()
|
bpy.ops.mesh.vertex_color_add()
|
||||||
bpy.ops.object.material_slot_add()
|
bpy.ops.object.material_slot_add()
|
||||||
|
|||||||
Reference in New Issue
Block a user