Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Felke <martin.felke@googlemail.com>2017-08-12 23:48:17 +0300
committerMartin Felke <martin.felke@googlemail.com>2017-08-12 23:48:17 +0300
commit86da0f47498fad104421aa99a285e163017ab083 (patch)
tree0a51ea822ea3299f0e608a0d0487080c04ed9409 /source/blender/blenkernel/intern/object.c
parent5c9626721ba79c7f2f6331a4245ec788042420f3 (diff)
parent5e9132b3b7d43785ec0f4d944159acc1c815c7c9 (diff)
Merge remote-tracking branch 'refs/remotes/origin/blender-v2.79-release' into fracture_modifier
Conflicts: build_files/buildbot/slave_compile.py build_files/cmake/buildinfo.cmake build_files/cmake/config/blender_release.cmake build_files/cmake/macros.cmake build_files/cmake/packaging.cmake build_files/cmake/platform/platform_win32_msvc.cmake doc/python_api/sphinx_doc_gen.py doc/python_api/sphinx_doc_update.py intern/atomic/atomic_ops.h intern/atomic/intern/atomic_ops_ext.h intern/atomic/intern/atomic_ops_unix.h intern/cycles/CMakeLists.txt intern/cycles/blender/addon/properties.py intern/cycles/blender/addon/ui.py intern/cycles/blender/blender_mesh.cpp intern/cycles/blender/blender_object.cpp intern/cycles/blender/blender_object_cull.cpp intern/cycles/blender/blender_object_cull.h intern/cycles/blender/blender_python.cpp intern/cycles/blender/blender_session.cpp intern/cycles/blender/blender_session.h intern/cycles/blender/blender_shader.cpp intern/cycles/blender/blender_util.h intern/cycles/bvh/bvh.cpp intern/cycles/bvh/bvh.h intern/cycles/bvh/bvh_build.cpp intern/cycles/bvh/bvh_node.h intern/cycles/device/device.cpp intern/cycles/device/device.h intern/cycles/device/device_cpu.cpp intern/cycles/device/device_cuda.cpp intern/cycles/device/device_opencl.cpp intern/cycles/device/device_task.cpp intern/cycles/device/opencl/opencl.h intern/cycles/device/opencl/opencl_base.cpp intern/cycles/device/opencl/opencl_mega.cpp intern/cycles/device/opencl/opencl_split.cpp intern/cycles/device/opencl/opencl_util.cpp intern/cycles/kernel/bvh/bvh.h intern/cycles/kernel/bvh/bvh_nodes.h intern/cycles/kernel/bvh/bvh_shadow_all.h intern/cycles/kernel/bvh/bvh_volume_all.h intern/cycles/kernel/bvh/qbvh_shadow_all.h intern/cycles/kernel/bvh/qbvh_subsurface.h intern/cycles/kernel/bvh/qbvh_traversal.h intern/cycles/kernel/bvh/qbvh_volume.h intern/cycles/kernel/bvh/qbvh_volume_all.h intern/cycles/kernel/closure/bsdf.h intern/cycles/kernel/closure/bsdf_microfacet.h intern/cycles/kernel/closure/bsdf_microfacet_multi.h intern/cycles/kernel/closure/bsdf_microfacet_multi_impl.h intern/cycles/kernel/geom/geom.h intern/cycles/kernel/geom/geom_curve.h intern/cycles/kernel/geom/geom_motion_curve.h intern/cycles/kernel/geom/geom_motion_triangle_intersect.h intern/cycles/kernel/geom/geom_motion_triangle_shader.h intern/cycles/kernel/geom/geom_object.h intern/cycles/kernel/geom/geom_triangle.h intern/cycles/kernel/geom/geom_triangle_intersect.h intern/cycles/kernel/geom/geom_volume.h intern/cycles/kernel/kernel_accumulate.h intern/cycles/kernel/kernel_bake.h intern/cycles/kernel/kernel_compat_cpu.h intern/cycles/kernel/kernel_compat_cuda.h intern/cycles/kernel/kernel_emission.h intern/cycles/kernel/kernel_image_opencl.h intern/cycles/kernel/kernel_light.h intern/cycles/kernel/kernel_passes.h intern/cycles/kernel/kernel_path.h intern/cycles/kernel/kernel_path_branched.h intern/cycles/kernel/kernel_path_common.h intern/cycles/kernel/kernel_path_surface.h intern/cycles/kernel/kernel_path_volume.h intern/cycles/kernel/kernel_random.h intern/cycles/kernel/kernel_shader.h intern/cycles/kernel/kernel_shadow.h intern/cycles/kernel/kernel_subsurface.h intern/cycles/kernel/kernel_textures.h intern/cycles/kernel/kernel_types.h intern/cycles/kernel/kernel_volume.h intern/cycles/kernel/kernels/cpu/kernel_avx.cpp intern/cycles/kernel/kernels/cpu/kernel_avx2.cpp intern/cycles/kernel/kernels/opencl/kernel.cl intern/cycles/kernel/split/kernel_background_buffer_update.h intern/cycles/kernel/split/kernel_data_init.h intern/cycles/kernel/split/kernel_direct_lighting.h intern/cycles/kernel/split/kernel_holdout_emission_blurring_pathtermination_ao.h intern/cycles/kernel/split/kernel_next_iteration_setup.h intern/cycles/kernel/split/kernel_scene_intersect.h intern/cycles/kernel/split/kernel_split_common.h intern/cycles/kernel/svm/svm_displace.h intern/cycles/kernel/svm/svm_image.h intern/cycles/kernel/svm/svm_tex_coord.h intern/cycles/render/buffers.cpp intern/cycles/render/graph.cpp intern/cycles/render/graph.h intern/cycles/render/image.cpp intern/cycles/render/image.h intern/cycles/render/mesh_subdivision.cpp intern/cycles/render/osl.cpp intern/cycles/render/session.cpp intern/cycles/render/session.h intern/cycles/render/svm.cpp intern/cycles/render/svm.h intern/cycles/render/tile.cpp intern/cycles/render/tile.h intern/cycles/util/util_atomic.h intern/cycles/util/util_boundbox.h intern/cycles/util/util_half.h intern/cycles/util/util_image.h intern/cycles/util/util_image_impl.h intern/cycles/util/util_math.h intern/cycles/util/util_path.cpp intern/cycles/util/util_progress.h intern/cycles/util/util_simd.h intern/cycles/util/util_task.cpp intern/cycles/util/util_types.h intern/ghost/intern/GHOST_SystemCocoa.mm make.bat release/datafiles/locale release/scripts/addons release/scripts/presets/interface_theme/24x_blues.xml release/scripts/presets/interface_theme/flatty_light.xml release/scripts/startup/bl_operators/wm.py release/scripts/startup/bl_ui/space_userpref.py source/blender/blenkernel/BKE_library_query.h source/blender/blenkernel/BKE_sca.h source/blender/blenkernel/intern/DerivedMesh.c source/blender/blenkernel/intern/armature.c source/blender/blenkernel/intern/library.c source/blender/blenkernel/intern/library_query.c source/blender/blenkernel/intern/mesh.c source/blender/blenkernel/intern/rigidbody.c source/blender/blenkernel/intern/sca.c source/blender/blenkernel/intern/subsurf_ccg.c source/blender/blenlib/intern/task.c source/blender/blenloader/intern/readfile.c source/blender/blenloader/intern/versioning_270.c source/blender/blenloader/intern/writefile.c source/blender/collada/ArmatureImporter.cpp source/blender/depsgraph/DEG_depsgraph_build.h source/blender/depsgraph/intern/builder/deg_builder.cc source/blender/depsgraph/intern/builder/deg_builder_cycle.cc source/blender/depsgraph/intern/builder/deg_builder_nodes.cc source/blender/depsgraph/intern/builder/deg_builder_nodes.h source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc source/blender/depsgraph/intern/builder/deg_builder_relations.cc source/blender/depsgraph/intern/builder/deg_builder_relations.h source/blender/depsgraph/intern/builder/deg_builder_relations_keys.cc source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc source/blender/depsgraph/intern/depsgraph.h source/blender/depsgraph/intern/depsgraph_build.cc source/blender/depsgraph/intern/depsgraph_eval.cc source/blender/depsgraph/intern/eval/deg_eval.cc source/blender/depsgraph/intern/eval/deg_eval_debug.cc source/blender/depsgraph/intern/nodes/deg_node.cc source/blender/depsgraph/intern/nodes/deg_node.h source/blender/depsgraph/intern/nodes/deg_node_component.cc source/blender/depsgraph/intern/nodes/deg_node_component.h source/blender/depsgraph/intern/nodes/deg_node_operation.cc source/blender/depsgraph/util/deg_util_foreach.h source/blender/editors/animation/anim_channels_defines.c source/blender/editors/animation/anim_draw.c source/blender/editors/armature/pose_transform.c source/blender/editors/interface/interface_layout.c source/blender/editors/object/object_modifier.c source/blender/editors/space_outliner/outliner_edit.c source/blender/editors/transform/transform_snap_object.c source/blender/gpu/shaders/gpu_shader_material.glsl source/blender/makesdna/DNA_ID.h source/blender/makesdna/DNA_modifier_types.h source/blender/makesdna/DNA_rigidbody_types.h source/blender/makesdna/DNA_userdef_types.h source/blender/makesrna/intern/rna_ID.c source/blender/makesrna/intern/rna_main.c source/blender/makesrna/intern/rna_main_api.c source/blender/makesrna/intern/rna_mesh_api.c source/blender/makesrna/intern/rna_modifier.c source/blender/makesrna/intern/rna_render.c source/blender/makesrna/intern/rna_rigidbody.c source/blender/makesrna/intern/rna_userdef.c source/blender/makesrna/intern/rna_wm_api.c source/blender/modifiers/MOD_modifiertypes.h source/blender/modifiers/intern/MOD_boolean.c source/blender/modifiers/intern/MOD_normal_edit.c source/blender/modifiers/intern/MOD_util.c source/blender/nodes/shader/nodes/node_shader_tex_brick.c source/blender/python/intern/bpy_rna_id_collection.c source/blender/render/extern/include/RE_pipeline.h source/blender/render/intern/source/render_result.c source/creator/CMakeLists.txt tests/gtests/CMakeLists.txt tests/gtests/blenlib/BLI_string_test.cc tests/python/CMakeLists.txt
Diffstat (limited to 'source/blender/blenkernel/intern/object.c')
-rw-r--r--source/blender/blenkernel/intern/object.c162
1 files changed, 40 insertions, 122 deletions
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 0c955921f38..b10a1f80fa0 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -127,6 +127,7 @@
#endif
#include "CCGSubSurf.h"
+#include "atomic_ops.h"
#include "GPU_material.h"
@@ -246,6 +247,10 @@ bool BKE_object_support_modifier_type_check(Object *ob, int modifier_type)
mti = modifierType_getInfo(modifier_type);
+ /* only geometry objects should be able to get modifiers [#25291] */
+ if (!ELEM(ob->type, OB_MESH, OB_CURVE, OB_SURF, OB_FONT, OB_LATTICE)) {
+ return false;
+ }
if (ob->type == OB_LATTICE && (mti->flags & eModifierTypeFlag_AcceptsLattice) == 0) {
return false;
@@ -315,19 +320,24 @@ void BKE_object_link_modifiers(struct Object *ob_dst, const struct Object *ob_sr
/* free data derived from mesh, called when mesh changes or is freed */
void BKE_object_free_derived_caches(Object *ob)
{
- /* also serves as signal to remake texspace */
+ /* Also serves as signal to remake texspace.
+ *
+ * NOTE: This function can be called from threads on different objects
+ * sharing same data datablock. So we need to ensure atomic nature of
+ * data modification here.
+ */
if (ob->type == OB_MESH) {
Mesh *me = ob->data;
if (me && me->bb) {
- me->bb->flag |= BOUNDBOX_DIRTY;
+ atomic_fetch_and_or_uint32((uint*)&me->bb->flag, BOUNDBOX_DIRTY);
}
}
else if (ELEM(ob->type, OB_SURF, OB_CURVE, OB_FONT)) {
Curve *cu = ob->data;
if (cu && cu->bb) {
- cu->bb->flag |= BOUNDBOX_DIRTY;
+ atomic_fetch_and_or_uint32((uint*)&cu->bb->flag, BOUNDBOX_DIRTY);
}
}
@@ -870,7 +880,7 @@ SoftBody *copy_softbody(const SoftBody *sb, bool copy_caches)
return sbn;
}
-BulletSoftBody *copy_bulletsoftbody(BulletSoftBody *bsb)
+BulletSoftBody *copy_bulletsoftbody(const BulletSoftBody *bsb)
{
BulletSoftBody *bsbn;
@@ -1002,7 +1012,7 @@ void BKE_object_copy_softbody(Object *ob_dst, const Object *ob_src)
}
}
-static void copy_object_pose(Object *obn, Object *ob)
+static void copy_object_pose(Object *obn, const Object *ob)
{
bPoseChannel *chan;
@@ -1035,7 +1045,7 @@ static void copy_object_pose(Object *obn, Object *ob)
}
}
-static void copy_object_lod(Object *obn, Object *ob)
+static void copy_object_lod(Object *obn, const Object *ob)
{
BLI_duplicatelist(&obn->lodlevels, &ob->lodlevels);
@@ -1086,7 +1096,7 @@ void BKE_object_transform_copy(Object *ob_tar, const Object *ob_src)
copy_v3_v3(ob_tar->size, ob_src->size);
}
-Object *BKE_object_copy_ex(Main *bmain, Object *ob, bool copy_caches)
+Object *BKE_object_copy_ex(Main *bmain, const Object *ob, bool copy_caches)
{
Object *obn;
ModifierData *md;
@@ -1133,6 +1143,7 @@ Object *BKE_object_copy_ex(Main *bmain, Object *ob, bool copy_caches)
/* increase user numbers */
id_us_plus((ID *)obn->data);
+ id_us_plus((ID *)obn->poselib);
id_us_plus((ID *)obn->gpd);
id_us_plus((ID *)obn->dup_group);
@@ -1174,12 +1185,12 @@ Object *BKE_object_copy_ex(Main *bmain, Object *ob, bool copy_caches)
}
/* copy objects, will re-initialize cached simulation data */
-Object *BKE_object_copy(Main *bmain, Object *ob)
+Object *BKE_object_copy(Main *bmain, const Object *ob)
{
return BKE_object_copy_ex(bmain, ob, false);
}
-void BKE_object_make_local(Main *bmain, Object *ob, const bool lib_local)
+void BKE_object_make_local_ex(Main *bmain, Object *ob, const bool lib_local, const bool clear_proxy)
{
bool is_local = false, is_lib = false;
@@ -1198,7 +1209,14 @@ void BKE_object_make_local(Main *bmain, Object *ob, const bool lib_local)
if (lib_local || is_local) {
if (!is_lib) {
id_clear_lib_data(bmain, &ob->id);
- BKE_id_expand_local(&ob->id);
+ BKE_id_expand_local(bmain, &ob->id);
+ if (clear_proxy) {
+ if (ob->proxy_from != NULL) {
+ ob->proxy_from->proxy = NULL;
+ ob->proxy_from->proxy_group = NULL;
+ }
+ ob->proxy = ob->proxy_from = ob->proxy_group = NULL;
+ }
}
else {
Object *ob_new = BKE_object_copy(bmain, ob);
@@ -1206,6 +1224,9 @@ void BKE_object_make_local(Main *bmain, Object *ob, const bool lib_local)
ob_new->id.us = 0;
ob_new->proxy = ob_new->proxy_from = ob_new->proxy_group = NULL;
+ /* setting newid is mandatory for complex make_lib_local logic... */
+ ID_NEW_SET(ob, ob_new);
+
if (!lib_local) {
BKE_libblock_remap(bmain, ob, ob_new, ID_REMAP_SKIP_INDIRECT_USAGE);
}
@@ -1213,6 +1234,11 @@ void BKE_object_make_local(Main *bmain, Object *ob, const bool lib_local)
}
}
+void BKE_object_make_local(Main *bmain, Object *ob, const bool lib_local)
+{
+ BKE_object_make_local_ex(bmain, ob, lib_local, true);
+}
+
/* Returns true if the Object is from an external blend file (libdata) */
bool BKE_object_is_libdata(Object *ob)
{
@@ -1333,7 +1359,10 @@ void BKE_object_make_proxy(Object *ob, Object *target, Object *gob)
ob->type = target->type;
ob->data = target->data;
id_us_plus((ID *)ob->data); /* ensures lib data becomes LIB_TAG_EXTERN */
-
+
+ /* copy vertex groups */
+ defgroup_copy_list(&ob->defbase, &target->defbase);
+
/* copy material and index information */
ob->actcol = ob->totcol = 0;
if (ob->mat) MEM_freeN(ob->mat);
@@ -2212,78 +2241,6 @@ void BKE_boundbox_minmax(const BoundBox *bb, float obmat[4][4], float r_min[3],
}
}
-void BKE_boundbox_scale(struct BoundBox *bb_dst, const struct BoundBox *bb_src, float scale)
-{
- float cent[3];
- BKE_boundbox_calc_center_aabb(bb_src, cent);
-
- for (int i = 0; i < ARRAY_SIZE(bb_dst->vec); i++) {
- bb_dst->vec[i][0] = ((bb_src->vec[i][0] - cent[0]) * scale) + cent[0];
- bb_dst->vec[i][1] = ((bb_src->vec[i][1] - cent[1]) * scale) + cent[1];
- bb_dst->vec[i][2] = ((bb_src->vec[i][2] - cent[2]) * scale) + cent[2];
- }
-}
-
-/**
- * Returns a BBox which each dimensions are at least epsilon.
- * \note In case a given dimension needs to be enlarged, its final value will be in [epsilon, 3 * epsilon] range.
- *
- * \param bb the input bbox to check.
- * \param bb_temp the temp bbox to modify (\a bb content is never changed).
- * \param epsilon the minimum dimension to ensure.
- * \return either bb (if nothing needed to be changed) or bb_temp.
- */
-BoundBox *BKE_boundbox_ensure_minimum_dimensions(BoundBox *bb, BoundBox *bb_temp, const float epsilon)
-{
- if (fabsf(bb->vec[0][0] - bb->vec[4][0]) < epsilon) {
- /* Flat along X axis... */
- *bb_temp = *bb;
- bb = bb_temp;
- bb->vec[0][0] -= epsilon;
- bb->vec[1][0] -= epsilon;
- bb->vec[2][0] -= epsilon;
- bb->vec[3][0] -= epsilon;
- bb->vec[4][0] += epsilon;
- bb->vec[5][0] += epsilon;
- bb->vec[6][0] += epsilon;
- bb->vec[7][0] += epsilon;
- }
-
- if (fabsf(bb->vec[0][1] - bb->vec[3][1]) < epsilon) {
- /* Flat along Y axis... */
- if (bb != bb_temp) {
- *bb_temp = *bb;
- bb = bb_temp;
- }
- bb->vec[0][1] -= epsilon;
- bb->vec[1][1] -= epsilon;
- bb->vec[4][1] -= epsilon;
- bb->vec[5][1] -= epsilon;
- bb->vec[2][1] += epsilon;
- bb->vec[3][1] += epsilon;
- bb->vec[6][1] += epsilon;
- bb->vec[7][1] += epsilon;
- }
-
- if (fabsf(bb->vec[0][2] - bb->vec[1][2]) < epsilon) {
- /* Flat along Z axis... */
- if (bb != bb_temp) {
- *bb_temp = *bb;
- bb = bb_temp;
- }
- bb->vec[0][2] -= epsilon;
- bb->vec[3][2] -= epsilon;
- bb->vec[4][2] -= epsilon;
- bb->vec[7][2] -= epsilon;
- bb->vec[1][2] += epsilon;
- bb->vec[2][2] += epsilon;
- bb->vec[5][2] += epsilon;
- bb->vec[6][2] += epsilon;
- }
-
- return bb;
-}
-
BoundBox *BKE_object_boundbox_get(Object *ob)
{
BoundBox *bb = NULL;
@@ -2792,45 +2749,6 @@ int BKE_object_obdata_texspace_get(Object *ob, short **r_texflag, float **r_loc,
return 1;
}
-/*
- * Test a bounding box for ray intersection
- * assumes the ray is already local to the boundbox space
- */
-bool BKE_boundbox_ray_hit_check(
- const struct BoundBox *bb,
- const float ray_start[3], const float ray_normal[3],
- float *r_lambda)
-{
- const int triangle_indexes[12][3] = {
- {0, 1, 2}, {0, 2, 3},
- {3, 2, 6}, {3, 6, 7},
- {1, 2, 6}, {1, 6, 5},
- {5, 6, 7}, {4, 5, 7},
- {0, 3, 7}, {0, 4, 7},
- {0, 1, 5}, {0, 4, 5}};
-
- bool result = false;
- int i;
-
- for (i = 0; i < 12 && (!result || r_lambda); i++) {
- float lambda;
- int v1, v2, v3;
- v1 = triangle_indexes[i][0];
- v2 = triangle_indexes[i][1];
- v3 = triangle_indexes[i][2];
- if (isect_ray_tri_v3(ray_start, ray_normal, bb->vec[v1], bb->vec[v2], bb->vec[v3], &lambda, NULL) &&
- (!r_lambda || *r_lambda > lambda))
- {
- result = true;
- if (r_lambda) {
- *r_lambda = lambda;
- }
- }
- }
-
- return result;
-}
-
static int pc_cmp(const void *a, const void *b)
{
const LinkData *ad = a, *bd = b;