ViewLayer: Lazy sync of scene data.
When a change happens which invalidates view layers the syncing will be postponed until the first usage. This will improve importing or adding many objects in a single operation/script. `BKE_view_layer_need_resync_tag` is used to tag the view layer to be out of sync. Before accessing `BKE_view_layer_active_base_get`, `BKE_view_layer_active_object_get`, `BKE_view_layer_active_collection` or `BKE_view_layer_object_bases` the caller should call `BKE_view_layer_synced_ensure`. Having two functions ensures that partial syncing could be added as smaller patches in the future. Tagging a view layer out of sync could be replaced with a partial sync. Eventually the number of full resyncs could be reduced. After all tagging has been replaced with partial syncs the ensure_sync could be phased out. This patch has been added to discuss the details and consequences of the current approach. For clarity the call to BKE_view_layer_ensure_sync is placed close to the getters. In the future this could be placed in more strategical places to reduce the number of calls or improve performance. Finding those strategical places isn't that clear. When multiple operations are grouped in a single script you might want to always check for resync. Some areas found that can be improved. This list isn't complete. These areas aren't addressed by this patch as these changes would be hard to detect to the reviewer. The idea is to add changes to these areas as a separate patch. It might be that the initial commit would reduce performance compared to master, but will be fixed by the additional patches. **Object duplication** During object duplication the syncing is temporarily disabled. With this patch this isn't useful as when disabled the view_layer is accessed to locate bases. This can be improved by first locating the source bases, then duplicate and sync and locate the new bases. Will be solved in a separate patch for clarity reasons ({D15886}). **Object add** `BKE_object_add` not only adds a new object, but also selects and activates the new base. This requires the view_layer to be resynced. Some callers reverse the selection and activation (See `get_new_constraint_target`). We should make the selection and activation optional. This would make it possible to add multiple objects without having to resync per object. **Postpone Activate Base** Setting the basact is done in many locations. They follow a rule as after an action find the base and set the basact. Finding the base could require a resync. The idea is to store in the view_layer the object which base will be set in the basact during the next sync, reducing the times resyncing needs to happen. Reviewed By: mont29 Maniphest Tasks: T73411 Differential Revision: https://developer.blender.org/D15885
This commit is contained in:
parent
23276bcc37
commit
68589a31eb
Notes:
blender-bot
2023-10-11 07:45:04 +02:00
Referenced by commit bb8dba8609
, Fix missing view layer update when iterating a collection from Python.
Referenced by issue #100749, Blender LTS: Maintenance Task 3.3
Referenced by issue #101394, Importing file after making a new collection active hits an assert (View Layer Object Base out of sync)
Referenced by issue #101272, Missing view layer updates handling collections in python
Referenced by issue #101128, Regression: Torus Adding Error (can't be selected because it is not in View Layer)
Referenced by issue #73411, Fix ViewLayers cache building
Referenced by issue #113378, Regression: Deleting Objects in a View Layer leaves None in the View Layer's .objects for the script duration
|
@ -17,6 +17,7 @@ struct Depsgraph;
|
|||
struct MVert;
|
||||
struct MVertTri;
|
||||
struct Object;
|
||||
struct Scene;
|
||||
|
||||
////////////////////////////////////////
|
||||
// used for collisions in collision.c
|
||||
|
|
|
@ -371,8 +371,8 @@ void BKE_view_layer_visible_bases_iterator_end(BLI_Iterator *iter);
|
|||
data_.object_type = _object_type; \
|
||||
data_.view_layer = _view_layer; \
|
||||
data_.v3d = _v3d; \
|
||||
UNUSED_VARS(_scene); \
|
||||
data_.base_active = _view_layer->basact; \
|
||||
BKE_view_layer_synced_ensure(_scene, _view_layer); \
|
||||
data_.base_active = BKE_view_layer_active_base_get(_view_layer); \
|
||||
ITER_BEGIN (BKE_view_layer_bases_in_mode_iterator_begin, \
|
||||
BKE_view_layer_bases_in_mode_iterator_next, \
|
||||
BKE_view_layer_bases_in_mode_iterator_end, \
|
||||
|
@ -422,6 +422,7 @@ void BKE_view_layer_visible_bases_iterator_end(BLI_Iterator *iter);
|
|||
struct ObjectsVisibleIteratorData data_ = {NULL}; \
|
||||
data_.view_layer = _view_layer; \
|
||||
data_.v3d = _v3d; \
|
||||
BKE_view_layer_synced_ensure(_scene, _view_layer); \
|
||||
ITER_BEGIN (BKE_view_layer_visible_bases_iterator_begin, \
|
||||
BKE_view_layer_visible_bases_iterator_next, \
|
||||
BKE_view_layer_visible_bases_iterator_end, \
|
||||
|
@ -438,8 +439,9 @@ void BKE_view_layer_visible_bases_iterator_end(BLI_Iterator *iter);
|
|||
{ \
|
||||
Object *_instance; \
|
||||
Base *_base; \
|
||||
UNUSED_VARS(scene); \
|
||||
for (_base = (Base *)(view_layer)->object_bases.first; _base; _base = _base->next) { \
|
||||
BKE_view_layer_synced_ensure(scene, view_layer); \
|
||||
for (_base = (Base *)BKE_view_layer_object_bases_get(view_layer)->first; _base; \
|
||||
_base = _base->next) { \
|
||||
_instance = _base->object;
|
||||
|
||||
#define FOREACH_OBJECT_END \
|
||||
|
@ -575,6 +577,14 @@ struct Object **BKE_view_layer_array_from_objects_in_mode_unique_data(const stru
|
|||
struct Object *BKE_view_layer_active_object_get(const struct ViewLayer *view_layer);
|
||||
struct Object *BKE_view_layer_edit_object_get(const struct ViewLayer *view_layer);
|
||||
|
||||
struct ListBase *BKE_view_layer_object_bases_get(struct ViewLayer *view_layer);
|
||||
struct Base *BKE_view_layer_active_base_get(struct ViewLayer *view_layer);
|
||||
|
||||
struct LayerCollection *BKE_view_layer_active_collection_get(struct ViewLayer *view_layer);
|
||||
|
||||
void BKE_view_layer_need_resync_tag(struct ViewLayer *view_layer);
|
||||
void BKE_view_layer_synced_ensure(const struct Scene *scene, struct ViewLayer *view_layer);
|
||||
|
||||
struct ViewLayerAOV *BKE_view_layer_add_aov(struct ViewLayer *view_layer);
|
||||
void BKE_view_layer_remove_aov(struct ViewLayer *view_layer, struct ViewLayerAOV *aov);
|
||||
void BKE_view_layer_set_active_aov(struct ViewLayer *view_layer, struct ViewLayerAOV *aov);
|
||||
|
|
|
@ -175,7 +175,7 @@ struct Object *BKE_object_add_only_object(struct Main *bmain,
|
|||
* \note Creates minimum required data, but without vertices etc.
|
||||
*/
|
||||
struct Object *BKE_object_add(struct Main *bmain,
|
||||
const struct Scene *scene,
|
||||
struct Scene *scene,
|
||||
struct ViewLayer *view_layer,
|
||||
int type,
|
||||
const char *name) ATTR_NONNULL(1, 2, 3) ATTR_RETURNS_NONNULL;
|
||||
|
|
|
@ -1662,6 +1662,7 @@ static void object_get_datamask(const Depsgraph *depsgraph,
|
|||
CustomData_MeshMasks *r_mask,
|
||||
bool *r_need_mapping)
|
||||
{
|
||||
Scene *scene = DEG_get_evaluated_scene(depsgraph);
|
||||
ViewLayer *view_layer = DEG_get_evaluated_view_layer(depsgraph);
|
||||
|
||||
DEG_get_customdata_mask_for_object(depsgraph, ob, r_mask);
|
||||
|
@ -1676,8 +1677,11 @@ static void object_get_datamask(const Depsgraph *depsgraph,
|
|||
return;
|
||||
}
|
||||
|
||||
Object *actob = view_layer->basact ? DEG_get_original_object(view_layer->basact->object) :
|
||||
nullptr;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *actob = BKE_view_layer_active_object_get(view_layer);
|
||||
if (actob) {
|
||||
actob = DEG_get_original_object(actob);
|
||||
}
|
||||
if (DEG_get_original_object(ob) == actob) {
|
||||
bool editing = BKE_paint_select_face_test(actob);
|
||||
|
||||
|
|
|
@ -493,6 +493,7 @@ static void loose_data_instantiate_ensure_active_collection(
|
|||
static void loose_data_instantiate_object_base_instance_init(Main *bmain,
|
||||
Collection *collection,
|
||||
Object *ob,
|
||||
const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
const View3D *v3d,
|
||||
const int flag,
|
||||
|
@ -506,7 +507,7 @@ static void loose_data_instantiate_object_base_instance_init(Main *bmain,
|
|||
}
|
||||
|
||||
BKE_collection_object_add(bmain, collection, ob);
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_base_find(view_layer, ob);
|
||||
|
||||
if (v3d != NULL) {
|
||||
|
@ -686,8 +687,14 @@ static void loose_data_instantiate_collection_process(
|
|||
/* TODO: why is it OK to make this active here but not in other situations?
|
||||
* See other callers of #object_base_instance_init */
|
||||
const bool set_active = set_selected;
|
||||
loose_data_instantiate_object_base_instance_init(
|
||||
bmain, active_collection, ob, view_layer, v3d, lapp_context->params->flag, set_active);
|
||||
loose_data_instantiate_object_base_instance_init(bmain,
|
||||
active_collection,
|
||||
ob,
|
||||
scene,
|
||||
view_layer,
|
||||
v3d,
|
||||
lapp_context->params->flag,
|
||||
set_active);
|
||||
|
||||
/* Assign the collection. */
|
||||
ob->instance_collection = collection;
|
||||
|
@ -698,6 +705,7 @@ static void loose_data_instantiate_collection_process(
|
|||
else {
|
||||
/* Add collection as child of active collection. */
|
||||
BKE_collection_child_add(bmain, active_collection, collection);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
|
||||
if ((lapp_context->params->flag & FILE_AUTOSELECT) != 0) {
|
||||
LISTBASE_FOREACH (CollectionObject *, coll_ob, &collection->gobject) {
|
||||
|
@ -717,6 +725,7 @@ static void loose_data_instantiate_object_process(LooseDataInstantiateContext *i
|
|||
{
|
||||
BlendfileLinkAppendContext *lapp_context = instantiate_context->lapp_context;
|
||||
Main *bmain = lapp_context->params->bmain;
|
||||
const Scene *scene = lapp_context->params->context.scene;
|
||||
ViewLayer *view_layer = lapp_context->params->context.view_layer;
|
||||
const View3D *v3d = lapp_context->params->context.v3d;
|
||||
|
||||
|
@ -762,6 +771,7 @@ static void loose_data_instantiate_object_process(LooseDataInstantiateContext *i
|
|||
loose_data_instantiate_object_base_instance_init(bmain,
|
||||
active_collection,
|
||||
ob,
|
||||
scene,
|
||||
view_layer,
|
||||
v3d,
|
||||
lapp_context->params->flag,
|
||||
|
@ -809,6 +819,7 @@ static void loose_data_instantiate_obdata_process(LooseDataInstantiateContext *i
|
|||
loose_data_instantiate_object_base_instance_init(bmain,
|
||||
active_collection,
|
||||
ob,
|
||||
scene,
|
||||
view_layer,
|
||||
v3d,
|
||||
lapp_context->params->flag,
|
||||
|
|
|
@ -859,15 +859,15 @@ void BKE_collection_object_cache_free(Collection *collection)
|
|||
collection_object_cache_free(collection);
|
||||
}
|
||||
|
||||
Base *BKE_collection_or_layer_objects(const Scene *UNUSED(scene),
|
||||
Base *BKE_collection_or_layer_objects(const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
Collection *collection)
|
||||
{
|
||||
if (collection) {
|
||||
return BKE_collection_object_cache_get(collection).first;
|
||||
}
|
||||
|
||||
return view_layer->object_bases.first;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
return BKE_view_layer_object_bases_get(view_layer)->first;
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
@ -1751,7 +1751,10 @@ Collection *BKE_collection_from_index(Scene *scene, const int index)
|
|||
return collection_from_index_recursive(master_collection, index, &index_current);
|
||||
}
|
||||
|
||||
static bool collection_objects_select(ViewLayer *view_layer, Collection *collection, bool deselect)
|
||||
static bool collection_objects_select(const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
Collection *collection,
|
||||
bool deselect)
|
||||
{
|
||||
bool changed = false;
|
||||
|
||||
|
@ -1759,6 +1762,7 @@ static bool collection_objects_select(ViewLayer *view_layer, Collection *collect
|
|||
return false;
|
||||
}
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (CollectionObject *, cob, &collection->gobject) {
|
||||
Base *base = BKE_view_layer_base_find(view_layer, cob->ob);
|
||||
|
||||
|
@ -1779,7 +1783,7 @@ static bool collection_objects_select(ViewLayer *view_layer, Collection *collect
|
|||
}
|
||||
|
||||
LISTBASE_FOREACH (CollectionChild *, child, &collection->children) {
|
||||
if (collection_objects_select(view_layer, collection, deselect)) {
|
||||
if (collection_objects_select(scene, view_layer, collection, deselect)) {
|
||||
changed = true;
|
||||
}
|
||||
}
|
||||
|
@ -1799,7 +1803,7 @@ bool BKE_collection_objects_select(const Scene *scene,
|
|||
return BKE_layer_collection_objects_select(scene, view_layer, layer_collection, deselect);
|
||||
}
|
||||
|
||||
return collection_objects_select(view_layer, collection, deselect);
|
||||
return collection_objects_select(scene, view_layer, collection, deselect);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
|
|
@ -440,6 +440,7 @@ static int ctx_data_base_collection_get(const bContext *C, const char *member, L
|
|||
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
|
||||
bool ok = false;
|
||||
|
||||
|
@ -1362,8 +1363,9 @@ struct Base *CTX_data_active_base(const bContext *C)
|
|||
if (ob == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
return BKE_view_layer_base_find(view_layer, ob);
|
||||
}
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include "BKE_effect.h"
|
||||
#include "BKE_fluid.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_layer.h"
|
||||
#include "BKE_lib_id.h"
|
||||
#include "BKE_modifier.h"
|
||||
#include "BKE_pointcache.h"
|
||||
|
@ -543,7 +544,9 @@ static bool BKE_fluid_modifier_init(
|
|||
}
|
||||
|
||||
/* Forward declarations. */
|
||||
static void manta_smoke_calc_transparency(FluidDomainSettings *fds, ViewLayer *view_layer);
|
||||
static void manta_smoke_calc_transparency(FluidDomainSettings *fds,
|
||||
Scene *scene,
|
||||
ViewLayer *view_layer);
|
||||
static float calc_voxel_transp(
|
||||
float *result, const float *input, int res[3], int *pixel, float *t_ray, float correct);
|
||||
static void update_distances(int index,
|
||||
|
@ -553,12 +556,13 @@ static void update_distances(int index,
|
|||
float surface_thickness,
|
||||
bool use_plane_init);
|
||||
|
||||
static int get_light(ViewLayer *view_layer, float *light)
|
||||
static int get_light(Scene *scene, ViewLayer *view_layer, float *light)
|
||||
{
|
||||
int found_light = 0;
|
||||
|
||||
/* Try to find a lamp, preferably local. */
|
||||
LISTBASE_FOREACH (Base *, base_tmp, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base_tmp, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if (base_tmp->object->type == OB_LAMP) {
|
||||
Light *la = base_tmp->object->data;
|
||||
|
||||
|
@ -3596,7 +3600,8 @@ static int manta_step(
|
|||
|
||||
/* Compute shadow grid for gas simulations. Make sure to skip if bake job was canceled early. */
|
||||
if (fds->type == FLUID_DOMAIN_TYPE_GAS && result) {
|
||||
manta_smoke_calc_transparency(fds, DEG_get_evaluated_view_layer(depsgraph));
|
||||
manta_smoke_calc_transparency(
|
||||
fds, DEG_get_evaluated_scene(depsgraph), DEG_get_evaluated_view_layer(depsgraph));
|
||||
}
|
||||
|
||||
BLI_mutex_unlock(&object_update_lock);
|
||||
|
@ -4295,7 +4300,9 @@ static void bresenham_linie_3D(int x1,
|
|||
cb(result, input, res, pixel, t_ray, correct);
|
||||
}
|
||||
|
||||
static void manta_smoke_calc_transparency(FluidDomainSettings *fds, ViewLayer *view_layer)
|
||||
static void manta_smoke_calc_transparency(FluidDomainSettings *fds,
|
||||
Scene *scene,
|
||||
ViewLayer *view_layer)
|
||||
{
|
||||
float bv[6] = {0};
|
||||
float light[3];
|
||||
|
@ -4304,7 +4311,7 @@ static void manta_smoke_calc_transparency(FluidDomainSettings *fds, ViewLayer *v
|
|||
float *shadow = manta_smoke_get_shadow(fds->fluid);
|
||||
float correct = -7.0f * fds->dx;
|
||||
|
||||
if (!get_light(view_layer, light)) {
|
||||
if (!get_light(scene, view_layer, light)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -284,11 +284,10 @@ void BKE_view_layer_free_ex(ViewLayer *view_layer, const bool do_id_user)
|
|||
MEM_freeN(view_layer);
|
||||
}
|
||||
|
||||
void BKE_view_layer_selected_objects_tag(const Scene *UNUSED(scene),
|
||||
ViewLayer *view_layer,
|
||||
const int tag)
|
||||
void BKE_view_layer_selected_objects_tag(const Scene *scene, ViewLayer *view_layer, const int tag)
|
||||
{
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if ((base->flag & BASE_SELECTED) != 0) {
|
||||
base->object->flag |= tag;
|
||||
}
|
||||
|
@ -311,9 +310,10 @@ static bool find_scene_collection_in_scene_collections(ListBase *lb, const Layer
|
|||
return false;
|
||||
}
|
||||
|
||||
Object *BKE_view_layer_camera_find(const Scene *UNUSED(scene), ViewLayer *view_layer)
|
||||
Object *BKE_view_layer_camera_find(const Scene *scene, ViewLayer *view_layer)
|
||||
{
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if (base->object->type == OB_CAMERA) {
|
||||
return base->object;
|
||||
}
|
||||
|
@ -381,6 +381,8 @@ static void view_layer_bases_hash_create(ViewLayer *view_layer, const bool do_ba
|
|||
|
||||
Base *BKE_view_layer_base_find(ViewLayer *view_layer, Object *ob)
|
||||
{
|
||||
BLI_assert_msg((view_layer->flag & VIEW_LAYER_OUT_OF_SYNC) == 0,
|
||||
"View layer out of sync, invoke BKE_view_layer_synced_ensure.");
|
||||
if (!view_layer->object_bases_hash) {
|
||||
view_layer_bases_hash_create(view_layer, false);
|
||||
}
|
||||
|
@ -388,11 +390,10 @@ Base *BKE_view_layer_base_find(ViewLayer *view_layer, Object *ob)
|
|||
return BLI_ghash_lookup(view_layer->object_bases_hash, ob);
|
||||
}
|
||||
|
||||
void BKE_view_layer_base_deselect_all(const Scene *UNUSED(scene), ViewLayer *view_layer)
|
||||
void BKE_view_layer_base_deselect_all(const Scene *scene, ViewLayer *view_layer)
|
||||
{
|
||||
Base *base;
|
||||
|
||||
for (base = view_layer->object_bases.first; base; base = base->next) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
base->flag &= ~BASE_SELECTED;
|
||||
}
|
||||
}
|
||||
|
@ -504,7 +505,9 @@ void BKE_view_layer_copy_data(Scene *scene_dst,
|
|||
/* Copy layer collections and object bases. */
|
||||
/* Inline 'BLI_duplicatelist' and update the active base. */
|
||||
BLI_listbase_clear(&view_layer_dst->object_bases);
|
||||
LISTBASE_FOREACH (Base *, base_src, &view_layer_src->object_bases) {
|
||||
BLI_assert_msg((view_layer_src->flag & VIEW_LAYER_OUT_OF_SYNC) == 0,
|
||||
"View Layer Object Base out of sync, invoke BKE_view_layer_synced_ensure.");
|
||||
LISTBASE_FOREACH (const Base *, base_src, &view_layer_src->object_bases) {
|
||||
Base *base_dst = MEM_dupallocN(base_src);
|
||||
BLI_addtail(&view_layer_dst->object_bases, base_dst);
|
||||
if (view_layer_src->basact == base_src) {
|
||||
|
@ -959,6 +962,19 @@ static void layer_collection_resync_unused_layers_free(ViewLayer *view_layer,
|
|||
}
|
||||
}
|
||||
|
||||
void BKE_view_layer_need_resync_tag(struct ViewLayer *view_layer)
|
||||
{
|
||||
view_layer->flag |= VIEW_LAYER_OUT_OF_SYNC;
|
||||
}
|
||||
|
||||
void BKE_view_layer_synced_ensure(const Scene *scene, struct ViewLayer *view_layer)
|
||||
{
|
||||
if (view_layer->flag & VIEW_LAYER_OUT_OF_SYNC) {
|
||||
BKE_layer_collection_sync(scene, view_layer);
|
||||
view_layer->flag &= ~VIEW_LAYER_OUT_OF_SYNC;
|
||||
}
|
||||
}
|
||||
|
||||
static void layer_collection_objects_sync(ViewLayer *view_layer,
|
||||
LayerCollection *layer,
|
||||
ListBase *r_lb_new_object_bases,
|
||||
|
@ -1052,8 +1068,14 @@ static void layer_collection_sync(ViewLayer *view_layer,
|
|||
|
||||
BLI_assert(layer_resync->is_used);
|
||||
|
||||
uint64_t skipped_children = 0;
|
||||
LISTBASE_FOREACH (CollectionChild *, child, &layer_resync->collection->children) {
|
||||
Collection *child_collection = child->collection;
|
||||
/* Collection relations may not have rebuild yet. */
|
||||
if (child_collection == NULL) {
|
||||
skipped_children++;
|
||||
continue;
|
||||
}
|
||||
LayerCollectionResync *child_layer_resync = layer_collection_resync_find(layer_resync,
|
||||
child_collection);
|
||||
|
||||
|
@ -1158,7 +1180,7 @@ static void layer_collection_sync(ViewLayer *view_layer,
|
|||
|
||||
/* Replace layer collection list with new one. */
|
||||
layer_resync->layer->layer_collections = new_lb_layer;
|
||||
BLI_assert(BLI_listbase_count(&layer_resync->collection->children) ==
|
||||
BLI_assert(BLI_listbase_count(&layer_resync->collection->children) - skipped_children ==
|
||||
BLI_listbase_count(&new_lb_layer));
|
||||
|
||||
/* Update bases etc. for objects. */
|
||||
|
@ -1344,7 +1366,7 @@ void BKE_scene_collection_sync(const Scene *scene)
|
|||
}
|
||||
|
||||
LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
|
||||
BKE_layer_collection_sync(scene, view_layer);
|
||||
BKE_view_layer_need_resync_tag(view_layer);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1422,6 +1444,7 @@ bool BKE_layer_collection_objects_select(const Scene *scene,
|
|||
bool changed = false;
|
||||
|
||||
if (!(lc->flag & LAYER_COLLECTION_EXCLUDE)) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (CollectionObject *, cob, &lc->collection->gobject) {
|
||||
Base *base = BKE_view_layer_base_find(view_layer, cob->ob);
|
||||
|
||||
|
@ -1458,6 +1481,7 @@ bool BKE_layer_collection_has_selected_objects(const Scene *scene,
|
|||
}
|
||||
|
||||
if (!(lc->flag & LAYER_COLLECTION_EXCLUDE)) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (CollectionObject *, cob, &lc->collection->gobject) {
|
||||
Base *base = BKE_view_layer_base_find(view_layer, cob->ob);
|
||||
|
||||
|
@ -1502,7 +1526,8 @@ void BKE_base_set_visible(Scene *scene, ViewLayer *view_layer, Base *base, bool
|
|||
{
|
||||
if (!extend) {
|
||||
/* Make only one base visible. */
|
||||
LISTBASE_FOREACH (Base *, other, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, other, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
other->flag |= BASE_HIDDEN;
|
||||
}
|
||||
|
||||
|
@ -1513,7 +1538,7 @@ void BKE_base_set_visible(Scene *scene, ViewLayer *view_layer, Base *base, bool
|
|||
base->flag ^= BASE_HIDDEN;
|
||||
}
|
||||
|
||||
BKE_layer_collection_sync(scene, view_layer);
|
||||
BKE_view_layer_need_resync_tag(view_layer);
|
||||
}
|
||||
|
||||
bool BKE_base_is_visible(const View3D *v3d, const Base *base)
|
||||
|
@ -1592,7 +1617,7 @@ static void layer_collection_flag_unset_recursive(LayerCollection *lc, const int
|
|||
}
|
||||
}
|
||||
|
||||
void BKE_layer_collection_isolate_global(Scene *scene,
|
||||
void BKE_layer_collection_isolate_global(Scene *UNUSED(scene),
|
||||
ViewLayer *view_layer,
|
||||
LayerCollection *lc,
|
||||
bool extend)
|
||||
|
@ -1637,7 +1662,7 @@ void BKE_layer_collection_isolate_global(Scene *scene,
|
|||
BKE_layer_collection_activate(view_layer, lc);
|
||||
}
|
||||
|
||||
BKE_layer_collection_sync(scene, view_layer);
|
||||
BKE_view_layer_need_resync_tag(view_layer);
|
||||
}
|
||||
|
||||
static void layer_collection_local_visibility_set_recursive(LayerCollection *layer_collection,
|
||||
|
@ -1658,7 +1683,8 @@ static void layer_collection_local_visibility_unset_recursive(LayerCollection *l
|
|||
}
|
||||
}
|
||||
|
||||
static void layer_collection_local_sync(ViewLayer *view_layer,
|
||||
static void layer_collection_local_sync(const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
LayerCollection *layer_collection,
|
||||
const unsigned short local_collections_uuid,
|
||||
bool visible)
|
||||
|
@ -1673,6 +1699,7 @@ static void layer_collection_local_sync(ViewLayer *view_layer,
|
|||
continue;
|
||||
}
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_base_find(view_layer, cob->ob);
|
||||
base->local_collections_bits |= local_collections_uuid;
|
||||
}
|
||||
|
@ -1680,14 +1707,12 @@ static void layer_collection_local_sync(ViewLayer *view_layer,
|
|||
|
||||
LISTBASE_FOREACH (LayerCollection *, child, &layer_collection->layer_collections) {
|
||||
if ((child->flag & LAYER_COLLECTION_EXCLUDE) == 0) {
|
||||
layer_collection_local_sync(view_layer, child, local_collections_uuid, visible);
|
||||
layer_collection_local_sync(scene, view_layer, child, local_collections_uuid, visible);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BKE_layer_collection_local_sync(const Scene *UNUSED(scene),
|
||||
ViewLayer *view_layer,
|
||||
const View3D *v3d)
|
||||
void BKE_layer_collection_local_sync(const Scene *scene, ViewLayer *view_layer, const View3D *v3d)
|
||||
{
|
||||
if (no_resync) {
|
||||
return;
|
||||
|
@ -1696,12 +1721,13 @@ void BKE_layer_collection_local_sync(const Scene *UNUSED(scene),
|
|||
const unsigned short local_collections_uuid = v3d->local_collections_uuid;
|
||||
|
||||
/* Reset flags and set the bases visible by default. */
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
base->local_collections_bits &= ~local_collections_uuid;
|
||||
}
|
||||
|
||||
LISTBASE_FOREACH (LayerCollection *, layer_collection, &view_layer->layer_collections) {
|
||||
layer_collection_local_sync(view_layer, layer_collection, local_collections_uuid, true);
|
||||
layer_collection_local_sync(scene, view_layer, layer_collection, local_collections_uuid, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1772,33 +1798,39 @@ void BKE_layer_collection_isolate_local(
|
|||
BKE_layer_collection_local_sync(scene, view_layer, v3d);
|
||||
}
|
||||
|
||||
static void layer_collection_bases_show_recursive(ViewLayer *view_layer, LayerCollection *lc)
|
||||
static void layer_collection_bases_show_recursive(const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
LayerCollection *lc)
|
||||
{
|
||||
if ((lc->flag & LAYER_COLLECTION_EXCLUDE) == 0) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (CollectionObject *, cob, &lc->collection->gobject) {
|
||||
Base *base = BKE_view_layer_base_find(view_layer, cob->ob);
|
||||
base->flag &= ~BASE_HIDDEN;
|
||||
}
|
||||
}
|
||||
LISTBASE_FOREACH (LayerCollection *, lc_iter, &lc->layer_collections) {
|
||||
layer_collection_bases_show_recursive(view_layer, lc_iter);
|
||||
layer_collection_bases_show_recursive(scene, view_layer, lc_iter);
|
||||
}
|
||||
}
|
||||
|
||||
static void layer_collection_bases_hide_recursive(ViewLayer *view_layer, LayerCollection *lc)
|
||||
static void layer_collection_bases_hide_recursive(const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
LayerCollection *lc)
|
||||
{
|
||||
if ((lc->flag & LAYER_COLLECTION_EXCLUDE) == 0) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (CollectionObject *, cob, &lc->collection->gobject) {
|
||||
Base *base = BKE_view_layer_base_find(view_layer, cob->ob);
|
||||
base->flag |= BASE_HIDDEN;
|
||||
}
|
||||
}
|
||||
LISTBASE_FOREACH (LayerCollection *, lc_iter, &lc->layer_collections) {
|
||||
layer_collection_bases_hide_recursive(view_layer, lc_iter);
|
||||
layer_collection_bases_hide_recursive(scene, view_layer, lc_iter);
|
||||
}
|
||||
}
|
||||
|
||||
void BKE_layer_collection_set_visible(const Scene *UNUSED(scene),
|
||||
void BKE_layer_collection_set_visible(const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
LayerCollection *lc,
|
||||
const bool visible,
|
||||
|
@ -1807,11 +1839,11 @@ void BKE_layer_collection_set_visible(const Scene *UNUSED(scene),
|
|||
if (hierarchy) {
|
||||
if (visible) {
|
||||
layer_collection_flag_unset_recursive(lc, LAYER_COLLECTION_HIDE);
|
||||
layer_collection_bases_show_recursive(view_layer, lc);
|
||||
layer_collection_bases_show_recursive(scene, view_layer, lc);
|
||||
}
|
||||
else {
|
||||
layer_collection_flag_set_recursive(lc, LAYER_COLLECTION_HIDE);
|
||||
layer_collection_bases_hide_recursive(view_layer, lc);
|
||||
layer_collection_bases_hide_recursive(scene, view_layer, lc);
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -1906,6 +1938,7 @@ bool BKE_view_layer_has_collection(const ViewLayer *view_layer, const Collection
|
|||
bool BKE_scene_has_object(Scene *scene, Object *ob)
|
||||
{
|
||||
LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_base_find(view_layer, ob);
|
||||
if (base) {
|
||||
return true;
|
||||
|
@ -1945,7 +1978,7 @@ static void object_bases_iterator_begin(BLI_Iterator *iter, void *data_in_v, con
|
|||
ObjectsVisibleIteratorData *data_in = data_in_v;
|
||||
ViewLayer *view_layer = data_in->view_layer;
|
||||
const View3D *v3d = data_in->v3d;
|
||||
Base *base = view_layer->object_bases.first;
|
||||
Base *base = BKE_view_layer_object_bases_get(view_layer)->first;
|
||||
|
||||
/* when there are no objects */
|
||||
if (base == NULL) {
|
||||
|
@ -2244,18 +2277,19 @@ void BKE_base_eval_flags(Base *base)
|
|||
}
|
||||
|
||||
static void layer_eval_view_layer(struct Depsgraph *depsgraph,
|
||||
struct Scene *UNUSED(scene),
|
||||
struct Scene *scene,
|
||||
ViewLayer *view_layer)
|
||||
{
|
||||
DEG_debug_print_eval(depsgraph, __func__, view_layer->name, view_layer);
|
||||
|
||||
/* Create array of bases, for fast index-based lookup. */
|
||||
const int num_object_bases = BLI_listbase_count(&view_layer->object_bases);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
const int num_object_bases = BLI_listbase_count(BKE_view_layer_object_bases_get(view_layer));
|
||||
MEM_SAFE_FREE(view_layer->object_bases_array);
|
||||
view_layer->object_bases_array = MEM_malloc_arrayN(
|
||||
num_object_bases, sizeof(Base *), "view_layer->object_bases_array");
|
||||
int base_index = 0;
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
view_layer->object_bases_array[base_index++] = base;
|
||||
}
|
||||
}
|
||||
|
@ -2285,12 +2319,11 @@ static void write_layer_collections(BlendWriter *writer, ListBase *lb)
|
|||
}
|
||||
}
|
||||
|
||||
void BKE_view_layer_blend_write(BlendWriter *writer,
|
||||
const Scene *UNUSED(scene),
|
||||
ViewLayer *view_layer)
|
||||
void BKE_view_layer_blend_write(BlendWriter *writer, const Scene *scene, ViewLayer *view_layer)
|
||||
{
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
BLO_write_struct(writer, ViewLayer, view_layer);
|
||||
BLO_write_struct_list(writer, Base, &view_layer->object_bases);
|
||||
BLO_write_struct_list(writer, Base, BKE_view_layer_object_bases_get(view_layer));
|
||||
|
||||
if (view_layer->id_properties) {
|
||||
IDP_BlendWrite(writer, view_layer->id_properties);
|
||||
|
|
|
@ -215,6 +215,27 @@ struct Object **BKE_view_layer_array_from_objects_in_mode_unique_data(const Scen
|
|||
return BKE_view_layer_array_from_objects_in_mode_params(scene, view_layer, v3d, r_len, ¶ms);
|
||||
}
|
||||
|
||||
ListBase *BKE_view_layer_object_bases_get(ViewLayer *view_layer)
|
||||
{
|
||||
BLI_assert_msg((view_layer->flag & VIEW_LAYER_OUT_OF_SYNC) == 0,
|
||||
"Object Bases out of sync, invoke BKE_view_layer_synced_ensure.");
|
||||
return &view_layer->object_bases;
|
||||
}
|
||||
|
||||
Base *BKE_view_layer_active_base_get(ViewLayer *view_layer)
|
||||
{
|
||||
BLI_assert_msg((view_layer->flag & VIEW_LAYER_OUT_OF_SYNC) == 0,
|
||||
"Active Base out of sync, invoke BKE_view_layer_synced_ensure.");
|
||||
return view_layer->basact;
|
||||
}
|
||||
|
||||
LayerCollection *BKE_view_layer_active_collection_get(ViewLayer *view_layer)
|
||||
{
|
||||
BLI_assert_msg((view_layer->flag & VIEW_LAYER_OUT_OF_SYNC) == 0,
|
||||
"Active Collection out of sync, invoke BKE_view_layer_synced_ensure.");
|
||||
return view_layer->active_collection;
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
@ -249,10 +270,11 @@ bool BKE_view_layer_filter_edit_mesh_has_edges(const Object *ob, void *UNUSED(us
|
|||
return false;
|
||||
}
|
||||
|
||||
Object *BKE_view_layer_non_active_selected_object(const Scene *UNUSED(scene),
|
||||
Object *BKE_view_layer_non_active_selected_object(const struct Scene *scene,
|
||||
struct ViewLayer *view_layer,
|
||||
const struct View3D *v3d)
|
||||
{
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob_active = BKE_view_layer_active_object_get(view_layer);
|
||||
Object *ob_result = NULL;
|
||||
FOREACH_SELECTED_OBJECT_BEGIN (view_layer, v3d, ob_iter) {
|
||||
|
@ -280,7 +302,8 @@ Object *BKE_view_layer_non_active_selected_object(const Scene *UNUSED(scene),
|
|||
|
||||
Object *BKE_view_layer_active_object_get(const ViewLayer *view_layer)
|
||||
{
|
||||
return view_layer->basact ? view_layer->basact->object : NULL;
|
||||
Base *base = BKE_view_layer_active_base_get((ViewLayer *)view_layer);
|
||||
return base ? base->object : NULL;
|
||||
}
|
||||
|
||||
Object *BKE_view_layer_edit_object_get(const ViewLayer *view_layer)
|
||||
|
|
|
@ -1269,6 +1269,8 @@ static void lib_override_library_create_post_process(Main *bmain,
|
|||
}
|
||||
}
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
|
||||
/* We need to ensure all new overrides of objects are properly instantiated. */
|
||||
Collection *default_instantiating_collection = residual_storage;
|
||||
LISTBASE_FOREACH (Object *, ob, &bmain->objects) {
|
||||
|
@ -1377,7 +1379,7 @@ bool BKE_lib_override_library_create(Main *bmain,
|
|||
if (id_hierarchy_root_reference == nullptr) {
|
||||
id_hierarchy_root_reference = id_root_reference;
|
||||
}
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
const Object *old_active_object = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
const bool success = lib_override_library_create_do(bmain,
|
||||
|
@ -1716,6 +1718,7 @@ static bool lib_override_library_resync(Main *bmain,
|
|||
|
||||
ID *id_root_reference = id_root->override_library->reference;
|
||||
ID *id;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
const Object *old_active_object = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
if (id_root_reference->tag & LIB_TAG_MISSING) {
|
||||
|
@ -2696,7 +2699,8 @@ void BKE_lib_override_library_main_resync(Main *bmain,
|
|||
/* Hide the collection from viewport and render. */
|
||||
override_resync_residual_storage->flag |= COLLECTION_HIDE_VIEWPORT | COLLECTION_HIDE_RENDER;
|
||||
}
|
||||
|
||||
/* BKE_collection_add above could have tagged the view_layer out of sync. */
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
const Object *old_active_object = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
/* Necessary to improve performances, and prevent layers matching override sub-collections to be
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
#include "BKE_geometry_set.hh"
|
||||
#include "BKE_idtype.h"
|
||||
#include "BKE_lattice.h"
|
||||
#include "BKE_layer.h"
|
||||
#include "BKE_lib_id.h"
|
||||
#include "BKE_lib_query.h"
|
||||
#include "BKE_material.h"
|
||||
|
@ -449,7 +450,8 @@ Object *BKE_mball_basis_find(Scene *scene, Object *object)
|
|||
BLI_split_name_num(basisname, &basisnr, object->id.name + 2, '.');
|
||||
|
||||
LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
Object *ob = base->object;
|
||||
if ((ob->type == OB_MBALL) && !(base->flag & BASE_FROM_DUPLI)) {
|
||||
if (ob != bob) {
|
||||
|
|
|
@ -2271,7 +2271,7 @@ static Object *object_add_common(
|
|||
}
|
||||
|
||||
Object *BKE_object_add(
|
||||
Main *bmain, const Scene *scene, ViewLayer *view_layer, int type, const char *name)
|
||||
Main *bmain, Scene *scene, ViewLayer *view_layer, int type, const char *name)
|
||||
{
|
||||
Object *ob = object_add_common(bmain, scene, view_layer, type, name);
|
||||
|
||||
|
@ -2280,6 +2280,7 @@ Object *BKE_object_add(
|
|||
|
||||
/* NOTE: There is no way to be sure that #BKE_collection_viewlayer_object_add will actually
|
||||
* manage to find a valid collection in given `view_layer` to add the new object to. */
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_base_find(view_layer, ob);
|
||||
if (base != nullptr) {
|
||||
BKE_view_layer_base_select_and_set_active(view_layer, base);
|
||||
|
@ -2294,6 +2295,7 @@ Object *BKE_object_add_from(
|
|||
Object *ob = object_add_common(bmain, scene, view_layer, type, name);
|
||||
BKE_collection_object_add_from(bmain, scene, ob_src, ob);
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_base_find(view_layer, ob);
|
||||
BKE_view_layer_base_select_and_set_active(view_layer, base);
|
||||
|
||||
|
@ -2322,6 +2324,7 @@ Object *BKE_object_add_for_data(Main *bmain,
|
|||
LayerCollection *layer_collection = BKE_layer_collection_get_active(view_layer);
|
||||
BKE_collection_object_add(bmain, layer_collection->collection, ob);
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_base_find(view_layer, ob);
|
||||
BKE_view_layer_base_select_and_set_active(view_layer, base);
|
||||
|
||||
|
@ -2538,12 +2541,13 @@ Object *BKE_object_pose_armature_get(Object *ob)
|
|||
}
|
||||
|
||||
Object *BKE_object_pose_armature_get_visible(Object *ob,
|
||||
const Scene *UNUSED(scene),
|
||||
const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
View3D *v3d)
|
||||
{
|
||||
Object *ob_armature = BKE_object_pose_armature_get(ob);
|
||||
if (ob_armature) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_base_find(view_layer, ob_armature);
|
||||
if (base) {
|
||||
if (BASE_VISIBLE(v3d, base)) {
|
||||
|
@ -2557,6 +2561,7 @@ Object *BKE_object_pose_armature_get_visible(Object *ob,
|
|||
Object **BKE_object_pose_array_get_ex(
|
||||
const Scene *scene, ViewLayer *view_layer, View3D *v3d, uint *r_objects_len, bool unique)
|
||||
{
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob_active = BKE_view_layer_active_object_get(view_layer);
|
||||
Object *ob_pose = BKE_object_pose_armature_get(ob_active);
|
||||
Object **objects = nullptr;
|
||||
|
@ -2597,7 +2602,8 @@ Object **BKE_object_pose_array_get(const Scene *scene,
|
|||
Base **BKE_object_pose_base_array_get_ex(
|
||||
const Scene *scene, ViewLayer *view_layer, View3D *v3d, uint *r_bases_len, bool unique)
|
||||
{
|
||||
Base *base_active = view_layer->basact;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base_active = BKE_view_layer_active_base_get(view_layer);
|
||||
Object *ob_pose = base_active ? BKE_object_pose_armature_get(base_active->object) : nullptr;
|
||||
Base *base_pose = nullptr;
|
||||
Base **bases = nullptr;
|
||||
|
@ -5154,7 +5160,7 @@ static void obrel_list_add(LinkNode **links, Object *ob)
|
|||
ob->id.tag |= LIB_TAG_DOIT;
|
||||
}
|
||||
|
||||
LinkNode *BKE_object_relational_superset(const Scene *UNUSED(scene),
|
||||
LinkNode *BKE_object_relational_superset(const Scene *scene,
|
||||
struct ViewLayer *view_layer,
|
||||
eObjectSet objectSet,
|
||||
eObRelationTypes includeFilter)
|
||||
|
@ -5162,12 +5168,13 @@ LinkNode *BKE_object_relational_superset(const Scene *UNUSED(scene),
|
|||
LinkNode *links = nullptr;
|
||||
|
||||
/* Remove markers from all objects */
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
base->object->id.tag &= ~LIB_TAG_DOIT;
|
||||
}
|
||||
|
||||
/* iterate over all selected and visible objects */
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if (objectSet == OB_SET_ALL) {
|
||||
/* as we get all anyways just add it */
|
||||
Object *ob = base->object;
|
||||
|
@ -5203,7 +5210,7 @@ LinkNode *BKE_object_relational_superset(const Scene *UNUSED(scene),
|
|||
|
||||
/* child relationship */
|
||||
if (includeFilter & (OB_REL_CHILDREN | OB_REL_CHILDREN_RECURSIVE)) {
|
||||
LISTBASE_FOREACH (Base *, local_base, &view_layer->object_bases) {
|
||||
LISTBASE_FOREACH (Base *, local_base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if (BASE_EDITABLE(((View3D *)nullptr), local_base)) {
|
||||
|
||||
Object *child = local_base->object;
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
#include "BKE_idtype.h"
|
||||
#include "BKE_image.h"
|
||||
#include "BKE_key.h"
|
||||
#include "BKE_layer.h"
|
||||
#include "BKE_lib_id.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_material.h"
|
||||
|
@ -447,9 +448,11 @@ Paint *BKE_paint_get_active(Scene *sce, ViewLayer *view_layer)
|
|||
{
|
||||
if (sce && view_layer) {
|
||||
ToolSettings *ts = sce->toolsettings;
|
||||
BKE_view_layer_synced_ensure(sce, view_layer);
|
||||
Object *actob = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
if (view_layer->basact && view_layer->basact->object) {
|
||||
switch (view_layer->basact->object->mode) {
|
||||
if (actob) {
|
||||
switch (actob->mode) {
|
||||
case OB_MODE_SCULPT:
|
||||
return &ts->sculpt->paint;
|
||||
case OB_MODE_VERTEX_PAINT:
|
||||
|
@ -490,11 +493,8 @@ Paint *BKE_paint_get_active_from_context(const bContext *C)
|
|||
|
||||
if (sce && view_layer) {
|
||||
ToolSettings *ts = sce->toolsettings;
|
||||
Object *obact = nullptr;
|
||||
|
||||
if (view_layer->basact && view_layer->basact->object) {
|
||||
obact = view_layer->basact->object;
|
||||
}
|
||||
BKE_view_layer_synced_ensure(sce, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
if ((sima = CTX_wm_space_image(C)) != nullptr) {
|
||||
if (obact && obact->mode == OB_MODE_EDIT) {
|
||||
|
@ -524,11 +524,8 @@ ePaintMode BKE_paintmode_get_active_from_context(const bContext *C)
|
|||
SpaceImage *sima;
|
||||
|
||||
if (sce && view_layer) {
|
||||
Object *obact = nullptr;
|
||||
|
||||
if (view_layer->basact && view_layer->basact->object) {
|
||||
obact = view_layer->basact->object;
|
||||
}
|
||||
BKE_view_layer_synced_ensure(sce, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
if ((sima = CTX_wm_space_image(C)) != nullptr) {
|
||||
if (obact && obact->mode == OB_MODE_EDIT) {
|
||||
|
|
|
@ -53,6 +53,7 @@
|
|||
#include "BKE_idtype.h"
|
||||
#include "BKE_key.h"
|
||||
#include "BKE_lattice.h"
|
||||
#include "BKE_layer.h"
|
||||
#include "BKE_lib_id.h"
|
||||
#include "BKE_lib_query.h"
|
||||
#include "BKE_main.h"
|
||||
|
@ -761,13 +762,15 @@ static PTCacheEdit *psys_orig_edit_get(ParticleSystem *psys)
|
|||
|
||||
bool psys_in_edit_mode(Depsgraph *depsgraph, const ParticleSystem *psys)
|
||||
{
|
||||
const ViewLayer *view_layer = DEG_get_input_view_layer(depsgraph);
|
||||
if (view_layer->basact == NULL) {
|
||||
const Scene *scene = DEG_get_input_scene(depsgraph);
|
||||
ViewLayer *view_layer = DEG_get_input_view_layer(depsgraph);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
const Object *object = BKE_view_layer_active_object_get(view_layer);
|
||||
if (object == NULL) {
|
||||
/* TODO(sergey): Needs double-check with multi-object edit. */
|
||||
return false;
|
||||
}
|
||||
const bool use_render_params = (DEG_get_mode(depsgraph) == DAG_EVAL_RENDER);
|
||||
const Object *object = view_layer->basact->object;
|
||||
if (object->mode != OB_MODE_PARTICLE_EDIT) {
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -1664,7 +1664,9 @@ static void rigidbody_update_sim_ob(Depsgraph *depsgraph, Object *ob, RigidBodyO
|
|||
return;
|
||||
}
|
||||
|
||||
const Scene *scene = DEG_get_input_scene(depsgraph);
|
||||
ViewLayer *view_layer = DEG_get_input_view_layer(depsgraph);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_base_find(view_layer, ob);
|
||||
const bool is_selected = base ? (base->flag & BASE_SELECTED) != 0 : false;
|
||||
|
||||
|
@ -2008,7 +2010,9 @@ static void rigidbody_free_substep_data(ListBase *substep_targets)
|
|||
}
|
||||
static void rigidbody_update_simulation_post_step(Depsgraph *depsgraph, RigidBodyWorld *rbw)
|
||||
{
|
||||
const Scene *scene = DEG_get_input_scene(depsgraph);
|
||||
ViewLayer *view_layer = DEG_get_input_view_layer(depsgraph);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
|
||||
FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN (rbw->group, ob) {
|
||||
Base *base = BKE_view_layer_base_find(view_layer, ob);
|
||||
|
|
|
@ -803,8 +803,8 @@ static void scene_foreach_id(ID *id, LibraryForeachIDData *data)
|
|||
|
||||
LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
|
||||
BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, view_layer->mat_override, IDWALK_CB_USER);
|
||||
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
BKE_LIB_FOREACHID_PROCESS_IDSUPER(
|
||||
data, base->object, IDWALK_CB_NOP | IDWALK_CB_OVERRIDE_LIBRARY_NOT_OVERRIDABLE);
|
||||
}
|
||||
|
@ -2050,7 +2050,8 @@ Scene *BKE_scene_add(Main *bmain, const char *name)
|
|||
bool BKE_scene_object_find(Scene *scene, Object *ob)
|
||||
{
|
||||
LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
|
||||
if (BLI_findptr(&view_layer->object_bases, ob, offsetof(Base, object))) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (BLI_findptr(BKE_view_layer_object_bases_get(view_layer), ob, offsetof(Base, object))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -2060,7 +2061,8 @@ bool BKE_scene_object_find(Scene *scene, Object *ob)
|
|||
Object *BKE_scene_object_find_by_name(const Scene *scene, const char *name)
|
||||
{
|
||||
LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if (STREQ(base->object->id.name + 2, name)) {
|
||||
return base->object;
|
||||
}
|
||||
|
@ -2081,7 +2083,8 @@ void BKE_scene_set_background(Main *bmain, Scene *scene)
|
|||
|
||||
/* copy layers and flags from bases to objects */
|
||||
LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
/* collection patch... */
|
||||
BKE_scene_object_base_flag_sync_from_base(base);
|
||||
}
|
||||
|
@ -2124,7 +2127,8 @@ int BKE_scene_base_iter_next(
|
|||
if (iter->phase == F_START) {
|
||||
ViewLayer *view_layer = (depsgraph) ? DEG_get_evaluated_view_layer(depsgraph) :
|
||||
BKE_view_layer_context_active_PLACEHOLDER(*scene);
|
||||
*base = static_cast<Base *>(view_layer->object_bases.first);
|
||||
BKE_view_layer_synced_ensure(*scene, view_layer);
|
||||
*base = static_cast<Base *>(BKE_view_layer_object_bases_get(view_layer)->first);
|
||||
if (*base) {
|
||||
*ob = (*base)->object;
|
||||
iter->phase = F_SCENE;
|
||||
|
@ -2134,8 +2138,10 @@ int BKE_scene_base_iter_next(
|
|||
while ((*scene)->set) {
|
||||
(*scene) = (*scene)->set;
|
||||
ViewLayer *view_layer_set = BKE_view_layer_default_render(*scene);
|
||||
if (view_layer_set->object_bases.first) {
|
||||
*base = static_cast<Base *>(view_layer_set->object_bases.first);
|
||||
BKE_view_layer_synced_ensure(*scene, view_layer_set);
|
||||
ListBase *object_bases = BKE_view_layer_object_bases_get(view_layer_set);
|
||||
if (object_bases->first) {
|
||||
*base = static_cast<Base *>(object_bases->first);
|
||||
*ob = (*base)->object;
|
||||
iter->phase = F_SCENE;
|
||||
break;
|
||||
|
@ -2155,8 +2161,10 @@ int BKE_scene_base_iter_next(
|
|||
while ((*scene)->set) {
|
||||
(*scene) = (*scene)->set;
|
||||
ViewLayer *view_layer_set = BKE_view_layer_default_render(*scene);
|
||||
if (view_layer_set->object_bases.first) {
|
||||
*base = static_cast<Base *>(view_layer_set->object_bases.first);
|
||||
BKE_view_layer_synced_ensure(*scene, view_layer_set);
|
||||
ListBase *object_bases = BKE_view_layer_object_bases_get(view_layer_set);
|
||||
if (object_bases->first) {
|
||||
*base = static_cast<Base *>(object_bases->first);
|
||||
*ob = (*base)->object;
|
||||
break;
|
||||
}
|
||||
|
@ -2505,7 +2513,9 @@ static bool check_rendered_viewport_visible(Main *bmain)
|
|||
|
||||
/* TODO(@campbellbarton): shouldn't we be able to use 'DEG_get_view_layer' here?
|
||||
* Currently this is nullptr on load, so don't. */
|
||||
static void prepare_mesh_for_viewport_render(Main *bmain, const ViewLayer *view_layer)
|
||||
static void prepare_mesh_for_viewport_render(Main *bmain,
|
||||
const Scene *scene,
|
||||
ViewLayer *view_layer)
|
||||
{
|
||||
/* This is needed to prepare mesh to be used by the render
|
||||
* engine from the viewport rendering. We do loading here
|
||||
|
@ -2515,7 +2525,7 @@ static void prepare_mesh_for_viewport_render(Main *bmain, const ViewLayer *view_
|
|||
* This makes it so viewport render engine doesn't need to
|
||||
* call loading of the edit data for the mesh objects.
|
||||
*/
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
if (obedit) {
|
||||
Mesh *mesh = static_cast<Mesh *>(obedit->data);
|
||||
|
@ -2592,7 +2602,7 @@ static void scene_graph_update_tagged(Depsgraph *depsgraph, Main *bmain, bool on
|
|||
/* Uncomment this to check if graph was properly tagged for update. */
|
||||
// DEG_debug_graph_relations_validate(depsgraph, bmain, scene);
|
||||
/* Flush editing data if needed. */
|
||||
prepare_mesh_for_viewport_render(bmain, view_layer);
|
||||
prepare_mesh_for_viewport_render(bmain, scene, view_layer);
|
||||
/* Update all objects: drivers, matrices, etc. flags set
|
||||
* by depsgraph or manual, no layer check here, gets correct flushed. */
|
||||
DEG_evaluate_on_refresh(depsgraph);
|
||||
|
@ -2810,8 +2820,10 @@ Base *_setlooper_base_step(Scene **sce_iter, ViewLayer *view_layer, Base *base)
|
|||
if ((base == nullptr) && (view_layer != nullptr)) {
|
||||
/* First time looping, return the scenes first base. */
|
||||
/* For the first loop we should get the layer from workspace when available. */
|
||||
if (view_layer->object_bases.first) {
|
||||
return (Base *)view_layer->object_bases.first;
|
||||
BKE_view_layer_synced_ensure(*sce_iter, view_layer);
|
||||
ListBase *object_bases = BKE_view_layer_object_bases_get(view_layer);
|
||||
if (object_bases->first) {
|
||||
return static_cast<Base *>(object_bases->first);
|
||||
}
|
||||
/* No base on this scene layer. */
|
||||
goto next_set;
|
||||
|
@ -2821,7 +2833,7 @@ Base *_setlooper_base_step(Scene **sce_iter, ViewLayer *view_layer, Base *base)
|
|||
/* Reached the end, get the next base in the set. */
|
||||
while ((*sce_iter = (*sce_iter)->set)) {
|
||||
ViewLayer *view_layer_set = BKE_view_layer_default_render(*sce_iter);
|
||||
base = (Base *)view_layer_set->object_bases.first;
|
||||
base = (Base *)BKE_view_layer_object_bases_get(view_layer_set)->first;
|
||||
|
||||
if (base) {
|
||||
return base;
|
||||
|
@ -2880,13 +2892,11 @@ bool BKE_scene_uses_cycles_experimental_features(Scene *scene)
|
|||
return RNA_enum_get(&cycles_ptr, "feature_set") == CYCLES_FEATURES_EXPERIMENTAL;
|
||||
}
|
||||
|
||||
void BKE_scene_base_flag_to_objects(const Scene *UNUSED(scene), ViewLayer *view_layer)
|
||||
void BKE_scene_base_flag_to_objects(const Scene *scene, ViewLayer *view_layer)
|
||||
{
|
||||
Base *base = static_cast<Base *>(view_layer->object_bases.first);
|
||||
|
||||
while (base) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
BKE_scene_object_base_flag_sync_from_base(base);
|
||||
base = base->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -512,12 +512,13 @@ static void do_version_layers_to_collections(Main *bmain, Scene *scene)
|
|||
}
|
||||
}
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
/* for convenience set the same active object in all the layers */
|
||||
if (scene->basact) {
|
||||
view_layer->basact = BKE_view_layer_base_find(view_layer, scene->basact->object);
|
||||
}
|
||||
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if ((base->flag & BASE_SELECTABLE) && (base->object->flag & SELECT)) {
|
||||
base->flag |= BASE_SELECTED;
|
||||
}
|
||||
|
@ -537,13 +538,14 @@ static void do_version_layers_to_collections(Main *bmain, Scene *scene)
|
|||
view_layer->flag &= ~VIEW_LAYER_RENDER;
|
||||
}
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
/* convert active base */
|
||||
if (scene->basact) {
|
||||
view_layer->basact = BKE_view_layer_base_find(view_layer, scene->basact->object);
|
||||
}
|
||||
|
||||
/* convert selected bases */
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if ((base->flag & BASE_SELECTABLE) && (base->object->flag & SELECT)) {
|
||||
base->flag |= BASE_SELECTED;
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include "BKE_global.h"
|
||||
#include "BKE_idtype.h"
|
||||
#include "BKE_image.h"
|
||||
#include "BKE_layer.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_mball_tessellate.h"
|
||||
#include "BKE_modifier.h"
|
||||
|
@ -125,6 +126,13 @@ bool BlendfileLoadingBaseTest::blendfile_load(const char *filepath)
|
|||
<< test_assets_dir << "'";
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Make sure that all view_layers in the file are synced. Depsgraph can make a copy of the whole
|
||||
* scene, which will fail when one view layer isn't synced. */
|
||||
LISTBASE_FOREACH (ViewLayer *, view_layer, &bfile->curscene->view_layers) {
|
||||
BKE_view_layer_synced_ensure(bfile->curscene, view_layer);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -2125,9 +2125,10 @@ void DepsgraphNodeBuilder::build_scene_audio(Scene *scene)
|
|||
});
|
||||
}
|
||||
|
||||
void DepsgraphNodeBuilder::build_scene_speakers(Scene * /*scene*/, ViewLayer *view_layer)
|
||||
void DepsgraphNodeBuilder::build_scene_speakers(Scene *scene, ViewLayer *view_layer)
|
||||
{
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
Object *object = base->object;
|
||||
if (object->type != OB_SPEAKER || !need_pull_base_into_graph(base)) {
|
||||
continue;
|
||||
|
|
|
@ -90,7 +90,8 @@ void DepsgraphNodeBuilder::build_view_layer(Scene *scene,
|
|||
* but object is expected to be an original one. Hence we go into some
|
||||
* tricks here iterating over the view layer. */
|
||||
int base_index = 0;
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
/* object itself */
|
||||
if (!need_pull_base_into_graph(base)) {
|
||||
continue;
|
||||
|
|
|
@ -3050,9 +3050,10 @@ void DepsgraphRelationBuilder::build_scene_audio(Scene *scene)
|
|||
}
|
||||
}
|
||||
|
||||
void DepsgraphRelationBuilder::build_scene_speakers(Scene * /*scene*/, ViewLayer *view_layer)
|
||||
void DepsgraphRelationBuilder::build_scene_speakers(Scene *scene, ViewLayer *view_layer)
|
||||
{
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
Object *object = base->object;
|
||||
if (object->type != OB_SPEAKER || !need_pull_base_into_graph(base)) {
|
||||
continue;
|
||||
|
|
|
@ -75,11 +75,12 @@ void DepsgraphRelationBuilder::build_view_layer(Scene *scene,
|
|||
{
|
||||
/* Setup currently building context. */
|
||||
scene_ = scene;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
/* Scene objects. */
|
||||
/* NOTE: Nodes builder requires us to pass CoW base because it's being
|
||||
* passed to the evaluation functions. During relations builder we only
|
||||
* do nullptr-pointer check of the base, so it's fine to pass original one. */
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if (need_pull_base_into_graph(base)) {
|
||||
build_object_from_view_layer_base(base->object);
|
||||
}
|
||||
|
|
|
@ -414,13 +414,16 @@ void scene_remove_all_bases(Scene *scene_cow)
|
|||
|
||||
/* Makes it so given view layer only has bases corresponding to enabled
|
||||
* objects. */
|
||||
void view_layer_remove_disabled_bases(const Depsgraph *depsgraph, ViewLayer *view_layer)
|
||||
void view_layer_remove_disabled_bases(const Depsgraph *depsgraph,
|
||||
const Scene *scene,
|
||||
ViewLayer *view_layer)
|
||||
{
|
||||
if (view_layer == nullptr) {
|
||||
return;
|
||||
}
|
||||
ListBase enabled_bases = {nullptr, nullptr};
|
||||
LISTBASE_FOREACH_MUTABLE (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH_MUTABLE (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
/* TODO(sergey): Would be cool to optimize this somehow, or make it so
|
||||
* builder tags bases.
|
||||
*
|
||||
|
@ -479,7 +482,7 @@ void scene_setup_view_layers_after_remap(const Depsgraph *depsgraph,
|
|||
const ViewLayer *view_layer_orig = get_original_view_layer(depsgraph, id_node);
|
||||
ViewLayer *view_layer_eval = reinterpret_cast<ViewLayer *>(scene_cow->view_layers.first);
|
||||
view_layer_update_orig_base_pointers(view_layer_orig, view_layer_eval);
|
||||
view_layer_remove_disabled_bases(depsgraph, view_layer_eval);
|
||||
view_layer_remove_disabled_bases(depsgraph, scene_cow, view_layer_eval);
|
||||
/* TODO(sergey): Remove objects from collections as well.
|
||||
* Not a HUGE deal for now, nobody is looking into those CURRENTLY.
|
||||
* Still not an excuse to have those. */
|
||||
|
|
|
@ -1485,10 +1485,11 @@ static void OVERLAY_volume_extra(OVERLAY_ExtraCallBuffers *cb,
|
|||
static void OVERLAY_object_center(OVERLAY_ExtraCallBuffers *cb,
|
||||
Object *ob,
|
||||
OVERLAY_PrivateData *pd,
|
||||
const Scene *scene,
|
||||
ViewLayer *view_layer)
|
||||
{
|
||||
const bool is_library = ID_REAL_USERS(&ob->id) > 1 || ID_IS_LINKED(ob);
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (ob == BKE_view_layer_active_object_get(view_layer)) {
|
||||
DRW_buffer_add_entry(cb->center_active, ob->obmat[3]);
|
||||
}
|
||||
|
@ -1573,7 +1574,7 @@ void OVERLAY_extra_cache_populate(OVERLAY_Data *vedata, Object *ob)
|
|||
/* don't show object extras in set's */
|
||||
if (!from_dupli) {
|
||||
if (draw_obcenters) {
|
||||
OVERLAY_object_center(cb, ob, pd, view_layer);
|
||||
OVERLAY_object_center(cb, ob, pd, scene, view_layer);
|
||||
}
|
||||
if (draw_relations) {
|
||||
OVERLAY_relationship_lines(cb, draw_ctx->depsgraph, draw_ctx->scene, ob);
|
||||
|
|
|
@ -280,10 +280,11 @@ int DRW_object_wire_theme_get(Object *ob, ViewLayer *view_layer, float **r_color
|
|||
{
|
||||
const DRWContextState *draw_ctx = DRW_context_state_get();
|
||||
const bool is_edit = (draw_ctx->object_mode & OB_MODE_EDIT) && (ob->mode & OB_MODE_EDIT);
|
||||
const bool active = view_layer->basact &&
|
||||
((ob->base_flag & BASE_FROM_DUPLI) ?
|
||||
(DRW_object_get_dupli_parent(ob) == view_layer->basact->object) :
|
||||
(view_layer->basact->object == ob));
|
||||
BKE_view_layer_synced_ensure(draw_ctx->scene, view_layer);
|
||||
const Base *base = BKE_view_layer_active_base_get(view_layer);
|
||||
const bool active = base && ((ob->base_flag & BASE_FROM_DUPLI) ?
|
||||
(DRW_object_get_dupli_parent(ob) == base->object) :
|
||||
(base->object == ob));
|
||||
|
||||
/* confusing logic here, there are 2 methods of setting the color
|
||||
* 'colortab[colindex]' and 'theme_id', colindex overrides theme_id.
|
||||
|
|
|
@ -1324,6 +1324,7 @@ void DRW_notify_view_update(const DRWUpdateContext *update_ctx)
|
|||
/* Reset before using it. */
|
||||
drw_state_prepare_clean_for_draw(&DST);
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
DST.draw_ctx = (DRWContextState){
|
||||
.region = region,
|
||||
.rv3d = rv3d,
|
||||
|
@ -1377,6 +1378,7 @@ static void drw_notify_view_update_offscreen(struct Depsgraph *depsgraph,
|
|||
/* Reset before using it. */
|
||||
drw_state_prepare_clean_for_draw(&DST);
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
DST.draw_ctx = (DRWContextState){
|
||||
.region = region,
|
||||
.rv3d = rv3d,
|
||||
|
@ -1629,6 +1631,7 @@ void DRW_draw_render_loop_ex(struct Depsgraph *depsgraph,
|
|||
ViewLayer *view_layer = DEG_get_evaluated_view_layer(depsgraph);
|
||||
RegionView3D *rv3d = region->regiondata;
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
DST.draw_ctx.evil_C = evil_C;
|
||||
DST.draw_ctx = (DRWContextState){
|
||||
.region = region,
|
||||
|
@ -2143,6 +2146,7 @@ void DRW_draw_render_loop_2d_ex(struct Depsgraph *depsgraph,
|
|||
Scene *scene = DEG_get_evaluated_scene(depsgraph);
|
||||
ViewLayer *view_layer = DEG_get_evaluated_view_layer(depsgraph);
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
DST.draw_ctx.evil_C = evil_C;
|
||||
DST.draw_ctx = (DRWContextState){
|
||||
.region = region,
|
||||
|
@ -2349,6 +2353,8 @@ void DRW_draw_select_loop(struct Depsgraph *depsgraph,
|
|||
Scene *scene = DEG_get_evaluated_scene(depsgraph);
|
||||
RenderEngineType *engine_type = ED_view3d_engine_type(scene, v3d->shading.type);
|
||||
ViewLayer *view_layer = DEG_get_evaluated_view_layer(depsgraph);
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
Object *obedit = use_obedit_skip ? NULL : OBEDIT_FROM_OBACT(obact);
|
||||
#ifndef USE_GPU_SELECT
|
||||
|
@ -2580,6 +2586,7 @@ static void drw_draw_depth_loop_impl(struct Depsgraph *depsgraph,
|
|||
DST.options.is_depth = true;
|
||||
|
||||
/* Instead of 'DRW_context_state_init(C, &DST.draw_ctx)', assign from args */
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
DST.draw_ctx = (DRWContextState){
|
||||
.region = region,
|
||||
.rv3d = rv3d,
|
||||
|
@ -2713,6 +2720,7 @@ void DRW_draw_select_id(Depsgraph *depsgraph, ARegion *region, View3D *v3d, cons
|
|||
drw_state_prepare_clean_for_draw(&DST);
|
||||
|
||||
/* Instead of 'DRW_context_state_init(C, &DST.draw_ctx)', assign from args */
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
DST.draw_ctx = (DRWContextState){
|
||||
.region = region,
|
||||
.rv3d = region->regiondata,
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include "BKE_fcurve.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_gpencil.h"
|
||||
#include "BKE_layer.h"
|
||||
#include "BKE_lib_id.h"
|
||||
#include "BKE_mask.h"
|
||||
#include "BKE_nla.h"
|
||||
|
@ -2953,6 +2954,7 @@ static int click_select_channel_object(bContext *C,
|
|||
bAnimListElem *ale,
|
||||
const short /* eEditKeyframes_Select or -1 */ selectmode)
|
||||
{
|
||||
Scene *scene = ac->scene;
|
||||
ViewLayer *view_layer = ac->view_layer;
|
||||
Base *base = (Base *)ale->data;
|
||||
Object *ob = base->object;
|
||||
|
@ -2971,11 +2973,10 @@ static int click_select_channel_object(bContext *C,
|
|||
}
|
||||
}
|
||||
else {
|
||||
Base *b;
|
||||
|
||||
/* deselect all */
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
/* TODO: should this deselect all other types of channels too? */
|
||||
for (b = view_layer->object_bases.first; b; b = b->next) {
|
||||
LISTBASE_FOREACH (Base *, b, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
ED_object_base_select(b, BA_DESELECT);
|
||||
if (b->object->adt) {
|
||||
b->object->adt->flag &= ~(ADT_UI_SELECTED | ADT_UI_ACTIVE);
|
||||
|
|
|
@ -118,10 +118,12 @@ static void animedit_get_yscale_factor(bAnimContext *ac)
|
|||
/* NOTE: there's a similar function in key.c #BKE_key_from_object. */
|
||||
static Key *actedit_get_shapekeys(bAnimContext *ac)
|
||||
{
|
||||
Scene *scene = ac->scene;
|
||||
ViewLayer *view_layer = ac->view_layer;
|
||||
Object *ob;
|
||||
Key *key;
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
ob = BKE_view_layer_active_object_get(view_layer);
|
||||
if (ob == NULL) {
|
||||
return NULL;
|
||||
|
@ -393,12 +395,13 @@ bool ANIM_animdata_get_context(const bContext *C, bAnimContext *ac)
|
|||
/* get useful default context settings from context */
|
||||
ac->bmain = bmain;
|
||||
ac->scene = scene;
|
||||
ac->view_layer = CTX_data_view_layer(C);
|
||||
if (scene) {
|
||||
ac->markers = ED_context_get_markers(C);
|
||||
BKE_view_layer_synced_ensure(ac->scene, ac->view_layer);
|
||||
}
|
||||
ac->view_layer = CTX_data_view_layer(C);
|
||||
ac->depsgraph = CTX_data_depsgraph_pointer(C);
|
||||
ac->obact = (ac->view_layer->basact) ? ac->view_layer->basact->object : NULL;
|
||||
ac->obact = BKE_view_layer_active_object_get(ac->view_layer);
|
||||
ac->area = area;
|
||||
ac->region = region;
|
||||
ac->sl = sl;
|
||||
|
@ -1846,8 +1849,8 @@ static size_t animdata_filter_gpencil(bAnimContext *ac,
|
|||
bDopeSheet *ads = ac->ads;
|
||||
size_t items = 0;
|
||||
|
||||
Scene *scene = ac->scene;
|
||||
ViewLayer *view_layer = (ViewLayer *)ac->view_layer;
|
||||
Base *base;
|
||||
|
||||
/* Include all annotation datablocks. */
|
||||
if (((ads->filterflag & ADS_FILTER_ONLYSEL) == 0) ||
|
||||
|
@ -1859,7 +1862,8 @@ static size_t animdata_filter_gpencil(bAnimContext *ac,
|
|||
}
|
||||
}
|
||||
/* Objects in the scene */
|
||||
for (base = view_layer->object_bases.first; base; base = base->next) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
/* Only consider this object if it has got some GP data (saving on all the other tests) */
|
||||
if (base->object && (base->object->type == OB_GPENCIL)) {
|
||||
Object *ob = base->object;
|
||||
|
@ -3170,16 +3174,19 @@ static int ds_base_sorting_cmp(const void *base1_ptr, const void *base2_ptr)
|
|||
|
||||
/* Get a sorted list of all the bases - for inclusion in dopesheet (when drawing channels) */
|
||||
static Base **animdata_filter_ds_sorted_bases(bDopeSheet *ads,
|
||||
const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
int filter_mode,
|
||||
size_t *r_usable_bases)
|
||||
{
|
||||
/* Create an array with space for all the bases, but only containing the usable ones */
|
||||
size_t tot_bases = BLI_listbase_count(&view_layer->object_bases);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
ListBase *object_bases = BKE_view_layer_object_bases_get(view_layer);
|
||||
size_t tot_bases = BLI_listbase_count(object_bases);
|
||||
size_t num_bases = 0;
|
||||
|
||||
Base **sorted_bases = MEM_mallocN(sizeof(Base *) * tot_bases, "Dopesheet Usable Sorted Bases");
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
LISTBASE_FOREACH (Base *, base, object_bases) {
|
||||
if (animdata_filter_base_is_ok(ads, base, OB_MODE_OBJECT, filter_mode)) {
|
||||
sorted_bases[num_bases++] = base;
|
||||
}
|
||||
|
@ -3249,14 +3256,17 @@ static size_t animdata_filter_dopesheet(bAnimContext *ac,
|
|||
* - Don't do this if this behavior has been turned off (i.e. due to it being too slow)
|
||||
* - Don't do this if there's just a single object
|
||||
*/
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
ListBase *object_bases = BKE_view_layer_object_bases_get(view_layer);
|
||||
if ((filter_mode & ANIMFILTER_LIST_CHANNELS) && !(ads->flag & ADS_FLAG_NO_DB_SORT) &&
|
||||
(view_layer->object_bases.first != view_layer->object_bases.last)) {
|
||||
(object_bases->first != object_bases->last)) {
|
||||
/* Filter list of bases (i.e. objects), sort them, then add their contents normally... */
|
||||
/* TODO: Cache the old sorted order - if the set of bases hasn't changed, don't re-sort... */
|
||||
Base **sorted_bases;
|
||||
size_t num_bases;
|
||||
|
||||
sorted_bases = animdata_filter_ds_sorted_bases(ads, view_layer, filter_mode, &num_bases);
|
||||
sorted_bases = animdata_filter_ds_sorted_bases(
|
||||
ads, scene, view_layer, filter_mode, &num_bases);
|
||||
if (sorted_bases) {
|
||||
/* Add the necessary channels for these bases... */
|
||||
for (size_t i = 0; i < num_bases; i++) {
|
||||
|
@ -3275,7 +3285,7 @@ static size_t animdata_filter_dopesheet(bAnimContext *ac,
|
|||
*/
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
const eObjectMode object_mode = obact ? obact->mode : OB_MODE_OBJECT;
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
LISTBASE_FOREACH (Base *, base, object_bases) {
|
||||
if (animdata_filter_base_is_ok(ads, base, object_mode, filter_mode)) {
|
||||
/* since we're still here, this object should be usable */
|
||||
items += animdata_filter_dopesheet_ob(ac, anim_data, ads, base, filter_mode);
|
||||
|
|
|
@ -1291,6 +1291,7 @@ static void select_marker_camera_switch(
|
|||
}
|
||||
}
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
for (marker = markers->first; marker; marker = marker->next) {
|
||||
if (marker->camera) {
|
||||
if (marker->frame == cfra) {
|
||||
|
|
|
@ -1103,7 +1103,8 @@ bool ED_armature_edit_select_pick_bone(bContext *C,
|
|||
arm->act_edbone = ebone;
|
||||
}
|
||||
|
||||
if (view_layer->basact != basact) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (BKE_view_layer_active_base_get(view_layer) != basact) {
|
||||
ED_object_base_activate(C, basact);
|
||||
}
|
||||
|
||||
|
|
|
@ -97,7 +97,9 @@ static void undoarm_free_data(UndoArmature *uarm)
|
|||
|
||||
static Object *editarm_object_from_context(bContext *C)
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
if (obedit && obedit->type == OB_ARMATURE) {
|
||||
bArmature *arm = obedit->data;
|
||||
|
|
|
@ -121,7 +121,7 @@ void ED_pose_bone_select(Object *ob, bPoseChannel *pchan, bool select)
|
|||
}
|
||||
}
|
||||
|
||||
bool ED_armature_pose_select_pick_bone(const Scene *UNUSED(scene),
|
||||
bool ED_armature_pose_select_pick_bone(const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
View3D *v3d,
|
||||
Object *ob,
|
||||
|
@ -159,6 +159,7 @@ bool ED_armature_pose_select_pick_bone(const Scene *UNUSED(scene),
|
|||
}
|
||||
|
||||
if (found) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob_act = BKE_view_layer_active_object_get(view_layer);
|
||||
BLI_assert(BKE_view_layer_edit_object_get(view_layer) == NULL);
|
||||
|
||||
|
@ -268,11 +269,12 @@ bool ED_armature_pose_select_pick_with_buffer(const Scene *scene,
|
|||
return ED_armature_pose_select_pick_bone(scene, view_layer, v3d, ob, nearBone, params);
|
||||
}
|
||||
|
||||
void ED_armature_pose_select_in_wpaint_mode(const Scene *UNUSED(scene),
|
||||
void ED_armature_pose_select_in_wpaint_mode(const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
Base *base_select)
|
||||
{
|
||||
BLI_assert(base_select && (base_select->object->type == OB_ARMATURE));
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob_active = BKE_view_layer_active_object_get(view_layer);
|
||||
BLI_assert(ob_active && (ob_active->mode & OB_MODE_ALL_WEIGHT_PAINT));
|
||||
|
||||
|
|
|
@ -4960,7 +4960,8 @@ bool ED_curve_editnurb_select_pick(bContext *C,
|
|||
WM_event_add_notifier(C, NC_MATERIAL | ND_SHADING_LINKS, NULL);
|
||||
}
|
||||
|
||||
if (vc.view_layer->basact != basact) {
|
||||
BKE_view_layer_synced_ensure(vc.scene, vc.view_layer);
|
||||
if (BKE_view_layer_active_base_get(vc.view_layer) != basact) {
|
||||
ED_object_base_activate(C, basact);
|
||||
}
|
||||
|
||||
|
|
|
@ -496,6 +496,7 @@ static int curvesurf_prim_add(bContext *C, wmOperator *op, int type, int isSurf)
|
|||
struct Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
ListBase *editnurb;
|
||||
Nurb *nu;
|
||||
|
|
|
@ -2049,7 +2049,8 @@ static int edcu_shortest_path_pick_invoke(bContext *C, wmOperator *op, const wmE
|
|||
|
||||
BKE_curve_nurb_vert_active_set(cu, nu_dst, vert_dst_p);
|
||||
|
||||
if (vc.view_layer->basact != basact) {
|
||||
BKE_view_layer_synced_ensure(vc.scene, vc.view_layer);
|
||||
if (BKE_view_layer_active_base_get(vc.view_layer) != basact) {
|
||||
ED_object_base_activate(C, basact);
|
||||
}
|
||||
|
||||
|
|
|
@ -160,7 +160,9 @@ static void undocurve_free_data(UndoCurve *uc)
|
|||
|
||||
static Object *editcurve_object_from_context(bContext *C)
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
if (obedit && ELEM(obedit->type, OB_CURVES_LEGACY, OB_SURF)) {
|
||||
Curve *cu = obedit->data;
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
|
||||
#include "BKE_context.h"
|
||||
#include "BKE_curve.h"
|
||||
#include "BKE_layer.h"
|
||||
#include "BKE_lib_id.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_object.h"
|
||||
|
@ -619,7 +620,7 @@ static void txt_add_object(bContext *C,
|
|||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
Curve *cu;
|
||||
Object *obedit;
|
||||
Base *base;
|
||||
Object *object;
|
||||
const struct TextLine *tmp;
|
||||
int nchars = 0, nbytes = 0;
|
||||
char *s;
|
||||
|
@ -627,10 +628,11 @@ static void txt_add_object(bContext *C,
|
|||
const float rot[3] = {0.0f, 0.0f, 0.0f};
|
||||
|
||||
obedit = BKE_object_add(bmain, scene, view_layer, OB_FONT, NULL);
|
||||
base = view_layer->basact;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
object = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
/* seems to assume view align ? TODO: look into this, could be an operator option. */
|
||||
ED_object_base_init_transform_on_add(base->object, NULL, rot);
|
||||
ED_object_base_init_transform_on_add(object, NULL, rot);
|
||||
|
||||
BKE_object_where_is_calc(depsgraph, scene, obedit);
|
||||
|
||||
|
|
|
@ -308,7 +308,9 @@ static void undofont_free_data(UndoFont *uf)
|
|||
|
||||
static Object *editfont_object_from_context(bContext *C)
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
if (obedit && obedit->type == OB_FONT) {
|
||||
Curve *cu = obedit->data;
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include "BKE_deform.h"
|
||||
#include "BKE_gpencil.h"
|
||||
#include "BKE_gpencil_modifier.h"
|
||||
#include "BKE_layer.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_object_deform.h"
|
||||
#include "BKE_report.h"
|
||||
|
@ -528,6 +529,7 @@ static bool gpencil_generate_weights_poll(bContext *C)
|
|||
return false;
|
||||
}
|
||||
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
bGPdata *gpd = (bGPdata *)ob->data;
|
||||
|
||||
|
@ -536,7 +538,8 @@ static bool gpencil_generate_weights_poll(bContext *C)
|
|||
}
|
||||
|
||||
/* need some armature in the view layer */
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if (base->object->type == OB_ARMATURE) {
|
||||
return true;
|
||||
}
|
||||
|
@ -548,6 +551,7 @@ static bool gpencil_generate_weights_poll(bContext *C)
|
|||
static int gpencil_generate_weights_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
Object *ob = CTX_data_active_object(C);
|
||||
Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
|
||||
|
@ -566,7 +570,8 @@ static int gpencil_generate_weights_exec(bContext *C, wmOperator *op)
|
|||
/* get armature */
|
||||
const int arm_idx = RNA_enum_get(op->ptr, "armature");
|
||||
if (arm_idx > 0) {
|
||||
Base *base = BLI_findlink(&view_layer->object_bases, arm_idx - 1);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BLI_findlink(BKE_view_layer_object_bases_get(view_layer), arm_idx - 1);
|
||||
ob_arm = base->object;
|
||||
}
|
||||
else {
|
||||
|
@ -607,6 +612,7 @@ static const EnumPropertyItem *gpencil_armatures_enum_itemf(bContext *C,
|
|||
PropertyRNA *UNUSED(prop),
|
||||
bool *r_free)
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
EnumPropertyItem *item = NULL, item_tmp = {0};
|
||||
int totitem = 0;
|
||||
|
@ -623,7 +629,8 @@ static const EnumPropertyItem *gpencil_armatures_enum_itemf(bContext *C,
|
|||
RNA_enum_item_add(&item, &totitem, &item_tmp);
|
||||
i++;
|
||||
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
Object *ob = base->object;
|
||||
if (ob->type == OB_ARMATURE) {
|
||||
item_tmp.identifier = item_tmp.name = ob->id.name + 2;
|
||||
|
|
|
@ -1303,6 +1303,7 @@ static void gpencil_layer_to_curve(bContext *C,
|
|||
ob = BKE_object_add_only_object(bmain, OB_CURVES_LEGACY, gpl->info);
|
||||
cu = ob->data = BKE_curve_add(bmain, gpl->info, OB_CURVES_LEGACY);
|
||||
BKE_collection_object_add(bmain, collection, ob);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
base_new = BKE_view_layer_base_find(view_layer, ob);
|
||||
DEG_relations_tag_update(bmain); /* added object */
|
||||
|
||||
|
|
|
@ -939,6 +939,7 @@ static int override_idtemplate_clear_exec(bContext *C, wmOperator *UNUSED(op))
|
|||
if (BKE_lib_override_library_is_hierarchy_leaf(bmain, id)) {
|
||||
id_new = id->override_library->reference;
|
||||
bool do_remap_active = false;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (BKE_view_layer_active_object_get(view_layer) == (Object *)id) {
|
||||
BLI_assert(GS(id->name) == ID_OB);
|
||||
BLI_assert(GS(id_new->name) == ID_OB);
|
||||
|
@ -1507,6 +1508,7 @@ static bool jump_to_target_ptr(bContext *C, PointerRNA ptr, const bool poll)
|
|||
Base *base = nullptr;
|
||||
const short id_type = GS(ptr.owner_id->name);
|
||||
if (id_type == ID_OB) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
base = BKE_view_layer_base_find(view_layer, (Object *)ptr.owner_id);
|
||||
}
|
||||
else if (OB_DATA_SUPPORT_ID(id_type)) {
|
||||
|
|
|
@ -685,7 +685,8 @@ bool ED_lattice_select_pick(bContext *C, const int mval[2], const struct SelectP
|
|||
lt->actbp = LT_ACTBP_NONE;
|
||||
}
|
||||
|
||||
if (vc.view_layer->basact != basact) {
|
||||
BKE_view_layer_synced_ensure(vc.scene, vc.view_layer);
|
||||
if (BKE_view_layer_active_base_get(vc.view_layer) != basact) {
|
||||
ED_object_base_activate(C, basact);
|
||||
}
|
||||
|
||||
|
|
|
@ -131,7 +131,9 @@ static int validate_undoLatt(void *data, void *edata)
|
|||
|
||||
static Object *editlatt_object_from_context(bContext *C)
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
if (obedit && obedit->type == OB_LATTICE) {
|
||||
Lattice *lt = obedit->data;
|
||||
|
|
|
@ -682,7 +682,8 @@ static int edbm_shortest_path_pick_invoke(bContext *C, wmOperator *op, const wmE
|
|||
|
||||
em_setup_viewcontext(C, &vc);
|
||||
copy_v2_v2_int(vc.mval, event->mval);
|
||||
Base *basact = vc.view_layer->basact;
|
||||
BKE_view_layer_synced_ensure(vc.scene, vc.view_layer);
|
||||
Base *basact = BKE_view_layer_active_base_get(vc.view_layer);
|
||||
BMEditMesh *em = vc.em;
|
||||
|
||||
view3d_operator_needs_opengl(C);
|
||||
|
@ -736,7 +737,8 @@ static int edbm_shortest_path_pick_invoke(bContext *C, wmOperator *op, const wmE
|
|||
return OPERATOR_PASS_THROUGH;
|
||||
}
|
||||
|
||||
if (vc.view_layer->basact != basact) {
|
||||
BKE_view_layer_synced_ensure(vc.scene, vc.view_layer);
|
||||
if (BKE_view_layer_active_base_get(vc.view_layer) != basact) {
|
||||
ED_object_base_activate(C, basact);
|
||||
}
|
||||
|
||||
|
|
|
@ -87,8 +87,10 @@ static bool edbm_preselect_or_active(bContext *C, const View3D *v3d, Base **r_ba
|
|||
ED_view3d_gizmo_mesh_preselect_get_active(C, gz, r_base, r_ele);
|
||||
}
|
||||
else {
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
Base *base = view_layer->basact;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_active_base_get(view_layer);
|
||||
Object *obedit = base->object;
|
||||
BMEditMesh *em = BKE_editmesh_from_object(obedit);
|
||||
BMesh *bm = em->bm;
|
||||
|
@ -150,7 +152,8 @@ static int edbm_polybuild_transform_at_cursor_invoke(bContext *C,
|
|||
.is_destructive = true,
|
||||
});
|
||||
if (basact != NULL) {
|
||||
if (vc.view_layer->basact != basact) {
|
||||
BKE_view_layer_synced_ensure(vc.scene, vc.view_layer);
|
||||
if (BKE_view_layer_active_base_get(vc.view_layer) != basact) {
|
||||
ED_object_base_activate(C, basact);
|
||||
}
|
||||
}
|
||||
|
@ -237,7 +240,8 @@ static int edbm_polybuild_delete_at_cursor_invoke(bContext *C,
|
|||
.is_destructive = true,
|
||||
});
|
||||
if (basact != NULL) {
|
||||
if (vc.view_layer->basact != basact) {
|
||||
BKE_view_layer_synced_ensure(vc.scene, vc.view_layer);
|
||||
if (BKE_view_layer_active_base_get(vc.view_layer) != basact) {
|
||||
ED_object_base_activate(C, basact);
|
||||
}
|
||||
}
|
||||
|
@ -405,7 +409,8 @@ static int edbm_polybuild_face_at_cursor_invoke(bContext *C, wmOperator *op, con
|
|||
});
|
||||
|
||||
if (basact != NULL) {
|
||||
if (vc.view_layer->basact != basact) {
|
||||
BKE_view_layer_synced_ensure(vc.scene, vc.view_layer);
|
||||
if (BKE_view_layer_active_base_get(vc.view_layer) != basact) {
|
||||
ED_object_base_activate(C, basact);
|
||||
}
|
||||
}
|
||||
|
@ -498,7 +503,8 @@ static int edbm_polybuild_split_at_cursor_invoke(bContext *C,
|
|||
|
||||
WM_event_add_mousemove(vc.win);
|
||||
|
||||
if (vc.view_layer->basact != basact) {
|
||||
BKE_view_layer_synced_ensure(vc.scene, vc.view_layer);
|
||||
if (BKE_view_layer_active_base_get(vc.view_layer) != basact) {
|
||||
ED_object_base_activate(C, basact);
|
||||
}
|
||||
|
||||
|
@ -590,7 +596,8 @@ static int edbm_polybuild_dissolve_at_cursor_invoke(bContext *C,
|
|||
.is_destructive = true,
|
||||
});
|
||||
|
||||
if (vc.view_layer->basact != basact) {
|
||||
BKE_view_layer_synced_ensure(vc.scene, vc.view_layer);
|
||||
if (BKE_view_layer_active_base_get(vc.view_layer) != basact) {
|
||||
ED_object_base_activate(C, basact);
|
||||
}
|
||||
|
||||
|
|
|
@ -358,6 +358,7 @@ BMVert *EDBM_vert_find_nearest_ex(ViewContext *vc,
|
|||
|
||||
BMVert *EDBM_vert_find_nearest(ViewContext *vc, float *dist_px_manhattan_p)
|
||||
{
|
||||
BKE_view_layer_synced_ensure(vc->scene, vc->view_layer);
|
||||
Base *base = BKE_view_layer_base_find(vc->view_layer, vc->obact);
|
||||
return EDBM_vert_find_nearest_ex(vc, dist_px_manhattan_p, false, false, &base, 1, NULL);
|
||||
}
|
||||
|
@ -612,6 +613,7 @@ BMEdge *EDBM_edge_find_nearest_ex(ViewContext *vc,
|
|||
|
||||
BMEdge *EDBM_edge_find_nearest(ViewContext *vc, float *dist_px_manhattan_p)
|
||||
{
|
||||
BKE_view_layer_synced_ensure(vc->scene, vc->view_layer);
|
||||
Base *base = BKE_view_layer_base_find(vc->view_layer, vc->obact);
|
||||
return EDBM_edge_find_nearest_ex(
|
||||
vc, dist_px_manhattan_p, NULL, false, false, NULL, &base, 1, NULL);
|
||||
|
@ -831,6 +833,7 @@ BMFace *EDBM_face_find_nearest_ex(ViewContext *vc,
|
|||
|
||||
BMFace *EDBM_face_find_nearest(ViewContext *vc, float *dist_px_manhattan_p)
|
||||
{
|
||||
BKE_view_layer_synced_ensure(vc->scene, vc->view_layer);
|
||||
Base *base = BKE_view_layer_base_find(vc->view_layer, vc->obact);
|
||||
return EDBM_face_find_nearest_ex(
|
||||
vc, dist_px_manhattan_p, NULL, false, false, false, NULL, &base, 1, NULL);
|
||||
|
@ -2219,7 +2222,8 @@ bool EDBM_select_pick(bContext *C, const int mval[2], const struct SelectPick_Pa
|
|||
|
||||
/* Changing active object is handy since it allows us to
|
||||
* switch UV layers, vgroups for eg. */
|
||||
if (vc.view_layer->basact != basact) {
|
||||
BKE_view_layer_synced_ensure(vc.scene, vc.view_layer);
|
||||
if (BKE_view_layer_active_base_get(vc.view_layer) != basact) {
|
||||
ED_object_base_activate(C, basact);
|
||||
}
|
||||
|
||||
|
|
|
@ -730,7 +730,9 @@ static void undomesh_free_data(UndoMesh *um)
|
|||
|
||||
static Object *editmesh_object_from_context(bContext *C)
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
if (obedit && obedit->type == OB_MESH) {
|
||||
Mesh *me = obedit->data;
|
||||
|
|
|
@ -109,7 +109,9 @@ static void undomball_free_data(UndoMBall *umb)
|
|||
|
||||
static Object *editmball_object_from_context(bContext *C)
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
if (obedit && obedit->type == OB_MBALL) {
|
||||
MetaBall *mb = obedit->data;
|
||||
|
|
|
@ -906,7 +906,7 @@ bool ED_mball_select_pick(bContext *C, const int mval[2], const struct SelectPic
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
MetaBall *mb = (MetaBall *)base->object->data;
|
||||
mb->lastelem = ml;
|
||||
|
@ -914,7 +914,8 @@ bool ED_mball_select_pick(bContext *C, const int mval[2], const struct SelectPic
|
|||
DEG_id_tag_update(&mb->id, ID_RECALC_SELECT);
|
||||
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, mb);
|
||||
|
||||
if (view_layer->basact != base) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (BKE_view_layer_active_base_get(view_layer) != base) {
|
||||
ED_object_base_activate(C, base);
|
||||
}
|
||||
|
||||
|
|
|
@ -609,6 +609,7 @@ Object *ED_object_add_type_with_obdata(bContext *C,
|
|||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
|
||||
{
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
if (obedit != nullptr) {
|
||||
ED_object_editmode_exit_ex(bmain, scene, obedit, EM_FREEDATA);
|
||||
|
@ -629,7 +630,8 @@ Object *ED_object_add_type_with_obdata(bContext *C,
|
|||
ob = BKE_object_add(bmain, scene, view_layer, type, name);
|
||||
}
|
||||
|
||||
Base *ob_base_act = view_layer->basact;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *ob_base_act = BKE_view_layer_active_base_get(view_layer);
|
||||
/* While not getting a valid base is not a good thing, it can happen in convoluted corner cases,
|
||||
* better not crash on it in releases. */
|
||||
BLI_assert(ob_base_act != nullptr);
|
||||
|
@ -990,6 +992,7 @@ static int object_metaball_add_exec(bContext *C, wmOperator *op)
|
|||
}
|
||||
|
||||
bool newob = false;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
if (obedit == nullptr || obedit->type != OB_MBALL) {
|
||||
obedit = ED_object_add_type(C, OB_MBALL, nullptr, loc, rot, true, local_view_bits);
|
||||
|
@ -1099,6 +1102,7 @@ static int object_armature_add_exec(bContext *C, wmOperator *op)
|
|||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
|
||||
RegionView3D *rv3d = CTX_wm_region_view3d(C);
|
||||
|
@ -2534,6 +2538,7 @@ static void make_object_duplilist_real(bContext *C,
|
|||
}
|
||||
|
||||
BKE_collection_object_add_from(bmain, scene, base->object, ob_dst);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base_dst = BKE_view_layer_base_find(view_layer, ob_dst);
|
||||
BLI_assert(base_dst != nullptr);
|
||||
|
||||
|
@ -2831,6 +2836,7 @@ static Base *duplibase_for_convert(
|
|||
DEG_id_tag_update(&obn->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_ANIMATION);
|
||||
BKE_collection_object_add_from(bmain, scene, ob, obn);
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *basen = BKE_view_layer_base_find(view_layer, obn);
|
||||
ED_object_base_select(basen, BA_SELECT);
|
||||
ED_object_base_select(base, BA_DESELECT);
|
||||
|
@ -3443,9 +3449,13 @@ static int object_convert_exec(bContext *C, wmOperator *op)
|
|||
ED_object_base_activate(C, basact);
|
||||
view_layer->basact = basact;
|
||||
}
|
||||
else if (view_layer->basact->object->flag & OB_DONE) {
|
||||
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, view_layer->basact->object);
|
||||
WM_event_add_notifier(C, NC_OBJECT | ND_DATA, view_layer->basact->object);
|
||||
else {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *object = BKE_view_layer_active_object_get(view_layer);
|
||||
if (object->flag & OB_DONE) {
|
||||
WM_event_add_notifier(C, NC_OBJECT | ND_MODIFIER, object);
|
||||
WM_event_add_notifier(C, NC_OBJECT | ND_DATA, object);
|
||||
}
|
||||
}
|
||||
|
||||
DEG_relations_tag_update(bmain);
|
||||
|
@ -3572,6 +3582,7 @@ static Base *object_add_duplicate_internal(Main *bmain,
|
|||
}
|
||||
DEG_id_tag_update(&obn->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
base = BKE_view_layer_base_find(view_layer, ob);
|
||||
if ((base != nullptr) && (base->flag & BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT)) {
|
||||
BKE_collection_object_add_from(bmain, scene, ob, obn);
|
||||
|
@ -3581,6 +3592,7 @@ static Base *object_add_duplicate_internal(Main *bmain,
|
|||
BKE_collection_object_add(bmain, layer_collection->collection, obn);
|
||||
}
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
basen = BKE_view_layer_base_find(view_layer, obn);
|
||||
if (base != nullptr && basen != nullptr) {
|
||||
basen->local_view_bits = base->local_view_bits;
|
||||
|
@ -3682,7 +3694,8 @@ static int duplicate_exec(bContext *C, wmOperator *op)
|
|||
ED_object_base_select(base, BA_DESELECT);
|
||||
|
||||
/* new object will become active */
|
||||
if (view_layer->basact == base) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (BKE_view_layer_active_base_get(view_layer) == base) {
|
||||
ob_new_active = ob_new;
|
||||
}
|
||||
}
|
||||
|
@ -3700,6 +3713,7 @@ static int duplicate_exec(bContext *C, wmOperator *op)
|
|||
for (const auto &item : source_bases_new_objects) {
|
||||
Object *ob_new = item.second;
|
||||
Base *base_source = item.first;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base_new = BKE_view_layer_base_find(view_layer, ob_new);
|
||||
if (base_new == nullptr) {
|
||||
continue;
|
||||
|
@ -3888,12 +3902,14 @@ void OBJECT_OT_add_named(wmOperatorType *ot)
|
|||
static int object_transform_to_mouse_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
Main *bmain = CTX_data_main(C);
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
|
||||
Object *ob = reinterpret_cast<Object *>(
|
||||
WM_operator_properties_id_lookup_from_name_or_session_uuid(bmain, op->ptr, ID_OB));
|
||||
|
||||
if (!ob) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
ob = BKE_view_layer_active_object_get(view_layer);
|
||||
}
|
||||
|
||||
|
|
|
@ -419,11 +419,13 @@ static bool is_noncolor_pass(eScenePassType pass_type)
|
|||
}
|
||||
|
||||
/* if all is good tag image and return true */
|
||||
static bool bake_object_check(ViewLayer *view_layer,
|
||||
static bool bake_object_check(const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
Object *ob,
|
||||
const eBakeTarget target,
|
||||
ReportList *reports)
|
||||
{
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_base_find(view_layer, ob);
|
||||
|
||||
if (base == NULL) {
|
||||
|
@ -591,6 +593,7 @@ static bool bake_pass_filter_check(eScenePassType pass_type,
|
|||
|
||||
/* before even getting in the bake function we check for some basic errors */
|
||||
static bool bake_objects_check(Main *bmain,
|
||||
const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
Object *ob,
|
||||
ListBase *selected_objects,
|
||||
|
@ -606,7 +609,7 @@ static bool bake_objects_check(Main *bmain,
|
|||
if (is_selected_to_active) {
|
||||
int tot_objects = 0;
|
||||
|
||||
if (!bake_object_check(view_layer, ob, target, reports)) {
|
||||
if (!bake_object_check(scene, view_layer, ob, target, reports)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -640,7 +643,7 @@ static bool bake_objects_check(Main *bmain,
|
|||
}
|
||||
|
||||
for (link = selected_objects->first; link; link = link->next) {
|
||||
if (!bake_object_check(view_layer, link->ptr.data, target, reports)) {
|
||||
if (!bake_object_check(scene, view_layer, link->ptr.data, target, reports)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
@ -1812,6 +1815,7 @@ static int bake_exec(bContext *C, wmOperator *op)
|
|||
}
|
||||
|
||||
if (!bake_objects_check(bkr.main,
|
||||
bkr.scene,
|
||||
bkr.view_layer,
|
||||
bkr.ob,
|
||||
&bkr.selected_objects,
|
||||
|
@ -1865,6 +1869,7 @@ static void bake_startjob(void *bkv, short *UNUSED(stop), short *do_update, floa
|
|||
}
|
||||
|
||||
if (!bake_objects_check(bkr->main,
|
||||
bkr->scene,
|
||||
bkr->view_layer,
|
||||
bkr->ob,
|
||||
&bkr->selected_objects,
|
||||
|
|
|
@ -203,6 +203,7 @@ static int objects_remove_active_exec(bContext *C, wmOperator *op)
|
|||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
int single_collection_index = RNA_enum_get(op->ptr, "collection");
|
||||
Collection *single_collection = collection_object_active_find_index(
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include "BKE_constraint.h"
|
||||
#include "BKE_context.h"
|
||||
#include "BKE_fcurve.h"
|
||||
#include "BKE_layer.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_object.h"
|
||||
#include "BKE_report.h"
|
||||
|
@ -2315,7 +2316,8 @@ static bool get_new_constraint_target(
|
|||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
Base *base = view_layer->basact;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_active_base_get(view_layer);
|
||||
Object *obt;
|
||||
|
||||
/* add new target object */
|
||||
|
|
|
@ -142,6 +142,7 @@ Object **ED_object_array_in_mode_or_selected(bContext *C,
|
|||
ScrArea *area = CTX_wm_area(C);
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob_active = BKE_view_layer_active_object_get(view_layer);
|
||||
ID *id_pin = NULL;
|
||||
const bool use_objects_in_mode = (ob_active != NULL) &&
|
||||
|
@ -235,7 +236,8 @@ static int object_hide_view_clear_exec(bContext *C, wmOperator *op)
|
|||
const bool select = RNA_boolean_get(op->ptr, "select");
|
||||
bool changed = false;
|
||||
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if (base->flag & BASE_HIDDEN) {
|
||||
base->flag &= ~BASE_HIDDEN;
|
||||
changed = true;
|
||||
|
@ -253,7 +255,7 @@ static int object_hide_view_clear_exec(bContext *C, wmOperator *op)
|
|||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
BKE_layer_collection_sync(scene, view_layer);
|
||||
BKE_view_layer_need_resync_tag(view_layer);
|
||||
DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS);
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene);
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_OB_VISIBLE, scene);
|
||||
|
@ -287,7 +289,8 @@ static int object_hide_view_set_exec(bContext *C, wmOperator *op)
|
|||
bool changed = false;
|
||||
|
||||
/* Hide selected or unselected objects. */
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if (!(base->flag & BASE_ENABLED_AND_VISIBLE_IN_DEFAULT_VIEWPORT)) {
|
||||
continue;
|
||||
}
|
||||
|
@ -311,7 +314,7 @@ static int object_hide_view_set_exec(bContext *C, wmOperator *op)
|
|||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
||||
BKE_layer_collection_sync(scene, view_layer);
|
||||
BKE_view_layer_need_resync_tag(view_layer);
|
||||
DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS);
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_OB_SELECT, scene);
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_OB_VISIBLE, scene);
|
||||
|
@ -703,6 +706,7 @@ bool ED_object_editmode_free_ex(Main *bmain, Object *obedit)
|
|||
|
||||
bool ED_object_editmode_exit_multi_ex(Main *bmain, Scene *scene, ViewLayer *view_layer, int flag)
|
||||
{
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
if (obedit == NULL) {
|
||||
return false;
|
||||
|
@ -710,7 +714,8 @@ bool ED_object_editmode_exit_multi_ex(Main *bmain, Scene *scene, ViewLayer *view
|
|||
bool changed = false;
|
||||
const short obedit_type = obedit->type;
|
||||
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
Object *ob = base->object;
|
||||
if ((ob->type == obedit_type) && (ob->mode & OB_MODE_EDIT)) {
|
||||
changed |= ED_object_editmode_exit_ex(bmain, scene, base->object, flag);
|
||||
|
@ -843,6 +848,7 @@ static int editmode_toggle_exec(bContext *C, wmOperator *op)
|
|||
Scene *scene = CTX_data_scene(C);
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
const int mode_flag = OB_MODE_EDIT;
|
||||
const bool is_mode_set = (obact->mode & mode_flag) != 0;
|
||||
|
@ -955,6 +961,7 @@ static int posemode_exec(bContext *C, wmOperator *op)
|
|||
}
|
||||
|
||||
{
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
if (obact == obedit) {
|
||||
ED_object_editmode_exit_ex(bmain, scene, obedit, EM_FREEDATA);
|
||||
|
@ -1479,7 +1486,9 @@ static int shade_smooth_exec(bContext *C, wmOperator *op)
|
|||
|
||||
/* For modes that only use an active object, don't handle the whole selection. */
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
if (obact && ((obact->mode & OB_MODE_ALL_PAINT))) {
|
||||
ctx_ob_single_active.ptr.data = obact;
|
||||
|
@ -1552,7 +1561,9 @@ static int shade_smooth_exec(bContext *C, wmOperator *op)
|
|||
|
||||
static bool shade_poll(bContext *C)
|
||||
{
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
if (obact != NULL) {
|
||||
/* Doesn't handle edit-data, sculpt dynamic-topology, or their undo systems. */
|
||||
|
|
|
@ -485,22 +485,21 @@ static bool hook_op_edit_poll(bContext *C)
|
|||
}
|
||||
|
||||
static Object *add_hook_object_new(
|
||||
Main *bmain, const Scene *scene, ViewLayer *view_layer, View3D *v3d, Object *obedit)
|
||||
Main *bmain, Scene *scene, ViewLayer *view_layer, View3D *v3d, Object *obedit)
|
||||
{
|
||||
Base *basedit;
|
||||
Object *ob;
|
||||
|
||||
ob = BKE_object_add(bmain, scene, view_layer, OB_EMPTY, NULL);
|
||||
|
||||
basedit = BKE_view_layer_base_find(view_layer, obedit);
|
||||
BLI_assert(view_layer->basact->object == ob);
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *basact = BKE_view_layer_active_base_get(view_layer);
|
||||
BLI_assert(basact->object == ob);
|
||||
if (v3d && v3d->localvd) {
|
||||
view_layer->basact->local_view_bits |= v3d->local_view_uuid;
|
||||
basact->local_view_bits |= v3d->local_view_uuid;
|
||||
}
|
||||
|
||||
/* icky, BKE_object_add sets new base as active.
|
||||
* so set it back to the original edit object */
|
||||
basedit = BKE_view_layer_base_find(view_layer, obedit);
|
||||
view_layer->basact = basedit;
|
||||
|
||||
return ob;
|
||||
|
|
|
@ -190,7 +190,10 @@ bool ED_object_mode_compat_set(bContext *C, Object *ob, eObjectMode mode, Report
|
|||
bool ED_object_mode_set_ex(bContext *C, eObjectMode mode, bool use_undo, ReportList *reports)
|
||||
{
|
||||
wmWindowManager *wm = CTX_wm_manager(C);
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
if (ob == NULL) {
|
||||
return (mode == OB_MODE_OBJECT);
|
||||
|
@ -327,9 +330,11 @@ static void ed_object_posemode_set_for_weight_paint_ex(bContext *C,
|
|||
const bool is_mode_set)
|
||||
{
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
|
||||
if (ob_arm != NULL) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
const Base *base_arm = BKE_view_layer_base_find(view_layer, ob_arm);
|
||||
if (base_arm && BASE_VISIBLE(v3d, base_arm)) {
|
||||
if (is_mode_set) {
|
||||
|
@ -464,6 +469,7 @@ static bool object_transfer_mode_to_base(bContext *C, wmOperator *op, Base *base
|
|||
|
||||
if (ED_object_mode_set_ex(C, OB_MODE_OBJECT, true, op->reports)) {
|
||||
Object *ob_dst_orig = DEG_get_original_object(ob_dst);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_base_find(view_layer, ob_dst_orig);
|
||||
BKE_view_layer_base_deselect_all(scene, view_layer);
|
||||
BKE_view_layer_base_select_and_set_active(view_layer, base);
|
||||
|
|
|
@ -1233,6 +1233,7 @@ static int modifier_remove_exec(bContext *C, wmOperator *op)
|
|||
/* if cloth/softbody was removed, particle mode could be cleared */
|
||||
if (mode_orig & OB_MODE_PARTICLE_EDIT) {
|
||||
if ((ob->mode & OB_MODE_PARTICLE_EDIT) == 0) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (ob == BKE_view_layer_active_object_get(view_layer)) {
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_OBJECT, nullptr);
|
||||
}
|
||||
|
|
|
@ -262,8 +262,8 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
|
|||
}
|
||||
else {
|
||||
Object workob;
|
||||
|
||||
ob->parent = view_layer->basact->object;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
ob->parent = BKE_view_layer_active_object_get(view_layer);
|
||||
if (par3 != INDEX_UNSET) {
|
||||
ob->partype = PARVERT3;
|
||||
ob->par1 = par1;
|
||||
|
@ -2073,6 +2073,7 @@ static void tag_localizable_objects(bContext *C, const int mode)
|
|||
* otherwise they're lost on reload, see T40595.
|
||||
*/
|
||||
static bool make_local_all__instance_indirect_unused(Main *bmain,
|
||||
const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
Collection *collection)
|
||||
{
|
||||
|
@ -2086,6 +2087,7 @@ static bool make_local_all__instance_indirect_unused(Main *bmain,
|
|||
id_us_plus(&ob->id);
|
||||
|
||||
BKE_collection_object_add(bmain, collection, ob);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
base = BKE_view_layer_base_find(view_layer, ob);
|
||||
ED_object_base_select(base, BA_SELECT);
|
||||
DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY | ID_RECALC_ANIMATION);
|
||||
|
@ -2162,7 +2164,7 @@ static int make_local_exec(bContext *C, wmOperator *op)
|
|||
/* De-select so the user can differentiate newly instanced from existing objects. */
|
||||
BKE_view_layer_base_deselect_all(scene, view_layer);
|
||||
|
||||
if (make_local_all__instance_indirect_unused(bmain, view_layer, collection)) {
|
||||
if (make_local_all__instance_indirect_unused(bmain, scene, view_layer, collection)) {
|
||||
BKE_report(op->reports,
|
||||
RPT_INFO,
|
||||
"Orphan library objects added to the current scene to avoid loss");
|
||||
|
@ -2623,6 +2625,7 @@ static int clear_override_library_exec(bContext *C, wmOperator *UNUSED(op))
|
|||
Object *ob_iter = todo_object_iter->link;
|
||||
if (BKE_lib_override_library_is_hierarchy_leaf(bmain, &ob_iter->id)) {
|
||||
bool do_remap_active = false;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (BKE_view_layer_active_object_get(view_layer) == ob_iter) {
|
||||
do_remap_active = true;
|
||||
}
|
||||
|
|
|
@ -117,26 +117,24 @@ void ED_object_base_activate(bContext *C, Base *base)
|
|||
|
||||
void ED_object_base_activate_with_mode_exit_if_needed(bContext *C, Base *base)
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
|
||||
/* Currently we only need to be concerned with edit-mode. */
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
if (obedit) {
|
||||
Object *ob = base->object;
|
||||
if (((ob->mode & OB_MODE_EDIT) == 0) || (obedit->type != ob->type)) {
|
||||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ED_object_editmode_exit_multi_ex(bmain, scene, view_layer, EM_FREEDATA);
|
||||
}
|
||||
}
|
||||
ED_object_base_activate(C, base);
|
||||
}
|
||||
|
||||
bool ED_object_base_deselect_all_ex(const Scene *UNUSED(scene),
|
||||
ViewLayer *view_layer,
|
||||
View3D *v3d,
|
||||
int action,
|
||||
bool *r_any_visible)
|
||||
bool ED_object_base_deselect_all_ex(
|
||||
const Scene *scene, ViewLayer *view_layer, View3D *v3d, int action, bool *r_any_visible)
|
||||
{
|
||||
if (action == SEL_TOGGLE) {
|
||||
action = SEL_SELECT;
|
||||
|
@ -216,12 +214,13 @@ static int get_base_select_priority(Base *base)
|
|||
return 1;
|
||||
}
|
||||
|
||||
Base *ED_object_find_first_by_data_id(const Scene *UNUSED(scene), ViewLayer *view_layer, ID *id)
|
||||
Base *ED_object_find_first_by_data_id(const Scene *scene, ViewLayer *view_layer, ID *id)
|
||||
{
|
||||
BLI_assert(OB_DATA_SUPPORT_ID(GS(id->name)));
|
||||
|
||||
/* Try active object. */
|
||||
Base *basact = view_layer->basact;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *basact = BKE_view_layer_active_base_get(view_layer);
|
||||
|
||||
if (basact && basact->object && basact->object->data == id) {
|
||||
return basact;
|
||||
|
@ -231,7 +230,7 @@ Base *ED_object_find_first_by_data_id(const Scene *UNUSED(scene), ViewLayer *vie
|
|||
Base *base_best = NULL;
|
||||
int priority_best = 0;
|
||||
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if (base->object && base->object->data == id) {
|
||||
if (base->flag & BASE_SELECTED) {
|
||||
return base;
|
||||
|
@ -254,6 +253,7 @@ bool ED_object_jump_to_object(bContext *C, Object *ob, const bool UNUSED(reveal_
|
|||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_base_find(view_layer, ob);
|
||||
|
||||
if (base == NULL) {
|
||||
|
@ -262,7 +262,7 @@ bool ED_object_jump_to_object(bContext *C, Object *ob, const bool UNUSED(reveal_
|
|||
|
||||
/* TODO: use 'reveal_hidden', as is done with bones. */
|
||||
|
||||
if (view_layer->basact != base || !(base->flag & BASE_SELECTED)) {
|
||||
if (BKE_view_layer_active_base_get(view_layer) != base || !(base->flag & BASE_SELECTED)) {
|
||||
/* Select if not selected. */
|
||||
if (!(base->flag & BASE_SELECTED)) {
|
||||
ED_object_base_deselect_all(scene, view_layer, v3d, SEL_DESELECT);
|
||||
|
@ -631,6 +631,7 @@ static int object_select_linked_exec(bContext *C, wmOperator *op)
|
|||
ED_object_base_deselect_all(scene, view_layer, v3d, SEL_DESELECT);
|
||||
}
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
ob = BKE_view_layer_active_object_get(view_layer);
|
||||
if (ob == NULL) {
|
||||
BKE_report(op->reports, RPT_ERROR, "No active object");
|
||||
|
@ -785,6 +786,7 @@ static bool select_grouped_children(bContext *C, Object *ob, const bool recursiv
|
|||
/* Makes parent active and de-selected BKE_view_layer_active_object_get. */
|
||||
static bool select_grouped_parent(bContext *C)
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
Base *baspar, *basact = CTX_data_active_base(C);
|
||||
|
@ -795,6 +797,7 @@ static bool select_grouped_parent(bContext *C)
|
|||
return 0;
|
||||
}
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
baspar = BKE_view_layer_base_find(view_layer, basact->object->parent);
|
||||
|
||||
/* can be NULL if parent in other scene */
|
||||
|
@ -863,6 +866,7 @@ static bool select_grouped_collection(bContext *C, Object *ob)
|
|||
|
||||
static bool select_grouped_object_hooks(bContext *C, Object *ob)
|
||||
{
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
|
||||
|
@ -875,6 +879,7 @@ static bool select_grouped_object_hooks(bContext *C, Object *ob)
|
|||
if (md->type == eModifierType_Hook) {
|
||||
hmd = (HookModifierData *)md;
|
||||
if (hmd->object) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
base = BKE_view_layer_base_find(view_layer, hmd->object);
|
||||
if (base && ((base->flag & BASE_SELECTED) == 0) && (BASE_SELECTABLE(v3d, base))) {
|
||||
ED_object_base_select(base, BA_SELECT);
|
||||
|
@ -1028,6 +1033,7 @@ static int object_select_grouped_exec(bContext *C, wmOperator *op)
|
|||
changed = ED_object_base_deselect_all(scene, view_layer, v3d, SEL_DESELECT);
|
||||
}
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
ob = BKE_view_layer_active_object_get(view_layer);
|
||||
if (ob == NULL) {
|
||||
BKE_report(op->reports, RPT_ERROR, "No active object");
|
||||
|
@ -1245,6 +1251,7 @@ static int object_select_mirror_exec(bContext *C, wmOperator *op)
|
|||
if (!STREQ(name_flip, primbase->object->id.name + 2)) {
|
||||
Object *ob = (Object *)BKE_libblock_find_name(bmain, ID_OB, name_flip);
|
||||
if (ob) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *secbase = BKE_view_layer_base_find(view_layer, ob);
|
||||
|
||||
if (secbase) {
|
||||
|
@ -1296,9 +1303,11 @@ void OBJECT_OT_select_mirror(wmOperatorType *ot)
|
|||
|
||||
static bool object_select_more_less(bContext *C, const bool select)
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
Object *ob = base->object;
|
||||
ob->flag &= ~OB_DONE;
|
||||
ob->id.tag &= ~LIB_TAG_DOIT;
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include "BKE_armature.h"
|
||||
#include "BKE_editmesh.h"
|
||||
#include "BKE_lattice.h"
|
||||
#include "BKE_layer.h"
|
||||
#include "BKE_object.h"
|
||||
#include "BKE_scene.h"
|
||||
|
||||
|
@ -169,7 +170,7 @@ struct XFormObjectSkipChild_Container *ED_object_xform_skip_child_container_crea
|
|||
|
||||
void ED_object_xform_skip_child_container_item_ensure_from_array(
|
||||
struct XFormObjectSkipChild_Container *xcs,
|
||||
const Scene *UNUSED(scene),
|
||||
const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
Object **objects,
|
||||
uint objects_len)
|
||||
|
@ -179,8 +180,9 @@ void ED_object_xform_skip_child_container_item_ensure_from_array(
|
|||
Object *ob = objects[ob_index];
|
||||
BLI_gset_add(objects_in_transdata, ob);
|
||||
}
|
||||
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
ListBase *object_bases = BKE_view_layer_object_bases_get(view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, object_bases) {
|
||||
Object *ob = base->object;
|
||||
if (ob->parent != NULL) {
|
||||
if (!BLI_gset_haskey(objects_in_transdata, ob)) {
|
||||
|
@ -210,7 +212,7 @@ void ED_object_xform_skip_child_container_item_ensure_from_array(
|
|||
}
|
||||
}
|
||||
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
LISTBASE_FOREACH (Base *, base, object_bases) {
|
||||
Object *ob = base->object;
|
||||
|
||||
if (BLI_gset_haskey(objects_in_transdata, ob)) {
|
||||
|
|
|
@ -169,6 +169,7 @@ void PE_free_ptcache_edit(PTCacheEdit *edit)
|
|||
int PE_minmax(
|
||||
Depsgraph *depsgraph, Scene *scene, ViewLayer *view_layer, float min[3], float max[3])
|
||||
{
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
PTCacheEdit *edit = PE_get_current(depsgraph, scene, ob);
|
||||
ParticleSystem *psys;
|
||||
|
|
|
@ -212,6 +212,7 @@ static bool particle_undosys_poll(struct bContext *C)
|
|||
Depsgraph *depsgraph = CTX_data_depsgraph_pointer(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
PTCacheEdit *edit = PE_get_current(depsgraph, scene, ob);
|
||||
|
||||
|
@ -226,6 +227,7 @@ static bool particle_undosys_step_encode(struct bContext *C,
|
|||
ParticleUndoStep *us = (ParticleUndoStep *)us_p;
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
us->scene_ref.ptr = CTX_data_scene(C);
|
||||
BKE_view_layer_synced_ensure(us->scene_ref.ptr, view_layer);
|
||||
us->object_ref.ptr = BKE_view_layer_active_object_get(view_layer);
|
||||
PTCacheEdit *edit = PE_get_current(depsgraph, us->scene_ref.ptr, us->object_ref.ptr);
|
||||
undoptcache_from_editcache(&us->data, edit);
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include "BKE_bvhutils.h"
|
||||
#include "BKE_context.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_layer.h"
|
||||
#include "BKE_lib_id.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_mesh.h"
|
||||
|
@ -118,7 +119,8 @@ static int particle_system_remove_exec(bContext *C, wmOperator *UNUSED(op))
|
|||
*/
|
||||
if (mode_orig & OB_MODE_PARTICLE_EDIT) {
|
||||
if ((ob->mode & OB_MODE_PARTICLE_EDIT) == 0) {
|
||||
if (view_layer->basact && view_layer->basact->object == ob) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (BKE_view_layer_active_object_get(view_layer) == ob) {
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_MODE | NS_MODE_OBJECT, NULL);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -123,6 +123,7 @@ static int rigidbody_con_add_exec(bContext *C, wmOperator *op)
|
|||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
RigidBodyWorld *rbw = BKE_rigidbody_get_world(scene);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
int type = RNA_enum_get(op->ptr, "type");
|
||||
bool changed;
|
||||
|
@ -175,6 +176,7 @@ static int rigidbody_con_remove_exec(bContext *C, wmOperator *op)
|
|||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
/* apply to active object */
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include "BKE_global.h"
|
||||
#include "BKE_image.h"
|
||||
#include "BKE_image_format.h"
|
||||
#include "BKE_layer.h"
|
||||
#include "BKE_lib_id.h"
|
||||
#include "BKE_main.h"
|
||||
#include "BKE_node.h"
|
||||
|
@ -885,9 +886,10 @@ static void clean_viewport_memory(Main *bmain, Scene *scene)
|
|||
wm = static_cast<wmWindowManager *>(wm->id.next)) {
|
||||
LISTBASE_FOREACH (wmWindow *, win, &wm->windows) {
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
|
||||
for (base = static_cast<Base *>(view_layer->object_bases.first); base; base = base->next) {
|
||||
clean_viewport_memory_base(base);
|
||||
LISTBASE_FOREACH (Base *, b, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
clean_viewport_memory_base(b);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -307,7 +307,8 @@ static void switch_preview_floor_visibility(Main *pr_main,
|
|||
const ePreviewRenderMethod pr_method)
|
||||
{
|
||||
/* Hide floor for icon renders. */
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if (STREQ(base->object->id.name + 2, "Floor")) {
|
||||
base->object->visibility_flag &= ~OB_HIDE_RENDER;
|
||||
if (pr_method == PR_ICON_RENDER) {
|
||||
|
@ -533,8 +534,8 @@ static Scene *preview_prepare_scene(
|
|||
else {
|
||||
sce->display.render_aa = SCE_DISPLAY_AA_OFF;
|
||||
}
|
||||
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(sce, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if (base->object->id.name[2] == 'p') {
|
||||
/* copy over object color, in case material uses it */
|
||||
copy_v4_v4(base->object->color, sp->color);
|
||||
|
@ -586,7 +587,8 @@ static Scene *preview_prepare_scene(
|
|||
sce->world->horb = 0.0f;
|
||||
}
|
||||
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(sce, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if (base->object->id.name[2] == 'p') {
|
||||
if (base->object->type == OB_LAMP) {
|
||||
base->object->data = la;
|
||||
|
@ -825,6 +827,7 @@ static Scene *object_preview_scene_create(const struct ObjectPreviewData *previe
|
|||
scene->r.ysch = preview_data->sizey;
|
||||
scene->r.size = 100;
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *preview_base = BKE_view_layer_base_find(view_layer, preview_data->object);
|
||||
/* For 'view selected' below. */
|
||||
preview_base->flag |= BASE_SELECTED;
|
||||
|
|
|
@ -129,9 +129,11 @@ static eContextResult screen_ctx_visible_objects(const bContext *C, bContextData
|
|||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
View3D *v3d = CTX_wm_view3d(C); /* This may be NULL in a lot of cases. */
|
||||
Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if (BASE_VISIBLE(v3d, base)) {
|
||||
CTX_data_id_list_add(result, &base->object->id);
|
||||
}
|
||||
|
@ -143,9 +145,11 @@ static eContextResult screen_ctx_selectable_objects(const bContext *C, bContextD
|
|||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
View3D *v3d = CTX_wm_view3d(C); /* This may be NULL in a lot of cases. */
|
||||
Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if (BASE_SELECTABLE(v3d, base)) {
|
||||
CTX_data_id_list_add(result, &base->object->id);
|
||||
}
|
||||
|
@ -157,9 +161,11 @@ static eContextResult screen_ctx_selected_objects(const bContext *C, bContextDat
|
|||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
View3D *v3d = CTX_wm_view3d(C); /* This may be NULL in a lot of cases. */
|
||||
Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if (BASE_SELECTED(v3d, base)) {
|
||||
CTX_data_id_list_add(result, &base->object->id);
|
||||
}
|
||||
|
@ -172,9 +178,11 @@ static eContextResult screen_ctx_selected_editable_objects(const bContext *C,
|
|||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
View3D *v3d = CTX_wm_view3d(C); /* This may be NULL in a lot of cases. */
|
||||
Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if (BASE_SELECTED_EDITABLE(v3d, base)) {
|
||||
CTX_data_id_list_add(result, &base->object->id);
|
||||
}
|
||||
|
@ -186,10 +194,12 @@ static eContextResult screen_ctx_editable_objects(const bContext *C, bContextDat
|
|||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
View3D *v3d = CTX_wm_view3d(C); /* This may be NULL in a lot of cases. */
|
||||
Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
|
||||
/* Visible + Editable, but not necessarily selected */
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
if (BASE_EDITABLE(v3d, base)) {
|
||||
CTX_data_id_list_add(result, &base->object->id);
|
||||
}
|
||||
|
@ -203,7 +213,8 @@ static eContextResult screen_ctx_objects_in_mode(const bContext *C, bContextData
|
|||
View3D *v3d = CTX_wm_view3d(C); /* This may be NULL in a lot of cases. */
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
if (obact && (obact->mode != OB_MODE_OBJECT)) {
|
||||
FOREACH_OBJECT_IN_MODE_BEGIN (scene, view_layer, v3d, obact->type, obact->mode, ob_iter) {
|
||||
|
@ -221,7 +232,8 @@ static eContextResult screen_ctx_objects_in_mode_unique_data(const bContext *C,
|
|||
View3D *v3d = CTX_wm_view3d(C); /* This may be NULL in a lot of cases. */
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
if (obact && (obact->mode != OB_MODE_OBJECT)) {
|
||||
FOREACH_OBJECT_IN_MODE_BEGIN (scene, view_layer, v3d, obact->type, obact->mode, ob_iter) {
|
||||
|
@ -246,6 +258,7 @@ static eContextResult screen_ctx_visible_or_editable_bones_(const bContext *C,
|
|||
wmWindow *win = CTX_wm_window(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
|
||||
bArmature *arm = (obedit && obedit->type == OB_ARMATURE) ? obedit->data : NULL;
|
||||
|
@ -318,6 +331,7 @@ static eContextResult screen_ctx_selected_bones_(const bContext *C,
|
|||
wmWindow *win = CTX_wm_window(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
bArmature *arm = (obedit && obedit->type == OB_ARMATURE) ? obedit->data : NULL;
|
||||
EditBone *flipbone = NULL;
|
||||
|
@ -389,7 +403,8 @@ static eContextResult screen_ctx_visible_pose_bones(const bContext *C, bContextD
|
|||
View3D *v3d = CTX_wm_view3d(C); /* This may be NULL in a lot of cases. */
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
Object *obpose = BKE_object_pose_armature_get(obact);
|
||||
if (obpose && obpose->pose && obpose->data) {
|
||||
if (obpose != obact) {
|
||||
|
@ -418,7 +433,7 @@ static eContextResult screen_ctx_selected_pose_bones(const bContext *C, bContext
|
|||
View3D *v3d = CTX_wm_view3d(C); /* This may be NULL in a lot of cases. */
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
Object *obpose = BKE_object_pose_armature_get(obact);
|
||||
if (obpose && obpose->pose && obpose->data) {
|
||||
if (obpose != obact) {
|
||||
|
@ -445,8 +460,10 @@ static eContextResult screen_ctx_selected_pose_bones_from_active_object(const bC
|
|||
bContextDataResult *result)
|
||||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
Object *obpose = BKE_object_pose_armature_get(obact);
|
||||
if (obpose && obpose->pose && obpose->data) {
|
||||
if (obpose != obact) {
|
||||
|
@ -469,8 +486,10 @@ static eContextResult screen_ctx_selected_pose_bones_from_active_object(const bC
|
|||
static eContextResult screen_ctx_active_bone(const bContext *C, bContextDataResult *result)
|
||||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
if (obact && obact->type == OB_ARMATURE) {
|
||||
bArmature *arm = obact->data;
|
||||
if (arm->edbo) {
|
||||
|
@ -491,8 +510,10 @@ static eContextResult screen_ctx_active_bone(const bContext *C, bContextDataResu
|
|||
static eContextResult screen_ctx_active_pose_bone(const bContext *C, bContextDataResult *result)
|
||||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
Object *obpose = BKE_object_pose_armature_get(obact);
|
||||
|
||||
bPoseChannel *pchan = BKE_pose_channel_active_if_layer_visible(obpose);
|
||||
|
@ -505,8 +526,10 @@ static eContextResult screen_ctx_active_pose_bone(const bContext *C, bContextDat
|
|||
static eContextResult screen_ctx_active_object(const bContext *C, bContextDataResult *result)
|
||||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
if (obact) {
|
||||
CTX_data_id_pointer_set(result, &obact->id);
|
||||
|
@ -517,8 +540,10 @@ static eContextResult screen_ctx_active_object(const bContext *C, bContextDataRe
|
|||
static eContextResult screen_ctx_object(const bContext *C, bContextDataResult *result)
|
||||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
if (obact) {
|
||||
CTX_data_id_pointer_set(result, &obact->id);
|
||||
|
@ -529,7 +554,9 @@ static eContextResult screen_ctx_object(const bContext *C, bContextDataResult *r
|
|||
static eContextResult screen_ctx_edit_object(const bContext *C, bContextDataResult *result)
|
||||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
/* convenience for now, 1 object per scene in editmode */
|
||||
if (obedit) {
|
||||
|
@ -541,8 +568,10 @@ static eContextResult screen_ctx_edit_object(const bContext *C, bContextDataResu
|
|||
static eContextResult screen_ctx_sculpt_object(const bContext *C, bContextDataResult *result)
|
||||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
if (obact && (obact->mode & OB_MODE_SCULPT)) {
|
||||
CTX_data_id_pointer_set(result, &obact->id);
|
||||
|
@ -553,8 +582,10 @@ static eContextResult screen_ctx_sculpt_object(const bContext *C, bContextDataRe
|
|||
static eContextResult screen_ctx_vertex_paint_object(const bContext *C, bContextDataResult *result)
|
||||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
if (obact && (obact->mode & OB_MODE_VERTEX_PAINT)) {
|
||||
CTX_data_id_pointer_set(result, &obact->id);
|
||||
}
|
||||
|
@ -564,8 +595,10 @@ static eContextResult screen_ctx_vertex_paint_object(const bContext *C, bContext
|
|||
static eContextResult screen_ctx_weight_paint_object(const bContext *C, bContextDataResult *result)
|
||||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
if (obact && (obact->mode & OB_MODE_ALL_WEIGHT_PAINT)) {
|
||||
CTX_data_id_pointer_set(result, &obact->id);
|
||||
}
|
||||
|
@ -575,8 +608,10 @@ static eContextResult screen_ctx_weight_paint_object(const bContext *C, bContext
|
|||
static eContextResult screen_ctx_image_paint_object(const bContext *C, bContextDataResult *result)
|
||||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
if (obact && (obact->mode & OB_MODE_TEXTURE_PAINT)) {
|
||||
CTX_data_id_pointer_set(result, &obact->id);
|
||||
}
|
||||
|
@ -587,8 +622,10 @@ static eContextResult screen_ctx_particle_edit_object(const bContext *C,
|
|||
bContextDataResult *result)
|
||||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
if (obact && (obact->mode & OB_MODE_PARTICLE_EDIT)) {
|
||||
CTX_data_id_pointer_set(result, &obact->id);
|
||||
}
|
||||
|
@ -598,8 +635,10 @@ static eContextResult screen_ctx_particle_edit_object(const bContext *C,
|
|||
static eContextResult screen_ctx_pose_object(const bContext *C, bContextDataResult *result)
|
||||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
Object *obpose = BKE_object_pose_armature_get(obact);
|
||||
if (obpose) {
|
||||
CTX_data_id_pointer_set(result, &obpose->id);
|
||||
|
@ -742,8 +781,10 @@ static eContextResult screen_ctx_gpencil_data(const bContext *C, bContextDataRes
|
|||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
ScrArea *area = CTX_wm_area(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
/* FIXME: for some reason, CTX_data_active_object(C) returns NULL when called from these
|
||||
* situations (as outlined above - see Campbell's #ifdefs).
|
||||
* That causes the get_active function to fail when called from context.
|
||||
|
@ -761,8 +802,10 @@ static eContextResult screen_ctx_gpencil_data_owner(const bContext *C, bContextD
|
|||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
ScrArea *area = CTX_wm_area(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
/* Pointer to which data/datablock owns the reference to the Grease Pencil data being used
|
||||
* (as gpencil_data). */
|
||||
|
@ -812,8 +855,10 @@ static eContextResult screen_ctx_active_gpencil_layer(const bContext *C,
|
|||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
ScrArea *area = CTX_wm_area(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
bGPdata *gpd = ED_gpencil_data_get_active_direct(area, obact);
|
||||
|
||||
if (gpd) {
|
||||
|
@ -850,8 +895,10 @@ static eContextResult screen_ctx_active_gpencil_frame(const bContext *C,
|
|||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
ScrArea *area = CTX_wm_area(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
bGPdata *gpd = ED_gpencil_data_get_active_direct(area, obact);
|
||||
|
||||
if (gpd) {
|
||||
|
@ -869,8 +916,10 @@ static eContextResult screen_ctx_visible_gpencil_layers(const bContext *C,
|
|||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
ScrArea *area = CTX_wm_area(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
bGPdata *gpd = ED_gpencil_data_get_active_direct(area, obact);
|
||||
|
||||
if (gpd) {
|
||||
|
@ -889,8 +938,10 @@ static eContextResult screen_ctx_editable_gpencil_layers(const bContext *C,
|
|||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
ScrArea *area = CTX_wm_area(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
bGPdata *gpd = ED_gpencil_data_get_active_direct(area, obact);
|
||||
|
||||
if (gpd) {
|
||||
|
@ -909,8 +960,10 @@ static eContextResult screen_ctx_editable_gpencil_strokes(const bContext *C,
|
|||
{
|
||||
wmWindow *win = CTX_wm_window(C);
|
||||
ScrArea *area = CTX_wm_area(C);
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
Object *obact = view_layer->basact ? view_layer->basact->object : NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
bGPdata *gpd = ED_gpencil_data_get_active_direct(area, obact);
|
||||
const bool is_multiedit = (bool)GPENCIL_MULTIEDIT_SESSIONS_ON(gpd);
|
||||
|
|
|
@ -1163,6 +1163,7 @@ static void screen_set_3dview_camera(Scene *scene,
|
|||
/* fix any cameras that are used in the 3d view but not in the scene */
|
||||
BKE_screen_view3d_sync(v3d, scene);
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (!v3d->camera || !BKE_view_layer_base_find(view_layer, v3d->camera)) {
|
||||
v3d->camera = BKE_view_layer_camera_find(scene, view_layer);
|
||||
// XXX if (screen == curscreen) handle_view3d_lock();
|
||||
|
|
|
@ -294,6 +294,7 @@ static PaintOperation *texture_paint_init(bContext *C, wmOperator *op, const flo
|
|||
copy_v2_v2(pop->startmouse, mouse);
|
||||
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
/* initialize from context */
|
||||
|
|
|
@ -6042,6 +6042,7 @@ static int texture_paint_camera_project_exec(bContext *C, wmOperator *op)
|
|||
int orig_brush_size;
|
||||
IDProperty *idgroup;
|
||||
IDProperty *view_data = NULL;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
bool uvs, mat, tex;
|
||||
|
||||
|
|
|
@ -404,6 +404,7 @@ void paint_sample_color(
|
|||
if (v3d && texpaint_proj) {
|
||||
/* first try getting a color directly from the mesh faces if possible */
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
Object *ob_eval = DEG_get_evaluated_object(depsgraph, ob);
|
||||
ImagePaintSettings *imapaint = &scene->toolsettings->imapaint;
|
||||
|
|
|
@ -421,6 +421,7 @@ void ED_object_sculptmode_enter(struct bContext *C, Depsgraph *depsgraph, Report
|
|||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
ED_object_sculptmode_enter_ex(bmain, depsgraph, scene, ob, false, reports);
|
||||
}
|
||||
|
@ -473,6 +474,7 @@ void ED_object_sculptmode_exit(bContext *C, Depsgraph *depsgraph)
|
|||
Main *bmain = CTX_data_main(C);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
ED_object_sculptmode_exit_ex(bmain, depsgraph, scene, ob);
|
||||
}
|
||||
|
@ -485,6 +487,7 @@ static int sculpt_mode_toggle_exec(bContext *C, wmOperator *op)
|
|||
Scene *scene = CTX_data_scene(C);
|
||||
ToolSettings *ts = scene->toolsettings;
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
const int mode_flag = OB_MODE_SCULPT;
|
||||
const bool is_mode_set = (ob->mode & mode_flag) != 0;
|
||||
|
|
|
@ -253,7 +253,9 @@ static bool sculpt_undo_restore_deformed(
|
|||
|
||||
static bool sculpt_undo_restore_coords(bContext *C, Depsgraph *depsgraph, SculptUndoNode *unode)
|
||||
{
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
SculptSession *ss = ob->sculpt;
|
||||
SubdivCCG *subdiv_ccg = ss->subdiv_ccg;
|
||||
|
@ -365,7 +367,9 @@ static bool sculpt_undo_restore_coords(bContext *C, Depsgraph *depsgraph, Sculpt
|
|||
|
||||
static bool sculpt_undo_restore_hidden(bContext *C, SculptUndoNode *unode, bool *modified_vertices)
|
||||
{
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
SculptSession *ss = ob->sculpt;
|
||||
SubdivCCG *subdiv_ccg = ss->subdiv_ccg;
|
||||
|
@ -395,7 +399,9 @@ static bool sculpt_undo_restore_hidden(bContext *C, SculptUndoNode *unode, bool
|
|||
|
||||
static bool sculpt_undo_restore_color(bContext *C, SculptUndoNode *unode, bool *modified_vertices)
|
||||
{
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
SculptSession *ss = ob->sculpt;
|
||||
|
||||
|
@ -427,7 +433,9 @@ static bool sculpt_undo_restore_color(bContext *C, SculptUndoNode *unode, bool *
|
|||
|
||||
static bool sculpt_undo_restore_mask(bContext *C, SculptUndoNode *unode, bool *modified_vertices)
|
||||
{
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
SculptSession *ss = ob->sculpt;
|
||||
SubdivCCG *subdiv_ccg = ss->subdiv_ccg;
|
||||
|
@ -473,7 +481,9 @@ static bool sculpt_undo_restore_mask(bContext *C, SculptUndoNode *unode, bool *m
|
|||
|
||||
static bool sculpt_undo_restore_face_sets(bContext *C, SculptUndoNode *unode)
|
||||
{
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
Mesh *me = BKE_object_get_original_mesh(ob);
|
||||
int *face_sets = CustomData_add_layer(
|
||||
|
@ -722,6 +732,7 @@ static void sculpt_undo_restore_list(bContext *C, Depsgraph *depsgraph, ListBase
|
|||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
SculptSession *ss = ob->sculpt;
|
||||
SubdivCCG *subdiv_ccg = ss->subdiv_ccg;
|
||||
|
@ -1823,6 +1834,7 @@ static void sculpt_undosys_step_decode(
|
|||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
if (ob && (ob->type == OB_MESH)) {
|
||||
if (ob->mode & (OB_MODE_SCULPT | OB_MODE_VERTEX_PAINT)) {
|
||||
|
|
|
@ -155,7 +155,8 @@ static bool buttons_context_path_collection(const bContext *C,
|
|||
/* if we have a view layer, use the view layer's active collection */
|
||||
if (buttons_context_path_view_layer(path, window)) {
|
||||
ViewLayer *view_layer = path->ptr[path->len - 1].data;
|
||||
Collection *c = view_layer->active_collection->collection;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Collection *c = BKE_view_layer_active_collection_get(view_layer)->collection;
|
||||
|
||||
/* Do not show collection tab for master collection. */
|
||||
if (c == scene->master_collection) {
|
||||
|
@ -209,7 +210,7 @@ static bool buttons_context_path_object(ButsContextPath *path)
|
|||
}
|
||||
|
||||
ViewLayer *view_layer = ptr->data;
|
||||
Object *ob = (view_layer->basact) ? view_layer->basact->object : NULL;
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
if (ob) {
|
||||
RNA_id_pointer_create(&ob->id, &path->ptr[path->len]);
|
||||
|
@ -642,7 +643,9 @@ static bool buttons_context_path(
|
|||
static bool buttons_shading_context(const bContext *C, int mainb)
|
||||
{
|
||||
wmWindow *window = CTX_wm_window(C);
|
||||
const Scene *scene = WM_window_get_active_scene(window);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(window);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
if (ELEM(mainb, BCONTEXT_MATERIAL, BCONTEXT_WORLD, BCONTEXT_TEXTURE)) {
|
||||
|
@ -658,7 +661,9 @@ static bool buttons_shading_context(const bContext *C, int mainb)
|
|||
static int buttons_shading_new_context(const bContext *C, int flag)
|
||||
{
|
||||
wmWindow *window = CTX_wm_window(C);
|
||||
const Scene *scene = WM_window_get_active_scene(window);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(window);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
if (flag & (1 << BCONTEXT_MATERIAL)) {
|
||||
|
|
|
@ -281,6 +281,7 @@ static void buttons_texture_users_from_context(ListBase *users,
|
|||
|
||||
brush = BKE_paint_brush(BKE_paint_get_active_from_context(C));
|
||||
linestyle = BKE_linestyle_active_from_view_layer(view_layer);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
ob = BKE_view_layer_active_object_get(view_layer);
|
||||
}
|
||||
|
||||
|
|
|
@ -72,6 +72,7 @@ static Object *get_orientation_object(bContext *C)
|
|||
object = get_camera_with_movieclip(scene, clip);
|
||||
}
|
||||
else {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
object = BKE_view_layer_active_object_get(view_layer);
|
||||
}
|
||||
|
||||
|
@ -86,6 +87,7 @@ static bool set_orientation_poll(bContext *C)
|
|||
{
|
||||
SpaceClip *sc = CTX_wm_space_clip(C);
|
||||
if (sc != NULL) {
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
MovieClip *clip = ED_space_clip_get_clip(sc);
|
||||
if (clip != NULL) {
|
||||
|
@ -94,6 +96,7 @@ static bool set_orientation_poll(bContext *C)
|
|||
if (tracking_object->flag & TRACKING_OBJECT_CAMERA) {
|
||||
return true;
|
||||
}
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
return BKE_view_layer_active_object_get(view_layer) != NULL;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -471,7 +471,9 @@ bool ED_space_image_maskedit_poll(bContext *C)
|
|||
SpaceImage *sima = CTX_wm_space_image(C);
|
||||
|
||||
if (sima) {
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
return ED_space_image_check_show_maskedit(sima, obedit);
|
||||
}
|
||||
|
|
|
@ -351,7 +351,9 @@ static void image_listener(const wmSpaceTypeListenerParams *params)
|
|||
}
|
||||
break;
|
||||
case NC_MASK: {
|
||||
Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
if (ED_space_image_check_show_maskedit(sima, obedit)) {
|
||||
switch (wmn->data) {
|
||||
|
@ -393,7 +395,9 @@ static void image_listener(const wmSpaceTypeListenerParams *params)
|
|||
switch (wmn->data) {
|
||||
case ND_TRANSFORM:
|
||||
case ND_MODIFIER: {
|
||||
const Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
if (ob && (ob == wmn->reference) && (ob->mode & OB_MODE_EDIT)) {
|
||||
if (sima->lock && (sima->flag & SI_DRAWSHADOW)) {
|
||||
|
|
|
@ -358,6 +358,7 @@ static void stats_update(Depsgraph *depsgraph,
|
|||
View3D *v3d_local,
|
||||
SceneStats *stats)
|
||||
{
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
const Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
const Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
|
||||
|
@ -490,13 +491,18 @@ static bool format_stats(
|
|||
return true;
|
||||
}
|
||||
|
||||
static void get_stats_string(
|
||||
char *info, int len, size_t *ofs, ViewLayer *view_layer, SceneStatsFmt *stats_fmt)
|
||||
static void get_stats_string(char *info,
|
||||
int len,
|
||||
size_t *ofs,
|
||||
const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
SceneStatsFmt *stats_fmt)
|
||||
{
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
Object *obedit = OBEDIT_FROM_OBACT(ob);
|
||||
eObjectMode object_mode = ob ? (eObjectMode)ob->mode : OB_MODE_OBJECT;
|
||||
LayerCollection *layer_collection = view_layer->active_collection;
|
||||
LayerCollection *layer_collection = BKE_view_layer_active_collection_get(view_layer);
|
||||
|
||||
if (object_mode == OB_MODE_OBJECT) {
|
||||
*ofs += BLI_snprintf_rlen(info + *ofs,
|
||||
|
@ -600,7 +606,7 @@ static const char *info_statusbar_string(Main *bmain,
|
|||
if (statusbar_flag & STATUSBAR_SHOW_STATS) {
|
||||
SceneStatsFmt stats_fmt;
|
||||
if (format_stats(bmain, scene, view_layer, nullptr, &stats_fmt)) {
|
||||
get_stats_string(info + ofs, len, &ofs, view_layer, &stats_fmt);
|
||||
get_stats_string(info + ofs, len, &ofs, scene, view_layer, &stats_fmt);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -685,6 +691,7 @@ void ED_info_draw_stats(
|
|||
return;
|
||||
}
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
Object *obedit = OBEDIT_FROM_OBACT(ob);
|
||||
eObjectMode object_mode = ob ? (eObjectMode)ob->mode : OB_MODE_OBJECT;
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include "BKE_anim_data.h"
|
||||
#include "BKE_context.h"
|
||||
#include "BKE_global.h"
|
||||
#include "BKE_layer.h"
|
||||
#include "BKE_nla.h"
|
||||
#include "BKE_report.h"
|
||||
#include "BKE_scene.h"
|
||||
|
@ -129,7 +130,8 @@ static int mouse_nla_channels(bContext *C, bAnimContext *ac, int channel_index,
|
|||
else {
|
||||
/* deselect all */
|
||||
/* TODO: should this deselect all other types of channels too? */
|
||||
LISTBASE_FOREACH (Base *, b, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(ac->scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, b, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
ED_object_base_select(b, BA_DESELECT);
|
||||
if (b->object->adt) {
|
||||
b->object->adt->flag &= ~(ADT_UI_SELECTED | ADT_UI_ACTIVE);
|
||||
|
|
|
@ -411,7 +411,8 @@ static int collection_hierarchy_delete_exec(bContext *C, wmOperator *op)
|
|||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
struct wmMsgBus *mbus = CTX_wm_message_bus(C);
|
||||
const Base *basact_prev = view_layer->basact;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
const Base *basact_prev = BKE_view_layer_active_base_get(view_layer);
|
||||
|
||||
outliner_collection_delete(C, bmain, scene, op->reports, true);
|
||||
|
||||
|
@ -420,7 +421,8 @@ static int collection_hierarchy_delete_exec(bContext *C, wmOperator *op)
|
|||
|
||||
WM_main_add_notifier(NC_SCENE | ND_LAYER, nullptr);
|
||||
|
||||
if (basact_prev != view_layer->basact) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (basact_prev != BKE_view_layer_active_base_get(view_layer)) {
|
||||
WM_msg_publish_rna_prop(mbus, &scene->id, view_layer, LayerObjects, active);
|
||||
}
|
||||
|
||||
|
@ -960,7 +962,7 @@ static int collection_view_layer_exec(bContext *C, wmOperator *op)
|
|||
|
||||
BLI_gset_free(data.collections_to_edit, nullptr);
|
||||
|
||||
BKE_layer_collection_sync(scene, view_layer);
|
||||
BKE_view_layer_need_resync_tag(view_layer);
|
||||
DEG_relations_tag_update(bmain);
|
||||
|
||||
WM_main_add_notifier(NC_SCENE | ND_LAYER, nullptr);
|
||||
|
@ -1109,7 +1111,7 @@ static int collection_isolate_exec(bContext *C, wmOperator *op)
|
|||
}
|
||||
BLI_gset_free(data.collections_to_edit, nullptr);
|
||||
|
||||
BKE_layer_collection_sync(scene, view_layer);
|
||||
BKE_view_layer_need_resync_tag(view_layer);
|
||||
DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS);
|
||||
|
||||
WM_main_add_notifier(NC_SCENE | ND_LAYER_CONTENT, nullptr);
|
||||
|
@ -1193,7 +1195,7 @@ static int collection_visibility_exec(bContext *C, wmOperator *op)
|
|||
}
|
||||
BLI_gset_free(data.collections_to_edit, nullptr);
|
||||
|
||||
BKE_layer_collection_sync(scene, view_layer);
|
||||
BKE_view_layer_need_resync_tag(view_layer);
|
||||
DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS);
|
||||
|
||||
WM_main_add_notifier(NC_SCENE | ND_LAYER_CONTENT, nullptr);
|
||||
|
@ -1383,7 +1385,7 @@ static int collection_flag_exec(bContext *C, wmOperator *op)
|
|||
BLI_gset_free(data.collections_to_edit, nullptr);
|
||||
}
|
||||
|
||||
BKE_layer_collection_sync(scene, view_layer);
|
||||
BKE_view_layer_need_resync_tag(view_layer);
|
||||
DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS);
|
||||
|
||||
if (!is_render) {
|
||||
|
@ -1492,6 +1494,7 @@ static TreeTraversalAction outliner_hide_collect_data_to_edit(TreeElement *te, v
|
|||
}
|
||||
else if ((tselem->type == TSE_SOME_ID) && (te->idcode == ID_OB)) {
|
||||
Object *ob = (Object *)tselem->id;
|
||||
BKE_view_layer_synced_ensure(data->scene, data->view_layer);
|
||||
Base *base = BKE_view_layer_base_find(data->view_layer, ob);
|
||||
BLI_gset_add(data->bases_to_edit, base);
|
||||
}
|
||||
|
@ -1533,7 +1536,7 @@ static int outliner_hide_exec(bContext *C, wmOperator *UNUSED(op))
|
|||
}
|
||||
BLI_gset_free(data.bases_to_edit, nullptr);
|
||||
|
||||
BKE_layer_collection_sync(scene, view_layer);
|
||||
BKE_view_layer_need_resync_tag(view_layer);
|
||||
DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS);
|
||||
|
||||
WM_main_add_notifier(NC_SCENE | ND_LAYER_CONTENT, nullptr);
|
||||
|
@ -1567,11 +1570,12 @@ static int outliner_unhide_all_exec(bContext *C, wmOperator *UNUSED(op))
|
|||
}
|
||||
|
||||
/* Unhide all objects. */
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
base->flag &= ~BASE_HIDDEN;
|
||||
}
|
||||
|
||||
BKE_layer_collection_sync(scene, view_layer);
|
||||
BKE_view_layer_need_resync_tag(view_layer);
|
||||
DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS);
|
||||
|
||||
WM_main_add_notifier(NC_SCENE | ND_LAYER_CONTENT, nullptr);
|
||||
|
|
|
@ -293,6 +293,7 @@ static bool parent_drop_allowed(TreeElement *te, Object *potential_child)
|
|||
* active scene and parenting them is allowed (sergey) */
|
||||
if (scene) {
|
||||
LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (BKE_view_layer_base_find(view_layer, potential_child)) {
|
||||
return true;
|
||||
}
|
||||
|
@ -580,6 +581,7 @@ static int scene_drop_invoke(bContext *C, wmOperator *UNUSED(op), const wmEvent
|
|||
BKE_collection_object_add(bmain, collection, ob);
|
||||
|
||||
LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_base_find(view_layer, ob);
|
||||
if (base) {
|
||||
ED_object_base_select(base, BA_SELECT);
|
||||
|
|
|
@ -284,6 +284,7 @@ static void outliner_object_set_flag_recursive_fn(bContext *C,
|
|||
DEG_id_tag_update(&ob_iter->id, ID_RECALC_COPY_ON_WRITE);
|
||||
}
|
||||
else {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base_iter = BKE_view_layer_base_find(view_layer, ob_iter);
|
||||
/* Child can be in a collection excluded from view-layer. */
|
||||
if (base_iter == nullptr) {
|
||||
|
@ -301,7 +302,7 @@ static void outliner_object_set_flag_recursive_fn(bContext *C,
|
|||
DEG_relations_tag_update(bmain);
|
||||
}
|
||||
else {
|
||||
BKE_layer_collection_sync(scene, view_layer);
|
||||
BKE_view_layer_need_resync_tag(view_layer);
|
||||
DEG_id_tag_update(&scene->id, ID_RECALC_BASE_FLAGS);
|
||||
}
|
||||
}
|
||||
|
@ -348,6 +349,7 @@ static void outliner_base_or_object_pointer_create(
|
|||
RNA_id_pointer_create(&ob->id, ptr);
|
||||
}
|
||||
else {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_base_find(view_layer, ob);
|
||||
RNA_pointer_create(&scene->id, &RNA_ObjectBase, base, ptr);
|
||||
}
|
||||
|
@ -1146,6 +1148,7 @@ static void outliner_draw_restrictbuts(uiBlock *block,
|
|||
RNA_id_pointer_create(&ob->id, &ptr);
|
||||
|
||||
if (space_outliner->show_restrict_flags & SO_RESTRICT_HIDE) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = (te->directdata) ? (Base *)te->directdata :
|
||||
BKE_view_layer_base_find(view_layer, ob);
|
||||
if (base) {
|
||||
|
@ -3213,6 +3216,7 @@ static bool element_should_draw_faded(const TreeViewContext *tvc,
|
|||
case ID_OB: {
|
||||
const Object *ob = (const Object *)tselem->id;
|
||||
/* Lookup in view layer is logically const as it only checks a cache. */
|
||||
BKE_view_layer_synced_ensure(tvc->scene, tvc->view_layer);
|
||||
const Base *base = (te->directdata) ? (const Base *)te->directdata :
|
||||
BKE_view_layer_base_find(
|
||||
(ViewLayer *)tvc->view_layer, (Object *)ob);
|
||||
|
@ -3281,6 +3285,7 @@ static void outliner_draw_tree_element(bContext *C,
|
|||
if (tselem->type == TSE_SOME_ID) {
|
||||
if (te->idcode == ID_OB) {
|
||||
Object *ob = (Object *)tselem->id;
|
||||
BKE_view_layer_synced_ensure(tvc->scene, tvc->view_layer);
|
||||
Base *base = (te->directdata) ? (Base *)te->directdata :
|
||||
BKE_view_layer_base_find(tvc->view_layer, ob);
|
||||
const bool is_selected = (base != nullptr) && ((base->flag & BASE_SELECTED) != 0);
|
||||
|
|
|
@ -1262,10 +1262,12 @@ static int outliner_open_back(TreeElement *te)
|
|||
/* Return element representing the active base or bone in the outliner, or NULL if none exists */
|
||||
static TreeElement *outliner_show_active_get_element(bContext *C,
|
||||
SpaceOutliner *space_outliner,
|
||||
const Scene *scene,
|
||||
ViewLayer *view_layer)
|
||||
{
|
||||
TreeElement *te;
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
if (!obact) {
|
||||
|
@ -1317,11 +1319,13 @@ static void outliner_show_active(SpaceOutliner *space_outliner,
|
|||
static int outliner_show_active_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
{
|
||||
SpaceOutliner *space_outliner = CTX_wm_space_outliner(C);
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
ARegion *region = CTX_wm_region(C);
|
||||
View2D *v2d = ®ion->v2d;
|
||||
|
||||
TreeElement *active_element = outliner_show_active_get_element(C, space_outliner, view_layer);
|
||||
TreeElement *active_element = outliner_show_active_get_element(
|
||||
C, space_outliner, scene, view_layer);
|
||||
|
||||
if (active_element) {
|
||||
ID *id = TREESTORE(active_element)->id;
|
||||
|
|
|
@ -164,6 +164,7 @@ static void do_outliner_item_mode_toggle_generic(bContext *C, TreeViewContext *t
|
|||
ED_undo_group_begin(C);
|
||||
|
||||
if (ED_object_mode_set(C, OB_MODE_OBJECT)) {
|
||||
BKE_view_layer_synced_ensure(tvc->scene, tvc->view_layer);
|
||||
Base *base_active = BKE_view_layer_base_find(tvc->view_layer, tvc->obact);
|
||||
if (base_active != base) {
|
||||
BKE_view_layer_base_deselect_all(tvc->scene, tvc->view_layer);
|
||||
|
@ -188,6 +189,7 @@ void outliner_item_mode_toggle(bContext *C,
|
|||
|
||||
if ((tselem->type == TSE_SOME_ID) && (te->idcode == ID_OB)) {
|
||||
Object *ob = (Object *)tselem->id;
|
||||
BKE_view_layer_synced_ensure(tvc->scene, tvc->view_layer);
|
||||
Base *base = BKE_view_layer_base_find(tvc->view_layer, ob);
|
||||
|
||||
/* Hidden objects can be removed from the mode. */
|
||||
|
@ -234,11 +236,13 @@ static void tree_element_viewlayer_activate(bContext *C, TreeElement *te)
|
|||
/**
|
||||
* Select object tree
|
||||
*/
|
||||
static void do_outliner_object_select_recursive(ViewLayer *view_layer,
|
||||
static void do_outliner_object_select_recursive(const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
Object *ob_parent,
|
||||
bool select)
|
||||
{
|
||||
LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LISTBASE_FOREACH (Base *, base, BKE_view_layer_object_bases_get(view_layer)) {
|
||||
Object *ob = base->object;
|
||||
if ((((base->flag & BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT) != 0) &&
|
||||
BKE_object_is_child_recursive(ob_parent, ob))) {
|
||||
|
@ -300,6 +304,7 @@ static void tree_element_object_activate(bContext *C,
|
|||
ob = (Object *)parent_tselem->id;
|
||||
|
||||
/* Don't return when activating children of the previous active object. */
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (ob == BKE_view_layer_active_object_get(view_layer) && set == OL_SETSEL_NONE) {
|
||||
return;
|
||||
}
|
||||
|
@ -316,6 +321,7 @@ static void tree_element_object_activate(bContext *C,
|
|||
}
|
||||
|
||||
/* find associated base in current scene */
|
||||
BKE_view_layer_synced_ensure(sce, view_layer);
|
||||
base = BKE_view_layer_base_find(view_layer, ob);
|
||||
|
||||
if (scene->toolsettings->object_flag & SCE_OBJECT_MODE_LOCK) {
|
||||
|
@ -371,7 +377,8 @@ static void tree_element_object_activate(bContext *C,
|
|||
|
||||
if (recursive) {
|
||||
/* Recursive select/deselect for Object hierarchies */
|
||||
do_outliner_object_select_recursive(view_layer, ob, (base->flag & BASE_SELECTED) != 0);
|
||||
do_outliner_object_select_recursive(
|
||||
scene, view_layer, ob, (base->flag & BASE_SELECTED) != 0);
|
||||
}
|
||||
|
||||
if (set != OL_SETSEL_NONE) {
|
||||
|
@ -382,11 +389,15 @@ static void tree_element_object_activate(bContext *C,
|
|||
}
|
||||
}
|
||||
|
||||
static void tree_element_material_activate(bContext *C, ViewLayer *view_layer, TreeElement *te)
|
||||
static void tree_element_material_activate(bContext *C,
|
||||
const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
TreeElement *te)
|
||||
{
|
||||
/* we search for the object parent */
|
||||
Object *ob = (Object *)outliner_search_back(te, ID_OB);
|
||||
/* Note : ob->matbits can be nullptr when a local object points to a library mesh. */
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (ob == nullptr || ob != BKE_view_layer_active_object_get(view_layer) ||
|
||||
ob->matbits == nullptr) {
|
||||
return; /* just paranoia */
|
||||
|
@ -536,6 +547,7 @@ static void tree_element_posechannel_activate(bContext *C,
|
|||
}
|
||||
|
||||
static void tree_element_bone_activate(bContext *C,
|
||||
const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
TreeElement *te,
|
||||
TreeStoreElem *tselem,
|
||||
|
@ -546,6 +558,7 @@ static void tree_element_bone_activate(bContext *C,
|
|||
Bone *bone = static_cast<Bone *>(te->directdata);
|
||||
|
||||
if (!(bone->flag & BONE_HIDDEN_P)) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
if (ob) {
|
||||
if (set != OL_SETSEL_EXTEND) {
|
||||
|
@ -769,7 +782,7 @@ void tree_element_activate(bContext *C,
|
|||
}
|
||||
break;
|
||||
case ID_MA:
|
||||
tree_element_material_activate(C, tvc->view_layer, te);
|
||||
tree_element_material_activate(C, tvc->scene, tvc->view_layer, te);
|
||||
break;
|
||||
case ID_WO:
|
||||
tree_element_world_activate(C, tvc->scene, te);
|
||||
|
@ -796,7 +809,7 @@ void tree_element_type_active_set(bContext *C,
|
|||
tree_element_defgroup_activate(C, te, tselem);
|
||||
break;
|
||||
case TSE_BONE:
|
||||
tree_element_bone_activate(C, tvc->view_layer, te, tselem, set, recursive);
|
||||
tree_element_bone_activate(C, tvc->scene, tvc->view_layer, te, tselem, set, recursive);
|
||||
break;
|
||||
case TSE_EBONE:
|
||||
tree_element_ebone_activate(C, tvc->scene, tvc->view_layer, te, tselem, set, recursive);
|
||||
|
@ -844,11 +857,13 @@ void tree_element_type_active_set(bContext *C,
|
|||
}
|
||||
}
|
||||
|
||||
static eOLDrawState tree_element_defgroup_state_get(const ViewLayer *view_layer,
|
||||
static eOLDrawState tree_element_defgroup_state_get(const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
const TreeElement *te,
|
||||
const TreeStoreElem *tselem)
|
||||
{
|
||||
const Object *ob = (const Object *)tselem->id;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (ob == BKE_view_layer_active_object_get(view_layer)) {
|
||||
if (BKE_object_defgroup_active_index_get(ob) == te->index + 1) {
|
||||
return OL_DRAWSEL_NORMAL;
|
||||
|
@ -857,12 +872,14 @@ static eOLDrawState tree_element_defgroup_state_get(const ViewLayer *view_layer,
|
|||
return OL_DRAWSEL_NONE;
|
||||
}
|
||||
|
||||
static eOLDrawState tree_element_bone_state_get(const ViewLayer *view_layer,
|
||||
static eOLDrawState tree_element_bone_state_get(const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
const TreeElement *te,
|
||||
const TreeStoreElem *tselem)
|
||||
{
|
||||
const bArmature *arm = (const bArmature *)tselem->id;
|
||||
const Bone *bone = static_cast<Bone *>(te->directdata);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
const Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
if (ob && ob->data == arm) {
|
||||
if (bone->flag & BONE_SELECTED) {
|
||||
|
@ -896,11 +913,13 @@ static eOLDrawState tree_element_object_state_get(const TreeViewContext *tvc,
|
|||
return (tselem->id == (const ID *)tvc->obact) ? OL_DRAWSEL_NORMAL : OL_DRAWSEL_NONE;
|
||||
}
|
||||
|
||||
static eOLDrawState tree_element_pose_state_get(const ViewLayer *view_layer,
|
||||
static eOLDrawState tree_element_pose_state_get(const Scene *scene,
|
||||
const ViewLayer *view_layer,
|
||||
const TreeStoreElem *tselem)
|
||||
{
|
||||
const Object *ob = (const Object *)tselem->id;
|
||||
/* This will just lookup in a cache, it will not change the arguments. */
|
||||
BKE_view_layer_synced_ensure(scene, (ViewLayer *)view_layer);
|
||||
const Base *base = BKE_view_layer_base_find((ViewLayer *)view_layer, (Object *)ob);
|
||||
if (base == nullptr) {
|
||||
/* Armature not instantiated in current scene (e.g. inside an appended group). */
|
||||
|
@ -942,12 +961,14 @@ static eOLDrawState tree_element_viewlayer_state_get(const bContext *C, const Tr
|
|||
return OL_DRAWSEL_NONE;
|
||||
}
|
||||
|
||||
static eOLDrawState tree_element_posegroup_state_get(const ViewLayer *view_layer,
|
||||
static eOLDrawState tree_element_posegroup_state_get(const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
const TreeElement *te,
|
||||
const TreeStoreElem *tselem)
|
||||
{
|
||||
const Object *ob = (const Object *)tselem->id;
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (ob == BKE_view_layer_active_object_get(view_layer) && ob->pose) {
|
||||
if (ob->pose->active_group == te->index + 1) {
|
||||
return OL_DRAWSEL_NORMAL;
|
||||
|
@ -1008,12 +1029,14 @@ static eOLDrawState tree_element_layer_collection_state_get(const bContext *C,
|
|||
return OL_DRAWSEL_NONE;
|
||||
}
|
||||
|
||||
static eOLDrawState tree_element_active_material_get(const ViewLayer *view_layer,
|
||||
static eOLDrawState tree_element_active_material_get(const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
const TreeElement *te)
|
||||
{
|
||||
/* we search for the object parent */
|
||||
const Object *ob = (const Object *)outliner_search_back((TreeElement *)te, ID_OB);
|
||||
/* Note : ob->matbits can be nullptr when a local object points to a library mesh. */
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (ob == nullptr || ob != BKE_view_layer_active_object_get(view_layer) ||
|
||||
ob->matbits == nullptr) {
|
||||
return OL_DRAWSEL_NONE; /* just paranoia */
|
||||
|
@ -1084,7 +1107,7 @@ eOLDrawState tree_element_active_state_get(const TreeViewContext *tvc,
|
|||
return OL_DRAWSEL_NONE;
|
||||
break;
|
||||
case ID_MA:
|
||||
return tree_element_active_material_get(tvc->view_layer, te);
|
||||
return tree_element_active_material_get(tvc->scene, tvc->view_layer, te);
|
||||
case ID_WO:
|
||||
return tree_element_active_world_get(tvc->scene, te);
|
||||
case ID_CA:
|
||||
|
@ -1100,9 +1123,9 @@ eOLDrawState tree_element_type_active_state_get(const bContext *C,
|
|||
{
|
||||
switch (tselem->type) {
|
||||
case TSE_DEFGROUP:
|
||||
return tree_element_defgroup_state_get(tvc->view_layer, te, tselem);
|
||||
return tree_element_defgroup_state_get(tvc->scene, tvc->view_layer, te, tselem);
|
||||
case TSE_BONE:
|
||||
return tree_element_bone_state_get(tvc->view_layer, te, tselem);
|
||||
return tree_element_bone_state_get(tvc->scene, tvc->view_layer, te, tselem);
|
||||
case TSE_EBONE:
|
||||
return tree_element_ebone_state_get(te);
|
||||
case TSE_MODIFIER:
|
||||
|
@ -1112,7 +1135,7 @@ eOLDrawState tree_element_type_active_state_get(const bContext *C,
|
|||
case TSE_LINKED_PSYS:
|
||||
return OL_DRAWSEL_NONE;
|
||||
case TSE_POSE_BASE:
|
||||
return tree_element_pose_state_get(tvc->view_layer, tselem);
|
||||
return tree_element_pose_state_get(tvc->scene, tvc->view_layer, tselem);
|
||||
case TSE_POSE_CHANNEL:
|
||||
return tree_element_posechannel_state_get(tvc->ob_pose, te, tselem);
|
||||
case TSE_CONSTRAINT_BASE:
|
||||
|
@ -1121,7 +1144,7 @@ eOLDrawState tree_element_type_active_state_get(const bContext *C,
|
|||
case TSE_R_LAYER:
|
||||
return tree_element_viewlayer_state_get(C, te);
|
||||
case TSE_POSEGRP:
|
||||
return tree_element_posegroup_state_get(tvc->view_layer, te, tselem);
|
||||
return tree_element_posegroup_state_get(tvc->scene, tvc->view_layer, te, tselem);
|
||||
case TSE_SEQUENCE:
|
||||
return tree_element_sequence_state_get(tvc->scene, te);
|
||||
case TSE_SEQUENCE_DUP:
|
||||
|
@ -1402,6 +1425,7 @@ static void do_outliner_item_activate_tree_element(bContext *C,
|
|||
}
|
||||
else if ((te->idcode == ID_GR) && (space_outliner->outlinevis != SO_VIEW_LAYER)) {
|
||||
Collection *gr = (Collection *)tselem->id;
|
||||
BKE_view_layer_synced_ensure(tvc->scene, tvc->view_layer);
|
||||
|
||||
if (extend) {
|
||||
eObjectSelect_Mode sel = BA_SELECT;
|
||||
|
@ -1575,7 +1599,9 @@ static bool outliner_is_co_within_active_mode_column(bContext *C,
|
|||
SpaceOutliner *space_outliner,
|
||||
const float view_mval[2])
|
||||
{
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
return outliner_is_co_within_mode_column(space_outliner, view_mval) && obact &&
|
||||
|
|
|
@ -225,7 +225,8 @@ static void outliner_select_sync_to_object(ViewLayer *view_layer,
|
|||
}
|
||||
}
|
||||
|
||||
static void outliner_select_sync_to_edit_bone(ViewLayer *view_layer,
|
||||
static void outliner_select_sync_to_edit_bone(const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
TreeElement *te,
|
||||
TreeStoreElem *tselem,
|
||||
GSet *selected_ebones)
|
||||
|
@ -250,6 +251,7 @@ static void outliner_select_sync_to_edit_bone(ViewLayer *view_layer,
|
|||
|
||||
/* Tag if selection changed */
|
||||
if (bone_flag != ebone->flag) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
DEG_id_tag_update(&arm->id, ID_RECALC_SELECT);
|
||||
WM_main_add_notifier(NC_OBJECT | ND_BONE_SELECT, obedit);
|
||||
|
@ -318,7 +320,8 @@ static void outliner_sync_selection_from_outliner(Scene *scene,
|
|||
}
|
||||
else if (tselem->type == TSE_EBONE) {
|
||||
if (sync_types->edit_bone) {
|
||||
outliner_select_sync_to_edit_bone(view_layer, te, tselem, selected_items->edit_bones);
|
||||
outliner_select_sync_to_edit_bone(
|
||||
scene, view_layer, te, tselem, selected_items->edit_bones);
|
||||
}
|
||||
}
|
||||
else if (tselem->type == TSE_POSE_CHANNEL) {
|
||||
|
@ -388,12 +391,14 @@ void ED_outliner_select_sync_from_outliner(bContext *C, SpaceOutliner *space_out
|
|||
|
||||
namespace blender::ed::outliner {
|
||||
|
||||
static void outliner_select_sync_from_object(ViewLayer *view_layer,
|
||||
static void outliner_select_sync_from_object(const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
Object *obact,
|
||||
TreeElement *te,
|
||||
TreeStoreElem *tselem)
|
||||
{
|
||||
Object *ob = (Object *)tselem->id;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = (te->directdata) ? (Base *)te->directdata :
|
||||
BKE_view_layer_base_find(view_layer, ob);
|
||||
const bool is_selected = (base != nullptr) && ((base->flag & BASE_SELECTED) != 0);
|
||||
|
@ -487,7 +492,8 @@ struct SyncSelectActiveData {
|
|||
};
|
||||
|
||||
/** Sync select and active flags from active view layer, bones, and sequences to the outliner. */
|
||||
static void outliner_sync_selection_to_outliner(ViewLayer *view_layer,
|
||||
static void outliner_sync_selection_to_outliner(const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
SpaceOutliner *space_outliner,
|
||||
ListBase *tree,
|
||||
SyncSelectActiveData *active_data,
|
||||
|
@ -498,7 +504,7 @@ static void outliner_sync_selection_to_outliner(ViewLayer *view_layer,
|
|||
|
||||
if ((tselem->type == TSE_SOME_ID) && te->idcode == ID_OB) {
|
||||
if (sync_types->object) {
|
||||
outliner_select_sync_from_object(view_layer, active_data->object, te, tselem);
|
||||
outliner_select_sync_from_object(scene, view_layer, active_data->object, te, tselem);
|
||||
}
|
||||
}
|
||||
else if (tselem->type == TSE_EBONE) {
|
||||
|
@ -522,7 +528,7 @@ static void outliner_sync_selection_to_outliner(ViewLayer *view_layer,
|
|||
|
||||
/* Sync subtree elements */
|
||||
outliner_sync_selection_to_outliner(
|
||||
view_layer, space_outliner, &te->subtree, active_data, sync_types);
|
||||
scene, view_layer, space_outliner, &te->subtree, active_data, sync_types);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -531,6 +537,7 @@ static void get_sync_select_active_data(const bContext *C, SyncSelectActiveData
|
|||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
active_data->object = BKE_view_layer_active_object_get(view_layer);
|
||||
active_data->edit_bone = CTX_data_active_bone(C);
|
||||
active_data->pose_channel = CTX_data_active_pose_bone(C);
|
||||
|
@ -545,6 +552,7 @@ void outliner_sync_selection(const bContext *C, SpaceOutliner *space_outliner)
|
|||
C, space_outliner, &sync_types);
|
||||
|
||||
if (sync_required) {
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
|
||||
/* Store active object, bones, and sequence */
|
||||
|
@ -552,7 +560,7 @@ void outliner_sync_selection(const bContext *C, SpaceOutliner *space_outliner)
|
|||
get_sync_select_active_data(C, &active_data);
|
||||
|
||||
outliner_sync_selection_to_outliner(
|
||||
view_layer, space_outliner, &space_outliner->tree, &active_data, &sync_types);
|
||||
scene, view_layer, space_outliner, &space_outliner->tree, &active_data, &sync_types);
|
||||
|
||||
/* Keep any un-synced data in the dirty flag. */
|
||||
if (sync_types.object) {
|
||||
|
|
|
@ -782,8 +782,10 @@ static void object_select_fn(bContext *C,
|
|||
TreeStoreElem *tselem,
|
||||
void *UNUSED(user_data))
|
||||
{
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
Object *ob = (Object *)tselem->id;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_base_find(view_layer, ob);
|
||||
|
||||
if (base) {
|
||||
|
@ -820,8 +822,10 @@ static void object_deselect_fn(bContext *C,
|
|||
TreeStoreElem *tselem,
|
||||
void *UNUSED(user_data))
|
||||
{
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
Object *ob = (Object *)tselem->id;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_base_find(view_layer, ob);
|
||||
|
||||
if (base) {
|
||||
|
@ -1317,6 +1321,7 @@ static void id_override_library_clear_single_fn(bContext *C,
|
|||
* override. */
|
||||
if (BKE_lib_override_library_is_hierarchy_leaf(bmain, id)) {
|
||||
bool do_remap_active = false;
|
||||
BKE_view_layer_synced_ensure(CTX_data_scene(C), view_layer);
|
||||
if (BKE_view_layer_active_object_get(view_layer) == reinterpret_cast<Object *>(id)) {
|
||||
BLI_assert(GS(id->name) == ID_OB);
|
||||
do_remap_active = true;
|
||||
|
@ -2108,9 +2113,10 @@ static Base *outliner_batch_delete_hierarchy(
|
|||
if (!base) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
object = base->object;
|
||||
for (child_base = static_cast<Base *>(view_layer->object_bases.first); child_base;
|
||||
for (child_base = static_cast<Base *>(BKE_view_layer_object_bases_get(view_layer)->first);
|
||||
child_base;
|
||||
child_base = base_next) {
|
||||
base_next = child_base->next;
|
||||
for (parent = child_base->object->parent; parent && (parent != object);
|
||||
|
@ -2160,6 +2166,7 @@ static void object_batch_delete_hierarchy_fn(bContext *C,
|
|||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
Object *obedit = CTX_data_edit_object(C);
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_base_find(view_layer, ob);
|
||||
|
||||
if (base) {
|
||||
|
@ -2384,7 +2391,8 @@ static int outliner_delete_exec(bContext *C, wmOperator *op)
|
|||
SpaceOutliner *space_outliner = CTX_wm_space_outliner(C);
|
||||
struct wmMsgBus *mbus = CTX_wm_message_bus(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
const Base *basact_prev = view_layer->basact;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
const Base *basact_prev = BKE_view_layer_active_base_get(view_layer);
|
||||
|
||||
const bool delete_hierarchy = RNA_boolean_get(op->ptr, "hierarchy");
|
||||
|
||||
|
@ -2428,7 +2436,8 @@ static int outliner_delete_exec(bContext *C, wmOperator *op)
|
|||
DEG_id_tag_update(&scene->id, ID_RECALC_COPY_ON_WRITE);
|
||||
DEG_relations_tag_update(bmain);
|
||||
|
||||
if (basact_prev != view_layer->basact) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (basact_prev != BKE_view_layer_active_base_get(view_layer)) {
|
||||
WM_event_add_notifier(C, NC_SCENE | ND_OB_ACTIVE, scene);
|
||||
WM_msg_publish_rna_prop(mbus, &scene->id, view_layer, LayerObjects, active);
|
||||
}
|
||||
|
|
|
@ -1395,7 +1395,8 @@ static int outliner_exclude_filter_get(const SpaceOutliner *space_outliner)
|
|||
return exclude_filter;
|
||||
}
|
||||
|
||||
static bool outliner_element_visible_get(ViewLayer *view_layer,
|
||||
static bool outliner_element_visible_get(const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
TreeElement *te,
|
||||
const int exclude_filter)
|
||||
{
|
||||
|
@ -1450,6 +1451,7 @@ static bool outliner_element_visible_get(ViewLayer *view_layer,
|
|||
|
||||
if (exclude_filter & SO_FILTER_OB_STATE) {
|
||||
if (base == nullptr) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
base = BKE_view_layer_base_find(view_layer, ob);
|
||||
|
||||
if (base == nullptr) {
|
||||
|
@ -1475,7 +1477,8 @@ static bool outliner_element_visible_get(ViewLayer *view_layer,
|
|||
}
|
||||
else {
|
||||
BLI_assert(exclude_filter & SO_FILTER_OB_STATE_ACTIVE);
|
||||
if (base != view_layer->basact) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (base != BKE_view_layer_active_base_get(view_layer)) {
|
||||
is_visible = false;
|
||||
}
|
||||
}
|
||||
|
@ -1557,6 +1560,7 @@ static TreeElement *outliner_extract_children_from_subtree(TreeElement *element,
|
|||
}
|
||||
|
||||
static int outliner_filter_subtree(SpaceOutliner *space_outliner,
|
||||
const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
ListBase *lb,
|
||||
const char *search_string,
|
||||
|
@ -1567,18 +1571,18 @@ static int outliner_filter_subtree(SpaceOutliner *space_outliner,
|
|||
|
||||
for (te = static_cast<TreeElement *>(lb->first); te; te = te_next) {
|
||||
te_next = te->next;
|
||||
if ((outliner_element_visible_get(view_layer, te, exclude_filter) == false)) {
|
||||
if ((outliner_element_visible_get(scene, view_layer, te, exclude_filter) == false)) {
|
||||
/* Don't free the tree, but extract the children from the parent and add to this tree. */
|
||||
/* This also needs filtering the subtree prior (see T69246). */
|
||||
outliner_filter_subtree(
|
||||
space_outliner, view_layer, &te->subtree, search_string, exclude_filter);
|
||||
space_outliner, scene, view_layer, &te->subtree, search_string, exclude_filter);
|
||||
te_next = outliner_extract_children_from_subtree(te, lb);
|
||||
continue;
|
||||
}
|
||||
if ((exclude_filter & SO_FILTER_SEARCH) == 0) {
|
||||
/* Filter subtree too. */
|
||||
outliner_filter_subtree(
|
||||
space_outliner, view_layer, &te->subtree, search_string, exclude_filter);
|
||||
space_outliner, scene, view_layer, &te->subtree, search_string, exclude_filter);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -1596,7 +1600,8 @@ static int outliner_filter_subtree(SpaceOutliner *space_outliner,
|
|||
|
||||
if ((!TSELEM_OPEN(tselem, space_outliner)) ||
|
||||
outliner_filter_subtree(
|
||||
space_outliner, view_layer, &te->subtree, search_string, exclude_filter) == 0) {
|
||||
space_outliner, scene, view_layer, &te->subtree, search_string, exclude_filter) ==
|
||||
0) {
|
||||
outliner_free_tree_element(te, lb);
|
||||
}
|
||||
}
|
||||
|
@ -1608,7 +1613,7 @@ static int outliner_filter_subtree(SpaceOutliner *space_outliner,
|
|||
|
||||
/* filter subtree too */
|
||||
outliner_filter_subtree(
|
||||
space_outliner, view_layer, &te->subtree, search_string, exclude_filter);
|
||||
space_outliner, scene, view_layer, &te->subtree, search_string, exclude_filter);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1616,7 +1621,9 @@ static int outliner_filter_subtree(SpaceOutliner *space_outliner,
|
|||
return (BLI_listbase_is_empty(lb) == false);
|
||||
}
|
||||
|
||||
static void outliner_filter_tree(SpaceOutliner *space_outliner, ViewLayer *view_layer)
|
||||
static void outliner_filter_tree(SpaceOutliner *space_outliner,
|
||||
const Scene *scene,
|
||||
ViewLayer *view_layer)
|
||||
{
|
||||
char search_buff[sizeof(((struct SpaceOutliner *)nullptr)->search_string) + 2];
|
||||
char *search_string;
|
||||
|
@ -1637,7 +1644,7 @@ static void outliner_filter_tree(SpaceOutliner *space_outliner, ViewLayer *view_
|
|||
}
|
||||
|
||||
outliner_filter_subtree(
|
||||
space_outliner, view_layer, &space_outliner->tree, search_string, exclude_filter);
|
||||
space_outliner, scene, view_layer, &space_outliner->tree, search_string, exclude_filter);
|
||||
}
|
||||
|
||||
static void outliner_clear_newid_from_main(Main *bmain)
|
||||
|
@ -1714,7 +1721,7 @@ void outliner_build_tree(Main *mainvar,
|
|||
outliner_collections_children_sort(&space_outliner->tree);
|
||||
}
|
||||
|
||||
outliner_filter_tree(space_outliner, view_layer);
|
||||
outliner_filter_tree(space_outliner, scene, view_layer);
|
||||
outliner_restore_scrolling_position(space_outliner, region, &focus);
|
||||
|
||||
/* `ID.newid` pointer is abused when building tree, DO NOT call #BKE_main_id_newptr_and_tag_clear
|
||||
|
|
|
@ -45,6 +45,7 @@ void outliner_viewcontext_init(const bContext *C, TreeViewContext *tvc)
|
|||
tvc->view_layer = CTX_data_view_layer(C);
|
||||
|
||||
/* Objects. */
|
||||
BKE_view_layer_synced_ensure(tvc->scene, tvc->view_layer);
|
||||
tvc->obact = BKE_view_layer_active_object_get(tvc->view_layer);
|
||||
if (tvc->obact != nullptr) {
|
||||
tvc->ob_edit = OBEDIT_FROM_OBACT(tvc->obact);
|
||||
|
@ -452,6 +453,7 @@ using namespace blender::ed::outliner;
|
|||
Base *ED_outliner_give_base_under_cursor(bContext *C, const int mval[2])
|
||||
{
|
||||
ARegion *region = CTX_wm_region(C);
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
SpaceOutliner *space_outliner = CTX_wm_space_outliner(C);
|
||||
TreeElement *te;
|
||||
|
@ -465,6 +467,7 @@ Base *ED_outliner_give_base_under_cursor(bContext *C, const int mval[2])
|
|||
TreeStoreElem *tselem = TREESTORE(te);
|
||||
if ((tselem->type == TSE_SOME_ID) && (te->idcode == ID_OB)) {
|
||||
Object *ob = (Object *)tselem->id;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
base = (te->directdata) ? (Base *)te->directdata : BKE_view_layer_base_find(view_layer, ob);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -105,6 +105,7 @@ class AbstractTreeDisplay {
|
|||
* \brief Tree-Display for the View Layer display mode.
|
||||
*/
|
||||
class TreeDisplayViewLayer final : public AbstractTreeDisplay {
|
||||
Scene *scene_ = nullptr;
|
||||
ViewLayer *view_layer_ = nullptr;
|
||||
bool show_objects_ = true;
|
||||
|
||||
|
|
|
@ -64,6 +64,7 @@ ListBase TreeDisplayViewLayer::buildTree(const TreeSourceData &source_data)
|
|||
{
|
||||
ListBase tree = {nullptr};
|
||||
Scene *scene = source_data.scene;
|
||||
scene_ = scene;
|
||||
show_objects_ = !(space_outliner_.filter & SO_FILTER_NO_OBJECT);
|
||||
|
||||
for (auto *view_layer : ListBaseWrapper<ViewLayer>(scene->view_layers)) {
|
||||
|
@ -96,7 +97,8 @@ void TreeDisplayViewLayer::add_view_layer(Scene &scene, ListBase &tree, TreeElem
|
|||
|
||||
if (space_outliner_.filter & SO_FILTER_NO_COLLECTION) {
|
||||
/* Show objects in the view layer. */
|
||||
for (Base *base : List<Base>(view_layer_->object_bases)) {
|
||||
BKE_view_layer_synced_ensure(&scene, view_layer_);
|
||||
for (Base *base : List<Base>(*BKE_view_layer_object_bases_get(view_layer_))) {
|
||||
TreeElement *te_object = outliner_add_element(
|
||||
&space_outliner_, &tree, base->object, parent, TSE_SOME_ID, 0);
|
||||
te_object->directdata = base;
|
||||
|
@ -166,6 +168,7 @@ void TreeDisplayViewLayer::add_layer_collection_objects(ListBase &tree,
|
|||
LayerCollection &lc,
|
||||
TreeElement &ten)
|
||||
{
|
||||
BKE_view_layer_synced_ensure(scene_, view_layer_);
|
||||
for (CollectionObject *cob : List<CollectionObject>(lc.collection->gobject)) {
|
||||
Base *base = BKE_view_layer_base_find(view_layer_, cob->ob);
|
||||
TreeElement *te_object = outliner_add_element(
|
||||
|
|
|
@ -752,6 +752,7 @@ static void view3d_ob_drop_copy_external_asset(bContext *UNUSED(C), wmDrag *drag
|
|||
|
||||
RNA_int_set(drop->ptr, "session_uuid", id->session_uuid);
|
||||
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_base_find(view_layer, (Object *)id);
|
||||
if (base != NULL) {
|
||||
BKE_view_layer_base_select_and_set_active(view_layer, base);
|
||||
|
@ -804,6 +805,7 @@ static void view3d_collection_drop_copy_external_asset(bContext *UNUSED(C),
|
|||
|
||||
/* Make an object active, just use the first one in the collection. */
|
||||
CollectionObject *cobject = collection->gobject.first;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = cobject ? BKE_view_layer_base_find(view_layer, cobject->ob) : NULL;
|
||||
if (base) {
|
||||
BLI_assert((base->flag & BASE_SELECTABLE) && (base->flag & BASE_ENABLED_VIEWPORT));
|
||||
|
@ -1404,7 +1406,9 @@ static void view3d_main_region_message_subscribe(const wmRegionMessageSubscribeP
|
|||
WM_msg_subscribe_rna_anon_type(mbus, SceneDisplay, &msg_sub_value_region_tag_redraw);
|
||||
WM_msg_subscribe_rna_anon_type(mbus, ObjectDisplay, &msg_sub_value_region_tag_redraw);
|
||||
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obact = BKE_view_layer_active_object_get(view_layer);
|
||||
if (obact != NULL) {
|
||||
switch (obact->mode) {
|
||||
|
@ -1439,7 +1443,9 @@ static void view3d_main_region_cursor(wmWindow *win, ScrArea *area, ARegion *reg
|
|||
return;
|
||||
}
|
||||
|
||||
Scene *scene = WM_window_get_active_scene(win);
|
||||
ViewLayer *view_layer = WM_window_get_active_view_layer(win);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *obedit = BKE_view_layer_edit_object_get(view_layer);
|
||||
if (obedit) {
|
||||
WM_cursor_set(win, WM_CURSOR_EDIT);
|
||||
|
@ -1888,11 +1894,14 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
|
|||
* without showing the object.
|
||||
*
|
||||
* See T85532 for alternatives that were considered. */
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
if (view_layer->basact) {
|
||||
Object *ob = view_layer->basact->object;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_active_base_get(view_layer);
|
||||
if (base) {
|
||||
Object *ob = base->object;
|
||||
/* if hidden but in edit mode, we still display, can happen with animation */
|
||||
if ((view_layer->basact->flag & BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT) != 0 ||
|
||||
if ((base->flag & BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT) != 0 ||
|
||||
(ob->mode != OB_MODE_OBJECT)) {
|
||||
CTX_data_id_pointer_set(result, &ob->id);
|
||||
}
|
||||
|
|
|
@ -1278,8 +1278,10 @@ static void do_view3d_vgroup_buttons(bContext *C, void *UNUSED(arg), int event)
|
|||
return;
|
||||
}
|
||||
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
Object *ob = view_layer->basact->object;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
ED_vgroup_vert_active_mirror(ob, event - B_VGRP_PNL_EDIT_SINGLE);
|
||||
DEG_id_tag_update(ob->data, ID_RECALC_GEOMETRY);
|
||||
WM_event_add_notifier(C, NC_GEOM | ND_DATA, ob->data);
|
||||
|
@ -1287,7 +1289,9 @@ static void do_view3d_vgroup_buttons(bContext *C, void *UNUSED(arg), int event)
|
|||
|
||||
static bool view3d_panel_vgroup_poll(const bContext *C, PanelType *UNUSED(pt))
|
||||
{
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
if (ob && (BKE_object_is_in_editmode_vgroup(ob) || BKE_object_is_in_wpaint_select_vert(ob))) {
|
||||
MDeformVert *dvert_act = ED_mesh_active_dvert_get_only(ob);
|
||||
|
@ -1304,7 +1308,8 @@ static void view3d_panel_vgroup(const bContext *C, Panel *panel)
|
|||
uiBlock *block = uiLayoutAbsoluteBlock(panel->layout);
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
Object *ob = view_layer->basact->object;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
MDeformVert *dv;
|
||||
|
||||
|
@ -1686,8 +1691,10 @@ static void v3d_editmetaball_buts(uiLayout *layout, Object *ob)
|
|||
|
||||
static void do_view3d_region_buttons(bContext *C, void *UNUSED(index), int event)
|
||||
{
|
||||
Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
switch (event) {
|
||||
|
@ -1715,15 +1722,19 @@ static void do_view3d_region_buttons(bContext *C, void *UNUSED(index), int event
|
|||
|
||||
static bool view3d_panel_transform_poll(const bContext *C, PanelType *UNUSED(pt))
|
||||
{
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
return (view_layer->basact != NULL);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
return (BKE_view_layer_active_base_get(view_layer) != NULL);
|
||||
}
|
||||
|
||||
static void view3d_panel_transform(const bContext *C, Panel *panel)
|
||||
{
|
||||
uiBlock *block;
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
Object *ob = view_layer->basact->object;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
Object *obedit = OBEDIT_FROM_OBACT(ob);
|
||||
uiLayout *col;
|
||||
|
||||
|
|
|
@ -692,6 +692,7 @@ static void v3d_cursor_snap_update(V3DSnapCursorState *state,
|
|||
}
|
||||
else {
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(CTX_data_scene(C), view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
const int orient_index = BKE_scene_orientation_get_index(scene, SCE_ORIENT_DEFAULT);
|
||||
const int pivot_point = scene->toolsettings->transform_pivot_point;
|
||||
|
|
|
@ -1306,7 +1306,8 @@ static void draw_selected_name(
|
|||
s += sprintf(s, "(%d)", cfra);
|
||||
|
||||
if ((ob == NULL) || (ob->mode == OB_MODE_OBJECT)) {
|
||||
LayerCollection *layer_collection = view_layer->active_collection;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
LayerCollection *layer_collection = BKE_view_layer_active_collection_get(view_layer);
|
||||
s += sprintf(s,
|
||||
" %s%s",
|
||||
BKE_collection_ui_name_get(layer_collection->collection),
|
||||
|
@ -1497,6 +1498,7 @@ void view3d_draw_region_info(const bContext *C, ARegion *region)
|
|||
}
|
||||
|
||||
if (U.uiflag & USER_DRAWVIEWINFO) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
draw_selected_name(scene, view_layer, ob, xoffset, &yoffset);
|
||||
}
|
||||
|
@ -2121,6 +2123,7 @@ bool ED_view3d_clipping_test(const RegionView3D *rv3d, const float co[3], const
|
|||
* \note Only use in object mode.
|
||||
*/
|
||||
static void validate_object_select_id(struct Depsgraph *depsgraph,
|
||||
const Scene *scene,
|
||||
ViewLayer *view_layer,
|
||||
ARegion *region,
|
||||
View3D *v3d,
|
||||
|
@ -2153,6 +2156,7 @@ static void validate_object_select_id(struct Depsgraph *depsgraph,
|
|||
}
|
||||
|
||||
if (obact_eval && ((obact_eval->base_flag & BASE_ENABLED_AND_MAYBE_VISIBLE_IN_VIEWPORT) != 0)) {
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_base_find(view_layer, obact);
|
||||
DRW_select_buffer_context_create(&base, 1, -1);
|
||||
}
|
||||
|
@ -2188,7 +2192,8 @@ static void view3d_opengl_read_Z_pixels(GPUViewport *viewport, rcti *rect, void
|
|||
|
||||
void ED_view3d_select_id_validate(ViewContext *vc)
|
||||
{
|
||||
validate_object_select_id(vc->depsgraph, vc->view_layer, vc->region, vc->v3d, vc->obact);
|
||||
validate_object_select_id(
|
||||
vc->depsgraph, vc->scene, vc->view_layer, vc->region, vc->v3d, vc->obact);
|
||||
}
|
||||
|
||||
int ED_view3d_backbuf_sample_size_clamp(ARegion *region, const float dist)
|
||||
|
|
|
@ -113,8 +113,10 @@ static bool WIDGETGROUP_armature_spline_poll(const bContext *C, wmGizmoGroupType
|
|||
return false;
|
||||
}
|
||||
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
Base *base = view_layer->basact;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_active_base_get(view_layer);
|
||||
if (base && BASE_SELECTABLE(v3d, base)) {
|
||||
Object *ob = BKE_object_pose_armature_get(base->object);
|
||||
if (ob) {
|
||||
|
@ -132,7 +134,9 @@ static bool WIDGETGROUP_armature_spline_poll(const bContext *C, wmGizmoGroupType
|
|||
|
||||
static void WIDGETGROUP_armature_spline_setup(const bContext *C, wmGizmoGroup *gzgroup)
|
||||
{
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_object_pose_armature_get(BKE_view_layer_active_object_get(view_layer));
|
||||
bPoseChannel *pchan = BKE_pose_channel_active_if_layer_visible(ob);
|
||||
|
||||
|
@ -165,7 +169,9 @@ static void WIDGETGROUP_armature_spline_setup(const bContext *C, wmGizmoGroup *g
|
|||
|
||||
static void WIDGETGROUP_armature_spline_refresh(const bContext *C, wmGizmoGroup *gzgroup)
|
||||
{
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_object_pose_armature_get(BKE_view_layer_active_object_get(view_layer));
|
||||
|
||||
if (!gzgroup->customdata) {
|
||||
|
|
|
@ -55,8 +55,10 @@ static bool WIDGETGROUP_camera_poll(const bContext *C, wmGizmoGroupType *UNUSED(
|
|||
return false;
|
||||
}
|
||||
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
Base *base = view_layer->basact;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_active_base_get(view_layer);
|
||||
if (base && BASE_SELECTABLE(v3d, base)) {
|
||||
Object *ob = base->object;
|
||||
if (ob->type == OB_CAMERA) {
|
||||
|
@ -72,7 +74,9 @@ static bool WIDGETGROUP_camera_poll(const bContext *C, wmGizmoGroupType *UNUSED(
|
|||
|
||||
static void WIDGETGROUP_camera_setup(const bContext *C, wmGizmoGroup *gzgroup)
|
||||
{
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
float dir[3];
|
||||
|
||||
|
@ -124,7 +128,9 @@ static void WIDGETGROUP_camera_refresh(const bContext *C, wmGizmoGroup *gzgroup)
|
|||
|
||||
struct CameraWidgetGroup *cagzgroup = gzgroup->customdata;
|
||||
View3D *v3d = CTX_wm_view3d(C);
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
Camera *ca = ob->data;
|
||||
PointerRNA camera_ptr;
|
||||
|
@ -151,7 +157,6 @@ static void WIDGETGROUP_camera_refresh(const bContext *C, wmGizmoGroup *gzgroup)
|
|||
}
|
||||
|
||||
/* TODO: make focal length/ortho ob_scale_inv widget optional. */
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
const float aspx = (float)scene->r.xsch * scene->r.xasp;
|
||||
const float aspy = (float)scene->r.ysch * scene->r.yasp;
|
||||
const bool is_ortho = (ca->type == CAM_ORTHO);
|
||||
|
@ -241,7 +246,9 @@ static void WIDGETGROUP_camera_message_subscribe(const bContext *C,
|
|||
struct wmMsgBus *mbus)
|
||||
{
|
||||
ARegion *region = CTX_wm_region(C);
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
Camera *ca = ob->data;
|
||||
|
||||
|
@ -370,6 +377,7 @@ static bool WIDGETGROUP_camera_view_poll(const bContext *C, wmGizmoGroupType *UN
|
|||
* We could change the rules for when to show. */
|
||||
{
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
if (scene->camera != BKE_view_layer_active_object_get(view_layer)) {
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -99,8 +99,10 @@ static bool WIDGETGROUP_empty_image_poll(const bContext *C, wmGizmoGroupType *UN
|
|||
return false;
|
||||
}
|
||||
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
Base *base = view_layer->basact;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_active_base_get(view_layer);
|
||||
if (base && BASE_SELECTABLE(v3d, base)) {
|
||||
Object *ob = base->object;
|
||||
if (ob->type == OB_EMPTY) {
|
||||
|
@ -132,7 +134,9 @@ static void WIDGETGROUP_empty_image_refresh(const bContext *C, wmGizmoGroup *gzg
|
|||
{
|
||||
struct EmptyImageWidgetGroup *igzgroup = gzgroup->customdata;
|
||||
wmGizmo *gz = igzgroup->gizmo;
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
|
||||
copy_m4_m4(gz->matrix_basis, ob->obmat);
|
||||
|
|
|
@ -42,8 +42,10 @@ static bool WIDGETGROUP_forcefield_poll(const bContext *C, wmGizmoGroupType *UNU
|
|||
return false;
|
||||
}
|
||||
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
Base *base = view_layer->basact;
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Base *base = BKE_view_layer_active_base_get(view_layer);
|
||||
if (base && BASE_SELECTABLE(v3d, base)) {
|
||||
Object *ob = base->object;
|
||||
if (ob->pd && ob->pd->forcefield) {
|
||||
|
@ -73,7 +75,9 @@ static void WIDGETGROUP_forcefield_refresh(const bContext *C, wmGizmoGroup *gzgr
|
|||
{
|
||||
wmGizmoWrapper *wwrapper = gzgroup->customdata;
|
||||
wmGizmo *gz = wwrapper->gizmo;
|
||||
const Scene *scene = CTX_data_scene(C);
|
||||
ViewLayer *view_layer = CTX_data_view_layer(C);
|
||||
BKE_view_layer_synced_ensure(scene, view_layer);
|
||||
Object *ob = BKE_view_layer_active_object_get(view_layer);
|
||||
PartDeflect *pd = ob->pd;
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue