[Bf-blender-cvs] [dfb890947d0] blender2.8: Manipulator: store initial-final matrix for reuse

Campbell Barton noreply at git.blender.org
Tue Aug 15 05:43:38 CEST 2017


Commit: dfb890947d036bca735abcc56d55bd2572aefcb3
Author: Campbell Barton
Date:   Tue Aug 15 13:27:31 2017 +1000
Branches: blender2.8
https://developer.blender.org/rBdfb890947d036bca735abcc56d55bd2572aefcb3

Manipulator: store initial-final matrix for reuse

Also take matrix_space into account when calculating final pixel size.

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

M	source/blender/editors/manipulator_library/manipulator_library_intern.h
M	source/blender/editors/manipulator_library/manipulator_types/arrow2d_manipulator.c
M	source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c
M	source/blender/editors/manipulator_library/manipulator_types/grab3d_manipulator.c
M	source/blender/editors/manipulator_library/manipulator_types/primitive3d_manipulator.c
M	source/blender/windowmanager/manipulators/WM_manipulator_types.h
M	source/blender/windowmanager/manipulators/intern/wm_manipulator.c

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

diff --git a/source/blender/editors/manipulator_library/manipulator_library_intern.h b/source/blender/editors/manipulator_library/manipulator_library_intern.h
index 3a504ebe1d2..92ca195f21d 100644
--- a/source/blender/editors/manipulator_library/manipulator_library_intern.h
+++ b/source/blender/editors/manipulator_library/manipulator_library_intern.h
@@ -50,10 +50,10 @@ typedef struct ManipulatorCommonData {
 
 typedef struct ManipulatorInteraction {
 	float init_value; /* initial property value */
-	float init_matrix_basis[4][4];
 	float init_mval[2];
 	float init_offset;
-	float init_scale_final;
+	float init_matrix_final[4][4];
+	float init_matrix_basis[4][4];
 
 	/* offset of last handling step */
 	float prev_offset;
diff --git a/source/blender/editors/manipulator_library/manipulator_types/arrow2d_manipulator.c b/source/blender/editors/manipulator_library/manipulator_types/arrow2d_manipulator.c
index d8af351b4e3..1185bec2a2d 100644
--- a/source/blender/editors/manipulator_library/manipulator_types/arrow2d_manipulator.c
+++ b/source/blender/editors/manipulator_library/manipulator_types/arrow2d_manipulator.c
@@ -66,18 +66,12 @@ static void arrow2d_draw_geom(wmManipulator *mpr, const float matrix[4][4], cons
 	const float size_h = size / 2.0f;
 	const float arrow_length = RNA_float_get(mpr->ptr, "length");
 	const float arrow_angle = RNA_float_get(mpr->ptr, "angle");
-	const float draw_line_ofs = (mpr->line_width * 0.5f) / mpr->scale_final;
 
 	uint pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
 
 	gpuPushMatrix();
 	gpuMultMatrix(matrix);
-	gpuScaleUniform(mpr->scale_final);
 	gpuRotate2D(RAD2DEGF(arrow_angle));
-	/* local offset */
-	gpuTranslate2f(
-	        mpr->matrix_offset[3][0] + draw_line_ofs,
-	        mpr->matrix_offset[3][1]);
 
 	immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR);
 
@@ -103,18 +97,23 @@ static void manipulator_arrow2d_draw(const bContext *UNUSED(C), wmManipulator *m
 {
 	float color[4];
 
+	float matrix_final[4][4];
+
 	manipulator_color_get(mpr, mpr->state & WM_MANIPULATOR_STATE_HIGHLIGHT, color);
 
 	glLineWidth(mpr->line_width);
+
+	WM_manipulator_calc_matrix_final(mpr, matrix_final);
+
 	glEnable(GL_BLEND);
-	arrow2d_draw_geom(mpr, mpr->matrix_basis, color);
+	arrow2d_draw_geom(mpr, matrix_final, color);
 	glDisable(GL_BLEND);
 
 	if (mpr->interaction_data) {
 		ManipulatorInteraction *inter = mpr->interaction_data;
 
 		glEnable(GL_BLEND);
-		arrow2d_draw_geom(mpr, inter->init_matrix_basis, (const float[4]){0.5f, 0.5f, 0.5f, 0.5f});
+		arrow2d_draw_geom(mpr, inter->init_matrix_final, (const float[4]){0.5f, 0.5f, 0.5f, 0.5f});
 		glDisable(GL_BLEND);
 	}
 }
@@ -130,6 +129,8 @@ static void manipulator_arrow2d_invoke(
 	ManipulatorInteraction *inter = MEM_callocN(sizeof(ManipulatorInteraction), __func__);
 
 	copy_m4_m4(inter->init_matrix_basis, mpr->matrix_basis);
+	WM_manipulator_calc_matrix_final(mpr, inter->init_matrix_final);
+
 	mpr->interaction_data = inter;
 }
 
diff --git a/source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c b/source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c
index a7a454d62c3..970850dca06 100644
--- a/source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c
+++ b/source/blender/editors/manipulator_library/manipulator_types/arrow3d_manipulator.c
@@ -79,7 +79,7 @@ typedef struct ArrowManipulator3D {
 
 /* -------------------------------------------------------------------- */
 
-static void manipulator_arrow_matrix_world_get(wmManipulator *mpr, float r_matrix[4][4])
+static void manipulator_arrow_matrix_basis_get(wmManipulator *mpr, float r_matrix[4][4])
 {
 	ArrowManipulator3D *arrow = (ArrowManipulator3D *)mpr;
 
@@ -188,7 +188,7 @@ static void arrow_draw_intern(ArrowManipulator3D *arrow, const bool select, cons
 	float matrix_final[4][4];
 
 	manipulator_color_get(mpr, highlight, color);
-	manipulator_arrow_matrix_world_get(mpr, matrix_basis_adjust);
+	manipulator_arrow_matrix_basis_get(mpr, matrix_basis_adjust);
 
 	WM_manipulator_calc_matrix_final_params(
 	        mpr, &((struct WM_ManipulatorMatrixParams) {
@@ -206,14 +206,8 @@ static void arrow_draw_intern(ArrowManipulator3D *arrow, const bool select, cons
 	if (mpr->interaction_data) {
 		ManipulatorInteraction *inter = mpr->interaction_data;
 
-		WM_manipulator_calc_matrix_final_params(
-		        mpr, &((struct WM_ManipulatorMatrixParams) {
-		            .matrix_basis = inter->init_matrix_basis,
-		            .scale_final = &inter->init_scale_final,
-		        }), matrix_final);
-
 		gpuPushMatrix();
-		gpuMultMatrix(matrix_final);
+		gpuMultMatrix(inter->init_matrix_final);
 
 
 		glEnable(GL_BLEND);
@@ -386,9 +380,8 @@ static void manipulator_arrow_invoke(
 	inter->init_mval[0] = event->mval[0];
 	inter->init_mval[1] = event->mval[1];
 
-	inter->init_scale_final = mpr->scale_final;
-
-	manipulator_arrow_matrix_world_get(mpr, inter->init_matrix_basis);
+	manipulator_arrow_matrix_basis_get(mpr, inter->init_matrix_basis);
+	WM_manipulator_calc_matrix_final(mpr, inter->init_matrix_final);
 
 	mpr->interaction_data = inter;
 }
@@ -467,7 +460,7 @@ static void MANIPULATOR_WT_arrow_3d(wmManipulatorType *wt)
 	/* api callbacks */
 	wt->draw = manipulator_arrow_draw;
 	wt->draw_select = manipulator_arrow_draw_select;
-	wt->matrix_world_get = manipulator_arrow_matrix_world_get;
+	wt->matrix_basis_get = manipulator_arrow_matrix_basis_get;
 	wt->modal = manipulator_arrow_modal;
 	wt->setup = manipulator_arrow_setup;
 	wt->invoke = manipulator_arrow_invoke;
diff --git a/source/blender/editors/manipulator_library/manipulator_types/grab3d_manipulator.c b/source/blender/editors/manipulator_library/manipulator_types/grab3d_manipulator.c
index 01376cf6184..d3843bbb6cb 100644
--- a/source/blender/editors/manipulator_library/manipulator_types/grab3d_manipulator.c
+++ b/source/blender/editors/manipulator_library/manipulator_types/grab3d_manipulator.c
@@ -73,8 +73,7 @@ typedef struct GrabInteraction {
 	/* only for when using properties */
 	float init_prop_co[3];
 
-	float init_matrix_basis[4][4];
-	float init_scale_final;
+	float init_matrix_final[4][4];
 
 	/* final output values, used for drawing */
 	struct {
@@ -184,14 +183,8 @@ static void grab3d_draw_intern(
 	if (mpr->interaction_data) {
 		GrabInteraction *inter = mpr->interaction_data;
 
-		WM_manipulator_calc_matrix_final_params(
-		        mpr, &((struct WM_ManipulatorMatrixParams) {
-		            .matrix_basis = inter->init_matrix_basis,
-		            .scale_final = &inter->init_scale_final,
-		        }), matrix_final);
-
 		gpuPushMatrix();
-		gpuMultMatrix(matrix_final);
+		gpuMultMatrix(inter->init_matrix_final);
 
 		if (align_view) {
 			gpuMultMatrix(matrix_align);
@@ -261,8 +254,7 @@ static void manipulator_grab_invoke(
 	inter->init_mval[0] = event->mval[0];
 	inter->init_mval[1] = event->mval[1];
 
-	copy_m4_m4(inter->init_matrix_basis, mpr->matrix_basis);
-	inter->init_scale_final = mpr->scale_final;
+	WM_manipulator_calc_matrix_final(mpr, inter->init_matrix_final);
 
 	wmManipulatorProperty *mpr_prop = WM_manipulator_target_property_find(mpr, "offset");
 	if (WM_manipulator_target_property_is_valid(mpr_prop)) {
diff --git a/source/blender/editors/manipulator_library/manipulator_types/primitive3d_manipulator.c b/source/blender/editors/manipulator_library/manipulator_types/primitive3d_manipulator.c
index fc9b08b31cf..44878a24430 100644
--- a/source/blender/editors/manipulator_library/manipulator_types/primitive3d_manipulator.c
+++ b/source/blender/editors/manipulator_library/manipulator_types/primitive3d_manipulator.c
@@ -114,14 +114,8 @@ static void manipulator_primitive_draw_intern(
 		copy_v3_fl(color_outer, 0.5f);
 		color_outer[3] = 0.8f;
 
-		WM_manipulator_calc_matrix_final_params(
-		        mpr, &((struct WM_ManipulatorMatrixParams) {
-		            .matrix_basis = inter->init_matrix_basis,
-		            .scale_final = &inter->init_scale_final,
-		        }), matrix_final);
-
 		gpuPushMatrix();
-		gpuMultMatrix(matrix_final);
+		gpuMultMatrix(inter->init_matrix_final);
 
 		glEnable(GL_BLEND);
 		manipulator_primitive_draw_geom(color_inner, color_outer, draw_style);
@@ -156,8 +150,7 @@ static void manipulator_primitive_invoke(
 {
 	ManipulatorInteraction *inter = MEM_callocN(sizeof(ManipulatorInteraction), __func__);
 
-	copy_m4_m4(inter->init_matrix_basis, mpr->matrix_basis);
-	inter->init_scale_final = mpr->scale_final;
+	WM_manipulator_calc_matrix_final(mpr, inter->init_matrix_final);
 
 	mpr->interaction_data = inter;
 }
diff --git a/source/blender/windowmanager/manipulators/WM_manipulator_types.h b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
index 7bfc08c7caa..82bf556ce20 100644
--- a/source/blender/windowmanager/manipulators/WM_manipulator_types.h
+++ b/source/blender/windowmanager/manipulators/WM_manipulator_types.h
@@ -273,7 +273,7 @@ typedef struct wmManipulatorType {
 	 * - Scale isn't applied (wmManipulator.scale/user_scale).
 	 * - Offset isn't applied (wmManipulator.matrix_offset).
 	 */
-	wmManipulatorFnMatrixWorldGet matrix_world_get;
+	wmManipulatorFnMatrixWorldGet matrix_basis_get;
 
 	/* activate a manipulator state when the user clicks on it */
 	wmManipulatorFnInvoke invoke;
diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
index ccb6a39350f..fe7dbb56d6e 100644
--- a/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
+++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator.c
@@ -446,15 +446,18 @@ void wm_manipulator_calculate_scale(wmManipulator *mpr, const bContext *C)
 		scale *= U.manipulator_size;
 		if (rv3d) {
 			/* 'ED_view3d_pixel_size' includes 'U.pixelsize', remove it. */
-			if (mpr->type->matrix_world_get) {
-				float matrix_world[4][4];
-
-				mpr->type->matrix_world_get(mpr, matrix_world);
-				scale *= ED_view3d_pixel_size(rv3d, matrix_world[3]) / U.pixelsize;
+			float matrix_world[4][4];
+			if (mpr->type->matrix_basis_get) {
+				float matrix_basis[4][4];
+				mpr->type->matrix_basis_get(mpr, matrix_basis);
+				mul_m4_m4m4(matrix_world, mpr->

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list