[Bf-blender-cvs] [9bb94192199] custom-manipulators: Merge branch 'blender2.8' into custom-manipulators
Campbell Barton
noreply at git.blender.org
Mon Apr 3 05:18:15 CEST 2017
Commit: 9bb94192199e2b35734ee123e09dc56ce81b3da0
Author: Campbell Barton
Date: Mon Apr 3 13:05:54 2017 +1000
Branches: custom-manipulators
https://developer.blender.org/rB9bb94192199e2b35734ee123e09dc56ce81b3da0
Merge branch 'blender2.8' into custom-manipulators
===================================================================
===================================================================
diff --cc source/blender/editors/space_view3d/view3d_draw_legacy.c
index 2566edb6183,3d43bc011e6..79eaa54881b
--- a/source/blender/editors/space_view3d/view3d_draw_legacy.c
+++ b/source/blender/editors/space_view3d/view3d_draw_legacy.c
@@@ -2547,15 -2551,13 +2553,20 @@@ void view3d_main_region_draw_legacy(con
if (v3d->drawtype == OB_RENDER)
view3d_main_region_draw_engine(C, scene, ar, v3d, clip_border, &border_rect);
+ VP_legacy_view3d_main_region_setup_view(scene, v3d, ar, NULL, NULL);
+ glClear(GL_DEPTH_BUFFER_BIT);
+
+ WM_manipulatormap_draw(ar->manipulator_map, C, WM_MANIPULATORMAP_DRAWSTEP_2D);
+
+ ED_region_pixelspace(ar);
+
view3d_main_region_draw_info(C, scene, ar, v3d, grid_unit, render_border);
+ glMatrixMode(GL_PROJECTION);
+ gpuPopMatrix();
+ glMatrixMode(GL_MODELVIEW);
+ gpuPopMatrix();
+
v3d->flag |= V3D_INVALID_BACKBUF;
BLI_assert(BLI_listbase_is_empty(&v3d->afterdraw_transp));
diff --cc source/blender/editors/transform/transform_manipulator.c
index a459b3a071b,a9b3363e0c8..1563328a963
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@@ -1005,62 -703,101 +1005,62 @@@ static void drawflags_posemode(Object *
}
}
-
-/* ******************** DRAWING STUFFIES *********** */
-
-static float screen_aligned(RegionView3D *rv3d, float mat[4][4])
+static void drawflags_editmode(Object *obedit, View3D *v3d, RegionView3D *rv3d)
{
- gpuTranslate3fv(mat[3]);
-
- /* sets view screen aligned */
- gpuRotate3f(-360.0f * saacos(rv3d->viewquat[0]) / (float)M_PI, rv3d->viewquat[1], rv3d->viewquat[2], rv3d->viewquat[3]);
-
- return len_v3(mat[0]); /* draw scale */
-}
-
+ if ((obedit->lay & v3d->lay) == 0)
+ return;
-/* radring = radius of doughnut rings
- * radhole = radius hole
- * start = starting segment (based on nrings)
- * end = end segment
- * nsides = amount of points in ring
- * nrigns = amount of rings
- */
-static void partial_doughnut(unsigned int pos, float radring, float radhole, int start, int end, int nsides, int nrings)
-{
- float theta, phi, theta1;
- float cos_theta, sin_theta;
- float cos_theta1, sin_theta1;
- float ring_delta, side_delta;
- int i, j, do_caps = true;
-
- if (start == 0 && end == nrings) do_caps = false;
-
- ring_delta = 2.0f * (float)M_PI / (float)nrings;
- side_delta = 2.0f * (float)M_PI / (float)nsides;
-
- theta = (float)M_PI + 0.5f * ring_delta;
- cos_theta = cosf(theta);
- sin_theta = sinf(theta);
-
- for (i = nrings - 1; i >= 0; i--) {
- theta1 = theta + ring_delta;
- cos_theta1 = cosf(theta1);
- sin_theta1 = sinf(theta1);
-
- if (do_caps && i == start) { // cap
- immBegin(GL_TRIANGLE_FAN, nsides+1);
- phi = 0.0;
- for (j = nsides; j >= 0; j--) {
- float cos_phi, sin_phi, dist;
-
- phi += side_delta;
- cos_phi = cosf(phi);
- sin_phi = sinf(phi);
- dist = radhole + radring * cos_phi;
-
- immVertex3f(pos, cos_theta1 * dist, -sin_theta1 * dist, radring * sin_phi);
- }
- immEnd();
+ if (obedit->type == OB_ARMATURE) {
+ const bArmature *arm = obedit->data;
+ EditBone *ebo;
+ if ((v3d->around == V3D_AROUND_ACTIVE) && (ebo = arm->act_edbone)) {
+ if (ebo->flag & BONE_EDITMODE_LOCKED)
+ protectflag_to_drawflags(OB_LOCK_LOC | OB_LOCK_ROT | OB_LOCK_SCALE, &rv3d->twdrawflag);
}
- if (i >= start && i <= end) {
- immBegin(GL_TRIANGLE_STRIP, (nsides+1) * 2);
- phi = 0.0;
- for (j = nsides; j >= 0; j--) {
- float cos_phi, sin_phi, dist;
-
- phi += side_delta;
- cos_phi = cosf(phi);
- sin_phi = sinf(phi);
- dist = radhole + radring * cos_phi;
-
- immVertex3f(pos, cos_theta1 * dist, -sin_theta1 * dist, radring * sin_phi);
- immVertex3f(pos, cos_theta * dist, -sin_theta * dist, radring * sin_phi);
+ else {
+ for (ebo = arm->edbo->first; ebo; ebo = ebo->next) {
+ if (EBONE_VISIBLE(arm, ebo)) {
+ if (ebo->flag & BONE_SELECTED) {
+ if (ebo->flag & BONE_EDITMODE_LOCKED)
+ protectflag_to_drawflags(OB_LOCK_LOC | OB_LOCK_ROT | OB_LOCK_SCALE, &rv3d->twdrawflag);
+ }
+ }
}
- immEnd();
}
+ }
+}
- if (do_caps && i == end) { // cap
- immBegin(GL_TRIANGLE_FAN, nsides+1);
- phi = 0.0;
- for (j = nsides; j >= 0; j--) {
- float cos_phi, sin_phi, dist;
+/**
+ * Refresh RegionView3D.twdrawflag based on protect-flags.
+ */
+static void manipulator_drawflags_refresh(const bContext *C, View3D *v3d, RegionView3D *rv3d)
+{
- Scene *scene = CTX_data_scene(C);
- Object *ob = OBACT, *obedit = CTX_data_edit_object(C);
++ SceneLayer *sl = CTX_data_scene_layer(C);
++ Object *ob = OBACT_NEW, *obedit = CTX_data_edit_object(C);
+ bGPdata *gpd = CTX_data_gpencil_data(C);
+ const bool is_gp_edit = ((gpd) && (gpd->flag & GP_DATA_STROKE_EDITMODE));
- phi -= side_delta;
- cos_phi = cosf(phi);
- sin_phi = sinf(phi);
- dist = radhole + radring * cos_phi;
+ /* all enabled */
+ rv3d->twdrawflag = 0xFFFF;
- immVertex3f(pos, cos_theta * dist, -sin_theta * dist, radring * sin_phi);
+ if (is_gp_edit) {
+ /* pass */
+ }
+ else if (obedit) {
+ drawflags_editmode(obedit, v3d, rv3d);
+ }
+ else if (ob && (ob->mode & OB_MODE_POSE)) {
+ drawflags_posemode(ob, v3d, rv3d);
+ }
+ else if (ob && (ob->mode & OB_MODE_ALL_PAINT)) {
+ /* pass */
+ }
+ else {
- for (Base *base = scene->base.first; base; base = base->next) {
- if (TESTBASELIB(v3d, base)) {
++ for (Base *base = sl->object_bases.first; base; base = base->next) {
++ if (TESTBASELIB_NEW(base)) {
+ protectflag_to_drawflags(base->object->protectflag, &rv3d->twdrawflag);
}
- immEnd();
}
-
-
- theta = theta1;
- cos_theta = cos_theta1;
- sin_theta = sin_theta1;
}
}
@@@ -1074,61 -814,119 +1074,62 @@@ static void manipulator_get_idot(Region
}
}
-/* three colors can be set:
- * gray for ghosting
- * moving: in transform theme color
- * else the red/green/blue
- */
-static void manipulator_setcolor(View3D *v3d, char axis, int colcode, unsigned char alpha)
+static void manipulator_prepare_mat(const bContext *C, View3D *v3d, RegionView3D *rv3d)
{
- unsigned char col[4] = {0};
- col[3] = alpha;
+ Scene *scene = CTX_data_scene(C);
++ SceneLayer *sl = CTX_data_scene_layer(C);
- if (colcode == MAN_GHOST) {
- col[3] = 70;
- }
- else if (colcode == MAN_MOVECOL) {
- UI_GetThemeColor3ubv(TH_TRANSFORM, col);
- }
- else {
- switch (axis) {
- case 'C':
- UI_GetThemeColor3ubv(TH_TRANSFORM, col);
- if (v3d->twmode == V3D_MANIP_LOCAL) {
- col[0] = col[0] > 200 ? 255 : col[0] + 55;
- col[1] = col[1] > 200 ? 255 : col[1] + 55;
- col[2] = col[2] > 200 ? 255 : col[2] + 55;
+ switch (v3d->around) {
+ case V3D_AROUND_CENTER_BOUNDS:
+ case V3D_AROUND_ACTIVE:
+ {
+ bGPdata *gpd = CTX_data_gpencil_data(C);
- Object *ob = OBACT;
++ Object *ob = OBACT_NEW;
+
+ if (((v3d->around == V3D_AROUND_ACTIVE) && (scene->obedit == NULL)) &&
+ ((gpd == NULL) || !(gpd->flag & GP_DATA_STROKE_EDITMODE)) &&
+ (!(ob->mode & OB_MODE_POSE)))
+ {
+ copy_v3_v3(rv3d->twmat[3], ob->obmat[3]);
}
- else if (v3d->twmode == V3D_MANIP_NORMAL) {
- col[0] = col[0] < 55 ? 0 : col[0] - 55;
- col[1] = col[1] < 55 ? 0 : col[1] - 55;
- col[2] = col[2] < 55 ? 0 : col[2] - 55;
+ else {
+ mid_v3_v3v3(rv3d->twmat[3], scene->twmin, scene->twmax);
}
break;
- case 'X':
- UI_GetThemeColor3ubv(TH_AXIS_X, col);
- break;
- case 'Y':
- UI_GetThemeColor3ubv(TH_AXIS_Y, col);
- break;
- case 'Z':
- UI_GetThemeColor3ubv(TH_AXIS_Z, col);
- break;
- default:
- BLI_assert(0);
- break;
}
+ case V3D_AROUND_LOCAL_ORIGINS:
+ case V3D_AROUND_CENTER_MEAN:
+ copy_v3_v3(rv3d->twmat[3], scene->twcent);
+ break;
+ case V3D_AROUND_CURSOR:
+ copy_v3_v3(rv3d->twmat[3], ED_view3d_cursor3d_get(scene, v3d));
+ break;
}
-
- immUniformColor4ubv(col);
}
-static void manipulator_axis_order(RegionView3D *rv3d, int r_axis_order[3])
+/**
+ * Sets up \a r_start and \a r_len to define arrow line range.
+ * Needed to adjust line drawing for combined manipulator axis types.
+ */
+static void manipulator_line_range(const View3D *v3d, const short axis_type, float *r_start, float *r_len)
{
- float axis_values[3];
- float vec[3];
+ const float ofs = 0.2f;
- ED_view3d_global_to_vector(rv3d, rv3d->twmat[3], vec);
+ *r_start = 0.2f;
+ *r_len = 1.0f;
- axis_values[0] = -dot_v3v3(rv3d->twmat[0], vec);
- axis_values[1] = -dot_v3v3(rv3d->twmat[1], vec);
- axis_values[2] = -dot_v3v3(rv3d->twmat[2], vec);
-
- axis_sort_v3(axis_values, r_axis_order);
-}
-
-/* viewmatrix should have been set OK, also no shademode! */
-static void draw_manipulator_axes_single(View3D *v3d, RegionView3D *rv3d, int colcode,
- int flagx, int flagy, int flagz, int axis,
- const bool is_picksel, unsigned int pos)
-{
- switch (axis) {
- case 0:
- /* axes */
- if (flagx) {
- if (is_picksel) {
- if (flagx & MAN_SCALE_X) GPU_select_load_id(MAN_SCALE_X);
- else if (flagx & MAN_TRANS_X) GPU_select_load_id(MAN_TRANS_X);
- }
- else {
- manipulator_setcolor(v3d, 'X', colcode, axisBlendAngle(rv3d->tw_idot[0]));
- }
- immBegin(GL_LINES, 2);
- immVertex3f(pos, 0.2f, 0.0f, 0.0f);
- immVertex3f(pos, 1.0f, 0.0f, 0.0f);
- immEnd();
+ switch (axis_type) {
+ case MAN_AXES_TRANSLATE:
+ if (v3d->twtype & V3D_MANIP_SCALE) {
+ *r_start = *r_len - ofs + 0.075f;
}
- break;
- case 1:
- if (flagy) {
- if (is_picksel) {
- if (flagy & MAN_SCALE_Y) GPU_select_load_id(MAN_SCALE_Y);
- else if (flagy & MAN_TRANS_Y) GPU_select_load_id(MAN_TRANS_Y);
- }
- else {
- manipulator_setcolor(v3d, 'Y', colcode, axisBlendAngle(rv3d->tw_idot[1]));
- }
- immBegin(GL_LINES, 2);
- immVertex3f(pos, 0.0f, 0.2f, 0.0f);
- immVertex3f(pos, 0.0f, 1.0f, 0.0f);
- immEnd();
+ if (v3d->twtype & V3D_MANIP_ROTATE) {
+ *r
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list