[Bf-blender-cvs] [246a104] transform-manipulators: Implement new resize manipulators

Julian Eisel noreply at git.blender.org
Sun Oct 23 23:34:20 CEST 2016


Commit: 246a104dbc7b79fb58c2bc822a30076d768a009f
Author: Julian Eisel
Date:   Sun Oct 23 23:33:18 2016 +0200
Branches: transform-manipulators
https://developer.blender.org/rB246a104dbc7b79fb58c2bc822a30076d768a009f

Implement new resize manipulators

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

M	source/blender/editors/space_view3d/view3d_transform_manipulators.c
M	source/blender/windowmanager/CMakeLists.txt
M	source/blender/windowmanager/manipulators/WM_manipulator_library.h
M	source/blender/windowmanager/manipulators/intern/manipulator_library/arrow_manipulator.c
M	source/blender/windowmanager/manipulators/intern/manipulator_library/geom_cone.c
M	source/blender/windowmanager/manipulators/intern/manipulator_library/manipulator_geometry.h

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

diff --git a/source/blender/editors/space_view3d/view3d_transform_manipulators.c b/source/blender/editors/space_view3d/view3d_transform_manipulators.c
index 714499f..be8a76f 100644
--- a/source/blender/editors/space_view3d/view3d_transform_manipulators.c
+++ b/source/blender/editors/space_view3d/view3d_transform_manipulators.c
@@ -145,19 +145,19 @@ static TranformAxisManipulator tman_axes[] = {
 		MAN_AXIS_TRANS_X, V3D_MANIP_TRANSLATE,
 		manipulator_arrow_init, NULL, manipulator_arrow_draw_prepare,
 		"translate_x", {1, 0, 0}, OB_LOCK_LOCX,
-		1.0f, TRANSFORM_MAN_AXIS_LINE_WIDTH, TH_AXIS_X, MANIPULATOR_ARROW_STYLE_NORMAL,
+		1.0f, TRANSFORM_MAN_AXIS_LINE_WIDTH, TH_AXIS_X, MANIPULATOR_ARROW_STYLE_CONE,
 	},
 	{
 		MAN_AXIS_TRANS_Y, V3D_MANIP_TRANSLATE,
 		manipulator_arrow_init, NULL, manipulator_arrow_draw_prepare,
 		"translate_y", {0, 1, 0}, OB_LOCK_LOCY,
-		1.0f, TRANSFORM_MAN_AXIS_LINE_WIDTH, TH_AXIS_Y, MANIPULATOR_ARROW_STYLE_NORMAL,
+		1.0f, TRANSFORM_MAN_AXIS_LINE_WIDTH, TH_AXIS_Y, MANIPULATOR_ARROW_STYLE_CONE,
 	},
 	{
 		MAN_AXIS_TRANS_Z, V3D_MANIP_TRANSLATE,
 		manipulator_arrow_init, NULL, manipulator_arrow_draw_prepare,
 		"translate_z", {0, 0, 1}, OB_LOCK_LOCZ,
-		1.0f, TRANSFORM_MAN_AXIS_LINE_WIDTH, TH_AXIS_Z, MANIPULATOR_ARROW_STYLE_NORMAL,
+		1.0f, TRANSFORM_MAN_AXIS_LINE_WIDTH, TH_AXIS_Z, MANIPULATOR_ARROW_STYLE_CONE,
 	},
 	{
 		MAN_AXIS_TRANS_C, V3D_MANIP_TRANSLATE,
@@ -189,6 +189,30 @@ static TranformAxisManipulator tman_axes[] = {
 		"rotate_c", {0}, OB_LOCK_ROTZ,
 		1.0f, TRANSFORM_MAN_AXIS_LINE_WIDTH + 1.0f, -1, MANIPULATOR_DIAL_STYLE_RING,
 	},
+	{
+		MAN_AXIS_SCALE_X, V3D_MANIP_SCALE,
+		manipulator_arrow_init, NULL, manipulator_arrow_draw_prepare,
+		"scale_x", {1, 0, 0}, OB_LOCK_SCALEX,
+		1.0f, TRANSFORM_MAN_AXIS_LINE_WIDTH, TH_AXIS_X, MANIPULATOR_ARROW_STYLE_CUBE,
+	},
+	{
+		MAN_AXIS_SCALE_Y, V3D_MANIP_SCALE,
+		manipulator_arrow_init, NULL, manipulator_arrow_draw_prepare,
+		"scale_y", {0, 1, 0}, OB_LOCK_SCALEY,
+		1.0f, TRANSFORM_MAN_AXIS_LINE_WIDTH, TH_AXIS_Y, MANIPULATOR_ARROW_STYLE_CUBE,
+	},
+	{
+		MAN_AXIS_SCALE_Z, V3D_MANIP_SCALE,
+		manipulator_arrow_init, NULL, manipulator_arrow_draw_prepare,
+		"scale_y", {0, 0, 1}, OB_LOCK_SCALEZ,
+		1.0f, TRANSFORM_MAN_AXIS_LINE_WIDTH, TH_AXIS_Z, MANIPULATOR_ARROW_STYLE_CUBE,
+	},
+	{
+		MAN_AXIS_SCALE_C, V3D_MANIP_SCALE,
+		manipulator_dial_init, manipulator_dial_refresh, manipulator_view_dial_draw_prepare,
+		"scale_c", {0}, 0,
+		0.2f, TRANSFORM_MAN_AXIS_LINE_WIDTH, -1, MANIPULATOR_DIAL_STYLE_RING,
+	},
 	{0, 0, NULL}
 };
 
@@ -204,7 +228,11 @@ static void transform_manipulators_info_free(void *customdata)
 	MEM_freeN(info);
 }
 
-static unsigned int transform_axis_index_normalize(const int axis_idx)
+
+/**
+ * Get index within axis type, so that x == 0, y == 1 and z == 2, no matter which axis type.
+ */
+static unsigned int transform_axis_index_normalize(const enum TransformAxisType axis_idx)
 {
 	if (axis_idx > MAN_AXIS_TRANS_ZX) {
 		return axis_idx - 16;
@@ -229,7 +257,7 @@ static unsigned int transform_axis_index_normalize(const int axis_idx)
 
 static wmManipulator *manipulator_arrow_init(const TransformManipulatorsInfo *info, TranformAxisManipulator *axis)
 {
-	return WM_arrow_manipulator_new(info->mgroup, axis->name);
+	return WM_arrow_manipulator_new(info->mgroup, axis->name, axis->manipulator_style);
 }
 
 static wmManipulator *manipulator_dial_init(const TransformManipulatorsInfo *info, TranformAxisManipulator *axis)
@@ -266,7 +294,7 @@ static const char *transform_axis_ot_name_get(int transform_type)
 			name = "TRANSFORM_OT_rotate";
 			break;
 		case V3D_MANIP_SCALE:
-			name = "TRANSFORM_OT_scale";
+			name = "TRANSFORM_OT_resize";
 			break;
 		default:
 			BLI_assert(0);
diff --git a/source/blender/windowmanager/CMakeLists.txt b/source/blender/windowmanager/CMakeLists.txt
index 71e1138..fba5599 100644
--- a/source/blender/windowmanager/CMakeLists.txt
+++ b/source/blender/windowmanager/CMakeLists.txt
@@ -76,6 +76,7 @@ set(SRC
 	manipulators/intern/manipulator_library/arrow_manipulator.c
 	manipulators/intern/manipulator_library/dial_manipulator.c
 	manipulators/intern/manipulator_library/geom_cone.c
+	manipulators/intern/manipulator_library/geom_cube.c
 	manipulators/intern/manipulator_library/manipulator_library_utils.c
 
 	WM_api.h
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_library.h b/source/blender/windowmanager/manipulators/WM_manipulator_library.h
index bf469e9..592db65 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_library.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_library.h
@@ -39,11 +39,13 @@ struct wmManipulatorGroup;
 /* -------------------------------------------------------------------- */
 /* 3D Arrow Manipulator */
 
-enum {
-	MANIPULATOR_ARROW_STYLE_NORMAL        =  (1 << 0),
+enum ArrowManipulatorStyle {
+	MANIPULATOR_ARROW_STYLE_CONE = 0,
+	MANIPULATOR_ARROW_STYLE_CUBE = 1,
 };
 
-struct wmManipulator *WM_arrow_manipulator_new(struct wmManipulatorGroup *mgroup, const char *name);
+struct wmManipulator *WM_arrow_manipulator_new(
+        struct wmManipulatorGroup *mgroup, const char *name, const enum ArrowManipulatorStyle style);
 void WM_arrow_manipulator_set_direction(struct wmManipulator *manipulator, const float direction[3]);
 
 
diff --git a/source/blender/windowmanager/manipulators/intern/manipulator_library/arrow_manipulator.c b/source/blender/windowmanager/manipulators/intern/manipulator_library/arrow_manipulator.c
index 0ff9c73..cef7b57 100644
--- a/source/blender/windowmanager/manipulators/intern/manipulator_library/arrow_manipulator.c
+++ b/source/blender/windowmanager/manipulators/intern/manipulator_library/arrow_manipulator.c
@@ -53,6 +53,8 @@
 typedef struct ArrowManipulator {
 	wmManipulator manipulator;
 
+	int style;
+
 	float direction[3];
 } ArrowManipulator;
 
@@ -75,28 +77,58 @@ static void arrow_draw_line(const ArrowManipulator *arrow, const float col[4], c
 	immUnbindProgram();
 }
 
-static void arrow_draw_cone(const bool select)
+static void arrow_draw_head_cone(const float col[4], const bool select)
 {
 	const ManipulatorGeometryInfo cone_geo = {
-		_MANIPULATOR_nverts_Cone,
-		_MANIPULATOR_ntris_Cone,
-		_MANIPULATOR_verts_Cone,
-		_MANIPULATOR_normals_Cone,
-		_MANIPULATOR_indices_Cone,
+		_MANIPULATOR_nverts_cone,
+		_MANIPULATOR_ntris_cone,
+		_MANIPULATOR_verts_cone,
+		_MANIPULATOR_normals_cone,
+		_MANIPULATOR_indices_cone,
 		true,
 	};
 	const float scale = 0.25f;
 
+	glColor4fv(col);
+	glScalef(scale, scale, scale);
+	wm_manipulator_geometryinfo_draw(&cone_geo, select);
+}
+
+static void arrow_draw_head_cube(const float col[4], const bool select)
+{
+	const ManipulatorGeometryInfo cone_geo = {
+		_MANIPULATOR_nverts_cube,
+		_MANIPULATOR_ntris_cube,
+		_MANIPULATOR_verts_cube,
+		_MANIPULATOR_normals_cube,
+		_MANIPULATOR_indices_cube,
+		true,
+	};
+	const float scale = 0.05f;
+
+	glColor4fv(col);
 	glScalef(scale, scale, scale);
+	glTranslatef(0.0f, 0.0f, 1.0f); /* Cube origin is at its center, needs this offset to not overlap with line. */
 	wm_manipulator_geometryinfo_draw(&cone_geo, select);
 }
 
+static void arrow_draw_head(const ArrowManipulator *arrow, const float col[4], const bool select)
+{
+	switch (arrow->style) {
+		case MANIPULATOR_ARROW_STYLE_CONE:
+			arrow_draw_head_cone(col, select);
+			break;
+		case MANIPULATOR_ARROW_STYLE_CUBE:
+			arrow_draw_head_cube(col, select);
+			break;
+	}
+}
+
 static void arrow_draw_geom(const ArrowManipulator *arrow, const float col[4], const bool select)
 {
 	const float len = 1.0f; /* TODO arrow->len */
 	const bool use_lighting = /*select == false && ((U.manipulator_flag & V3D_SHADED_MANIPULATORS) != 0)*/ false;
 
-	glColor4fv(col);
 	glTranslate3fv(arrow->manipulator.offset);
 
 	arrow_draw_line(arrow, col, len);
@@ -111,7 +143,7 @@ static void arrow_draw_geom(const ArrowManipulator *arrow, const float col[4], c
 		glShadeModel(GL_SMOOTH);
 	}
 
-	arrow_draw_cone(select);
+	arrow_draw_head(arrow, col, select);
 
 	if (use_lighting) {
 		glShadeModel(GL_FLAT);
@@ -198,7 +230,8 @@ static int manipulator_arrow_invoke(bContext *UNUSED(C), const wmEvent *UNUSED(e
  *
  * \{ */
 
-wmManipulator *WM_arrow_manipulator_new(wmManipulatorGroup *mgroup, const char *idname)
+wmManipulator *WM_arrow_manipulator_new(
+		wmManipulatorGroup *mgroup, const char *idname, const enum ArrowManipulatorStyle style)
 {
 	ArrowManipulator *arrow = MEM_callocN(sizeof(*arrow), __func__);
 
@@ -207,6 +240,8 @@ wmManipulator *WM_arrow_manipulator_new(wmManipulatorGroup *mgroup, const char *
 	arrow->manipulator.invoke = manipulator_arrow_invoke;
 	arrow->manipulator.flag |= WM_MANIPULATOR_DRAW_ACTIVE;
 
+	arrow->style = style;
+
 	wm_manipulator_register(mgroup, &arrow->manipulator, idname);
 
 	return &arrow->manipulator;
diff --git a/source/blender/windowmanager/manipulators/intern/manipulator_library/geom_cone.c b/source/blender/windowmanager/manipulators/intern/manipulator_library/geom_cone.c
index 701bffa..3d63ff1 100644
--- a/source/blender/windowmanager/manipulators/intern/manipulator_library/geom_cone.c
+++ b/source/blender/windowmanager/manipulators/intern/manipulator_library/geom_cone.c
@@ -22,10 +22,10 @@
  *  \ingroup wm
  */
 
-int _MANIPULATOR_nverts_Cone = 10;
-int _MANIPULATOR_ntris_Cone = 16;
+int _MANIPULATOR_nverts_cone = 10;
+int _MANIPULATOR_ntris_cone = 16;
 
-float _MANIPULATOR_verts_Cone[][3] = {
+float _MANIPULATOR_verts_cone[][3] = {
 	{0.000000, 0.000000, 0.000000},
 	{0.000000, 0.000000, 1.000000},
 	{0.000000, 0.270000, 0.000000},
@@ -38,7 +38,7 @@ float _MANIPULATOR_verts_Cone[][3] = {
 	{-0.190919, 0.190919, 0.000000},
 };
 
-float _MANIPULATOR_normals_Cone[][3] = {
+float _MANIPULATOR_normals_cone[][3] = {
 	{0.000000, 0.000000, -1.000000},
 	{0.000000, 0.000000, 0.999969},
 	{0.000000, 0.848567, -0.529069},
@@ -51,7 +51,7 @@ float _MANIPULATOR_normals_Cone[][3] = {
 	{-0.600024, 0.600024, -0.529069},
 };
 
-unsigned short _MANIPULATOR_indices_Cone[] = {
+unsigned short _MANIPULATOR_indices_cone[] = {
 	0, 2, 3,
 	2, 1, 3,
 	0, 3, 4,
diff --git a/source/blender/windowmanager/manipulators/intern/manipulator_library/manipulator_geometry.h b/source/blender/windowmanager/man

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list