diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-01-26 21:49:09 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-01-26 21:49:09 +0300 |
commit | 4c416aea3bd2d4b5e05c33b90f7b79e04f4da318 (patch) | |
tree | 74f6e19ea5e2a5c118e8afc037b5fcdcccbd3481 | |
parent | fcd5880d12f659644e6b21371f5d94e3ffdbc70e (diff) | |
parent | 8f673cb40c6d038ecaabd24c6549dc5c7571c26a (diff) |
Merge branch 'render-layers' of git.blender.org:blender into clay-engine
# Conflicts:
# source/blender/makesdna/DNA_scene_types.h
-rw-r--r-- | release/scripts/startup/bl_ui/properties_render_layer.py | 101 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_context.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/context.c | 39 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/layer.c | 10 | ||||
-rw-r--r-- | source/blender/blenloader/intern/versioning_280.c | 13 | ||||
-rw-r--r-- | source/blender/editors/render/render_shading.c | 12 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_layer_types.h | 8 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_scene_types.h | 2 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_scene.c | 61 | ||||
-rw-r--r-- | source/blenderplayer/bad_level_call_stubs/stubs.c | 4 | ||||
-rw-r--r-- | tests/python/bl_render_layer.py | 7 |
11 files changed, 118 insertions, 141 deletions
diff --git a/release/scripts/startup/bl_ui/properties_render_layer.py b/release/scripts/startup/bl_ui/properties_render_layer.py index 9b8bc237db9..45c93dd9335 100644 --- a/release/scripts/startup/bl_ui/properties_render_layer.py +++ b/release/scripts/startup/bl_ui/properties_render_layer.py @@ -35,7 +35,7 @@ class RenderLayerButtonsPanel: class RENDERLAYER_UL_renderlayers(UIList): def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): - # assert(isinstance(item, bpy.types.SceneRenderLayer) + # assert(isinstance(item, bpy.types.SceneLayer) layer = item if self.layout_type in {'DEFAULT', 'COMPACT'}: layout.prop(layer, "name", text="", icon_value=icon, emboss=False) @@ -62,7 +62,7 @@ class RENDERLAYER_PT_layers(RenderLayerButtonsPanel, Panel): row = layout.row() col = row.column() - col.template_list("RENDERLAYER_UL_renderlayers", "", rd, "layers", rd.layers, "active_index", rows=2) + col.template_list("RENDERLAYER_UL_renderlayers", "", scene, "render_layers", scene.render_layers, "active_index", rows=2) col = row.column() sub = col.column(align=True) @@ -71,103 +71,6 @@ class RENDERLAYER_PT_layers(RenderLayerButtonsPanel, Panel): col.prop(rd, "use_single_layer", icon_only=True) -class RENDERLAYER_PT_layer_options(RenderLayerButtonsPanel, Panel): - bl_label = "Layer" - COMPAT_ENGINES = {'BLENDER_RENDER'} - - def draw(self, context): - layout = self.layout - - scene = context.scene - rd = scene.render - rl = rd.layers.active - - split = layout.split() - - col = split.column() - col.prop(scene, "layers", text="Scene") - col.label(text="") - col.prop(rl, "light_override", text="Lights") - col.prop(rl, "material_override", text="Material") - - col = split.column() - col.prop(rl, "layers", text="Layer") - col.prop(rl, "layers_zmask", text="Mask Layer") - - layout.separator() - layout.label(text="Include:") - - split = layout.split() - - col = split.column() - col.prop(rl, "use_zmask") - row = col.row() - row.prop(rl, "invert_zmask", text="Negate") - row.active = rl.use_zmask - col.prop(rl, "use_all_z") - - col = split.column() - col.prop(rl, "use_solid") - col.prop(rl, "use_halo") - col.prop(rl, "use_ztransp") - - col = split.column() - col.prop(rl, "use_sky") - col.prop(rl, "use_edge_enhance") - col.prop(rl, "use_strand") - if bpy.app.build_options.freestyle: - row = col.row() - row.prop(rl, "use_freestyle") - row.active = rd.use_freestyle - - -class RENDERLAYER_PT_layer_passes(RenderLayerButtonsPanel, Panel): - bl_label = "Passes" - bl_options = {'DEFAULT_CLOSED'} - COMPAT_ENGINES = {'BLENDER_RENDER'} - - @staticmethod - def draw_pass_type_buttons(box, rl, pass_type): - # property names - use_pass_type = "use_pass_" + pass_type - exclude_pass_type = "exclude_" + pass_type - # draw pass type buttons - row = box.row() - row.prop(rl, use_pass_type) - row.prop(rl, exclude_pass_type, text="") - - def draw(self, context): - layout = self.layout - - scene = context.scene - rd = scene.render - rl = rd.layers.active - - split = layout.split() - - col = split.column() - col.prop(rl, "use_pass_combined") - col.prop(rl, "use_pass_z") - col.prop(rl, "use_pass_vector") - col.prop(rl, "use_pass_normal") - col.prop(rl, "use_pass_uv") - col.prop(rl, "use_pass_mist") - col.prop(rl, "use_pass_object_index") - col.prop(rl, "use_pass_material_index") - col.prop(rl, "use_pass_color") - - col = split.column() - col.prop(rl, "use_pass_diffuse") - self.draw_pass_type_buttons(col, rl, "specular") - self.draw_pass_type_buttons(col, rl, "shadow") - self.draw_pass_type_buttons(col, rl, "emit") - self.draw_pass_type_buttons(col, rl, "ambient_occlusion") - self.draw_pass_type_buttons(col, rl, "environment") - self.draw_pass_type_buttons(col, rl, "indirect") - self.draw_pass_type_buttons(col, rl, "reflection") - self.draw_pass_type_buttons(col, rl, "refraction") - - class RENDERLAYER_UL_renderviews(UIList): def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index): # assert(isinstance(item, bpy.types.SceneRenderView) diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h index 70f9fa3dfc4..649d142d1cd 100644 --- a/source/blender/blenkernel/BKE_context.h +++ b/source/blender/blenkernel/BKE_context.h @@ -251,8 +251,6 @@ int CTX_data_mode_enum(const bContext *C); void CTX_data_main_set(bContext *C, struct Main *bmain); void CTX_data_scene_set(bContext *C, struct Scene *bmain); -void CTX_data_scene_collection_set(bContext *C, struct SceneCollection *sc); -void CTX_data_scene_layer_set(bContext *C, struct SceneLayer *sl); int CTX_data_selected_editable_objects(const bContext *C, ListBase *list); int CTX_data_selected_editable_bases(const bContext *C, ListBase *list); diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c index 592adfc578a..8025732efe5 100644 --- a/source/blender/blenkernel/intern/context.c +++ b/source/blender/blenkernel/intern/context.c @@ -79,8 +79,6 @@ struct bContext { struct { struct Main *main; struct Scene *scene; - struct SceneLayer *render_layer; - struct SceneCollection *scene_collection; int recursion; int py_init; /* true if python is initialized */ @@ -908,7 +906,10 @@ SceneLayer *CTX_data_scene_layer(const bContext *C) return sl; } else { - return C->data.render_layer; + Scene *scene = CTX_data_scene(C); + sl = BLI_findlink(&scene->render_layers, scene->active_layer); + BLI_assert(sl); + return sl; } } @@ -928,15 +929,11 @@ SceneCollection *CTX_data_scene_collection(const bContext *C) if (BKE_scene_layer_has_collection(sl, sc)) { return sc; } - else { - /* fallback */ - LayerCollection *lc = BKE_layer_collection_active(sl); - return lc->scene_collection; - } - } - else { - return C->data.scene_collection; } + + /* fallback */ + LayerCollection *lc = BKE_layer_collection_active(sl); + return lc->scene_collection; } int CTX_data_mode_enum(const bContext *C) @@ -1005,26 +1002,6 @@ const char *CTX_data_mode_string(const bContext *C) void CTX_data_scene_set(bContext *C, Scene *scene) { C->data.scene = scene; - TODO_LAYER_CONTEXT - - /* render_layer comes from workspace (or even viewport) actually - * this is only while we wait for workspace changes to be merged - */ - CTX_data_scene_layer_set(C, scene->render_layers.last); -} - -void CTX_data_scene_collection_set(bContext *C, SceneCollection *sc) -{ - C->data.scene_collection = sc; -} - -void CTX_data_scene_layer_set(bContext *C, SceneLayer *sl) -{ - C->data.render_layer = sl; - - /* update the related data */ - LayerCollection *lc = BKE_layer_collection_active(sl); - CTX_data_scene_collection_set(C, lc->scene_collection); } ToolSettings *CTX_data_tool_settings(const bContext *C) diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c index 40cba304377..bb013b4aa46 100644 --- a/source/blender/blenkernel/intern/layer.c +++ b/source/blender/blenkernel/intern/layer.c @@ -57,7 +57,13 @@ static void object_bases_Iterator_next(Iterator *iter, const int flag); */ SceneLayer *BKE_scene_layer_add(Scene *scene, const char *name) { + if (!name) { + name = DATA_("Render Layer"); + } + SceneLayer *sl = MEM_callocN(sizeof(SceneLayer), "Scene Layer"); + sl->flag |= SCENE_LAYER_RENDER; + BLI_addtail(&scene->render_layers, sl); /* unique name */ @@ -85,9 +91,11 @@ bool BKE_scene_layer_remove(Main *bmain, Scene *scene, SceneLayer *sl) } BLI_remlink(&scene->render_layers, sl); + BKE_scene_layer_free(sl); MEM_freeN(sl); + scene->active_layer = 0; /* TODO WORKSPACE: set active_layer to 0 */ for (Scene *sce = bmain->scene.first; sce; sce = sce->id.next) { @@ -635,7 +643,7 @@ void BKE_selected_objects_Iterator_begin(Iterator *iter, void *data_in) void BKE_selected_objects_Iterator_next(Iterator *iter) { - object_bases_Iterator_next(iter, BASE_SELECTED); + objects_Iterator_next(iter, BASE_SELECTED); } void BKE_selected_objects_Iterator_end(Iterator *UNUSED(iter)) diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index f9afa33ae79..3eedfaa4679 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -79,6 +79,8 @@ void blo_do_versions_after_linking_280(Main *main) } } + scene->active_layer = 0; + if (!BKE_scene_uses_blender_game(scene)) { for (SceneRenderLayer *srl = scene->r.layers.first; srl; srl = srl->next) { @@ -108,6 +110,10 @@ void blo_do_versions_after_linking_280(Main *main) /* TODO: passes, samples, mask_layesr, exclude, ... */ } + + if (BLI_findlink(&scene->render_layers, scene->r.actlay)) { + scene->active_layer = scene->r.actlay; + } } SceneLayer *sl = BKE_scene_layer_add(scene, "Render Layer"); @@ -121,6 +127,9 @@ void blo_do_versions_after_linking_280(Main *main) lc = lc->next; } + /* but we still need to make the flags synced */ + BKE_scene_layer_base_flag_recalculate(sl); + /* convert active base */ if (scene->basact) { sl->basact = BKE_scene_layer_base_find(sl, scene->basact->object); @@ -130,7 +139,9 @@ void blo_do_versions_after_linking_280(Main *main) for (Base *base = scene->base.first; base; base = base->next) { ObjectBase *ob_base = BKE_scene_layer_base_find(sl, base->object); if ((base->flag & SELECT) != 0) { - ob_base->flag |= BASE_SELECTED; + if ((ob_base->flag & BASE_SELECTABLED) != 0) { + ob_base->flag |= BASE_SELECTED; + } } else { ob_base->flag &= ~BASE_SELECTED; diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c index 837573ad175..984aa6e43c2 100644 --- a/source/blender/editors/render/render_shading.c +++ b/source/blender/editors/render/render_shading.c @@ -54,6 +54,7 @@ #include "BKE_font.h" #include "BKE_global.h" #include "BKE_image.h" +#include "BKE_layer.h" #include "BKE_library.h" #include "BKE_linestyle.h" #include "BKE_main.h" @@ -626,11 +627,11 @@ static int render_layer_add_exec(bContext *C, wmOperator *UNUSED(op)) { Scene *scene = CTX_data_scene(C); - BKE_scene_add_render_layer(scene, NULL); - scene->r.actlay = BLI_listbase_count(&scene->r.layers) - 1; + BKE_scene_layer_add(scene, NULL); + scene->active_layer = BLI_listbase_count(&scene->render_layers) - 1; DAG_id_tag_update(&scene->id, 0); - WM_event_add_notifier(C, NC_SCENE | ND_RENDER_OPTIONS, scene); + WM_event_add_notifier(C, NC_SCENE | ND_LAYER, scene); return OPERATOR_FINISHED; } @@ -652,10 +653,11 @@ void SCENE_OT_render_layer_add(wmOperatorType *ot) static int render_layer_remove_exec(bContext *C, wmOperator *UNUSED(op)) { Scene *scene = CTX_data_scene(C); - SceneRenderLayer *rl = BLI_findlink(&scene->r.layers, scene->r.actlay); + SceneLayer *sl = BLI_findlink(&scene->render_layers, scene->active_layer); - if (!BKE_scene_remove_render_layer(CTX_data_main(C), scene, rl)) + if (!BKE_scene_layer_remove(CTX_data_main(C), scene, sl)) { return OPERATOR_CANCELLED; + } DAG_id_tag_update(&scene->id, 0); WM_event_add_notifier(C, NC_SCENE | ND_RENDER_OPTIONS, scene); diff --git a/source/blender/makesdna/DNA_layer_types.h b/source/blender/makesdna/DNA_layer_types.h index b1f988945f8..d45334a227f 100644 --- a/source/blender/makesdna/DNA_layer_types.h +++ b/source/blender/makesdna/DNA_layer_types.h @@ -62,7 +62,8 @@ typedef struct SceneLayer { char name[64]; /* MAX_NAME */ char engine[32]; /* render engine */ short active_collection; - short pad[3]; + short flag; + short pad[2]; ListBase object_bases; /* ObjectBase */ struct ObjectBase *basact; ListBase layer_collections; /* LayerCollection */ @@ -92,6 +93,11 @@ enum { COLLECTION_FOLDED = (1 << 2), }; +/* SceneLayer->flag */ +enum { + SCENE_LAYER_RENDER = (1 << 0), +}; + #ifdef __cplusplus } #endif diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 08366af628c..3759aa3d48b 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -1751,6 +1751,8 @@ typedef struct Scene { ListBase render_layers; struct SceneCollection *collection; + int active_layer; + int pad4; /* Engine Settings */ struct EngineDataClay claydata; diff --git a/source/blender/makesrna/intern/rna_scene.c b/source/blender/makesrna/intern/rna_scene.c index 5e92772171f..3b599dedfca 100644 --- a/source/blender/makesrna/intern/rna_scene.c +++ b/source/blender/makesrna/intern/rna_scene.c @@ -2545,6 +2545,44 @@ static int rna_SceneLayer_multiple_engines_get(PointerRNA *UNUSED(ptr)) return (BLI_listbase_count(&R_engines) > 1); } +static int rna_SceneLayer_active_layer_index_get(PointerRNA *ptr) +{ + Scene *scene = (Scene *)ptr->data; + return scene->active_layer; +} + +static void rna_SceneLayer_active_layer_index_set(PointerRNA *ptr, int value) +{ + Scene *scene = (Scene *)ptr->data; + int num_layers = BLI_listbase_count(&scene->render_layers); + scene->active_layer = min_ff(value, num_layers - 1); +} + +static void rna_SceneLayer_active_layer_index_range( + PointerRNA *ptr, int *min, int *max, int *UNUSED(softmin), int *UNUSED(softmax)) +{ + Scene *scene = (Scene *)ptr->data; + + *min = 0; + *max = max_ii(0, BLI_listbase_count(&scene->render_layers) - 1); +} + +static PointerRNA rna_SceneLayer_active_layer_get(PointerRNA *ptr) +{ + Scene *scene = (Scene *)ptr->data; + SceneLayer *sl = BLI_findlink(&scene->render_layers, scene->active_layer); + + return rna_pointer_inherit_refine(ptr, &RNA_SceneLayer, sl); +} + +static void rna_SceneLayer_active_layer_set(PointerRNA *ptr, PointerRNA value) +{ + Scene *scene = (Scene *)ptr->data; + SceneLayer *sl = (SceneLayer *)value.data; + const int index = BLI_findindex(&scene->render_layers, sl); + if (index != -1) scene->active_layer = index; +} + static SceneLayer *rna_SceneLayer_new(ID *id, Scene *UNUSED(sce), const char *name) { Scene *scene = (Scene *)id; @@ -5693,6 +5731,12 @@ static void rna_def_scene_layer(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Objects", "All the objects in this layer"); rna_def_layer_objects(brna, prop); + /* layer options */ + prop = RNA_def_property(srna, "use", PROP_BOOLEAN, PROP_NONE); + RNA_def_property_boolean_sdna(prop, NULL, "flag", SCENE_LAYER_RENDER); + RNA_def_property_ui_text(prop, "Enabled", "Disable or enable the render layer"); + RNA_def_property_update(prop, NC_SCENE | ND_LAYER, NULL); + /* engine */ prop = RNA_def_property(srna, "engine", PROP_ENUM, PROP_NONE); RNA_def_property_enum_items(prop, engine_items); @@ -5713,12 +5757,29 @@ static void rna_def_scene_layers(BlenderRNA *brna, PropertyRNA *cprop) StructRNA *srna; FunctionRNA *func; PropertyRNA *parm; + PropertyRNA *prop; RNA_def_property_srna(cprop, "SceneLayers"); srna = RNA_def_struct(brna, "SceneLayers", NULL); RNA_def_struct_sdna(srna, "Scene"); RNA_def_struct_ui_text(srna, "Render Layers", "Collection of render layers"); + prop = RNA_def_property(srna, "active_index", PROP_INT, PROP_UNSIGNED); + RNA_def_property_int_sdna(prop, NULL, "active_layer"); + RNA_def_property_int_funcs(prop, "rna_SceneLayer_active_layer_index_get", + "rna_SceneLayer_active_layer_index_set", + "rna_SceneLayer_active_layer_index_range"); + RNA_def_property_ui_text(prop, "Active Layer Index", "Active index in render layer array"); + RNA_def_property_update(prop, NC_SCENE | ND_LAYER, NULL); + + prop = RNA_def_property(srna, "active", PROP_POINTER, PROP_NONE); + RNA_def_property_struct_type(prop, "SceneLayer"); + RNA_def_property_pointer_funcs(prop, "rna_SceneLayer_active_layer_get", + "rna_SceneLayer_active_layer_set", NULL, NULL); + RNA_def_property_flag(prop, PROP_EDITABLE | PROP_NEVER_NULL); + RNA_def_property_ui_text(prop, "Active Render Layer", "Active Render Layer"); + RNA_def_property_update(prop, NC_SCENE | ND_LAYER, NULL); + func = RNA_def_function(srna, "new", "rna_SceneLayer_new"); RNA_def_function_ui_description(func, "Add a render layer to scene"); RNA_def_function_flag(func, FUNC_USE_SELF_ID); diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c index 6b615f5a121..af15743f2d9 100644 --- a/source/blenderplayer/bad_level_call_stubs/stubs.c +++ b/source/blenderplayer/bad_level_call_stubs/stubs.c @@ -83,6 +83,7 @@ struct HookModifierData; struct NodeBlurData; struct Nurb; struct Object; +struct ObjectBase; struct PBVHNode; struct PyObject; struct Render; @@ -486,6 +487,7 @@ void ED_node_shader_default(const struct bContext *C, struct ID *id) RET_NONE void ED_screen_animation_timer_update(struct bScreen *screen, int redraws, int refresh) RET_NONE struct bScreen *ED_screen_animation_playing(const struct wmWindowManager *wm) RET_NULL void ED_base_object_select(struct Base *base, short mode) RET_NONE +void ED_object_base_select(struct ObjectBase *base, short mode) RET_NONE bool ED_object_modifier_remove(struct ReportList *reports, struct Main *bmain, struct Object *ob, struct ModifierData *md) RET_ZERO struct ModifierData *ED_object_modifier_add(struct ReportList *reports, struct Main *bmain, struct Scene *scene, struct Object *ob, const char *name, int type) RET_ZERO void ED_object_modifier_clear(struct Main *bmain, struct Object *ob) RET_NONE @@ -506,7 +508,7 @@ void uiLayoutSetAlignment(uiLayout *layout, char alignment) RET_NONE void uiLayoutSetScaleX(struct uiLayout *layout, float scale) RET_NONE void uiLayoutSetScaleY(struct uiLayout *layout, float scale) RET_NONE void uiTemplateIconView(struct uiLayout *layout, struct PointerRNA *ptr, const char *propname, int show_labels, float icon_scale) RET_NONE -void ED_base_object_free_and_unlink(struct Main *bmain, struct Scene *scene, struct Base *base) RET_NONE +void ED_base_object_free_and_unlink(struct Main *bmain, struct Scene *scene, struct Object *base) RET_NONE void ED_mesh_update(struct Mesh *mesh, struct bContext *C, int calc_edges, int calc_tessface) RET_NONE void ED_mesh_vertices_add(struct Mesh *mesh, struct ReportList *reports, int count) RET_NONE void ED_mesh_edges_add(struct Mesh *mesh, struct ReportList *reports, int count) RET_NONE diff --git a/tests/python/bl_render_layer.py b/tests/python/bl_render_layer.py index fa693a037a2..93318d6eb31 100644 --- a/tests/python/bl_render_layer.py +++ b/tests/python/bl_render_layer.py @@ -752,6 +752,7 @@ class UnitsTesting(unittest.TestCase): See if we can link objects via bpy.context.scene_collection """ import bpy + bpy.context.scene.render_layers.active_index = len(bpy.context.scene.render_layers) - 1 master_collection = bpy.context.scene_collection self.do_link(master_collection) @@ -828,6 +829,10 @@ class UnitsTesting(unittest.TestCase): layer.collections.active_index = 3 self.assertEqual(layer.collections.active.name, 'scorpion') + scene = bpy.context.scene + scene.render_layers.active_index = len(scene.render_layers) - 2 + self.assertEqual(scene.render_layers.active.name, "Render Layer") + # old layer self.assertEqual(bpy.ops.testing.sample(render_layer='Render Layer', use_verbose=True), {'FINISHED'}) @@ -971,6 +976,8 @@ class UnitsTesting(unittest.TestCase): layer = scene.render_layers.new('Fresh new Layer') layer.collections.link(subzero) + scene.render_layers.active_index = len(scene.render_layers) - 1 + if mode == 'DUPLICATE': # assuming the latest layer is the active layer bpy.ops.object.select_all(action='DESELECT') |