107 gps_next = gps->
next;
119 const int num_points,
124 if ((gps->
dvert !=
NULL) && (num_points > 0)) {
129 switch (transition) {
137 if ((gps->
dvert !=
NULL) && (num_points > 0)) {
141 for (
int i = num_points; i < gps->
totpoints; i++) {
154 const int offset = gps->
totpoints - num_points;
158 if ((gps->
dvert !=
NULL) && (num_points > 0)) {
162 for (
int i = 0; i < offset; i++) {
171 printf(
"ERROR: Unknown transition %d in %s()\n", (
int)transition, __func__);
179 gps->
dvert = new_dvert;
212 size_t totpoints = 0;
225 for (i = 0; i < tot_strokes; i++) {
238 size_t first_visible = 0;
239 size_t last_visible = 0;
247 last_visible = (size_t)roundf(totpoints * fac);
255 last_visible = (size_t)(totpoints * (1.0f - fac));
262 first_visible = (size_t)(totpoints * fac);
263 last_visible = totpoints;
268 for (i = 0; i < tot_strokes; i++) {
278 if ((first_visible <= cell->start_idx) && (last_visible >= cell->
end_idx)) {
281 else if (first_visible > cell->
start_idx) {
283 int num_points = cell->
end_idx - first_visible;
288 int num_points = last_visible - cell->
start_idx;
318 if (max_points == 0) {
319 printf(
"ERROR: Strokes are all empty (GP Build Modifier: %s)\n", __func__);
325 gps_next = gps->
next;
330 const float relative_len = (
float)gps->
totpoints / (
float)max_points;
339 if (fac <= relative_len) {
344 num_points = (int)roundf((1.0f - scaled_fac) * gps->
totpoints);
347 num_points = (int)roundf(scaled_fac * gps->
totpoints);
366 const float start_fac = 1.0f - relative_len;
368 if (fac >= start_fac) {
372 num_points = (int)roundf((1.0f - scaled_fac) * gps->
totpoints);
375 num_points = (int)roundf(scaled_fac * gps->
totpoints);
393 if (num_points <= 0) {
397 else if (num_points < gps->totpoints) {
450 if ((ctime < mmd->start_frame) || (ctime > mmd->
end_frame)) {
459 float end_frame = start_frame + mmd->
length;
469 if (ctime < start_frame) {
486 if (ctime >= end_frame) {
506 (ctime - start_frame) / (end_frame - start_frame);
519 printf(
"Unsupported build mode (%d) for GP Build Modifier: '%s'\n",
555 uiItemR(layout,
ptr,
"concurrent_time_alignment", 0,
NULL, ICON_NONE);
568 uiItemR(row,
ptr,
"use_percentage", 0,
"", ICON_NONE);
571 uiItemR(sub,
ptr,
"percentage_factor", 0,
"", ICON_NONE);
590 uiItemR(layout,
ptr,
"use_restrict_frame_range", 0,
IFACE_(
"Custom Range"), ICON_NONE);
626 "BuildGpencilModifierData",
typedef float(TangentPoint)[2]
void BKE_gpencil_free_point_weights(struct MDeformVert *dvert)
void BKE_gpencil_free_stroke(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)
#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)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define PSEUDOINVERSE_EPSILON
#define MEMCMP_STRUCT_AFTER_IS_ZERO(struct_var, member)
#define MEMCPY_STRUCT_AFTER(struct_dst, struct_src, member)
struct Depsgraph Depsgraph
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_FADE
@ GP_BUILD_TRANSITION_SHRINK
@ 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 frame_range_header_draw(const bContext *UNUSED(C), Panel *panel)
static void generate_geometry(GpencilModifierData *md, Depsgraph *depsgraph, bGPdata *gpd, bGPDlayer *gpl, bGPDframe *gpf)
static bool dependsOnTime(GpencilModifierData *UNUSED(md))
static void reduce_stroke_points(bGPdata *gpd, bGPDstroke *gps, const int num_points, const eBuildGpencil_Transition transition)
static void frame_range_panel_draw(const bContext *UNUSED(C), Panel *panel)
struct tStrokeBuildDetails tStrokeBuildDetails
static void mask_panel_draw(const bContext *UNUSED(C), Panel *panel)
static void copyData(const GpencilModifierData *md, GpencilModifierData *target)
static void panel_draw(const bContext *UNUSED(C), Panel *panel)
static void build_sequential(BuildGpencilModifierData *mmd, bGPdata *gpd, bGPDframe *gpf, float fac)
static void clear_stroke(bGPDframe *gpf, bGPDstroke *gps)
static void panelRegister(ARegionType *region_type)
static void build_concurrent(BuildGpencilModifierData *mmd, bGPdata *gpd, bGPDframe *gpf, float fac)
static void gpf_clear_all_strokes(bGPDframe *gpf)
static void initData(GpencilModifierData *md)
static void generateStrokes(GpencilModifierData *md, Depsgraph *depsgraph, Object *ob)
GpencilModifierTypeInfo modifierType_Gpencil_Build
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)
const Depsgraph * depsgraph
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)
GpencilModifierData modifier
struct MDeformVert * dvert