diff options
Diffstat (limited to 'source/blender/editors')
-rw-r--r-- | source/blender/editors/object/object_intern.h | 1 | ||||
-rw-r--r-- | source/blender/editors/object/object_modifier.c | 88 | ||||
-rw-r--r-- | source/blender/editors/object/object_ops.c | 1 | ||||
-rw-r--r-- | source/blender/editors/space_outliner/outliner_draw.c | 3 |
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: |