110 const int points_num,
113 if ((points_num == 0) || (gps->
points ==
NULL)) {
119 if ((gps->
dvert !=
NULL) && (points_num > 0)) {
124 switch (transition) {
132 if ((gps->
dvert !=
NULL) && (points_num > 0)) {
136 for (
int i = points_num; i < gps->
totpoints; i++) {
153 if ((gps->
dvert !=
NULL) && (points_num > 0)) {
157 for (
int i = 0; i <
offset; i++) {
166 printf(
"ERROR: Unknown transition %d in %s()\n", (
int)transition, __func__);
174 gps->
dvert = new_dvert;
182 const int starting_index,
183 const int ending_index,
184 const float starting_weight,
185 const float ending_weight,
186 const int target_def_nr,
188 const float thickness_strength,
189 const float opacity_strength)
193 int range = ending_index - starting_index;
199 switch (transition) {
205 for (
int i = starting_index; i <= ending_index; i++) {
207 ending_weight, starting_weight, (
float)(i - starting_index) / range);
208 if (target_def_nr >= 0) {
209 dvert = &gps->
dvert[i];
216 if (thickness_strength > 1
e-5) {
219 if (opacity_strength > 1
e-5) {
227 printf(
"ERROR: Unknown transition %d in %s()\n", (
int)transition, __func__);
260 const int target_def_nr,
278 if (start_stroke <= tot_strokes) {
279 tot_strokes = tot_strokes - start_stroke;
292 size_t totpoints = 0;
305 float sv1[3], sv2[3];
310 if (dist_r < dist_l) {
325 for (i = 0; i < tot_strokes; i++) {
338 size_t first_visible = 0;
339 size_t last_visible = 0;
347 float set_fade_fac = fading_enabled ? mmd->
fade_fac : 0.0f;
348 float use_fac =
interpf(1 + set_fade_fac, 0, fac);
349 float use_fade_fac = use_fac - set_fade_fac;
350 CLAMP(use_fade_fac, 0.0f, 1.0f);
358 last_visible = (size_t)roundf(totpoints * use_fac);
359 fade_start = (int)roundf(totpoints * use_fade_fac);
360 fade_end = last_visible;
368 last_visible = (size_t)(totpoints * (1.0f + set_fade_fac - use_fac));
369 fade_start = (int)roundf(totpoints * (1.0f - use_fade_fac - set_fade_fac));
370 fade_end = last_visible;
377 first_visible = (size_t)(totpoints * use_fade_fac);
378 last_visible = totpoints;
379 fade_start = first_visible;
380 fade_end = (int)roundf(totpoints * use_fac);
385 for (i = 0; i < tot_strokes; i++) {
394 if (fade_start != fade_end && (
int)cell->
start_idx < fade_end &&
395 (
int)cell->
end_idx > fade_start) {
396 int start_index = fade_start - cell->
start_idx;
400 float start_weight =
ratiof(fade_start, fade_end, cell->
start_idx + start_index);
401 float end_weight =
ratiof(fade_start, fade_end, cell->
start_idx + end_index);
403 start_weight = 1.0f - start_weight;
404 end_weight = 1.0f - end_weight;
419 if ((first_visible <= cell->start_idx) && (last_visible >= cell->
end_idx)) {
422 else if (first_visible > cell->
start_idx) {
424 int points_num = cell->
end_idx - first_visible;
429 int points_num = last_visible - cell->
start_idx;
445 const int target_def_nr,
460 if (max_points == 0) {
461 printf(
"ERROR: Strokes are all empty (GP Build Modifier: %s)\n", __func__);
466 float set_fade_fac = fading_enabled ? mmd->
fade_fac : 0.0f;
467 float use_fac =
interpf(1 + set_fade_fac, 0, fac);
468 use_fac = reverse ? use_fac - set_fade_fac : use_fac;
469 int fade_points = set_fade_fac * max_points;
473 gps_next = gps->
next;
478 const float relative_len = (
float)gps->
totpoints / (
float)max_points;
490 points_num = (int)roundf((1.0f - scaled_fac) * gps->
totpoints);
493 points_num = (int)roundf(scaled_fac * gps->
totpoints);
502 const float start_fac = 1.0f - relative_len;
507 points_num = (int)roundf((1.0f - scaled_fac) * gps->
totpoints);
510 points_num = (int)roundf(scaled_fac * gps->
totpoints);
518 if (points_num <= 0) {
523 int more_points = points_num - gps->
totpoints;
524 CLAMP(more_points, 0, fade_points + 1);
525 float max_weight = (
float)(points_num + more_points) / fade_points;
526 CLAMP(max_weight, 0.0f, 1.0f);
528 gps->
totpoints - points_num - more_points :
529 points_num - 1 - fade_points + more_points;
531 gps->
totpoints - points_num + fade_points - more_points :
532 points_num - 1 + more_points;
534 ((
float)more_points / fade_points) :
538 ((
float)more_points / fade_points);
550 if (points_num < gps->totpoints) {
608 int target_def_nr = -1;
612 if (target_def_nr >= 0) {
616 for (
int j = 0; j < fgps->totpoints; j++) {
631 if ((ctime < mmd->start_frame) || (ctime > mmd->
end_frame)) {
642 float end_frame = is_percentage ? start_frame + 9999 : start_frame + mmd->
length;
652 if (ctime < start_frame) {
669 if (ctime >= end_frame) {
689 (ctime - start_frame) / (end_frame - start_frame);
706 printf(
"Unsupported build mode (%d) for GP Build Modifier: '%s'\n",
743 uiItemR(layout,
ptr,
"concurrent_time_alignment", 0,
NULL, ICON_NONE);
762 uiItemR(row,
ptr,
"use_percentage", 0,
"", ICON_NONE);
765 uiItemR(sub,
ptr,
"percentage_factor", 0,
"", ICON_NONE);
790 uiItemR(layout,
ptr,
"use_restrict_frame_range", 0,
IFACE_(
"Custom Range"), ICON_NONE);
834 "target_vertex_group",
881 "BuildGpencilModifierData",
typedef float(TangentPoint)[2]
void BKE_gpencil_free_point_weights(struct MDeformVert *dvert)
void BKE_gpencil_dvert_ensure(struct bGPDstroke *gps)
void BKE_gpencil_free_stroke(struct bGPDstroke *gps)
void BKE_gpencil_stroke_flip(struct bGPDstroke *gps)
void BKE_gpencil_stroke_geometry_update(struct bGPdata *gpd, struct bGPDstroke *gps)
void BKE_gpencil_modifier_copydata_generic(const struct GpencilModifierData *md_src, struct GpencilModifierData *md_dst)
void BKE_gpencil_modifier_set_error(struct GpencilModifierData *md, const char *format,...) ATTR_PRINTF_FORMAT(2
@ eGpencilModifierTypeFlag_NoApply
struct bGPDframe * BKE_gpencil_frame_retime_get(struct Depsgraph *depsgraph, struct Scene *scene, struct Object *ob, struct bGPDlayer *gpl)
@ eGpencilModifierTypeType_Gpencil
struct GpencilModifierData * BKE_gpencil_modifiers_findby_type(struct Object *ob, GpencilModifierType type)
void(* IDWalkFunc)(void *userData, struct Object *ob, struct ID **idpoin, int cb_flag)
#define LISTBASE_FOREACH(type, var, list)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
MINLINE float interpf(float a, float b, float t)
MINLINE float ratiof(float min, float max, float pos)
#define PSEUDOINVERSE_EPSILON
void mul_v3_m4v3(float r[3], const float M[4][4], const float v[3])
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
struct Depsgraph Depsgraph
void DEG_add_object_relation(struct DepsNodeHandle *node_handle, struct Object *object, eDepsObjectComponentType component, const char *description)
float DEG_get_ctime(const Depsgraph *graph)
struct Scene * DEG_get_evaluated_scene(const struct Depsgraph *graph)
#define DNA_struct_default_get(struct_name)
struct BuildGpencilModifierData BuildGpencilModifierData
@ GP_BUILD_TRANSITION_SHRINK
@ GP_BUILD_TRANSITION_VANISH
@ GP_BUILD_TRANSITION_GROW
@ GP_BUILD_MODE_SEQUENTIAL
@ GP_BUILD_MODE_CONCURRENT
@ GP_BUILD_TIMEALIGN_START
@ GP_BUILD_INVERT_LAYERPASS
@ eGpencilModifierType_Time
@ eGpencilModifierType_Build
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
PointerRNA * gpencil_modifier_panel_get_property_pointers(Panel *panel, PointerRNA *r_ob_ptr)
void gpencil_modifier_masking_panel_draw(Panel *panel, bool use_material, bool use_vertex)
void gpencil_modifier_panel_end(uiLayout *layout, PointerRNA *ptr)
PanelType * gpencil_modifier_subpanel_register(ARegionType *region_type, const char *name, const char *label, PanelDrawFn draw_header, PanelDrawFn draw, PanelType *parent)
PanelType * gpencil_modifier_panel_register(ARegionType *region_type, GpencilModifierType type, PanelDrawFn draw)
static void fading_header_draw(const bContext *UNUSED(C), Panel *panel)
static void frame_range_header_draw(const bContext *UNUSED(C), Panel *panel)
static bool dependsOnTime(GpencilModifierData *UNUSED(md))
static void fading_panel_draw(const bContext *UNUSED(C), Panel *panel)
static int cmp_stroke_build_details(const void *ps1, const void *ps2)
static void updateDepsgraph(GpencilModifierData *md, const ModifierUpdateDepsgraphContext *ctx, const int UNUSED(mode))
static void frame_range_panel_draw(const bContext *UNUSED(C), Panel *panel)
struct tStrokeBuildDetails tStrokeBuildDetails
static void fade_stroke_points(bGPDstroke *gps, const int starting_index, const int ending_index, const float starting_weight, const float ending_weight, const int target_def_nr, const eBuildGpencil_Transition transition, const float thickness_strength, const float opacity_strength)
static void mask_panel_draw(const bContext *UNUSED(C), Panel *panel)
static void foreachIDLink(GpencilModifierData *md, Object *ob, IDWalkFunc walk, void *userData)
static void build_concurrent(BuildGpencilModifierData *mmd, bGPdata *gpd, bGPDframe *gpf, const int target_def_nr, float fac)
static void build_sequential(Object *ob, BuildGpencilModifierData *mmd, bGPdata *gpd, bGPDframe *gpf, const int target_def_nr, float fac, bool additive)
static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
static void clear_stroke(bGPDframe *gpf, bGPDstroke *gps)
static void panelRegister(ARegionType *region_type)
static void reduce_stroke_points(bGPdata *gpd, bGPDframe *gpf, bGPDstroke *gps, const int points_num, const eBuildGpencil_Transition transition)
static void gpf_clear_all_strokes(bGPDframe *gpf)
static void initData(GpencilModifierData *md)
static void generateStrokes(GpencilModifierData *md, Depsgraph *depsgraph, Object *ob)
static void generate_geometry(GpencilModifierData *md, Depsgraph *depsgraph, Object *ob, bGPdata *gpd, bGPDlayer *gpl, bGPDframe *gpf)
GpencilModifierTypeInfo modifierType_Gpencil_Build
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Bright Control the brightness and contrast of the input color Vector Map an input vectors to used to fine tune the interpolation of the input Camera Retrieve information about the camera and how it relates to the current shading point s position CLAMP
uiLayout * uiLayoutRowWithHeading(uiLayout *layout, bool align, const char *heading)
void uiLayoutSetActive(uiLayout *layout, bool active)
uiLayout * uiLayoutColumn(uiLayout *layout, bool align)
void uiLayoutSetPropSep(uiLayout *layout, bool is_sep)
void uiItemS(uiLayout *layout)
uiLayout * uiLayoutRow(uiLayout *layout, bool align)
void uiItemR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int flag, const char *name, int icon)
void uiLayoutSetPropDecorate(uiLayout *layout, bool is_sep)
void uiItemDecoratorR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, int index)
void uiItemPointerR(uiLayout *layout, struct PointerRNA *ptr, const char *propname, struct PointerRNA *searchptr, const char *searchpropname, const char *name, int icon)
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
const Depsgraph * depsgraph
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
bool RNA_boolean_get(PointerRNA *ptr, const char *name)
int RNA_enum_get(PointerRNA *ptr, const char *name)
float fade_opacity_strength
GpencilModifierData modifier
float fade_thickness_strength
struct DepsNodeHandle * node
struct MDeformVert * dvert