[Bf-blender-cvs] [751d235] fracture_modifier: crash fix with FM and forcefields
Commit: 751d2354c2e3da4e39ed98460127c526e9d0b288 Author: Martin Felke Date: Mon Dec 19 22:34:49 2016 +0100 Branches: fracture_modifier https://developer.blender.org/rB751d2354c2e3da4e39ed98460127c526e9d0b288 crash fix with FM and forcefields === M source/blender/blenkernel/intern/rigidbody.c === diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c index 43c2aa5..a3cf18d 100644 --- a/source/blender/blenkernel/intern/rigidbody.c +++ b/source/blender/blenkernel/intern/rigidbody.c @@ -3510,7 +3510,7 @@ static void rigidbody_update_sim_ob(Scene *scene, RigidBodyWorld *rbw, Object *o pdDoEffectors(effectors, NULL, effector_weights, , eff_force, NULL); if ((rbo->flag & RBO_FLAG_KINEMATIC) && (thresh < len_squared_v3(eff_force))) { - activateRigidbody(rbo, NULL, NULL, NULL); + activateRigidbody(rbo, rbw, mi, ob); RB_body_apply_central_force(rbo->physics_object, eff_force); } else if (rbo->flag & RBO_FLAG_KINEMATIC) ___ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs
[Bf-blender-cvs] [76c4f0e] blender2.8: Fix parameter error (changes by Mike Erwin)
Commit: 76c4f0ec6c61bdc33ae908849f632771a1f997c0 Author: Antonio Vazquez Date: Mon Dec 19 22:36:56 2016 +0100 Branches: blender2.8 https://developer.blender.org/rB76c4f0ec6c61bdc33ae908849f632771a1f997c0 Fix parameter error (changes by Mike Erwin) === M source/blender/editors/screen/area.c === diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c index 19224ed..fe73495 100644 --- a/source/blender/editors/screen/area.c +++ b/source/blender/editors/screen/area.c @@ -2019,7 +2019,7 @@ void ED_region_panels(const bContext *C, ARegion *ar, const char *context, int c UI_view2d_view_restore(C); glEnable(GL_BLEND); VertexFormat* format = immVertexFormat(); - unsigned pos = add_attrib(format, "pos", GL_FLOAT, 2, KEEP_FLOAT); + unsigned pos = add_attrib(format, "pos", COMP_I32, 2, CONVERT_INT_TO_FLOAT); immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); immUniformThemeColor((ar->type->regionid == RGN_TYPE_PREVIEW) ? TH_PREVIEW_BACK : TH_BACK); immRecti(pos, 0, 0, BLI_rcti_size_x(>winrct), BLI_rcti_size_y(>winrct) + 1); ___ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs
[Bf-blender-cvs] [f41b14d] readfile_doversions_after_linking: Proper handling of IDs in do_versions_after_liblink.
Commit: f41b14d4f5f084ccaf1bec7c0bdec57dd7ae1fa2 Author: Bastien Montagne Date: Mon Dec 19 19:42:44 2016 +0100 Branches: readfile_doversions_after_linking https://developer.blender.org/rBf41b14d4f5f084ccaf1bec7c0bdec57dd7ae1fa2 Proper handling of IDs in do_versions_after_liblink. Basic idea is to store fileversion in Library datablock, and split again Main by libraries after lib linking, do_versions_after_liblink on those separated Mains, and merge again. This allows to still have correct versions for each data-block in that second do_versions step. === M source/blender/blenloader/intern/readfile.c M source/blender/makesdna/DNA_ID.h === diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 2bbdd73..f568a74 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -531,6 +531,8 @@ void blo_split_main(ListBase *mainlist, Main *main) for (Library *lib = main->library.first; lib; lib = lib->id.next, i++) { Main *libmain = BKE_main_new(); libmain->curlib = lib; + libmain->versionfile = lib->versionfile; + libmain->subversionfile = lib->subversionfile; BLI_addtail(mainlist, libmain); lib->temp_index = i; lib_main_array[i] = libmain; @@ -562,6 +564,10 @@ static void read_file_version(FileData *fd, Main *main) break; } } + if (main->curlib) { + main->curlib->versionfile = main->versionfile; + main->curlib->subversionfile = main->subversionfile; + } } #ifdef USE_GHASH_BHEAD @@ -8373,8 +8379,10 @@ static void do_versions(FileData *fd, Library *lib, Main *main) /* don't forget to set version number in BKE_blender_version.h! */ } -static void do_versions_after_linking(FileData *fd, Main *main) +static void do_versions_after_linking(Main *main) { +// printf("%s for %s (%s), %d.%d\n", __func__, main->curlib ? main->curlib->name : main->name, +//main->curlib ? "LIB" : "MAIN", main->versionfile, main->subversionfile); } static void lib_link_all(FileData *fd, Main *main) @@ -8577,7 +8585,16 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath) lib_link_all(fd, bfd->main); - do_versions_after_linking(fd, bfd->main); + /* Skip in undo case. */ + if (fd->memfile == NULL) { + /* Yep, second splitting... but this is a very cheap operation, so no big deal. */ + blo_split_main(, bfd->main); + for (Main *mainvar = mainlist.first; mainvar; mainvar = mainvar->next) { + BLI_assert(mainvar->versionfile != 0); + do_versions_after_linking(mainvar); + } + blo_join_main(); + } BKE_main_id_tag_all(bfd->main, LIB_TAG_NEW, false); @@ -10112,6 +10129,32 @@ Main *BLO_library_link_begin(Main *mainvar, BlendHandle **bh, const char *filepa return library_link_begin(mainvar, , filepath); } +static void split_main_newid(Main *mainptr, Main *main_newid) +{ + /* We only copy the necessary subset of data in this temp main. */ + main_newid->versionfile = mainptr->versionfile; + main_newid->subversionfile = mainptr->subversionfile; + BLI_strncpy(main_newid->name, mainptr->name, sizeof(main_newid->name)); + main_newid->curlib = mainptr->curlib; + + ListBase *lbarray[MAX_LIBARRAY]; + ListBase *lbarray_newid[MAX_LIBARRAY]; + int i = set_listbasepointers(mainptr, lbarray); + set_listbasepointers(main_newid, lbarray_newid); + while (i--) { + BLI_listbase_clear(lbarray_newid[i]); + + for (ID *id = lbarray[i]->first, *idnext; id; id = idnext) { + idnext = id->next; + + if (id->tag & LIB_TAG_NEW) { + BLI_remlink(lbarray[i], id); + BLI_addtail(lbarray_newid[i], id); + } + } + } +} + /* scene and v3d may be NULL. */ static void library_link_end(Main *mainl, FileData **fd, const short flag, Scene *scene, View3D *v3d) { @@ -10140,12 +10183,25 @@ static void library_link_end(Main *mainl, FileData **fd, const short flag, Scene blo_join_main((*fd)->mainlist); mainvar = (*fd)->mainlist->first; - MEM_freeN((*fd)->mainlist); mainl = NULL; /* blo_join_main free's mainl, cant use anymore */ lib_link_all(*fd, mainvar); - do_versions_after_linking(*fd, mainvar); + /* Yep, second splitting... but this is a very cheap operation, so no big deal. */ +
[Bf-blender-cvs] [3404f7d] readfile_doversions_after_linking: Initial resurrection of `do_versions_after_linking()`.
Commit: 3404f7d098de6046020488dc4d0d32076129084a Author: Bastien Montagne Date: Mon Dec 19 16:46:48 2016 +0100 Branches: readfile_doversions_after_linking https://developer.blender.org/rB3404f7d098de6046020488dc4d0d32076129084a Initial resurrection of `do_versions_after_linking()`. === M source/blender/blenloader/intern/readfile.c === diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index a154d28..2bbdd73 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -8373,14 +8373,9 @@ static void do_versions(FileData *fd, Library *lib, Main *main) /* don't forget to set version number in BKE_blender_version.h! */ } -#if 0 // XXX: disabled for now... we still don't have this in the right place in the loading code for it to work -static void do_versions_after_linking(FileData *fd, Library *lib, Main *main) +static void do_versions_after_linking(FileData *fd, Main *main) { - /* old Animation System (using IPO's) needs to be converted to the new Animato system */ - if (main->versionfile < 250) - do_versions_ipos_to_animato(main); } -#endif static void lib_link_all(FileData *fd, Main *main) { @@ -8582,7 +8577,8 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath) lib_link_all(fd, bfd->main); - //do_versions_after_linking(fd, NULL, bfd->main); // XXX: not here (or even in this function at all)! this causes crashes on many files - Aligorith (July 04, 2010) + do_versions_after_linking(fd, bfd->main); + BKE_main_id_tag_all(bfd->main, LIB_TAG_NEW, false); lib_verify_nodetree(bfd->main, true); @@ -10149,6 +10145,8 @@ static void library_link_end(Main *mainl, FileData **fd, const short flag, Scene lib_link_all(*fd, mainvar); + do_versions_after_linking(*fd, mainvar); + BKE_main_id_tag_all(mainvar, LIB_TAG_NEW, false); lib_verify_nodetree(mainvar, false); ___ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs
[Bf-blender-cvs] [9d2b6b5] render-layers: Fixup on BKE_scene_objects_Iterator_next
Commit: 9d2b6b56ac64d3d26f758c5bf0391f21734c3f2d Author: Dalai Felinto Date: Mon Dec 19 18:13:47 2016 +0100 Branches: render-layers https://developer.blender.org/rB9d2b6b56ac64d3d26f758c5bf0391f21734c3f2d Fixup on BKE_scene_objects_Iterator_next === M source/blender/blenkernel/intern/collection.c === diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c index 0305753..58533c2 100644 --- a/source/blender/blenkernel/intern/collection.c +++ b/source/blender/blenkernel/intern/collection.c @@ -319,36 +319,53 @@ void BKE_scene_objects_Iterator_begin(Iterator *iter, void *data_in) iter->current = sc->objects.first; } +/* gets the next unique object */ +static LinkData *object_base_next(GSet *gs, LinkData *link) +{ + if (link == NULL) { + return NULL; + } + + LinkData *link_next = link->next; + if (link_next) { + Object *ob = link_next->data; + if (!BLI_gset_haskey(gs, ob)) { + BLI_gset_add(gs, ob); + return link_next; + } + else { + return object_base_next(gs, link_next); + } + } + return NULL; +} + void BKE_scene_objects_Iterator_next(Iterator *iter) { SceneObjectsIteratorData *data = iter->data; + LinkData *link = object_base_next(data->visited, data->link); - if (data->link->next) { - data->link = data->link->next; - iter->current = data->link->data; + if (link) { + data->link = link; + iter->current = link->data; } else { - //TODO redo logic - while (data->scene_collection_iter.valid) { + do { + BKE_scene_collections_Iterator_next(>scene_collection_iter); SceneCollection *sc = data->scene_collection_iter.current; - if (sc->objects.first) { - data->link = sc->objects.first; + /* get the first unique object of this collection */ + LinkData *new_link = object_base_next(data->visited, sc->objects.first); + if (new_link) { + data->link = new_link; iter->current = data->link->data; break; } - BKE_scene_collections_Iterator_next(>scene_collection_iter); - } + } while (data->scene_collection_iter.valid); if (!data->scene_collection_iter.valid) { iter->valid = false; } } - -#if 0 // TODO - if (!BLI_gset_haskey(visited, ob)) { \ - BLI_gset_add(visited, ob); - } -#endif } void BKE_scene_objects_Iterator_end(Iterator *iter) ___ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs
[Bf-blender-cvs] [29961ad] render-layers: From review: blo_do_versions_280_after_linking > blo_do_versions_after_linking_280
Commit: 29961ad597ce24be8c522587fa9362f84f6730fc Author: Dalai Felinto Date: Fri Dec 16 15:51:17 2016 +0100 Branches: render-layers https://developer.blender.org/rB29961ad597ce24be8c522587fa9362f84f6730fc >From review: blo_do_versions_280_after_linking > >blo_do_versions_after_linking_280 === M source/blender/blenloader/intern/readfile.c M source/blender/blenloader/intern/readfile.h M source/blender/blenloader/intern/versioning_280.c === diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 2b14b04..c63dcd3 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -8047,7 +8047,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main) static void do_versions_after_linking(FileData *fd, Library *lib, Main *main) { - blo_do_versions_280_after_linking(fd, lib, main); + blo_do_versions_after_linking_280(fd, lib, main); } static void lib_link_all(FileData *fd, Main *main) diff --git a/source/blender/blenloader/intern/readfile.h b/source/blender/blenloader/intern/readfile.h index 796a514..daa49d0 100644 --- a/source/blender/blenloader/intern/readfile.h +++ b/source/blender/blenloader/intern/readfile.h @@ -172,7 +172,7 @@ void blo_do_versions_250(struct FileData *fd, struct Library *lib, struct Main * void blo_do_versions_260(struct FileData *fd, struct Library *lib, struct Main *main); void blo_do_versions_270(struct FileData *fd, struct Library *lib, struct Main *main); void blo_do_versions_280(struct FileData *fd, struct Library *lib, struct Main *main); -void blo_do_versions_280_after_linking(struct FileData *fd, struct Library *lib, struct Main *main); +void blo_do_versions_after_linking_280(struct FileData *fd, struct Library *lib, struct Main *main); #endif diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index ae39173..1835801 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -46,7 +46,7 @@ #include "MEM_guardedalloc.h" -void blo_do_versions_280_after_linking(FileData *fd, Library *UNUSED(lib), Main *main) +void blo_do_versions_after_linking_280(FileData *fd, Library *UNUSED(lib), Main *main) { if (!MAIN_VERSION_ATLEAST(main, 280, 0)) { if (!DNA_struct_elem_find(fd->filesdna, "Scene", "ListBase", "render_layers")) { ___ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs
[Bf-blender-cvs] [a3fd427] render-layers: From review: curly brackets reinforcement
Commit: a3fd4274cf20341c7ab6ed38f3e62adb6d83892d Author: Dalai Felinto Date: Fri Dec 16 16:04:47 2016 +0100 Branches: render-layers https://developer.blender.org/rBa3fd4274cf20341c7ab6ed38f3e62adb6d83892d >From review: curly brackets reinforcement (even though the other related functions are not following this rule ... How I miss a code refactor dev!) === M source/blender/blenkernel/intern/context.c === diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c index c9454f8..3e9505e 100644 --- a/source/blender/blenkernel/intern/context.c +++ b/source/blender/blenkernel/intern/context.c @@ -903,10 +903,12 @@ SceneLayer *CTX_data_scene_layer(const bContext *C) { SceneLayer *sl; - if (ctx_data_pointer_verify(C, "render_layer", (void *))) + if (ctx_data_pointer_verify(C, "render_layer", (void *))) { return sl; - else + } + else { return C->data.render_layer; + } } int CTX_data_mode_enum(const bContext *C) ___ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs
[Bf-blender-cvs] [60aa0b5] render-layers: Reworked logic of iterators
Commit: 60aa0b5b155aad774f85bdd6bc5d497157d568cb Author: Dalai Felinto Date: Mon Dec 19 17:52:09 2016 +0100 Branches: render-layers https://developer.blender.org/rB60aa0b5b155aad774f85bdd6bc5d497157d568cb Reworked logic of iterators otherwise I could not get different iterators based on a flag (SELECT), which is used everywhere in object_relations.c The alternative would be to split every function in object_relations.c into _all, and _selected === M source/blender/blenkernel/BKE_collection.h M source/blender/blenkernel/BKE_layer.h M source/blender/blenkernel/intern/collection.c M source/blender/blenkernel/intern/layer.c M source/blender/blenlib/BLI_iterator.h M source/blender/blenlib/CMakeLists.txt D source/blender/blenlib/intern/BLI_iterator.c M source/blender/editors/object/object_relations.c === diff --git a/source/blender/blenkernel/BKE_collection.h b/source/blender/blenkernel/BKE_collection.h index 3185f82..2b037f5 100644 --- a/source/blender/blenkernel/BKE_collection.h +++ b/source/blender/blenkernel/BKE_collection.h @@ -38,6 +38,7 @@ extern "C" { struct Iterator; struct SceneCollection; struct Object; +struct ObjectBase; struct Scene; struct SceneCollection *BKE_collection_add(struct Scene *scene, struct SceneCollection *sc_parent, const char *name); @@ -54,8 +55,13 @@ void BKE_scene_collections_callback(struct Scene *scene, BKE_scene_collections_C void BKE_scene_objects_callback(struct Scene *scene, BKE_scene_objects_Cb callback, void *data); /* iterators */ -void BKE_scene_objects_Iterator_begin(struct Iterator *iter, void *data); -void BKE_scene_collections_Iterator_begin(struct Iterator *iter, void *data); +void BKE_scene_collections_Iterator_begin(struct Iterator *iter, void *data_in); +void BKE_scene_collections_Iterator_next(struct Iterator *iter); +void BKE_scene_collections_Iterator_end(struct Iterator *iter); + +void BKE_scene_objects_Iterator_begin(struct Iterator *iter, void *data_in); +void BKE_scene_objects_Iterator_next(struct Iterator *iter); +void BKE_scene_objects_Iterator_end(struct Iterator *iter); typedef struct SceneCollectionIterData { struct SceneCollection *sc; @@ -63,27 +69,22 @@ typedef struct SceneCollectionIterData { } SceneCollectionIterData; #define FOREACH_SCENE_COLLECTION(scene, _sc) \ - ITER_BEGIN(BKE_scene_collections_Iterator_begin, scene, _sc) + ITER_BEGIN(BKE_scene_collections_Iterator_begin, \ + BKE_scene_collections_Iterator_next, \ + BKE_scene_collections_Iterator_end, \ + scene, _sc) #define FOREACH_SCENE_COLLECTION_END \ ITER_END #define FOREACH_SCENE_OBJECT(scene, _ob) \ -{ \ - GSet *visited = BLI_gset_ptr_new(__func__); \ - SceneCollection *sc; \ - FOREACH_SCENE_COLLECTION(scene, sc) \ - for (LinkData *link = sc->objects.first; link; link = link->next) { \ - _ob = link->data; \ - if (!BLI_gset_haskey(visited, ob)) { \ - BLI_gset_add(visited, ob); + ITER_BEGIN(BKE_scene_objects_Iterator_begin, \ + BKE_scene_objects_Iterator_next, \ + BKE_scene_objects_Iterator_end, \ + scene, _ob) #define FOREACH_SCENE_OBJECT_END \ -} \ -} \ - FOREACH_SCENE_COLLECTION_END \ - BLI_gset_free(visited, NULL); \ -} + ITER_END #ifdef __cplusplus } diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h index acfad81..090ab34 100644 --- a/source/blender/blenkernel/BKE_layer.h +++ b/source/blender/blenkernel/BKE_layer.h @@ -27,6 +27,8 @@ * \ingroup bke */ +#include "BKE_collection.h" + #ifdef __cplusplus extern "C" { #endif @@ -72,6 +74,45 @@ void BKE_collection_unlink(struct SceneLayer *sl, struct LayerCollection *lc); void BKE_collection_override_datablock_add(struct LayerCollection *lc, const char *data_path, struct ID *id); +/* iterators */ + +void
[Bf-blender-cvs] [57a5f2e] render-layers: Iterator util function
Commit: 57a5f2ef443d79d4394cf028a422392f1b7c1515 Author: Dalai Felinto Date: Fri Dec 16 18:22:05 2016 +0100 Branches: render-layers https://developer.blender.org/rB57a5f2ef443d79d4394cf028a422392f1b7c1515 Iterator util function === M source/blender/blenkernel/BKE_collection.h M source/blender/blenkernel/intern/collection.c M source/blender/blenkernel/intern/library_query.c A source/blender/blenlib/BLI_iterator.h M source/blender/blenlib/CMakeLists.txt A source/blender/blenlib/intern/BLI_iterator.c M source/blender/editors/object/object_relations.c === diff --git a/source/blender/blenkernel/BKE_collection.h b/source/blender/blenkernel/BKE_collection.h index 0d3f190..61d53da 100644 --- a/source/blender/blenkernel/BKE_collection.h +++ b/source/blender/blenkernel/BKE_collection.h @@ -27,10 +27,13 @@ * \ingroup bke */ +#include "BLI_iterator.h" + #ifdef __cplusplus extern "C" { #endif +struct Iterator; struct SceneCollection; struct Object; struct Scene; @@ -45,6 +48,15 @@ void BKE_collection_object_remove(struct Scene *scene, struct SceneCollection *s typedef void (*BKE_scene_objects_Cb)(struct Object *ob, void *data); void BKE_scene_objects_callback(struct Scene *scene, BKE_scene_objects_Cb callback, void *data); +/* iterators */ +void BKE_scene_objects_Iterator_begin(struct Iterator *iter, void *data); + +#define SCENE_OBJECTS_BEGIN(scene, _ob) \ + ITER_BEGIN(BKE_scene_objects_Iterator_begin, scene, _ob) + +#define SCENE_OBJECTS_END \ + ITER_END + #ifdef __cplusplus } #endif diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c index 4562583..8a7393b 100644 --- a/source/blender/blenkernel/intern/collection.c +++ b/source/blender/blenkernel/intern/collection.c @@ -25,6 +25,7 @@ */ #include "BLI_blenlib.h" +#include "BLI_iterator.h" #include "BLI_listbase.h" #include "BLT_translation.h" @@ -248,3 +249,52 @@ void BKE_scene_objects_callback(Scene *scene, BKE_scene_objects_Cb callback, voi collection_objects_callback(sc, object_tag_clear, NULL); collection_objects_callback(sc, callback, data); } + + +/* -- */ +/* Iteractors */ + +/* sequence strip iterator: + * - builds a full array, recursively into meta strips + */ + +static void scene_objects_count(Object *UNUSED(ob), void *data) +{ + int *tot = data; + (*tot)++; +} + +static void scene_objects_build_array(Object *ob, void *data) +{ + Object ***array = data; + **array = ob; + (*array)++; +} + +static void scene_objects_array(Scene *scene, Object ***objects_array, int *tot) +{ + Object **array; + + *objects_array = NULL; + *tot = 0; + + if (scene == NULL) + return; + + BKE_scene_objects_callback(scene, scene_objects_count, tot); + + if (*tot == 0) + return; + + *objects_array = array = MEM_mallocN(sizeof(Object *) * (*tot), "ObjectsArray"); + BKE_scene_objects_callback(scene, scene_objects_build_array, ); +} + +/* + * Only use this in non-performance critical situations + * (it iterates over all scene collections twice) + */ +void BKE_scene_objects_Iterator_begin(Iterator *iter, void *data) +{ + scene_objects_array(data, (Object ***)>array, >tot); +} diff --git a/source/blender/blenkernel/intern/library_query.c b/source/blender/blenkernel/intern/library_query.c index a161d9c..1601348 100644 --- a/source/blender/blenkernel/intern/library_query.c +++ b/source/blender/blenkernel/intern/library_query.c @@ -68,6 +68,7 @@ #include "BLI_linklist_stack.h" #include "BKE_animsys.h" +#include "BKE_collection.h" #include "BKE_constraint.h" #include "BKE_fcurve.h" #include "BKE_library.h" @@ -385,6 +386,15 @@ void BKE_library_foreach_ID_link(ID *id, LibraryIDLinkCallback callback, void *u CALLBACK_INVOKE(base->object, IDWALK_USER); } + { + Object* ob; + SCENE_OBJECTS_BEGIN(scene, ob) + { + CALLBACK_INVOKE(ob, IDWALK_USER); + } + SCENE_OBJECTS_END + } + for (TimeMarker *marker = scene->markers.first; marker; marker = marker->next) { CALLBACK_INVOKE(marker->camera, IDWALK_NOP); } diff --git a/source/blender/blenlib/BLI_iterator.h
[Bf-blender-cvs] [d4cebc9] render-layers: Use FOREACH_OBJECT_FLAG in more places
Commit: d4cebc998bb7679ed8c35e6ae220695f3421d311 Author: Dalai Felinto Date: Mon Dec 19 17:57:45 2016 +0100 Branches: render-layers https://developer.blender.org/rBd4cebc998bb7679ed8c35e6ae220695f3421d311 Use FOREACH_OBJECT_FLAG in more places === M source/blender/editors/object/object_relations.c === diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c index a03f121..bd4c07d 100644 --- a/source/blender/editors/object/object_relations.c +++ b/source/blender/editors/object/object_relations.c @@ -1978,27 +1978,25 @@ static void single_obdata_users(Main *bmain, Scene *scene, const int flag) } } -static void single_object_action_users(Scene *scene, const int flag) +static void single_object_action_users(Scene *scene, SceneLayer *sl, const int flag) { Object *ob; - Base *base; - for (base = FIRSTBASE; base; base = base->next) { - ob = base->object; - if (!ID_IS_LINKED_DATABLOCK(ob) && (flag == 0 || (base->flag & SELECT)) ) { + FOREACH_OBJECT_FLAG(scene, sl, flag, ob) + if (!ID_IS_LINKED_DATABLOCK(ob)) { DAG_id_tag_update(>id, OB_RECALC_DATA); BKE_animdata_copy_id_action(>id, false); } - } + FOREACH_OBJECT_FLAG_END } static void single_mat_users(Main *bmain, Scene *scene, SceneLayer *sl, const int flag, const bool do_textures) { - Object *ob; Material *ma, *man; Tex *tex; int a, b; + Object *ob; FOREACH_OBJECT_FLAG(scene, sl, flag, ob) if (!ID_IS_LINKED_DATABLOCK(ob)) { for (a = 1; a <= ob->totcol; a++) { @@ -2133,7 +2131,7 @@ void ED_object_single_users(Main *bmain, Scene *scene, const bool full, const bo if (full) { single_obdata_users(bmain, scene, 0); - single_object_action_users(scene, 0); + single_object_action_users(scene, NULL, 0); single_mat_users_expand(bmain); single_tex_users_expand(bmain); } @@ -2431,7 +2429,7 @@ static int make_single_user_exec(bContext *C, wmOperator *op) single_mat_users(scene, flag, true); #endif if (RNA_boolean_get(op->ptr, "animation")) { - single_object_action_users(scene, flag); + single_object_action_users(scene, sl, flag); } BKE_main_id_clear_newpoins(bmain); ___ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs
[Bf-blender-cvs] [f59b6ff] render-layers: Using an iterator to go over objects, and use this for library_query
Commit: f59b6ff4108f66e066ba85d15bc2c8c59913b643 Author: Dalai Felinto Date: Mon Dec 19 14:07:21 2016 +0100 Branches: render-layers https://developer.blender.org/rBf59b6ff4108f66e066ba85d15bc2c8c59913b643 Using an iterator to go over objects, and use this for library_query This is not the ideal iterator (it loops over the scene collection tree 3x). One solution (I want to discuss with Bastien Montagne @mont29) is whether to store the *parent of a SceneCollection to help with that. That would speed things up, and cost less memory. We do not even need to store it in the file, since it can be re-generated at read time === M source/blender/blenkernel/BKE_collection.h M source/blender/blenkernel/intern/collection.c M source/blender/blenkernel/intern/library_query.c M source/blender/blenlib/BLI_ghash.h M source/blender/editors/object/object_relations.c === diff --git a/source/blender/blenkernel/BKE_collection.h b/source/blender/blenkernel/BKE_collection.h index 61d53da..3185f82 100644 --- a/source/blender/blenkernel/BKE_collection.h +++ b/source/blender/blenkernel/BKE_collection.h @@ -27,7 +27,9 @@ * \ingroup bke */ +#include "BLI_ghash.h" #include "BLI_iterator.h" +#include "DNA_listBase.h" #ifdef __cplusplus extern "C" { @@ -46,17 +48,43 @@ void BKE_collection_object_add(struct Scene *scene, struct SceneCollection *sc, void BKE_collection_object_remove(struct Scene *scene, struct SceneCollection *sc, struct Object *object); typedef void (*BKE_scene_objects_Cb)(struct Object *ob, void *data); +typedef void (*BKE_scene_collections_Cb)(struct SceneCollection *ob, void *data); + +void BKE_scene_collections_callback(struct Scene *scene, BKE_scene_collections_Cb callback, void *data); void BKE_scene_objects_callback(struct Scene *scene, BKE_scene_objects_Cb callback, void *data); /* iterators */ void BKE_scene_objects_Iterator_begin(struct Iterator *iter, void *data); +void BKE_scene_collections_Iterator_begin(struct Iterator *iter, void *data); + +typedef struct SceneCollectionIterData { + struct SceneCollection *sc; + struct SceneCollectionIterData *parent; +} SceneCollectionIterData; -#define SCENE_OBJECTS_BEGIN(scene, _ob) \ - ITER_BEGIN(BKE_scene_objects_Iterator_begin, scene, _ob) +#define FOREACH_SCENE_COLLECTION(scene, _sc) \ + ITER_BEGIN(BKE_scene_collections_Iterator_begin, scene, _sc) -#define SCENE_OBJECTS_END \ +#define FOREACH_SCENE_COLLECTION_END \ ITER_END +#define FOREACH_SCENE_OBJECT(scene, _ob) \ +{ \ + GSet *visited = BLI_gset_ptr_new(__func__); \ + SceneCollection *sc; \ + FOREACH_SCENE_COLLECTION(scene, sc) \ + for (LinkData *link = sc->objects.first; link; link = link->next) { \ + _ob = link->data; \ + if (!BLI_gset_haskey(visited, ob)) { \ + BLI_gset_add(visited, ob); + +#define FOREACH_SCENE_OBJECT_END \ +} \ +} \ + FOREACH_SCENE_COLLECTION_END \ + BLI_gset_free(visited, NULL); \ +} + #ifdef __cplusplus } #endif diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c index 8a7393b..81d8d26 100644 --- a/source/blender/blenkernel/intern/collection.c +++ b/source/blender/blenkernel/intern/collection.c @@ -25,6 +25,7 @@ */ #include "BLI_blenlib.h" +#include "BLI_ghash.h" #include "BLI_iterator.h" #include "BLI_listbase.h" #include "BLT_translation.h" @@ -199,102 +200,56 @@ void BKE_collection_object_remove(struct Scene *UNUSED(scene), struct SceneColle * also remove all reference to ob in the filter_objects */ } -/* - * Tag util functions to make sure the same object is not called twice - */ - -static void object_tag(Object *ob) -{ - ob->flag |= BA_TEMP_TAG; -} - -static void object_tag_clear(Object *ob, void *UNUSED(data)) -{ - ob->flag &= ~BA_TEMP_TAG; -} - -static bool object_tag_test(Object *ob) -{ - return (ob->flag & BA_TEMP_TAG) != 0; -} +/* -- */ +/* Iteractors
[Bf-blender-cvs] [75b7a25] render-layers: From review: do_versions_after_linking skipped on undo
Commit: 75b7a25014ca1896515af32abcccbb26a59edf74 Author: Dalai Felinto Date: Fri Dec 16 15:53:23 2016 +0100 Branches: render-layers https://developer.blender.org/rB75b7a25014ca1896515af32abcccbb26a59edf74 >From review: do_versions_after_linking skipped on undo === M source/blender/blenloader/intern/readfile.c === diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index c63dcd3..bd0ef05 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -8248,7 +8248,12 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath) blo_join_main(); lib_link_all(fd, bfd->main); - do_versions_after_linking(fd, NULL, bfd->main); + + /* skip undo case */ + if (fd->memfile == NULL) { + do_versions_after_linking(fd, NULL, bfd->main); + } + lib_verify_nodetree(bfd->main, true); fix_relpaths_library(fd->relabase, bfd->main); /* make all relative paths, relative to the open blend file */ ___ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs
[Bf-blender-cvs] [0da8957] render-layers: From review: move nodetree syncing of layers to util function
Commit: 0da8957bc59bd06afc416e24ebe1d0597751fd32 Author: Dalai Felinto Date: Fri Dec 16 16:03:00 2016 +0100 Branches: render-layers https://developer.blender.org/rB0da8957bc59bd06afc416e24ebe1d0597751fd32 >From review: move nodetree syncing of layers to util function === M source/blender/blenkernel/BKE_node.h M source/blender/blenkernel/intern/layer.c M source/blender/blenkernel/intern/node.c M source/blender/blenkernel/intern/scene.c === diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 546f0d9..d23766b 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -687,6 +687,15 @@ bool BKE_node_tree_iter_step(struct NodeTreeIterStore *ntreeiter, } /** \} */ + +/* */ +/** \name Node Tree + */ + +void BKE_nodetree_remove_layer_n(struct bNodeTree *ntree, struct Scene *scene, const int layer_index); + +/** \} */ + /* */ /** \name Shader Nodes */ diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c index a1d1e96..5f4aadf 100644 --- a/source/blender/blenkernel/intern/layer.c +++ b/source/blender/blenkernel/intern/layer.c @@ -90,15 +90,7 @@ bool BKE_scene_layer_remove(Main *bmain, Scene *scene, SceneLayer *sl) for (Scene *sce = bmain->scene.first; sce; sce = sce->id.next) { if (sce->nodetree) { - bNode *node; - for (node = sce->nodetree->nodes.first; node; node = node->next) { - if (node->type == CMP_NODE_R_LAYERS && (Scene *)node->id == scene) { - if (node->custom1 == act) - node->custom1 = 0; - else if (node->custom1 > act) - node->custom1--; - } - } + BKE_nodetree_remove_layer_n(sce->nodetree, scene, act); } } diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c index f16e8f3..cb3bc39 100644 --- a/source/blender/blenkernel/intern/node.c +++ b/source/blender/blenkernel/intern/node.c @@ -3775,3 +3775,20 @@ bool BKE_node_tree_iter_step(struct NodeTreeIterStore *ntreeiter, return true; } + +/* */ +/* NodeTree kernel functions */ + +void BKE_nodetree_remove_layer_n(bNodeTree *ntree, Scene *scene, const int layer_index) +{ + for (bNode *node = ntree->nodes.first; node; node = node->next) { + if (node->type == CMP_NODE_R_LAYERS && (Scene *)node->id == scene) { + if (node->custom1 == layer_index) { + node->custom1 = 0; + } + else if (node->custom1 > layer_index) { + node->custom1--; + } + } + } +} diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index e634fea..d850798 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -2131,15 +2131,7 @@ bool BKE_scene_remove_render_layer(Main *bmain, Scene *scene, SceneRenderLayer * for (sce = bmain->scene.first; sce; sce = sce->id.next) { if (sce->nodetree) { - bNode *node; - for (node = sce->nodetree->nodes.first; node; node = node->next) { - if (node->type == CMP_NODE_R_LAYERS && (Scene *)node->id == scene) { - if (node->custom1 == act) - node->custom1 = 0; - else if (node->custom1 > act) - node->custom1--; - } - } + BKE_nodetree_remove_layer_n(sce->nodetree, scene, act); } } ___ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs
[Bf-blender-cvs] [3f9432b] render-layers: From review: use typedef for callbacks
Commit: 3f9432b76ac98ae2c86cce1fa3ad043a3d6b0b71 Author: Dalai Felinto Date: Fri Dec 16 15:50:08 2016 +0100 Branches: render-layers https://developer.blender.org/rB3f9432b76ac98ae2c86cce1fa3ad043a3d6b0b71 >From review: use typedef for callbacks === M source/blender/blenkernel/BKE_collection.h M source/blender/blenkernel/intern/collection.c === diff --git a/source/blender/blenkernel/BKE_collection.h b/source/blender/blenkernel/BKE_collection.h index 846f7f1..0d3f190 100644 --- a/source/blender/blenkernel/BKE_collection.h +++ b/source/blender/blenkernel/BKE_collection.h @@ -41,7 +41,9 @@ struct SceneCollection *BKE_collection_master(struct Scene *scene); void BKE_collection_master_free(struct Scene *scene); void BKE_collection_object_add(struct Scene *scene, struct SceneCollection *sc, struct Object *object); void BKE_collection_object_remove(struct Scene *scene, struct SceneCollection *sc, struct Object *object); -void BKE_scene_objects_callback(struct Scene *scene, void (*callback)(struct Object *_ob, void *_data), void *data); + +typedef void (*BKE_scene_objects_Cb)(struct Object *ob, void *data); +void BKE_scene_objects_callback(struct Scene *scene, BKE_scene_objects_Cb callback, void *data); #ifdef __cplusplus } diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c index 1f19330..4562583 100644 --- a/source/blender/blenkernel/intern/collection.c +++ b/source/blender/blenkernel/intern/collection.c @@ -220,7 +220,7 @@ static bool object_tag_test(Object *ob) /* * Recursively calls the callback function for the objects in a SceneCollection */ -static void collection_objects_callback(SceneCollection *sc, void (*callback)(struct Object *_ob, void *_data), void *data) +static void collection_objects_callback(SceneCollection *sc, BKE_scene_objects_Cb callback, void *data) { for (LinkData *link= sc->objects.first; link; link = link->next) { if (object_tag_test(link->data)) { @@ -242,7 +242,7 @@ static void collection_objects_callback(SceneCollection *sc, void (*callback)(st * Recursively calls the callback function for the objects in a Scene * The same object */ -void BKE_scene_objects_callback(Scene *scene, void (*callback)(struct Object *_ob, void *_data), void *data) +void BKE_scene_objects_callback(Scene *scene, BKE_scene_objects_Cb callback, void *data) { SceneCollection *sc = BKE_collection_master(scene); collection_objects_callback(sc, object_tag_clear, NULL); ___ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs
[Bf-blender-cvs] [59fbc6d] render-layers: Merge remote-tracking branch 'origin/blender2.8' into render-layers
Commit: 59fbc6db8d4e9f380500d528c31f8360c05b16f1 Author: Dalai Felinto Date: Fri Dec 16 14:46:17 2016 +0100 Branches: render-layers https://developer.blender.org/rB59fbc6db8d4e9f380500d528c31f8360c05b16f1 Merge remote-tracking branch 'origin/blender2.8' into render-layers === === ___ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs
[Bf-blender-cvs] [bd42987] master: Fix (unreported) linked datablocks going through do_versions several times.
Commit: bd42987399f1e2decf259cce21a91e39c7a0a50d Author: Bastien Montagne Date: Mon Dec 19 16:28:41 2016 +0100 Branches: master https://developer.blender.org/rBbd42987399f1e2decf259cce21a91e39c7a0a50d Fix (unreported) linked datablocks going through do_versions several times. When linking data-blocks from same library in several steps, the already linked data-blocks of same lib would go again through versionning code... Note: only fixed for libraries, I can't imagine how this could happen with local data... === M source/blender/blenloader/intern/readfile.c M source/blender/makesdna/DNA_ID.h === diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index 03c5d08..a154d28 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -8112,7 +8112,10 @@ static BHead *read_libblock(FileData *fd, Main *main, BHead *bhead, const short if (bhead->code == ID_ID) { return blo_nextbhead(fd, bhead); } - + + /* That way, we know which datablock needs do_versions (required currently for linking). */ + id->tag |= LIB_TAG_NEW; + /* need a name for the mallocN, just for debugging and sane prints on leaks */ allocname = dataname(GS(id->name)); @@ -8578,7 +8581,10 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath) blo_join_main(); lib_link_all(fd, bfd->main); + //do_versions_after_linking(fd, NULL, bfd->main); // XXX: not here (or even in this function at all)! this causes crashes on many files - Aligorith (July 04, 2010) + BKE_main_id_tag_all(bfd->main, LIB_TAG_NEW, false); + lib_verify_nodetree(bfd->main, true); fix_relpaths_library(fd->relabase, bfd->main); /* make all relative paths, relative to the open blend file */ @@ -10142,6 +10148,9 @@ static void library_link_end(Main *mainl, FileData **fd, const short flag, Scene mainl = NULL; /* blo_join_main free's mainl, cant use anymore */ lib_link_all(*fd, mainvar); + + BKE_main_id_tag_all(mainvar, LIB_TAG_NEW, false); + lib_verify_nodetree(mainvar, false); fix_relpaths_library(G.main->name, mainvar); /* make all relative paths, relative to the open blend file */ @@ -10212,6 +10221,32 @@ static int mainvar_id_tag_any_check(Main *mainvar, const short tag) return false; } +static void split_main_newid(Main *mainptr, Main *main_newid) +{ + /* We only copy the necessary subset of data in this temp main. */ + main_newid->versionfile = mainptr->versionfile; + main_newid->subversionfile = mainptr->subversionfile; + BLI_strncpy(main_newid->name, mainptr->name, sizeof(main_newid->name)); + main_newid->curlib = mainptr->curlib; + + ListBase *lbarray[MAX_LIBARRAY]; + ListBase *lbarray_newid[MAX_LIBARRAY]; + int i = set_listbasepointers(mainptr, lbarray); + set_listbasepointers(main_newid, lbarray_newid); + while (i--) { + BLI_listbase_clear(lbarray_newid[i]); + + for (ID *id = lbarray[i]->first, *idnext; id; id = idnext) { + idnext = id->next; + + if (id->tag & LIB_TAG_NEW) { + BLI_remlink(lbarray[i], id); + BLI_addtail(lbarray_newid[i], id); + } + } + } +} + static void read_libraries(FileData *basefd, ListBase *mainlist) { Main *mainl = mainlist->first; @@ -10381,14 +10416,19 @@ static void read_libraries(FileData *basefd, ListBase *mainlist) } /* do versions, link, and free */ + Main main_newid = {0}; for (mainptr = mainl->next; mainptr; mainptr = mainptr->next) { - /* some mains still have to be read, then -* versionfile is still zero! */ + /* some mains still have to be read, then versionfile is still zero! */ if (mainptr->versionfile) { + /* We need to split out IDs already existing, or they will go again through do_versions - bad, very bad! */ + split_main_newid(mainptr, _newid); + if (mainptr->curlib->filedata) // can be zero... with shift+f1 append - do_versions(mainptr->curlib->filedata, mainptr->curlib, mainptr); + do_versions(mainptr->curlib->filedata, mainptr->curlib, _newid); else - do_versions(basefd, NULL, mainptr); + do_versions(basefd, NULL, _newid); + + add_main_to_main(mainptr, _newid); }
[Bf-blender-cvs] [e30d94b] master: Cleanup: rename paramenter to right name
Commit: e30d94bb3bdb333a514f0771e63ff2543c0a1969 Author: Antonio Vazquez Date: Mon Dec 19 12:28:51 2016 +0100 Branches: master https://developer.blender.org/rBe30d94bb3bdb333a514f0771e63ff2543c0a1969 Cleanup: rename paramenter to right name === M source/blender/blenkernel/BKE_gpencil.h === diff --git a/source/blender/blenkernel/BKE_gpencil.h b/source/blender/blenkernel/BKE_gpencil.h index ab8b83f..3378f4a 100644 --- a/source/blender/blenkernel/BKE_gpencil.h +++ b/source/blender/blenkernel/BKE_gpencil.h @@ -104,7 +104,7 @@ void BKE_gpencil_layer_delete(struct bGPdata *gpd, struct bGPDlayer *gpl); struct bGPDbrush *BKE_gpencil_brush_getactive(struct ToolSettings *ts); void BKE_gpencil_brush_setactive(struct ToolSettings *ts, struct bGPDbrush *active); -void BKE_gpencil_brush_delete(struct ToolSettings *ts, struct bGPDbrush *palette); +void BKE_gpencil_brush_delete(struct ToolSettings *ts, struct bGPDbrush *brush); struct bGPDpalette *BKE_gpencil_palette_getactive(struct bGPdata *gpd); void BKE_gpencil_palette_setactive(struct bGPdata *gpd, struct bGPDpalette *active); ___ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs