diff options
author | Sergey Sharybin <sergey@blender.org> | 2022-01-05 11:53:48 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey@blender.org> | 2022-01-25 16:43:44 +0300 |
commit | 196da819ba4cf553c76468a091966f33081efb08 (patch) | |
tree | 0d289d01aa832fd7a629df02d106daffdb64a462 /source/blender/makesrna | |
parent | 31296f6f9d67570920c143be24b26e28f10a0ebb (diff) |
Python: Expose crazyspace correction functionality via RNA
Allows to perform correction of coordinate delta/displacement in a
similar way of how sculpt mode handles sculpting on a deformed mesh.
An example of usecase of this is allowing riggers and sciprters to
improve corrective shapekey workflow.
The usage consists of pre-processing and access. For example:
object.crazyspace_eval(depsgraph, scene)
# When we have a difference between two vertices and want to convert
# it to a space to be stored, say, in shapekey:
delta_in_orig_space = rigged_ob.crazyspace_displacement_to_original(
vertex_index=i, displacement=delta)
# The reverse of above.
delta_in_deformed_space = rigged_ob.crazyspace_displacement_to_deformed(
vertex_index=i, displacement=delta)
object.crazyspace_eval_clear()
Fuller explanation with actual usecases and studio examples are written in
the comment:
https://developer.blender.org/D13892#368898
Differential Revision: https://developer.blender.org/D13892
Diffstat (limited to 'source/blender/makesrna')
-rw-r--r-- | source/blender/makesrna/intern/rna_object_api.c | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c index ec20fa54a44..cc9f6454337 100644 --- a/source/blender/makesrna/intern/rna_object_api.c +++ b/source/blender/makesrna/intern/rna_object_api.c @@ -68,6 +68,7 @@ static const EnumPropertyItem space_items[] = { # include "BKE_bvhutils.h" # include "BKE_constraint.h" # include "BKE_context.h" +# include "BKE_crazyspace.h" # include "BKE_customdata.h" # include "BKE_global.h" # include "BKE_layer.h" @@ -379,6 +380,39 @@ static void rna_Object_camera_fit_coords( depsgraph, (const float(*)[3])cos, num_cos / 3, ob, co_ret, scale_ret); } +static void rna_Object_crazyspace_eval(Object *object, + ReportList *reports, + Depsgraph *depsgraph, + Scene *scene) +{ + BKE_crazyspace_api_eval(depsgraph, scene, object, reports); +} + +static void rna_Object_crazyspace_displacement_to_deformed(Object *object, + ReportList *reports, + const int vertex_index, + float displacement[3], + float r_displacement_deformed[3]) +{ + BKE_crazyspace_api_displacement_to_deformed( + object, reports, vertex_index, displacement, r_displacement_deformed); +} + +static void rna_Object_crazyspace_displacement_to_original(Object *object, + ReportList *reports, + const int vertex_index, + float displacement_deformed[3], + float r_displacement[3]) +{ + BKE_crazyspace_api_displacement_to_original( + object, reports, vertex_index, displacement_deformed, r_displacement); +} + +static void rna_Object_crazyspace_eval_clear(Object *object) +{ + BKE_crazyspace_api_eval_clear(object); +} + /* copied from Mesh_getFromObject and adapted to RNA interface */ static Mesh *rna_Object_to_mesh(Object *object, ReportList *reports, @@ -978,6 +1012,52 @@ void RNA_api_object(StructRNA *srna) parm, "", "The ortho scale to aim to be able to see all given points (if relevant)"); RNA_def_parameter_flags(parm, 0, PARM_OUTPUT); + /* Crazyspace access. */ + + func = RNA_def_function(srna, "crazyspace_eval", "rna_Object_crazyspace_eval"); + RNA_def_function_ui_description( + func, + "Compute orientation mapping between vertices of an original object and object with shape " + "keys and deforming modifiers applied." + "The evaluation is to be freed with the crazyspace_eval_free function"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + parm = RNA_def_pointer( + func, "depsgraph", "Depsgraph", "Dependency Graph", "Evaluated dependency graph"); + RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); + parm = RNA_def_pointer(func, "scene", "Scene", "Scene", "Scene of the object"); + RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); + + func = RNA_def_function(srna, + "crazyspace_displacement_to_deformed", + "rna_Object_crazyspace_displacement_to_deformed"); + RNA_def_function_ui_description( + func, "Convert displacement vector from non-deformed object space to deformed object space"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + RNA_def_property(func, "vertex_index", PROP_INT, PROP_NONE); + RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); + parm = RNA_def_property(func, "displacement", PROP_FLOAT, PROP_XYZ); + RNA_def_property_array(parm, 3); + parm = RNA_def_property(func, "displacement_deformed", PROP_FLOAT, PROP_XYZ); + RNA_def_property_array(parm, 3); + RNA_def_function_output(func, parm); + + func = RNA_def_function(srna, + "crazyspace_displacement_to_original", + "rna_Object_crazyspace_displacement_to_original"); + RNA_def_function_ui_description( + func, "Convert displacement vector from deformed object space to non-deformed object space"); + RNA_def_function_flag(func, FUNC_USE_REPORTS); + RNA_def_property(func, "vertex_index", PROP_INT, PROP_NONE); + RNA_def_parameter_flags(parm, 0, PARM_REQUIRED); + parm = RNA_def_property(func, "displacement", PROP_FLOAT, PROP_XYZ); + RNA_def_property_array(parm, 3); + parm = RNA_def_property(func, "displacement_original", PROP_FLOAT, PROP_XYZ); + RNA_def_property_array(parm, 3); + RNA_def_function_output(func, parm); + + RNA_def_function(srna, "crazyspace_eval_clear", "rna_Object_crazyspace_eval_clear"); + RNA_def_function_ui_description(func, "Free evaluated state of crazyspace"); + /* mesh */ func = RNA_def_function(srna, "to_mesh", "rna_Object_to_mesh"); RNA_def_function_ui_description( |