Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors')
-rw-r--r--source/blender/editors/object/object_intern.h1
-rw-r--r--source/blender/editors/object/object_modifier.c88
-rw-r--r--source/blender/editors/object/object_ops.c1
-rw-r--r--source/blender/editors/space_outliner/outliner_draw.c3
4 files changed, 93 insertions, 0 deletions
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h
index ef8653541f0..2cc8671d84b 100644
--- a/source/blender/editors/object/object_intern.h
+++ b/source/blender/editors/object/object_intern.h
@@ -175,6 +175,7 @@ void OBJECT_OT_skin_radii_equalize(struct wmOperatorType *ot);
void OBJECT_OT_skin_armature_create(struct wmOperatorType *ot);
void OBJECT_OT_laplaciandeform_bind(struct wmOperatorType *ot);
void OBJECT_OT_surfacedeform_bind(struct wmOperatorType *ot);
+void OBJECT_OT_hair_generate_follicles(struct wmOperatorType *ot);
/* grease pencil modifiers */
void OBJECT_OT_gpencil_modifier_add(struct wmOperatorType *ot);
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 43f651b0532..8384755c679 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -37,6 +37,7 @@
#include "DNA_anim_types.h"
#include "DNA_armature_types.h"
#include "DNA_curve_types.h"
+#include "DNA_hair_types.h"
#include "DNA_key_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
@@ -58,12 +59,14 @@
#include "BKE_DerivedMesh.h"
#include "BKE_effect.h"
#include "BKE_global.h"
+#include "BKE_hair.h"
#include "BKE_key.h"
#include "BKE_lattice.h"
#include "BKE_main.h"
#include "BKE_mesh.h"
#include "BKE_mesh_mapping.h"
#include "BKE_mesh_runtime.h"
+#include "BKE_mesh_sample.h"
#include "BKE_modifier.h"
#include "BKE_multires.h"
#include "BKE_report.h"
@@ -2417,3 +2420,88 @@ void OBJECT_OT_surfacedeform_bind(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
edit_modifier_properties(ot);
}
+
+/************************ Hair follicle generate operator *********************/
+
+static int hair_generate_follicles_poll(bContext *C)
+{
+ return edit_modifier_poll_generic(C, &RNA_HairModifier, 0);
+}
+
+static int hair_generate_follicles_exec(bContext *C, wmOperator *op)
+{
+ Object *ob = ED_object_active_context(C);
+ HairModifierData *hmd = (HairModifierData *)edit_modifier_property_get(op, ob, eModifierType_Hair);
+
+ if (!hmd)
+ return OPERATOR_CANCELLED;
+
+ BLI_assert(hmd->hair_system != NULL);
+
+ struct Depsgraph *depsgraph = CTX_data_depsgraph(C);
+
+ BLI_assert(ob && ob->type == OB_MESH);
+ Mesh *scalp = (Mesh *)DEG_get_evaluated_id(depsgraph, ob->data);
+ HairSystem *hsys = hmd->hair_system;
+
+ BKE_hair_generate_follicles(
+ hsys,
+ scalp,
+ (unsigned int)hmd->follicle_seed,
+ hmd->follicle_count);
+
+ {
+ const int numverts = 5;
+ const float hairlen = 0.05f;
+ const float taper_length = 0.02f;
+ const float taper_thickness = 0.8f;
+ BKE_hair_fiber_curves_begin(hsys, hsys->pattern->num_follicles);
+ for (int i = 0; i < hsys->pattern->num_follicles; ++i)
+ {
+ BKE_hair_set_fiber_curve(hsys, i, numverts, taper_length, taper_thickness);
+ }
+ BKE_hair_fiber_curves_end(hsys);
+ for (int i = 0; i < hsys->pattern->num_follicles; ++i)
+ {
+ float loc[3], nor[3], tan[3];
+ BKE_mesh_sample_eval(scalp, &hsys->pattern->follicles[i].mesh_sample, loc, nor, tan);
+ for (int j = 0; j < numverts; ++j)
+ {
+ madd_v3_v3fl(loc, nor, hairlen / (numverts-1));
+ BKE_hair_set_fiber_vertex(hsys, i * numverts + j, 0, loc);
+ }
+ }
+ }
+
+ BKE_hair_bind_follicles(hmd->hair_system, scalp);
+
+ DEG_id_tag_update(&ob->id, OB_RECALC_DATA);
+ WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, ob);
+
+ return OPERATOR_FINISHED;
+}
+
+static int hair_generate_follicles_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
+{
+ if (edit_modifier_invoke_properties(C, op))
+ return hair_generate_follicles_exec(C, op);
+ else
+ return OPERATOR_CANCELLED;
+}
+
+void OBJECT_OT_hair_generate_follicles(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Hair Follicles Generate";
+ ot->description = "Generate hair follicles for a hair modifier";
+ ot->idname = "OBJECT_OT_hair_generate_follicles";
+
+ /* api callbacks */
+ ot->poll = hair_generate_follicles_poll;
+ ot->invoke = hair_generate_follicles_invoke;
+ ot->exec = hair_generate_follicles_exec;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
+ edit_modifier_properties(ot);
+}
diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c
index ac2eb60456f..16ea0791adf 100644
--- a/source/blender/editors/object/object_ops.c
+++ b/source/blender/editors/object/object_ops.c
@@ -263,6 +263,7 @@ void ED_operatortypes_object(void)
WM_operatortype_append(OBJECT_OT_data_transfer);
WM_operatortype_append(OBJECT_OT_datalayout_transfer);
WM_operatortype_append(OBJECT_OT_surfacedeform_bind);
+ WM_operatortype_append(OBJECT_OT_hair_generate_follicles);
WM_operatortype_append(OBJECT_OT_hide_view_clear);
WM_operatortype_append(OBJECT_OT_hide_view_set);
diff --git a/source/blender/editors/space_outliner/outliner_draw.c b/source/blender/editors/space_outliner/outliner_draw.c
index 211c9e1a392..5244c364b80 100644
--- a/source/blender/editors/space_outliner/outliner_draw.c
+++ b/source/blender/editors/space_outliner/outliner_draw.c
@@ -1039,6 +1039,9 @@ TreeElementIcon tree_element_get_icon(TreeStoreElem *tselem, TreeElement *te)
case eModifierType_WeightedNormal:
data.icon = ICON_MOD_NORMALEDIT;
break;
+ case eModifierType_Hair:
+ data.icon = ICON_STRANDS;
+ break;
/* Default */
case eModifierType_None:
case eModifierType_ShapeKey: