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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to