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:
-rw-r--r--source/blender/blenkernel/BKE_gpencil.h3
-rw-r--r--source/blender/blenkernel/intern/gpencil.c108
-rw-r--r--source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c9
-rw-r--r--source/blender/editors/gpencil/gpencil_brush.c15
-rw-r--r--source/blender/editors/gpencil/gpencil_data.c12
-rw-r--r--source/blender/editors/gpencil/gpencil_utils.c15
-rw-r--r--source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c4
7 files changed, 35 insertions, 131 deletions
diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h
index 9c352da15a0..0aa7a0de7e6 100644
--- a/source/blender/blenkernel/BKE_gpencil.h
+++ b/source/blender/blenkernel/BKE_gpencil.h
@@ -152,10 +152,7 @@ void BKE_gpencil_centroid_3D(struct bGPdata *gpd, float r_centroid[3]);
/* vertex groups */
void BKE_gpencil_dvert_ensure(struct bGPDstroke *gps);
-float BKE_gpencil_vgroup_use_index(struct MDeformVert *dvert, int index);
void BKE_gpencil_vgroup_remove(struct Object *ob, struct bDeformGroup *defgroup);
-struct MDeformWeight *BKE_gpencil_vgroup_add_point_weight(struct MDeformVert *dvert, int index, float weight);
-bool BKE_gpencil_vgroup_remove_point_weight(struct MDeformVert *dvert, int index);
void BKE_gpencil_stroke_weights_duplicate(struct bGPDstroke *gps_src, struct bGPDstroke *gps_dst);
/* GPencil geometry evaluation */
diff --git a/source/blender/blenkernel/intern/gpencil.c b/source/blender/blenkernel/intern/gpencil.c
index 51731cb3e8e..6d771148723 100644
--- a/source/blender/blenkernel/intern/gpencil.c
+++ b/source/blender/blenkernel/intern/gpencil.c
@@ -57,6 +57,7 @@
#include "BKE_context.h"
#include "BKE_action.h"
#include "BKE_animsys.h"
+#include "BKE_deform.h"
#include "BKE_global.h"
#include "BKE_gpencil.h"
#include "BKE_colortools.h"
@@ -545,21 +546,7 @@ void BKE_gpencil_stroke_weights_duplicate(bGPDstroke *gps_src, bGPDstroke *gps_d
}
BLI_assert(gps_src->totpoints == gps_dst->totpoints);
- if ((gps_src->dvert == NULL) || (gps_dst->dvert == NULL)) {
- return;
- }
-
- for (int i = 0; i < gps_src->totpoints; i++) {
- MDeformVert *dvert_src = &gps_src->dvert[i];
- MDeformVert *dvert_dst = &gps_dst->dvert[i];
- if (dvert_src->totweight > 0) {
- dvert_dst->dw = MEM_dupallocN(dvert_src->dw);
- }
- else {
- dvert_dst->dw = NULL;
- }
-
- }
+ BKE_defvert_array_copy(gps_dst->dvert, gps_src->dvert, gps_src->totpoints);
}
/* make a copy of a given gpencil stroke */
@@ -1227,7 +1214,6 @@ void BKE_gpencil_vgroup_remove(Object *ob, bDeformGroup *defgroup)
{
bGPdata *gpd = ob->data;
MDeformVert *dvert = NULL;
- MDeformWeight *gpw = NULL;
const int def_nr = BLI_findindex(&ob->defbase, defgroup);
/* Remove points data */
@@ -1237,15 +1223,9 @@ void BKE_gpencil_vgroup_remove(Object *ob, bDeformGroup *defgroup)
for (bGPDstroke *gps = gpf->strokes.first; gps; gps = gps->next) {
for (int i = 0; i < gps->totpoints; i++) {
dvert = &gps->dvert[i];
- for (int i2 = 0; i2 < dvert->totweight; i2++) {
- gpw = &dvert->dw[i2];
- if (gpw->def_nr == def_nr) {
- BKE_gpencil_vgroup_remove_point_weight(dvert, def_nr);
- }
- /* if index is greater, must be moved one back */
- if (gpw->def_nr > def_nr) {
- gpw->def_nr--;
- }
+ MDeformWeight *dw = defvert_find_index(dvert, def_nr);
+ if (dw != NULL) {
+ defvert_remove_group(dvert, dw);
}
}
}
@@ -1264,84 +1244,6 @@ void BKE_gpencil_dvert_ensure(bGPDstroke *gps)
gps->dvert = MEM_callocN(sizeof(MDeformVert) * gps->totpoints, "gp_stroke_weights");
}
}
-/* add a new weight */
-MDeformWeight *BKE_gpencil_vgroup_add_point_weight(MDeformVert *dvert, int index, float weight)
-{
- MDeformWeight *new_gpw = NULL;
- MDeformWeight *tmp_gpw;
-
- /* need to verify if was used before to update */
- for (int i = 0; i < dvert->totweight; i++) {
- tmp_gpw = &dvert->dw[i];
- if (tmp_gpw->def_nr == index) {
- tmp_gpw->weight = weight;
- return tmp_gpw;
- }
- }
-
- dvert->totweight++;
- if (dvert->totweight == 1) {
- dvert->dw = MEM_callocN(sizeof(MDeformWeight), "gp_weight");
- }
- else {
- dvert->dw = MEM_reallocN(dvert->dw, sizeof(MDeformWeight) * dvert->totweight);
- }
- new_gpw = &dvert->dw[dvert->totweight - 1];
- new_gpw->def_nr = index;
- new_gpw->weight = weight;
-
- return new_gpw;
-}
-
-/* return the weight if use index or -1*/
-float BKE_gpencil_vgroup_use_index(MDeformVert *dvert, int index)
-{
- MDeformWeight *gpw;
- for (int i = 0; i < dvert->totweight; i++) {
- gpw = &dvert->dw[i];
- if (gpw->def_nr == index) {
- return gpw->weight;
- }
- }
- return -1.0f;
-}
-
-/* add a new weight */
-bool BKE_gpencil_vgroup_remove_point_weight(MDeformVert *dvert, int index)
-{
- int e = 0;
-
- if (BKE_gpencil_vgroup_use_index(dvert, index) < 0.0f) {
- return false;
- }
-
- /* if the array get empty, exit */
- if (dvert->totweight == 1) {
- dvert->totweight = 0;
- MEM_SAFE_FREE(dvert->dw);
- return true;
- }
-
- /* realloc weights */
- MDeformWeight *tmp = MEM_dupallocN(dvert->dw);
- MEM_SAFE_FREE(dvert->dw);
- dvert->dw = MEM_callocN(sizeof(MDeformWeight) * dvert->totweight - 1, "gp_weights");
-
- for (int x = 0; x < dvert->totweight; x++) {
- MDeformWeight *gpw = &tmp[e];
- MDeformWeight *final_gpw = &dvert->dw[e];
- if (gpw->def_nr != index) {
- final_gpw->def_nr = gpw->def_nr;
- final_gpw->weight = gpw->weight;
- e++;
- }
- }
- MEM_SAFE_FREE(tmp);
- dvert->totweight--;
-
- return true;
-}
-
/* ************************************************** */
diff --git a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
index 3f185c4fbfc..edb8f4433c9 100644
--- a/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
+++ b/source/blender/draw/engines/gpencil/gpencil_draw_cache_impl.c
@@ -35,8 +35,9 @@
#include "DNA_screen_types.h"
#include "DNA_view3d_types.h"
-#include "BKE_gpencil.h"
#include "BKE_action.h"
+#include "BKE_deform.h"
+#include "BKE_gpencil.h"
#include "DRW_render.h"
@@ -502,8 +503,7 @@ GPUBatch *DRW_gpencil_get_edit_geom(bGPDstroke *gps, float alpha, short dflag)
for (int i = 0; i < gps->totpoints; i++, pt++) {
/* weight paint */
if (is_weight_paint) {
- float weight = gps->dvert!= NULL ? BKE_gpencil_vgroup_use_index(dvert, vgindex) : 0;
- CLAMP(weight, 0.0f, 1.0f);
+ float weight = gps->dvert ? defvert_find_weight(dvert, vgindex) : 0.0f;
float hue = 2.0f * (1.0f - weight) / 3.0f;
hsv_to_rgb(hue, 1.0f, 1.0f, &selectColor[0], &selectColor[1], &selectColor[2]);
selectColor[3] = 1.0f;
@@ -581,8 +581,7 @@ GPUBatch *DRW_gpencil_get_edlin_geom(bGPDstroke *gps, float alpha, short UNUSED(
for (int i = 0; i < gps->totpoints; i++, pt++) {
/* weight paint */
if (is_weight_paint) {
- float weight = gps->dvert != NULL ? BKE_gpencil_vgroup_use_index(dvert, vgindex) : 0;
- CLAMP(weight, 0.0f, 1.0f);
+ float weight = gps->dvert ? defvert_find_weight(dvert, vgindex) : 0.0f;
float hue = 2.0f * (1.0f - weight) / 3.0f;
hsv_to_rgb(hue, 1.0f, 1.0f, &selectColor[0], &selectColor[1], &selectColor[2]);
selectColor[3] = 1.0f;
diff --git a/source/blender/editors/gpencil/gpencil_brush.c b/source/blender/editors/gpencil/gpencil_brush.c
index 4ab344c7861..6eff4d3687f 100644
--- a/source/blender/editors/gpencil/gpencil_brush.c
+++ b/source/blender/editors/gpencil/gpencil_brush.c
@@ -57,6 +57,7 @@
#include "DNA_object_types.h"
#include "BKE_context.h"
+#include "BKE_deform.h"
#include "BKE_gpencil.h"
#include "BKE_library.h"
#include "BKE_report.h"
@@ -897,14 +898,8 @@ static bool gp_brush_weight_apply(
}
}
/* get current weight */
- float curweight = 0.0f;
- for (int i = 0; i < dvert->totweight; i++) {
- MDeformWeight *gpw = &dvert->dw[i];
- if (gpw->def_nr == gso->vrgroup) {
- curweight = gpw->weight;
- break;
- }
- }
+ MDeformWeight *dw = defvert_verify_index(dvert, gso->vrgroup);
+ float curweight = dw ? dw->weight : 0.0f;
if (gp_brush_invert_check(gso)) {
/* reduce weight */
@@ -916,7 +911,9 @@ static bool gp_brush_weight_apply(
}
CLAMP(curweight, 0.0f, 1.0f);
- BKE_gpencil_vgroup_add_point_weight(dvert, gso->vrgroup, curweight);
+ if (dw) {
+ dw->weight = curweight;
+ }
/* weight should stay within [0.0, 1.0] */
if (pt->pressure < 0.0f)
diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c
index 006e2679c8c..d7e58609d2d 100644
--- a/source/blender/editors/gpencil/gpencil_data.c
+++ b/source/blender/editors/gpencil/gpencil_data.c
@@ -1764,10 +1764,8 @@ static int gpencil_vertex_group_smooth_exec(bContext *C, wmOperator *op)
ptc = &gps->points[i];
}
- float wa = BKE_gpencil_vgroup_use_index(dverta, def_nr);
- float wb = BKE_gpencil_vgroup_use_index(dvertb, def_nr);
- CLAMP_MIN(wa, 0.0f);
- CLAMP_MIN(wb, 0.0f);
+ float wa = defvert_find_weight(dverta, def_nr);
+ float wb = defvert_find_weight(dvertb, def_nr);
/* the optimal value is the corresponding to the interpolation of the weight
* at the distance of point b
@@ -1775,8 +1773,10 @@ static int gpencil_vertex_group_smooth_exec(bContext *C, wmOperator *op)
const float opfac = line_point_factor_v3(&ptb->x, &pta->x, &ptc->x);
const float optimal = interpf(wa, wb, opfac);
/* Based on influence factor, blend between original and optimal */
- wb = interpf(wb, optimal, fac);
- BKE_gpencil_vgroup_add_point_weight(dvertb, def_nr, wb);
+ MDeformWeight *dw = defvert_verify_index(dvertb, def_nr);
+ if (dw) {
+ dw->weight = interpf(wb, optimal, fac);
+ }
}
}
}
diff --git a/source/blender/editors/gpencil/gpencil_utils.c b/source/blender/editors/gpencil/gpencil_utils.c
index 3e05dcc3004..06747798ec7 100644
--- a/source/blender/editors/gpencil/gpencil_utils.c
+++ b/source/blender/editors/gpencil/gpencil_utils.c
@@ -50,6 +50,7 @@
#include "DNA_view3d_types.h"
#include "BKE_action.h"
+#include "BKE_deform.h"
#include "BKE_main.h"
#include "BKE_brush.h"
#include "BKE_context.h"
@@ -1225,7 +1226,10 @@ void ED_gpencil_vgroup_assign(bContext *C, Object *ob, float weight)
bGPDspoint *pt = &gps->points[i];
MDeformVert *dvert = &gps->dvert[i];
if (pt->flag & GP_SPOINT_SELECT) {
- BKE_gpencil_vgroup_add_point_weight(dvert, def_nr, weight);
+ MDeformWeight *dw = defvert_verify_index(dvert, def_nr);
+ if (dw) {
+ dw->weight = weight;
+ }
}
}
}
@@ -1250,7 +1254,10 @@ void ED_gpencil_vgroup_remove(bContext *C, Object *ob)
MDeformVert *dvert = &gps->dvert[i];
if ((pt->flag & GP_SPOINT_SELECT) && (dvert->totweight > 0)) {
- BKE_gpencil_vgroup_remove_point_weight(dvert, def_nr);
+ MDeformWeight *dw = defvert_find_index(dvert, def_nr);
+ if (dw != NULL) {
+ defvert_remove_group(dvert, dw);
+ }
}
}
}
@@ -1273,7 +1280,7 @@ void ED_gpencil_vgroup_select(bContext *C, Object *ob)
}
MDeformVert *dvert = &gps->dvert[i];
- if (BKE_gpencil_vgroup_use_index(dvert, def_nr) > -1.0f) {
+ if (defvert_find_index(dvert, def_nr) != NULL) {
pt->flag |= GP_SPOINT_SELECT;
gps->flag |= GP_STROKE_SELECT;
}
@@ -1298,7 +1305,7 @@ void ED_gpencil_vgroup_deselect(bContext *C, Object *ob)
}
MDeformVert *dvert = &gps->dvert[i];
- if (BKE_gpencil_vgroup_use_index(dvert, def_nr) > -1.0f) {
+ if (defvert_find_index(dvert, def_nr) != NULL) {
pt->flag &= ~GP_SPOINT_SELECT;
gps->flag |= GP_STROKE_SELECT;
}
diff --git a/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c b/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c
index 151218c06e4..d702443f022 100644
--- a/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c
+++ b/source/blender/gpencil_modifiers/intern/MOD_gpencil_util.c
@@ -45,6 +45,7 @@
#include "DNA_gpencil_types.h"
#include "DNA_gpencil_modifier_types.h"
+#include "BKE_deform.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_object.h"
@@ -126,7 +127,8 @@ float get_modifier_point_weight(MDeformVert *dvert, int inverse, int vindex)
float weight = 1.0f;
if (vindex >= 0) {
- weight = BKE_gpencil_vgroup_use_index(dvert, vindex);
+ MDeformWeight *dw = defvert_find_index(dvert, vindex);
+ weight = dw ? dw->weight : -1.0f;
if ((weight >= 0.0f) && (inverse == 1)) {
return -1.0f;
}