Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/object.c
| Show First 20 Lines • Show All 709 Lines • ▼ Show 20 Lines | Object *BKE_object_add_only_object(Main *bmain, int type, const char *name) | ||||
| ob->type = type; | ob->type = type; | ||||
| BKE_object_init(ob); | BKE_object_init(ob); | ||||
| return ob; | return ob; | ||||
| } | } | ||||
| static Object *object_add_common(Main *bmain, SceneLayer *scene_layer, int type, const char *name) | static Object *object_add_common(Main *bmain, ViewLayer *view_layer, int type, const char *name) | ||||
| { | { | ||||
| Object *ob; | Object *ob; | ||||
| ob = BKE_object_add_only_object(bmain, type, name); | ob = BKE_object_add_only_object(bmain, type, name); | ||||
| ob->data = BKE_object_obdata_add_from_type(bmain, type, name); | ob->data = BKE_object_obdata_add_from_type(bmain, type, name); | ||||
| BKE_scene_layer_base_deselect_all(scene_layer); | BKE_view_layer_base_deselect_all(view_layer); | ||||
| DEG_id_tag_update_ex(bmain, &ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME); | DEG_id_tag_update_ex(bmain, &ob->id, OB_RECALC_OB | OB_RECALC_DATA | OB_RECALC_TIME); | ||||
| return ob; | return ob; | ||||
| } | } | ||||
| /** | /** | ||||
| * General add: to scene, with layer from area and default name | * General add: to scene, with layer from area and default name | ||||
| * | * | ||||
| * Object is added to the active SceneCollection. | * Object is added to the active SceneCollection. | ||||
| * If there is no linked collection to the active SceneLayer we create a new one. | * If there is no linked collection to the active ViewLayer we create a new one. | ||||
| */ | */ | ||||
| /* creates minimum required data, but without vertices etc. */ | /* creates minimum required data, but without vertices etc. */ | ||||
| Object *BKE_object_add( | Object *BKE_object_add( | ||||
| Main *bmain, Scene *scene, SceneLayer *scene_layer, | Main *bmain, Scene *scene, ViewLayer *view_layer, | ||||
| int type, const char *name) | int type, const char *name) | ||||
| { | { | ||||
| Object *ob; | Object *ob; | ||||
| Base *base; | Base *base; | ||||
| LayerCollection *layer_collection; | LayerCollection *layer_collection; | ||||
| ob = object_add_common(bmain, scene_layer, type, name); | ob = object_add_common(bmain, view_layer, type, name); | ||||
| layer_collection = BKE_layer_collection_get_active_ensure(scene, scene_layer); | layer_collection = BKE_layer_collection_get_active_ensure(scene, view_layer); | ||||
| BKE_collection_object_add(scene, layer_collection->scene_collection, ob); | BKE_collection_object_add(scene, layer_collection->scene_collection, ob); | ||||
| base = BKE_scene_layer_base_find(scene_layer, ob); | base = BKE_view_layer_base_find(view_layer, ob); | ||||
| BKE_scene_layer_base_select(scene_layer, base); | BKE_view_layer_base_select(view_layer, base); | ||||
| return ob; | return ob; | ||||
| } | } | ||||
| /** | /** | ||||
| * Add a new object, using another one as a reference | * Add a new object, using another one as a reference | ||||
| * | * | ||||
| * /param ob_src object to use to determine the collections of the new object. | * /param ob_src object to use to determine the collections of the new object. | ||||
| */ | */ | ||||
| Object *BKE_object_add_from( | Object *BKE_object_add_from( | ||||
| Main *bmain, Scene *scene, SceneLayer *scene_layer, | Main *bmain, Scene *scene, ViewLayer *view_layer, | ||||
| int type, const char *name, Object *ob_src) | int type, const char *name, Object *ob_src) | ||||
| { | { | ||||
| Object *ob; | Object *ob; | ||||
| Base *base; | Base *base; | ||||
| ob = object_add_common(bmain, scene_layer, type, name); | ob = object_add_common(bmain, view_layer, type, name); | ||||
| BKE_collection_object_add_from(scene, ob_src, ob); | BKE_collection_object_add_from(scene, ob_src, ob); | ||||
| base = BKE_scene_layer_base_find(scene_layer, ob); | base = BKE_view_layer_base_find(view_layer, ob); | ||||
| BKE_scene_layer_base_select(scene_layer, base); | BKE_view_layer_base_select(view_layer, base); | ||||
| return ob; | return ob; | ||||
| } | } | ||||
| #ifdef WITH_GAMEENGINE | #ifdef WITH_GAMEENGINE | ||||
| void BKE_object_lod_add(Object *ob) | void BKE_object_lod_add(Object *ob) | ||||
| { | { | ||||
| ▲ Show 20 Lines • Show All 78 Lines • ▼ Show 20 Lines | else { | ||||
| while (current->next && dist_sq > SQUARE(current->next->distance)) { | while (current->next && dist_sq > SQUARE(current->next->distance)) { | ||||
| current = current->next; | current = current->next; | ||||
| } | } | ||||
| } | } | ||||
| return current; | return current; | ||||
| } | } | ||||
| bool BKE_object_lod_is_usable(Object *ob, SceneLayer *sl) | bool BKE_object_lod_is_usable(Object *ob, ViewLayer *sl) | ||||
| { | { | ||||
| bool active = (sl) ? ob == OBACT(sl) : false; | bool active = (sl) ? ob == OBACT(sl) : false; | ||||
| return (ob->mode == OB_MODE_OBJECT || !active); | return (ob->mode == OB_MODE_OBJECT || !active); | ||||
| } | } | ||||
| void BKE_object_lod_update(Object *ob, const float camera_position[3]) | void BKE_object_lod_update(Object *ob, const float camera_position[3]) | ||||
| { | { | ||||
| LodLevel *cur_level = ob->currentlod; | LodLevel *cur_level = ob->currentlod; | ||||
| LodLevel *new_level = lod_level_select(ob, camera_position); | LodLevel *new_level = lod_level_select(ob, camera_position); | ||||
| if (new_level != cur_level) { | if (new_level != cur_level) { | ||||
| ob->currentlod = new_level; | ob->currentlod = new_level; | ||||
| } | } | ||||
| } | } | ||||
| static Object *lod_ob_get(Object *ob, SceneLayer *sl, int flag) | static Object *lod_ob_get(Object *ob, ViewLayer *sl, int flag) | ||||
| { | { | ||||
| LodLevel *current = ob->currentlod; | LodLevel *current = ob->currentlod; | ||||
| if (!current || !BKE_object_lod_is_usable(ob, sl)) | if (!current || !BKE_object_lod_is_usable(ob, sl)) | ||||
| return ob; | return ob; | ||||
| while (current->prev && (!(current->flags & flag) || !current->source || current->source->type != OB_MESH)) { | while (current->prev && (!(current->flags & flag) || !current->source || current->source->type != OB_MESH)) { | ||||
| current = current->prev; | current = current->prev; | ||||
| } | } | ||||
| return current->source; | return current->source; | ||||
| } | } | ||||
| struct Object *BKE_object_lod_meshob_get(Object *ob, SceneLayer *sl) | struct Object *BKE_object_lod_meshob_get(Object *ob, ViewLayer *sl) | ||||
| { | { | ||||
| return lod_ob_get(ob, sl, OB_LOD_USE_MESH); | return lod_ob_get(ob, sl, OB_LOD_USE_MESH); | ||||
| } | } | ||||
| struct Object *BKE_object_lod_matob_get(Object *ob, SceneLayer *sl) | struct Object *BKE_object_lod_matob_get(Object *ob, ViewLayer *sl) | ||||
| { | { | ||||
| return lod_ob_get(ob, sl, OB_LOD_USE_MAT); | return lod_ob_get(ob, sl, OB_LOD_USE_MAT); | ||||
| } | } | ||||
| #endif /* WITH_GAMEENGINE */ | #endif /* WITH_GAMEENGINE */ | ||||
| SoftBody *copy_softbody(const SoftBody *sb, const int flag) | SoftBody *copy_softbody(const SoftBody *sb, const int flag) | ||||
| ▲ Show 20 Lines • Show All 1,650 Lines • ▼ Show 20 Lines | for (dl = ob->curve_cache->disp.first; dl; dl = dl->next) { | ||||
| mul_v3_m4v3(co, obmat, v3); | mul_v3_m4v3(co, obmat, v3); | ||||
| func_cb(co, user_data); | func_cb(co, user_data); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| void BKE_scene_foreach_display_point( | void BKE_scene_foreach_display_point( | ||||
| Scene *scene, SceneLayer *sl, | Scene *scene, ViewLayer *sl, | ||||
| void (*func_cb)(const float[3], void *), void *user_data) | void (*func_cb)(const float[3], void *), void *user_data) | ||||
| { | { | ||||
| Base *base; | Base *base; | ||||
| Object *ob; | Object *ob; | ||||
| for (base = FIRSTBASE(sl); base; base = base->next) { | for (base = FIRSTBASE(sl); base; base = base->next) { | ||||
| if (((base->flag & BASE_VISIBLED) != 0) && ((base->flag & BASE_SELECTED) != 0)) { | if (((base->flag & BASE_VISIBLED) != 0) && ((base->flag & BASE_SELECTED) != 0)) { | ||||
| ob = base->object; | ob = base->object; | ||||
| ▲ Show 20 Lines • Show All 787 Lines • ▼ Show 20 Lines | |||||
| /* | /* | ||||
| * Iterates over all objects of the given scene layer. | * Iterates over all objects of the given scene layer. | ||||
| * Depending on the eObjectSet flag: | * Depending on the eObjectSet flag: | ||||
| * collect either OB_SET_ALL, OB_SET_VISIBLE or OB_SET_SELECTED objects. | * collect either OB_SET_ALL, OB_SET_VISIBLE or OB_SET_SELECTED objects. | ||||
| * If OB_SET_VISIBLE or OB_SET_SELECTED are collected, | * If OB_SET_VISIBLE or OB_SET_SELECTED are collected, | ||||
| * then also add related objects according to the given includeFilters. | * then also add related objects according to the given includeFilters. | ||||
| */ | */ | ||||
| LinkNode *BKE_object_relational_superset(struct SceneLayer *scene_layer, eObjectSet objectSet, eObRelationTypes includeFilter) | LinkNode *BKE_object_relational_superset(struct ViewLayer *view_layer, eObjectSet objectSet, eObRelationTypes includeFilter) | ||||
| { | { | ||||
| LinkNode *links = NULL; | LinkNode *links = NULL; | ||||
| Base *base; | Base *base; | ||||
| /* Remove markers from all objects */ | /* Remove markers from all objects */ | ||||
| for (base = scene_layer->object_bases.first; base; base = base->next) { | for (base = view_layer->object_bases.first; base; base = base->next) { | ||||
| base->object->id.tag &= ~LIB_TAG_DOIT; | base->object->id.tag &= ~LIB_TAG_DOIT; | ||||
| } | } | ||||
| /* iterate over all selected and visible objects */ | /* iterate over all selected and visible objects */ | ||||
| for (base = scene_layer->object_bases.first; base; base = base->next) { | for (base = view_layer->object_bases.first; base; base = base->next) { | ||||
| if (objectSet == OB_SET_ALL) { | if (objectSet == OB_SET_ALL) { | ||||
| /* as we get all anyways just add it */ | /* as we get all anyways just add it */ | ||||
| Object *ob = base->object; | Object *ob = base->object; | ||||
| obrel_list_add(&links, ob); | obrel_list_add(&links, ob); | ||||
| } | } | ||||
| else { | else { | ||||
| if ((objectSet == OB_SET_SELECTED && TESTBASELIB_BGMODE(base)) || | if ((objectSet == OB_SET_SELECTED && TESTBASELIB_BGMODE(base)) || | ||||
| (objectSet == OB_SET_VISIBLE && BASE_EDITABLE_BGMODE(base))) | (objectSet == OB_SET_VISIBLE && BASE_EDITABLE_BGMODE(base))) | ||||
| Show All 20 Lines | else { | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /* child relationship */ | /* child relationship */ | ||||
| if (includeFilter & (OB_REL_CHILDREN | OB_REL_CHILDREN_RECURSIVE)) { | if (includeFilter & (OB_REL_CHILDREN | OB_REL_CHILDREN_RECURSIVE)) { | ||||
| Base *local_base; | Base *local_base; | ||||
| for (local_base = scene_layer->object_bases.first; local_base; local_base = local_base->next) { | for (local_base = view_layer->object_bases.first; local_base; local_base = local_base->next) { | ||||
| if (BASE_EDITABLE_BGMODE(local_base)) { | if (BASE_EDITABLE_BGMODE(local_base)) { | ||||
| Object *child = local_base->object; | Object *child = local_base->object; | ||||
| if (obrel_list_test(child)) { | if (obrel_list_test(child)) { | ||||
| if ((includeFilter & OB_REL_CHILDREN_RECURSIVE && BKE_object_is_child_recursive(ob, child)) || | if ((includeFilter & OB_REL_CHILDREN_RECURSIVE && BKE_object_is_child_recursive(ob, child)) || | ||||
| (includeFilter & OB_REL_CHILDREN && child->parent && child->parent == ob)) | (includeFilter & OB_REL_CHILDREN && child->parent && child->parent == ob)) | ||||
| { | { | ||||
| obrel_list_add(&links, child); | obrel_list_add(&links, child); | ||||
| ▲ Show 20 Lines • Show All 320 Lines • Show Last 20 Lines | |||||