GPencil: Fix offset modifier performance regression

When using an offset modifier on a grease pencil object, the performance
could be impacted due to the randomize option introduced by rB6a2bc40e0131.
Even if the option was not used (offset, rotation, scale set to zero), the modifier
would still compute the random transformation matrix.

The patch checks if the randomization is used and only then caluclates the matrix.

Reviewed By: #grease_pencil, antoniov

Differential Revision: https://developer.blender.org/D14553
This commit is contained in:
Falk David
2022-04-28 12:37:10 +02:00
committed by Falk David
parent e8102aea13
commit 16fe767d00

View File

@@ -83,6 +83,9 @@ static void deformStroke(GpencilModifierData *md,
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;
/* Make sure different modifiers get different seeds. */
seed += BLI_hash_string(ob->id.name + 2);
@@ -91,25 +94,27 @@ static void deformStroke(GpencilModifierData *md,
float rand[3][3];
float rand_offset = BLI_hash_int_01(seed);
/* Get stroke index for random offset. */
int rnd_index = BLI_findindex(&gpf->strokes, gps);
for (int j = 0; j < 3; j++) {
const uint primes[3] = {2, 3, 7};
double offset[3] = {0.0f, 0.0f, 0.0f};
double r[3];
/* To ensure a nice distribution, we use halton sequence and offset using the seed. */
BLI_halton_3d(primes, offset, rnd_index, r);
if (is_randomized) {
/* Get stroke index for random offset. */
int rnd_index = BLI_findindex(&gpf->strokes, gps);
for (int j = 0; j < 3; j++) {
const uint primes[3] = {2, 3, 7};
double offset[3] = {0.0f, 0.0f, 0.0f};
double r[3];
/* To ensure a nice distribution, we use halton sequence and offset using the seed. */
BLI_halton_3d(primes, offset, rnd_index, r);
if ((mmd->flag & GP_OFFSET_UNIFORM_RANDOM_SCALE) && j == 2) {
float rand_value;
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);
copy_v3_fl(rand[j], rand_value);
}
else {
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(sin(rand[j][i] * 12.9898f + j * 78.233f) * 43758.5453f, 1.0f);
if ((mmd->flag & GP_OFFSET_UNIFORM_RANDOM_SCALE) && j == 2) {
float rand_value;
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);
copy_v3_fl(rand[j], rand_value);
}
else {
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(sin(rand[j][i] * 12.9898f + j * 78.233f) * 43758.5453f, 1.0f);
}
}
}
}
@@ -128,21 +133,23 @@ static void deformStroke(GpencilModifierData *md,
}
/* Calculate Random matrix. */
float mat_rnd[4][4];
float rnd_loc[3], rnd_rot[3], rnd_scale_weight[3];
float rnd_scale[3] = {1.0f, 1.0f, 1.0f};
if (is_randomized) {
float mat_rnd[4][4];
float rnd_loc[3], rnd_rot[3], rnd_scale_weight[3];
float rnd_scale[3] = {1.0f, 1.0f, 1.0f};
mul_v3_v3fl(rnd_loc, rand[0], weight);
mul_v3_v3fl(rnd_rot, rand[1], weight);
mul_v3_v3fl(rnd_scale_weight, rand[2], weight);
mul_v3_v3fl(rnd_loc, rand[0], weight);
mul_v3_v3fl(rnd_rot, rand[1], weight);
mul_v3_v3fl(rnd_scale_weight, rand[2], weight);
mul_v3_v3v3(rnd_loc, mmd->rnd_offset, rnd_loc);
mul_v3_v3v3(rnd_rot, mmd->rnd_rot, rnd_rot);
madd_v3_v3v3(rnd_scale, mmd->rnd_scale, rnd_scale_weight);
mul_v3_v3v3(rnd_loc, mmd->rnd_offset, rnd_loc);
mul_v3_v3v3(rnd_rot, mmd->rnd_rot, rnd_rot);
madd_v3_v3v3(rnd_scale, mmd->rnd_scale, rnd_scale_weight);
loc_eul_size_to_mat4(mat_rnd, rnd_loc, rnd_rot, rnd_scale);
/* Apply randomness matrix. */
mul_m4_v3(mat_rnd, &pt->x);
loc_eul_size_to_mat4(mat_rnd, rnd_loc, rnd_rot, rnd_scale);
/* Apply randomness matrix. */
mul_m4_v3(mat_rnd, &pt->x);
}
/* Calculate matrix. */
mul_v3_v3fl(loc, mmd->loc, weight);