Changeset View
Changeset View
Standalone View
Standalone View
source/blender/gpencil_modifiers/intern/MOD_gpenciloffset.c
| Show First 20 Lines • Show All 77 Lines • ▼ Show 20 Lines | if (!is_stroke_affected_by_modifier(ob, | ||||
| gps, | gps, | ||||
| mmd->flag & GP_OFFSET_INVERT_LAYER, | mmd->flag & GP_OFFSET_INVERT_LAYER, | ||||
| mmd->flag & GP_OFFSET_INVERT_PASS, | mmd->flag & GP_OFFSET_INVERT_PASS, | ||||
| mmd->flag & GP_OFFSET_INVERT_LAYERPASS, | mmd->flag & GP_OFFSET_INVERT_LAYERPASS, | ||||
| mmd->flag & GP_OFFSET_INVERT_MATERIAL)) { | mmd->flag & GP_OFFSET_INVERT_MATERIAL)) { | ||||
| return; | return; | ||||
| } | } | ||||
| const bool is_randomized = !(is_zero_v3(mmd->rnd_offset) && is_zero_v3(mmd->rnd_rot) && | |||||
| is_zero_v3(mmd->rnd_scale)); | |||||
| int seed = mmd->seed; | int seed = mmd->seed; | ||||
| /* Make sure different modifiers get different seeds. */ | /* Make sure different modifiers get different seeds. */ | ||||
| seed += BLI_hash_string(ob->id.name + 2); | seed += BLI_hash_string(ob->id.name + 2); | ||||
| seed += BLI_hash_string(md->name); | seed += BLI_hash_string(md->name); | ||||
| float rand[3][3]; | float rand[3][3]; | ||||
| float rand_offset = BLI_hash_int_01(seed); | float rand_offset = BLI_hash_int_01(seed); | ||||
| if (is_randomized) { | |||||
| /* Get stroke index for random offset. */ | /* Get stroke index for random offset. */ | ||||
| int rnd_index = BLI_findindex(&gpf->strokes, gps); | int rnd_index = BLI_findindex(&gpf->strokes, gps); | ||||
| for (int j = 0; j < 3; j++) { | for (int j = 0; j < 3; j++) { | ||||
| const uint primes[3] = {2, 3, 7}; | const uint primes[3] = {2, 3, 7}; | ||||
| double offset[3] = {0.0f, 0.0f, 0.0f}; | double offset[3] = {0.0f, 0.0f, 0.0f}; | ||||
| double r[3]; | double r[3]; | ||||
| /* To ensure a nice distribution, we use halton sequence and offset using the seed. */ | /* To ensure a nice distribution, we use halton sequence and offset using the seed. */ | ||||
| BLI_halton_3d(primes, offset, rnd_index, r); | BLI_halton_3d(primes, offset, rnd_index, r); | ||||
| if ((mmd->flag & GP_OFFSET_UNIFORM_RANDOM_SCALE) && j == 2) { | if ((mmd->flag & GP_OFFSET_UNIFORM_RANDOM_SCALE) && j == 2) { | ||||
| float rand_value; | float rand_value; | ||||
| rand_value = fmodf(r[0] * 2.0f - 1.0f + rand_offset, 1.0f); | rand_value = fmodf(r[0] * 2.0f - 1.0f + rand_offset, 1.0f); | ||||
| rand_value = fmodf(sin(rand_value * 12.9898f + j * 78.233f) * 43758.5453f, 1.0f); | rand_value = fmodf(sin(rand_value * 12.9898f + j * 78.233f) * 43758.5453f, 1.0f); | ||||
| copy_v3_fl(rand[j], rand_value); | copy_v3_fl(rand[j], rand_value); | ||||
| } | } | ||||
| else { | else { | ||||
| for (int i = 0; i < 3; i++) { | for (int i = 0; i < 3; i++) { | ||||
| rand[j][i] = fmodf(r[i] * 2.0f - 1.0f + rand_offset, 1.0f); | rand[j][i] = fmodf(r[i] * 2.0f - 1.0f + rand_offset, 1.0f); | ||||
| rand[j][i] = fmodf(sin(rand[j][i] * 12.9898f + j * 78.233f) * 43758.5453f, 1.0f); | rand[j][i] = fmodf(sin(rand[j][i] * 12.9898f + j * 78.233f) * 43758.5453f, 1.0f); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| bGPdata *gpd = ob->data; | bGPdata *gpd = ob->data; | ||||
| for (int i = 0; i < gps->totpoints; i++) { | for (int i = 0; i < gps->totpoints; i++) { | ||||
| bGPDspoint *pt = &gps->points[i]; | bGPDspoint *pt = &gps->points[i]; | ||||
| MDeformVert *dvert = gps->dvert != NULL ? &gps->dvert[i] : NULL; | MDeformVert *dvert = gps->dvert != NULL ? &gps->dvert[i] : NULL; | ||||
| /* Verify vertex group. */ | /* Verify vertex group. */ | ||||
| const float weight = get_modifier_point_weight( | const float weight = get_modifier_point_weight( | ||||
| dvert, (mmd->flag & GP_OFFSET_INVERT_VGROUP) != 0, def_nr); | dvert, (mmd->flag & GP_OFFSET_INVERT_VGROUP) != 0, def_nr); | ||||
| if (weight < 0.0f) { | if (weight < 0.0f) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| /* Calculate Random matrix. */ | /* Calculate Random matrix. */ | ||||
| if (is_randomized) { | |||||
| float mat_rnd[4][4]; | float mat_rnd[4][4]; | ||||
| float rnd_loc[3], rnd_rot[3], rnd_scale_weight[3]; | float rnd_loc[3], rnd_rot[3], rnd_scale_weight[3]; | ||||
| float rnd_scale[3] = {1.0f, 1.0f, 1.0f}; | float rnd_scale[3] = {1.0f, 1.0f, 1.0f}; | ||||
| mul_v3_v3fl(rnd_loc, rand[0], weight); | mul_v3_v3fl(rnd_loc, rand[0], weight); | ||||
| mul_v3_v3fl(rnd_rot, rand[1], weight); | mul_v3_v3fl(rnd_rot, rand[1], weight); | ||||
| mul_v3_v3fl(rnd_scale_weight, rand[2], weight); | mul_v3_v3fl(rnd_scale_weight, rand[2], weight); | ||||
| mul_v3_v3v3(rnd_loc, mmd->rnd_offset, rnd_loc); | mul_v3_v3v3(rnd_loc, mmd->rnd_offset, rnd_loc); | ||||
| mul_v3_v3v3(rnd_rot, mmd->rnd_rot, rnd_rot); | mul_v3_v3v3(rnd_rot, mmd->rnd_rot, rnd_rot); | ||||
| madd_v3_v3v3(rnd_scale, mmd->rnd_scale, rnd_scale_weight); | madd_v3_v3v3(rnd_scale, mmd->rnd_scale, rnd_scale_weight); | ||||
| loc_eul_size_to_mat4(mat_rnd, rnd_loc, rnd_rot, rnd_scale); | loc_eul_size_to_mat4(mat_rnd, rnd_loc, rnd_rot, rnd_scale); | ||||
| /* Apply randomness matrix. */ | /* Apply randomness matrix. */ | ||||
| mul_m4_v3(mat_rnd, &pt->x); | mul_m4_v3(mat_rnd, &pt->x); | ||||
| } | |||||
| /* Calculate matrix. */ | /* Calculate matrix. */ | ||||
| mul_v3_v3fl(loc, mmd->loc, weight); | mul_v3_v3fl(loc, mmd->loc, weight); | ||||
| mul_v3_v3fl(rot, mmd->rot, weight); | mul_v3_v3fl(rot, mmd->rot, weight); | ||||
| mul_v3_v3fl(scale, mmd->scale, weight); | mul_v3_v3fl(scale, mmd->scale, weight); | ||||
| add_v3_fl(scale, 1.0); | add_v3_fl(scale, 1.0); | ||||
| loc_eul_size_to_mat4(mat, loc, rot, scale); | loc_eul_size_to_mat4(mat, loc, rot, scale); | ||||
| ▲ Show 20 Lines • Show All 93 Lines • Show Last 20 Lines | |||||