[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52823] trunk/blender: fix [#33442] Units

Campbell Barton ideasman42 at gmail.com
Sun Dec 9 11:48:24 CET 2012


Revision: 52823
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52823
Author:   campbellbarton
Date:     2012-12-09 10:48:18 +0000 (Sun, 09 Dec 2012)
Log Message:
-----------
fix [#33442] Units
adding meshes were scaling the user input values so the distance on the button didnt relate to the scale of the object added.

Now use an invoke function that scales unset default values.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/space_info.py
    trunk/blender/source/blender/editors/include/ED_view3d.h
    trunk/blender/source/blender/editors/mesh/editmesh_add.c
    trunk/blender/source/blender/editors/object/object_add.c
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
    trunk/blender/source/blender/windowmanager/WM_api.h
    trunk/blender/source/blender/windowmanager/intern/wm_operators.c

Modified: trunk/blender/release/scripts/startup/bl_ui/space_info.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/space_info.py	2012-12-09 05:18:56 UTC (rev 52822)
+++ trunk/blender/release/scripts/startup/bl_ui/space_info.py	2012-12-09 10:48:18 UTC (rev 52823)
@@ -193,7 +193,7 @@
     def draw(self, context):
         layout = self.layout
 
-        layout.operator_context = 'EXEC_REGION_WIN'
+        layout.operator_context = 'INVOKE_REGION_WIN'
         layout.operator("mesh.primitive_plane_add", icon='MESH_PLANE', text="Plane")
         layout.operator("mesh.primitive_cube_add", icon='MESH_CUBE', text="Cube")
         layout.operator("mesh.primitive_circle_add", icon='MESH_CIRCLE', text="Circle")

Modified: trunk/blender/source/blender/editors/include/ED_view3d.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_view3d.h	2012-12-09 05:18:56 UTC (rev 52822)
+++ trunk/blender/source/blender/editors/include/ED_view3d.h	2012-12-09 10:48:18 UTC (rev 52823)
@@ -295,6 +295,8 @@
 
 #define VIEW3D_MARGIN 1.4f
 float ED_view3d_offset_distance(float mat[4][4], float ofs[3]);
+
+float ED_scene_grid_scale(struct Scene *scene, const char **grid_unit);
 float ED_view3d_grid_scale(struct Scene *scene, struct View3D *v3d, const char **grid_unit);
 
 /* view matrix properties utilities */

Modified: trunk/blender/source/blender/editors/mesh/editmesh_add.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_add.c	2012-12-09 05:18:56 UTC (rev 52822)
+++ trunk/blender/source/blender/editors/mesh/editmesh_add.c	2012-12-09 10:48:18 UTC (rev 52823)
@@ -204,7 +204,7 @@
 
 	if (!EDBM_op_call_and_selectf(em, op, "verts.out",
 	                              "create_circle segments=%i diameter=%f cap_ends=%b cap_tris=%b matrix=%m4",
-	                              RNA_int_get(op->ptr, "vertices"), RNA_float_get(op->ptr, "radius") * dia,
+	                              RNA_int_get(op->ptr, "vertices"), RNA_float_get(op->ptr, "radius"),
 	                              cap_end, cap_tri, mat))
 	{
 		return OPERATOR_CANCELLED;
@@ -225,6 +225,7 @@
 	ot->idname = "MESH_OT_primitive_circle_add";
 
 	/* api callbacks */
+	ot->invoke = WM_operator_view3d_distance_invoke;
 	ot->exec = add_primitive_circle_exec;
 	ot->poll = ED_operator_scene_editable;
 
@@ -260,10 +261,10 @@
 	        em, op, "verts.out",
 	        "create_cone segments=%i diameter1=%f diameter2=%f cap_ends=%b cap_tris=%b depth=%f matrix=%m4",
 	        RNA_int_get(op->ptr, "vertices"),
-	        RNA_float_get(op->ptr, "radius") * dia,
-	        RNA_float_get(op->ptr, "radius") * dia,
+	        RNA_float_get(op->ptr, "radius"),
+	        RNA_float_get(op->ptr, "radius"),
 	        cap_end, cap_tri,
-	        RNA_float_get(op->ptr, "depth") * dia, mat))
+	        RNA_float_get(op->ptr, "depth"), mat))
 	{
 		return OPERATOR_CANCELLED;
 	}
@@ -283,6 +284,7 @@
 	ot->idname = "MESH_OT_primitive_cylinder_add";
 
 	/* api callbacks */
+	ot->invoke = WM_operator_view3d_distance_invoke;
 	ot->exec = add_primitive_cylinder_exec;
 	ot->poll = ED_operator_scene_editable;
 
@@ -319,8 +321,8 @@
 	if (!EDBM_op_call_and_selectf(
 	        em, op, "verts.out",
 	        "create_cone segments=%i diameter1=%f diameter2=%f cap_ends=%b cap_tris=%b depth=%f matrix=%m4",
-	        RNA_int_get(op->ptr, "vertices"), RNA_float_get(op->ptr, "radius1") * dia,
-	        RNA_float_get(op->ptr, "radius2") * dia, cap_end, cap_tri, RNA_float_get(op->ptr, "depth") * dia, mat))
+	        RNA_int_get(op->ptr, "vertices"), RNA_float_get(op->ptr, "radius1"),
+	        RNA_float_get(op->ptr, "radius2"), cap_end, cap_tri, RNA_float_get(op->ptr, "depth"), mat))
 	{
 		return OPERATOR_CANCELLED;
 	}
@@ -340,6 +342,7 @@
 	ot->idname = "MESH_OT_primitive_cone_add";
 
 	/* api callbacks */
+	ot->invoke = WM_operator_view3d_distance_invoke;
 	ot->exec = add_primitive_cone_exec;
 	ot->poll = ED_operator_scene_editable;
 
@@ -376,7 +379,7 @@
 	                              "create_grid x_segments=%i y_segments=%i size=%f matrix=%m4",
 	                              RNA_int_get(op->ptr, "x_subdivisions"),
 	                              RNA_int_get(op->ptr, "y_subdivisions"),
-	                              RNA_float_get(op->ptr, "size") * dia, mat))
+	                              RNA_float_get(op->ptr, "size"), mat))
 	{
 		return OPERATOR_CANCELLED;
 	}
@@ -396,6 +399,7 @@
 	ot->idname = "MESH_OT_primitive_grid_add";
 
 	/* api callbacks */
+	ot->invoke = WM_operator_view3d_distance_invoke;
 	ot->exec = add_primitive_grid_exec;
 	ot->poll = ED_operator_scene_editable;
 
@@ -473,7 +477,7 @@
 	if (!EDBM_op_call_and_selectf(em, op, "verts.out",
 	                              "create_uvsphere u_segments=%i v_segments=%i diameter=%f matrix=%m4",
 	                              RNA_int_get(op->ptr, "segments"), RNA_int_get(op->ptr, "ring_count"),
-	                              RNA_float_get(op->ptr, "size") * dia, mat))
+	                              RNA_float_get(op->ptr, "size"), mat))
 	{
 		return OPERATOR_CANCELLED;
 	}
@@ -493,6 +497,7 @@
 	ot->idname = "MESH_OT_primitive_uv_sphere_add";
 
 	/* api callbacks */
+	ot->invoke = WM_operator_view3d_distance_invoke;
 	ot->exec = add_primitive_uvsphere_exec;
 	ot->poll = ED_operator_scene_editable;
 
@@ -525,7 +530,7 @@
 	        em, op, "verts.out",
 	        "create_icosphere subdivisions=%i diameter=%f matrix=%m4",
 	        RNA_int_get(op->ptr, "subdivisions"),
-	        RNA_float_get(op->ptr, "size") * dia, mat))
+	        RNA_float_get(op->ptr, "size"), mat))
 	{
 		return OPERATOR_CANCELLED;
 	}
@@ -545,6 +550,7 @@
 	ot->idname = "MESH_OT_primitive_ico_sphere_add";
 
 	/* api callbacks */
+	ot->invoke = WM_operator_view3d_distance_invoke;
 	ot->exec = add_primitive_icosphere_exec;
 	ot->poll = ED_operator_scene_editable;
 

Modified: trunk/blender/source/blender/editors/object/object_add.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_add.c	2012-12-09 05:18:56 UTC (rev 52822)
+++ trunk/blender/source/blender/editors/object/object_add.c	2012-12-09 10:48:18 UTC (rev 52823)
@@ -210,8 +210,8 @@
 	invert_m3_m3(imat, mat);
 	mul_m3_v3(imat, primmat[3]);
 
-	if (v3d) {
-		float dia = ED_view3d_grid_scale(scene, v3d, NULL);
+	{
+		const float dia = v3d ? ED_view3d_grid_scale(scene, v3d, NULL) : ED_scene_grid_scale(scene, NULL);
 
 		if (apply_diameter) {
 			primmat[0][0] *= dia;

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2012-12-09 05:18:56 UTC (rev 52822)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2012-12-09 10:48:18 UTC (rev 52823)
@@ -451,10 +451,9 @@
 }
 #undef GRID_MIN_PX
 
-float ED_view3d_grid_scale(Scene *scene, View3D *v3d, const char **grid_unit)
+/** could move this elsewhere, but tied into #ED_view3d_grid_scale */
+float ED_scene_grid_scale(Scene *scene, const char **grid_unit)
 {
-	float grid_scale = v3d->grid;
-
 	/* apply units */
 	if (scene->unit.system) {
 		void *usys;
@@ -466,13 +465,18 @@
 			int i = bUnit_GetBaseUnit(usys);
 			if (grid_unit)
 				*grid_unit = bUnit_GetNameDisplay(usys, i);
-			grid_scale = (grid_scale * (float)bUnit_GetScaler(usys, i)) / scene->unit.scale_length;
+			return (float)bUnit_GetScaler(usys, i) / scene->unit.scale_length;
 		}
 	}
 
-	return grid_scale;
+	return 1.0f;
 }
 
+float ED_view3d_grid_scale(Scene *scene, View3D *v3d, const char **grid_unit)
+{
+	return v3d->grid * ED_scene_grid_scale(scene, grid_unit);
+}
+
 static void drawfloor(Scene *scene, View3D *v3d, const char **grid_unit)
 {
 	float grid, grid_scale;

Modified: trunk/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- trunk/blender/source/blender/windowmanager/WM_api.h	2012-12-09 05:18:56 UTC (rev 52822)
+++ trunk/blender/source/blender/windowmanager/WM_api.h	2012-12-09 10:48:18 UTC (rev 52823)
@@ -171,6 +171,7 @@
 
 		/* operator api, default callbacks */
 			/* invoke callback, uses enum property named "type" */
+int			WM_operator_view3d_distance_invoke(struct bContext *C, struct wmOperator *op, struct wmEvent *event);
 int			WM_menu_invoke			(struct bContext *C, struct wmOperator *op, struct wmEvent *event);
 int			WM_enum_search_invoke(struct bContext *C, struct wmOperator *op, struct wmEvent *event);
 			/* invoke callback, confirm menu + exec */

Modified: trunk/blender/source/blender/windowmanager/intern/wm_operators.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_operators.c	2012-12-09 05:18:56 UTC (rev 52822)
+++ trunk/blender/source/blender/windowmanager/intern/wm_operators.c	2012-12-09 10:48:18 UTC (rev 52823)
@@ -87,6 +87,7 @@
 #include "ED_screen.h"
 #include "ED_util.h"
 #include "ED_object.h"
+#include "ED_view3d.h"
 
 #include "RNA_access.h"
 #include "RNA_define.h"
@@ -689,6 +690,35 @@
 
 /* ************ default op callbacks, exported *********** */
 
+int WM_operator_view3d_distance_invoke(struct bContext *C, struct wmOperator *op, struct wmEvent *UNUSED(event))
+{
+	Scene *scene = CTX_data_scene(C);
+	View3D *v3d = CTX_wm_view3d(C);
+
+	const float dia = v3d ? ED_view3d_grid_scale(scene, v3d, NULL) : ED_scene_grid_scale(scene, NULL);
+
+	/* always run, so the values are initialized,
+	 * otherwise we may get differ behavior when (dia != 1.0) */
+	RNA_STRUCT_BEGIN(op->ptr, prop)
+	{
+		if (RNA_property_type(prop) == PROP_FLOAT) {
+			PropertySubType pstype = RNA_property_subtype(prop);
+			if (pstype == PROP_DISTANCE) {
+				/* we don't support arrays yet */
+				BLI_assert(RNA_property_array_check(prop) == FALSE);
+				/* initialize */
+				if (!RNA_property_is_set_ex(op->ptr, prop, FALSE)) {
+					const float value = RNA_property_float_get_default(op->ptr, prop) * dia;
+					RNA_property_float_set(op->ptr, prop, value);
+				}
+			}
+		}
+	}
+	RNA_STRUCT_END;
+
+	return op->type->exec(C, op);
+}
+
 /* invoke callback, uses enum property named "type" */
 int WM_menu_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
 {




More information about the Bf-blender-cvs mailing list