From 312579ce82208fbbf270ddf1f75fdb3972ea137e Mon Sep 17 00:00:00 2001 From: Sean Kim Date: Tue, 11 Feb 2025 23:09:20 +0100 Subject: [PATCH] Fix #134366: `object.closest_point_on_mesh` always returns no result Introduced in 024d7d12e24a5468d3e9878adf29b0b0443b5dc8 Pull Request: https://projects.blender.org/blender/blender/pulls/134377 --- .../blender/makesrna/intern/rna_object_api.cc | 13 ++++++------ tests/python/CMakeLists.txt | 5 +++++ tests/python/bl_object.py | 21 +++++++++++++++++++ 3 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 tests/python/bl_object.py diff --git a/source/blender/makesrna/intern/rna_object_api.cc b/source/blender/makesrna/intern/rna_object_api.cc index 1060051eebe..09610f57ef9 100644 --- a/source/blender/makesrna/intern/rna_object_api.cc +++ b/source/blender/makesrna/intern/rna_object_api.cc @@ -699,13 +699,14 @@ static void rna_Object_closest_point_on_mesh(Object *ob, copy_v3_v3(r_normal, nearest.no); *r_index = mesh_corner_tri_to_face_index(mesh_eval, nearest.index); } + else { + *r_success = false; + + zero_v3(r_location); + zero_v3(r_normal); + *r_index = -1; + } } - - *r_success = false; - - zero_v3(r_location); - zero_v3(r_normal); - *r_index = -1; } static bool rna_Object_is_modified(Object *ob, Scene *scene, int settings) diff --git a/tests/python/CMakeLists.txt b/tests/python/CMakeLists.txt index 4b7babf5be2..026ac71b6cc 100644 --- a/tests/python/CMakeLists.txt +++ b/tests/python/CMakeLists.txt @@ -358,6 +358,11 @@ add_blender_test( --run-all-tests ) +add_blender_test( + object_api + --python ${TEST_PYTHON_DIR}/bl_object.py +) + # ------------------------------------------------------------------------------ # MODIFIERS TESTS add_blender_test( diff --git a/tests/python/bl_object.py b/tests/python/bl_object.py new file mode 100644 index 00000000000..59028a96829 --- /dev/null +++ b/tests/python/bl_object.py @@ -0,0 +1,21 @@ +import unittest + +import bpy +from mathutils import Vector + + +class TestObjectApi(unittest.TestCase): + def test_closest_point_on_mesh_of_default_cube(self): + bpy.ops.object.select_all(action='SELECT') + bpy.ops.object.delete(use_global=False) + bpy.ops.outliner.orphans_purge() + bpy.ops.mesh.primitive_cube_add() + ret_val = bpy.context.scene.objects[0].closest_point_on_mesh(Vector((0.0, 0.0, 2.0))) + self.assertTrue(ret_val[0]) + self.assertEqual(ret_val[1], Vector((0.0, 0.0, 1.0))) + + +if __name__ == '__main__': + import sys + sys.argv = [__file__] + (sys.argv[sys.argv.index("--") + 1:] if "--" in sys.argv else []) + unittest.main()