Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/layer.c
| Show First 20 Lines • Show All 1,359 Lines • ▼ Show 20 Lines | static void idproperty_reset(IDProperty **props, IDProperty *props_ref) | ||||
| if (*props) { | if (*props) { | ||||
| IDP_FreeProperty(*props); | IDP_FreeProperty(*props); | ||||
| MEM_freeN(*props); | MEM_freeN(*props); | ||||
| } | } | ||||
| *props = IDP_New(IDP_GROUP, &val, ROOT_PROP); | *props = IDP_New(IDP_GROUP, &val, ROOT_PROP); | ||||
| if (props_ref) { | if (props_ref) { | ||||
| IDP_MergeGroup(*props, props_ref, true); | IDP_MergeGroupValues(*props, props_ref); | ||||
| } | } | ||||
| } | } | ||||
| void BKE_layer_eval_layer_collection_pre(struct EvaluationContext *UNUSED(eval_ctx), | void BKE_layer_eval_layer_collection_pre(struct EvaluationContext *UNUSED(eval_ctx), | ||||
| Scene *scene, SceneLayer *scene_layer) | Scene *scene, SceneLayer *scene_layer) | ||||
| { | { | ||||
| DEBUG_PRINT("%s on %s\n", __func__, scene_layer->name); | DEBUG_PRINT("%s on %s\n", __func__, scene_layer->name); | ||||
| for (Base *base = scene_layer->object_bases.first; base != NULL; base = base->next) { | for (Base *base = scene_layer->object_bases.first; base != NULL; base = base->next) { | ||||
| base->flag &= ~(BASE_VISIBLED | BASE_SELECTABLED); | base->flag &= ~(BASE_VISIBLED | BASE_SELECTABLED); | ||||
| idproperty_reset(&base->collection_properties, scene->collection_properties); | idproperty_reset(&base->collection_properties, scene->collection_properties); | ||||
| } | } | ||||
| /* TODO(sergey): Is it always required? */ | /* TODO(sergey): Is it always required? */ | ||||
| scene_layer->flag |= SCENE_LAYER_ENGINE_DIRTY; | scene_layer->flag |= SCENE_LAYER_ENGINE_DIRTY; | ||||
| } | } | ||||
| void BKE_layer_eval_layer_collection(struct EvaluationContext *UNUSED(eval_ctx), | void BKE_layer_eval_layer_collection(struct EvaluationContext *UNUSED(eval_ctx), | ||||
| Scene *scene, | |||||
| LayerCollection *layer_collection, | LayerCollection *layer_collection, | ||||
| LayerCollection *parent_layer_collection) | LayerCollection *parent_layer_collection) | ||||
| { | { | ||||
| DEBUG_PRINT("%s on %s, parent %s\n", | DEBUG_PRINT("%s on %s, parent %s\n", | ||||
| __func__, | __func__, | ||||
| layer_collection->scene_collection->name, | layer_collection->scene_collection->name, | ||||
| (parent_layer_collection != NULL) ? parent_layer_collection->scene_collection->name : "NONE"); | (parent_layer_collection != NULL) ? parent_layer_collection->scene_collection->name : "NONE"); | ||||
| /* visibility */ | /* visibility */ | ||||
| layer_collection->flag_evaluated = layer_collection->flag; | layer_collection->flag_evaluated = layer_collection->flag; | ||||
| bool is_visible = (layer_collection->flag & COLLECTION_VISIBLE) != 0; | bool is_visible = (layer_collection->flag & COLLECTION_VISIBLE) != 0; | ||||
| bool is_selectable = is_visible && ((layer_collection->flag & COLLECTION_SELECTABLE) != 0); | bool is_selectable = is_visible && ((layer_collection->flag & COLLECTION_SELECTABLE) != 0); | ||||
| if (parent_layer_collection != NULL) { | if (parent_layer_collection != NULL) { | ||||
| is_visible &= (parent_layer_collection->flag_evaluated & COLLECTION_VISIBLE) != 0; | is_visible &= (parent_layer_collection->flag_evaluated & COLLECTION_VISIBLE) != 0; | ||||
| is_selectable &= (parent_layer_collection->flag_evaluated & COLLECTION_SELECTABLE) != 0; | is_selectable &= (parent_layer_collection->flag_evaluated & COLLECTION_SELECTABLE) != 0; | ||||
| layer_collection->flag_evaluated &= parent_layer_collection->flag_evaluated; | layer_collection->flag_evaluated &= parent_layer_collection->flag_evaluated; | ||||
| } | } | ||||
| /* overrides */ | /* overrides */ | ||||
| if (parent_layer_collection != NULL) { | if (is_visible) { | ||||
| idproperty_reset(&layer_collection->properties_evaluated, parent_layer_collection->properties_evaluated); | if (parent_layer_collection == NULL) { | ||||
| } | idproperty_reset(&layer_collection->properties_evaluated, layer_collection->properties); | ||||
| else if (layer_collection->prev != NULL) { | |||||
| idproperty_reset(&layer_collection->properties_evaluated, NULL); | |||||
| } | } | ||||
| else { | else { | ||||
| idproperty_reset(&layer_collection->properties_evaluated, scene->collection_properties); | idproperty_reset(&layer_collection->properties_evaluated, parent_layer_collection->properties_evaluated); | ||||
| IDP_MergeGroupValues(layer_collection->properties_evaluated, layer_collection->properties); | |||||
| } | } | ||||
| if (is_visible) { | |||||
| IDP_MergeGroup(layer_collection->properties_evaluated, layer_collection->properties, true); | |||||
| } | } | ||||
| for (LinkData *link = layer_collection->object_bases.first; link != NULL; link = link->next) { | for (LinkData *link = layer_collection->object_bases.first; link != NULL; link = link->next) { | ||||
| Base *base = link->data; | Base *base = link->data; | ||||
| if (is_visible) { | if (is_visible) { | ||||
| IDP_SyncGroupValues(base->collection_properties, layer_collection->properties_evaluated); | IDP_MergeGroupValues(base->collection_properties, layer_collection->properties_evaluated); | ||||
| base->flag |= BASE_VISIBLED; | base->flag |= BASE_VISIBLED; | ||||
| } | } | ||||
| if (is_selectable) { | if (is_selectable) { | ||||
| base->flag |= BASE_SELECTABLED; | base->flag |= BASE_SELECTABLED; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| Show All 12 Lines | |||||