[Bf-blender-cvs] [37f8c03ab3c] custom-manipulators: Add arrow and dial manipulators with RNA access

Campbell Barton noreply at git.blender.org
Fri Jun 9 12:44:24 CEST 2017


Commit: 37f8c03ab3c1341d0be689c5b7d96b05c33b5c16
Author: Campbell Barton
Date:   Fri Jun 9 20:41:17 2017 +1000
Branches: custom-manipulators
https://developer.blender.org/rB37f8c03ab3c1341d0be689c5b7d96b05c33b5c16

Add arrow and dial manipulators with RNA access

===================================================================

M	source/blender/editors/include/ED_manipulator_library.h
M	source/blender/editors/manipulator_library/CMakeLists.txt
M	source/blender/editors/manipulator_library/manipulator_library_presets.c
M	source/blender/makesrna/intern/rna_wm_manipulator_api.c

===================================================================

diff --git a/source/blender/editors/include/ED_manipulator_library.h b/source/blender/editors/include/ED_manipulator_library.h
index 7ca7c36e4bc..39733e9248e 100644
--- a/source/blender/editors/include/ED_manipulator_library.h
+++ b/source/blender/editors/include/ED_manipulator_library.h
@@ -51,6 +51,10 @@ struct wmManipulatorGroup;
 /* manipulator_library_presets.c */
 void ED_manipulator_draw_preset_box(
         const struct wmManipulator *manipulator, float mat[4][4], int select_id);
+void ED_manipulator_draw_preset_arrow(
+        const struct wmManipulator *manipulator, float mat[4][4], int axis, int select_id);
+void ED_manipulator_draw_preset_circle(
+        const struct wmManipulator *manipulator, float mat[4][4], int axis, int select_id);
 void ED_manipulator_draw_preset_facemap(
         const struct wmManipulator *mpr, struct Scene *scene, struct Object *ob,  const int facemap, int select_id);
 
diff --git a/source/blender/editors/manipulator_library/CMakeLists.txt b/source/blender/editors/manipulator_library/CMakeLists.txt
index e54e7d7f58f..05c67b7cb21 100644
--- a/source/blender/editors/manipulator_library/CMakeLists.txt
+++ b/source/blender/editors/manipulator_library/CMakeLists.txt
@@ -44,6 +44,7 @@ set(SRC
 	facemap3d_manipulator.c
 	geom_arrow_manipulator.c
 	geom_cube_manipulator.c
+	geom_dial_manipulator.c
 	manipulator_draw_utils.c
 	manipulator_library_presets.c
 	manipulator_library_utils.c
diff --git a/source/blender/editors/manipulator_library/manipulator_library_presets.c b/source/blender/editors/manipulator_library/manipulator_library_presets.c
index eb26927fd4e..bd2aaee8d7a 100644
--- a/source/blender/editors/manipulator_library/manipulator_library_presets.c
+++ b/source/blender/editors/manipulator_library/manipulator_library_presets.c
@@ -60,8 +60,30 @@
 
 /* TODO, this is to be used by RNA. might move to ED_manipulator_library */
 
-void ED_manipulator_draw_preset_box(
-        const struct wmManipulator *mpr, float mat[4][4], int select_id)
+/**
+ * Given a single axis, orient the matrix to a different direction.
+ */
+static void single_axis_convert(
+        int src_axis, float src_mat[4][4],
+        int dst_axis, float dst_mat[4][4])
+{
+	copy_m4_m4(dst_mat, src_mat);
+	if (src_axis == dst_axis) {
+		return;
+	}
+
+	float rotmat[3][3];
+	mat3_from_axis_conversion_single(src_axis, dst_axis, rotmat);
+	transpose_m3(rotmat);
+	mul_m4_m4m3(dst_mat, src_mat, rotmat);
+}
+
+/**
+ * Use for all geometry.
+ */
+static void ed_manipulator_draw_preset_geometry(
+        const struct wmManipulator *mpr, float mat[4][4], int select_id,
+        const ManipulatorGeomInfo *info)
 {
 	const bool is_select = (select_id != -1);
 	const bool is_highlight = is_select && (mpr->state & WM_MANIPULATOR_STATE_HIGHLIGHT) != 0;
@@ -75,7 +97,7 @@ void ED_manipulator_draw_preset_box(
 
 	gpuPushMatrix();
 	gpuMultMatrix(mat);
-	wm_manipulator_geometryinfo_draw(&wm_manipulator_geom_data_cube, is_select, color);
+	wm_manipulator_geometryinfo_draw(info, is_select, color);
 	gpuPopMatrix();
 
 	if (is_select) {
@@ -83,6 +105,28 @@ void ED_manipulator_draw_preset_box(
 	}
 }
 
+void ED_manipulator_draw_preset_box(
+        const struct wmManipulator *mpr, float mat[4][4], int select_id)
+{
+	ed_manipulator_draw_preset_geometry(mpr, mat, select_id, &wm_manipulator_geom_data_cube);
+}
+
+void ED_manipulator_draw_preset_arrow(
+        const struct wmManipulator *mpr, float mat[4][4], int axis, int select_id)
+{
+	float mat_rotate[4][4];
+	single_axis_convert(OB_POSZ, mat, axis, mat_rotate);
+	ed_manipulator_draw_preset_geometry(mpr, mat_rotate, select_id, &wm_manipulator_geom_data_arrow);
+}
+
+void ED_manipulator_draw_preset_circle(
+        const struct wmManipulator *mpr, float mat[4][4], int axis, int select_id)
+{
+	float mat_rotate[4][4];
+	single_axis_convert(OB_POSZ, mat, axis, mat_rotate);
+	ed_manipulator_draw_preset_geometry(mpr, mat_rotate, select_id, &wm_manipulator_geom_data_dial);
+}
+
 void ED_manipulator_draw_preset_facemap(
         const struct wmManipulator *mpr, struct Scene *scene, Object *ob,  const int facemap, int select_id)
 {
diff --git a/source/blender/makesrna/intern/rna_wm_manipulator_api.c b/source/blender/makesrna/intern/rna_wm_manipulator_api.c
index 2e1155c616b..dd678a278d1 100644
--- a/source/blender/makesrna/intern/rna_wm_manipulator_api.c
+++ b/source/blender/makesrna/intern/rna_wm_manipulator_api.c
@@ -50,6 +50,18 @@ static void rna_manipulator_draw_preset_box(
 	ED_manipulator_draw_preset_box(mpr, (float (*)[4])matrix, select_id);
 }
 
+static void rna_manipulator_draw_preset_arrow(
+        wmManipulator *mpr, float matrix[16], int axis, int select_id)
+{
+	ED_manipulator_draw_preset_arrow(mpr, (float (*)[4])matrix, axis, select_id);
+}
+
+static void rna_manipulator_draw_preset_circle(
+        wmManipulator *mpr, float matrix[16], int axis, int select_id)
+{
+	ED_manipulator_draw_preset_circle(mpr, (float (*)[4])matrix, axis, select_id);
+}
+
 static void rna_manipulator_draw_preset_facemap(
         wmManipulator *mpr, struct bContext *C, struct Object *ob, int facemap, int select_id)
 {
@@ -70,6 +82,9 @@ void RNA_api_manipulator(StructRNA *srna)
 	FunctionRNA *func;
 	PropertyRNA *parm;
 
+	/* -------------------------------------------------------------------- */
+	/* Primitive Shapes */
+
 	/* draw_preset_box */
 	func = RNA_def_function(srna, "draw_preset_box", "rna_manipulator_draw_preset_box");
 	RNA_def_function_ui_description(func, "Draw a box");
@@ -79,6 +94,28 @@ void RNA_api_manipulator(StructRNA *srna)
 	RNA_def_property_ui_text(parm, "", "The matrix to transform");
 	RNA_def_int(func, "select_id", -1, -1, INT_MAX, "Zero when not selecting", "", -1, INT_MAX);
 
+	/* draw_preset_box */
+	func = RNA_def_function(srna, "draw_preset_arrow", "rna_manipulator_draw_preset_arrow");
+	RNA_def_function_ui_description(func, "Draw a box");
+	parm = RNA_def_property(func, "matrix", PROP_FLOAT, PROP_MATRIX);
+	RNA_def_property_flag(parm, PARM_REQUIRED);
+	RNA_def_property_multi_array(parm, 2, rna_matrix_dimsize_4x4);
+	RNA_def_property_ui_text(parm, "", "The matrix to transform");
+	RNA_def_enum(func, "axis", rna_enum_object_axis_items, 2, "", "Arrow Orientation");
+	RNA_def_int(func, "select_id", -1, -1, INT_MAX, "Zero when not selecting", "", -1, INT_MAX);
+
+	func = RNA_def_function(srna, "draw_preset_circle", "rna_manipulator_draw_preset_circle");
+	RNA_def_function_ui_description(func, "Draw a box");
+	parm = RNA_def_property(func, "matrix", PROP_FLOAT, PROP_MATRIX);
+	RNA_def_property_flag(parm, PARM_REQUIRED);
+	RNA_def_property_multi_array(parm, 2, rna_matrix_dimsize_4x4);
+	RNA_def_property_ui_text(parm, "", "The matrix to transform");
+	RNA_def_enum(func, "axis", rna_enum_object_axis_items, 2, "", "Arrow Orientation");
+	RNA_def_int(func, "select_id", -1, -1, INT_MAX, "Zero when not selecting", "", -1, INT_MAX);
+
+	/* -------------------------------------------------------------------- */
+	/* Other Shapes */
+
 	/* draw_preset_facemap */
 	func = RNA_def_function(srna, "draw_preset_facemap", "rna_manipulator_draw_preset_facemap");
 	RNA_def_function_ui_description(func, "Draw the face-map of a mesh object");




More information about the Bf-blender-cvs mailing list