[Bf-blender-cvs] [2fc7d04] master: Add Simple randomize vertex tool

Campbell Barton noreply at git.blender.org
Mon Mar 31 05:57:59 CEST 2014


Commit: 2fc7d04804fc9411647466d6765e2716e56a9cc8
Author: Campbell Barton
Date:   Mon Mar 31 14:56:43 2014 +1100
https://developer.blender.org/rB2fc7d04804fc9411647466d6765e2716e56a9cc8

Add Simple randomize vertex tool

D432 from Walid Shouman with normal & uniform options added.

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

M	release/scripts/startup/bl_ui/space_view3d.py
M	release/scripts/startup/bl_ui/space_view3d_toolbar.py
M	source/blender/editors/object/CMakeLists.txt
M	source/blender/editors/object/object_intern.h
M	source/blender/editors/object/object_ops.c
A	source/blender/editors/object/object_random.c

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

diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 9d17464c..72b63ba 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -197,6 +197,7 @@ class VIEW3D_MT_transform_base(Menu):
         layout.operator("transform.bend", text="Bend")
         layout.operator("transform.push_pull", text="Push/Pull")
         layout.operator("object.vertex_warp", text="Warp")
+        layout.operator("object.vertex_random", text="Randomize")
 
 
 # Generic transform menu - geometry types
diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index 3f84322..99e3ffb 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -329,6 +329,7 @@ class VIEW3D_PT_tools_meshedit(View3DPanel, Panel):
         row.operator("transform.vert_slide", text="Vertex")
         col.operator("mesh.noise")
         col.operator("mesh.vertices_smooth")
+        col.operator("object.vertex_random")
 
         col = layout.column(align=True)
         col.label(text="Add:")
@@ -500,6 +501,7 @@ class VIEW3D_PT_tools_curveedit(View3DPanel, Panel):
         col.operator("curve.extrude_move", text="Extrude")
         col.operator("curve.subdivide")
         col.operator("curve.smooth")
+        col.operator("object.vertex_random")
 
         draw_repeat_tools(context, layout)
 
@@ -553,6 +555,10 @@ class VIEW3D_PT_tools_surfaceedit(View3DPanel, Panel):
         col.operator("curve.extrude", text="Extrude")
         col.operator("curve.subdivide")
 
+        col = layout.column(align=True)
+        col.label(text="Deform:")
+        col.operator("object.vertex_random")
+
         draw_repeat_tools(context, layout)
 
 
@@ -621,6 +627,10 @@ class VIEW3D_PT_tools_armatureedit(View3DPanel, Panel):
         col.operator("armature.extrude_move")
         col.operator("armature.subdivide", text="Subdivide")
 
+        col = layout.column(align=True)
+        col.label(text="Deform:")
+        col.operator("object.vertex_random")
+
         draw_repeat_tools(context, layout)
 
 
@@ -650,6 +660,10 @@ class VIEW3D_PT_tools_mballedit(View3DPanel, Panel):
         col.operator("transform.rotate")
         col.operator("transform.resize", text="Scale")
 
+        col = layout.column(align=True)
+        col.label(text="Deform:")
+        col.operator("object.vertex_random")
+
         draw_repeat_tools(context, layout)
 
 
@@ -686,6 +700,10 @@ class VIEW3D_PT_tools_latticeedit(View3DPanel, Panel):
         col = layout.column(align=True)
         col.operator("lattice.make_regular")
 
+        col = layout.column(align=True)
+        col.label(text="Deform:")
+        col.operator("object.vertex_random")
+
         draw_repeat_tools(context, layout)
 
 
diff --git a/source/blender/editors/object/CMakeLists.txt b/source/blender/editors/object/CMakeLists.txt
index ecc967d..8277c7f 100644
--- a/source/blender/editors/object/CMakeLists.txt
+++ b/source/blender/editors/object/CMakeLists.txt
@@ -50,6 +50,7 @@ set(SRC
 	object_lod.c
 	object_modifier.c
 	object_ops.c
+	object_random.c
 	object_relations.c
 	object_select.c
 	object_shapekey.c
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index 8b0ddbb..5864f1e 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -259,5 +259,8 @@ void OBJECT_OT_bake_image(wmOperatorType *ot);
 void OBJECT_OT_lod_add(struct wmOperatorType *ot);
 void OBJECT_OT_lod_remove(struct wmOperatorType *ot);
 
+/* object_random.c */
+void OBJECT_OT_vertex_random(struct wmOperatorType *ot);
+
 #endif /* __OBJECT_INTERN_H__ */
 
diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c
index 2dbadd0..4668414 100644
--- a/source/blender/editors/object/object_ops.c
+++ b/source/blender/editors/object/object_ops.c
@@ -246,6 +246,8 @@ void ED_operatortypes_object(void)
 
 	WM_operatortype_append(OBJECT_OT_lod_add);
 	WM_operatortype_append(OBJECT_OT_lod_remove);
+
+	WM_operatortype_append(OBJECT_OT_vertex_random);
 }
 
 void ED_operatormacros_object(void)
diff --git a/source/blender/editors/object/object_random.c b/source/blender/editors/object/object_random.c
new file mode 100644
index 0000000..34ac169
--- /dev/null
+++ b/source/blender/editors/object/object_random.c
@@ -0,0 +1,149 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2014 by Blender Foundation
+ * All rights reserved.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/editors/object/object_random.c
+ *  \ingroup edobj
+ */
+
+#include "DNA_object_types.h"
+
+#include "BLI_math.h"
+#include "BLI_rand.h"
+
+
+#include "BKE_context.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "ED_transverts.h"
+
+#include "object_intern.h"
+
+
+/**
+ *  Generic randomize vertices function
+ */
+
+static bool object_rand_transverts(
+        TransVertStore *tvs,
+        const float offset, const float uniform, const float normal_factor,
+        const unsigned int seed)
+{
+	bool use_normal = (normal_factor != 0.0f);
+	struct RNG *rng;
+	TransVert *tv;
+	int a;
+
+	if (!tvs || !(tvs->transverts)) {
+		return false;
+	}
+
+	rng = BLI_rng_new(seed);
+
+	tv = tvs->transverts;
+	for (a = 0; a < tvs->transverts_tot; a++, tv++) {
+		const float t = max_ff(0.0f, uniform + ((1.0f - uniform) * BLI_rng_get_float(rng)));
+		float vec[3];
+		BLI_rng_get_float_unit_v3(rng, vec);
+
+		if (use_normal && (tv->flag & TX_VERT_USE_NORMAL)) {
+			float no[3];
+
+			/* avoid >90d rotation to align with normal */
+			if (dot_v3v3(vec, tv->normal) < 0.0f) {
+				negate_v3_v3(no, tv->normal);
+			}
+			else {
+				copy_v3_v3(no, tv->normal);
+			}
+
+			interp_v3_v3v3_slerp_safe(vec, vec, no, normal_factor);
+		}
+
+		madd_v3_v3fl(tv->loc, vec, offset * t);
+	}
+
+	BLI_rng_free(rng);
+
+	return true;
+}
+
+static int object_rand_verts_exec(bContext *C, wmOperator *op)
+{
+	const float offset = RNA_float_get(op->ptr, "offset");
+	const float uniform = RNA_float_get(op->ptr, "uniform");
+	const float normal_factor = RNA_float_get(op->ptr, "normal");
+	const unsigned int seed = RNA_int_get(op->ptr, "seed");
+
+	TransVertStore tvs = {NULL};
+	Object *obedit = CTX_data_edit_object(C);
+
+	if (obedit) {
+		int mode = TM_ALL_JOINTS;
+
+		if (normal_factor != 0.0f) {
+			mode |= TX_VERT_USE_NORMAL;
+		}
+
+		ED_transverts_create_from_obedit(&tvs, obedit, mode);
+		if (tvs.transverts_tot == 0)
+			return OPERATOR_CANCELLED;
+
+		object_rand_transverts(&tvs, offset, uniform, normal_factor, seed);
+
+		ED_transverts_update_obedit(&tvs, obedit);
+		ED_transverts_free(&tvs);
+	}
+
+	WM_event_add_notifier(C, NC_OBJECT | ND_DRAW, obedit);
+
+	return OPERATOR_FINISHED;
+}
+
+void OBJECT_OT_vertex_random(struct wmOperatorType *ot)
+{
+	/* identifiers */
+	ot->name = "Randomize";
+	ot->description = "Randomize vertices";
+	ot->idname = "OBJECT_OT_vertex_random";
+
+	/* api callbacks */
+	ot->exec = object_rand_verts_exec;
+	ot->poll = ED_transverts_poll;
+
+	/* flags */
+	ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+	/* props */
+	RNA_def_float(ot->srna, "offset",  0.1f, -FLT_MAX, FLT_MAX, "Ammount",
+	              "Distance to offset", -10.0f, 10.0f);
+	RNA_def_float(ot->srna, "uniform",  0.0f, 0.0f, 1.0f, "Uniform",
+	              "Increase for uniform offset distance", 0.0f, 1.0f);
+	RNA_def_float(ot->srna, "normal",  0.0f, 0.0f, 1.0f, "normal",
+	              "Align offset direction to normals", 0.0f, 1.0f);
+	RNA_def_int(ot->srna, "seed", 0, 0, 10000, "Random Seed", "Seed for the random number generator", 0, 50);
+}




More information about the Bf-blender-cvs mailing list