Blender V5.0
light_linking.cc File Reference
#include "BKE_light_linking.h"
#include <string>
#include "MEM_guardedalloc.h"
#include "DNA_ID.h"
#include "DNA_collection_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "BLI_assert.h"
#include "BLI_listbase.h"
#include "BLI_string_utf8.h"
#include "BKE_collection.hh"
#include "BKE_layer.hh"
#include "BKE_lib_id.hh"
#include "BKE_report.hh"
#include "BLT_translation.hh"
#include "DEG_depsgraph.hh"
#include "DEG_depsgraph_build.hh"

Go to the source code of this file.

Functions

void BKE_light_linking_ensure (Object *object)
void BKE_light_linking_copy (Object *object_dst, const Object *object_src, const int copy_flags)
void BKE_light_linking_delete (Object *object, const int delete_flags)
void BKE_light_linking_free_if_empty (Object *object)
CollectionBKE_light_linking_collection_get (const Object *object, const LightLinkingType link_type)
static std::string get_default_collection_name (const Object *object, const LightLinkingType link_type)
CollectionBKE_light_linking_collection_new (Main *bmain, Object *object, const LightLinkingType link_type)
void BKE_light_linking_collection_assign_only (Object *object, Collection *new_collection, const LightLinkingType link_type)
void BKE_light_linking_collection_assign (Main *bmain, Object *object, Collection *new_collection, const LightLinkingType link_type)
static CollectionObjectfind_collection_object (const Collection *collection, const Object *object)
static CollectionChildfind_collection_child (const Collection *collection, const Collection *child)
static CollectionLightLinkinglight_linking_collection_add_object (Main *bmain, Collection *collection, Object *object)
static CollectionLightLinkinglight_linking_collection_add_collection (Main *bmain, Collection *collection, Collection *child)
void BKE_light_linking_add_receiver_to_collection (Main *bmain, Collection *collection, ID *receiver, const eCollectionLightLinkingState link_state)
static void order_collection_receiver_before (Collection *collection, Collection *receiver, const ID *before)
static void order_collection_receiver_after (Collection *collection, Collection *receiver, const ID *after)
static void order_object_receiver_before (Collection *collection, Object *receiver, const ID *before)
static void order_object_receiver_after (Collection *collection, Object *receiver, const ID *after)
void BKE_light_linking_add_receiver_to_collection_before (Main *bmain, Collection *collection, ID *receiver, const ID *before, const eCollectionLightLinkingState link_state)
void BKE_light_linking_add_receiver_to_collection_after (Main *bmain, Collection *collection, ID *receiver, const ID *after, const eCollectionLightLinkingState link_state)
bool BKE_light_linking_unlink_id_from_collection (Main *bmain, Collection *collection, ID *id, ReportList *reports)
void BKE_light_linking_link_receiver_to_emitter (Main *bmain, Object *emitter, Object *receiver, const LightLinkingType link_type, const eCollectionLightLinkingState link_state)
void BKE_light_linking_select_receivers_of_emitter (Scene *scene, ViewLayer *view_layer, Object *emitter, const LightLinkingType link_type)

Function Documentation

◆ BKE_light_linking_add_receiver_to_collection()

void BKE_light_linking_add_receiver_to_collection ( struct Main * bmain,
struct Collection * collection,
struct ID * receiver,
const eCollectionLightLinkingState link_state )

◆ BKE_light_linking_add_receiver_to_collection_after()

void BKE_light_linking_add_receiver_to_collection_after ( Main * bmain,
Collection * collection,
ID * receiver,
const ID * after,
const eCollectionLightLinkingState link_state )

◆ BKE_light_linking_add_receiver_to_collection_before()

void BKE_light_linking_add_receiver_to_collection_before ( Main * bmain,
Collection * collection,
ID * receiver,
const ID * before,
const eCollectionLightLinkingState link_state )

◆ BKE_light_linking_collection_assign()

void BKE_light_linking_collection_assign ( Main * bmain,
Object * object,
Collection * new_collection,
const LightLinkingType link_type )

◆ BKE_light_linking_collection_assign_only()

void BKE_light_linking_collection_assign_only ( struct Object * object,
struct Collection * new_collection,
LightLinkingType link_type )

Assign given light or shadow linking collection (denoted by the link_type) to the given object. Maintains user counters of the collection: old collection is decreased the user counter, the new one is increased after this call. The new_collection is allowed to be null pointer.

The assign_only variant takes care of (re)assigning the collection and maintaining the user counter, but not the dependency graph tagging for update.

Definition at line 120 of file light_linking.cc.

References BKE_light_linking_collection_get(), BKE_light_linking_ensure(), BKE_light_linking_free_if_empty(), BLI_assert_unreachable, Collection::id, id_us_min(), id_us_plus(), Object::light_linking, LIGHT_LINKING_BLOCKER, and LIGHT_LINKING_RECEIVER.

Referenced by BKE_light_linking_collection_assign().

◆ BKE_light_linking_collection_get()

◆ BKE_light_linking_collection_new()

Collection * BKE_light_linking_collection_new ( struct Main * bmain,
struct Object * object,
LightLinkingType link_type )

Create new collection and assign it as a light or shadow linking collection (denoted by the link_type) of the given object.

The collection is created outside of the view layer collections. If the object already has light linking collection set up it is unreferenced from the object.

Returns
the newly created collection.

Definition at line 107 of file light_linking.cc.

References BKE_collection_add(), BKE_light_linking_collection_assign(), and get_default_collection_name().

Referenced by BKE_light_linking_link_receiver_to_emitter(), and blender::ed::object::light_linking_collection_new_exec().

◆ BKE_light_linking_copy()

void BKE_light_linking_copy ( Object * object_dst,
const Object * object_src,
const int copy_flags )

◆ BKE_light_linking_delete()

void BKE_light_linking_delete ( struct Object * object,
const int delete_flags )

Free the LightLinking data from the object.

Parameters
copy_flagsFlags controlling the copy process, see e.g. LIB_ID_CREATE_NO_USER_REFCOUNT and related flags in the same enum.

Definition at line 50 of file light_linking.cc.

References LightLinking::blocker_collection, id_us_min(), LIB_ID_CREATE_NO_USER_REFCOUNT, Object::light_linking, MEM_SAFE_FREE, and LightLinking::receiver_collection.

Referenced by BKE_light_linking_free_if_empty(), and object_free_data().

◆ BKE_light_linking_ensure()

◆ BKE_light_linking_free_if_empty()

void BKE_light_linking_free_if_empty ( struct Object * object)

◆ BKE_light_linking_link_receiver_to_emitter()

void BKE_light_linking_link_receiver_to_emitter ( struct Main * bmain,
struct Object * emitter,
struct Object * receiver,
LightLinkingType link_type,
eCollectionLightLinkingState link_state )

Link receiver object to the given emitter.

If the emitter already has light linking collection specified the object is added to that collection. Otherwise, first a new collection is created and assigned, and the receiver is added to it.

Definition at line 483 of file light_linking.cc.

References BKE_collection_contains_geometry_recursive(), BKE_light_linking_add_receiver_to_collection(), BKE_light_linking_collection_get(), BKE_light_linking_collection_new(), Object::id, Object::instance_collection, OB_EMPTY, OB_TYPE_IS_GEOMETRY, and Object::type.

Referenced by blender::ed::object::light_linking_link_exec().

◆ BKE_light_linking_select_receivers_of_emitter()

void BKE_light_linking_select_receivers_of_emitter ( struct Scene * scene,
struct ViewLayer * view_layer,
struct Object * emitter,
LightLinkingType link_type )

◆ BKE_light_linking_unlink_id_from_collection()

bool BKE_light_linking_unlink_id_from_collection ( struct Main * bmain,
struct Collection * collection,
struct ID * id,
struct ReportList * reports )

Remove the given ID from the light or shadow linking collection of the given object.

The collection is expected to be either receiver_collection or blocker_collection from an emitter object.

The ID is expected to either be collection or an object. If other ID type is passed to the function an error is reported and false is returned.

Returns
true if the ID was unlinked from the receiver collection, false otherwise. The unlinking will be unsuccessful if, for example, the receiver collection is a linked data-block.

The optional reports argument is used to provide human-readable details about why unlinking was not successful. If it is nullptr then the report is printed to the console.

Definition at line 451 of file light_linking.cc.

References BKE_collection_child_remove(), BKE_collection_object_remove(), BKE_reportf(), DEG_id_tag_update(), DEG_relations_tag_update(), GS, Collection::id, ID_GR, ID_OB, ID_RECALC_HIERARCHY, ID_RECALC_SYNC_TO_EVAL, ID::name, and RPT_ERROR.

Referenced by blender::ed::object::light_linking_unlink_from_collection_exec().

◆ find_collection_child()

CollectionChild * find_collection_child ( const Collection * collection,
const Collection * child )
static

◆ find_collection_object()

CollectionObject * find_collection_object ( const Collection * collection,
const Object * object )
static

◆ get_default_collection_name()

std::string get_default_collection_name ( const Object * object,
const LightLinkingType link_type )
static

◆ light_linking_collection_add_collection()

CollectionLightLinking * light_linking_collection_add_collection ( Main * bmain,
Collection * collection,
Collection * child )
static

◆ light_linking_collection_add_object()

CollectionLightLinking * light_linking_collection_add_object ( Main * bmain,
Collection * collection,
Object * object )
static

◆ order_collection_receiver_after()

void order_collection_receiver_after ( Collection * collection,
Collection * receiver,
const ID * after )
static

◆ order_collection_receiver_before()

void order_collection_receiver_before ( Collection * collection,
Collection * receiver,
const ID * before )
static

◆ order_object_receiver_after()

void order_object_receiver_after ( Collection * collection,
Object * receiver,
const ID * after )
static

◆ order_object_receiver_before()

void order_object_receiver_before ( Collection * collection,
Object * receiver,
const ID * before )
static