diff options
Diffstat (limited to 'source/blender/blenkernel')
22 files changed, 127 insertions, 80 deletions
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h index ec595320d6a..c6f6579ec48 100644 --- a/source/blender/blenkernel/BKE_blender.h +++ b/source/blender/blenkernel/BKE_blender.h @@ -49,7 +49,7 @@ extern "C" { /* used by packaging tools */ /* can be left blank, otherwise a,b,c... etc with no quotes */ -#define BLENDER_VERSION_CHAR +#define BLENDER_VERSION_CHAR a /* alpha/beta/rc/release, docs use this */ #define BLENDER_VERSION_CYCLE release diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h index a9d5ea75208..e85f594daba 100644 --- a/source/blender/blenkernel/BKE_curve.h +++ b/source/blender/blenkernel/BKE_curve.h @@ -144,6 +144,7 @@ void BKE_nurb_knot_calc_v(struct Nurb *nu); /* nurb checks if they can be drawn, also clamp order func */ bool BKE_nurb_check_valid_u(struct Nurb *nu); bool BKE_nurb_check_valid_v(struct Nurb *nu); +bool BKE_nurb_check_valid_uv(struct Nurb *nu); bool BKE_nurb_order_clamp_u(struct Nurb *nu); bool BKE_nurb_order_clamp_v(struct Nurb *nu); diff --git a/source/blender/blenkernel/BKE_depsgraph.h b/source/blender/blenkernel/BKE_depsgraph.h index 05bb01a4490..5652e714209 100644 --- a/source/blender/blenkernel/BKE_depsgraph.h +++ b/source/blender/blenkernel/BKE_depsgraph.h @@ -157,7 +157,7 @@ void DAG_print_dependencies(struct Main *bmain, struct Scene *scene, struct Obje /* ************************ DAG querying ********************* */ struct Object *DAG_get_node_object(void *node_v); -const char *DAG_get_node_name(void *node_v); +const char *DAG_get_node_name(struct Scene *scene, void *node_v); short DAG_get_eval_flags_for_object(struct Scene *scene, void *object); bool DAG_is_acyclic(struct Scene *scene); diff --git a/source/blender/blenkernel/BKE_library.h b/source/blender/blenkernel/BKE_library.h index 5c92cc7b34b..44a9885cd87 100644 --- a/source/blender/blenkernel/BKE_library.h +++ b/source/blender/blenkernel/BKE_library.h @@ -49,6 +49,7 @@ struct PropertyRNA; void *BKE_libblock_alloc(struct Main *bmain, short type, const char *name) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); void *BKE_libblock_copy_ex(struct Main *bmain, struct ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); +void *BKE_libblock_copy_nolib(struct ID *id) ATTR_NONNULL(); void *BKE_libblock_copy(struct ID *id) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(); void BKE_libblock_copy_data(struct ID *id, const struct ID *id_from, const bool do_action); diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 72c4c21d587..2ad6c54fb67 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -167,7 +167,8 @@ void BKE_object_tfm_protected_restore(struct Object *ob, void BKE_object_handle_update(struct EvaluationContext *eval_ctx, struct Scene *scene, struct Object *ob); void BKE_object_handle_update_ex(struct EvaluationContext *eval_ctx, struct Scene *scene, struct Object *ob, - struct RigidBodyWorld *rbw); + struct RigidBodyWorld *rbw, + const bool do_proxy_update); void BKE_object_sculpt_modifiers_changed(struct Object *ob); int BKE_object_obdata_texspace_get(struct Object *ob, short **r_texflag, float **r_loc, float **r_size, float **r_rot); diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h index 0cbb9215868..ea47f0ba47d 100644 --- a/source/blender/blenkernel/BKE_sequencer.h +++ b/source/blender/blenkernel/BKE_sequencer.h @@ -99,6 +99,7 @@ typedef struct SeqRenderData { int motion_blur_samples; float motion_blur_shutter; bool skip_cache; + bool is_proxy_render; } SeqRenderData; SeqRenderData BKE_sequencer_new_render_data(struct EvaluationContext *eval_ctx, struct Main *bmain, diff --git a/source/blender/blenkernel/depsgraph_private.h b/source/blender/blenkernel/depsgraph_private.h index e61d47e87f4..0ab633701c1 100644 --- a/source/blender/blenkernel/depsgraph_private.h +++ b/source/blender/blenkernel/depsgraph_private.h @@ -129,6 +129,7 @@ typedef struct DagForest { int numNodes; bool is_acyclic; int time; /* for flushing/tagging, compare with node->lasttime */ + bool ugly_hack_sorry; /* prevent type check */ } DagForest; // queue operations diff --git a/source/blender/blenkernel/intern/anim_sys.c b/source/blender/blenkernel/intern/anim_sys.c index 3088f2ccf9b..b0c293720c4 100644 --- a/source/blender/blenkernel/intern/anim_sys.c +++ b/source/blender/blenkernel/intern/anim_sys.c @@ -894,7 +894,7 @@ void BKE_animdata_main_cb(Main *mainptr, ID_AnimData_Edit_Callback func, void *u AnimData *adt = BKE_animdata_from_id(id); \ NtId_Type *ntp = (NtId_Type *)id; \ if (ntp->nodetree) { \ - AnimData *adt2 = BKE_animdata_from_id((ID *)ntp); \ + AnimData *adt2 = BKE_animdata_from_id((ID *)ntp->nodetree); \ if (adt2) func(id, adt2, user_data); \ } \ if (adt) func(id, adt, user_data); \ diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c index 1fe01fa9637..cb15b5dbd78 100644 --- a/source/blender/blenkernel/intern/curve.c +++ b/source/blender/blenkernel/intern/curve.c @@ -3798,6 +3798,16 @@ bool BKE_nurb_check_valid_v(struct Nurb *nu) return true; } +bool BKE_nurb_check_valid_uv(struct Nurb *nu) +{ + if (!BKE_nurb_check_valid_u(nu)) + return false; + if ((nu->pntsv > 1) && !BKE_nurb_check_valid_v(nu)) + return false; + + return true; +} + bool BKE_nurb_order_clamp_u(struct Nurb *nu) { bool changed = false; diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index af321302984..dc467a5f215 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -305,6 +305,7 @@ DagForest *dag_init(void) DagForest *forest; /* use callocN to init all zero */ forest = MEM_callocN(sizeof(DagForest), "DAG root"); + forest->ugly_hack_sorry = true; return forest; } @@ -995,7 +996,6 @@ DagNode *dag_find_node(DagForest *forest, void *fob) return NULL; } -static int ugly_hack_sorry = 1; /* prevent type check */ static int dag_print_dependencies = 0; /* debugging */ /* no checking of existence, use dag_find_node first or dag_get_node */ @@ -1008,7 +1008,7 @@ DagNode *dag_add_node(DagForest *forest, void *fob) node->ob = fob; node->color = DAG_WHITE; - if (ugly_hack_sorry) node->type = GS(((ID *) fob)->name); /* sorry, done for pose sorting */ + if (forest->ugly_hack_sorry) node->type = GS(((ID *) fob)->name); /* sorry, done for pose sorting */ if (forest->numNodes) { ((DagNode *) forest->DagNode.last)->next = node; forest->DagNode.last = node; @@ -1116,28 +1116,28 @@ void dag_add_relation(DagForest *forest, DagNode *fob1, DagNode *fob2, short rel fob1->child = itA; } -static const char *dag_node_name(DagNode *node) +static const char *dag_node_name(DagForest *dag, DagNode *node) { if (node->ob == NULL) return "null"; - else if (ugly_hack_sorry) + else if (dag->ugly_hack_sorry) return ((ID *)(node->ob))->name + 2; else return ((bPoseChannel *)(node->ob))->name; } -static void dag_node_print_dependencies(DagNode *node) +static void dag_node_print_dependencies(DagForest *dag, DagNode *node) { DagAdjList *itA; - printf("%s depends on:\n", dag_node_name(node)); + printf("%s depends on:\n", dag_node_name(dag, node)); for (itA = node->parent; itA; itA = itA->next) - printf(" %s through %s\n", dag_node_name(itA->node), itA->name); + printf(" %s through %s\n", dag_node_name(dag, itA->node), itA->name); printf("\n"); } -static int dag_node_print_dependency_recurs(DagNode *node, DagNode *endnode) +static int dag_node_print_dependency_recurs(DagForest *dag, DagNode *node, DagNode *endnode) { DagAdjList *itA; @@ -1150,8 +1150,8 @@ static int dag_node_print_dependency_recurs(DagNode *node, DagNode *endnode) return 1; for (itA = node->parent; itA; itA = itA->next) { - if (dag_node_print_dependency_recurs(itA->node, endnode)) { - printf(" %s depends on %s through %s.\n", dag_node_name(node), dag_node_name(itA->node), itA->name); + if (dag_node_print_dependency_recurs(dag, itA->node, endnode)) { + printf(" %s depends on %s through %s.\n", dag_node_name(dag, node), dag_node_name(dag, itA->node), itA->name); return 1; } } @@ -1166,8 +1166,8 @@ static void dag_node_print_dependency_cycle(DagForest *dag, DagNode *startnode, for (node = dag->DagNode.first; node; node = node->next) node->color = DAG_WHITE; - printf(" %s depends on %s through %s.\n", dag_node_name(endnode), dag_node_name(startnode), name); - dag_node_print_dependency_recurs(startnode, endnode); + printf(" %s depends on %s through %s.\n", dag_node_name(dag, endnode), dag_node_name(dag, startnode), name); + dag_node_print_dependency_recurs(dag, startnode, endnode); printf("\n"); } @@ -1201,7 +1201,7 @@ static void dag_check_cycle(DagForest *dag) /* debugging print */ if (dag_print_dependencies) for (node = dag->DagNode.first; node; node = node->next) - dag_node_print_dependencies(node); + dag_node_print_dependencies(dag, node); /* tag nodes unchecked */ for (node = dag->DagNode.first; node; node = node->next) @@ -2836,7 +2836,7 @@ void DAG_pose_sort(Object *ob) int skip = 0; dag = dag_init(); - ugly_hack_sorry = 0; /* no ID structs */ + dag->ugly_hack_sorry = false; /* no ID structs */ rootnode = dag_add_node(dag, NULL); /* node->ob becomes NULL */ @@ -2963,8 +2963,6 @@ void DAG_pose_sort(Object *ob) free_forest(dag); MEM_freeN(dag); - - ugly_hack_sorry = 1; } /* ************************ DAG FOR THREADED UPDATE ********************* */ @@ -3083,14 +3081,14 @@ Object *DAG_get_node_object(void *node_v) } /* Returns node name, used for debug output only, atm. */ -const char *DAG_get_node_name(void *node_v) +const char *DAG_get_node_name(Scene *scene, void *node_v) { DagNode *node = node_v; - return dag_node_name(node); + return dag_node_name(scene->theDag, node); } -short DAG_get_eval_flags_for_object(struct Scene *scene, void *object) +short DAG_get_eval_flags_for_object(Scene *scene, void *object) { DagNode *node; diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c index 9582d87c540..af3246a1b61 100644 --- a/source/blender/blenkernel/intern/displist.c +++ b/source/blender/blenkernel/intern/displist.c @@ -1212,7 +1212,7 @@ void BKE_displist_make_surf(Scene *scene, Object *ob, ListBase *dispbase, curve_calc_modifiers_pre(scene, ob, &nubase, forRender, renderResolution); for (nu = nubase.first; nu; nu = nu->next) { - if (forRender || nu->hide == 0) { + if ((forRender || nu->hide == 0) && BKE_nurb_check_valid_uv(nu)) { int resolu = nu->resolu, resolv = nu->resolv; if (renderResolution) { diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c index b3e0bfa387b..c2ddd0cac4b 100644 --- a/source/blender/blenkernel/intern/editderivedmesh.c +++ b/source/blender/blenkernel/intern/editderivedmesh.c @@ -1744,10 +1744,8 @@ static void statvis_calc_overhang( bool is_max; /* fallback */ - const char col_fallback[2][4] = { - {64, 64, 64, 255}, /* gray */ - {0, 0, 0, 255}, /* max color */ - }; + unsigned char col_fallback[4] = {64, 64, 64, 255}; /* gray */ + unsigned char col_fallback_max[4] = {0, 0, 0, 255}; /* max color */ BLI_assert(min <= max); @@ -1762,7 +1760,7 @@ static void statvis_calc_overhang( { float fcol[3]; weight_to_rgb(fcol, 1.0f); - rgb_float_to_uchar((unsigned char *)col_fallback[1], fcol); + rgb_float_to_uchar(col_fallback_max, fcol); } /* now convert into global space */ @@ -1779,7 +1777,8 @@ static void statvis_calc_overhang( rgb_float_to_uchar(r_face_colors[index], fcol); } else { - copy_v4_v4_char((char *)r_face_colors[index], (const char *)(col_fallback[is_max])); + unsigned char *fallback = is_max ? col_fallback_max : col_fallback; + copy_v4_v4_char((char *)r_face_colors[index], (const char *)fallback); } } } diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index b8b126c4c8e..35751867b1a 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -3058,7 +3058,6 @@ static ImBuf *image_acquire_ibuf(Image *ima, ImageUser *iuser, void **lock_r) if (ima->type == IMA_TYPE_MULTILAYER) /* keeps render result, stores ibufs in listbase, allows saving */ ibuf = image_get_ibuf_multilayer(ima, iuser); - } else if (ima->source == IMA_SRC_GENERATED) { /* generated is: ibuf is allocated dynamically */ @@ -3076,9 +3075,6 @@ static ImBuf *image_acquire_ibuf(Image *ima, ImageUser *iuser, void **lock_r) /* always verify entirely, and potentially * returns pointer to release later */ ibuf = image_get_render_result(ima, iuser, lock_r); - if (ibuf) { - ibuf->userflags |= IB_PERSISTENT; - } } else if (ima->type == IMA_TYPE_COMPOSITE) { /* requires lock/unlock, otherwise don't return image */ @@ -3097,10 +3093,14 @@ static ImBuf *image_acquire_ibuf(Image *ima, ImageUser *iuser, void **lock_r) ibuf = IMB_allocImBuf(256, 256, 32, IB_rect); image_assign_ibuf(ima, ibuf, 0, frame); } - ibuf->userflags |= IB_PERSISTENT; } } } + + /* We only want movies and sequences to be memory limited. */ + if (ibuf != NULL && !ELEM(ima->source, IMA_SRC_MOVIE, IMA_SRC_SEQUENCE)) { + ibuf->userflags |= IB_PERSISTENT; + } } BKE_image_tag_time(ima); diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c index 0bd1f97a279..f831378ca5a 100644 --- a/source/blender/blenkernel/intern/library.c +++ b/source/blender/blenkernel/intern/library.c @@ -808,6 +808,32 @@ void *BKE_libblock_copy_ex(Main *bmain, ID *id) return idn; } +void *BKE_libblock_copy_nolib(ID *id) +{ + ID *idn; + size_t idn_len; + + idn = alloc_libblock_notest(GS(id->name)); + assert(idn != NULL); + + BLI_strncpy(idn->name, id->name, sizeof(idn->name)); + + idn_len = MEM_allocN_len(idn); + if ((int)idn_len - (int)sizeof(ID) > 0) { /* signed to allow neg result */ + const char *cp = (const char *)id; + char *cpn = (char *)idn; + + memcpy(cpn + sizeof(ID), cp + sizeof(ID), idn_len - sizeof(ID)); + } + + id->newid = idn; + idn->flag |= LIB_NEW; + + BKE_libblock_copy_data(idn, id, false); + + return idn; +} + void *BKE_libblock_copy(ID *id) { return BKE_libblock_copy_ex(G.main, id); diff --git a/source/blender/blenkernel/intern/mask.c b/source/blender/blenkernel/intern/mask.c index 9b7886ece97..d08b7316e61 100644 --- a/source/blender/blenkernel/intern/mask.c +++ b/source/blender/blenkernel/intern/mask.c @@ -734,6 +734,7 @@ Mask *BKE_mask_new(Main *bmain, const char *name) return mask; } +/* TODO(sergey): Use generic BKE_libblock_copy_nolib() instead. */ Mask *BKE_mask_copy_nolib(Mask *mask) { Mask *mask_new; diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 5f6331315f8..f3e38d84c33 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -256,8 +256,7 @@ Material *localize_material(Material *ma) Material *man; int a; - man = BKE_libblock_copy(&ma->id); - BLI_remlink(&G.main->mat, man); + man = BKE_libblock_copy_nolib(&ma->id); /* no increment for texture ID users, in previewrender.c it prevents decrement */ for (a = 0; a < MAX_MTEX; a++) { diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c index a41b47809eb..c8fe99bab91 100644 --- a/source/blender/blenkernel/intern/movieclip.c +++ b/source/blender/blenkernel/intern/movieclip.c @@ -279,17 +279,8 @@ static ImBuf *movieclip_load_movie_file(MovieClip *clip, MovieClipUser *user, in movieclip_open_anim_file(clip); if (clip->anim) { - int dur; - int fra; - - dur = IMB_anim_get_duration(clip->anim, tc); - fra = framenr - clip->start_frame + clip->frame_offset; - - if (fra < 0) - fra = 0; - - if (fra > (dur - 1)) - fra = dur - 1; + int dur = IMB_anim_get_duration(clip->anim, tc); + int fra = framenr - clip->start_frame + clip->frame_offset; ibuf = IMB_anim_absolute(clip->anim, fra, tc, proxy); } diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index d6225560e32..4fbc5c3f2d9 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -1114,20 +1114,13 @@ static bNodeTree *ntreeCopyTree_internal(bNodeTree *ntree, Main *bmain, bool do_ if (ntree == NULL) return NULL; - if (bmain) { - /* is ntree part of library? */ - if (BLI_findindex(&bmain->nodetree, ntree) != -1) - newtree = BKE_libblock_copy(&ntree->id); - else - newtree = NULL; + /* is ntree part of library? */ + if (bmain && BLI_findindex(&bmain->nodetree, ntree) >= 0) { + newtree = BKE_libblock_copy(&ntree->id); } - else - newtree = NULL; - - if (newtree == NULL) { - newtree = MEM_dupallocN(ntree); + else { + newtree = BKE_libblock_copy_nolib(&ntree->id); newtree->id.lib = NULL; /* same as owning datablock id.lib */ - BKE_libblock_copy_data(&newtree->id, &ntree->id, true); /* copy animdata and ID props */ } id_us_plus((ID *)newtree->gpd); diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 0970af46a6b..674c16383af 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -2843,7 +2843,8 @@ bool BKE_object_parent_loop_check(const Object *par, const Object *ob) /* Ideally we shouldn't have to pass the rigid body world, but need bigger restructuring to avoid id */ void BKE_object_handle_update_ex(EvaluationContext *eval_ctx, Scene *scene, Object *ob, - RigidBodyWorld *rbw) + RigidBodyWorld *rbw, + const bool do_proxy_update) { if (ob->recalc & OB_RECALC_ALL) { /* speed optimization for animation lookups */ @@ -3036,8 +3037,10 @@ void BKE_object_handle_update_ex(EvaluationContext *eval_ctx, /* the no-group proxy case, we call update */ if (ob->proxy_group == NULL) { - // printf("call update, lib ob %s proxy %s\n", ob->proxy->id.name, ob->id.name); - BKE_object_handle_update(eval_ctx, scene, ob->proxy); + if (do_proxy_update) { + // printf("call update, lib ob %s proxy %s\n", ob->proxy->id.name, ob->id.name); + BKE_object_handle_update(eval_ctx, scene, ob->proxy); + } } } } @@ -3048,7 +3051,7 @@ void BKE_object_handle_update_ex(EvaluationContext *eval_ctx, */ void BKE_object_handle_update(EvaluationContext *eval_ctx, Scene *scene, Object *ob) { - BKE_object_handle_update_ex(eval_ctx, scene, ob, NULL); + BKE_object_handle_update_ex(eval_ctx, scene, ob, NULL, true); } void BKE_object_sculpt_modifiers_changed(Object *ob) diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 3a6e710d68c..ed0f8b2d8e4 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -3779,7 +3779,7 @@ static int get_particle_uv(DerivedMesh *dm, ParticleData *pa, int face_index, co return 0; if (pa) { - i = (pa->num_dmcache == DMCACHE_NOTFOUND) ? pa->num : pa->num_dmcache; + i = ELEM(pa->num_dmcache, DMCACHE_NOTFOUND, DMCACHE_ISCHILD) ? pa->num : pa->num_dmcache; if (i >= dm->getNumTessFaces(dm)) i = -1; } diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index 110e91711f0..37eba4657ff 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -1270,7 +1270,7 @@ static void scene_update_all_bases(EvaluationContext *eval_ctx, Scene *scene, Sc for (base = scene->base.first; base; base = base->next) { Object *object = base->object; - BKE_object_handle_update_ex(eval_ctx, scene_parent, object, scene->rigidbody_world); + BKE_object_handle_update_ex(eval_ctx, scene_parent, object, scene->rigidbody_world, true); if (object->dup_group && (object->transflag & OB_DUPLIGROUP)) BKE_group_handle_recalc_and_update(eval_ctx, scene_parent, object, object->dup_group); @@ -1304,9 +1304,11 @@ static void scene_update_object_func(TaskPool *pool, void *taskdata, int threadi double start_time = 0.0; bool add_to_stats = false; - PRINT("Thread %d: update object %s\n", threadid, object->id.name); - if (G.debug & G_DEBUG_DEPSGRAPH) { + if (object->recalc & OB_RECALC_ALL) { + printf("Thread %d: update object %s\n", threadid, object->id.name); + } + start_time = PIL_check_seconds_timer(); if (object->recalc & OB_RECALC_ALL) { @@ -1319,7 +1321,7 @@ static void scene_update_object_func(TaskPool *pool, void *taskdata, int threadi * separately from main thread because of we've got no idea about * dependencies inside the group. */ - BKE_object_handle_update_ex(eval_ctx, scene_parent, object, scene->rigidbody_world); + BKE_object_handle_update_ex(eval_ctx, scene_parent, object, scene->rigidbody_world, false); /* Calculate statistics. */ if (add_to_stats) { @@ -1335,7 +1337,7 @@ static void scene_update_object_func(TaskPool *pool, void *taskdata, int threadi } else { PRINT("Threda %d: update node %s\n", threadid, - DAG_get_node_name(node)); + DAG_get_node_name(scene, node)); } /* Update will decrease child's valency and schedule child with zero valency. */ diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c index 86cf04eded8..7b9262320af 100644 --- a/source/blender/blenkernel/intern/sequencer.c +++ b/source/blender/blenkernel/intern/sequencer.c @@ -1467,8 +1467,8 @@ static void seq_proxy_build_frame(const SeqRenderData *context, Sequence *seq, i ibuf = seq_render_strip(context, seq, cfra); - rectx = (proxy_render_size * context->scene->r.xsch) / 100; - recty = (proxy_render_size * context->scene->r.ysch) / 100; + rectx = (proxy_render_size * ibuf->x) / 100; + recty = (proxy_render_size * ibuf->y) / 100; if (ibuf->x != rectx || ibuf->y != recty) { IMB_scalefastImBuf(ibuf, (short)rectx, (short)recty); @@ -1562,6 +1562,7 @@ void BKE_sequencer_proxy_rebuild(SeqIndexBuildContext *context, short *stop, sho (scene->r.size * (float) scene->r.xsch) / 100.0f + 0.5f, (scene->r.size * (float) scene->r.ysch) / 100.0f + 0.5f, 100); render_context.skip_cache = true; + render_context.is_proxy_render = true; for (cfra = seq->startdisp + seq->startstill; cfra < seq->enddisp - seq->endstill; cfra++) { if (context->size_flags & IMB_PROXY_25) { @@ -1919,10 +1920,14 @@ void BKE_sequencer_color_balance_apply(StripColorBalance *cb, ImBuf *ibuf, float * - Premultiply */ -int BKE_sequencer_input_have_to_preprocess(const SeqRenderData *UNUSED(context), Sequence *seq, float UNUSED(cfra)) +int BKE_sequencer_input_have_to_preprocess(const SeqRenderData *context, Sequence *seq, float UNUSED(cfra)) { float mul; + if (context->is_proxy_render) { + return FALSE; + } + if (seq->flag & (SEQ_FILTERY | SEQ_USE_CROP | SEQ_USE_TRANSFORM | SEQ_FLIPX | SEQ_FLIPY | SEQ_MAKE_FLOAT)) { return TRUE; } @@ -2806,8 +2811,12 @@ static ImBuf *seq_render_strip(const SeqRenderData *context, Sequence *seq, floa if (ibuf == NULL) ibuf = do_render_strip_uncached(context, seq, cfra); - if (ibuf) + if (ibuf) { + if (ELEM(seq->type, SEQ_TYPE_MOVIE, SEQ_TYPE_MOVIECLIP)) { + is_proxy_image = (context->preview_render_size != 100); + } BKE_sequencer_preprocessed_cache_put(context, seq, cfra, SEQ_STRIPELEM_IBUF, ibuf); + } } } @@ -2826,8 +2835,11 @@ static ImBuf *seq_render_strip(const SeqRenderData *context, Sequence *seq, floa sequencer_imbuf_assign_spaces(context->scene, ibuf); } - if (ibuf->x != context->rectx || ibuf->y != context->recty) + if (context->is_proxy_render == false && + (ibuf->x != context->rectx || ibuf->y != context->recty)) + { use_preprocess = TRUE; + } if (use_preprocess) ibuf = input_preprocess(context, seq, cfra, ibuf, is_proxy_image, is_preprocessed); @@ -4011,11 +4023,19 @@ void BKE_sequencer_offset_animdata(Scene *scene, Sequence *seq, int ofs) for (fcu = scene->adt->action->curves.first; fcu; fcu = fcu->next) { if (strstr(fcu->rna_path, "sequence_editor.sequences_all[") && strstr(fcu->rna_path, str)) { unsigned int i; - for (i = 0; i < fcu->totvert; i++) { - BezTriple *bezt = &fcu->bezt[i]; - bezt->vec[0][0] += ofs; - bezt->vec[1][0] += ofs; - bezt->vec[2][0] += ofs; + if (fcu->bezt) { + for (i = 0; i < fcu->totvert; i++) { + BezTriple *bezt = &fcu->bezt[i]; + bezt->vec[0][0] += ofs; + bezt->vec[1][0] += ofs; + bezt->vec[2][0] += ofs; + } + } + if (fcu->fpt) { + for (i = 0; i < fcu->totvert; i++) { + FPoint *fpt = &fcu->fpt[i]; + fpt->vec[0] += ofs; + } } } } |