diff options
author | Jason Wilkins <Jason.A.Wilkins@gmail.com> | 2014-07-04 20:58:37 +0400 |
---|---|---|
committer | Jason Wilkins <Jason.A.Wilkins@gmail.com> | 2014-07-04 20:58:37 +0400 |
commit | df3313187f4805d29d5a67ef6c623731e7ad9743 (patch) | |
tree | 43e4f69507381bd4a7614133d9352abbc9d1464b /source/blender | |
parent | 361ab2ff2e9f8fc15449f52790ea2a2025972cd5 (diff) | |
parent | c4eeda267315731c4cf446c3ed030d4f8c158b52 (diff) |
Merge branch 'master' of git.blender.org:blender into soc-2014-viewport_fx
Diffstat (limited to 'source/blender')
34 files changed, 430 insertions, 166 deletions
diff --git a/source/blender/blenfont/intern/blf_util.c b/source/blender/blenfont/intern/blf_util.c index cb9b652b8ef..06309a944e9 100644 --- a/source/blender/blenfont/intern/blf_util.c +++ b/source/blender/blenfont/intern/blf_util.c @@ -37,6 +37,7 @@ #include "blf_internal.h" +#include "BLI_utildefines.h" #include "BLI_string_utf8.h" unsigned int blf_next_p2(unsigned int x) diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h index 6b8e50494c7..f84a6378fb3 100644 --- a/source/blender/blenkernel/BKE_particle.h +++ b/source/blender/blenkernel/BKE_particle.h @@ -403,7 +403,7 @@ void psys_particle_on_dm(struct DerivedMesh *dm, int from, int index, int index_ float orco[3], float ornor[3]); /* particle_system.c */ -void initialize_particle(struct ParticleData *pa); +void initialize_particle(struct ParticleSimulationData *sim, struct ParticleData *pa); void psys_calc_dmcache(struct Object *ob, struct DerivedMesh *dm, struct ParticleSystem *psys); int psys_particle_dm_face_lookup(struct Object *ob, struct DerivedMesh *dm, int index, const float fw[4], struct LinkNode *node); diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index 8afd2c458cd..9be9db77d39 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -286,6 +286,7 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, const char *filepath CTX_wm_area_set(C, NULL); CTX_wm_region_set(C, NULL); CTX_wm_menu_set(C, NULL); + curscene = bfd->curscene; } /* this can happen when active scene was lib-linked, and doesn't exist anymore */ @@ -299,6 +300,9 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, const char *filepath curscene = CTX_data_scene(C); } + BLI_assert(curscene == CTX_data_scene(C)); + + /* special cases, override loaded flags: */ if (G.f != bfd->globalf) { const int flags_keep = (G_SWAP_EXCHANGE | G_SCRIPT_AUTOEXEC | G_SCRIPT_OVERRIDE_PREF); @@ -349,12 +353,12 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, const char *filepath for (win = wm->windows.first; win; win = win->next) { if (win->screen && win->screen->scene) /* zealous check... */ - if (win->screen->scene != CTX_data_scene(C)) + if (win->screen->scene != curscene) BKE_scene_set_background(G.main, win->screen->scene); } } } - BKE_scene_set_background(G.main, CTX_data_scene(C)); + BKE_scene_set_background(G.main, curscene); if (mode != LOAD_UNDO) { IMB_colormanagement_check_file_config(G.main); diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index 21579098266..24b580672d1 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -3106,7 +3106,17 @@ short DAG_get_eval_flags_for_object(Scene *scene, void *object) /* Happens when external render engine exports temporary objects * which are not in the DAG. */ + /* TODO(sergey): Doublecheck objects with Curve Deform exports all fine. */ + + /* TODO(sergey): Weak but currently we can't really access proper DAG from + * the modifiers stack. This is because in most cases modifier is to use + * the foreground scene, but to access evaluation flags we need to know + * active background scene, which we don't know. + */ + if (scene->set) { + return DAG_get_eval_flags_for_object(scene->set, object); + } return 0; } } diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c index c8173ae0513..1f3327b0dc4 100644 --- a/source/blender/blenkernel/intern/library.c +++ b/source/blender/blenkernel/intern/library.c @@ -829,6 +829,7 @@ void *BKE_libblock_copy_nolib(ID *id, const bool do_action) id->newid = idn; idn->flag |= LIB_NEW; + idn->us = 1; BKE_libblock_copy_data(idn, id, do_action); diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index f72fd1f645d..415606d1fdc 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -1083,9 +1083,6 @@ void BKE_object_lod_sort(Object *ob) bool BKE_object_lod_remove(Object *ob, int level) { LodLevel *rem; - - if (ob == NULL) - return false; if (level < 1 || level > BLI_countlist(&ob->lodlevels) - 1) return false; diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index 221bc2689bb..06ac9db0b16 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -1546,20 +1546,32 @@ static void initialize_particle_texture(ParticleSimulationData *sim, ParticleDat ParticleSettings *part = psys->part; ParticleTexture ptex; - if (part->type != PART_FLUID) { - psys_get_texture(sim, pa, &ptex, PAMAP_INIT, 0.f); - + psys_get_texture(sim, pa, &ptex, PAMAP_INIT, 0.f); + + switch (part->type) { + case PART_EMITTER: if (ptex.exist < psys_frand(psys, p+125)) pa->flag |= PARS_UNEXIST; - - pa->time = (part->type == PART_HAIR) ? 0.f : part->sta + (part->end - part->sta)*ptex.time; + pa->time = part->sta + (part->end - part->sta)*ptex.time; + break; + case PART_HAIR: + if (ptex.exist < psys_frand(psys, p+125)) + pa->flag |= PARS_UNEXIST; + pa->time = 0.f; + break; + case PART_FLUID: + break; } } /* set particle parameters that don't change during particle's life */ -void initialize_particle(ParticleData *pa) +void initialize_particle(ParticleSimulationData *sim, ParticleData *pa) { + ParticleSettings *part = sim->psys->part; + float birth_time = (float)(pa - sim->psys->particles) / (float)sim->psys->totpart; + pa->flag &= ~PARS_UNEXIST; + pa->time = part->sta + (part->end - part->sta) * birth_time; pa->hair_index = 0; /* we can't reset to -1 anymore since we've figured out correct index in distribute_particles */ @@ -1575,7 +1587,7 @@ static void initialize_all_particles(ParticleSimulationData *sim) LOOP_PARTICLES { if ((pa->flag & PARS_UNEXIST)==0) - initialize_particle(pa); + initialize_particle(sim, pa); if (pa->flag & PARS_UNEXIST) psys->totunexist++; diff --git a/source/blender/blenlib/BLI_string.h b/source/blender/blenlib/BLI_string.h index 235147d1bac..27bec227ece 100644 --- a/source/blender/blenlib/BLI_string.h +++ b/source/blender/blenlib/BLI_string.h @@ -79,6 +79,10 @@ int BLI_str_rstrip_float_zero(char *str, const char pad) ATTR_NONNULL(); int BLI_str_index_in_array_n(const char *__restrict str, const char **__restrict str_array, const int str_array_len) ATTR_NONNULL(); int BLI_str_index_in_array(const char *__restrict str, const char **__restrict str_array) ATTR_NONNULL(); +size_t BLI_str_partition(const char *str, const unsigned int delim[], char **sep, char **suf) ATTR_NONNULL(); +size_t BLI_str_rpartition(const char *str, const unsigned int delim[], char **sep, char **suf) ATTR_NONNULL(); +size_t BLI_str_partition_ex(const char *str, const unsigned int delim[], char **sep, char **suf, const bool from_right) ATTR_NONNULL(); + #ifdef __cplusplus } #endif diff --git a/source/blender/blenlib/BLI_string_utf8.h b/source/blender/blenlib/BLI_string_utf8.h index 4aef2318683..89754be25ba 100644 --- a/source/blender/blenlib/BLI_string_utf8.h +++ b/source/blender/blenlib/BLI_string_utf8.h @@ -66,6 +66,10 @@ int BLI_wcswidth(const wchar_t *pwcs, size_t n) ATTR_NONNULL(); int BLI_str_utf8_char_width(const char *p) ATTR_NONNULL(); /* warning, can return -1 on bad chars */ int BLI_str_utf8_char_width_safe(const char *p) ATTR_NONNULL(); +size_t BLI_str_partition_utf8(const char *str, const unsigned int delim[], char **sep, char **suf) ATTR_NONNULL(); +size_t BLI_str_rpartition_utf8(const char *str, const unsigned int delim[], char **sep, char **suf) ATTR_NONNULL(); +size_t BLI_str_partition_ex_utf8(const char *str, const unsigned int delim[], char **sep, char **suf, const bool from_right) ATTR_NONNULL(); + #define BLI_UTF8_MAX 6 /* mem */ #define BLI_UTF8_WIDTH_MAX 2 /* columns */ #define BLI_UTF8_ERR ((unsigned int)-1) diff --git a/source/blender/blenlib/intern/string.c b/source/blender/blenlib/intern/string.c index 4ab568ece42..87233d26439 100644 --- a/source/blender/blenlib/intern/string.c +++ b/source/blender/blenlib/intern/string.c @@ -681,3 +681,63 @@ int BLI_str_index_in_array(const char *str, const char **str_array) return -1; } +/** + * Find the first char matching one of the chars in \a delim, from left. + * + * \param str The string to search within. + * \param delim The set of delimiters to search for, as unicode values. + * \param sep Return value, set to the first delimiter found (or NULL if none found). + * \param suf Return value, set to next char after the first delimiter found (or NULL if none found). + * \return The length of the prefix (i.e. *sep - str). + */ +size_t BLI_str_partition(const char *str, const unsigned int delim[], char **sep, char **suf) +{ + return BLI_str_partition_ex(str, delim, sep, suf, false); +} + +/** + * Find the first char matching one of the chars in \a delim, from right. + * + * \param str The string to search within. + * \param delim The set of delimiters to search for, as unicode values. + * \param sep Return value, set to the first delimiter found (or NULL if none found). + * \param suf Return value, set to next char after the first delimiter found (or NULL if none found). + * \return The length of the prefix (i.e. *sep - str). + */ +size_t BLI_str_rpartition(const char *str, const unsigned int delim[], char **sep, char **suf) +{ + return BLI_str_partition_ex(str, delim, sep, suf, true); +} + +/** + * Find the first char matching one of the chars in \a delim, either from left or right. + * + * \param str The string to search within. + * \param delim The set of delimiters to search for, as unicode values. + * \param sep Return value, set to the first delimiter found (or NULL if none found). + * \param suf Return value, set to next char after the first delimiter found (or NULL if none found). + * \param from_right If %true, search from the right of \a str, else, search from its left. + * \return The length of the prefix (i.e. *sep - str). + */ +size_t BLI_str_partition_ex(const char *str, const unsigned int delim[], char **sep, char **suf, const bool from_right) +{ + const unsigned int *d; + char *(*func)(const char *str, int c) = from_right ? strrchr : strchr; + + *sep = *suf = NULL; + + for (d = delim; *d != '\0'; ++d) { + char *tmp = func(str, (int)*d); + + if (tmp && (from_right ? (*sep < tmp) : (!*sep || *sep > tmp))) { + *sep = tmp; + } + } + + if (*sep) { + *suf = *sep + 1; + return (size_t)(*sep - str); + } + + return strlen(str); +} diff --git a/source/blender/blenlib/intern/string_utf8.c b/source/blender/blenlib/intern/string_utf8.c index 74e979a8579..9697fcf09e9 100644 --- a/source/blender/blenlib/intern/string_utf8.c +++ b/source/blender/blenlib/intern/string_utf8.c @@ -703,3 +703,49 @@ char *BLI_str_prev_char_utf8(const char *p) } } /* end glib copy */ + +size_t BLI_str_partition_utf8(const char *str, const unsigned int delim[], char **sep, char **suf) +{ + return BLI_str_partition_ex_utf8(str, delim, sep, suf, false); +} + +size_t BLI_str_rpartition_utf8(const char *str, const unsigned int delim[], char **sep, char **suf) +{ + return BLI_str_partition_ex_utf8(str, delim, sep, suf, true); +} + +size_t BLI_str_partition_ex_utf8(const char *str, const unsigned int delim[], char **sep, char **suf, + const bool from_right) +{ + const unsigned int *d; + const size_t str_len = strlen(str); + size_t index; + + *suf = (char *)(str + str_len); + + for (*sep = (char *)(from_right ? BLI_str_find_prev_char_utf8(str, str + str_len) : str), index = 0; + *sep != NULL && **sep != '\0'; + *sep = (char *)(from_right ? (char *)BLI_str_find_prev_char_utf8(str, *sep) : str + index)) + { + const unsigned int c = BLI_str_utf8_as_unicode_and_size(*sep, &index); + + if (c == BLI_UTF8_ERR) { + *suf = *sep = NULL; + break; + } + + for (d = delim; *d != '\0'; ++d) { + if (*d == c) { + /* *suf is already correct in case from_right is true. */ + if (!from_right) + *suf = (char *)(str + index); + return (size_t)(*sep - str); + } + } + + *suf = *sep; /* Useful in 'from_right' case! */ + } + + *suf = *sep = NULL; + return str_len; +} diff --git a/source/blender/blenlib/intern/timecode.c b/source/blender/blenlib/intern/timecode.c index 244c2733ec2..0c8834008b6 100644 --- a/source/blender/blenlib/intern/timecode.c +++ b/source/blender/blenlib/intern/timecode.c @@ -33,6 +33,7 @@ #include <stdio.h> +#include "BLI_utildefines.h" #include "BLI_string.h" #include "BLI_math.h" diff --git a/source/blender/compositor/operations/COM_RenderLayersProg.cpp b/source/blender/compositor/operations/COM_RenderLayersProg.cpp index 7141dd7bf72..06f4f6d77cf 100644 --- a/source/blender/compositor/operations/COM_RenderLayersProg.cpp +++ b/source/blender/compositor/operations/COM_RenderLayersProg.cpp @@ -207,7 +207,12 @@ void RenderLayersAlphaProg::executePixelSampled(float output[4], float x, float zero_v4(output); } else { - doInterpolation(output, x, y, sampler); + float temp[4]; + doInterpolation(temp, x, y, sampler); + output[0] = temp[3]; + output[1] = 0.0f; + output[2] = 0.0f; + output[3] = 0.0f; } } diff --git a/source/blender/editors/armature/pose_select.c b/source/blender/editors/armature/pose_select.c index d783c1dcfde..b0a82683c48 100644 --- a/source/blender/editors/armature/pose_select.c +++ b/source/blender/editors/armature/pose_select.c @@ -45,6 +45,7 @@ #include "BKE_context.h" #include "BKE_depsgraph.h" #include "BKE_object.h" +#include "BKE_report.h" #include "RNA_access.h" #include "RNA_define.h" @@ -627,6 +628,13 @@ void POSE_OT_select_hierarchy(wmOperatorType *ot) /* -------------------------------------- */ +/* modes for select same */ +typedef enum ePose_SelectSame_Mode { + POSE_SEL_SAME_LAYER = 0, + POSE_SEL_SAME_GROUP = 1, + POSE_SEL_SAME_KEYINGSET = 2, +} ePose_SelectSame_Mode; + static bool pose_select_same_group(bContext *C, Object *ob, bool extend) { bArmature *arm = (ob) ? ob->data : NULL; @@ -725,7 +733,7 @@ static bool pose_select_same_layer(bContext *C, Object *ob, bool extend) return changed; } -static bool pose_select_same_keyingset(bContext *C, Object *ob, bool extend) +static bool pose_select_same_keyingset(bContext *C, ReportList *reports, Object *ob, bool extend) { KeyingSet *ks = ANIM_scene_get_active_keyingset(CTX_data_scene(C)); KS_Path *ksp; @@ -735,11 +743,26 @@ static bool pose_select_same_keyingset(bContext *C, Object *ob, bool extend) bool changed = false; /* sanity checks: validate Keying Set and object */ - if ((ks == NULL) || (ANIM_validate_keyingset(C, NULL, ks) != 0)) - return 0; + if (ks == NULL) { + BKE_report(reports, RPT_ERROR, "No active Keying Set to use"); + return false; + } + else if (ANIM_validate_keyingset(C, NULL, ks) != 0) { + if (ks->paths.first == NULL) { + if ((ks->flag & KEYINGSET_ABSOLUTE) == 0) { + BKE_report(reports, RPT_ERROR, + "Use another Keying Set, as the active one depends on the currently " + "selected items or cannot find any targets due to unsuitable context"); + } + else { + BKE_report(reports, RPT_ERROR, "Keying Set does not contain any paths"); + } + } + return false; + } if (ELEM3(NULL, ob, pose, arm)) - return 0; + return false; /* if not extending selection, deselect all selected first */ if (extend == false) { @@ -785,6 +808,7 @@ static int pose_select_grouped_exec(bContext *C, wmOperator *op) { Object *ob = BKE_object_pose_armature_get(CTX_data_active_object(C)); bArmature *arm = (bArmature *)ob->data; + const ePose_SelectSame_Mode type = RNA_enum_get(op->ptr, "type"); const bool extend = RNA_boolean_get(op->ptr, "extend"); bool changed = false; @@ -792,18 +816,22 @@ static int pose_select_grouped_exec(bContext *C, wmOperator *op) if (ob->pose == NULL) return OPERATOR_CANCELLED; - /* selection types - * NOTE: for the order of these, see the enum in POSE_OT_select_grouped() - */ - switch (RNA_enum_get(op->ptr, "type")) { - case 1: /* group */ + /* selection types */ + switch (type) { + case POSE_SEL_SAME_LAYER: /* layer */ + changed = pose_select_same_layer(C, ob, extend); + break; + + case POSE_SEL_SAME_GROUP: /* group */ changed = pose_select_same_group(C, ob, extend); break; - case 2: /* Keying Set */ - changed = pose_select_same_keyingset(C, ob, extend); + + case POSE_SEL_SAME_KEYINGSET: /* Keying Set */ + changed = pose_select_same_keyingset(C, op->reports, ob, extend); break; - default: /* layer */ - changed = pose_select_same_layer(C, ob, extend); + + default: + printf("pose_select_grouped() - Unknown selection type %d\n", type); break; } @@ -825,9 +853,9 @@ static int pose_select_grouped_exec(bContext *C, wmOperator *op) void POSE_OT_select_grouped(wmOperatorType *ot) { static EnumPropertyItem prop_select_grouped_types[] = { - {0, "LAYER", 0, "Layer", "Shared layers"}, - {1, "GROUP", 0, "Group", "Shared group"}, - {2, "KEYINGSET", 0, "Keying Set", "All bones affected by active Keying Set"}, + {POSE_SEL_SAME_LAYER, "LAYER", 0, "Layer", "Shared layers"}, + {POSE_SEL_SAME_GROUP, "GROUP", 0, "Group", "Shared group"}, + {POSE_SEL_SAME_KEYINGSET, "KEYINGSET", 0, "Keying Set", "All bones affected by active Keying Set"}, {0, NULL, 0, NULL, NULL} }; diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index 6f076abdd35..4d30e97b3b6 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -160,7 +160,7 @@ typedef struct uiTooltipData { UI_TIP_STYLE_NORMAL = 0, UI_TIP_STYLE_HEADER, UI_TIP_STYLE_MONO, - } style : 2; + } style : 3; enum { UI_TIP_LC_MAIN = 0, /* primary text */ UI_TIP_LC_VALUE, /* the value of buttons (also shortcuts) */ diff --git a/source/blender/editors/interface/resources.c b/source/blender/editors/interface/resources.c index 72f15697a5f..372ced0a6fd 100644 --- a/source/blender/editors/interface/resources.c +++ b/source/blender/editors/interface/resources.c @@ -2420,7 +2420,7 @@ void init_userdef_do_versions(void) } } - if (U.versionfile < 272 || (U.versionfile == 272 && U.subversionfile < 1)) { + if (U.versionfile < 271) { bTheme *btheme; for (btheme = U.themes.first; btheme; btheme = btheme->next) { rgba_char_args_set(btheme->tui.wcol_tooltip.text, 255, 255, 255, 255); diff --git a/source/blender/editors/object/object_lod.c b/source/blender/editors/object/object_lod.c index a7cc4131a96..8bcbba6be96 100644 --- a/source/blender/editors/object/object_lod.c +++ b/source/blender/editors/object/object_lod.c @@ -69,7 +69,7 @@ void OBJECT_OT_lod_add(wmOperatorType *ot) /* api callbacks */ ot->exec = object_lod_add_exec; - ot->poll = ED_operator_objectmode; + ot->poll = ED_operator_object_active; /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; @@ -101,7 +101,7 @@ void OBJECT_OT_lod_remove(wmOperatorType *ot) /* api callbacks */ ot->exec = object_lod_remove_exec; - ot->poll = ED_operator_objectmode; + ot->poll = ED_operator_object_active; /* flags */ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; diff --git a/source/blender/editors/object/object_select.c b/source/blender/editors/object/object_select.c index 2e1e8a94871..5590d028faa 100644 --- a/source/blender/editors/object/object_select.c +++ b/source/blender/editors/object/object_select.c @@ -797,7 +797,7 @@ static bool select_grouped_keyingset(bContext *C, Object *UNUSED(ob), ReportList BKE_report(reports, RPT_ERROR, "Keying Set does not contain any paths"); } } - return 0; + return false; } /* select each object that Keying Set refers to */ diff --git a/source/blender/editors/physics/particle_edit.c b/source/blender/editors/physics/particle_edit.c index 5432f059405..5401cef8351 100644 --- a/source/blender/editors/physics/particle_edit.c +++ b/source/blender/editors/physics/particle_edit.c @@ -3487,7 +3487,7 @@ static int brush_add(PEData *data, short number) } pa->size= 1.0f; - initialize_particle(pa); + initialize_particle(&sim, pa); reset_particle(&sim, pa, 0.0, 1.0); point->flag |= PEP_EDIT_RECALC; if (pe_x_mirror(ob)) diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h index 86c8e80a228..9598ff190c0 100644 --- a/source/blender/editors/space_node/node_intern.h +++ b/source/blender/editors/space_node/node_intern.h @@ -107,8 +107,6 @@ void node_socket_select(struct bNode *node, struct bNodeSocket *sock); void node_socket_deselect(struct bNode *node, struct bNodeSocket *sock, const bool deselect_node); void node_deselect_all_input_sockets(struct SpaceNode *snode, const bool deselect_nodes); void node_deselect_all_output_sockets(struct SpaceNode *snode, const bool deselect_nodes); -int node_select_same_type(struct SpaceNode *snode); -int node_select_same_type_np(struct SpaceNode *snode, int dir); void node_select_single(struct bContext *C, struct bNode *node); void NODE_OT_select(struct wmOperatorType *ot); @@ -118,7 +116,7 @@ void NODE_OT_select_linked_from(struct wmOperatorType *ot); void NODE_OT_select_border(struct wmOperatorType *ot); void NODE_OT_select_circle(struct wmOperatorType *ot); void NODE_OT_select_lasso(struct wmOperatorType *ot); -void NODE_OT_select_same_type(struct wmOperatorType *ot); +void NODE_OT_select_grouped(struct wmOperatorType *ot); void NODE_OT_select_same_type_step(struct wmOperatorType *ot); void NODE_OT_find_node(struct wmOperatorType *ot); diff --git a/source/blender/editors/space_node/node_ops.c b/source/blender/editors/space_node/node_ops.c index 807ed756c77..7dcbeae4627 100644 --- a/source/blender/editors/space_node/node_ops.c +++ b/source/blender/editors/space_node/node_ops.c @@ -58,7 +58,7 @@ void node_operatortypes(void) WM_operatortype_append(NODE_OT_select_border); WM_operatortype_append(NODE_OT_select_circle); WM_operatortype_append(NODE_OT_select_lasso); - WM_operatortype_append(NODE_OT_select_same_type); + WM_operatortype_append(NODE_OT_select_grouped); WM_operatortype_append(NODE_OT_select_same_type_step); WM_operatortype_append(NODE_OT_find_node); @@ -293,7 +293,10 @@ void node_keymap(struct wmKeyConfig *keyconf) WM_keymap_add_item(keymap, "NODE_OT_select_linked_to", LKEY, KM_PRESS, KM_SHIFT, 0); WM_keymap_add_item(keymap, "NODE_OT_select_linked_from", LKEY, KM_PRESS, 0, 0); - WM_keymap_add_item(keymap, "NODE_OT_select_same_type", GKEY, KM_PRESS, KM_SHIFT, 0); + kmi = WM_keymap_add_item(keymap, "NODE_OT_select_grouped", GKEY, KM_PRESS, KM_SHIFT, 0); + RNA_boolean_set(kmi->ptr, "extend", false); + kmi = WM_keymap_add_item(keymap, "NODE_OT_select_grouped", GKEY, KM_PRESS, KM_SHIFT | KM_CTRL, 0); + RNA_boolean_set(kmi->ptr, "extend", true); kmi = WM_keymap_add_item(keymap, "NODE_OT_select_same_type_step", RIGHTBRACKETKEY, KM_PRESS, KM_SHIFT, 0); RNA_boolean_set(kmi->ptr, "prev", false); diff --git a/source/blender/editors/space_node/node_select.c b/source/blender/editors/space_node/node_select.c index 434a9e11854..aeedd8c0c20 100644 --- a/source/blender/editors/space_node/node_select.c +++ b/source/blender/editors/space_node/node_select.c @@ -32,10 +32,12 @@ #include "DNA_node_types.h" +#include "BLI_utildefines.h" #include "BLI_rect.h" #include "BLI_lasso.h" +#include "BLI_math.h" #include "BLI_string.h" -#include "BLI_utildefines.h" +#include "BLI_string_utf8.h" #include "BKE_context.h" #include "BKE_main.h" @@ -205,79 +207,144 @@ void node_deselect_all_output_sockets(SpaceNode *snode, const bool deselect_node } } -/* return 1 if we need redraw otherwise zero. */ -int node_select_same_type(SpaceNode *snode) +/* Return true if we need redraw, otherwise false. */ + +static bool node_select_grouped_type(SpaceNode *snode, bNode *node_act) { - bNode *nac, *p; - int redraw; + bNode *node; + bool changed; - /* search for the active node. */ - for (nac = snode->edittree->nodes.first; nac; nac = nac->next) { - if (nac->flag & SELECT) - break; + for (node = snode->edittree->nodes.first; node; node = node->next) { + if ((node->flag & SELECT) == 0) { + if (node->type == node_act->type) { + nodeSetSelected(node, true); + changed = true; + } + } } - /* no active node, return. */ - if (!nac) - return(0); + return changed; +} - redraw = 0; - for (p = snode->edittree->nodes.first; p; p = p->next) { - if (p->type != nac->type && p->flag & SELECT) { - /* if it's selected but different type, unselect */ - redraw = 1; - nodeSetSelected(p, false); +static bool node_select_grouped_color(SpaceNode *snode, bNode *node_act) +{ + bNode *node; + bool changed = false; + + for (node = snode->edittree->nodes.first; node; node = node->next) { + if ((node->flag & SELECT) == 0) { + if (compare_v3v3(node->color, node_act->color, 0.005f)) { + nodeSetSelected(node, true); + changed = true; + } } - else if (p->type == nac->type && (!(p->flag & SELECT))) { - /* if it's the same type and is not selected, select! */ - redraw = 1; - nodeSetSelected(p, true); + } + + return changed; +} + +static bool node_select_grouped_name(SpaceNode *snode, bNode *node_act, const bool from_right) +{ + bNode *node; + bool changed = false; + const unsigned int delims[] = {'.', '-', '_', '\0'}; + size_t index_act, index_curr; + char *sep, *suf_act, *suf_curr; + + index_act = BLI_str_partition_ex_utf8(node_act->name, delims, &sep, &suf_act, from_right); + + if (index_act > 0) { + for (node = snode->edittree->nodes.first; node; node = node->next) { + if ((node->flag & SELECT) == 0) { + index_curr = BLI_str_partition_ex_utf8(node->name, delims, &sep, &suf_curr, from_right); + if ((from_right && STREQ(suf_act, suf_curr)) || + (!from_right && (index_act == index_curr) && STREQLEN(node_act->name, node->name, index_act))) + { + nodeSetSelected(node, true); + changed = true; + } + } } } - return(redraw); + + return changed; } -/* return 1 if we need redraw, otherwise zero. - * dir can be 0 == next or 0 != prev. - */ -int node_select_same_type_np(SpaceNode *snode, int dir) +enum { + NODE_SELECT_GROUPED_TYPE = 0, + NODE_SELECT_GROUPED_COLOR = 1, + NODE_SELECT_GROUPED_PREFIX = 2, + NODE_SELECT_GROUPED_SUFIX = 3, +}; + +static int node_select_grouped_exec(bContext *C, wmOperator *op) { - bNode *nac, *p, *tnode; + SpaceNode *snode = CTX_wm_space_node(C); + bNode *node_act = nodeGetActive(snode->edittree); + bNode *node; + bool changed = false; + const bool extend = RNA_boolean_get(op->ptr, "extend"); + const int type = RNA_enum_get(op->ptr, "type"); + + if (!extend) { + for (node = snode->edittree->nodes.first; node; node = node->next) { + nodeSetSelected(node, false); + } + } + nodeSetSelected(node_act, true); - /* search the active one. */ - for (nac = snode->edittree->nodes.first; nac; nac = nac->next) { - if (nac->flag & SELECT) + switch (type) { + case NODE_SELECT_GROUPED_TYPE: + changed = node_select_grouped_type(snode, node_act); break; + case NODE_SELECT_GROUPED_COLOR: + changed = node_select_grouped_color(snode, node_act); + break; + case NODE_SELECT_GROUPED_PREFIX: + changed = node_select_grouped_name(snode, node_act, false); + break; + case NODE_SELECT_GROUPED_SUFIX: + changed = node_select_grouped_name(snode, node_act, true); + break; + default: + break; + } + + if (changed) { + ED_node_sort(snode->edittree); + WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL); + return OPERATOR_FINISHED; } - /* no active node, return. */ - if (!nac) - return(0); + return OPERATOR_CANCELLED; +} - if (dir == 0) - p = nac->next; - else - p = nac->prev; +void NODE_OT_select_grouped(wmOperatorType *ot) +{ + static EnumPropertyItem prop_select_grouped_types[] = { + {NODE_SELECT_GROUPED_TYPE, "TYPE", 0, "Type", ""}, + {NODE_SELECT_GROUPED_COLOR, "COLOR", 0, "Color", ""}, + {NODE_SELECT_GROUPED_PREFIX, "PREFIX", 0, "Prefix", ""}, + {NODE_SELECT_GROUPED_SUFIX, "SUFFIX", 0, "Suffix", ""}, + {0, NULL, 0, NULL, NULL} + }; - while (p) { - /* Now search the next with the same type. */ - if (p->type == nac->type) - break; + /* identifiers */ + ot->name = "Select Grouped"; + ot->description = "Select nodes with similar properties"; + ot->idname = "NODE_OT_select_grouped"; - if (dir == 0) - p = p->next; - else - p = p->prev; - } + /* api callbacks */ + ot->invoke = WM_menu_invoke; + ot->exec = node_select_grouped_exec; + ot->poll = ED_operator_node_active; - if (p) { - for (tnode = snode->edittree->nodes.first; tnode; tnode = tnode->next) - if (tnode != p) - nodeSetSelected(tnode, false); - nodeSetSelected(p, true); - return(1); - } - return(0); + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; + + /* properties */ + RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend selection instead of deselecting everything first"); + ot->prop = RNA_def_enum(ot->srna, "type", prop_select_grouped_types, 0, "Type", ""); } void node_select_single(bContext *C, bNode *node) @@ -787,40 +854,6 @@ void NODE_OT_select_linked_from(wmOperatorType *ot) ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; } -/* ****** Select Same Type ****** */ - -static int node_select_same_type_exec(bContext *C, wmOperator *UNUSED(op)) -{ - SpaceNode *snode = CTX_wm_space_node(C); - - node_select_same_type(snode); - - ED_node_sort(snode->edittree); - - WM_event_add_notifier(C, NC_NODE | NA_SELECTED, NULL); - return OPERATOR_FINISHED; -} - -void NODE_OT_select_same_type(wmOperatorType *ot) -{ - /* identifiers */ - ot->name = "Select Same Type"; - ot->description = "Select all the nodes of the same type"; - ot->idname = "NODE_OT_select_same_type"; - - /* api callbacks */ - ot->exec = node_select_same_type_exec; - ot->poll = ED_operator_node_active; - - /* flags */ - ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO; -} - -/* ****** Select The Next/Prev Node Of The Same Type ****** */ - -/* ************************** */ - - static int node_select_same_type_step_exec(bContext *C, wmOperator *op) { SpaceNode *snode = CTX_wm_space_node(C); diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c index 762288acfab..e3260dba485 100644 --- a/source/blender/editors/space_view3d/view3d_edit.c +++ b/source/blender/editors/space_view3d/view3d_edit.c @@ -4435,20 +4435,46 @@ void ED_view3d_cursor3d_position(bContext *C, float fp[3], const int mval[2]) } } -static int view3d_cursor3d_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent *event) +static void view3d_cursor3d_update(bContext *C, const int *mval) { Scene *scene = CTX_data_scene(C); View3D *v3d = CTX_wm_view3d(C); float *fp = ED_view3d_cursor3d_get(scene, v3d); - ED_view3d_cursor3d_position(C, fp, event->mval); - + ED_view3d_cursor3d_position(C, fp, mval); + if (v3d && v3d->localvd) WM_event_add_notifier(C, NC_SPACE | ND_SPACE_VIEW3D, v3d); else WM_event_add_notifier(C, NC_SCENE | NA_EDITED, scene); - - return OPERATOR_FINISHED; +} + +static int view3d_cursor3d_invoke(bContext *C, wmOperator *op, const wmEvent *event) +{ + view3d_cursor3d_update(C, event->mval); + op->customdata = SET_INT_IN_POINTER(event->type); + WM_event_add_modal_handler(C, op); + + return OPERATOR_RUNNING_MODAL; +} + +static int view3d_cursor3d_modal(bContext *C, wmOperator *op, const wmEvent *event) +{ + int event_type = GET_INT_FROM_POINTER(op->customdata); + + if (event->type == event_type) { + return OPERATOR_FINISHED; + } + + switch (event->type) { + case MOUSEMOVE: + view3d_cursor3d_update(C, event->mval); + break; + case LEFTMOUSE: + return OPERATOR_FINISHED; + } + + return OPERATOR_RUNNING_MODAL; } void VIEW3D_OT_cursor3d(wmOperatorType *ot) @@ -4461,6 +4487,7 @@ void VIEW3D_OT_cursor3d(wmOperatorType *ot) /* api callbacks */ ot->invoke = view3d_cursor3d_invoke; + ot->modal = view3d_cursor3d_modal; ot->poll = ED_operator_view3d_active; diff --git a/source/blender/editors/space_view3d/view3d_project.c b/source/blender/editors/space_view3d/view3d_project.c index 9b14df402ec..c1e42c97c4d 100644 --- a/source/blender/editors/space_view3d/view3d_project.c +++ b/source/blender/editors/space_view3d/view3d_project.c @@ -315,23 +315,27 @@ static void view3d_win_to_ray_segment(const ARegion *ar, View3D *v3d, const floa if (rv3d->is_persp) { copy_v3_v3(r_ray_co, rv3d->viewinv[3]); + } + else { + r_ray_co[0] = 2.0f * mval[0] / ar->winx - 1.0f; + r_ray_co[1] = 2.0f * mval[1] / ar->winy - 1.0f; + + if (rv3d->persp == RV3D_CAMOB) { + r_ray_co[2] = -1.0f; + } + else { + r_ray_co[2] = 0.0f; + } + + mul_project_m4_v3(rv3d->persinv, r_ray_co); + } - start_offset = v3d->near; - end_offset = v3d->far; + if ((rv3d->is_persp == false) && (rv3d->persp != RV3D_CAMOB)) { + end_offset = v3d->far / 2.0f; + start_offset = -end_offset; } else { - const float ortho_extent = 1000.0f; - float vec[4]; - vec[0] = 2.0f * mval[0] / ar->winx - 1; - vec[1] = 2.0f * mval[1] / ar->winy - 1; - vec[2] = 0.0f; - vec[3] = 1.0f; - - mul_m4_v4(rv3d->persinv, vec); - copy_v3_v3(r_ray_co, vec); - - start_offset = (rv3d->persp == RV3D_CAMOB) ? 0.0f : -ortho_extent; - end_offset = ortho_extent; + ED_view3d_clip_range_get(v3d, rv3d, &start_offset, &end_offset, false); } if (r_ray_start) { diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp index f135f2ebee6..d47f4e5d910 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp +++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp @@ -58,7 +58,7 @@ namespace Freestyle { BlenderStrokeRenderer::BlenderStrokeRenderer(Render *re, int render_count) : StrokeRenderer() { - freestyle_bmain = &re->freestyle_bmain; + freestyle_bmain = re->freestyle_bmain; // for stroke mesh generation _width = re->winx; @@ -104,7 +104,7 @@ BlenderStrokeRenderer::BlenderStrokeRenderer(Render *re, int render_count) : Str BKE_scene_disable_color_management(freestyle_scene); if (G.debug & G_DEBUG_FREESTYLE) { - printf("%s: %d threads\n", __func__, freestyle_scene->r.threads); + printf("%s: %d thread(s)\n", __func__, BKE_render_num_threads(&freestyle_scene->r)); } // Render layer diff --git a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp index 9474ce7994d..9c2b5a4037f 100644 --- a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp +++ b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp @@ -577,7 +577,7 @@ void FRS_init_stroke_rendering(Render *re) Render *FRS_do_stroke_rendering(Render *re, SceneRenderLayer *srl, int render) { - Main bmain = {0}; + Main *freestyle_bmain = re->freestyle_bmain; Render *freestyle_render = NULL; Text *text, *next_text; @@ -599,7 +599,7 @@ Render *FRS_do_stroke_rendering(Render *re, SceneRenderLayer *srl, int render) // - add style modules // - set parameters // - compute view map - prepare(&bmain, re, srl); + prepare(freestyle_bmain, re, srl); if (re->test_break(re->tbh)) { controller->CloseFile(); @@ -628,11 +628,11 @@ Render *FRS_do_stroke_rendering(Render *re, SceneRenderLayer *srl, int render) } // Free temp main (currently only text blocks are stored there) - for (text = (Text *) bmain.text.first; text; text = next_text) { + for (text = (Text *)freestyle_bmain->text.first; text; text = next_text) { next_text = (Text *) text->id.next; - BKE_text_unlink(&bmain, text); - BKE_libblock_free(&bmain, text); + BKE_text_unlink(freestyle_bmain, text); + BKE_libblock_free(freestyle_bmain, text); } return freestyle_render; diff --git a/source/blender/imbuf/intern/metadata.c b/source/blender/imbuf/intern/metadata.c index 2b4367528dd..797d34d118b 100644 --- a/source/blender/imbuf/intern/metadata.c +++ b/source/blender/imbuf/intern/metadata.c @@ -33,6 +33,7 @@ #include <stdlib.h> #include <string.h> +#include "BLI_utildefines.h" #include "BLI_string.h" #include "MEM_guardedalloc.h" diff --git a/source/blender/makesrna/intern/rna_material.c b/source/blender/makesrna/intern/rna_material.c index 36582597113..734d98f1029 100644 --- a/source/blender/makesrna/intern/rna_material.c +++ b/source/blender/makesrna/intern/rna_material.c @@ -1517,7 +1517,7 @@ static void rna_def_material_sss(BlenderRNA *brna) prop = RNA_def_property(srna, "use", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, NULL, "sss_flag", MA_DIFF_SSS); - RNA_def_property_ui_text(prop, "Enabled", "Enable diffuse subsurface scatting effects in a material"); + RNA_def_property_ui_text(prop, "Enabled", "Enable diffuse subsurface scattering effects in a material"); RNA_def_property_update(prop, 0, "rna_Material_update"); } diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c index 3d0c455b4b5..284377d34f9 100644 --- a/source/blender/makesrna/intern/rna_render.c +++ b/source/blender/makesrna/intern/rna_render.c @@ -544,6 +544,10 @@ static void rna_def_render_engine(BlenderRNA *brna) RNA_def_property_pointer_sdna(prop, NULL, "camera_override"); RNA_def_property_struct_type(prop, "Object"); + prop = RNA_def_property(srna, "layer_override", PROP_BOOLEAN, PROP_LAYER_MEMBER); + RNA_def_property_boolean_sdna(prop, NULL, "layer_override", 1); + RNA_def_property_array(prop, 20); + prop = RNA_def_property(srna, "tile_x", PROP_INT, PROP_UNSIGNED); RNA_def_property_int_sdna(prop, NULL, "tile_x"); prop = RNA_def_property(srna, "tile_y", PROP_INT, PROP_UNSIGNED); diff --git a/source/blender/python/intern/bpy_app.c b/source/blender/python/intern/bpy_app.c index 125a2e0c57d..16cdd44ce38 100644 --- a/source/blender/python/intern/bpy_app.c +++ b/source/blender/python/intern/bpy_app.c @@ -283,6 +283,7 @@ static PyGetSetDef bpy_app_getsets[] = { {(char *)"debug_events", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_EVENTS}, {(char *)"debug_handlers", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_HANDLERS}, {(char *)"debug_wm", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_WM}, + {(char *)"debug_depsgraph", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_DEPSGRAPH}, {(char *)"debug_value", bpy_app_debug_value_get, bpy_app_debug_value_set, (char *)bpy_app_debug_value_doc, NULL}, {(char *)"tempdir", bpy_app_tempdir_get, NULL, (char *)bpy_app_tempdir_doc, NULL}, diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h index c76cf3406a1..24f8cbee401 100644 --- a/source/blender/render/extern/include/RE_engine.h +++ b/source/blender/render/extern/include/RE_engine.h @@ -104,6 +104,7 @@ typedef struct RenderEngine { int flag; struct Object *camera_override; + unsigned int layer_override; int tile_x; int tile_y; diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h index eeb0544cf73..536a2b8a85f 100644 --- a/source/blender/render/intern/include/render_types.h +++ b/source/blender/render/intern/include/render_types.h @@ -192,7 +192,7 @@ struct Render RenderData r; World wrld; struct Object *camera_override; - unsigned int lay; + unsigned int lay, layer_override; ListBase parts; @@ -240,7 +240,7 @@ struct Render ListBase volumes; #ifdef WITH_FREESTYLE - struct Main freestyle_bmain; + struct Main *freestyle_bmain; ListBase freestyle_renders; #endif diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c index 95ff68dadb3..58e3038682c 100644 --- a/source/blender/render/intern/source/external_engine.c +++ b/source/blender/render/intern/source/external_engine.c @@ -624,6 +624,7 @@ int RE_engine_render(Render *re, int do_all) if (re->r.scemode & R_BUTS_PREVIEW) engine->flag |= RE_ENGINE_PREVIEW; engine->camera_override = re->camera_override; + engine->layer_override = re->layer_override; engine->resolution_x = re->winx; engine->resolution_y = re->winy; diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 9f27021d23e..a7a85847648 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -61,6 +61,7 @@ #include "BKE_depsgraph.h" #include "BKE_global.h" #include "BKE_image.h" +#include "BKE_library.h" #include "BKE_main.h" #include "BKE_modifier.h" #include "BKE_node.h" @@ -1822,11 +1823,13 @@ static void tag_scenes_for_render(Render *re) } #ifdef WITH_FREESTYLE - for (sce = re->freestyle_bmain.scene.first; sce; sce = sce->id.next) { - sce->id.flag &= ~LIB_DOIT; + if (re->freestyle_bmain) { + for (sce = re->freestyle_bmain->scene.first; sce; sce = sce->id.next) { + sce->id.flag &= ~LIB_DOIT; #ifdef DEPSGRAPH_WORKAROUND_HACK - tag_dependend_objects_for_render(sce, renderlay); + tag_dependend_objects_for_render(sce, renderlay); #endif + } } #endif @@ -1928,6 +1931,8 @@ static void add_freestyle(Render *re, int render) actsrl = BLI_findlink(&re->r.layers, re->r.actlay); + re->freestyle_bmain = BKE_main_new(); + /* We use the same window manager for freestyle bmain as * real bmain uses. This is needed because freestyle's * bmain could be used to tag scenes for update, which @@ -1935,7 +1940,7 @@ static void add_freestyle(Render *re, int render) * and that function requires proper window manager * to present (sergey) */ - re->freestyle_bmain.wm = re->main->wm; + re->freestyle_bmain->wm = re->main->wm; FRS_init_stroke_rendering(re); @@ -2000,10 +2005,20 @@ static void free_all_freestyle_renders(void) if (freestyle_render) { freestyle_scene = freestyle_render->scene; RE_FreeRender(freestyle_render); - BKE_scene_unlink(&re1->freestyle_bmain, freestyle_scene, NULL); + BKE_scene_unlink(re1->freestyle_bmain, freestyle_scene, NULL); } } BLI_freelistN(&re1->freestyle_renders); + + if (re1->freestyle_bmain) { + /* detach the window manager from freestyle bmain (see comments + * in add_freestyle() for more detail) + */ + re1->freestyle_bmain->wm.first = re1->freestyle_bmain->wm.last = NULL; + + BKE_main_free(re1->freestyle_bmain); + re1->freestyle_bmain = NULL; + } } } #endif @@ -2154,8 +2169,10 @@ void RE_MergeFullSample(Render *re, Main *bmain, Scene *sce, bNodeTree *ntree) scene->id.flag |= LIB_DOIT; #ifdef WITH_FREESTYLE - for (scene = re->freestyle_bmain.scene.first; scene; scene = scene->id.next) - scene->id.flag &= ~LIB_DOIT; + if (re->freestyle_bmain) { + for (scene = re->freestyle_bmain->scene.first; scene; scene = scene->id.next) + scene->id.flag &= ~LIB_DOIT; + } #endif for (node = ntree->nodes.first; node; node = node->next) { @@ -2683,6 +2700,7 @@ static int render_initialize_from_main(Render *re, RenderData *rd, Main *bmain, re->scene_color_manage = BKE_scene_check_color_management_enabled(scene); re->camera_override = camera_override; re->lay = lay_override ? lay_override : scene->lay; + re->layer_override = lay_override; re->i.localview = (re->lay & 0xFF000000) != 0; /* not too nice, but it survives anim-border render */ |