[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