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:
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2012-04-21 04:33:36 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2012-04-21 04:33:36 +0400
commitcdbfd1db3800cf4f0ea691f09bf05e78a82c80f9 (patch)
treeb1f22c4ea61ff96ee51c4882047f5a8e3f08c0f1
parent4a19ccfa5fb5cae359269ecaac389f6aace9f959 (diff)
parent15eb3452ecd96e4d79d438e8c954918639dc283d (diff)
Merged changes in the trunk up to revision 45820.
Conflicts resolved: source/creator/creator.c
-rw-r--r--CMakeLists.txt24
-rw-r--r--SConstruct2
-rwxr-xr-xbuild_files/cmake/project_info.py9
-rw-r--r--build_files/scons/tools/btools.py5
-rw-r--r--doc/python_api/sphinx_doc_gen.py2
-rw-r--r--intern/cycles/app/cycles_xml.cpp6
-rw-r--r--intern/cycles/kernel/kernel_bvh.h6
-rw-r--r--intern/cycles/kernel/kernel_camera.h16
-rw-r--r--intern/cycles/kernel/kernel_mbvh.h2
-rw-r--r--intern/cycles/kernel/kernel_object.h2
-rw-r--r--intern/cycles/kernel/kernel_passes.h2
-rw-r--r--intern/cycles/kernel/kernel_path.h4
-rw-r--r--intern/cycles/kernel/kernel_qbvh.h6
-rw-r--r--intern/cycles/kernel/svm/svm_camera.h2
-rw-r--r--intern/cycles/kernel/svm/svm_mapping.h2
-rw-r--r--intern/cycles/kernel/svm/svm_tex_coord.h30
-rw-r--r--intern/cycles/render/buffers.cpp2
-rw-r--r--intern/cycles/render/camera.cpp8
-rw-r--r--intern/cycles/render/film.cpp1
-rw-r--r--intern/cycles/render/light.cpp6
-rw-r--r--intern/cycles/render/object.cpp8
-rw-r--r--intern/cycles/subd/subd_dice.cpp2
-rw-r--r--intern/cycles/subd/subd_split.cpp2
-rw-r--r--intern/cycles/util/util_boundbox.h6
-rw-r--r--intern/cycles/util/util_transform.h10
-rw-r--r--intern/dualcon/intern/Projections.h1
-rw-r--r--intern/dualcon/intern/dualcon_c_api.cpp14
-rw-r--r--intern/elbeem/intern/solver_init.cpp4
-rw-r--r--intern/opennl/CMakeLists.txt2
-rw-r--r--release/freedesktop/blender.desktop3
-rw-r--r--release/scripts/presets/fluid/honey.py3
-rw-r--r--release/scripts/presets/fluid/oil.py3
-rw-r--r--release/scripts/presets/fluid/water.py3
-rw-r--r--release/scripts/startup/bl_operators/console.py16
-rw-r--r--release/scripts/startup/bl_operators/mesh.py2
-rw-r--r--release/scripts/startup/bl_operators/presets.py18
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_lightmap.py17
-rw-r--r--release/scripts/startup/bl_operators/wm.py6
-rw-r--r--release/scripts/startup/bl_ui/properties_game.py7
-rw-r--r--release/scripts/startup/bl_ui/properties_particle.py6
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_cloth.py3
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_fluid.py27
-rw-r--r--release/scripts/startup/bl_ui/space_view3d.py2
-rw-r--r--release/scripts/startup/bl_ui/space_view3d_toolbar.py8
-rw-r--r--release/scripts/templates/operator_file_export.py (renamed from release/scripts/templates/operator_export.py)15
-rw-r--r--release/scripts/templates/operator_file_import.py75
-rw-r--r--source/blender/avi/intern/avi.c4
-rw-r--r--source/blender/avi/intern/options.c5
-rw-r--r--source/blender/blenfont/BLF_translation.h15
-rw-r--r--source/blender/blenfont/intern/blf_font.c4
-rw-r--r--source/blender/blenkernel/BKE_blender.h4
-rw-r--r--source/blender/blenkernel/BKE_context.h7
-rw-r--r--source/blender/blenkernel/BKE_multires.h2
-rw-r--r--source/blender/blenkernel/BKE_sequencer.h14
-rw-r--r--source/blender/blenkernel/SConscript7
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c126
-rw-r--r--source/blender/blenkernel/intern/anim.c15
-rw-r--r--source/blender/blenkernel/intern/bvhutils.c2
-rw-r--r--source/blender/blenkernel/intern/cdderivedmesh.c9
-rw-r--r--source/blender/blenkernel/intern/customdata.c8
-rw-r--r--source/blender/blenkernel/intern/depsgraph.c5
-rw-r--r--source/blender/blenkernel/intern/displist.c17
-rw-r--r--source/blender/blenkernel/intern/editderivedmesh.c85
-rw-r--r--source/blender/blenkernel/intern/key.c2
-rw-r--r--source/blender/blenkernel/intern/mesh.c16
-rw-r--r--source/blender/blenkernel/intern/mesh_validate.c156
-rw-r--r--source/blender/blenkernel/intern/multires.c48
-rw-r--r--source/blender/blenkernel/intern/navmesh_conversion.c2
-rw-r--r--source/blender/blenkernel/intern/node.c4
-rw-r--r--source/blender/blenkernel/intern/object.c2
-rw-r--r--source/blender/blenkernel/intern/scene.c63
-rw-r--r--source/blender/blenkernel/intern/screen.c4
-rw-r--r--source/blender/blenkernel/intern/text.c2
-rw-r--r--source/blender/blenkernel/intern/unit.c7
-rw-r--r--source/blender/blenlib/BLI_math_vector.h2
-rw-r--r--source/blender/blenlib/BLI_scanfill.h51
-rw-r--r--source/blender/blenlib/BLI_threads.h1
-rw-r--r--source/blender/blenlib/BLI_winstuff.h48
-rw-r--r--source/blender/blenlib/intern/fileops.c18
-rw-r--r--source/blender/blenlib/intern/math_base_inline.c2
-rw-r--r--source/blender/blenlib/intern/math_vector_inline.c15
-rw-r--r--source/blender/blenlib/intern/rand.c2
-rw-r--r--source/blender/blenlib/intern/scanfill.c974
-rw-r--r--source/blender/blenlib/intern/storage.c20
-rw-r--r--source/blender/blenlib/intern/threads.c5
-rw-r--r--source/blender/blenloader/BLO_undofile.h2
-rw-r--r--source/blender/blenloader/BLO_writefile.h2
-rw-r--r--source/blender/blenloader/intern/readblenentry.c4
-rw-r--r--source/blender/blenloader/intern/readfile.c90
-rw-r--r--source/blender/blenloader/intern/runtime.c6
-rw-r--r--source/blender/blenloader/intern/undofile.c10
-rw-r--r--source/blender/blenloader/intern/writefile.c38
-rw-r--r--source/blender/bmesh/bmesh.h2
-rw-r--r--source/blender/bmesh/intern/bmesh_construct.c32
-rw-r--r--source/blender/bmesh/intern/bmesh_core.c198
-rw-r--r--source/blender/bmesh/intern/bmesh_interp.c22
-rw-r--r--source/blender/bmesh/intern/bmesh_iterators.c9
-rw-r--r--source/blender/bmesh/intern/bmesh_iterators.h15
-rw-r--r--source/blender/bmesh/intern/bmesh_iterators_inline.h12
-rw-r--r--source/blender/bmesh/intern/bmesh_marking.c99
-rw-r--r--source/blender/bmesh/intern/bmesh_marking.h10
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh.c214
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh.h1
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh_conv.c51
-rw-r--r--source/blender/bmesh/intern/bmesh_mesh_validate.c8
-rw-r--r--source/blender/bmesh/intern/bmesh_mods.c49
-rw-r--r--source/blender/bmesh/intern/bmesh_mods.h16
-rw-r--r--source/blender/bmesh/intern/bmesh_opdefines.c9
-rw-r--r--source/blender/bmesh/intern/bmesh_operators.c40
-rw-r--r--source/blender/bmesh/intern/bmesh_operators_private.h12
-rw-r--r--source/blender/bmesh/intern/bmesh_polygon.c75
-rw-r--r--source/blender/bmesh/intern/bmesh_polygon.h17
-rw-r--r--source/blender/bmesh/intern/bmesh_private.h8
-rw-r--r--source/blender/bmesh/intern/bmesh_queries.c202
-rw-r--r--source/blender/bmesh/intern/bmesh_queries.h9
-rw-r--r--source/blender/bmesh/intern/bmesh_walkers_impl.c14
-rw-r--r--source/blender/bmesh/operators/bmo_bevel.c62
-rw-r--r--source/blender/bmesh/operators/bmo_connect.c10
-rw-r--r--source/blender/bmesh/operators/bmo_create.c36
-rw-r--r--source/blender/bmesh/operators/bmo_dissolve.c27
-rw-r--r--source/blender/bmesh/operators/bmo_dupe.c18
-rw-r--r--source/blender/bmesh/operators/bmo_edgesplit.c20
-rw-r--r--source/blender/bmesh/operators/bmo_extrude.c135
-rw-r--r--source/blender/bmesh/operators/bmo_inset.c78
-rw-r--r--source/blender/bmesh/operators/bmo_join_triangles.c18
-rw-r--r--source/blender/bmesh/operators/bmo_mirror.c16
-rw-r--r--source/blender/bmesh/operators/bmo_primitive.c6
-rw-r--r--source/blender/bmesh/operators/bmo_removedoubles.c48
-rw-r--r--source/blender/bmesh/operators/bmo_slide.c21
-rw-r--r--source/blender/bmesh/operators/bmo_subdivide.c94
-rw-r--r--source/blender/bmesh/operators/bmo_triangulate.c28
-rw-r--r--source/blender/bmesh/operators/bmo_utils.c159
-rw-r--r--source/blender/bmesh/tools/BME_bevel.c246
-rw-r--r--source/blender/editors/curve/editcurve.c42
-rw-r--r--source/blender/editors/include/ED_curve.h2
-rw-r--r--source/blender/editors/include/ED_mesh.h2
-rw-r--r--source/blender/editors/include/ED_uvedit.h2
-rw-r--r--source/blender/editors/interface/interface_icons.c11
-rw-r--r--source/blender/editors/interface/interface_ops.c61
-rw-r--r--source/blender/editors/mesh/CMakeLists.txt1
-rw-r--r--source/blender/editors/mesh/editface.c4
-rw-r--r--source/blender/editors/mesh/editmesh_bvh.c55
-rw-r--r--source/blender/editors/mesh/editmesh_bvh.h10
-rw-r--r--source/blender/editors/mesh/editmesh_knife.c362
-rw-r--r--source/blender/editors/mesh/editmesh_loopcut.c10
-rw-r--r--source/blender/editors/mesh/editmesh_rip.c757
-rw-r--r--source/blender/editors/mesh/editmesh_select.c213
-rw-r--r--source/blender/editors/mesh/editmesh_slide.c127
-rw-r--r--source/blender/editors/mesh/editmesh_tools.c754
-rw-r--r--source/blender/editors/mesh/editmesh_utils.c41
-rw-r--r--source/blender/editors/mesh/mesh_data.c15
-rw-r--r--source/blender/editors/mesh/mesh_intern.h2
-rw-r--r--source/blender/editors/mesh/mesh_navmesh.c7
-rw-r--r--source/blender/editors/mesh/mesh_ops.c11
-rw-r--r--source/blender/editors/mesh/meshtools.c15
-rw-r--r--source/blender/editors/object/object_hook.c10
-rw-r--r--source/blender/editors/object/object_relations.c2
-rw-r--r--source/blender/editors/object/object_transform.c4
-rw-r--r--source/blender/editors/object/object_vgroup.c22
-rw-r--r--source/blender/editors/physics/physics_fluid.c14
-rw-r--r--source/blender/editors/render/render_shading.c3
-rw-r--r--source/blender/editors/sculpt_paint/paint_image.c3
-rw-r--r--source/blender/editors/sculpt_paint/paint_utils.c2
-rw-r--r--source/blender/editors/sculpt_paint/paint_vertex.c11
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_uv.c4
-rw-r--r--source/blender/editors/sound/sound_ops.c3
-rw-r--r--source/blender/editors/space_clip/tracking_ops.c8
-rw-r--r--source/blender/editors/space_console/space_console.c2
-rw-r--r--source/blender/editors/space_file/file_draw.c11
-rw-r--r--source/blender/editors/space_file/file_ops.c3
-rw-r--r--source/blender/editors/space_file/filelist.c2
-rw-r--r--source/blender/editors/space_file/filesel.c24
-rw-r--r--source/blender/editors/space_file/fsmenu.c22
-rw-r--r--source/blender/editors/space_node/node_buttons.c4
-rw-r--r--source/blender/editors/space_node/node_edit.c38
-rw-r--r--source/blender/editors/space_node/node_intern.h4
-rw-r--r--source/blender/editors/space_outliner/CMakeLists.txt5
-rw-r--r--source/blender/editors/space_outliner/SConscript8
-rw-r--r--source/blender/editors/space_outliner/outliner_edit.c33
-rw-r--r--source/blender/editors/space_sequencer/sequencer_edit.c3
-rw-r--r--source/blender/editors/space_text/text_header.c6
-rw-r--r--source/blender/editors/space_view3d/drawobject.c11
-rw-r--r--source/blender/editors/space_view3d/view3d_buttons.c65
-rw-r--r--source/blender/editors/space_view3d/view3d_edit.c8
-rw-r--r--source/blender/editors/space_view3d/view3d_fly.c2
-rw-r--r--source/blender/editors/space_view3d/view3d_select.c22
-rw-r--r--source/blender/editors/space_view3d/view3d_snap.c21
-rw-r--r--source/blender/editors/transform/transform.c94
-rw-r--r--source/blender/editors/transform/transform_conversions.c38
-rw-r--r--source/blender/editors/transform/transform_generics.c2
-rw-r--r--source/blender/editors/transform/transform_manipulator.c12
-rw-r--r--source/blender/editors/transform/transform_ops.c4
-rw-r--r--source/blender/editors/transform/transform_orientations.c14
-rw-r--r--source/blender/editors/transform/transform_snap.c12
-rw-r--r--source/blender/editors/util/CMakeLists.txt4
-rw-r--r--source/blender/editors/util/SConscript6
-rw-r--r--source/blender/editors/util/crazyspace.c8
-rw-r--r--source/blender/editors/uvedit/uvedit_buttons.c8
-rw-r--r--source/blender/editors/uvedit/uvedit_draw.c80
-rw-r--r--source/blender/editors/uvedit/uvedit_ops.c294
-rw-r--r--source/blender/editors/uvedit/uvedit_parametrizer.c4
-rw-r--r--source/blender/editors/uvedit/uvedit_parametrizer.h2
-rw-r--r--source/blender/editors/uvedit/uvedit_smart_stitch.c16
-rw-r--r--source/blender/editors/uvedit/uvedit_unwrap_ops.c188
-rw-r--r--source/blender/gpu/SConscript3
-rw-r--r--source/blender/gpu/intern/gpu_extensions.c4
-rw-r--r--source/blender/ikplugin/intern/iksolver_plugin.c6
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_api.cpp6
-rw-r--r--source/blender/imbuf/intern/thumbs.c35
-rw-r--r--source/blender/makesdna/DNA_node_types.h3
-rw-r--r--source/blender/makesdna/DNA_object_fluidsim.h3
-rw-r--r--source/blender/makesdna/DNA_windowmanager_types.h1
-rw-r--r--source/blender/makesrna/RNA_access.h30
-rw-r--r--source/blender/makesrna/RNA_types.h6
-rw-r--r--source/blender/makesrna/SConscript3
-rw-r--r--source/blender/makesrna/intern/SConscript3
-rw-r--r--source/blender/makesrna/intern/makesrna.c9
-rw-r--r--source/blender/makesrna/intern/rna_access.c6
-rw-r--r--source/blender/makesrna/intern/rna_armature.c2
-rw-r--r--source/blender/makesrna/intern/rna_boid.c3
-rw-r--r--source/blender/makesrna/intern/rna_constraint.c4
-rw-r--r--source/blender/makesrna/intern/rna_fcurve.c6
-rw-r--r--source/blender/makesrna/intern/rna_fluidsim.c21
-rw-r--r--source/blender/makesrna/intern/rna_image_api.c2
-rw-r--r--source/blender/makesrna/intern/rna_modifier.c4
-rw-r--r--source/blender/makesrna/intern/rna_nodetree.c9
-rw-r--r--source/blender/makesrna/intern/rna_nodetree_types.h6
-rw-r--r--source/blender/makesrna/intern/rna_object.c3
-rw-r--r--source/blender/makesrna/intern/rna_object_force.c2
-rw-r--r--source/blender/makesrna/intern/rna_particle.c8
-rw-r--r--source/blender/makesrna/intern/rna_render.c2
-rw-r--r--source/blender/makesrna/intern/rna_space.c2
-rw-r--r--source/blender/makesrna/intern/rna_tracking.c2
-rw-r--r--source/blender/makesrna/intern/rna_userdef.c2
-rw-r--r--source/blender/makesrna/intern/rna_wm.c1
-rw-r--r--source/blender/makesrna/intern/rna_wm_api.c17
-rw-r--r--source/blender/modifiers/intern/MOD_array.c16
-rw-r--r--source/blender/modifiers/intern/MOD_bevel.c6
-rw-r--r--source/blender/modifiers/intern/MOD_edgesplit.c4
-rw-r--r--source/blender/modifiers/intern/MOD_fluidsim_util.c1
-rw-r--r--source/blender/modifiers/intern/MOD_remesh.c1
-rw-r--r--source/blender/nodes/composite/node_composite_tree.c24
-rw-r--r--source/blender/nodes/composite/nodes/node_composite_image.c338
-rw-r--r--source/blender/python/bmesh/bmesh_py_api.c6
-rw-r--r--source/blender/python/bmesh/bmesh_py_types.c91
-rw-r--r--source/blender/python/bmesh/bmesh_py_types.h17
-rw-r--r--source/blender/python/generic/idprop_py_api.c79
-rw-r--r--source/blender/python/generic/idprop_py_api.h2
-rw-r--r--source/blender/python/intern/bpy_interface.c3
-rw-r--r--source/blender/python/mathutils/mathutils.c28
-rw-r--r--source/blender/python/mathutils/mathutils_Color.c2
-rw-r--r--source/blender/python/mathutils/mathutils_Euler.c2
-rw-r--r--source/blender/python/mathutils/mathutils_Matrix.c2
-rw-r--r--source/blender/python/mathutils/mathutils_Quaternion.c2
-rw-r--r--source/blender/python/mathutils/mathutils_Vector.c2
-rw-r--r--source/blender/render/SConscript5
-rw-r--r--source/blender/render/extern/include/RE_render_ext.h3
-rw-r--r--source/blender/render/intern/source/convertblender.c4
-rw-r--r--source/blender/render/intern/source/shadeoutput.c2
-rw-r--r--source/blender/windowmanager/WM_keymap.h1
-rw-r--r--source/blender/windowmanager/WM_types.h3
-rw-r--r--source/blender/windowmanager/intern/wm_dragdrop.c12
-rw-r--r--source/blender/windowmanager/intern/wm_files.c55
-rw-r--r--source/blender/windowmanager/intern/wm_gesture.c16
-rw-r--r--source/blender/windowmanager/intern/wm_init_exit.c4
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c49
-rw-r--r--source/blender/windowmanager/intern/wm_operators.c24
-rw-r--r--source/blenderplayer/bad_level_call_stubs/stubs.c1
-rw-r--r--source/creator/creator.c11
-rw-r--r--source/gameengine/Converter/BL_BlenderDataConversion.cpp2
-rw-r--r--source/gameengine/Ketsji/KX_NavMeshObject.cpp3
-rw-r--r--source/gameengine/Physics/Bullet/CcdPhysicsController.cpp4
272 files changed, 5406 insertions, 3774 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e3ce376ff7d..2669f2ff93f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -153,7 +153,7 @@ if(UNIX AND NOT APPLE)
else()
set(PLATFORM_DEFAULT OFF)
endif()
-option(WITH_OPENMP "Enable OpenMP (has to be supported by the compiler)" PLATFORM_DEFAULT)
+option(WITH_OPENMP "Enable OpenMP (has to be supported by the compiler)" ${PLATFORM_DEFAULT})
unset(PLATFORM_DEFAULT)
@@ -194,7 +194,14 @@ option(WITH_IMAGE_REDCODE "Enable RedCode Image Support" OFF)
option(WITH_IMAGE_FRAMESERVER "Enable image FrameServer Support for rendering" ON)
# Audio/Video format support
-option(WITH_CODEC_FFMPEG "Enable FFMPeg Support (http://ffmpeg.org)" OFF)
+if(MINGW)
+ set(PLATFORM_DEFAULT ON)
+else()
+ set(PLATFORM_DEFAULT OFF)
+endif()
+option(WITH_CODEC_FFMPEG "Enable FFMPeg Support (http://ffmpeg.org)" ${PLATFORM_DEFAULT})
+unset(PLATFORM_DEFAULT)
+
option(WITH_CODEC_SNDFILE "Enable libsndfile Support (http://www.mega-nerd.com/libsndfile)" OFF)
if(APPLE OR (WIN32 AND NOT UNIX))
option(WITH_CODEC_QUICKTIME "Enable Quicktime Support" OFF)
@@ -357,6 +364,19 @@ if(WITH_GHOST_SDL OR WITH_HEADLESS)
set(WITH_GHOST_XDND OFF)
endif()
+if(MINGW)
+ if(WITH_CODEC_QUICKTIME)
+ message(FATAL_ERROR "MINGW requires WITH_CODEC_QUICKTIME to be OFF "
+ "because it is currently unsupported, remove this "
+ "line if youre a developer who wants to add support.")
+ endif()
+
+ if((NOT WITH_CODEC_FFMPEG) AND (WITH_CYCLES OR WITH_IMAGE_OPENEXR OR WITH_IMAGE_TIFF))
+ message(FATAL_ERROR "MINGW has a problem with: WITH_CYCLES/WITH_IMAGE_OPENEXR/WITH_IMAGE_TIFF "
+ "when WITH_CODEC_FFMPEG is disabled, enable FFMPEG or disable CYCLES/EXR/TIFF.")
+ endif()
+endif()
+
TEST_SSE_SUPPORT(COMPILER_SSE_FLAG COMPILER_SSE2_FLAG)
diff --git a/SConstruct b/SConstruct
index ff668a97483..e73d654a0c8 100644
--- a/SConstruct
+++ b/SConstruct
@@ -251,6 +251,7 @@ if 'blenderlite' in B.targets:
target_env_defs['WITH_BF_REDCODE'] = False
target_env_defs['WITH_BF_DDS'] = False
target_env_defs['WITH_BF_CINEON'] = False
+ target_env_defs['WITH_BF_FRAMESERVER'] = False
target_env_defs['WITH_BF_HDR'] = False
target_env_defs['WITH_BF_ZLIB'] = False
target_env_defs['WITH_BF_SDL'] = False
@@ -261,6 +262,7 @@ if 'blenderlite' in B.targets:
target_env_defs['BF_BUILDINFO'] = False
target_env_defs['WITH_BF_FLUID'] = False
target_env_defs['WITH_BF_OCEANSIM'] = False
+ target_env_defs['WITH_BF_SMOKE'] = False
target_env_defs['WITH_BF_DECIMATE'] = False
target_env_defs['WITH_BF_BOOLEAN'] = False
target_env_defs['WITH_BF_REMESH'] = False
diff --git a/build_files/cmake/project_info.py b/build_files/cmake/project_info.py
index 77574f17e2e..3f64ac51a4d 100755
--- a/build_files/cmake/project_info.py
+++ b/build_files/cmake/project_info.py
@@ -231,8 +231,13 @@ def project_name_get(path, fallback="Blender", prefix="Blender_"):
return fallback
import subprocess
- info = subprocess.Popen(["svn", "info", path],
- stdout=subprocess.PIPE).communicate()[0]
+ try:
+ info = subprocess.Popen(["svn", "info", path],
+ stdout=subprocess.PIPE).communicate()[0]
+ except:
+ # possibly 'svn' isnt found/installed
+ return fallback
+
# string version, we only want the URL
info = info.decode(encoding="utf-8", errors="ignore")
diff --git a/build_files/scons/tools/btools.py b/build_files/scons/tools/btools.py
index bb1948b2c16..544f7f066ce 100644
--- a/build_files/scons/tools/btools.py
+++ b/build_files/scons/tools/btools.py
@@ -107,6 +107,7 @@ def validate_arguments(args, bc):
'WITH_BF_FFMPEG', 'BF_FFMPEG_LIB','BF_FFMPEG_EXTRA', 'BF_FFMPEG', 'BF_FFMPEG_INC', 'BF_FFMPEG_DLL',
'WITH_BF_STATICFFMPEG', 'BF_FFMPEG_LIB_STATIC',
'WITH_BF_OGG', 'BF_OGG', 'BF_OGG_LIB',
+ 'WITH_BF_FRAMESERVER',
'WITH_BF_JPEG', 'BF_JPEG', 'BF_JPEG_INC', 'BF_JPEG_LIB', 'BF_JPEG_LIBPATH',
'WITH_BF_OPENJPEG', 'BF_OPENJPEG', 'BF_OPENJPEG_INC', 'BF_OPENJPEG_LIB', 'BF_OPENJPEG_LIBPATH',
'WITH_BF_REDCODE', 'BF_REDCODE', 'BF_REDCODE_INC', 'BF_REDCODE_LIB', 'BF_REDCODE_LIBPATH',
@@ -154,6 +155,7 @@ def validate_arguments(args, bc):
'WITH_BF_BOOLEAN',
'WITH_BF_REMESH',
'WITH_BF_OCEANSIM',
+ 'WITH_BF_SMOKE',
'WITH_BF_CXX_GUARDEDALLOC',
'WITH_BF_JEMALLOC', 'WITH_BF_STATICJEMALLOC', 'BF_JEMALLOC', 'BF_JEMALLOC_INC', 'BF_JEMALLOC_LIBPATH', 'BF_JEMALLOC_LIB', 'BF_JEMALLOC_LIB_STATIC',
'BUILDBOT_BRANCH',
@@ -264,6 +266,7 @@ def read_opts(env, cfg, args):
(BoolVariable('WITH_BF_BOOLEAN', 'Build with boolean modifier', True)),
(BoolVariable('WITH_BF_REMESH', 'Build with remesh modifier', True)),
(BoolVariable('WITH_BF_OCEANSIM', 'Build with ocean simulation', False)),
+ (BoolVariable('WITH_BF_SMOKE', 'Build with smoke simulation', True)),
('BF_PROFILE_FLAGS', 'Profiling compiler flags', ''),
(BoolVariable('WITH_BF_OPENAL', 'Use OpenAL if true', False)),
('BF_OPENAL', 'Base path for OpenAL', ''),
@@ -311,6 +314,8 @@ def read_opts(env, cfg, args):
(BoolVariable('WITH_BF_CINEON', 'Support CINEON and DPX image formats if true', True)),
(BoolVariable('WITH_BF_HDR', 'Support HDR image formats if true', True)),
+
+ (BoolVariable('WITH_BF_FRAMESERVER', 'Support export to a frameserver', True)),
(BoolVariable('WITH_BF_FFMPEG', 'Use FFMPEG if true', False)),
('BF_FFMPEG', 'FFMPEG base path', ''),
diff --git a/doc/python_api/sphinx_doc_gen.py b/doc/python_api/sphinx_doc_gen.py
index b3706de6ca0..8dd2a34932e 100644
--- a/doc/python_api/sphinx_doc_gen.py
+++ b/doc/python_api/sphinx_doc_gen.py
@@ -131,7 +131,7 @@ def handle_args():
dest="sphinx_theme",
type=str,
default='default',
- help =
+ help=
# see SPHINX_THEMES below
"Sphinx theme (default='default')\n"
"Available themes\n"
diff --git a/intern/cycles/app/cycles_xml.cpp b/intern/cycles/app/cycles_xml.cpp
index b93f61b98d5..b954ff45e27 100644
--- a/intern/cycles/app/cycles_xml.cpp
+++ b/intern/cycles/app/cycles_xml.cpp
@@ -724,7 +724,7 @@ static void xml_read_patch(const XMLReadState& state, pugi::xml_node node)
LinearQuadPatch *bpatch = new LinearQuadPatch();
for(int i = 0; i < 4; i++)
- P[i] = transform(&state.tfm, P[i]);
+ P[i] = transform_point(&state.tfm, P[i]);
memcpy(bpatch->hull, &P[0], sizeof(bpatch->hull));
patch = bpatch;
@@ -738,7 +738,7 @@ static void xml_read_patch(const XMLReadState& state, pugi::xml_node node)
BicubicPatch *bpatch = new BicubicPatch();
for(int i = 0; i < 16; i++)
- P[i] = transform(&state.tfm, P[i]);
+ P[i] = transform_point(&state.tfm, P[i]);
memcpy(bpatch->hull, &P[0], sizeof(bpatch->hull));
patch = bpatch;
@@ -777,7 +777,7 @@ static void xml_read_light(const XMLReadState& state, pugi::xml_node node)
Light *light = new Light();
light->shader = state.shader;
xml_read_float3(&light->co, node, "P");
- light->co = transform(&state.tfm, light->co);
+ light->co = transform_point(&state.tfm, light->co);
state.scene->lights.push_back(light);
}
diff --git a/intern/cycles/kernel/kernel_bvh.h b/intern/cycles/kernel/kernel_bvh.h
index 35215fd0f9f..523ae8ae926 100644
--- a/intern/cycles/kernel/kernel_bvh.h
+++ b/intern/cycles/kernel/kernel_bvh.h
@@ -59,7 +59,7 @@ __device_inline void bvh_instance_push(KernelGlobals *kg, int object, const Ray
{
Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
- *P = transform(&tfm, ray->P);
+ *P = transform_point(&tfm, ray->P);
float3 dir = transform_direction(&tfm, ray->D);
@@ -351,7 +351,7 @@ __device_inline float3 bvh_triangle_refine(KernelGlobals *kg, const Intersection
if(isect->object != ~0) {
Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_INVERSE_TRANSFORM);
- P = transform(&tfm, P);
+ P = transform_point(&tfm, P);
D = transform_direction(&tfm, D*t);
D = normalize_len(D, &t);
}
@@ -367,7 +367,7 @@ __device_inline float3 bvh_triangle_refine(KernelGlobals *kg, const Intersection
if(isect->object != ~0) {
Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_TRANSFORM);
- P = transform(&tfm, P);
+ P = transform_point(&tfm, P);
}
return P;
diff --git a/intern/cycles/kernel/kernel_camera.h b/intern/cycles/kernel/kernel_camera.h
index 0460765fe86..58c482212df 100644
--- a/intern/cycles/kernel/kernel_camera.h
+++ b/intern/cycles/kernel/kernel_camera.h
@@ -39,7 +39,7 @@ __device void camera_sample_perspective(KernelGlobals *kg, float raster_x, float
{
/* create ray form raster position */
Transform rastertocamera = kernel_data.cam.rastertocamera;
- float3 Pcamera = transform(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
+ float3 Pcamera = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
ray->P = make_float3(0.0f, 0.0f, 0.0f);
ray->D = Pcamera;
@@ -63,7 +63,7 @@ __device void camera_sample_perspective(KernelGlobals *kg, float raster_x, float
/* transform ray from camera to world */
Transform cameratoworld = kernel_data.cam.cameratoworld;
- ray->P = transform(&cameratoworld, ray->P);
+ ray->P = transform_point(&cameratoworld, ray->P);
ray->D = transform_direction(&cameratoworld, ray->D);
ray->D = normalize(ray->D);
@@ -93,7 +93,7 @@ __device void camera_sample_orthographic(KernelGlobals *kg, float raster_x, floa
{
/* create ray form raster position */
Transform rastertocamera = kernel_data.cam.rastertocamera;
- float3 Pcamera = transform(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
+ float3 Pcamera = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
ray->P = Pcamera;
ray->D = make_float3(0.0f, 0.0f, 1.0f);
@@ -101,7 +101,7 @@ __device void camera_sample_orthographic(KernelGlobals *kg, float raster_x, floa
/* transform ray from camera to world */
Transform cameratoworld = kernel_data.cam.cameratoworld;
- ray->P = transform(&cameratoworld, ray->P);
+ ray->P = transform_point(&cameratoworld, ray->P);
ray->D = transform_direction(&cameratoworld, ray->D);
ray->D = normalize(ray->D);
@@ -127,7 +127,7 @@ __device void camera_sample_orthographic(KernelGlobals *kg, float raster_x, floa
__device void camera_sample_environment(KernelGlobals *kg, float raster_x, float raster_y, Ray *ray)
{
Transform rastertocamera = kernel_data.cam.rastertocamera;
- float3 Pcamera = transform(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
+ float3 Pcamera = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y, 0.0f));
/* create ray form raster position */
ray->P = make_float3(0.0, 0.0f, 0.0f);
@@ -136,7 +136,7 @@ __device void camera_sample_environment(KernelGlobals *kg, float raster_x, float
/* transform ray from camera to world */
Transform cameratoworld = kernel_data.cam.cameratoworld;
- ray->P = transform(&cameratoworld, ray->P);
+ ray->P = transform_point(&cameratoworld, ray->P);
ray->D = transform_direction(&cameratoworld, ray->D);
ray->D = normalize(ray->D);
@@ -145,10 +145,10 @@ __device void camera_sample_environment(KernelGlobals *kg, float raster_x, float
ray->dP.dx = make_float3(0.0f, 0.0f, 0.0f);
ray->dP.dy = make_float3(0.0f, 0.0f, 0.0f);
- Pcamera = transform(&rastertocamera, make_float3(raster_x + 1.0f, raster_y, 0.0f));
+ Pcamera = transform_perspective(&rastertocamera, make_float3(raster_x + 1.0f, raster_y, 0.0f));
ray->dD.dx = normalize(transform_direction(&cameratoworld, equirectangular_to_direction(Pcamera.x, Pcamera.y))) - ray->D;
- Pcamera = transform(&rastertocamera, make_float3(raster_x, raster_y + 1.0f, 0.0f));
+ Pcamera = transform_perspective(&rastertocamera, make_float3(raster_x, raster_y + 1.0f, 0.0f));
ray->dD.dy = normalize(transform_direction(&cameratoworld, equirectangular_to_direction(Pcamera.x, Pcamera.y))) - ray->D;
#endif
diff --git a/intern/cycles/kernel/kernel_mbvh.h b/intern/cycles/kernel/kernel_mbvh.h
index 3995e782abd..ccbd3d069b4 100644
--- a/intern/cycles/kernel/kernel_mbvh.h
+++ b/intern/cycles/kernel/kernel_mbvh.h
@@ -61,7 +61,7 @@ __device void mbvh_instance_push(KernelGlobals *kg, int object, MBVHRay *ray)
{
Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
- ray->P = transform(&tfm, ray->origP);
+ ray->P = transform_point(&tfm, ray->origP);
float3 dir = ray->origD;
diff --git a/intern/cycles/kernel/kernel_object.h b/intern/cycles/kernel/kernel_object.h
index 318a6fea489..b676f58e5d4 100644
--- a/intern/cycles/kernel/kernel_object.h
+++ b/intern/cycles/kernel/kernel_object.h
@@ -42,7 +42,7 @@ __device_inline Transform object_fetch_transform(KernelGlobals *kg, int object,
__device_inline void object_position_transform(KernelGlobals *kg, int object, float3 *P)
{
Transform tfm = object_fetch_transform(kg, object, OBJECT_TRANSFORM);
- *P = transform(&tfm, *P);
+ *P = transform_point(&tfm, *P);
}
__device_inline void object_normal_transform(KernelGlobals *kg, int object, float3 *N)
diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h
index d195af293b7..fd4ee17cdc1 100644
--- a/intern/cycles/kernel/kernel_passes.h
+++ b/intern/cycles/kernel/kernel_passes.h
@@ -53,7 +53,7 @@ __device_inline void kernel_write_data_passes(KernelGlobals *kg, __global float
if(sample == 0) {
if(flag & PASS_DEPTH) {
Transform tfm = kernel_data.cam.worldtocamera;
- float depth = len(transform(&tfm, sd->P));
+ float depth = len(transform_point(&tfm, sd->P));
kernel_write_pass_float(buffer + kernel_data.film.pass_depth, sample, depth);
}
diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h
index 53ce374e150..ff12e85375c 100644
--- a/intern/cycles/kernel/kernel_path.h
+++ b/intern/cycles/kernel/kernel_path.h
@@ -147,14 +147,14 @@ __device_inline float path_state_terminate_probability(KernelGlobals *kg, PathSt
__device_inline bool shadow_blocked(KernelGlobals *kg, PathState *state, Ray *ray, float3 *shadow)
{
+ *shadow = make_float3(1.0f, 1.0f, 1.0f);
+
if(ray->t == 0.0f)
return false;
Intersection isect;
bool result = scene_intersect(kg, ray, PATH_RAY_SHADOW_OPAQUE, &isect);
- *shadow = make_float3(1.0f, 1.0f, 1.0f);
-
#ifdef __TRANSPARENT_SHADOWS__
if(result && kernel_data.integrator.transparent_shadows) {
/* transparent shadows work in such a way to try to minimize overhead
diff --git a/intern/cycles/kernel/kernel_qbvh.h b/intern/cycles/kernel/kernel_qbvh.h
index 96e68d797dd..525b616921d 100644
--- a/intern/cycles/kernel/kernel_qbvh.h
+++ b/intern/cycles/kernel/kernel_qbvh.h
@@ -50,7 +50,7 @@ __device_inline void qbvh_instance_push(KernelGlobals *kg, int object, const Ray
{
Transform tfm = object_fetch_transform(kg, object, OBJECT_INVERSE_TRANSFORM);
- *P = transform(&tfm, ray->P);
+ *P = transform_point(&tfm, ray->P);
float3 dir = transform_direction(&tfm, ray->D);
@@ -384,7 +384,7 @@ __device_inline float3 bvh_triangle_refine(KernelGlobals *kg, const Intersection
if(isect->object != ~0) {
Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_INVERSE_TRANSFORM);
- P = transform(&tfm, P);
+ P = transform_point(&tfm, P);
D = transform_direction(&tfm, D*t);
D = normalize_len(D, &t);
}
@@ -400,7 +400,7 @@ __device_inline float3 bvh_triangle_refine(KernelGlobals *kg, const Intersection
if(isect->object != ~0) {
Transform tfm = object_fetch_transform(kg, isect->object, OBJECT_TRANSFORM);
- P = transform(&tfm, P);
+ P = transform_point(&tfm, P);
}
return P;
diff --git a/intern/cycles/kernel/svm/svm_camera.h b/intern/cycles/kernel/svm/svm_camera.h
index cf161ddcd8c..f13cefb7764 100644
--- a/intern/cycles/kernel/svm/svm_camera.h
+++ b/intern/cycles/kernel/svm/svm_camera.h
@@ -25,7 +25,7 @@ __device void svm_node_camera(KernelGlobals *kg, ShaderData *sd, float *stack, u
float3 vector;
Transform tfm = kernel_data.cam.worldtocamera;
- vector = transform(&tfm, sd->P);
+ vector = transform_point(&tfm, sd->P);
zdepth = vector.z;
distance = len(vector);
diff --git a/intern/cycles/kernel/svm/svm_mapping.h b/intern/cycles/kernel/svm/svm_mapping.h
index 7633c3e783b..6dc74aece08 100644
--- a/intern/cycles/kernel/svm/svm_mapping.h
+++ b/intern/cycles/kernel/svm/svm_mapping.h
@@ -30,7 +30,7 @@ __device void svm_node_mapping(KernelGlobals *kg, ShaderData *sd, float *stack,
tfm.z = read_node_float(kg, offset);
tfm.w = read_node_float(kg, offset);
- float3 r = transform(&tfm, v);
+ float3 r = transform_point(&tfm, v);
stack_store_float3(stack, out_offset, r);
}
diff --git a/intern/cycles/kernel/svm/svm_tex_coord.h b/intern/cycles/kernel/svm/svm_tex_coord.h
index bcf3716ae57..f494b6d66e1 100644
--- a/intern/cycles/kernel/svm/svm_tex_coord.h
+++ b/intern/cycles/kernel/svm/svm_tex_coord.h
@@ -34,7 +34,7 @@ __device void svm_node_tex_coord(KernelGlobals *kg, ShaderData *sd, float *stack
case NODE_TEXCO_OBJECT: {
if(sd->object != ~0) {
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
- data = transform(&tfm, sd->P);
+ data = transform_point(&tfm, sd->P);
}
else
data = sd->P;
@@ -44,18 +44,18 @@ __device void svm_node_tex_coord(KernelGlobals *kg, ShaderData *sd, float *stack
Transform tfm = kernel_data.cam.worldtocamera;
if(sd->object != ~0)
- data = transform(&tfm, sd->P);
+ data = transform_point(&tfm, sd->P);
else
- data = transform(&tfm, sd->P + svm_background_offset(kg));
+ data = transform_point(&tfm, sd->P + svm_background_offset(kg));
break;
}
case NODE_TEXCO_WINDOW: {
Transform tfm = kernel_data.cam.worldtondc;
if(sd->object != ~0)
- data = transform(&tfm, sd->P);
+ data = transform_perspective(&tfm, sd->P);
else
- data = transform(&tfm, sd->P + svm_background_offset(kg));
+ data = transform_perspective(&tfm, sd->P + svm_background_offset(kg));
break;
}
case NODE_TEXCO_REFLECTION: {
@@ -79,7 +79,7 @@ __device void svm_node_tex_coord_bump_dx(KernelGlobals *kg, ShaderData *sd, floa
case NODE_TEXCO_OBJECT: {
if(sd->object != ~0) {
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
- data = transform(&tfm, sd->P + sd->dP.dx);
+ data = transform_point(&tfm, sd->P + sd->dP.dx);
}
else
data = sd->P + sd->dP.dx;
@@ -89,18 +89,18 @@ __device void svm_node_tex_coord_bump_dx(KernelGlobals *kg, ShaderData *sd, floa
Transform tfm = kernel_data.cam.worldtocamera;
if(sd->object != ~0)
- data = transform(&tfm, sd->P + sd->dP.dx);
+ data = transform_point(&tfm, sd->P + sd->dP.dx);
else
- data = transform(&tfm, sd->P + sd->dP.dx + svm_background_offset(kg));
+ data = transform_point(&tfm, sd->P + sd->dP.dx + svm_background_offset(kg));
break;
}
case NODE_TEXCO_WINDOW: {
Transform tfm = kernel_data.cam.worldtondc;
if(sd->object != ~0)
- data = transform(&tfm, sd->P + sd->dP.dx);
+ data = transform_perspective(&tfm, sd->P + sd->dP.dx);
else
- data = transform(&tfm, sd->P + sd->dP.dx + svm_background_offset(kg));
+ data = transform_perspective(&tfm, sd->P + sd->dP.dx + svm_background_offset(kg));
break;
}
case NODE_TEXCO_REFLECTION: {
@@ -127,7 +127,7 @@ __device void svm_node_tex_coord_bump_dy(KernelGlobals *kg, ShaderData *sd, floa
case NODE_TEXCO_OBJECT: {
if(sd->object != ~0) {
Transform tfm = object_fetch_transform(kg, sd->object, OBJECT_INVERSE_TRANSFORM);
- data = transform(&tfm, sd->P + sd->dP.dy);
+ data = transform_point(&tfm, sd->P + sd->dP.dy);
}
else
data = sd->P + sd->dP.dy;
@@ -137,18 +137,18 @@ __device void svm_node_tex_coord_bump_dy(KernelGlobals *kg, ShaderData *sd, floa
Transform tfm = kernel_data.cam.worldtocamera;
if(sd->object != ~0)
- data = transform(&tfm, sd->P + sd->dP.dy);
+ data = transform_point(&tfm, sd->P + sd->dP.dy);
else
- data = transform(&tfm, sd->P + sd->dP.dy + svm_background_offset(kg));
+ data = transform_point(&tfm, sd->P + sd->dP.dy + svm_background_offset(kg));
break;
}
case NODE_TEXCO_WINDOW: {
Transform tfm = kernel_data.cam.worldtondc;
if(sd->object != ~0)
- data = transform(&tfm, sd->P + sd->dP.dy);
+ data = transform_perspective(&tfm, sd->P + sd->dP.dy);
else
- data = transform(&tfm, sd->P + sd->dP.dy + svm_background_offset(kg));
+ data = transform_perspective(&tfm, sd->P + sd->dP.dy + svm_background_offset(kg));
break;
}
case NODE_TEXCO_REFLECTION: {
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index 62a322b3a0f..bda20a8ab9d 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -119,7 +119,7 @@ void RenderBuffers::reset(Device *device, BufferParams& params_)
for(x=0; x<width; x++)
for(y=0; y<height; y++)
- init_state[x + y*width] = hash_int_2d(x, y);
+ init_state[x + y*width] = hash_int_2d(params.full_x+x, params.full_y+y);
device->mem_alloc(rng_state, MEM_READ_WRITE);
device->mem_copy_to(rng_state);
diff --git a/intern/cycles/render/camera.cpp b/intern/cycles/render/camera.cpp
index 6edf9c66f1d..f9290dfc835 100644
--- a/intern/cycles/render/camera.cpp
+++ b/intern/cycles/render/camera.cpp
@@ -107,10 +107,10 @@ void Camera::update()
dy = transform_direction(&rastertocamera, make_float3(0, 1, 0));
}
else if(type == CAMERA_PERSPECTIVE) {
- dx = transform(&rastertocamera, make_float3(1, 0, 0)) -
- transform(&rastertocamera, make_float3(0, 0, 0));
- dy = transform(&rastertocamera, make_float3(0, 1, 0)) -
- transform(&rastertocamera, make_float3(0, 0, 0));
+ dx = transform_perspective(&rastertocamera, make_float3(1, 0, 0)) -
+ transform_perspective(&rastertocamera, make_float3(0, 0, 0));
+ dy = transform_perspective(&rastertocamera, make_float3(0, 1, 0)) -
+ transform_perspective(&rastertocamera, make_float3(0, 0, 0));
}
else {
dx = make_float3(0, 0, 0);
diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp
index ed4d0b2dcde..cc17f86fcb6 100644
--- a/intern/cycles/render/film.cpp
+++ b/intern/cycles/render/film.cpp
@@ -125,7 +125,6 @@ void Pass::add(PassType type, vector<Pass>& passes)
break;
case PASS_AO:
pass.components = 4;
- pass.exposure = true;
break;
case PASS_SHADOW:
pass.components = 4;
diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp
index bd3acb00f6d..316e5cec9aa 100644
--- a/intern/cycles/render/light.cpp
+++ b/intern/cycles/render/light.cpp
@@ -213,9 +213,9 @@ void LightManager::device_update_distribution(Device *device, DeviceScene *dscen
offset++;
Mesh::Triangle t = mesh->triangles[i];
- float3 p1 = transform(&tfm, mesh->verts[t.v[0]]);
- float3 p2 = transform(&tfm, mesh->verts[t.v[1]]);
- float3 p3 = transform(&tfm, mesh->verts[t.v[2]]);
+ float3 p1 = transform_point(&tfm, mesh->verts[t.v[0]]);
+ float3 p2 = transform_point(&tfm, mesh->verts[t.v[1]]);
+ float3 p3 = transform_point(&tfm, mesh->verts[t.v[2]]);
totarea += triangle_area(p1, p2, p3);
}
diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp
index f83c85c632d..5f7a5810c09 100644
--- a/intern/cycles/render/object.cpp
+++ b/intern/cycles/render/object.cpp
@@ -54,7 +54,7 @@ void Object::apply_transform()
return;
for(size_t i = 0; i < mesh->verts.size(); i++)
- mesh->verts[i] = transform(&tfm, mesh->verts[i]);
+ mesh->verts[i] = transform_point(&tfm, mesh->verts[i]);
Attribute *attr_fN = mesh->attributes.find(Attribute::STD_FACE_NORMAL);
Attribute *attr_vN = mesh->attributes.find(Attribute::STD_VERTEX_NORMAL);
@@ -159,9 +159,9 @@ void ObjectManager::device_update_transforms(Device *device, DeviceScene *dscene
}
else {
foreach(Mesh::Triangle& t, mesh->triangles) {
- float3 p1 = transform(&tfm, mesh->verts[t.v[0]]);
- float3 p2 = transform(&tfm, mesh->verts[t.v[1]]);
- float3 p3 = transform(&tfm, mesh->verts[t.v[2]]);
+ float3 p1 = transform_point(&tfm, mesh->verts[t.v[0]]);
+ float3 p2 = transform_point(&tfm, mesh->verts[t.v[1]]);
+ float3 p3 = transform_point(&tfm, mesh->verts[t.v[2]]);
surface_area += triangle_area(p1, p2, p3);
}
diff --git a/intern/cycles/subd/subd_dice.cpp b/intern/cycles/subd/subd_dice.cpp
index 086b7b246d3..6b29d1ca51a 100644
--- a/intern/cycles/subd/subd_dice.cpp
+++ b/intern/cycles/subd/subd_dice.cpp
@@ -141,7 +141,7 @@ float3 QuadDice::eval_projected(SubPatch& sub, float u, float v)
sub.patch->eval(&P, NULL, NULL, uv.x, uv.y);
if(camera)
- P = transform(&camera->worldtoraster, P);
+ P = transform_perspective(&camera->worldtoraster, P);
return P;
}
diff --git a/intern/cycles/subd/subd_split.cpp b/intern/cycles/subd/subd_split.cpp
index d61a42e4dcf..f0b87200f08 100644
--- a/intern/cycles/subd/subd_split.cpp
+++ b/intern/cycles/subd/subd_split.cpp
@@ -57,7 +57,7 @@ float3 DiagSplit::project(Patch *patch, float2 uv)
patch->eval(&P, NULL, NULL, uv.x, uv.y);
if(camera)
- P = transform(&camera->worldtoraster, P);
+ P = transform_perspective(&camera->worldtoraster, P);
return P;
}
diff --git a/intern/cycles/util/util_boundbox.h b/intern/cycles/util/util_boundbox.h
index 0114a9a26a5..bb1df0b220f 100644
--- a/intern/cycles/util/util_boundbox.h
+++ b/intern/cycles/util/util_boundbox.h
@@ -76,8 +76,8 @@ public:
bool valid(void) const
{
return (min.x <= max.x) && (min.y <= max.y) && (min.z <= max.z) &&
- !(isnan(min.x) || isnan(min.y) || isnan(min.z)) &&
- !(isnan(max.x) || isnan(max.y) || isnan(max.z));
+ (isfinite(min.x) && isfinite(min.y) && isfinite(min.z)) &&
+ (isfinite(max.x) && isfinite(max.y) && isfinite(max.z));
}
BoundBox transformed(const Transform *tfm)
@@ -91,7 +91,7 @@ public:
p.y = (i & 2)? min.y: max.y;
p.z = (i & 4)? min.z: max.z;
- result.grow(transform(tfm, p));
+ result.grow(transform_point(tfm, p));
}
return result;
diff --git a/intern/cycles/util/util_transform.h b/intern/cycles/util/util_transform.h
index 07db52f6392..aeaef7b0e21 100644
--- a/intern/cycles/util/util_transform.h
+++ b/intern/cycles/util/util_transform.h
@@ -37,7 +37,7 @@ typedef struct Transform {
#endif
} Transform;
-__device_inline float3 transform(const Transform *t, const float3 a)
+__device_inline float3 transform_perspective(const Transform *t, const float3 a)
{
float4 b = make_float4(a.x, a.y, a.z, 1.0f);
float3 c = make_float3(dot(t->x, b), dot(t->y, b), dot(t->z, b));
@@ -46,6 +46,14 @@ __device_inline float3 transform(const Transform *t, const float3 a)
return (w != 0.0f)? c/w: make_float3(0.0f, 0.0f, 0.0f);
}
+__device_inline float3 transform_point(const Transform *t, const float3 a)
+{
+ float4 b = make_float4(a.x, a.y, a.z, 1.0f);
+ float3 c = make_float3(dot(t->x, b), dot(t->y, b), dot(t->z, b));
+
+ return c;
+}
+
__device_inline float3 transform_direction(const Transform *t, const float3 a)
{
float4 b = make_float4(a.x, a.y, a.z, 0.0f);
diff --git a/intern/dualcon/intern/Projections.h b/intern/dualcon/intern/Projections.h
index a01b4dffdb0..18533b218ff 100644
--- a/intern/dualcon/intern/Projections.h
+++ b/intern/dualcon/intern/Projections.h
@@ -30,6 +30,7 @@
#define GRID_DIMENSION 20
#if defined(_WIN32) && !defined(__MINGW32__)
+#define isnan(n) _isnan(n)
#define LONG __int64
#else
#include <stdint.h>
diff --git a/intern/dualcon/intern/dualcon_c_api.cpp b/intern/dualcon/intern/dualcon_c_api.cpp
index d710ada48bc..af5ada71146 100644
--- a/intern/dualcon/intern/dualcon_c_api.cpp
+++ b/intern/dualcon/intern/dualcon_c_api.cpp
@@ -26,6 +26,11 @@
#include "octree.h"
#include <cstdio>
+#include <float.h>
+
+#if defined(_WIN32) && !defined(__MINGW32__)
+#define isnan(n) _isnan(n)
+#endif
void veccopy(float dst[3], const float src[3])
{
@@ -113,6 +118,15 @@ public:
curface++;
}
+ /* remove triangle if it contains invalid coords */
+ for(int i = 0; i < 3; i++) {
+ const float *co = t->vt[i];
+ if(isnan(co[0]) || isnan(co[1]) || isnan(co[2])) {
+ delete t;
+ return getNextTriangle();
+ }
+ }
+
return t;
}
diff --git a/intern/elbeem/intern/solver_init.cpp b/intern/elbeem/intern/solver_init.cpp
index 7e9f5e7f420..58f45e4fbfb 100644
--- a/intern/elbeem/intern/solver_init.cpp
+++ b/intern/elbeem/intern/solver_init.cpp
@@ -1453,7 +1453,9 @@ void LbmFsgrSolver::initMovingObstacles(bool staticInit) {
//errMsg("GEOACTT"," obj "<<obj->getName()<<" a:"<<active<<","<<wasActive<<" s"<<sourceTime<<" t"<<targetTime <<" v"<<mObjectSpeeds[OId] );
// skip inactive in/out flows
if(ntype==CFInvalid){ errMsg("LbmFsgrSolver::initMovingObstacles","Invalid obj type "<<obj->getGeoInitType()); continue; }
- if((!active) && (otype&(CFMbndOutflow|CFMbndInflow)) ) continue;
+ /* DG: only inflows/outlfows could be activated/deactivated, test new code that everything can be activated
+ if((!active) && (otype&(CFMbndOutflow|CFMbndInflow)) ) continue; */
+ if((!active) /* && (otype&(CFMbndOutflow|CFMbndInflow)) */ ) continue;
// copied from recalculateObjectSpeeds
mObjectSpeeds[OId] = vec2L(mpParam->calculateLattVelocityFromRw( vec2P( (*mpGiObjects)[OId]->getInitialVelocity(mSimulationTime) )));
diff --git a/intern/opennl/CMakeLists.txt b/intern/opennl/CMakeLists.txt
index 231802b31f2..322428386b1 100644
--- a/intern/opennl/CMakeLists.txt
+++ b/intern/opennl/CMakeLists.txt
@@ -28,7 +28,7 @@ remove_strict_flags()
# remove debug flag here since this is not a blender maintained library
# and debug gives a lot of prints on UV unwrapping. developers can enable if they need to.
-remove_cc_flag("-DDEBUG")
+add_definitions(-UDEBUG)
# quiet compiler warnings about undefined defines
diff --git a/release/freedesktop/blender.desktop b/release/freedesktop/blender.desktop
index 34b2b9bb0af..1620815517e 100644
--- a/release/freedesktop/blender.desktop
+++ b/release/freedesktop/blender.desktop
@@ -2,11 +2,12 @@
Name=Blender
GenericName=3D modeller
GenericName[es]=modelador 3D
-GenericName[de]=3D Modellierer
+GenericName[de]=3D-Modellierer
GenericName[fr]=modeleur 3D
GenericName[ru]=Редактор 3D-моделей
Comment=3D modeling, animation, rendering and post-production
Comment[es]=modelado 3D, animaciĂłn, renderizado y post-producciĂłn
+Comment[de]=3D-Modellierung, Animation, Rendering und Nachbearbeitung
Exec=blender
Icon=blender
Terminal=false
diff --git a/release/scripts/presets/fluid/honey.py b/release/scripts/presets/fluid/honey.py
new file mode 100644
index 00000000000..fbeb7f2b286
--- /dev/null
+++ b/release/scripts/presets/fluid/honey.py
@@ -0,0 +1,3 @@
+import bpy
+bpy.context.fluid.settings.viscosity_base = 2.0
+bpy.context.fluid.settings.viscosity_exponent = 3
diff --git a/release/scripts/presets/fluid/oil.py b/release/scripts/presets/fluid/oil.py
new file mode 100644
index 00000000000..3d73de9303a
--- /dev/null
+++ b/release/scripts/presets/fluid/oil.py
@@ -0,0 +1,3 @@
+import bpy
+bpy.context.fluid.settings.viscosity_base = 5.0
+bpy.context.fluid.settings.viscosity_exponent = 5
diff --git a/release/scripts/presets/fluid/water.py b/release/scripts/presets/fluid/water.py
new file mode 100644
index 00000000000..0b68ad28c98
--- /dev/null
+++ b/release/scripts/presets/fluid/water.py
@@ -0,0 +1,3 @@
+import bpy
+bpy.context.fluid.settings.viscosity_base = 1.0
+bpy.context.fluid.settings.viscosity_exponent = 6
diff --git a/release/scripts/startup/bl_operators/console.py b/release/scripts/startup/bl_operators/console.py
index 8afcdf5f67e..099cb02564d 100644
--- a/release/scripts/startup/bl_operators/console.py
+++ b/release/scripts/startup/bl_operators/console.py
@@ -23,15 +23,19 @@ from bpy.types import Operator
from bpy.props import StringProperty
+def _lang_module_get(sc):
+ return __import__("console_" + sc.language)
+
+
class ConsoleExec(Operator):
- '''Execute the current console line as a python expression'''
+ """Execute the current console line as a python expression"""
bl_idname = "console.execute"
bl_label = "Console Execute"
def execute(self, context):
sc = context.space_data
- module = __import__("console_" + sc.language)
+ module = _lang_module_get(sc)
execute = getattr(module, "execute", None)
if execute:
@@ -50,7 +54,7 @@ class ConsoleAutocomplete(Operator):
def execute(self, context):
sc = context.space_data
- module = __import__("console_" + sc.language)
+ module = _lang_module_get(sc)
autocomplete = getattr(module, "autocomplete", None)
if autocomplete:
@@ -62,7 +66,7 @@ class ConsoleAutocomplete(Operator):
class ConsoleBanner(Operator):
- '''Print a message when the terminal initializes'''
+ """Print a message when the terminal initializes"""
bl_idname = "console.banner"
bl_label = "Console Banner"
@@ -73,7 +77,7 @@ class ConsoleBanner(Operator):
if not sc.language:
sc.language = 'python'
- module = __import__("console_" + sc.language)
+ module = _lang_module_get(sc)
banner = getattr(module, "banner", None)
if banner:
@@ -85,7 +89,7 @@ class ConsoleBanner(Operator):
class ConsoleLanguage(Operator):
- '''Set the current language for this console'''
+ """Set the current language for this console"""
bl_idname = "console.language"
bl_label = "Console Language"
diff --git a/release/scripts/startup/bl_operators/mesh.py b/release/scripts/startup/bl_operators/mesh.py
index 2d4c703dbf2..a54de25dbc7 100644
--- a/release/scripts/startup/bl_operators/mesh.py
+++ b/release/scripts/startup/bl_operators/mesh.py
@@ -100,7 +100,7 @@ class MeshMirrorUV(Operator):
vidxs[i] = tuple(sorted(l.vertex_index
for l in loops[lstart:lend]))
# As we have no poly.center yet...
- pcents[i] = tuple(map(lambda x : x / p.loop_total,
+ pcents[i] = tuple(map(lambda x: x / p.loop_total,
map(sum, zip(*(verts[idx].co
for idx in vidxs[i])))))
# Preparing next step finding matching polys.
diff --git a/release/scripts/startup/bl_operators/presets.py b/release/scripts/startup/bl_operators/presets.py
index da6ef7483f2..6297945f8bd 100644
--- a/release/scripts/startup/bl_operators/presets.py
+++ b/release/scripts/startup/bl_operators/presets.py
@@ -295,6 +295,24 @@ class AddPresetCloth(AddPresetBase, Operator):
preset_subdir = "cloth"
+class AddPresetFluid(AddPresetBase, Operator):
+ '''Add a Fluid Preset'''
+ bl_idname = "fluid.preset_add"
+ bl_label = "Add Fluid Preset"
+ preset_menu = "FLUID_MT_presets"
+
+ preset_defines = [
+ "fluid = bpy.context.fluid"
+ ]
+
+ preset_values = [
+ "fluid.settings.viscosity_base",
+ "fluid.settings.viscosity_exponent",
+ ]
+
+ preset_subdir = "fluid"
+
+
class AddPresetSunSky(AddPresetBase, Operator):
'''Add a Sky & Atmosphere Preset'''
bl_idname = "lamp.sunsky_preset_add"
diff --git a/release/scripts/startup/bl_operators/uvcalc_lightmap.py b/release/scripts/startup/bl_operators/uvcalc_lightmap.py
index 08f471e9022..417ae89218c 100644
--- a/release/scripts/startup/bl_operators/uvcalc_lightmap.py
+++ b/release/scripts/startup/bl_operators/uvcalc_lightmap.py
@@ -89,7 +89,7 @@ class prettyface(object):
else: # blender face
uv_layer = data.id_data.uv_loop_layers.active.data
- self.uv = [uv_layer[i].uv for i in data.loops]
+ self.uv = [uv_layer[i].uv for i in data.loop_indices]
# cos = [v.co for v in data]
cos = [data.id_data.vertices[v].co for v in data.vertices] # XXX25
@@ -245,7 +245,7 @@ def lightmap_uvpack(meshes,
print("\tWarning, less then 4 faces, skipping")
continue
- pretty_faces = [prettyface(f) for f in face_sel if len(f.vertices) == 4]
+ pretty_faces = [prettyface(f) for f in face_sel if f.loop_total == 4]
# Do we have any triangles?
if len(pretty_faces) != len(face_sel):
@@ -269,7 +269,7 @@ def lightmap_uvpack(meshes,
return f, lens, lens_order
- tri_lengths = [trylens(f) for f in face_sel if len(f.vertices) == 3]
+ tri_lengths = [trylens(f) for f in face_sel if f.loop_total == 3]
del trylens
def trilensdiff(t1, t2):
@@ -549,7 +549,16 @@ class LightMapPack(Operator):
'''Follow UVs from active quads along continuous face loops'''
bl_idname = "uv.lightmap_pack"
bl_label = "Lightmap Pack"
- bl_options = {'REGISTER', 'UNDO'}
+
+ # Disable REGISTER flag for now because this operator might create new
+ # images. This leads to non-proper operator redo because current undo
+ # stack is local for edit mode and can not remove images created by this
+ # oprtator.
+ # Proper solution would be to make undo stack aware of such things,
+ # but for now just disable redo. Keep undo here so unwanted changes to uv
+ # coords might be undone.
+ # This fixes infinite image creation reported there [#30968] (sergey)
+ bl_options = {'UNDO'}
PREF_CONTEXT = bpy.props.EnumProperty(
name="Selection",
diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py
index 78f14137ad1..926ad9b94f7 100644
--- a/release/scripts/startup/bl_operators/wm.py
+++ b/release/scripts/startup/bl_operators/wm.py
@@ -1195,7 +1195,7 @@ class WM_OT_copy_prev_settings(Operator):
class WM_OT_blenderplayer_start(Operator):
'''Launch the blender-player with the current blend-file'''
bl_idname = "wm.blenderplayer_start"
- bl_label = "Start"
+ bl_label = "Start Game In Player"
def execute(self, context):
import os
@@ -1212,6 +1212,10 @@ class WM_OT_blenderplayer_start(Operator):
if sys.platform == "darwin":
player_path = os.path.join(blender_bin_dir, "../../../blenderplayer.app/Contents/MacOS/blenderplayer")
+ if not os.path.exists(player_path):
+ self.report({'ERROR'}, "Player path: %r not found" % player_path)
+ return {'CANCELLED'}
+
filepath = os.path.join(bpy.app.tempdir, "game.blend")
bpy.ops.wm.save_as_mainfile(filepath=filepath, check_existing=False, copy=True)
subprocess.call([player_path, filepath])
diff --git a/release/scripts/startup/bl_ui/properties_game.py b/release/scripts/startup/bl_ui/properties_game.py
index cc3e8a8e57d..c3f1c42d8a8 100644
--- a/release/scripts/startup/bl_ui/properties_game.py
+++ b/release/scripts/startup/bl_ui/properties_game.py
@@ -166,7 +166,12 @@ class PHYSICS_PT_game_physics(PhysicsButtonsPanel, Panel):
subsub.active = game.use_anisotropic_friction
subsub.prop(game, "friction_coefficients", text="", slider=True)
- elif physics_type in {'SENSOR', 'INVISIBLE', 'NO_COLLISION', 'OCCLUDE'}:
+ elif physics_type == 'SENSOR':
+ col = layout.column()
+ col.prop(game, "use_actor", text="Detect Actors")
+ col.prop(ob, "hide_render", text="Invisible")
+
+ elif physics_type in {'INVISIBLE', 'NO_COLLISION', 'OCCLUDE'}:
layout.prop(ob, "hide_render", text="Invisible")
elif physics_type == 'NAVMESH':
diff --git a/release/scripts/startup/bl_ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py
index 74abc8fe559..9200c688394 100644
--- a/release/scripts/startup/bl_ui/properties_particle.py
+++ b/release/scripts/startup/bl_ui/properties_particle.py
@@ -1185,7 +1185,7 @@ class PARTICLE_PT_vertexgroups(ParticleButtonsPanel, Panel):
psys = context.particle_system
split = layout.split(percentage=0.85)
-
+
col = split.column()
col.label(text="Vertex Group:")
col.prop_search(psys, "vertex_group_density", ob, "vertex_groups", text="Density")
@@ -1195,7 +1195,7 @@ class PARTICLE_PT_vertexgroups(ParticleButtonsPanel, Panel):
col.prop_search(psys, "vertex_group_roughness_1", ob, "vertex_groups", text="Roughness 1")
col.prop_search(psys, "vertex_group_roughness_2", ob, "vertex_groups", text="Roughness 2")
col.prop_search(psys, "vertex_group_roughness_end", ob, "vertex_groups", text="Roughness End")
-
+
col = split.column()
col.label(text="Negate:")
col.alignment = 'RIGHT'
@@ -1206,7 +1206,7 @@ class PARTICLE_PT_vertexgroups(ParticleButtonsPanel, Panel):
col.prop(psys, "invert_vertex_group_roughness_1", text="")
col.prop(psys, "invert_vertex_group_roughness_2", text="")
col.prop(psys, "invert_vertex_group_roughness_end", text="")
-
+
# Commented out vertex groups don't work and are still waiting for better implementation
# row = layout.row()
# row.prop_search(psys, "vertex_group_velocity", ob, "vertex_groups", text="Velocity")
diff --git a/release/scripts/startup/bl_ui/properties_physics_cloth.py b/release/scripts/startup/bl_ui/properties_physics_cloth.py
index 14c7b381ee7..e313112d61a 100644
--- a/release/scripts/startup/bl_ui/properties_physics_cloth.py
+++ b/release/scripts/startup/bl_ui/properties_physics_cloth.py
@@ -31,9 +31,6 @@ def cloth_panel_enabled(md):
class CLOTH_MT_presets(Menu):
- '''
- Creates the menu items by scanning scripts/templates
- '''
bl_label = "Cloth Presets"
preset_subdir = "cloth"
preset_operator = "script.execute_preset"
diff --git a/release/scripts/startup/bl_ui/properties_physics_fluid.py b/release/scripts/startup/bl_ui/properties_physics_fluid.py
index d334671292a..cec4bf125ee 100644
--- a/release/scripts/startup/bl_ui/properties_physics_fluid.py
+++ b/release/scripts/startup/bl_ui/properties_physics_fluid.py
@@ -18,7 +18,14 @@
# <pep8 compliant>
import bpy
-from bpy.types import Panel
+from bpy.types import Panel, Menu
+
+
+class FLUID_MT_presets(Menu):
+ bl_label = "Fluid Presets"
+ preset_subdir = "fluid"
+ preset_operator = "script.execute_preset"
+ draw = Menu.draw_preset
class PhysicButtonsPanel():
@@ -222,16 +229,14 @@ class PHYSICS_PT_domain_gravity(PhysicButtonsPanel, Panel):
col = split.column()
col.label(text="Viscosity Presets:")
- sub = col.column(align=True)
- sub.prop(fluid, "viscosity_preset", text="")
-
- if fluid.viscosity_preset == 'MANUAL':
- sub.prop(fluid, "viscosity_base", text="Base")
- sub.prop(fluid, "viscosity_exponent", text="Exponent", slider=True)
- else:
- # just for padding to prevent jumping around
- sub.separator()
- sub.separator()
+ sub = col.row(align=True)
+ sub.menu("FLUID_MT_presets", text=bpy.types.FLUID_MT_presets.bl_label)
+ sub.operator("fluid.preset_add", text="", icon='ZOOMIN')
+ sub.operator("fluid.preset_add", text="", icon='ZOOMOUT').remove_active = True
+
+ subsub = col.column(align=True)
+ subsub.prop(fluid, "viscosity_base", text="Base")
+ subsub.prop(fluid, "viscosity_exponent", text="Exponent", slider=True)
col.label(text="Optimization:")
col.prop(fluid, "grid_levels", slider=True)
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index 343b559ef55..945a6cf493d 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -1680,7 +1680,7 @@ class VIEW3D_MT_edit_mesh_vertices(Menu):
layout.operator("mesh.merge")
layout.operator("mesh.rip_move")
layout.operator("mesh.split")
- layout.operator("mesh.separate")
+ layout.operator_menu_enum("mesh.separate", "type")
layout.operator("mesh.vert_connect")
layout.operator("mesh.vert_slide")
diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index 52658411fb0..c494590d005 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -142,6 +142,14 @@ class VIEW3D_PT_tools_meshedit(View3DPanel, Panel):
col.operator("mesh.spin")
col.operator("mesh.screw")
+ row = col.row(align=True)
+ props = row.operator("mesh.knife_tool", text="Knife")
+ props.use_occlude_geometry = True
+ props.only_select = False
+ props = row.operator("mesh.knife_tool", text="Select")
+ props.use_occlude_geometry = False
+ props.only_select = True
+
col = layout.column(align=True)
col.label(text="Remove:")
col.menu("VIEW3D_MT_edit_mesh_delete")
diff --git a/release/scripts/templates/operator_export.py b/release/scripts/templates/operator_file_export.py
index 3a7040ae2d2..e3e0217e26a 100644
--- a/release/scripts/templates/operator_export.py
+++ b/release/scripts/templates/operator_file_export.py
@@ -3,7 +3,7 @@ import bpy
def write_some_data(context, filepath, use_some_setting):
print("running write_some_data...")
- f = open(filepath, 'w')
+ f = open(filepath, 'w', encoding='utf-8')
f.write("Hello World %s" % use_some_setting)
f.close()
@@ -14,11 +14,12 @@ def write_some_data(context, filepath, use_some_setting):
# invoke() function which calls the file selector.
from bpy_extras.io_utils import ExportHelper
from bpy.props import StringProperty, BoolProperty, EnumProperty
+from bpy.types import Operator
-class ExportSomeData(bpy.types.Operator, ExportHelper):
- '''This appears in the tooltip of the operator and in the generated docs.'''
- bl_idname = "export.some_data" # this is important since its how bpy.ops.export.some_data is constructed
+class ExportSomeData(Operator, ExportHelper):
+ '''This appears in the tooltip of the operator and in the generated docs'''
+ bl_idname = "export_test.some_data" # important since its how bpy.ops.import_test.some_data is constructed
bl_label = "Export Some Data"
# ExportHelper mixin class uses this
@@ -45,10 +46,6 @@ class ExportSomeData(bpy.types.Operator, ExportHelper):
default='OPT_A',
)
- @classmethod
- def poll(cls, context):
- return context.active_object is not None
-
def execute(self, context):
return write_some_data(context, self.filepath, self.use_setting)
@@ -72,4 +69,4 @@ if __name__ == "__main__":
register()
# test call
- bpy.ops.export.some_data('INVOKE_DEFAULT')
+ bpy.ops.export_test.some_data('INVOKE_DEFAULT')
diff --git a/release/scripts/templates/operator_file_import.py b/release/scripts/templates/operator_file_import.py
new file mode 100644
index 00000000000..80d850aae60
--- /dev/null
+++ b/release/scripts/templates/operator_file_import.py
@@ -0,0 +1,75 @@
+import bpy
+
+
+def read_some_data(context, filepath, use_some_setting):
+ print("running read_some_data...")
+ f = open(filepath, 'r', encoding='utf-8')
+ data = f.read()
+ f.close()
+
+ # would normally load the data here
+ print(data)
+
+ return {'FINISHED'}
+
+
+# ImportHelper is a helper class, defines filename and
+# invoke() function which calls the file selector.
+from bpy_extras.io_utils import ImportHelper
+from bpy.props import StringProperty, BoolProperty, EnumProperty
+from bpy.types import Operator
+
+
+class ImportSomeData(Operator, ImportHelper):
+ '''This appears in the tooltip of the operator and in the generated docs'''
+ bl_idname = "import_test.some_data" # important since its how bpy.ops.import_test.some_data is constructed
+ bl_label = "Import Some Data"
+
+ # ImportHelper mixin class uses this
+ filename_ext = ".txt"
+
+ filter_glob = StringProperty(
+ default="*.txt",
+ options={'HIDDEN'},
+ )
+
+ # List of operator properties, the attributes will be assigned
+ # to the class instance from the operator settings before calling.
+ use_setting = BoolProperty(
+ name="Example Boolean",
+ description="Example Tooltip",
+ default=True,
+ )
+
+ type = EnumProperty(
+ name="Example Enum",
+ description="Choose between two items",
+ items=(('OPT_A', "First Option", "Description one"),
+ ('OPT_B', "Second Option", "Description two")),
+ default='OPT_A',
+ )
+
+ def execute(self, context):
+ return read_some_data(context, self.filepath, self.use_setting)
+
+
+# Only needed if you want to add into a dynamic menu
+def menu_func_import(self, context):
+ self.layout.operator(ImportSomeData.bl_idname, text="Text Import Operator")
+
+
+def register():
+ bpy.utils.register_class(ImportSomeData)
+ bpy.types.INFO_MT_file_import.append(menu_func_import)
+
+
+def unregister():
+ bpy.utils.unregister_class(ImportSomeData)
+ bpy.types.INFO_MT_file_import.remove(menu_func_import)
+
+
+if __name__ == "__main__":
+ register()
+
+ # test call
+ bpy.ops.import_test.some_data('INVOKE_DEFAULT')
diff --git a/source/blender/avi/intern/avi.c b/source/blender/avi/intern/avi.c
index 0658317a0bd..59ce879520e 100644
--- a/source/blender/avi/intern/avi.c
+++ b/source/blender/avi/intern/avi.c
@@ -43,7 +43,9 @@
#include "MEM_guardedalloc.h"
#include "MEM_sys_types.h"
-#include "BLI_winstuff.h"
+#ifdef WIN32
+# include "BLI_winstuff.h"
+#endif
#include "AVI_avi.h"
#include "avi_intern.h"
diff --git a/source/blender/avi/intern/options.c b/source/blender/avi/intern/options.c
index 483b708bee6..a2fd756ddaa 100644
--- a/source/blender/avi/intern/options.c
+++ b/source/blender/avi/intern/options.c
@@ -34,12 +34,13 @@
* \ingroup avi
*/
-
#include "AVI_avi.h"
#include "avi_intern.h"
#include "endian.h"
-#include "BLI_winstuff.h"
+#ifdef WIN32
+# include "BLI_winstuff.h"
+#endif
/* avi_set_compress_options gets its own file... now don't WE feel important? */
diff --git a/source/blender/blenfont/BLF_translation.h b/source/blender/blenfont/BLF_translation.h
index 5e2fee36af0..2c786f87521 100644
--- a/source/blender/blenfont/BLF_translation.h
+++ b/source/blender/blenfont/BLF_translation.h
@@ -67,6 +67,7 @@ const char *BLF_translate_do_tooltip(const char *contex, const char *msgid);
/* The "translation-marker" macro. */
#define N_(msgid) msgid
+#define CTX_N_(context, msgid) msgid
/* Those macros should be used everywhere in UI code. */
#ifdef WITH_INTERNATIONAL
/* #define _(msgid) BLF_gettext(msgid) */
@@ -82,4 +83,18 @@ const char *BLF_translate_do_tooltip(const char *contex, const char *msgid);
#define CTX_TIP_(context, msgid) msgid
#endif
+/******************************************************************************
+ * All i18n contexts must be defined here.
+ * This is a nice way to be sure not to use a context twice for different
+ * things, and limit the number of existing contexts!
+ */
+
+/* Default, void context. Just in case... */
+#define BLF_I18NCONTEXT_DEFAULT ""
+
+/* Default context for operator names/labels. */
+#define BLF_I18NCONTEXT_OPERATOR_DEFAULT "Operator"
+
+
+
#endif /* __BLF_TRANSLATION_H__ */
diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c
index 84cefc923a0..7a4e1d4b781 100644
--- a/source/blender/blenfont/intern/blf_font.c
+++ b/source/blender/blenfont/intern/blf_font.c
@@ -279,8 +279,8 @@ void blf_font_buffer(FontBLF *font, const char *str)
if (font->b_fbuf) {
int yb = yb_start;
- for (y = (chy >= 0 ? 0:-chy); y < height_clip; y++) {
- for (x = (chx >= 0 ? 0:-chx); x < width_clip; x++) {
+ for (y = ((chy >= 0) ? 0 : -chy); y < height_clip; y++) {
+ for (x = ((chx >= 0) ? 0 : -chx); x < width_clip; x++) {
a = *(g->bitmap + x + (yb * g->pitch)) / 255.0f;
if (a > 0.0f) {
diff --git a/source/blender/blenkernel/BKE_blender.h b/source/blender/blenkernel/BKE_blender.h
index ffabbcf32f0..e0fac79359d 100644
--- a/source/blender/blenkernel/BKE_blender.h
+++ b/source/blender/blenkernel/BKE_blender.h
@@ -42,7 +42,7 @@ extern "C" {
* and keep comment above the defines.
* Use STRINGIFY() rather than defining with quotes */
#define BLENDER_VERSION 262
-#define BLENDER_SUBVERSION 3
+#define BLENDER_SUBVERSION 4
#define BLENDER_MINVERSION 250
#define BLENDER_MINSUBVERSION 0
@@ -51,7 +51,7 @@ extern "C" {
/* can be left blank, otherwise a,b,c... etc with no quotes */
#define BLENDER_VERSION_CHAR
/* alpha/beta/rc/release, docs use this */
-#define BLENDER_VERSION_CYCLE beta
+#define BLENDER_VERSION_CYCLE rc
extern char versionstr[]; /* from blender.c */
diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h
index 944cce675cc..b2bd840a09a 100644
--- a/source/blender/blenkernel/BKE_context.h
+++ b/source/blender/blenkernel/BKE_context.h
@@ -212,8 +212,11 @@ void CTX_data_list_add(bContextDataResult *result, void *data);
ListBase ctx_data_list; \
CollectionPointerLink *ctx_link; \
CTX_data_##member(C, &ctx_data_list); \
- for(ctx_link=ctx_data_list.first; ctx_link; ctx_link=ctx_link->next) {\
- Type instance= ctx_link->ptr.data;
+ for (ctx_link = ctx_data_list.first; \
+ ctx_link; \
+ ctx_link = ctx_link->next) \
+ { \
+ Type instance = ctx_link->ptr.data;
#define CTX_DATA_END \
} \
diff --git a/source/blender/blenkernel/BKE_multires.h b/source/blender/blenkernel/BKE_multires.h
index 69482706da6..bc34b0131bf 100644
--- a/source/blender/blenkernel/BKE_multires.h
+++ b/source/blender/blenkernel/BKE_multires.h
@@ -99,7 +99,7 @@ void multiresModifier_prepare_join(struct Scene *scene, struct Object *ob, struc
int multires_mdisp_corners(struct MDisps *s);
/* update multires data after topology changing */
-void multires_topology_changed(struct Scene *scene, struct Object *ob);
+void multires_topology_changed(struct Mesh *me);
/**** interpolation stuff ****/
void old_mdisps_bilinear(float out[3], float (*disps)[3], const int st, float u, float v);
diff --git a/source/blender/blenkernel/BKE_sequencer.h b/source/blender/blenkernel/BKE_sequencer.h
index 7a84e71c763..598d1b681bc 100644
--- a/source/blender/blenkernel/BKE_sequencer.h
+++ b/source/blender/blenkernel/BKE_sequencer.h
@@ -69,14 +69,14 @@ void seq_array(struct Editing *ed, struct Sequence ***seqarray, int *tot, int us
#define SEQP_BEGIN(ed, _seq) \
{ \
SeqIterator iter; \
- for(seq_begin(ed, &iter, 1); iter.valid; seq_next(&iter)) { \
- _seq= iter.seq;
+ for (seq_begin(ed, &iter, 1); iter.valid; seq_next(&iter)) { \
+ _seq = iter.seq;
#define SEQ_BEGIN(ed, _seq) \
{ \
SeqIterator iter; \
- for(seq_begin(ed, &iter, 0); iter.valid; seq_next(&iter)) { \
- _seq= iter.seq;
+ for (seq_begin(ed, &iter, 0); iter.valid; seq_next(&iter)) { \
+ _seq = iter.seq;
#define SEQ_END \
} \
@@ -138,12 +138,10 @@ struct SeqEffectHandle {
int (*early_out)(struct Sequence *seq, float facf0, float facf1);
/* stores the y-range of the effect IPO */
- void (*store_icu_yrange)(struct Sequence * seq,
- short adrcode, float *ymin, float *ymax);
+ void (*store_icu_yrange)(struct Sequence * seq, short adrcode, float *ymin, float *ymax);
/* stores the default facf0 and facf1 if no IPO is present */
- void (*get_default_fac)(struct Sequence *seq, float cfra,
- float * facf0, float * facf1);
+ void (*get_default_fac)(struct Sequence *seq, float cfra, float * facf0, float * facf1);
/* execute the effect
* sequence effects are only required to either support
diff --git a/source/blender/blenkernel/SConscript b/source/blender/blenkernel/SConscript
index 3e4e0cc5646..e5ce210d862 100644
--- a/source/blender/blenkernel/SConscript
+++ b/source/blender/blenkernel/SConscript
@@ -23,8 +23,11 @@ incs += ' ' + env['BF_ZLIB_INC']
defs = [ 'GLEW_STATIC' ]
-defs.append('WITH_SMOKE') # TODO, make optional
-defs.append('WITH_FRAMESERVER') # TODO, make optional
+if env['WITH_BF_SMOKE']:
+ defs.append('WITH_SMOKE')
+
+if env['WITH_BF_FRAMESERVER']:
+ defs.append('WITH_FRAMESERVER')
if env['WITH_BF_PYTHON']:
incs += ' ../python'
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index e6fb506620c..94aed7c7a01 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -1753,18 +1753,6 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
add_orco_dm(ob, NULL, *deform_r, NULL, CD_ORCO);
}
-#ifdef WITH_GAMEENGINE
- /* NavMesh - this is a hack but saves having a NavMesh modifier */
- if ((ob->gameflag & OB_NAVMESH) && (finaldm->type == DM_TYPE_CDDM)) {
- DerivedMesh *tdm;
- tdm= navmesh_dm_createNavMeshForVisualization(finaldm);
- if (finaldm != tdm) {
- finaldm->release(finaldm);
- finaldm= tdm;
- }
- }
-#endif /* WITH_GAMEENGINE */
-
{
/* calculating normals can re-calculate tessfaces in some cases */
#if 0
@@ -1820,6 +1808,18 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
}
}
+#ifdef WITH_GAMEENGINE
+ /* NavMesh - this is a hack but saves having a NavMesh modifier */
+ if ((ob->gameflag & OB_NAVMESH) && (finaldm->type == DM_TYPE_CDDM)) {
+ DerivedMesh *tdm;
+ tdm= navmesh_dm_createNavMeshForVisualization(finaldm);
+ if (finaldm != tdm) {
+ finaldm->release(finaldm);
+ finaldm= tdm;
+ }
+ }
+#endif /* WITH_GAMEENGINE */
+
*final_r = finaldm;
if (orcodm)
@@ -2757,7 +2757,7 @@ void DM_vertex_attributes_from_gpu(DerivedMesh *dm, GPUVertexAttribs *gattribs,
fdata = tfdata = dm->getTessFaceDataLayout(dm);
/* calc auto bump scale if necessary */
- if (dm->auto_bump_scale<=0.0f)
+ if (dm->auto_bump_scale <= 0.0f)
DM_calc_auto_bump_scale(dm);
/* add a tangent layer if necessary */
@@ -2769,58 +2769,76 @@ void DM_vertex_attributes_from_gpu(DerivedMesh *dm, GPUVertexAttribs *gattribs,
for (b = 0; b < gattribs->totlayer; b++) {
if (gattribs->layer[b].type == CD_MTFACE) {
/* uv coordinates */
- if (gattribs->layer[b].name[0])
- layer = CustomData_get_named_layer_index(tfdata, CD_MTFACE,
- gattribs->layer[b].name);
- else
- layer = CustomData_get_active_layer_index(tfdata, CD_MTFACE);
+ if(dm->type == DM_TYPE_EDITBMESH) {
+ /* exception .. */
+ CustomData *ldata = dm->getLoopDataLayout(dm);
- if (layer != -1) {
- a = attribs->tottface++;
+ if (gattribs->layer[b].name[0])
+ layer = CustomData_get_named_layer_index(ldata, CD_MLOOPUV,
+ gattribs->layer[b].name);
+ else
+ layer = CustomData_get_active_layer_index(ldata, CD_MLOOPUV);
+
+ if (layer != -1) {
+ a = attribs->tottface++;
- attribs->tface[a].array = tfdata->layers[layer].data;
- attribs->tface[a].emOffset = tfdata->layers[layer].offset;
- attribs->tface[a].glIndex = gattribs->layer[b].glindex;
- attribs->tface[a].glTexco = gattribs->layer[b].gltexco;
+ attribs->tface[a].array = tfdata->layers[layer].data;
+ attribs->tface[a].emOffset = tfdata->layers[layer].offset;
+ attribs->tface[a].glIndex = gattribs->layer[b].glindex;
+ attribs->tface[a].glTexco = gattribs->layer[b].gltexco;
+ }
}
- /* BMESH_TODO - BMESH ONLY, may need to get this working?, otherwise remove */
-#if 0
else {
- int player;
- CustomData *pdata = dm->getPolyDataLayout(dm);
-
if (gattribs->layer[b].name[0])
- player = CustomData_get_named_layer_index(pdata, CD_MTEXPOLY,
+ layer = CustomData_get_named_layer_index(tfdata, CD_MTFACE,
gattribs->layer[b].name);
else
- player = CustomData_get_active_layer_index(pdata, CD_MTEXPOLY);
-
- if (player != -1) {
+ layer = CustomData_get_active_layer_index(tfdata, CD_MTFACE);
+
+ if (layer != -1) {
a = attribs->tottface++;
-
- attribs->tface[a].array = NULL;
- attribs->tface[a].emOffset = pdata->layers[layer].offset;
+
+ attribs->tface[a].array = tfdata->layers[layer].data;
+ attribs->tface[a].emOffset = tfdata->layers[layer].offset;
attribs->tface[a].glIndex = gattribs->layer[b].glindex;
attribs->tface[a].glTexco = gattribs->layer[b].gltexco;
-
}
}
-#endif
}
else if (gattribs->layer[b].type == CD_MCOL) {
- /* vertex colors */
- if (gattribs->layer[b].name[0])
- layer = CustomData_get_named_layer_index(tfdata, CD_MCOL,
- gattribs->layer[b].name);
- else
- layer = CustomData_get_active_layer_index(tfdata, CD_MCOL);
+ if(dm->type == DM_TYPE_EDITBMESH) {
+ /* exception .. */
+ CustomData *ldata = dm->getLoopDataLayout(dm);
- if (layer != -1) {
- a = attribs->totmcol++;
+ if (gattribs->layer[b].name[0])
+ layer = CustomData_get_named_layer_index(ldata, CD_MLOOPCOL,
+ gattribs->layer[b].name);
+ else
+ layer = CustomData_get_active_layer_index(ldata, CD_MLOOPCOL);
+
+ if (layer != -1) {
+ a = attribs->totmcol++;
- attribs->mcol[a].array = tfdata->layers[layer].data;
- attribs->mcol[a].emOffset = tfdata->layers[layer].offset;
- attribs->mcol[a].glIndex = gattribs->layer[b].glindex;
+ attribs->mcol[a].array = tfdata->layers[layer].data;
+ attribs->mcol[a].emOffset = tfdata->layers[layer].offset;
+ attribs->mcol[a].glIndex = gattribs->layer[b].glindex;
+ }
+ }
+ else {
+ /* vertex colors */
+ if (gattribs->layer[b].name[0])
+ layer = CustomData_get_named_layer_index(tfdata, CD_MCOL,
+ gattribs->layer[b].name);
+ else
+ layer = CustomData_get_active_layer_index(tfdata, CD_MCOL);
+
+ if (layer != -1) {
+ a = attribs->totmcol++;
+
+ attribs->mcol[a].array = tfdata->layers[layer].data;
+ attribs->mcol[a].emOffset = tfdata->layers[layer].offset;
+ attribs->mcol[a].glIndex = gattribs->layer[b].glindex;
+ }
}
}
else if (gattribs->layer[b].type == CD_TANGENT) {
@@ -2898,7 +2916,7 @@ static void navmesh_drawColored(DerivedMesh *dm)
int a, glmode;
MVert *mvert = (MVert *)CustomData_get_layer(&dm->vertData, CD_MVERT);
MFace *mface = (MFace *)CustomData_get_layer(&dm->faceData, CD_MFACE);
- int *polygonIdx = (int *)CustomData_get_layer(&dm->faceData, CD_RECAST);
+ int *polygonIdx = (int *)CustomData_get_layer(&dm->polyData, CD_RECAST);
float col[3];
if (!polygonIdx)
@@ -2980,14 +2998,14 @@ static DerivedMesh *navmesh_dm_createNavMeshForVisualization(DerivedMesh *dm)
int res;
result = CDDM_copy(dm);
- if (!CustomData_has_layer(&result->faceData, CD_RECAST)) {
- int *sourceRecastData = (int*)CustomData_get_layer(&dm->faceData, CD_RECAST);
+ if (!CustomData_has_layer(&result->polyData, CD_RECAST)) {
+ int *sourceRecastData = (int*)CustomData_get_layer(&dm->polyData, CD_RECAST);
if (sourceRecastData) {
- CustomData_add_layer_named(&result->faceData, CD_RECAST, CD_DUPLICATE,
+ CustomData_add_layer_named(&result->polyData, CD_RECAST, CD_DUPLICATE,
sourceRecastData, maxFaces, "recastData");
}
}
- recastData = (int*)CustomData_get_layer(&result->faceData, CD_RECAST);
+ recastData = (int*)CustomData_get_layer(&result->polyData, CD_RECAST);
/* note: This is not good design! - really should not be doing this */
result->drawFacesTex = navmesh_DM_drawFacesTex;
diff --git a/source/blender/blenkernel/intern/anim.c b/source/blender/blenkernel/intern/anim.c
index 55b3a3f3e42..b547fedebb5 100644
--- a/source/blender/blenkernel/intern/anim.c
+++ b/source/blender/blenkernel/intern/anim.c
@@ -1407,17 +1407,16 @@ static void new_particle_duplilist(ListBase *lb, ID *id, Scene *scene, Object *p
if (part->ren_as==PART_DRAW_GR && psys->part->draw & PART_DRAW_WHOLE_GR) {
for (go= part->dup_group->gobject.first, b=0; go; go= go->next, b++) {
+ copy_m4_m4(tmat, oblist[b]->obmat);
+ /* apply particle scale */
+ mul_mat3_m4_fl(tmat, size*scale);
+ mul_v3_fl(tmat[3], size*scale);
/* group dupli offset, should apply after everything else */
- if (!is_zero_v3(part->dup_group->dupli_ofs)) {
- copy_m4_m4(tmat, oblist[b]->obmat);
+ if (!is_zero_v3(part->dup_group->dupli_ofs))
sub_v3_v3v3(tmat[3], tmat[3], part->dup_group->dupli_ofs);
- mult_m4_m4m4(tmat, pamat, tmat);
- }
- else {
- mult_m4_m4m4(tmat, pamat, oblist[b]->obmat);
- }
+ /* individual particle transform */
+ mult_m4_m4m4(tmat, pamat, tmat);
- mul_mat3_m4_fl(tmat, size*scale);
if (par_space_mat)
mult_m4_m4m4(mat, par_space_mat, tmat);
else
diff --git a/source/blender/blenkernel/intern/bvhutils.c b/source/blender/blenkernel/intern/bvhutils.c
index d7c7a9a569b..009b7ca7f99 100644
--- a/source/blender/blenkernel/intern/bvhutils.c
+++ b/source/blender/blenkernel/intern/bvhutils.c
@@ -572,7 +572,7 @@ BVHTree* bvhtree_from_mesh_faces(BVHTreeFromMesh *data, DerivedMesh *mesh, float
insert = 0;
}
else {
- BM_ITER(v, &iter, em->bm, BM_VERTS_OF_FACE, f) {
+ BM_ITER_ELEM (v, &iter, f, BM_VERTS_OF_FACE) {
if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
/* Don't insert triangles tessellated from faces that have
* any selected verts.*/
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 7a39cf1b916..2d764142d26 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -1929,7 +1929,7 @@ DerivedMesh *CDDM_from_BMEditMesh(BMEditMesh *em, Mesh *UNUSED(me), int use_mdis
mp->loopstart = j;
mp->mat_nr = efa->mat_nr;
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
mloop->v = BM_elem_index_get(l->v);
mloop->e = BM_elem_index_get(l->e);
CustomData_from_bmesh_block(&bm->ldata, &dm->loopData, l->head.data, j);
@@ -1989,13 +1989,6 @@ static DerivedMesh *cddm_copy_ex(DerivedMesh *source, int faces_from_tessfaces)
cddm->mloop = CustomData_get_layer(&dm->loopData, CD_MLOOP);
cddm->mpoly = CustomData_get_layer(&dm->polyData, CD_MPOLY);
- /* any callers that need tessface data can calculate it - campbell */
-#if 0
- /* BMESH_TODO: Find out why this is necessary (or else find a way to remove
- * it). If it is necessary, add a comment explaining why. */
- CDDM_recalc_tessellation((DerivedMesh *)cddm);
-#endif
-
return dm;
}
diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c
index f0bda57466d..536d4d9c823 100644
--- a/source/blender/blenkernel/intern/customdata.c
+++ b/source/blender/blenkernel/intern/customdata.c
@@ -1099,7 +1099,7 @@ const CustomDataMask CD_MASK_DERIVEDMESH =
CD_MASK_ORIGINDEX | CD_MASK_POLYINDEX;
const CustomDataMask CD_MASK_BMESH = CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY |
CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_PROP_FLT | CD_MASK_PROP_INT |
- CD_MASK_PROP_STR | CD_MASK_SHAPEKEY | CD_MASK_SHAPE_KEYINDEX | CD_MASK_MDISPS | CD_MASK_CREASE | CD_MASK_BWEIGHT;
+ CD_MASK_PROP_STR | CD_MASK_SHAPEKEY | CD_MASK_SHAPE_KEYINDEX | CD_MASK_MDISPS | CD_MASK_CREASE | CD_MASK_BWEIGHT | CD_MASK_RECAST;
const CustomDataMask CD_MASK_FACECORNERS =
CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_MTEXPOLY | CD_MASK_MLOOPUV |
CD_MASK_MLOOPCOL;
@@ -2191,7 +2191,7 @@ void CustomData_bmesh_merge(CustomData *source, CustomData *dest,
if (t != BM_LOOPS_OF_FACE) {
/*ensure all current elements follow new customdata layout*/
- BM_ITER(h, &iter, bm, t, NULL) {
+ BM_ITER_MESH (h, &iter, bm, t) {
tmp = NULL;
CustomData_bmesh_copy_data(&destold, dest, h->data, &tmp);
CustomData_bmesh_free_block(&destold, &h->data);
@@ -2204,8 +2204,8 @@ void CustomData_bmesh_merge(CustomData *source, CustomData *dest,
BMIter liter;
/*ensure all current elements follow new customdata layout*/
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
tmp = NULL;
CustomData_bmesh_copy_data(&destold, dest, l->head.data, &tmp);
CustomData_bmesh_free_block(&destold, &l->head.data);
diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c
index 39fa5d2f7e7..366e808d32c 100644
--- a/source/blender/blenkernel/intern/depsgraph.c
+++ b/source/blender/blenkernel/intern/depsgraph.c
@@ -34,7 +34,10 @@
#include "MEM_guardedalloc.h"
-#include "BLI_winstuff.h"
+#ifdef WIN32
+# include "BLI_winstuff.h"
+#endif
+
#include "BLI_utildefines.h"
#include "BLI_listbase.h"
#include "BLI_ghash.h"
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index c54461a5a13..01d5d6ef2ad 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -416,6 +416,7 @@ static void curve_to_displist(Curve *cu, ListBase *nubase, ListBase *dispbase, i
void filldisplist(ListBase *dispbase, ListBase *to, int flipnormal)
{
+ ScanFillContext sf_ctx;
ScanFillVert *eve, *v1, *vlast;
ScanFillFace *efa;
DispList *dlnew=NULL, *dl;
@@ -431,7 +432,7 @@ void filldisplist(ListBase *dispbase, ListBase *to, int flipnormal)
totvert= 0;
nextcol= 0;
- BLI_begin_edgefill();
+ BLI_begin_edgefill(&sf_ctx);
dl= dispbase->first;
while (dl) {
@@ -448,18 +449,18 @@ void filldisplist(ListBase *dispbase, ListBase *to, int flipnormal)
while (a--) {
vlast= eve;
- eve= BLI_addfillvert(f1);
+ eve = BLI_addfillvert(&sf_ctx, f1);
totvert++;
if (vlast==NULL) v1= eve;
else {
- BLI_addfilledge(vlast, eve);
+ BLI_addfilledge(&sf_ctx, vlast, eve);
}
f1+=3;
}
if (eve!=NULL && v1!=NULL) {
- BLI_addfilledge(eve, v1);
+ BLI_addfilledge(&sf_ctx, eve, v1);
}
}
else if (colnr<dl->col) {
@@ -472,7 +473,7 @@ void filldisplist(ListBase *dispbase, ListBase *to, int flipnormal)
dl= dl->next;
}
- if (totvert && (tot= BLI_edgefill(0))) { // XXX (obedit && obedit->actcol)?(obedit->actcol-1):0)) {
+ if (totvert && (tot= BLI_edgefill(&sf_ctx, FALSE))) { // XXX (obedit && obedit->actcol)?(obedit->actcol-1):0)) {
if (tot) {
dlnew= MEM_callocN(sizeof(DispList), "filldisplist");
dlnew->type= DL_INDEX3;
@@ -486,7 +487,7 @@ void filldisplist(ListBase *dispbase, ListBase *to, int flipnormal)
/* vert data */
f1= dlnew->verts;
totvert= 0;
- eve= fillvertbase.first;
+ eve= sf_ctx.fillvertbase.first;
while (eve) {
copy_v3_v3(f1, eve->co);
f1+= 3;
@@ -499,7 +500,7 @@ void filldisplist(ListBase *dispbase, ListBase *to, int flipnormal)
}
/* index data */
- efa= fillfacebase.first;
+ efa = sf_ctx.fillfacebase.first;
index= dlnew->index;
while (efa) {
index[0]= (intptr_t)efa->v1->tmp.l;
@@ -517,7 +518,7 @@ void filldisplist(ListBase *dispbase, ListBase *to, int flipnormal)
BLI_addhead(to, dlnew);
}
- BLI_end_edgefill();
+ BLI_end_edgefill(&sf_ctx);
if (nextcol) {
/* stay at current char but fill polys with next material */
diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c
index abc74983d2b..b6aebcddd4c 100644
--- a/source/blender/blenkernel/intern/editderivedmesh.c
+++ b/source/blender/blenkernel/intern/editderivedmesh.c
@@ -120,6 +120,8 @@ static void BMEdit_RecalcTessellation_intern(BMEditMesh *tm)
BMLoop *l;
int i = 0, j;
+ ScanFillContext sf_ctx;
+
#if 0
/* note, we could be clever and re-use this array but would need to ensure
* its realloced at some point, for now just free it */
@@ -195,18 +197,18 @@ static void BMEdit_RecalcTessellation_intern(BMEditMesh *tm)
ScanFillFace *efa;
int totfilltri;
- BLI_begin_edgefill();
+ BLI_begin_edgefill(&sf_ctx);
/*scanfill time*/
l = BM_iter_new(&liter, bm, BM_LOOPS_OF_FACE, f);
for (j=0; l; l=BM_iter_step(&liter), j++) {
/*mark order*/
BM_elem_index_set(l, j); /* set_loop */
- v = BLI_addfillvert(l->v->co);
+ v = BLI_addfillvert(&sf_ctx, l->v->co);
v->tmp.p = l;
if (lastv) {
- /* e = */ BLI_addfilledge(lastv, v);
+ /* e = */ BLI_addfilledge(&sf_ctx, lastv, v);
}
lastv = v;
@@ -214,12 +216,12 @@ static void BMEdit_RecalcTessellation_intern(BMEditMesh *tm)
}
/*complete the loop*/
- BLI_addfilledge(firstv, v);
+ BLI_addfilledge(&sf_ctx, firstv, v);
- totfilltri = BLI_edgefill(2);
+ totfilltri = BLI_edgefill_ex(&sf_ctx, FALSE, f->no);
BLI_array_growitems(looptris, totfilltri);
- for (efa = fillfacebase.first; efa; efa=efa->next) {
+ for (efa = sf_ctx.fillfacebase.first; efa; efa=efa->next) {
BMLoop *l1= efa->v1->tmp.p;
BMLoop *l2= efa->v2->tmp.p;
BMLoop *l3= efa->v3->tmp.p;
@@ -234,7 +236,7 @@ static void BMEdit_RecalcTessellation_intern(BMEditMesh *tm)
i += 1;
}
- BLI_end_edgefill();
+ BLI_end_edgefill(&sf_ctx);
}
}
@@ -491,7 +493,7 @@ static void emDM_drawUVEdges(DerivedMesh *dm)
BMIter iter;
glBegin(GL_LINES);
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
BMIter liter;
BMLoop *l;
MLoopUV *lastluv = NULL, *firstluv = NULL;
@@ -499,7 +501,7 @@ static void emDM_drawUVEdges(DerivedMesh *dm)
if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
MLoopUV *luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (luv) {
@@ -1318,6 +1320,8 @@ static void emDM_getVert(DerivedMesh *dm, int index, MVert *vert_r)
ev = BM_vert_at_index(bmdm->tc->bm, index); /* warning, does list loop, _not_ ideal */
bmvert_to_mvert(bmdm->tc->bm, ev, vert_r);
+ if(bmdm->vertexCos)
+ copy_v3_v3(vert_r->co, bmdm->vertexCos[index]);
}
static void emDM_getEdge(DerivedMesh *dm, int index, MEdge *edge_r)
@@ -1376,13 +1380,18 @@ static void emDM_getTessFace(DerivedMesh *dm, int index, MFace *face_r)
static void emDM_copyVertArray(DerivedMesh *dm, MVert *vert_r)
{
- BMesh *bm = ((EditDerivedBMesh *)dm)->tc->bm;
+ EditDerivedBMesh *bmdm = (EditDerivedBMesh *)dm;
+ BMesh *bm = bmdm->tc->bm;
BMVert *ev;
BMIter iter;
+ int i;
ev = BM_iter_new(&iter, bm, BM_VERTS_OF_MESH, NULL);
- for ( ; ev; ev = BM_iter_step(&iter), ++vert_r) {
- copy_v3_v3(vert_r->co, ev->co);
+ for (i = 0 ; ev; ev = BM_iter_step(&iter), ++vert_r, ++i) {
+ if (bmdm->vertexCos)
+ copy_v3_v3(vert_r->co, bmdm->vertexCos[i]);
+ else
+ copy_v3_v3(vert_r->co, ev->co);
normal_float_to_short_v3(vert_r->no, ev->no);
@@ -1459,8 +1468,8 @@ static void emDM_copyLoopArray(DerivedMesh *dm, MLoop *loop_r)
BM_mesh_elem_index_ensure(bm, BM_VERT | BM_EDGE);
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
loop_r->v = BM_elem_index_get(l->v);
loop_r->e = BM_elem_index_get(l->e);
loop_r++;
@@ -1477,7 +1486,7 @@ static void emDM_copyPolyArray(DerivedMesh *dm, MPoly *poly_r)
int i;
i = 0;
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
poly_r->flag = BM_face_flag_to_mflag(f);
poly_r->loopstart = i;
poly_r->totloop = f->len;
@@ -1492,35 +1501,49 @@ static void *emDM_getTessFaceDataArray(DerivedMesh *dm, int type)
{
EditDerivedBMesh *bmdm= (EditDerivedBMesh*) dm;
BMesh *bm= bmdm->tc->bm;
- BMFace *efa;
- char *data, *bmdata;
void *datalayer;
- int index /*, offset*/ /*UNUSED */, size, i;
datalayer = DM_get_tessface_data_layer(dm, type);
if (datalayer)
return datalayer;
- /* layers are store per face for editmesh, we convert to a tbmporary
+ /* layers are store per face for editmesh, we convert to a temporary
* data layer array in the derivedmesh when these are requested */
if (type == CD_MTFACE || type == CD_MCOL) {
- index = CustomData_get_layer_index(&bm->pdata, type);
+ const int type_from = (type == CD_MTFACE) ? CD_MTEXPOLY : CD_MLOOPCOL;
+ int index;
+ char *data, *bmdata;
+ index = CustomData_get_layer_index(&bm->pdata, type_from);
if (index != -1) {
/* offset = bm->pdata.layers[index].offset; */ /* UNUSED */
- size = CustomData_sizeof(type);
+ const int size = CustomData_sizeof(type);
+ int i, j;
DM_add_tessface_layer(dm, type, CD_CALLOC, NULL);
index = CustomData_get_layer_index(&dm->faceData, type);
dm->faceData.layers[index].flag |= CD_FLAG_TEMPORARY;
data = datalayer = DM_get_tessface_data_layer(dm, type);
- for (i=0; i<bmdm->tc->tottri; i++, data+=size) {
- efa = bmdm->tc->looptris[i][0]->f;
- /* BMESH_TODO: need to still add tface data,
- * derived from the loops.*/
- bmdata = CustomData_bmesh_get(&bm->pdata, efa->head.data, type);
- memcpy(data, bmdata, size);
+
+ if (type == CD_MTFACE) {
+ for (i = 0; i < bmdm->tc->tottri; i++, data += size) {
+ BMFace *efa = bmdm->tc->looptris[i][0]->f;
+ bmdata = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_MTEXPOLY);
+ ME_MTEXFACE_CPY(((MTFace *)data), ((MTexPoly *)bmdata));
+ for (j = 0; j < 3; j++) {
+ bmdata = CustomData_bmesh_get(&bm->ldata, bmdm->tc->looptris[i][j]->head.data, CD_MLOOPUV);
+ copy_v2_v2(((MTFace *)data)->uv[j], ((MLoopUV *)bmdata)->uv);
+ }
+ }
+ }
+ else {
+ for (i = 0; i < bmdm->tc->tottri; i++, data += size) {
+ for (j = 0; j < 3; j++) {
+ bmdata = CustomData_bmesh_get(&bm->ldata, bmdm->tc->looptris[i][j]->head.data, CD_MLOOPCOL);
+ MESH_MLOOPCOL_TO_MCOL(((MLoopCol *)bmdata), (((MCol *)data) + j));
+ }
+ }
}
}
}
@@ -1536,7 +1559,7 @@ static void emDM_getVertCos(DerivedMesh *dm, float (*cos_r)[3])
int i;
i= 0;
- BM_ITER(eve, &iter, emdm->tc->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, emdm->tc->bm, BM_VERTS_OF_MESH) {
if (emdm->vertexCos) {
copy_v3_v3(cos_r[i], emdm->vertexCos[i]);
}
@@ -1612,8 +1635,6 @@ DerivedMesh *getEditDerivedBMesh(
DM_init((DerivedMesh*)bmdm, DM_TYPE_EDITBMESH, em->bm->totvert,
em->bm->totedge, em->tottri, em->bm->totloop, em->bm->totface);
- CustomData_from_bmeshpoly(&bmdm->dm.faceData, &em->bm->pdata, &em->bm->ldata, 0);
-
bmdm->dm.getVertCos = emDM_getVertCos;
bmdm->dm.getMinMax = emDM_getMinMax;
@@ -1688,7 +1709,7 @@ DerivedMesh *getEditDerivedBMesh(
bmdm->polyNos = MEM_mallocN(sizeof(*bmdm->polyNos)*bm->totface, "bmdm_pno");
i = 0;
- BM_ITER(efa, &fiter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &fiter, bm, BM_FACES_OF_MESH) {
BM_elem_index_set(efa, i); /* set_inline */
BM_face_normal_update_vcos(bm, efa, bmdm->polyNos[i], (float const (*)[3])vertexCos);
i++;
@@ -1698,7 +1719,7 @@ DerivedMesh *getEditDerivedBMesh(
eve=BM_iter_new(&viter, bm, BM_VERTS_OF_MESH, NULL);
for (i=0; eve; eve=BM_iter_step(&viter), i++) {
float *no = bmdm->vertexNos[i];
- BM_ITER(efa, &fiter, bm, BM_FACES_OF_VERT, eve) {
+ BM_ITER_ELEM (efa, &fiter, eve, BM_FACES_OF_VERT) {
add_v3_v3(no, bmdm->polyNos[BM_elem_index_get(efa)]);
}
diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c
index 8c754a726f4..0a1c0467244 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -520,7 +520,7 @@ static char *key_block_get_data(Key *key, KeyBlock *actkb, KeyBlock *kb, char **
a = 0;
co = MEM_callocN(sizeof(float) * 3 * me->edit_btmesh->bm->totvert, "key_block_get_data");
- BM_ITER(eve, &iter, me->edit_btmesh->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, me->edit_btmesh->bm, BM_VERTS_OF_MESH) {
copy_v3_v3(co[a], eve->co);
a++;
}
diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c
index 9a10a00bf45..b7b9f6b21f4 100644
--- a/source/blender/blenkernel/intern/mesh.c
+++ b/source/blender/blenkernel/intern/mesh.c
@@ -2354,7 +2354,6 @@ int mesh_recalcTessellation(CustomData *fdata,
* we can skip copying here */
const int do_face_nor_cpy)
{
-
/* use this to avoid locking pthread for _every_ polygon
* and calling the fill function */
@@ -2368,6 +2367,7 @@ int mesh_recalcTessellation(CustomData *fdata,
MLoop *ml, *mloop;
MFace *mface = NULL, *mf;
BLI_array_declare(mface);
+ ScanFillContext sf_ctx;
ScanFillVert *v, *lastv, *firstv;
ScanFillFace *f;
int *mface_orig_index = NULL;
@@ -2461,24 +2461,24 @@ int mesh_recalcTessellation(CustomData *fdata,
ml = mloop + mp->loopstart;
- BLI_begin_edgefill();
+ BLI_begin_edgefill(&sf_ctx);
firstv = NULL;
lastv = NULL;
for (j=0; j<mp->totloop; j++, ml++) {
- v = BLI_addfillvert(mvert[ml->v].co);
+ v = BLI_addfillvert(&sf_ctx, mvert[ml->v].co);
v->keyindex = mp->loopstart + j;
if (lastv)
- BLI_addfilledge(lastv, v);
+ BLI_addfilledge(&sf_ctx, lastv, v);
if (!firstv)
firstv = v;
lastv = v;
}
- BLI_addfilledge(lastv, firstv);
+ BLI_addfilledge(&sf_ctx, lastv, firstv);
- totfilltri = BLI_edgefill(2);
+ totfilltri = BLI_edgefill(&sf_ctx, FALSE);
if (totfilltri) {
BLI_array_growitems(mface_to_poly_map, totfilltri);
BLI_array_growitems(mface, totfilltri);
@@ -2486,7 +2486,7 @@ int mesh_recalcTessellation(CustomData *fdata,
BLI_array_growitems(mface_orig_index, totfilltri);
}
- for (f = fillfacebase.first; f; f = f->next, mf++) {
+ for (f = sf_ctx.fillfacebase.first; f; f = f->next, mf++) {
mface_to_poly_map[mface_index] = poly_index;
mf= &mface[mface_index];
@@ -2511,7 +2511,7 @@ int mesh_recalcTessellation(CustomData *fdata,
}
}
- BLI_end_edgefill();
+ BLI_end_edgefill(&sf_ctx);
}
}
diff --git a/source/blender/blenkernel/intern/mesh_validate.c b/source/blender/blenkernel/intern/mesh_validate.c
index cd49002a351..c5c2060d5c0 100644
--- a/source/blender/blenkernel/intern/mesh_validate.c
+++ b/source/blender/blenkernel/intern/mesh_validate.c
@@ -63,7 +63,7 @@ typedef struct SortPoly {
/* TODO check there is not some standard define of this somewhere! */
static int int_cmp(const void *v1, const void *v2)
{
- return *(int*)v1 > *(int*)v2 ? 1 : *(int*)v1 < *(int*)v2 ? -1 : 0;
+ return *(int *)v1 > *(int *)v2 ? 1 : *(int *)v1 < *(int *)v2 ? -1 : 0;
}
static int search_poly_cmp(const void *v1, const void *v2)
@@ -103,11 +103,11 @@ int BKE_mesh_validate_arrays(Mesh *mesh,
MDeformVert *dverts, /* assume totvert length */
const short do_verbose, const short do_fixes)
{
-# define REMOVE_EDGE_TAG(_me) { _me->v2 = _me->v1; do_edge_free = TRUE; }
-# define IS_REMOVED_EDGE(_me) (_me->v2 == _me->v1)
+# define REMOVE_EDGE_TAG(_me) { _me->v2 = _me->v1; do_edge_free = TRUE; }
+# define IS_REMOVED_EDGE(_me) (_me->v2 == _me->v1)
-# define REMOVE_LOOP_TAG(_ml) { _ml->e = INVALID_LOOP_EDGE_MARKER; do_polyloop_free = TRUE; }
-# define REMOVE_POLY_TAG(_mp) { _mp->totloop *= -1; do_polyloop_free = TRUE; }
+# define REMOVE_LOOP_TAG(_ml) { _ml->e = INVALID_LOOP_EDGE_MARKER; do_polyloop_free = TRUE; }
+# define REMOVE_POLY_TAG(_mp) { _mp->totloop *= -1; do_polyloop_free = TRUE; }
MVert *mv = mverts;
MEdge *me;
@@ -116,13 +116,13 @@ int BKE_mesh_validate_arrays(Mesh *mesh,
unsigned int i, j;
int *v;
- short do_edge_free= FALSE;
- short do_polyloop_free= FALSE; /* This regroups loops and polys! */
+ short do_edge_free = FALSE;
+ short do_polyloop_free = FALSE; /* This regroups loops and polys! */
- short verts_fixed= FALSE;
- short vert_weights_fixed= FALSE;
+ short verts_fixed = FALSE;
+ short vert_weights_fixed = FALSE;
- int do_edge_recalc= FALSE;
+ int do_edge_recalc = FALSE;
EdgeHash *edge_hash = BLI_edgehash_new();
@@ -136,53 +136,53 @@ int BKE_mesh_validate_arrays(Mesh *mesh,
do_edge_recalc = do_fixes;
}
- for (i=1; i<totvert; i++, mv++) {
+ for (i = 1; i < totvert; i++, mv++) {
int j;
- int fix_normal= TRUE;
+ int fix_normal = TRUE;
- for (j=0; j<3; j++) {
+ for (j = 0; j < 3; j++) {
if (!finite(mv->co[j])) {
PRINT(" vertex %u: has invalid coordinate\n", i);
if (do_fixes) {
zero_v3(mv->co);
- verts_fixed= TRUE;
+ verts_fixed = TRUE;
}
}
- if (mv->no[j]!=0)
- fix_normal= FALSE;
+ if (mv->no[j] != 0)
+ fix_normal = FALSE;
}
if (fix_normal) {
PRINT(" vertex %u: has zero normal, assuming Z-up normal\n", i);
if (do_fixes) {
- mv->no[2]= SHRT_MAX;
- verts_fixed= TRUE;
+ mv->no[2] = SHRT_MAX;
+ verts_fixed = TRUE;
}
}
}
- for (i=0, me= medges; i<totedge; i++, me++) {
- int remove= FALSE;
+ for (i = 0, me = medges; i < totedge; i++, me++) {
+ int remove = FALSE;
if (me->v1 == me->v2) {
PRINT(" edge %u: has matching verts, both %u\n", i, me->v1);
- remove= do_fixes;
+ remove = do_fixes;
}
if (me->v1 >= totvert) {
PRINT(" edge %u: v1 index out of range, %u\n", i, me->v1);
- remove= do_fixes;
+ remove = do_fixes;
}
if (me->v2 >= totvert) {
PRINT(" edge %u: v2 index out of range, %u\n", i, me->v2);
- remove= do_fixes;
+ remove = do_fixes;
}
if (BLI_edgehash_haskey(edge_hash, me->v1, me->v2)) {
PRINT(" edge %u: is a duplicate of %d\n", i,
GET_INT_FROM_POINTER(BLI_edgehash_lookup(edge_hash, me->v1, me->v2)));
- remove= do_fixes;
+ remove = do_fixes;
}
if (remove == FALSE) {
@@ -281,7 +281,7 @@ int BKE_mesh_validate_arrays(Mesh *mesh,
int prev_e = ml->e;
ml->e = GET_INT_FROM_POINTER(BLI_edgehash_lookup(edge_hash, v1, v2));
PRINT(" poly %u has invalid edge reference (%u), fixed using edge %u\n",
- sp->index, prev_e, ml->e);
+ sp->index, prev_e, ml->e);
}
else {
PRINT(" poly %u has invalid edge reference (%u)\n", sp->index, ml->e);
@@ -471,24 +471,24 @@ int BKE_mesh_validate_arrays(Mesh *mesh,
/* fix deform verts */
if (dverts) {
MDeformVert *dv;
- for (i=0, dv= dverts; i<totvert; i++, dv++) {
+ for (i = 0, dv = dverts; i < totvert; i++, dv++) {
MDeformWeight *dw;
unsigned int j;
- for (j=0, dw= dv->dw; j < dv->totweight; j++, dw++) {
+ for (j = 0, dw = dv->dw; j < dv->totweight; j++, dw++) {
/* note, greater then max defgroups is accounted for in our code, but not < 0 */
if (!finite(dw->weight)) {
PRINT(" vertex deform %u, group %d has weight: %f\n", i, dw->def_nr, dw->weight);
if (do_fixes) {
- dw->weight= 0.0f;
- vert_weights_fixed= TRUE;
+ dw->weight = 0.0f;
+ vert_weights_fixed = TRUE;
}
}
else if (dw->weight < 0.0f || dw->weight > 1.0f) {
PRINT(" vertex deform %u, group %d has weight: %f\n", i, dw->def_nr, dw->weight);
if (do_fixes) {
CLAMP(dw->weight, 0.0f, 1.0f);
- vert_weights_fixed= TRUE;
+ vert_weights_fixed = TRUE;
}
}
@@ -500,9 +500,9 @@ int BKE_mesh_validate_arrays(Mesh *mesh,
/* re-allocated, the new values compensate for stepping
* within the for loop and may not be valid */
j--;
- dw= dv->dw + j;
+ dw = dv->dw + j;
- vert_weights_fixed= TRUE;
+ vert_weights_fixed = TRUE;
}
else { /* all freed */
break;
@@ -515,10 +515,10 @@ int BKE_mesh_validate_arrays(Mesh *mesh,
PRINT("BKE_mesh_validate: finished\n\n");
-# undef REMOVE_EDGE_TAG
-# undef IS_REMOVED_EDGE
-# undef REMOVE_LOOP_TAG
-# undef REMOVE_POLY_TAG
+# undef REMOVE_EDGE_TAG
+# undef IS_REMOVED_EDGE
+# undef REMOVE_LOOP_TAG
+# undef REMOVE_POLY_TAG
if (mesh) {
if (do_polyloop_free) {
@@ -539,20 +539,20 @@ int BKE_mesh_validate_arrays(Mesh *mesh,
static int mesh_validate_customdata(CustomData *data, short do_verbose, const short do_fixes)
{
- int i= 0, has_fixes= 0;
+ int i = 0, has_fixes = 0;
- while (i<data->totlayer) {
- CustomDataLayer *layer= &data->layers[i];
- CustomDataMask mask= CD_TYPE_AS_MASK(layer->type);
- int ok= 1;
+ while (i < data->totlayer) {
+ CustomDataLayer *layer = &data->layers[i];
+ CustomDataMask mask = CD_TYPE_AS_MASK(layer->type);
+ int ok = 1;
- if ((mask&CD_MASK_MESH)==0) {
+ if ((mask & CD_MASK_MESH) == 0) {
PRINT("CustomDataLayer type %d which isn't in CD_MASK_MESH is stored in Mehs structure\n", layer->type);
if (do_fixes) {
CustomData_free_layer(data, layer->type, 0, i);
- ok= 0;
- has_fixes= 1;
+ ok = 0;
+ has_fixes = 1;
}
}
@@ -569,32 +569,32 @@ static int BKE_mesh_validate_all_customdata(CustomData *vdata, CustomData *edata
CustomData *ldata, CustomData *pdata,
short do_verbose, const short do_fixes)
{
- int vfixed= 0, efixed= 0, lfixed = 0, pfixed = 0;
+ int vfixed = 0, efixed = 0, lfixed = 0, pfixed = 0;
- vfixed= mesh_validate_customdata(vdata, do_verbose, do_fixes);
- efixed= mesh_validate_customdata(edata, do_verbose, do_fixes);
- lfixed= mesh_validate_customdata(ldata, do_verbose, do_fixes);
- pfixed= mesh_validate_customdata(pdata, do_verbose, do_fixes);
+ vfixed = mesh_validate_customdata(vdata, do_verbose, do_fixes);
+ efixed = mesh_validate_customdata(edata, do_verbose, do_fixes);
+ lfixed = mesh_validate_customdata(ldata, do_verbose, do_fixes);
+ pfixed = mesh_validate_customdata(pdata, do_verbose, do_fixes);
return vfixed || efixed || lfixed || pfixed;
}
int BKE_mesh_validate(Mesh *me, int do_verbose)
{
- int layers_fixed= 0, arrays_fixed= 0;
+ int layers_fixed = 0, arrays_fixed = 0;
if (do_verbose) {
- printf("MESH: %s\n", me->id.name+2);
+ printf("MESH: %s\n", me->id.name + 2);
}
- layers_fixed= BKE_mesh_validate_all_customdata(&me->vdata, &me->edata, &me->ldata, &me->pdata, do_verbose, TRUE);
- arrays_fixed= BKE_mesh_validate_arrays(me,
- me->mvert, me->totvert,
- me->medge, me->totedge,
- me->mloop, me->totloop,
- me->mpoly, me->totpoly,
- me->dvert,
- do_verbose, TRUE);
+ layers_fixed = BKE_mesh_validate_all_customdata(&me->vdata, &me->edata, &me->ldata, &me->pdata, do_verbose, TRUE);
+ arrays_fixed = BKE_mesh_validate_arrays(me,
+ me->mvert, me->totvert,
+ me->medge, me->totedge,
+ me->mloop, me->totloop,
+ me->mpoly, me->totpoly,
+ me->dvert,
+ do_verbose, TRUE);
if (layers_fixed || arrays_fixed) {
DAG_id_tag_update(&me->id, OB_RECALC_DATA);
@@ -624,26 +624,26 @@ void BKE_mesh_calc_edges(Mesh *mesh, int update)
int i, totedge, totpoly = mesh->totpoly;
int med_index;
- if (mesh->totedge==0)
- update= 0;
+ if (mesh->totedge == 0)
+ update = FALSE;
if (update) {
/* assume existing edges are valid
* useful when adding more faces and generating edges from them */
- med= mesh->medge;
- for (i= 0; i<mesh->totedge; i++, med++)
+ med = mesh->medge;
+ for (i = 0; i < mesh->totedge; i++, med++)
BLI_edgehash_insert(eh, med->v1, med->v2, med);
}
/* mesh loops (bmesh only) */
- for (i=0; i < totpoly; i++, mp++) {
- MLoop *l= &mesh->mloop[mp->loopstart];
- int j, l_prev= (l + (mp->totloop-1))->v;
- for (j=0; j < mp->totloop; j++, l++) {
+ for (i = 0; i < totpoly; i++, mp++) {
+ MLoop *l = &mesh->mloop[mp->loopstart];
+ int j, l_prev = (l + (mp->totloop - 1))->v;
+ for (j = 0; j < mp->totloop; j++, l++) {
if (!BLI_edgehash_haskey(eh, l_prev, l->v)) {
BLI_edgehash_insert(eh, l_prev, l->v, NULL);
}
- l_prev= l->v;
+ l_prev = l->v;
}
}
@@ -656,14 +656,14 @@ void BKE_mesh_calc_edges(Mesh *mesh, int update)
ehi = BLI_edgehashIterator_new(eh);
med = CustomData_get_layer(&edata, CD_MEDGE);
for (i = 0; !BLI_edgehashIterator_isDone(ehi);
- BLI_edgehashIterator_step(ehi), ++i, ++med) {
+ BLI_edgehashIterator_step(ehi), ++i, ++med) {
- if (update && (med_orig=BLI_edgehashIterator_getValue(ehi))) {
- *med= *med_orig; /* copy from the original */
+ if (update && (med_orig = BLI_edgehashIterator_getValue(ehi))) {
+ *med = *med_orig; /* copy from the original */
}
else {
BLI_edgehashIterator_getKey(ehi, &med->v1, &med->v2);
- med->flag = ME_EDGEDRAW|ME_EDGERENDER|SELECT; /* select for newly created meshes which are selected [#25595] */
+ med->flag = ME_EDGEDRAW | ME_EDGERENDER | SELECT; /* select for newly created meshes which are selected [#25595] */
}
/* store the new edge index in the hash value */
@@ -674,16 +674,16 @@ void BKE_mesh_calc_edges(Mesh *mesh, int update)
if (mesh->totpoly) {
/* second pass, iterate through all loops again and assign
* the newly created edges to them. */
- MPoly *mp= mesh->mpoly;
- for (i=0; i < mesh->totpoly; i++, mp++) {
- MLoop *l= &mesh->mloop[mp->loopstart];
- MLoop *l_prev= (l + (mp->totloop-1));
+ MPoly *mp = mesh->mpoly;
+ for (i = 0; i < mesh->totpoly; i++, mp++) {
+ MLoop *l = &mesh->mloop[mp->loopstart];
+ MLoop *l_prev = (l + (mp->totloop - 1));
int j;
- for (j=0; j < mp->totloop; j++, l++) {
+ for (j = 0; j < mp->totloop; j++, l++) {
/* lookup hashed edge index */
med_index = GET_INT_FROM_POINTER(BLI_edgehash_lookup(eh, l_prev->v, l->v));
l_prev->e = med_index;
- l_prev= l;
+ l_prev = l;
}
}
}
diff --git a/source/blender/blenkernel/intern/multires.c b/source/blender/blenkernel/intern/multires.c
index d8117aa1344..2167495ef08 100644
--- a/source/blender/blenkernel/intern/multires.c
+++ b/source/blender/blenkernel/intern/multires.c
@@ -2166,58 +2166,38 @@ void multiresModifier_prepare_join(Scene *scene, Object *ob, Object *to_ob)
}
/* update multires data after topology changing */
-#if 0 // BMESH_TODO
-void multires_topology_changed(Scene *scene, Object *ob)
+void multires_topology_changed(Mesh *me)
{
- Mesh *me= (Mesh*)ob->data;
- MDisps *mdisp= NULL, *cur= NULL;
- int i, grid= 0, corners;
- MultiresModifierData *mmd= get_multires_modifier(scene, ob, 1);
-
- if (mmd)
- multires_set_tot_mdisps(me, mmd->totlvl);
+ MDisps *mdisp = NULL, *cur = NULL;
+ int i, grid = 0;
- CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface);
- mdisp= CustomData_get_layer(&me->fdata, CD_MDISPS);
+ CustomData_external_read(&me->ldata, &me->id, CD_MASK_MDISPS, me->totface);
+ mdisp = CustomData_get_layer(&me->ldata, CD_MDISPS);
- if (!mdisp) return;
+ if (!mdisp)
+ return;
- cur= mdisp;
- for (i = 0; i < me->totface; i++, cur++) {
- if (mdisp->totdisp) {
- corners= multires_mdisp_corners(mdisp);
- grid= mdisp->totdisp / corners;
+ cur = mdisp;
+ for (i = 0; i < me->totloop; i++, cur++) {
+ if (cur->totdisp) {
+ grid = mdisp->totdisp;
break;
}
}
- for (i = 0; i < me->totface; i++, mdisp++) {
- int nvert= me->mface[i].v4 ? 4 : 3;
-
+ for (i = 0; i < me->totloop; i++, mdisp++) {
/* allocate memory for mdisp, the whole disp layer would be erased otherwise */
if (!mdisp->totdisp || !mdisp->disps) {
if (grid) {
- mdisp->totdisp= nvert*grid;
- mdisp->disps= MEM_callocN(mdisp->totdisp*sizeof(float)*3, "mdisp topology");
+ mdisp->totdisp = grid;
+ mdisp->disps = MEM_callocN(3 * mdisp->totdisp * sizeof(float), "mdisp topology");
}
continue;
}
-
- corners= multires_mdisp_corners(mdisp);
-
- if (corners!=nvert) {
- mdisp->totdisp= (mdisp->totdisp/corners)*nvert;
-
- if (mdisp->disps)
- MEM_freeN(mdisp->disps);
-
- mdisp->disps= MEM_callocN(mdisp->totdisp*sizeof(float)*3, "mdisp topology");
- }
}
}
-#endif // BMESH_TODO
/***************** Multires interpolation stuff *****************/
diff --git a/source/blender/blenkernel/intern/navmesh_conversion.c b/source/blender/blenkernel/intern/navmesh_conversion.c
index 27e309e9d20..34e0be1de92 100644
--- a/source/blender/blenkernel/intern/navmesh_conversion.c
+++ b/source/blender/blenkernel/intern/navmesh_conversion.c
@@ -166,7 +166,7 @@ int buildRawVertIndicesData(DerivedMesh* dm, int *nverts_r, float **verts_r,
}
//carefully, recast data is just reference to data in derived mesh
- *recastData = (int*)CustomData_get_layer(&dm->faceData, CD_RECAST);
+ *recastData = (int*)CustomData_get_layer(&dm->polyData, CD_RECAST);
*nverts_r = nverts;
*verts_r = verts;
diff --git a/source/blender/blenkernel/intern/node.c b/source/blender/blenkernel/intern/node.c
index cbdbf0317b4..2fb3f81b147 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -1367,7 +1367,7 @@ void nodeSetActive(bNodeTree *ntree, bNode *node)
int nodeSocketIsHidden(bNodeSocket *sock)
{
- return ((sock->flag & (SOCK_HIDDEN | SOCK_AUTO_HIDDEN | SOCK_UNAVAIL)) != 0);
+ return ((sock->flag & (SOCK_HIDDEN | SOCK_UNAVAIL)) != 0);
}
void nodeSocketSetType(bNodeSocket *sock, int type)
@@ -1616,6 +1616,7 @@ int nodeUpdateID(bNodeTree *ntree, ID *id)
for (node= ntree->nodes.first; node; node= node->next) {
if (node->id==id) {
change = TRUE;
+ node->update |= NODE_UPDATE_ID;
ntreetype->update_node(ntree, node);
/* clear update flag */
node->update = 0;
@@ -1626,6 +1627,7 @@ int nodeUpdateID(bNodeTree *ntree, ID *id)
for (node= ntree->nodes.first; node; node= node->next) {
if (node->id==id) {
change = TRUE;
+ node->update |= NODE_UPDATE_ID;
if (node->typeinfo->updatefunc)
node->typeinfo->updatefunc(ntree, node);
/* clear update flag */
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 60a6faac8e1..bd0853decbe 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -1780,7 +1780,7 @@ static void give_parvert(Object *par, int nr, float vec[3])
BMVert *eve;
BMIter iter;
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
int *keyindex = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_SHAPE_KEYINDEX);
if (keyindex && *keyindex==nr) {
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 8e5bf71d2c6..e7b6738f7c3 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -125,6 +125,12 @@ Scene *copy_scene(Scene *sce, int type)
lb= scen->r.layers;
scen->r= sce->r;
scen->r.layers= lb;
+ scen->unit= sce->unit;
+ scen->physics_settings= sce->physics_settings;
+ scen->gm= sce->gm;
+ scen->audio= sce->audio;
+
+ MEM_freeN(scen->toolsettings);
}
else {
scen= copy_libblock(&sce->id);
@@ -139,37 +145,9 @@ Scene *copy_scene(Scene *sce, int type)
scen->ed= NULL;
scen->theDag= NULL;
scen->obedit= NULL;
- scen->toolsettings= MEM_dupallocN(sce->toolsettings);
scen->stats= NULL;
scen->fps_info= NULL;
- ts= scen->toolsettings;
- if (ts) {
- if (ts->vpaint) {
- ts->vpaint= MEM_dupallocN(ts->vpaint);
- ts->vpaint->paintcursor= NULL;
- ts->vpaint->vpaint_prev= NULL;
- ts->vpaint->wpaint_prev= NULL;
- copy_paint(&ts->vpaint->paint, &ts->vpaint->paint);
- }
- if (ts->wpaint) {
- ts->wpaint= MEM_dupallocN(ts->wpaint);
- ts->wpaint->paintcursor= NULL;
- ts->wpaint->vpaint_prev= NULL;
- ts->wpaint->wpaint_prev= NULL;
- copy_paint(&ts->wpaint->paint, &ts->wpaint->paint);
- }
- if (ts->sculpt) {
- ts->sculpt= MEM_dupallocN(ts->sculpt);
- copy_paint(&ts->sculpt->paint, &ts->sculpt->paint);
- }
-
- copy_paint(&ts->imapaint.paint, &ts->imapaint.paint);
- ts->imapaint.paintcursor= NULL;
-
- ts->particle.paintcursor= NULL;
- }
-
BLI_duplicatelist(&(scen->markers), &(sce->markers));
BLI_duplicatelist(&(scen->transform_spaces), &(sce->transform_spaces));
BLI_duplicatelist(&(scen->r.layers), &(sce->r.layers));
@@ -190,6 +168,35 @@ Scene *copy_scene(Scene *sce, int type)
base= base->next;
}
}
+
+ /* tool settings */
+ scen->toolsettings= MEM_dupallocN(sce->toolsettings);
+
+ ts= scen->toolsettings;
+ if (ts) {
+ if (ts->vpaint) {
+ ts->vpaint= MEM_dupallocN(ts->vpaint);
+ ts->vpaint->paintcursor= NULL;
+ ts->vpaint->vpaint_prev= NULL;
+ ts->vpaint->wpaint_prev= NULL;
+ copy_paint(&ts->vpaint->paint, &ts->vpaint->paint);
+ }
+ if (ts->wpaint) {
+ ts->wpaint= MEM_dupallocN(ts->wpaint);
+ ts->wpaint->paintcursor= NULL;
+ ts->wpaint->vpaint_prev= NULL;
+ ts->wpaint->wpaint_prev= NULL;
+ copy_paint(&ts->wpaint->paint, &ts->wpaint->paint);
+ }
+ if (ts->sculpt) {
+ ts->sculpt= MEM_dupallocN(ts->sculpt);
+ copy_paint(&ts->sculpt->paint, &ts->sculpt->paint);
+ }
+
+ copy_paint(&ts->imapaint.paint, &ts->imapaint.paint);
+ ts->imapaint.paintcursor= NULL;
+ ts->particle.paintcursor= NULL;
+ }
/* make a private copy of the avicodecdata */
if (sce->r.avicodecdata) {
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 158fc91c03c..af0c5eae9a8 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -30,7 +30,9 @@
* \ingroup bke
*/
-#include "BLI_winstuff.h"
+#ifdef WIN32
+# include "BLI_winstuff.h"
+#endif
#include <string.h>
#include <stdio.h>
diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c
index 4ce159b8aaf..a7e49dd7fc8 100644
--- a/source/blender/blenkernel/intern/text.c
+++ b/source/blender/blenkernel/intern/text.c
@@ -2560,6 +2560,8 @@ void txt_delete_char(Text *text)
txt_combine_lines(text, text->curl, text->curl->next);
txt_pop_sel(text);
}
+ else
+ return;
}
else { /* Just deleting a char */
size_t c_len = 0;
diff --git a/source/blender/blenkernel/intern/unit.c b/source/blender/blenkernel/intern/unit.c
index b3c979afac4..48e939be7e9 100644
--- a/source/blender/blenkernel/intern/unit.c
+++ b/source/blender/blenkernel/intern/unit.c
@@ -34,7 +34,10 @@
#include "BLI_math.h"
#include "BLI_string.h"
#include "BLI_string_utf8.h"
-#include "BLI_winstuff.h"
+
+#ifdef WIN32
+# include "BLI_winstuff.h"
+#endif
#define TEMP_STR_SIZE 256
@@ -128,7 +131,7 @@ static struct bUnitDef buImperialLenDef[] = {
{"mile", "miles", "mi", "m", "Miles", UN_SC_MI, 0.0, B_UNIT_DEF_NONE},
{"furlong", "furlongs", "fur", NULL, "Furlongs",UN_SC_FUR, 0.0, B_UNIT_DEF_SUPPRESS},
{"chain", "chains", "ch", NULL, "Chains", UN_SC_CH, 0.0, B_UNIT_DEF_SUPPRESS},
- {"yard", "yards", "yd", NULL, "Yards", UN_SC_YD, 0.0, B_UNIT_DEF_NONE},
+ {"yard", "yards", "yd", NULL, "Yards", UN_SC_YD, 0.0, B_UNIT_DEF_SUPPRESS},
{"foot", "feet", "'", "ft", "Feet", UN_SC_FT, 0.0, B_UNIT_DEF_NONE}, /* base unit */
{"inch", "inches", "\"", "in", "Inches", UN_SC_IN, 0.0, B_UNIT_DEF_NONE},
{"thou", "thou", "thou", "mil", "Thou", UN_SC_MIL, 0.0, B_UNIT_DEF_NONE}, /* plural for thou has no 's' */
diff --git a/source/blender/blenlib/BLI_math_vector.h b/source/blender/blenlib/BLI_math_vector.h
index 7fba2699fc7..54c06616110 100644
--- a/source/blender/blenlib/BLI_math_vector.h
+++ b/source/blender/blenlib/BLI_math_vector.h
@@ -124,6 +124,8 @@ MINLINE float dot_v3v3(const float a[3], const float b[3]);
MINLINE float cross_v2v2(const float a[2], const float b[2]);
MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3]);
+MINLINE void add_newell_cross_v3_v3v3(float n[3], const float v_prev[3], const float v_curr[3]);
+
MINLINE void star_m3_v3(float rmat[3][3],float a[3]);
/*********************************** Length **********************************/
diff --git a/source/blender/blenlib/BLI_scanfill.h b/source/blender/blenlib/BLI_scanfill.h
index 1fe71bffba8..26bcd50ef3e 100644
--- a/source/blender/blenlib/BLI_scanfill.h
+++ b/source/blender/blenlib/BLI_scanfill.h
@@ -35,29 +35,42 @@
* \brief Filling meshes.
*/
-/**
- * \attention Defined in scanfill.c
- */
-extern struct ListBase fillvertbase;
-extern struct ListBase filledgebase;
-extern struct ListBase fillfacebase;
-
struct ScanFillVert;
#ifdef __cplusplus
extern "C" {
#endif
+typedef struct ScanFillContext
+{
+ ListBase fillvertbase;
+ ListBase filledgebase;
+ ListBase fillfacebase;
+
+ /* simple optimization for allocating thousands of small memory blocks
+ * only to be used within loops, and not by one function at a time
+ * free in the end, with argument '-1'
+ */
+#define MEM_ELEM_BLOCKSIZE 16384
+ struct mem_elements *melem__cur;
+ int melem__offs; /* the current free address */
+ ListBase melem__lb;
+
+ /* private */
+ struct ScanFillVertLink *_scdata;
+} ScanFillContext;
+
/* note; changing this also might affect the undo copy in editmesh.c */
typedef struct ScanFillVert
{
struct ScanFillVert *next, *prev;
union {
struct ScanFillVert *v;
- void *p;
- intptr_t l;
+ void *p;
+ intptr_t l;
} tmp;
- float co[3]; /*vertex location */
+ float co[3]; /* vertex location */
+ float xy[2]; /* 2D copy of vertex location (using dominant axis) */
int keyindex; /* original index #, for restoring key information */
short poly_nr;
unsigned char f, h;
@@ -78,16 +91,14 @@ typedef struct ScanFillFace
} ScanFillFace;
/* scanfill.c: used in displist only... */
-struct ScanFillVert *BLI_addfillvert(const float vec[3]);
-struct ScanFillEdge *BLI_addfilledge(struct ScanFillVert *v1, struct ScanFillVert *v2);
-
-/* Optionally set ScanFillEdge f to this to mark original boundary edges.
- * Only needed if there are internal diagonal edges passed to BLI_edgefill. */
-#define FILLBOUNDARY 1
+struct ScanFillVert *BLI_addfillvert(ScanFillContext *sf_ctx, const float vec[3]);
+struct ScanFillEdge *BLI_addfilledge(ScanFillContext *sf_ctx, struct ScanFillVert *v1, struct ScanFillVert *v2);
-int BLI_begin_edgefill(void);
-int BLI_edgefill(short mat_nr);
-void BLI_end_edgefill(void);
+int BLI_begin_edgefill(ScanFillContext *sf_ctx);
+int BLI_edgefill(ScanFillContext *sf_ctx, const short do_quad_tri_speedup);
+int BLI_edgefill_ex(ScanFillContext *sf_ctx, const short do_quad_tri_speedup,
+ const float nor_proj[3]);
+void BLI_end_edgefill(ScanFillContext *sf_ctx);
/* These callbacks are needed to make the lib finction properly */
@@ -109,8 +120,6 @@ void BLI_setErrorCallBack(void (*f)(const char*));
*/
void BLI_setInterruptCallBack(int (*f)(void));
-void BLI_scanfill_free(void);
-
#ifdef __cplusplus
}
#endif
diff --git a/source/blender/blenlib/BLI_threads.h b/source/blender/blenlib/BLI_threads.h
index 03bf375a894..8e75a2db629 100644
--- a/source/blender/blenlib/BLI_threads.h
+++ b/source/blender/blenlib/BLI_threads.h
@@ -76,7 +76,6 @@ int BLI_system_thread_count(void); /* gets the number of threads the system can
#define LOCK_OPENGL 5
#define LOCK_NODES 6
#define LOCK_MOVIECLIP 7
-#define LOCK_SCANFILL 8
void BLI_lock_thread(int type);
void BLI_unlock_thread(int type);
diff --git a/source/blender/blenlib/BLI_winstuff.h b/source/blender/blenlib/BLI_winstuff.h
index 821946727f2..33ca7d235fa 100644
--- a/source/blender/blenlib/BLI_winstuff.h
+++ b/source/blender/blenlib/BLI_winstuff.h
@@ -33,28 +33,30 @@
* \brief Compatibility-like things for windows.
*/
-#ifdef _WIN32
+#ifndef _WIN32
+# error "This include is for Windows only!"
+#endif
#ifndef FREE_WINDOWS
-#pragma warning(once: 4761 4305 4244 4018)
+# pragma warning(once: 4761 4305 4244 4018)
#else
-#ifdef WINVER
-#undef WINVER
-#endif
+# ifdef WINVER
+# undef WINVER
+# endif
/* Some stuff requires WINVER 0x500, but mingw's default is 0x400 */
-#define WINVER 0x0501
+# define WINVER 0x0501
#endif
#define WIN32_LEAN_AND_MEAN
#ifndef WIN32_SKIP_HKEY_PROTECTION
-#undef HKEY
-#define HKEY WIN32_HKEY // prevent competing definitions
-#include <windows.h>
-#undef HKEY
+# undef HKEY
+# define HKEY WIN32_HKEY // prevent competing definitions
+# include <windows.h>
+# undef HKEY
#else
-#include <windows.h>
+# include <windows.h>
#endif
#undef near
@@ -83,10 +85,10 @@ extern "C" {
#define MAXPATHLEN MAX_PATH
#ifndef S_ISREG
-#define S_ISREG(x) (((x)&_S_IFREG) == _S_IFREG)
+# define S_ISREG(x) (((x)&_S_IFREG) == _S_IFREG)
#endif
#ifndef S_ISDIR
-#define S_ISDIR(x) (((x)&_S_IFDIR) == _S_IFDIR)
+# define S_ISDIR(x) (((x)&_S_IFDIR) == _S_IFDIR)
#endif
/* defines for using ISO C++ conformant names */
@@ -98,21 +100,21 @@ typedef unsigned int mode_t;
/* use functions that take a 64 bit offset for files larger than 4GB */
#ifndef FREE_WINDOWS
-#include <stdio.h>
-#define fseek(stream, offset, origin) _fseeki64(stream, offset, origin)
-#define ftell(stream) _ftelli64(stream)
-#define lseek(fd, offset, origin) _lseeki64(fd, offset, origin)
-#define tell(fd) _telli64(fd)
+# include <stdio.h>
+# define fseek(stream, offset, origin) _fseeki64(stream, offset, origin)
+# define ftell(stream) _ftelli64(stream)
+# define lseek(fd, offset, origin) _lseeki64(fd, offset, origin)
+# define tell(fd) _telli64(fd)
#endif
/* mingw using _SSIZE_T_ to declare ssize_t type */
#ifndef _SSIZE_T_
-#define _SSIZE_T_
+# define _SSIZE_T_
/* python uses HAVE_SSIZE_T */
-#ifndef HAVE_SSIZE_T
-#define HAVE_SSIZE_T 1
+# ifndef HAVE_SSIZE_T
+# define HAVE_SSIZE_T 1
typedef long ssize_t;
-#endif
+# endif
#endif
struct dirent {
@@ -148,7 +150,5 @@ int BLI_getInstallationDir(char *str);
}
#endif
-#endif /* _WIN32 */
-
#endif /* __BLI_WINSTUFF_H__ */
diff --git a/source/blender/blenlib/intern/fileops.c b/source/blender/blenlib/intern/fileops.c
index 1b734c674e2..93312f04692 100644
--- a/source/blender/blenlib/intern/fileops.c
+++ b/source/blender/blenlib/intern/fileops.c
@@ -43,16 +43,16 @@
#ifdef WIN32
#include <io.h>
-#include "BLI_winstuff.h"
-#include "BLI_callbacks.h"
-#include "utf_winfunc.h"
-#include "utfconv.h"
+# include "BLI_winstuff.h"
+# include "BLI_callbacks.h"
+# include "utf_winfunc.h"
+# include "utfconv.h"
#else
-#include <unistd.h> // for read close
-#include <sys/param.h>
-#include <dirent.h>
-#include <unistd.h>
-#include <sys/stat.h>
+# include <unistd.h> // for read close
+# include <sys/param.h>
+# include <dirent.h>
+# include <unistd.h>
+# include <sys/stat.h>
#endif
#include "MEM_guardedalloc.h"
diff --git a/source/blender/blenlib/intern/math_base_inline.c b/source/blender/blenlib/intern/math_base_inline.c
index 58c882e894e..b2d5392c596 100644
--- a/source/blender/blenlib/intern/math_base_inline.c
+++ b/source/blender/blenlib/intern/math_base_inline.c
@@ -92,7 +92,7 @@ MINLINE float saasinf(float fac)
MINLINE float sasqrtf(float fac)
{
if (fac <= 0.0f) return 0.0f;
- return (float)sqrtf(fac);
+ return sqrtf(fac);
}
MINLINE float interpf(float target, float origin, float fac)
diff --git a/source/blender/blenlib/intern/math_vector_inline.c b/source/blender/blenlib/intern/math_vector_inline.c
index 62e582c89c4..ef8f26e3780 100644
--- a/source/blender/blenlib/intern/math_vector_inline.c
+++ b/source/blender/blenlib/intern/math_vector_inline.c
@@ -480,6 +480,17 @@ MINLINE void cross_v3_v3v3(float r[3], const float a[3], const float b[3])
r[2] = a[0] * b[1] - a[1] * b[0];
}
+/* Newell's Method */
+/* excuse this fairly spesific function,
+ * its used for polygon normals all over the place
+ * could use a better name */
+MINLINE void add_newell_cross_v3_v3v3(float n[3], const float v_prev[3], const float v_curr[3])
+{
+ n[0] += (v_prev[1] - v_curr[1]) * (v_prev[2] + v_curr[2]);
+ n[1] += (v_prev[2] - v_curr[2]) * (v_prev[0] + v_curr[0]);
+ n[2] += (v_prev[0] - v_curr[0]) * (v_prev[1] + v_curr[1]);
+}
+
MINLINE void star_m3_v3(float rmat[][3], float a[3])
{
rmat[0][0] = rmat[1][1] = rmat[2][2] = 0.0;
@@ -505,7 +516,7 @@ MINLINE float len_squared_v3(const float v[3])
MINLINE float len_v2(const float v[2])
{
- return (float)sqrtf(v[0] * v[0] + v[1] * v[1]);
+ return sqrtf(v[0] * v[0] + v[1] * v[1]);
}
MINLINE float len_v2v2(const float v1[2], const float v2[2])
@@ -514,7 +525,7 @@ MINLINE float len_v2v2(const float v1[2], const float v2[2])
x = v1[0] - v2[0];
y = v1[1] - v2[1];
- return (float)sqrtf(x * x + y * y);
+ return sqrtf(x * x + y * y);
}
MINLINE float len_v3(const float a[3])
diff --git a/source/blender/blenlib/intern/rand.c b/source/blender/blenlib/intern/rand.c
index 20f0a11f75f..2e722c2a135 100644
--- a/source/blender/blenlib/intern/rand.c
+++ b/source/blender/blenlib/intern/rand.c
@@ -119,6 +119,8 @@ void rng_shuffleArray(RNG *rng, void *data, int elemSize, int numElems)
temp = malloc(elemSize);
+ /* XXX Shouldn’t it rather be "while (i--) {" ?
+ * Else we have no guaranty first (0) element has a chance to be shuffled... --mont29 */
while (--i) {
int j = rng_getInt(rng)%numElems;
if (i!=j) {
diff --git a/source/blender/blenlib/intern/scanfill.c b/source/blender/blenlib/intern/scanfill.c
index 641d0373a64..20dbf29f6bc 100644
--- a/source/blender/blenlib/intern/scanfill.c
+++ b/source/blender/blenlib/intern/scanfill.c
@@ -42,10 +42,9 @@
#include "BLI_math.h"
#include "BLI_scanfill.h"
#include "BLI_utildefines.h"
-#include "BLI_threads.h"
/* callbacks for errors and interrupts and some goo */
-static void (*BLI_localErrorCallBack)(const char*) = NULL;
+static void (*BLI_localErrorCallBack)(const char *) = NULL;
static int (*BLI_localInterruptCallBack)(void) = NULL;
void BLI_setErrorCallBack(void (*f)(const char *))
@@ -59,7 +58,7 @@ void BLI_setInterruptCallBack(int (*f)(void))
}
/* just flush the error to /dev/null if the error handler is missing */
-void callLocalErrorCallBack(const char* msg)
+void callLocalErrorCallBack(const char *msg)
{
if (BLI_localErrorCallBack) {
BLI_localErrorCallBack(msg);
@@ -81,9 +80,9 @@ static int callLocalInterruptCallBack(void)
/* local types */
typedef struct PolyFill {
- int edges,verts;
- float min[3],max[3];
- short f,nr;
+ int edges, verts;
+ float min_xy[2], max_xy[2];
+ short f, nr;
} PolyFill;
typedef struct ScanFillVertLink {
@@ -94,99 +93,92 @@ typedef struct ScanFillVertLink {
/* local funcs */
-#define COMPLIMIT 0.00003
+#define SF_EPSILON 0.00003f
-static ScanFillVertLink *scdata;
+#define SF_VERT_UNKNOWN 1 /* TODO, what is this for exactly? - need to document it! */
+#define SF_VERT_ZERO_LEN 255
-ListBase fillvertbase = {NULL, NULL};
-ListBase filledgebase = {NULL, NULL};
-ListBase fillfacebase = {NULL, NULL};
+/* Optionally set ScanFillEdge f to this to mark original boundary edges.
+ * Only needed if there are internal diagonal edges passed to BLI_edgefill. */
+#define SF_EDGE_BOUNDARY 1
+#define SF_EDGE_UNKNOWN 2 /* TODO, what is this for exactly? - need to document it! */
-static int cox, coy;
-/* **** FUBCTIONS FOR QSORT *************************** */
+
+/* **** FUNCTIONS FOR QSORT *************************** */
static int vergscdata(const void *a1, const void *a2)
{
- const ScanFillVertLink *x1=a1,*x2=a2;
+ const ScanFillVertLink *x1 = a1, *x2 = a2;
- if ( x1->v1->co[coy] < x2->v1->co[coy] ) return 1;
- else if ( x1->v1->co[coy] > x2->v1->co[coy]) return -1;
- else if ( x1->v1->co[cox] > x2->v1->co[cox] ) return 1;
- else if ( x1->v1->co[cox] < x2->v1->co[cox]) return -1;
+ if (x1->v1->xy[1] < x2->v1->xy[1]) return 1;
+ else if (x1->v1->xy[1] > x2->v1->xy[1]) return -1;
+ else if (x1->v1->xy[0] > x2->v1->xy[0]) return 1;
+ else if (x1->v1->xy[0] < x2->v1->xy[0]) return -1;
return 0;
}
static int vergpoly(const void *a1, const void *a2)
{
- const PolyFill *x1=a1, *x2=a2;
+ const PolyFill *x1 = a1, *x2 = a2;
- if ( x1->min[cox] > x2->min[cox] ) return 1;
- else if ( x1->min[cox] < x2->min[cox] ) return -1;
- else if ( x1->min[coy] > x2->min[coy] ) return 1;
- else if ( x1->min[coy] < x2->min[coy] ) return -1;
+ if (x1->min_xy[0] > x2->min_xy[0]) return 1;
+ else if (x1->min_xy[0] < x2->min_xy[0]) return -1;
+ else if (x1->min_xy[1] > x2->min_xy[1]) return 1;
+ else if (x1->min_xy[1] < x2->min_xy[1]) return -1;
return 0;
}
/* ************* MEMORY MANAGEMENT ************* */
+/* memory management */
struct mem_elements {
struct mem_elements *next, *prev;
char *data;
};
-
-/* simple optimization for allocating thousands of small memory blocks
- * only to be used within loops, and not by one function at a time
- * free in the end, with argument '-1'
- */
-#define MEM_ELEM_BLOCKSIZE 16384
-static struct mem_elements * melem__cur= NULL;
-static int melem__offs= 0; /* the current free address */
-static ListBase melem__lb= {NULL, NULL};
-
-static void *mem_element_new(int size)
+static void *mem_element_new(ScanFillContext *sf_ctx, int size)
{
- BLI_assert(!(size>10000 || size==0)); /* this is invalid use! */
+ BLI_assert(!(size > 10000 || size == 0)); /* this is invalid use! */
- size = (size + 3 ) & ~3; /* allocate in units of 4 */
+ size = (size + 3) & ~3; /* allocate in units of 4 */
- if (melem__cur && (size + melem__offs < MEM_ELEM_BLOCKSIZE)) {
- void *adr= (void *) (melem__cur->data+melem__offs);
- melem__offs+= size;
+ if (sf_ctx->melem__cur && (size + sf_ctx->melem__offs < MEM_ELEM_BLOCKSIZE)) {
+ void *adr = (void *) (sf_ctx->melem__cur->data + sf_ctx->melem__offs);
+ sf_ctx->melem__offs += size;
return adr;
}
else {
- melem__cur= MEM_callocN( sizeof(struct mem_elements), "newmem");
- melem__cur->data= MEM_callocN(MEM_ELEM_BLOCKSIZE, "newmem");
- BLI_addtail(&melem__lb, melem__cur);
+ sf_ctx->melem__cur = MEM_callocN(sizeof(struct mem_elements), "newmem");
+ sf_ctx->melem__cur->data = MEM_callocN(MEM_ELEM_BLOCKSIZE, "newmem");
+ BLI_addtail(&sf_ctx->melem__lb, sf_ctx->melem__cur);
- melem__offs= size;
- return melem__cur->data;
+ sf_ctx->melem__offs = size;
+ return sf_ctx->melem__cur->data;
}
}
-static void mem_element_reset(int keep_first)
+static void mem_element_reset(ScanFillContext *sf_ctx, int keep_first)
{
struct mem_elements *first;
- if ((first= melem__lb.first)) { /* can be false if first fill fails */
+ if ((first = sf_ctx->melem__lb.first)) { /* can be false if first fill fails */
if (keep_first) {
- BLI_remlink(&melem__lb, first);
+ BLI_remlink(&sf_ctx->melem__lb, first);
}
- melem__cur= melem__lb.first;
- while (melem__cur) {
- MEM_freeN(melem__cur->data);
- melem__cur= melem__cur->next;
+ sf_ctx->melem__cur = sf_ctx->melem__lb.first;
+ while (sf_ctx->melem__cur) {
+ MEM_freeN(sf_ctx->melem__cur->data);
+ sf_ctx->melem__cur = sf_ctx->melem__cur->next;
}
- BLI_freelistN(&melem__lb);
+ BLI_freelistN(&sf_ctx->melem__lb);
/*reset the block we're keeping*/
if (keep_first) {
- BLI_addtail(&melem__lb, first);
+ BLI_addtail(&sf_ctx->melem__lb, first);
memset(first->data, 0, MEM_ELEM_BLOCKSIZE);
}
else {
@@ -195,66 +187,57 @@ static void mem_element_reset(int keep_first)
}
}
- melem__cur= first;
- melem__offs= 0;
+ sf_ctx->melem__cur = first;
+ sf_ctx->melem__offs = 0;
}
-void BLI_end_edgefill(void)
+void BLI_end_edgefill(ScanFillContext *sf_ctx)
{
- mem_element_reset(TRUE);
+ mem_element_reset(sf_ctx, FALSE);
- fillvertbase.first= fillvertbase.last= 0;
- filledgebase.first= filledgebase.last= 0;
- fillfacebase.first= fillfacebase.last= 0;
-
- BLI_unlock_thread(LOCK_SCANFILL);
-}
-
-void BLI_scanfill_free(void)
-{
- mem_element_reset(FALSE);
+ sf_ctx->fillvertbase.first = sf_ctx->fillvertbase.last = NULL;
+ sf_ctx->filledgebase.first = sf_ctx->filledgebase.last = NULL;
+ sf_ctx->fillfacebase.first = sf_ctx->fillfacebase.last = NULL;
}
/* **** FILL ROUTINES *************************** */
-ScanFillVert *BLI_addfillvert(const float vec[3])
+ScanFillVert *BLI_addfillvert(ScanFillContext *sf_ctx, const float vec[3])
{
ScanFillVert *eve;
- eve= mem_element_new(sizeof(ScanFillVert));
- BLI_addtail(&fillvertbase, eve);
+ eve = mem_element_new(sf_ctx, sizeof(ScanFillVert));
+ BLI_addtail(&sf_ctx->fillvertbase, eve);
- eve->co[0] = vec[0];
- eve->co[1] = vec[1];
- eve->co[2] = vec[2];
+ copy_v3_v3(eve->co, vec);
return eve;
}
-ScanFillEdge *BLI_addfilledge(ScanFillVert *v1, ScanFillVert *v2)
+ScanFillEdge *BLI_addfilledge(ScanFillContext *sf_ctx, ScanFillVert *v1, ScanFillVert *v2)
{
ScanFillEdge *newed;
- newed= mem_element_new(sizeof(ScanFillEdge));
- BLI_addtail(&filledgebase, newed);
+ newed = mem_element_new(sf_ctx, sizeof(ScanFillEdge));
+ BLI_addtail(&sf_ctx->filledgebase, newed);
- newed->v1= v1;
- newed->v2= v2;
+ newed->v1 = v1;
+ newed->v2 = v2;
return newed;
}
-static void addfillface(ScanFillVert *v1, ScanFillVert *v2, ScanFillVert *v3)
+static void addfillface(ScanFillContext *sf_ctx, ScanFillVert *v1, ScanFillVert *v2, ScanFillVert *v3)
{
/* does not make edges */
ScanFillFace *evl;
- evl= mem_element_new(sizeof(ScanFillFace));
- BLI_addtail(&fillfacebase, evl);
+ evl = mem_element_new(sf_ctx, sizeof(ScanFillFace));
+ BLI_addtail(&sf_ctx->fillfacebase, evl);
- evl->v1= v1;
- evl->v2= v2;
- evl->v3= v3;
+ evl->v1 = v1;
+ evl->v2 = v2;
+ evl->v3 = v3;
}
static int boundisect(PolyFill *pf2, PolyFill *pf1)
@@ -262,60 +245,62 @@ static int boundisect(PolyFill *pf2, PolyFill *pf1)
/* has pf2 been touched (intersected) by pf1 ? with bounding box */
/* test first if polys exist */
- if (pf1->edges==0 || pf2->edges==0) return 0;
+ if (pf1->edges == 0 || pf2->edges == 0) return 0;
- if (pf2->max[cox] < pf1->min[cox] ) return 0;
- if (pf2->max[coy] < pf1->min[coy] ) return 0;
+ if (pf2->max_xy[0] < pf1->min_xy[0]) return 0;
+ if (pf2->max_xy[1] < pf1->min_xy[1]) return 0;
- if (pf2->min[cox] > pf1->max[cox] ) return 0;
- if (pf2->min[coy] > pf1->max[coy] ) return 0;
+ if (pf2->min_xy[0] > pf1->max_xy[0]) return 0;
+ if (pf2->min_xy[1] > pf1->max_xy[1]) return 0;
/* join */
- if (pf2->max[cox]<pf1->max[cox]) pf2->max[cox]= pf1->max[cox];
- if (pf2->max[coy]<pf1->max[coy]) pf2->max[coy]= pf1->max[coy];
+ if (pf2->max_xy[0] < pf1->max_xy[0]) pf2->max_xy[0] = pf1->max_xy[0];
+ if (pf2->max_xy[1] < pf1->max_xy[1]) pf2->max_xy[1] = pf1->max_xy[1];
- if (pf2->min[cox]>pf1->min[cox]) pf2->min[cox]= pf1->min[cox];
- if (pf2->min[coy]>pf1->min[coy]) pf2->min[coy]= pf1->min[coy];
+ if (pf2->min_xy[0] > pf1->min_xy[0]) pf2->min_xy[0] = pf1->min_xy[0];
+ if (pf2->min_xy[1] > pf1->min_xy[1]) pf2->min_xy[1] = pf1->min_xy[1];
return 1;
}
-static void mergepolysSimp(PolyFill *pf1, PolyFill *pf2) /* add pf2 to pf1 */
+static void mergepolysSimp(ScanFillContext *sf_ctx, PolyFill *pf1, PolyFill *pf2) /* add pf2 to pf1 */
{
ScanFillVert *eve;
ScanFillEdge *eed;
/* replace old poly numbers */
- eve= fillvertbase.first;
+ eve = sf_ctx->fillvertbase.first;
while (eve) {
if (eve->poly_nr == pf2->nr) eve->poly_nr = pf1->nr;
- eve= eve->next;
+ eve = eve->next;
}
- eed= filledgebase.first;
+ eed = sf_ctx->filledgebase.first;
while (eed) {
if (eed->poly_nr == pf2->nr) eed->poly_nr = pf1->nr;
- eed= eed->next;
+ eed = eed->next;
}
- pf1->verts+= pf2->verts;
- pf1->edges+= pf2->edges;
- pf2->verts= pf2->edges= 0;
- pf1->f= (pf1->f | pf2->f);
+ pf1->verts += pf2->verts;
+ pf1->edges += pf2->edges;
+ pf2->verts = pf2->edges = 0;
+ pf1->f = (pf1->f | pf2->f);
}
-static short testedgeside(const float v1[3], const float v2[3], const float v3[3])
+static short testedgeside(const float v1[2], const float v2[2], const float v3[2])
/* is v3 to the right of v1-v2 ? With exception: v3==v1 || v3==v2 */
{
float inp;
- inp= (v2[cox]-v1[cox])*(v1[coy]-v3[coy])
- +(v1[coy]-v2[coy])*(v1[cox]-v3[cox]);
+ inp = (v2[0] - v1[0]) * (v1[1] - v3[1]) +
+ (v1[1] - v2[1]) * (v1[0] - v3[0]);
- if (inp < 0.0f) return 0;
- else if (inp==0) {
- if (v1[cox]==v3[cox] && v1[coy]==v3[coy]) return 0;
- if (v2[cox]==v3[cox] && v2[coy]==v3[coy]) return 0;
+ if (inp < 0.0f) {
+ return 0;
+ }
+ else if (inp == 0) {
+ if (v1[0] == v3[0] && v1[1] == v3[1]) return 0;
+ if (v2[0] == v3[0] && v2[1] == v3[1]) return 0;
}
return 1;
}
@@ -324,73 +309,76 @@ static short addedgetoscanvert(ScanFillVertLink *sc, ScanFillEdge *eed)
{
/* find first edge to the right of eed, and insert eed before that */
ScanFillEdge *ed;
- float fac,fac1,x,y;
+ float fac, fac1, x, y;
- if (sc->first==0) {
- sc->first= sc->last= eed;
- eed->prev= eed->next=0;
+ if (sc->first == NULL) {
+ sc->first = sc->last = eed;
+ eed->prev = eed->next = NULL;
return 1;
}
- x= eed->v1->co[cox];
- y= eed->v1->co[coy];
+ x = eed->v1->xy[0];
+ y = eed->v1->xy[1];
- fac1= eed->v2->co[coy]-y;
- if (fac1==0.0f) {
- fac1= 1.0e10f*(eed->v2->co[cox]-x);
+ fac1 = eed->v2->xy[1] - y;
+ if (fac1 == 0.0f) {
+ fac1 = 1.0e10f * (eed->v2->xy[0] - x);
}
- else fac1= (x-eed->v2->co[cox])/fac1;
+ else fac1 = (x - eed->v2->xy[0]) / fac1;
- ed= sc->first;
- while (ed) {
+ for (ed = sc->first; ed; ed = ed->next) {
- if (ed->v2==eed->v2) return 0;
-
- fac= ed->v2->co[coy]-y;
- if (fac==0.0f) {
- fac= 1.0e10f*(ed->v2->co[cox]-x);
+ if (ed->v2 == eed->v2) {
+ return 0;
+ }
+ fac = ed->v2->xy[1] - y;
+ if (fac == 0.0f) {
+ fac = 1.0e10f * (ed->v2->xy[0] - x);
+ }
+ else {
+ fac = (x - ed->v2->xy[0]) / fac;
}
- else fac= (x-ed->v2->co[cox])/fac;
- if (fac>fac1) break;
- ed= ed->next;
+ if (fac > fac1) {
+ break;
+ }
}
if (ed) BLI_insertlinkbefore((ListBase *)&(sc->first), ed, eed);
- else BLI_addtail((ListBase *)&(sc->first),eed);
+ else BLI_addtail((ListBase *)&(sc->first), eed);
return 1;
}
-static ScanFillVertLink *addedgetoscanlist(ScanFillEdge *eed, int len)
+static ScanFillVertLink *addedgetoscanlist(ScanFillContext *sf_ctx, ScanFillEdge *eed, int len)
{
/* inserts edge at correct location in ScanFillVertLink list */
/* returns sc when edge already exists */
- ScanFillVertLink *sc,scsearch;
+ ScanFillVertLink *sc, scsearch;
ScanFillVert *eve;
/* which vert is left-top? */
- if (eed->v1->co[coy] == eed->v2->co[coy]) {
- if (eed->v1->co[cox] > eed->v2->co[cox]) {
- eve= eed->v1;
- eed->v1= eed->v2;
- eed->v2= eve;
+ if (eed->v1->xy[1] == eed->v2->xy[1]) {
+ if (eed->v1->xy[0] > eed->v2->xy[0]) {
+ eve = eed->v1;
+ eed->v1 = eed->v2;
+ eed->v2 = eve;
}
}
- else if (eed->v1->co[coy] < eed->v2->co[coy]) {
- eve= eed->v1;
- eed->v1= eed->v2;
- eed->v2= eve;
+ else if (eed->v1->xy[1] < eed->v2->xy[1]) {
+ eve = eed->v1;
+ eed->v1 = eed->v2;
+ eed->v2 = eve;
}
/* find location in list */
- scsearch.v1= eed->v1;
- sc= (ScanFillVertLink *)bsearch(&scsearch,scdata,len,
- sizeof(ScanFillVertLink), vergscdata);
+ scsearch.v1 = eed->v1;
+ sc = (ScanFillVertLink *)bsearch(&scsearch, sf_ctx->_scdata, len,
+ sizeof(ScanFillVertLink), vergscdata);
- if (sc==0) printf("Error in search edge: %p\n", (void *)eed);
- else if (addedgetoscanvert(sc,eed)==0) return sc;
+ if (sc == 0) printf("Error in search edge: %p\n", (void *)eed);
+ else if (addedgetoscanvert(sc, eed) == 0) return sc;
return 0;
}
@@ -398,230 +386,219 @@ static ScanFillVertLink *addedgetoscanlist(ScanFillEdge *eed, int len)
static short boundinsideEV(ScanFillEdge *eed, ScanFillVert *eve)
/* is eve inside boundbox eed */
{
- float minx,maxx,miny,maxy;
+ float minx, maxx, miny, maxy;
- if (eed->v1->co[cox]<eed->v2->co[cox]) {
- minx= eed->v1->co[cox];
- maxx= eed->v2->co[cox];
+ if (eed->v1->xy[0] < eed->v2->xy[0]) {
+ minx = eed->v1->xy[0];
+ maxx = eed->v2->xy[0];
}
else {
- minx= eed->v2->co[cox];
- maxx= eed->v1->co[cox];
+ minx = eed->v2->xy[0];
+ maxx = eed->v1->xy[0];
}
- if (eve->co[cox]>=minx && eve->co[cox]<=maxx) {
- if (eed->v1->co[coy]<eed->v2->co[coy]) {
- miny= eed->v1->co[coy];
- maxy= eed->v2->co[coy];
+ if (eve->xy[0] >= minx && eve->xy[0] <= maxx) {
+ if (eed->v1->xy[1] < eed->v2->xy[1]) {
+ miny = eed->v1->xy[1];
+ maxy = eed->v2->xy[1];
}
else {
- miny= eed->v2->co[coy];
- maxy= eed->v1->co[coy];
+ miny = eed->v2->xy[1];
+ maxy = eed->v1->xy[1];
+ }
+ if (eve->xy[1] >= miny && eve->xy[1] <= maxy) {
+ return 1;
}
- if (eve->co[coy]>=miny && eve->co[coy]<=maxy) return 1;
}
return 0;
}
-static void testvertexnearedge(void)
+static void testvertexnearedge(ScanFillContext *sf_ctx)
{
/* only vertices with ->h==1 are being tested for
* being close to an edge, if true insert */
ScanFillVert *eve;
- ScanFillEdge *eed,*ed1;
- float dist,vec1[2],vec2[2],vec3[2];
+ ScanFillEdge *eed, *ed1;
- eve= fillvertbase.first;
- while (eve) {
- if (eve->h==1) {
- vec3[0]= eve->co[cox];
- vec3[1]= eve->co[coy];
+ for (eve = sf_ctx->fillvertbase.first; eve; eve = eve->next) {
+ if (eve->h == 1) {
/* find the edge which has vertex eve */
- ed1= filledgebase.first;
+ ed1 = sf_ctx->filledgebase.first;
while (ed1) {
- if (ed1->v1==eve || ed1->v2==eve) break;
- ed1= ed1->next;
+ if (ed1->v1 == eve || ed1->v2 == eve) break;
+ ed1 = ed1->next;
}
- if (ed1->v1==eve) {
- ed1->v1= ed1->v2;
- ed1->v2= eve;
+ if (ed1->v1 == eve) {
+ ed1->v1 = ed1->v2;
+ ed1->v2 = eve;
}
- eed= filledgebase.first;
- while (eed) {
+
+ for (eed = sf_ctx->filledgebase.first; eed; eed = eed->next) {
if (eve != eed->v1 && eve != eed->v2 && eve->poly_nr == eed->poly_nr) {
- if (compare_v3v3(eve->co,eed->v1->co, COMPLIMIT)) {
- ed1->v2= eed->v1;
+ if (compare_v3v3(eve->co, eed->v1->co, SF_EPSILON)) {
+ ed1->v2 = eed->v1;
eed->v1->h++;
- eve->h= 0;
+ eve->h = 0;
break;
}
- else if (compare_v3v3(eve->co,eed->v2->co, COMPLIMIT)) {
- ed1->v2= eed->v2;
+ else if (compare_v3v3(eve->co, eed->v2->co, SF_EPSILON)) {
+ ed1->v2 = eed->v2;
eed->v2->h++;
- eve->h= 0;
+ eve->h = 0;
break;
}
else {
- vec1[0]= eed->v1->co[cox];
- vec1[1]= eed->v1->co[coy];
- vec2[0]= eed->v2->co[cox];
- vec2[1]= eed->v2->co[coy];
- if (boundinsideEV(eed,eve)) {
- dist= dist_to_line_v2(vec1,vec2,vec3);
- if (dist<(float)COMPLIMIT) {
+ if (boundinsideEV(eed, eve)) {
+ const float dist = dist_to_line_v2(eed->v1->xy, eed->v2->xy, eve->xy);
+ if (dist < SF_EPSILON) {
/* new edge */
- ed1= BLI_addfilledge(eed->v1, eve);
+ ed1 = BLI_addfilledge(sf_ctx, eed->v1, eve);
/* printf("fill: vertex near edge %x\n",eve); */
- ed1->f= 0;
+ ed1->f = 0;
ed1->poly_nr = eed->poly_nr;
- eed->v1= eve;
- eve->h= 3;
+ eed->v1 = eve;
+ eve->h = 3;
break;
}
}
}
}
- eed= eed->next;
}
}
- eve= eve->next;
}
}
-static void splitlist(ListBase *tempve, ListBase *temped, short nr)
+static void splitlist(ScanFillContext *sf_ctx, ListBase *tempve, ListBase *temped, short nr)
{
/* everything is in templist, write only poly nr to fillist */
- ScanFillVert *eve,*nextve;
- ScanFillEdge *eed,*nexted;
+ ScanFillVert *eve, *nextve;
+ ScanFillEdge *eed, *nexted;
- BLI_movelisttolist(tempve,&fillvertbase);
- BLI_movelisttolist(temped,&filledgebase);
+ BLI_movelisttolist(tempve, &sf_ctx->fillvertbase);
+ BLI_movelisttolist(temped, &sf_ctx->filledgebase);
- eve= tempve->first;
+ eve = tempve->first;
while (eve) {
- nextve= eve->next;
+ nextve = eve->next;
if (eve->poly_nr == nr) {
- BLI_remlink(tempve,eve);
- BLI_addtail(&fillvertbase,eve);
+ BLI_remlink(tempve, eve);
+ BLI_addtail(&sf_ctx->fillvertbase, eve);
}
- eve= nextve;
+ eve = nextve;
}
- eed= temped->first;
+ eed = temped->first;
while (eed) {
- nexted= eed->next;
- if (eed->poly_nr==nr) {
- BLI_remlink(temped,eed);
- BLI_addtail(&filledgebase,eed);
+ nexted = eed->next;
+ if (eed->poly_nr == nr) {
+ BLI_remlink(temped, eed);
+ BLI_addtail(&sf_ctx->filledgebase, eed);
}
- eed= nexted;
+ eed = nexted;
}
}
-static int scanfill(PolyFill *pf)
+static int scanfill(ScanFillContext *sf_ctx, PolyFill *pf)
{
ScanFillVertLink *sc = NULL, *sc1;
- ScanFillVert *eve,*v1,*v2,*v3;
- ScanFillEdge *eed,*nexted,*ed1,*ed2,*ed3;
- float miny = 0.0;
- int a,b,verts, maxface, totface;
- short nr, test, twoconnected=0;
+ ScanFillVert *eve, *v1, *v2, *v3;
+ ScanFillEdge *eed, *nexted, *ed1, *ed2, *ed3;
+ int a, b, verts, maxface, totface;
+ short nr, test, twoconnected = 0;
- nr= pf->nr;
+ nr = pf->nr;
/* PRINTS */
#if 0
- verts= pf->verts;
- eve= fillvertbase.first;
+ verts = pf->verts;
+ eve = sf_ctx->fillvertbase.first;
while (eve) {
- printf("vert: %x co: %f %f\n",eve,eve->co[cox],eve->co[coy]);
- eve= eve->next;
+ printf("vert: %x co: %f %f\n", eve, eve->xy[0], eve->xy[1]);
+ eve = eve->next;
}
- eed= filledgebase.first;
+ eed = sf_ctx->filledgebase.first;
while (eed) {
- printf("edge: %x verts: %x %x\n",eed,eed->v1,eed->v2);
- eed= eed->next;
+ printf("edge: %x verts: %x %x\n", eed, eed->v1, eed->v2);
+ eed = eed->next;
}
#endif
/* STEP 0: remove zero sized edges */
- eed= filledgebase.first;
+ eed = sf_ctx->filledgebase.first;
while (eed) {
- if (eed->v1->co[cox]==eed->v2->co[cox]) {
- if (eed->v1->co[coy]==eed->v2->co[coy]) {
- if (eed->v1->f==255 && eed->v2->f!=255) {
- eed->v2->f= 255;
- eed->v2->tmp.v= eed->v1->tmp.v;
- }
- else if (eed->v2->f==255 && eed->v1->f!=255) {
- eed->v1->f= 255;
- eed->v1->tmp.v= eed->v2->tmp.v;
- }
- else if (eed->v2->f==255 && eed->v1->f==255) {
- eed->v1->tmp.v= eed->v2->tmp.v;
- }
- else {
- eed->v2->f= 255;
- eed->v2->tmp.v = eed->v1;
- }
+ if (equals_v2v2(eed->v1->xy, eed->v2->xy)) {
+ if (eed->v1->f == SF_VERT_ZERO_LEN && eed->v2->f != SF_VERT_ZERO_LEN) {
+ eed->v2->f = SF_VERT_ZERO_LEN;
+ eed->v2->tmp.v = eed->v1->tmp.v;
+ }
+ else if (eed->v2->f == SF_VERT_ZERO_LEN && eed->v1->f != SF_VERT_ZERO_LEN) {
+ eed->v1->f = SF_VERT_ZERO_LEN;
+ eed->v1->tmp.v = eed->v2->tmp.v;
+ }
+ else if (eed->v2->f == SF_VERT_ZERO_LEN && eed->v1->f == SF_VERT_ZERO_LEN) {
+ eed->v1->tmp.v = eed->v2->tmp.v;
+ }
+ else {
+ eed->v2->f = SF_VERT_ZERO_LEN;
+ eed->v2->tmp.v = eed->v1;
}
}
- eed= eed->next;
+ eed = eed->next;
}
/* STEP 1: make using FillVert and FillEdge lists a sorted
* ScanFillVertLink list
*/
- sc= scdata= (ScanFillVertLink *)MEM_callocN(pf->verts*sizeof(ScanFillVertLink),"Scanfill1");
- eve= fillvertbase.first;
- verts= 0;
+ sc = sf_ctx->_scdata = (ScanFillVertLink *)MEM_callocN(pf->verts * sizeof(ScanFillVertLink), "Scanfill1");
+ eve = sf_ctx->fillvertbase.first;
+ verts = 0;
while (eve) {
if (eve->poly_nr == nr) {
- if (eve->f != 255) {
+ if (eve->f != SF_VERT_ZERO_LEN) {
verts++;
- eve->f= 0; /* flag for connectedges later on */
- sc->v1= eve;
+ eve->f = 0; /* flag for connectedges later on */
+ sc->v1 = eve;
sc++;
}
}
- eve= eve->next;
+ eve = eve->next;
}
- qsort(scdata, verts, sizeof(ScanFillVertLink), vergscdata);
+ qsort(sf_ctx->_scdata, verts, sizeof(ScanFillVertLink), vergscdata);
- eed= filledgebase.first;
+ eed = sf_ctx->filledgebase.first;
while (eed) {
- nexted= eed->next;
- BLI_remlink(&filledgebase,eed);
+ nexted = eed->next;
+ BLI_remlink(&sf_ctx->filledgebase, eed);
/* This code is for handling zero-length edges that get
* collapsed in step 0. It was removed for some time to
* fix trunk bug #4544, so if that comes back, this code
* may need some work, or there will have to be a better
* fix to #4544. */
- if (eed->v1->f==255) {
- v1= eed->v1;
- while ((eed->v1->f == 255) && (eed->v1->tmp.v != v1))
+ if (eed->v1->f == SF_VERT_ZERO_LEN) {
+ v1 = eed->v1;
+ while ((eed->v1->f == SF_VERT_ZERO_LEN) && (eed->v1->tmp.v != v1) && (eed->v1 != eed->v1->tmp.v))
eed->v1 = eed->v1->tmp.v;
}
- if (eed->v2->f==255) {
- v2= eed->v2;
- while ((eed->v2->f == 255) && (eed->v2->tmp.v != v2))
+ if (eed->v2->f == SF_VERT_ZERO_LEN) {
+ v2 = eed->v2;
+ while ((eed->v2->f == SF_VERT_ZERO_LEN) && (eed->v2->tmp.v != v2) && (eed->v2 != eed->v2->tmp.v))
eed->v2 = eed->v2->tmp.v;
}
- if (eed->v1!=eed->v2) addedgetoscanlist(eed,verts);
+ if (eed->v1 != eed->v2) addedgetoscanlist(sf_ctx, eed, verts);
- eed= nexted;
+ eed = nexted;
}
#if 0
- sc= scdata;
- for (a=0;a<verts;a++) {
- printf("\nscvert: %x\n",sc->v1);
- eed= sc->first;
+ sc = scdata;
+ for (a = 0; a < verts; a++) {
+ printf("\nscvert: %x\n", sc->v1);
+ eed = sc->first;
while (eed) {
- printf(" ed %x %x %x\n",eed,eed->v1,eed->v2);
- eed= eed->next;
+ printf(" ed %x %x %x\n", eed, eed->v1, eed->v2);
+ eed = eed->next;
}
sc++;
}
@@ -630,70 +607,71 @@ static int scanfill(PolyFill *pf)
/* STEP 2: FILL LOOP */
- if (pf->f==0) twoconnected= 1;
+ if (pf->f == 0) twoconnected = 1;
/* (temporal) security: never much more faces than vertices */
- totface= 0;
- maxface= 2*verts; /* 2*verts: based at a filled circle within a triangle */
+ totface = 0;
+ maxface = 2 * verts; /* 2*verts: based at a filled circle within a triangle */
- sc= scdata;
- for (a=0;a<verts;a++) {
+ sc = sf_ctx->_scdata;
+ for (a = 0; a < verts; a++) {
/* printf("VERTEX %d %x\n",a,sc->v1); */
- ed1= sc->first;
- while (ed1) { /* set connectflags */
- nexted= ed1->next;
- if (ed1->v1->h==1 || ed1->v2->h==1) {
- BLI_remlink((ListBase *)&(sc->first),ed1);
- BLI_addtail(&filledgebase,ed1);
- if (ed1->v1->h>1) ed1->v1->h--;
- if (ed1->v2->h>1) ed1->v2->h--;
+ ed1 = sc->first;
+ while (ed1) { /* set connectflags */
+ nexted = ed1->next;
+ if (ed1->v1->h == 1 || ed1->v2->h == 1) {
+ BLI_remlink((ListBase *)&(sc->first), ed1);
+ BLI_addtail(&sf_ctx->filledgebase, ed1);
+ if (ed1->v1->h > 1) ed1->v1->h--;
+ if (ed1->v2->h > 1) ed1->v2->h--;
}
- else ed1->v2->f= 1;
+ else ed1->v2->f = SF_VERT_UNKNOWN;
- ed1= nexted;
+ ed1 = nexted;
}
- while (sc->first) { /* for as long there are edges */
- ed1= sc->first;
- ed2= ed1->next;
+ while (sc->first) { /* for as long there are edges */
+ ed1 = sc->first;
+ ed2 = ed1->next;
/* commented out... the ESC here delivers corrupted memory (and doesnt work during grab) */
/* if (callLocalInterruptCallBack()) break; */
- if (totface>maxface) {
+ if (totface > maxface) {
/* printf("Fill error: endless loop. Escaped at vert %d, tot: %d.\n", a, verts); */
- a= verts;
+ a = verts;
break;
}
- if (ed2==0) {
- sc->first=sc->last= 0;
+ if (ed2 == 0) {
+ sc->first = sc->last = NULL;
/* printf("just 1 edge to vert\n"); */
- BLI_addtail(&filledgebase,ed1);
- ed1->v2->f= 0;
+ BLI_addtail(&sf_ctx->filledgebase, ed1);
+ ed1->v2->f = 0;
ed1->v1->h--;
ed1->v2->h--;
}
else {
/* test rest of vertices */
- v1= ed1->v2;
- v2= ed1->v1;
- v3= ed2->v2;
+ float miny;
+ v1 = ed1->v2;
+ v2 = ed1->v1;
+ v3 = ed2->v2;
/* this happens with a serial of overlapping edges */
- if (v1==v2 || v2==v3) break;
+ if (v1 == v2 || v2 == v3) break;
/* printf("test verts %x %x %x\n",v1,v2,v3); */
- miny = ( (v1->co[coy])<(v3->co[coy]) ? (v1->co[coy]) : (v3->co[coy]) );
- /* miny= MIN2(v1->co[coy],v3->co[coy]); */
- sc1= sc+1;
- test= 0;
-
- for (b=a+1;b<verts;b++) {
- if (sc1->v1->f==0) {
- if (sc1->v1->co[coy] <= miny) break;
-
- if (testedgeside(v1->co,v2->co,sc1->v1->co))
- if (testedgeside(v2->co,v3->co,sc1->v1->co))
- if (testedgeside(v3->co,v1->co,sc1->v1->co)) {
+ miny = minf(v1->xy[1], v3->xy[1]);
+ /* miny= MIN2(v1->xy[1],v3->xy[1]); */
+ sc1 = sc + 1;
+ test = 0;
+
+ for (b = a + 1; b < verts; b++) {
+ if (sc1->v1->f == 0) {
+ if (sc1->v1->xy[1] <= miny) break;
+
+ if (testedgeside(v1->xy, v2->xy, sc1->v1->xy))
+ if (testedgeside(v2->xy, v3->xy, sc1->v1->xy))
+ if (testedgeside(v3->xy, v1->xy, sc1->v1->xy)) {
/* point in triangle */
- test= 1;
+ test = 1;
break;
}
}
@@ -703,96 +681,102 @@ static int scanfill(PolyFill *pf)
/* make new edge, and start over */
/* printf("add new edge %x %x and start again\n",v2,sc1->v1); */
- ed3= BLI_addfilledge(v2, sc1->v1);
- BLI_remlink(&filledgebase, ed3);
+ ed3 = BLI_addfilledge(sf_ctx, v2, sc1->v1);
+ BLI_remlink(&sf_ctx->filledgebase, ed3);
BLI_insertlinkbefore((ListBase *)&(sc->first), ed2, ed3);
- ed3->v2->f= 1;
- ed3->f= 2;
+ ed3->v2->f = SF_VERT_UNKNOWN;
+ ed3->f = SF_EDGE_UNKNOWN;
ed3->v1->h++;
ed3->v2->h++;
}
else {
/* new triangle */
/* printf("add face %x %x %x\n",v1,v2,v3); */
- addfillface(v1, v2, v3);
+ addfillface(sf_ctx, v1, v2, v3);
totface++;
- BLI_remlink((ListBase *)&(sc->first),ed1);
- BLI_addtail(&filledgebase,ed1);
- ed1->v2->f= 0;
+ BLI_remlink((ListBase *)&(sc->first), ed1);
+ BLI_addtail(&sf_ctx->filledgebase, ed1);
+ ed1->v2->f = 0;
ed1->v1->h--;
ed1->v2->h--;
/* ed2 can be removed when it's a boundary edge */
- if ((ed2->f == 0 && twoconnected) || (ed2->f == FILLBOUNDARY)) {
- BLI_remlink((ListBase *)&(sc->first),ed2);
- BLI_addtail(&filledgebase,ed2);
- ed2->v2->f= 0;
+ if ((ed2->f == 0 && twoconnected) || (ed2->f == SF_EDGE_BOUNDARY)) {
+ BLI_remlink((ListBase *)&(sc->first), ed2);
+ BLI_addtail(&sf_ctx->filledgebase, ed2);
+ ed2->v2->f = 0;
ed2->v1->h--;
ed2->v2->h--;
}
/* new edge */
- ed3= BLI_addfilledge(v1, v3);
- BLI_remlink(&filledgebase, ed3);
- ed3->f= 2;
+ ed3 = BLI_addfilledge(sf_ctx, v1, v3);
+ BLI_remlink(&sf_ctx->filledgebase, ed3);
+ ed3->f = SF_EDGE_UNKNOWN;
ed3->v1->h++;
ed3->v2->h++;
/* printf("add new edge %x %x\n",v1,v3); */
- sc1= addedgetoscanlist(ed3, verts);
+ sc1 = addedgetoscanlist(sf_ctx, ed3, verts);
- if (sc1) { /* ed3 already exists: remove if a boundary */
+ if (sc1) { /* ed3 already exists: remove if a boundary */
/* printf("Edge exists\n"); */
ed3->v1->h--;
ed3->v2->h--;
- ed3= sc1->first;
+ ed3 = sc1->first;
while (ed3) {
- if ( (ed3->v1==v1 && ed3->v2==v3) || (ed3->v1==v3 && ed3->v2==v1) ) {
- if (twoconnected || ed3->f==FILLBOUNDARY) {
- BLI_remlink((ListBase *)&(sc1->first),ed3);
- BLI_addtail(&filledgebase,ed3);
+ if ( (ed3->v1 == v1 && ed3->v2 == v3) || (ed3->v1 == v3 && ed3->v2 == v1) ) {
+ if (twoconnected || ed3->f == SF_EDGE_BOUNDARY) {
+ BLI_remlink((ListBase *)&(sc1->first), ed3);
+ BLI_addtail(&sf_ctx->filledgebase, ed3);
ed3->v1->h--;
ed3->v2->h--;
}
break;
}
- ed3= ed3->next;
+ ed3 = ed3->next;
}
}
}
}
/* test for loose edges */
- ed1= sc->first;
+ ed1 = sc->first;
while (ed1) {
- nexted= ed1->next;
- if (ed1->v1->h<2 || ed1->v2->h<2) {
- BLI_remlink((ListBase *)&(sc->first),ed1);
- BLI_addtail(&filledgebase,ed1);
- if (ed1->v1->h>1) ed1->v1->h--;
- if (ed1->v2->h>1) ed1->v2->h--;
+ nexted = ed1->next;
+ if (ed1->v1->h < 2 || ed1->v2->h < 2) {
+ BLI_remlink((ListBase *)&(sc->first), ed1);
+ BLI_addtail(&sf_ctx->filledgebase, ed1);
+ if (ed1->v1->h > 1) ed1->v1->h--;
+ if (ed1->v2->h > 1) ed1->v2->h--;
}
- ed1= nexted;
+ ed1 = nexted;
}
}
sc++;
}
- MEM_freeN(scdata);
+ MEM_freeN(sf_ctx->_scdata);
+ sf_ctx->_scdata = NULL;
return totface;
}
-int BLI_begin_edgefill(void)
+int BLI_begin_edgefill(ScanFillContext *sf_ctx)
{
- BLI_lock_thread(LOCK_SCANFILL);
+ memset(sf_ctx, 0, sizeof(*sf_ctx));
return 1;
}
-int BLI_edgefill(short mat_nr)
+int BLI_edgefill(ScanFillContext *sf_ctx, const short do_quad_tri_speedup)
+{
+ return BLI_edgefill_ex(sf_ctx, do_quad_tri_speedup, NULL);
+}
+
+int BLI_edgefill_ex(ScanFillContext *sf_ctx, const short do_quad_tri_speedup, const float nor_proj[3])
{
/*
* - fill works with its own lists, so create that first (no faces!)
@@ -804,160 +788,158 @@ int BLI_edgefill(short mat_nr)
*/
ListBase tempve, temped;
ScanFillVert *eve;
- ScanFillEdge *eed,*nexted;
- PolyFill *pflist,*pf;
- float limit, *minp, *maxp, *v1, *v2, norm[3], len;
- short a,c,poly=0,ok=0,toggle=0;
- int totfaces= 0; /* total faces added */
+ ScanFillEdge *eed, *nexted;
+ PolyFill *pflist, *pf;
+ float *min_xy_p, *max_xy_p;
+ short a, c, poly = 0, ok = 0, toggle = 0;
+ int totfaces = 0; /* total faces added */
+ int co_x, co_y;
/* reset variables */
- eve= fillvertbase.first;
+ eve = sf_ctx->fillvertbase.first;
a = 0;
while (eve) {
- eve->f= 0;
- eve->poly_nr= 0;
- eve->h= 0;
- eve= eve->next;
+ eve->f = 0;
+ eve->poly_nr = 0;
+ eve->h = 0;
+ eve = eve->next;
a += 1;
}
- if (a == 3 && (mat_nr & 2)) {
- eve = fillvertbase.first;
+ if (do_quad_tri_speedup && (a == 3)) {
+ eve = sf_ctx->fillvertbase.first;
- addfillface(eve, eve->next, eve->next->next);
+ addfillface(sf_ctx, eve, eve->next, eve->next->next);
return 1;
}
- else if (a == 4 && (mat_nr & 2)) {
+ else if (do_quad_tri_speedup && (a == 4)) {
float vec1[3], vec2[3];
- eve = fillvertbase.first;
+ eve = sf_ctx->fillvertbase.first;
/* no need to check 'eve->next->next->next' is valid, already counted */
- if (1) { //BMESH_TODO) {
- /*use shortest diagonal for quad*/
- sub_v3_v3v3(vec1, eve->co, eve->next->next->co);
- sub_v3_v3v3(vec2, eve->next->co, eve->next->next->next->co);
-
- if (dot_v3v3(vec1, vec1) < dot_v3v3(vec2, vec2)) {
- addfillface(eve, eve->next, eve->next->next);
- addfillface(eve->next->next, eve->next->next->next, eve);
- }
- else {
- addfillface(eve->next, eve->next->next, eve->next->next->next);
- addfillface(eve->next->next->next, eve, eve->next);
- }
+ /* use shortest diagonal for quad */
+ sub_v3_v3v3(vec1, eve->co, eve->next->next->co);
+ sub_v3_v3v3(vec2, eve->next->co, eve->next->next->next->co);
+
+ if (dot_v3v3(vec1, vec1) < dot_v3v3(vec2, vec2)) {
+ addfillface(sf_ctx, eve, eve->next, eve->next->next);
+ addfillface(sf_ctx, eve->next->next, eve->next->next->next, eve);
}
else {
- addfillface(eve, eve->next, eve->next->next);
- addfillface(eve->next->next, eve->next->next->next, eve);
+ addfillface(sf_ctx, eve->next, eve->next->next, eve->next->next->next);
+ addfillface(sf_ctx, eve->next->next->next, eve, eve->next);
}
return 2;
}
/* first test vertices if they are in edges */
/* including resetting of flags */
- eed= filledgebase.first;
+ eed = sf_ctx->filledgebase.first;
while (eed) {
- eed->poly_nr= 0;
- eed->v1->f= 1;
- eed->v2->f= 1;
+ eed->poly_nr = 0;
+ eed->v1->f = SF_VERT_UNKNOWN;
+ eed->v2->f = SF_VERT_UNKNOWN;
- eed= eed->next;
+ eed = eed->next;
}
- eve= fillvertbase.first;
+ eve = sf_ctx->fillvertbase.first;
while (eve) {
- if (eve->f & 1) {
- ok=1;
+ if (eve->f & SF_VERT_UNKNOWN) {
+ ok = 1;
break;
}
- eve= eve->next;
+ eve = eve->next;
}
- if (ok==0) return 0;
-
- /* NEW NEW! define projection: with 'best' normal */
- /* just use the first three different vertices */
-
- /* THIS PART STILL IS PRETTY WEAK! (ton) */
-
- eve= fillvertbase.last;
- len= 0.0;
- v1= eve->co;
- v2= 0;
- eve= fillvertbase.first;
- limit = 1e-8f;
+ if (ok == 0) {
+ return 0;
+ }
+ else {
+ float n[3];
- while (eve) {
- if (v2) {
- if (!compare_v3v3(v2, eve->co, COMPLIMIT)) {
- float inner = angle_v3v3v3(v1, v2, eve->co);
- inner = MIN2(fabsf(inner), fabsf(M_PI - inner));
-
- if (inner > limit) {
- limit = inner;
- len= normal_tri_v3(norm, v1, v2, eve->co);
+ if (nor_proj) {
+ copy_v3_v3(n, nor_proj);
+ }
+ else {
+ /* define projection: with 'best' normal */
+ /* Newell's Method */
+ /* Similar code used elsewhere, but this checks for double ups
+ * which historically this function supports so better not change */
+ float *v_prev;
+
+ zero_v3(n);
+ eve = sf_ctx->fillvertbase.last;
+ v_prev = eve->co;
+
+ for (eve = sf_ctx->fillvertbase.first; eve; eve = eve->next) {
+ if (LIKELY(!compare_v3v3(v_prev, eve->co, SF_EPSILON))) {
+ add_newell_cross_v3_v3v3(n, v_prev, eve->co);
+ v_prev = eve->co;
}
}
}
- else if (!compare_v3v3(v1, eve->co, COMPLIMIT))
- v2= eve->co;
- eve= eve->next;
- }
+ if (UNLIKELY(normalize_v3(n) == 0.0f)) {
+ return 0;
+ }
- if (len==0.0f) return 0; /* no fill possible */
+ axis_dominant_v3(&co_x, &co_y, n);
+ }
- axis_dominant_v3(&cox, &coy, norm);
/* STEP 1: COUNT POLYS */
- eve= fillvertbase.first;
+ eve = sf_ctx->fillvertbase.first;
while (eve) {
+ eve->xy[0] = eve->co[co_x];
+ eve->xy[1] = eve->co[co_y];
+
/* get first vertex with no poly number */
- if (eve->poly_nr==0) {
+ if (eve->poly_nr == 0) {
poly++;
/* now a sortof select connected */
- ok= 1;
+ ok = 1;
eve->poly_nr = poly;
while (ok) {
- ok= 0;
+ ok = 0;
toggle++;
- if (toggle & 1) eed= filledgebase.first;
- else eed= filledgebase.last;
+ if (toggle & 1) eed = sf_ctx->filledgebase.first;
+ else eed = sf_ctx->filledgebase.last;
while (eed) {
if (eed->v1->poly_nr == 0 && eed->v2->poly_nr == poly) {
eed->v1->poly_nr = poly;
- eed->poly_nr= poly;
- ok= 1;
+ eed->poly_nr = poly;
+ ok = 1;
}
else if (eed->v2->poly_nr == 0 && eed->v1->poly_nr == poly) {
eed->v2->poly_nr = poly;
- eed->poly_nr= poly;
- ok= 1;
+ eed->poly_nr = poly;
+ ok = 1;
}
else if (eed->poly_nr == 0) {
if (eed->v1->poly_nr == poly && eed->v2->poly_nr == poly) {
- eed->poly_nr= poly;
- ok= 1;
+ eed->poly_nr = poly;
+ ok = 1;
}
}
- if (toggle & 1) eed= eed->next;
- else eed= eed->prev;
+ if (toggle & 1) eed = eed->next;
+ else eed = eed->prev;
}
}
}
- eve= eve->next;
+ eve = eve->next;
}
/* printf("amount of poly's: %d\n",poly); */
/* STEP 2: remove loose edges and strings of edges */
- eed= filledgebase.first;
+ eed = sf_ctx->filledgebase.first;
while (eed) {
- if (eed->v1->h++ >250) break;
- if (eed->v2->h++ >250) break;
- eed= eed->next;
+ if (eed->v1->h++ > 250) break;
+ if (eed->v2->h++ > 250) break;
+ eed = eed->next;
}
if (eed) {
/* otherwise it's impossible to be sure you can clear vertices */
@@ -966,33 +948,33 @@ int BLI_edgefill(short mat_nr)
}
/* does it only for vertices with ->h==1 */
- testvertexnearedge();
+ testvertexnearedge(sf_ctx);
- ok= 1;
+ ok = 1;
while (ok) {
- ok= 0;
+ ok = 0;
toggle++;
- if (toggle & 1) eed= filledgebase.first;
- else eed= filledgebase.last;
+ if (toggle & 1) eed = sf_ctx->filledgebase.first;
+ else eed = sf_ctx->filledgebase.last;
while (eed) {
- if (toggle & 1) nexted= eed->next;
- else nexted= eed->prev;
- if (eed->v1->h==1) {
+ if (toggle & 1) nexted = eed->next;
+ else nexted = eed->prev;
+ if (eed->v1->h == 1) {
eed->v2->h--;
- BLI_remlink(&fillvertbase,eed->v1);
- BLI_remlink(&filledgebase,eed);
- ok= 1;
+ BLI_remlink(&sf_ctx->fillvertbase, eed->v1);
+ BLI_remlink(&sf_ctx->filledgebase, eed);
+ ok = 1;
}
- else if (eed->v2->h==1) {
+ else if (eed->v2->h == 1) {
eed->v1->h--;
- BLI_remlink(&fillvertbase,eed->v2);
- BLI_remlink(&filledgebase,eed);
- ok= 1;
+ BLI_remlink(&sf_ctx->fillvertbase, eed->v2);
+ BLI_remlink(&sf_ctx->filledgebase, eed);
+ ok = 1;
}
- eed= nexted;
+ eed = nexted;
}
}
- if (filledgebase.first==0) {
+ if (sf_ctx->filledgebase.first == 0) {
/* printf("All edges removed\n"); */
return 0;
}
@@ -1010,33 +992,33 @@ int BLI_edgefill(short mat_nr)
/* STEP 3: MAKE POLYFILL STRUCT */
- pflist= (PolyFill *)MEM_callocN(poly*sizeof(PolyFill),"edgefill");
- pf= pflist;
- for (a=1;a<=poly;a++) {
- pf->nr= a;
- pf->min[0]=pf->min[1]=pf->min[2]= 1.0e20;
- pf->max[0]=pf->max[1]=pf->max[2]= -1.0e20;
+ pflist = (PolyFill *)MEM_callocN(poly * sizeof(PolyFill), "edgefill");
+ pf = pflist;
+ for (a = 1; a <= poly; a++) {
+ pf->nr = a;
+ pf->min_xy[0] = pf->min_xy[1] = 1.0e20;
+ pf->max_xy[0] = pf->max_xy[1] = -1.0e20;
pf++;
}
- eed= filledgebase.first;
+ eed = sf_ctx->filledgebase.first;
while (eed) {
- pflist[eed->poly_nr-1].edges++;
- eed= eed->next;
+ pflist[eed->poly_nr - 1].edges++;
+ eed = eed->next;
}
- eve= fillvertbase.first;
+ eve = sf_ctx->fillvertbase.first;
while (eve) {
- pflist[eve->poly_nr-1].verts++;
- minp= pflist[eve->poly_nr-1].min;
- maxp= pflist[eve->poly_nr-1].max;
+ pflist[eve->poly_nr - 1].verts++;
+ min_xy_p = pflist[eve->poly_nr - 1].min_xy;
+ max_xy_p = pflist[eve->poly_nr - 1].max_xy;
- minp[cox]= (minp[cox])<(eve->co[cox]) ? (minp[cox]) : (eve->co[cox]);
- minp[coy]= (minp[coy])<(eve->co[coy]) ? (minp[coy]) : (eve->co[coy]);
- maxp[cox]= (maxp[cox])>(eve->co[cox]) ? (maxp[cox]) : (eve->co[cox]);
- maxp[coy]= (maxp[coy])>(eve->co[coy]) ? (maxp[coy]) : (eve->co[coy]);
- if (eve->h > 2) pflist[eve->poly_nr-1].f = 1;
+ min_xy_p[0] = (min_xy_p[0]) < (eve->xy[0]) ? (min_xy_p[0]) : (eve->xy[0]);
+ min_xy_p[1] = (min_xy_p[1]) < (eve->xy[1]) ? (min_xy_p[1]) : (eve->xy[1]);
+ max_xy_p[0] = (max_xy_p[0]) > (eve->xy[0]) ? (max_xy_p[0]) : (eve->xy[0]);
+ max_xy_p[1] = (max_xy_p[1]) > (eve->xy[1]) ? (max_xy_p[1]) : (eve->xy[1]);
+ if (eve->h > 2) pflist[eve->poly_nr - 1].f = 1;
- eve= eve->next;
+ eve = eve->next;
}
/* STEP 4: FIND HOLES OR BOUNDS, JOIN THEM
@@ -1044,40 +1026,40 @@ int BLI_edgefill(short mat_nr)
* the edgefill itself has good auto-hole detection)
* WATCH IT: ONLY WORKS WITH SORTED POLYS!!! */
- if (poly>1) {
+ if (poly > 1) {
short *polycache, *pc;
/* so, sort first */
qsort(pflist, poly, sizeof(PolyFill), vergpoly);
#if 0
- pf= pflist;
- for (a=1;a<=poly;a++) {
- printf("poly:%d edges:%d verts:%d flag: %d\n",a,pf->edges,pf->verts,pf->f);
+ pf = pflist;
+ for (a = 1; a <= poly; a++) {
+ printf("poly:%d edges:%d verts:%d flag: %d\n", a, pf->edges, pf->verts, pf->f);
PRINT2(f, f, pf->min[0], pf->min[1]);
pf++;
}
#endif
- polycache= pc= MEM_callocN(sizeof(short)*poly, "polycache");
- pf= pflist;
- for (a=0; a<poly; a++, pf++) {
- for (c=a+1;c<poly;c++) {
+ polycache = pc = MEM_callocN(sizeof(short) * poly, "polycache");
+ pf = pflist;
+ for (a = 0; a < poly; a++, pf++) {
+ for (c = a + 1; c < poly; c++) {
/* if 'a' inside 'c': join (bbox too)
* Careful: 'a' can also be inside another poly.
*/
- if (boundisect(pf, pflist+c)) {
- *pc= c;
+ if (boundisect(pf, pflist + c)) {
+ *pc = c;
pc++;
}
/* only for optimize! */
- /* else if (pf->max[cox] < (pflist+c)->min[cox]) break; */
+ /* else if (pf->max_xy[0] < (pflist+c)->min[cox]) break; */
}
- while (pc!=polycache) {
+ while (pc != polycache) {
pc--;
- mergepolysSimp(pf, pflist+ *pc);
+ mergepolysSimp(sf_ctx, pf, pflist + *pc);
}
}
MEM_freeN(polycache);
@@ -1085,32 +1067,32 @@ int BLI_edgefill(short mat_nr)
#if 0
printf("after merge\n");
- pf= pflist;
- for (a=1;a<=poly;a++) {
- printf("poly:%d edges:%d verts:%d flag: %d\n",a,pf->edges,pf->verts,pf->f);
+ pf = pflist;
+ for (a = 1; a <= poly; a++) {
+ printf("poly:%d edges:%d verts:%d flag: %d\n", a, pf->edges, pf->verts, pf->f);
pf++;
}
#endif
/* STEP 5: MAKE TRIANGLES */
- tempve.first= fillvertbase.first;
- tempve.last= fillvertbase.last;
- temped.first= filledgebase.first;
- temped.last= filledgebase.last;
- fillvertbase.first=fillvertbase.last= 0;
- filledgebase.first=filledgebase.last= 0;
-
- pf= pflist;
- for (a=0;a<poly;a++) {
- if (pf->edges>1) {
- splitlist(&tempve,&temped,pf->nr);
- totfaces += scanfill(pf);
+ tempve.first = sf_ctx->fillvertbase.first;
+ tempve.last = sf_ctx->fillvertbase.last;
+ temped.first = sf_ctx->filledgebase.first;
+ temped.last = sf_ctx->filledgebase.last;
+ sf_ctx->fillvertbase.first = sf_ctx->fillvertbase.last = NULL;
+ sf_ctx->filledgebase.first = sf_ctx->filledgebase.last = NULL;
+
+ pf = pflist;
+ for (a = 0; a < poly; a++) {
+ if (pf->edges > 1) {
+ splitlist(sf_ctx, &tempve, &temped, pf->nr);
+ totfaces += scanfill(sf_ctx, pf);
}
pf++;
}
- BLI_movelisttolist(&fillvertbase,&tempve);
- BLI_movelisttolist(&filledgebase,&temped);
+ BLI_movelisttolist(&sf_ctx->fillvertbase, &tempve);
+ BLI_movelisttolist(&sf_ctx->filledgebase, &temped);
/* FREE */
diff --git a/source/blender/blenlib/intern/storage.c b/source/blender/blenlib/intern/storage.c
index b0c0f106f06..f4070f76519 100644
--- a/source/blender/blenlib/intern/storage.c
+++ b/source/blender/blenlib/intern/storage.c
@@ -68,20 +68,17 @@
#include <fcntl.h>
#include <string.h> /* strcpy etc.. */
-#ifndef WIN32
-#include <sys/ioctl.h>
-#include <unistd.h> /* */
-#include <pwd.h>
-#endif
-
#ifdef WIN32
-#include <io.h>
-#include <direct.h>
-#include "BLI_winstuff.h"
-#include "utfconv.h"
+# include <io.h>
+# include <direct.h>
+# include "BLI_winstuff.h"
+# include "utfconv.h"
+#else
+# include <sys/ioctl.h>
+# include <unistd.h>
+# include <pwd.h>
#endif
-
/* lib includes */
#include "MEM_guardedalloc.h"
@@ -554,6 +551,7 @@ void BLI_file_free_lines(LinkNode *lines)
BLI_linklist_free(lines, (void(*)(void*)) MEM_freeN);
}
+/** is file1 older then file2 */
int BLI_file_older(const char *file1, const char *file2)
{
#ifdef WIN32
diff --git a/source/blender/blenlib/intern/threads.c b/source/blender/blenlib/intern/threads.c
index 19d9c2a9c65..05d8ded7764 100644
--- a/source/blender/blenlib/intern/threads.c
+++ b/source/blender/blenlib/intern/threads.c
@@ -115,7 +115,6 @@ static pthread_mutex_t _rcache_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t _opengl_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t _nodes_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_mutex_t _movieclip_lock = PTHREAD_MUTEX_INITIALIZER;
-static pthread_mutex_t _scanfill_lock = PTHREAD_MUTEX_INITIALIZER;
static pthread_t mainid;
static int thread_levels= 0; /* threads can be invoked inside threads */
@@ -354,8 +353,6 @@ void BLI_lock_thread(int type)
pthread_mutex_lock(&_nodes_lock);
else if (type==LOCK_MOVIECLIP)
pthread_mutex_lock(&_movieclip_lock);
- else if (type == LOCK_SCANFILL)
- pthread_mutex_lock(&_scanfill_lock);
}
void BLI_unlock_thread(int type)
@@ -376,8 +373,6 @@ void BLI_unlock_thread(int type)
pthread_mutex_unlock(&_nodes_lock);
else if (type==LOCK_MOVIECLIP)
pthread_mutex_unlock(&_movieclip_lock);
- else if (type == LOCK_SCANFILL)
- pthread_mutex_unlock(&_scanfill_lock);
}
/* Mutex Locks */
diff --git a/source/blender/blenloader/BLO_undofile.h b/source/blender/blenloader/BLO_undofile.h
index f3c16e07c62..f716b47ea2e 100644
--- a/source/blender/blenloader/BLO_undofile.h
+++ b/source/blender/blenloader/BLO_undofile.h
@@ -47,7 +47,7 @@ typedef struct MemFile {
} MemFile;
/* actually only used writefile.c */
-extern void add_memfilechunk(MemFile *compare, MemFile *current, char *buf, unsigned int size);
+extern void add_memfilechunk(MemFile *compare, MemFile *current, const char *buf, unsigned int size);
/* exports */
extern void BLO_free_memfile(MemFile *memfile);
diff --git a/source/blender/blenloader/BLO_writefile.h b/source/blender/blenloader/BLO_writefile.h
index 90e8c3e211e..7a8429afec0 100644
--- a/source/blender/blenloader/BLO_writefile.h
+++ b/source/blender/blenloader/BLO_writefile.h
@@ -37,7 +37,7 @@ struct MemFile;
struct Main;
struct ReportList;
-extern int BLO_write_file(struct Main *mainvar, const char *filepath, int write_flags, struct ReportList *reports, int *thumb);
+extern int BLO_write_file(struct Main *mainvar, const char *filepath, int write_flags, struct ReportList *reports, const int *thumb);
extern int BLO_write_file_mem(struct Main *mainvar, struct MemFile *compare, struct MemFile *current, int write_flags);
#define BLEN_THUMB_SIZE 128
diff --git a/source/blender/blenloader/intern/readblenentry.c b/source/blender/blenloader/intern/readblenentry.c
index ccf0c226570..49990a953f6 100644
--- a/source/blender/blenloader/intern/readblenentry.c
+++ b/source/blender/blenloader/intern/readblenentry.c
@@ -64,8 +64,8 @@
#include "BLO_sys_types.h" // needed for intptr_t
-#ifdef _WIN32
-#include "BLI_winstuff.h"
+#ifdef WIN32
+# include "BLI_winstuff.h"
#endif
/* local prototypes --------------------- */
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 3b6ee393406..d52aaa105f2 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -42,11 +42,11 @@
#include <stdarg.h> /* for va_start/end */
#ifndef WIN32
- #include <unistd.h> // for read close
+# include <unistd.h> // for read close
#else
- #include <io.h> // for open close read
-#include "winsock2.h"
-#include "BLI_winstuff.h"
+# include <io.h> // for open close read
+# include "winsock2.h"
+# include "BLI_winstuff.h"
#endif
/* allow readfile to use deprecated functionality */
@@ -7861,32 +7861,6 @@ static void do_versions_nodetree_socket_use_flags_2_62(bNodeTree *ntree)
}
}
-/* set the SOCK_AUTO_HIDDEN flag on collapsed nodes */
-static void do_versions_nodetree_socket_auto_hidden_flags_2_62(bNodeTree *ntree)
-{
- bNode *node;
- bNodeSocket *sock;
-
- for (node=ntree->nodes.first; node; node=node->next) {
- if (node->flag & NODE_HIDDEN) {
- for (sock=node->inputs.first; sock; sock=sock->next) {
- if (sock->link==NULL)
- sock->flag |= SOCK_AUTO_HIDDEN;
- }
- for (sock=node->outputs.first; sock; sock= sock->next) {
- if (nodeCountSocketLinks(ntree, sock)==0)
- sock->flag |= SOCK_AUTO_HIDDEN;
- }
- }
- else {
- for (sock=node->inputs.first; sock; sock= sock->next)
- sock->flag &= ~SOCK_AUTO_HIDDEN;
- for (sock=node->outputs.first; sock; sock= sock->next)
- sock->flag &= ~SOCK_AUTO_HIDDEN;
- }
- }
-}
-
static void do_versions_nodetree_multi_file_output_format_2_62_1(Scene *sce, bNodeTree *ntree)
{
bNode *node;
@@ -13309,38 +13283,6 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
}
- {
- /* set the SOCK_AUTO_HIDDEN flag on collapsed nodes */
- Scene *sce;
- Material *mat;
- Tex *tex;
- Lamp *lamp;
- World *world;
- bNodeTree *ntree;
-
- for (sce=main->scene.first; sce; sce=sce->id.next)
- if (sce->nodetree)
- do_versions_nodetree_socket_auto_hidden_flags_2_62(sce->nodetree);
-
- for (mat=main->mat.first; mat; mat=mat->id.next)
- if (mat->nodetree)
- do_versions_nodetree_socket_auto_hidden_flags_2_62(mat->nodetree);
-
- for (tex=main->tex.first; tex; tex=tex->id.next)
- if (tex->nodetree)
- do_versions_nodetree_socket_auto_hidden_flags_2_62(tex->nodetree);
-
- for (lamp=main->lamp.first; lamp; lamp=lamp->id.next)
- if (lamp->nodetree)
- do_versions_nodetree_socket_auto_hidden_flags_2_62(lamp->nodetree);
-
- for (world=main->world.first; world; world=world->id.next)
- if (world->nodetree)
- do_versions_nodetree_socket_auto_hidden_flags_2_62(world->nodetree);
-
- for (ntree=main->nodetree.first; ntree; ntree=ntree->id.next)
- do_versions_nodetree_socket_auto_hidden_flags_2_62(ntree);
- }
}
if (main->versionfile < 261 || (main->versionfile == 261 && main->subversionfile < 2))
@@ -13512,6 +13454,30 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
+ if (main->versionfile < 262 || (main->versionfile == 262 && main->subversionfile < 4))
+ {
+ /* Read Viscosity presets from older files */
+ Object *ob;
+
+ for (ob = main->object.first; ob; ob = ob->id.next) {
+ ModifierData *md;
+ for (md = ob->modifiers.first; md; md = md->next) {
+ if (md->type == eModifierType_Fluidsim) {
+ FluidsimModifierData *fmd = (FluidsimModifierData *)md;
+ if(fmd->fss->viscosityMode == 3) {
+ fmd->fss->viscosityValue = 5.0;
+ fmd->fss->viscosityExponent = 5;
+ }
+ else if(fmd->fss->viscosityMode == 4) {
+ fmd->fss->viscosityValue = 2.0;
+ fmd->fss->viscosityExponent = 3;
+ }
+ }
+ }
+ }
+ }
+
+
{
/* Default for old files is to save particle rotations to pointcache */
diff --git a/source/blender/blenloader/intern/runtime.c b/source/blender/blenloader/intern/runtime.c
index 814061b7318..2f86c810da0 100644
--- a/source/blender/blenloader/intern/runtime.c
+++ b/source/blender/blenloader/intern/runtime.c
@@ -39,10 +39,10 @@
#include <errno.h>
#ifdef WIN32
-#include <io.h> // read, open
-#include "BLI_winstuff.h"
+# include <io.h> // read, open
+# include "BLI_winstuff.h"
#else // ! WIN32
-#include <unistd.h> // read
+# include <unistd.h> // read
#endif
#include "BLO_readfile.h"
diff --git a/source/blender/blenloader/intern/undofile.c b/source/blender/blenloader/intern/undofile.c
index eeeaae937b1..75fa8d0c3d2 100644
--- a/source/blender/blenloader/intern/undofile.c
+++ b/source/blender/blenloader/intern/undofile.c
@@ -85,9 +85,11 @@ void BLO_merge_memfile(MemFile *first, MemFile *second)
BLO_free_memfile(first);
}
-static int my_memcmp(int *mem1, int *mem2, int len)
+static int my_memcmp(const int *mem1, const int *mem2, const int len)
{
- register int a= len, *mema= mem1, *memb= mem2;
+ register int a = len;
+ register const int *mema = mem1;
+ register const int *memb = mem2;
while (a--) {
if ( *mema != *memb) return 1;
@@ -97,7 +99,7 @@ static int my_memcmp(int *mem1, int *mem2, int len)
return 0;
}
-void add_memfilechunk(MemFile *compare, MemFile *current, char *buf, unsigned int size)
+void add_memfilechunk(MemFile *compare, MemFile *current, const char *buf, unsigned int size)
{
static MemFileChunk *compchunk=NULL;
MemFileChunk *curchunk;
@@ -121,7 +123,7 @@ void add_memfilechunk(MemFile *compare, MemFile *current, char *buf, unsigned in
/* we compare compchunk with buf */
if (compchunk) {
if (compchunk->size == curchunk->size) {
- if ( my_memcmp((int *)compchunk->buf, (int *)buf, size/4)==0) {
+ if (my_memcmp((int *)compchunk->buf, (const int *)buf, size / 4) == 0) {
curchunk->buf= compchunk->buf;
curchunk->ident= 1;
}
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index a61eacbbccd..4739d01c724 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -81,12 +81,12 @@ Any case: direct data is ALWAYS after the lib block
#include "zlib.h"
#ifndef WIN32
-#include <unistd.h>
+# include <unistd.h>
#else
-#include "winsock2.h"
-#include <io.h>
-#include <process.h> // for getpid
-#include "BLI_winstuff.h"
+# include "winsock2.h"
+# include <io.h>
+# include <process.h> // for getpid
+# include "BLI_winstuff.h"
#endif
/* allow writefile to use deprecated functionality (for forward compatibility code) */
@@ -205,7 +205,7 @@ static WriteData *writedata_new(int file)
return wd;
}
-static void writedata_do_write(WriteData *wd, void *mem, int memlen)
+static void writedata_do_write(WriteData *wd, const void *mem, int memlen)
{
if ((wd == NULL) || wd->error || (mem == NULL) || memlen < 1) return;
if (wd->error) return;
@@ -240,7 +240,7 @@ static void writedata_free(WriteData *wd)
#define MYWRITE_FLUSH NULL
-static void mywrite( WriteData *wd, void *adr, int len)
+static void mywrite( WriteData *wd, const void *adr, int len)
{
if (wd->error) return;
@@ -266,7 +266,7 @@ static void mywrite( WriteData *wd, void *adr, int len)
do {
int writelen= MIN2(len, MYWRITE_MAX_CHUNK);
writedata_do_write(wd, adr, writelen);
- adr = (char*)adr + writelen;
+ adr = (const char *)adr + writelen;
len -= writelen;
} while (len > 0);
@@ -355,22 +355,22 @@ static void writestruct(WriteData *wd, int filecode, const char *structname, int
mywrite(wd, adr, bh.len);
}
-static void writedata(WriteData *wd, int filecode, int len, void *adr) /* do not use for structs */
+static void writedata(WriteData *wd, int filecode, int len, const void *adr) /* do not use for structs */
{
BHead bh;
if (adr==NULL) return;
if (len==0) return;
- len+= 3;
- len-= ( len % 4);
+ len += 3;
+ len -= (len % 4);
/* init BHead */
- bh.code= filecode;
- bh.old= adr;
- bh.nr= 1;
- bh.SDNAnr= 0;
- bh.len= len;
+ bh.code = filecode;
+ bh.old = (void *)adr; /* this is safe to cast from const */
+ bh.nr = 1;
+ bh.SDNAnr = 0;
+ bh.len = len;
mywrite(wd, &bh, sizeof(BHead));
if (len) mywrite(wd, adr, len);
@@ -2976,7 +2976,7 @@ static void write_global(WriteData *wd, int fileflags, Main *mainvar)
* second are an RGBA image (unsigned char)
* note, this uses 'TEST' since new types will segfault on file load for older blender versions.
*/
-static void write_thumb(WriteData *wd, int *img)
+static void write_thumb(WriteData *wd, const int *img)
{
if (img)
writedata(wd, TEST, (2 + img[0] * img[1]) * sizeof(int), img);
@@ -2984,7 +2984,7 @@ static void write_thumb(WriteData *wd, int *img)
/* if MemFile * there's filesave to memory */
static int write_file_handle(Main *mainvar, int handle, MemFile *compare, MemFile *current,
- int write_user_block, int write_flags, int *thumb)
+ int write_user_block, int write_flags, const int *thumb)
{
BHead bhead;
ListBase mainlist;
@@ -3093,7 +3093,7 @@ static int do_history(const char *name, ReportList *reports)
}
/* return: success (1) */
-int BLO_write_file(Main *mainvar, const char *filepath, int write_flags, ReportList *reports, int *thumb)
+int BLO_write_file(Main *mainvar, const char *filepath, int write_flags, ReportList *reports, const int *thumb)
{
char userfilename[FILE_MAX];
char tempname[FILE_MAX+1];
diff --git a/source/blender/bmesh/bmesh.h b/source/blender/bmesh/bmesh.h
index 81bd164fbdf..6b41babd927 100644
--- a/source/blender/bmesh/bmesh.h
+++ b/source/blender/bmesh/bmesh.h
@@ -202,7 +202,7 @@ extern "C" {
#include "DNA_customdata_types.h" /* BMesh struct in bmesh_class.h uses */
#include <stdlib.h>
-// #include "BLI_utildefines.h"
+#include <stdio.h>
#include "bmesh_class.h"
diff --git a/source/blender/bmesh/intern/bmesh_construct.c b/source/blender/bmesh/intern/bmesh_construct.c
index b97d40f454c..045c6c967b6 100644
--- a/source/blender/bmesh/intern/bmesh_construct.c
+++ b/source/blender/bmesh/intern/bmesh_construct.c
@@ -495,7 +495,7 @@ void BMO_remove_tagged_faces(BMesh *bm, const short oflag)
BMFace *f;
BMIter iter;
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
if (BMO_elem_flag_test(bm, f, oflag)) {
BM_face_kill(bm, f);
}
@@ -507,7 +507,7 @@ void BMO_remove_tagged_edges(BMesh *bm, const short oflag)
BMEdge *e;
BMIter iter;
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
if (BMO_elem_flag_test(bm, e, oflag)) {
BM_edge_kill(bm, e);
}
@@ -519,7 +519,7 @@ void BMO_remove_tagged_verts(BMesh *bm, const short oflag)
BMVert *v;
BMIter iter;
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
if (BMO_elem_flag_test(bm, v, oflag)) {
BM_vert_kill(bm, v);
}
@@ -545,14 +545,14 @@ static void bmo_remove_tagged_context_verts(BMesh *bm, const short oflag)
BMIter iter;
BMIter itersub;
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
if (BMO_elem_flag_test(bm, v, oflag)) {
/* Visit edge */
- BM_ITER(e, &itersub, bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e, &itersub, v, BM_EDGES_OF_VERT) {
BMO_elem_flag_enable(bm, e, oflag);
}
/* Visit face */
- BM_ITER(f, &itersub, bm, BM_FACES_OF_VERT, v) {
+ BM_ITER_ELEM (f, &itersub, v, BM_FACES_OF_VERT) {
BMO_elem_flag_enable(bm, f, oflag);
}
}
@@ -571,9 +571,9 @@ static void bmo_remove_tagged_context_edges(BMesh *bm, const short oflag)
BMIter iter;
BMIter itersub;
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
if (BMO_elem_flag_test(bm, e, oflag)) {
- BM_ITER(f, &itersub, bm, BM_FACES_OF_EDGE, e) {
+ BM_ITER_ELEM (f, &itersub, e, BM_FACES_OF_EDGE) {
BMO_elem_flag_enable(bm, f, oflag);
}
}
@@ -610,7 +610,7 @@ void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type)
case DEL_EDGES:
{
/* flush down to vert */
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
if (BMO_elem_flag_test(bm, e, oflag)) {
BMO_elem_flag_enable(bm, e->v1, oflag);
BMO_elem_flag_enable(bm, e->v2, oflag);
@@ -618,7 +618,7 @@ void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type)
}
bmo_remove_tagged_context_edges(bm, oflag);
/* remove loose vertice */
- BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
if (BMO_elem_flag_test(bm, v, oflag) && (!(v->e)))
BMO_elem_flag_enable(bm, v, DEL_WIREVERT);
}
@@ -649,7 +649,7 @@ void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type)
case DEL_FACES:
{
/* go through and mark all edges and all verts of all faces for delet */
- BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
if (BMO_elem_flag_test(bm, f, oflag)) {
for (e = BM_iter_new(&eiter, bm, BM_EDGES_OF_FACE, f); e; e = BM_iter_step(&eiter))
BMO_elem_flag_enable(bm, e, oflag);
@@ -658,7 +658,7 @@ void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type)
}
}
/* now go through and mark all remaining faces all edges for keeping */
- BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
if (!BMO_elem_flag_test(bm, f, oflag)) {
for (e = BM_iter_new(&eiter, bm, BM_EDGES_OF_FACE, f); e; e = BM_iter_step(&eiter)) {
BMO_elem_flag_disable(bm, e, oflag);
@@ -669,7 +669,7 @@ void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type)
}
}
/* also mark all the vertices of remaining edges for keeping */
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
if (!BMO_elem_flag_test(bm, e, oflag)) {
BMO_elem_flag_disable(bm, e->v1, oflag);
BMO_elem_flag_disable(bm, e->v2, oflag);
@@ -687,13 +687,13 @@ void BMO_remove_tagged_context(BMesh *bm, const short oflag, const int type)
case DEL_ALL:
{
/* does this option even belong in here? */
- BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
BMO_elem_flag_enable(bm, f, oflag);
}
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
BMO_elem_flag_enable(bm, e, oflag);
}
- BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
BMO_elem_flag_enable(bm, v, oflag);
}
diff --git a/source/blender/bmesh/intern/bmesh_core.c b/source/blender/bmesh/intern/bmesh_core.c
index ca264ffee9b..3457d295bdc 100644
--- a/source/blender/bmesh/intern/bmesh_core.c
+++ b/source/blender/bmesh/intern/bmesh_core.c
@@ -80,7 +80,7 @@ BMVert *BM_vert_create(BMesh *bm, const float co[3], const BMVert *example)
BM_elem_attrs_copy(bm, bm, example, v);
}
- BM_CHECK_ELEMENT(bm, v);
+ BM_CHECK_ELEMENT(v);
return v;
}
@@ -122,7 +122,7 @@ BMEdge *BM_edge_create(BMesh *bm, BMVert *v1, BMVert *v2, const BMEdge *example,
if (example)
BM_elem_attrs_copy(bm, bm, example, e);
- BM_CHECK_ELEMENT(bm, e);
+ BM_CHECK_ELEMENT(e);
return e;
}
@@ -314,12 +314,12 @@ BMFace *BM_face_create(BMesh *bm, BMVert **verts, BMEdge **edges, const int len,
f->len = len;
- BM_CHECK_ELEMENT(bm, f);
+ BM_CHECK_ELEMENT(f);
return f;
}
-int bmesh_elem_check(BMesh *UNUSED(bm), void *element, const char htype)
+int bmesh_elem_check(void *element, const char htype)
{
BMHeader *head = element;
int err = 0;
@@ -555,7 +555,7 @@ void BM_face_kill(BMesh *bm, BMFace *f)
BMLoopList *ls, *ls_next;
#endif
- BM_CHECK_ELEMENT(bm, f);
+ BM_CHECK_ELEMENT(f);
#ifdef USE_BMESH_HOLES
for (ls = f->loops.first; ls; ls = ls_next)
@@ -658,9 +658,9 @@ static int bm_loop_length(BMLoop *l)
*/
static int bm_loop_reverse_loop(BMesh *bm, BMFace *f
#ifdef USE_BMESH_HOLES
- , BMLoopList *lst
+ , BMLoopList *lst
#endif
- )
+ )
{
#ifdef USE_BMESH_HOLES
@@ -733,15 +733,15 @@ static int bm_loop_reverse_loop(BMesh *bm, BMFace *f
/* validate radia */
for (i = 0, l_iter = l_first; i < len; i++, l_iter = l_iter->next) {
- BM_CHECK_ELEMENT(bm, l_iter);
- BM_CHECK_ELEMENT(bm, l_iter->e);
- BM_CHECK_ELEMENT(bm, l_iter->v);
- BM_CHECK_ELEMENT(bm, l_iter->f);
+ BM_CHECK_ELEMENT(l_iter);
+ BM_CHECK_ELEMENT(l_iter->e);
+ BM_CHECK_ELEMENT(l_iter->v);
+ BM_CHECK_ELEMENT(l_iter->f);
}
BLI_array_free(edar);
- BM_CHECK_ELEMENT(bm, f);
+ BM_CHECK_ELEMENT(f);
return 1;
}
@@ -755,7 +755,7 @@ int bmesh_loop_reverse(BMesh *bm, BMFace *f)
#endif
}
-static void bm_elements_systag_enable(BMesh *UNUSED(bm), void *veles, int tot, int flag)
+static void bm_elements_systag_enable(void *veles, int tot, int flag)
{
BMHeader **eles = veles;
int i;
@@ -765,7 +765,7 @@ static void bm_elements_systag_enable(BMesh *UNUSED(bm), void *veles, int tot, i
}
}
-static void bm_elements_systag_disable(BMesh *UNUSED(bm), void *veles, int tot, int flag)
+static void bm_elements_systag_disable(void *veles, int tot, int flag)
{
BMHeader **eles = veles;
int i;
@@ -775,7 +775,7 @@ static void bm_elements_systag_disable(BMesh *UNUSED(bm), void *veles, int tot,
}
}
-#define FACE_MARK (1 << 10)
+#define FACE_MARK (1 << 10)
static int count_flagged_radial(BMesh *bm, BMLoop *l, int flag)
{
@@ -814,8 +814,7 @@ static int UNUSED_FUNCTION(count_flagged_disk)(BMVert *v, int flag)
do {
i += BM_ELEM_API_FLAG_TEST(e, flag) ? 1 : 0;
- e = bmesh_disk_edge_next(e, v);
- } while (e != v->e);
+ } while ((e = bmesh_disk_edge_next(e, v)) != v->e);
return i;
}
@@ -893,7 +892,7 @@ BMFace *BM_faces_join(BMesh *bm, BMFace **faces, int totface, const short do_del
if (totface == 1)
return faces[0];
- bm_elements_systag_enable(bm, faces, totface, _FLAG_JF);
+ bm_elements_systag_enable(faces, totface, _FLAG_JF);
for (i = 0; i < totface; i++) {
f = faces[i];
@@ -1012,7 +1011,7 @@ BMFace *BM_faces_join(BMesh *bm, BMFace **faces, int totface, const short do_del
} while ((l_iter = l_iter->next) != l_first);
}
- bm_elements_systag_disable(bm, faces, totface, _FLAG_JF);
+ bm_elements_systag_disable(faces, totface, _FLAG_JF);
BM_ELEM_API_FLAG_DISABLE(newf, _FLAG_JF);
/* handle multi-res data */
@@ -1046,11 +1045,11 @@ BMFace *BM_faces_join(BMesh *bm, BMFace **faces, int totface, const short do_del
BLI_array_free(deledges);
BLI_array_free(delverts);
- BM_CHECK_ELEMENT(bm, newf);
+ BM_CHECK_ELEMENT(newf);
return newf;
error:
- bm_elements_systag_disable(bm, faces, totface, _FLAG_JF);
+ bm_elements_systag_disable(faces, totface, _FLAG_JF);
BLI_array_free(edges);
BLI_array_free(deledges);
BLI_array_free(delverts);
@@ -1092,13 +1091,13 @@ static BMFace *bm_face_create__sfme(BMesh *bm, BMFace *UNUSED(example))
* \par Examples:
*
* Before: After:
- * ---------- ----------
+ * +--------+ +--------+
* | | | |
* | | | f1 |
* v1 f1 v2 v1======v2
* | | | f2 |
* | | | |
- * ---------- ----------
+ * +--------+ +--------+
*
* \note the input vertices can be part of the same edge. This will
* result in a two edged face. This is desirable for advanced construction
@@ -1174,17 +1173,17 @@ BMFace *bmesh_sfme(BMesh *bm, BMFace *f, BMVert *v1, BMVert *v2,
l_iter = l_first = f1loop;
first_loop_f1 = 0;
do {
- if(l_iter == f->l_first)
+ if (l_iter == f->l_first)
first_loop_f1 = 1;
} while ((l_iter = l_iter->next) != l_first);
- if(first_loop_f1) {
+ if (first_loop_f1) {
/* original first loop was in f1, find a suitable first loop for f2
which is as similar as possible to f1. the order matters for tools
such as duplifaces. */
- if(f->l_first->prev == f1loop)
+ if (f->l_first->prev == f1loop)
f2->l_first = f2loop->prev;
- else if(f->l_first->next == f1loop)
+ else if (f->l_first->next == f1loop)
f2->l_first = f2loop->next;
else
f2->l_first = f2loop;
@@ -1193,9 +1192,9 @@ BMFace *bmesh_sfme(BMesh *bm, BMFace *f, BMVert *v1, BMVert *v2,
/* original first loop was in f2, further do same as above */
f2->l_first = f->l_first;
- if(f->l_first->prev == f2loop)
+ if (f->l_first->prev == f2loop)
f->l_first = f1loop->prev;
- else if(f->l_first->next == f2loop)
+ else if (f->l_first->next == f2loop)
f->l_first = f1loop->next;
else
f->l_first = f1loop;
@@ -1243,9 +1242,9 @@ BMFace *bmesh_sfme(BMesh *bm, BMFace *f, BMVert *v1, BMVert *v2,
}
#endif
- BM_CHECK_ELEMENT(bm, e);
- BM_CHECK_ELEMENT(bm, f);
- BM_CHECK_ELEMENT(bm, f2);
+ BM_CHECK_ELEMENT(e);
+ BM_CHECK_ELEMENT(f);
+ BM_CHECK_ELEMENT(f2);
return f2;
}
@@ -1391,10 +1390,10 @@ BMVert *bmesh_semv(BMesh *bm, BMVert *tv, BMEdge *e, BMEdge **r_e)
BMESH_ASSERT(l->e != l->next->e);
/* verify loop cycle for kloop-> */
- BM_CHECK_ELEMENT(bm, l);
- BM_CHECK_ELEMENT(bm, l->v);
- BM_CHECK_ELEMENT(bm, l->e);
- BM_CHECK_ELEMENT(bm, l->f);
+ BM_CHECK_ELEMENT(l);
+ BM_CHECK_ELEMENT(l->v);
+ BM_CHECK_ELEMENT(l->e);
+ BM_CHECK_ELEMENT(l->f);
}
/* verify loop->v and loop->next->v pointers for ne */
for (i = 0, l = ne->l; i < radlen; i++, l = l->radial_next) {
@@ -1406,18 +1405,18 @@ BMVert *bmesh_semv(BMesh *bm, BMVert *tv, BMEdge *e, BMEdge **r_e)
BMESH_ASSERT(l->v != l->next->v);
BMESH_ASSERT(l->e != l->next->e);
- BM_CHECK_ELEMENT(bm, l);
- BM_CHECK_ELEMENT(bm, l->v);
- BM_CHECK_ELEMENT(bm, l->e);
- BM_CHECK_ELEMENT(bm, l->f);
+ BM_CHECK_ELEMENT(l);
+ BM_CHECK_ELEMENT(l->v);
+ BM_CHECK_ELEMENT(l->e);
+ BM_CHECK_ELEMENT(l->f);
}
}
- BM_CHECK_ELEMENT(bm, ne);
- BM_CHECK_ELEMENT(bm, nv);
- BM_CHECK_ELEMENT(bm, ov);
- BM_CHECK_ELEMENT(bm, e);
- BM_CHECK_ELEMENT(bm, tv);
+ BM_CHECK_ELEMENT(ne);
+ BM_CHECK_ELEMENT(nv);
+ BM_CHECK_ELEMENT(ov);
+ BM_CHECK_ELEMENT(e);
+ BM_CHECK_ELEMENT(tv);
if (r_e) *r_e = ne;
return nv;
@@ -1561,10 +1560,10 @@ BMEdge *bmesh_jekv(BMesh *bm, BMEdge *ke, BMVert *kv, const short check_edge_dou
edok = bmesh_loop_validate(l->f);
BMESH_ASSERT(edok != FALSE);
- BM_CHECK_ELEMENT(bm, l);
- BM_CHECK_ELEMENT(bm, l->v);
- BM_CHECK_ELEMENT(bm, l->e);
- BM_CHECK_ELEMENT(bm, l->f);
+ BM_CHECK_ELEMENT(l);
+ BM_CHECK_ELEMENT(l->v);
+ BM_CHECK_ELEMENT(l->e);
+ BM_CHECK_ELEMENT(l->f);
}
if (check_edge_double) {
@@ -1574,9 +1573,9 @@ BMEdge *bmesh_jekv(BMesh *bm, BMEdge *ke, BMVert *kv, const short check_edge_dou
}
}
- BM_CHECK_ELEMENT(bm, ov);
- BM_CHECK_ELEMENT(bm, tv);
- BM_CHECK_ELEMENT(bm, oe);
+ BM_CHECK_ELEMENT(ov);
+ BM_CHECK_ELEMENT(tv);
+ BM_CHECK_ELEMENT(oe);
return oe;
}
@@ -1594,13 +1593,13 @@ BMEdge *bmesh_jekv(BMesh *bm, BMEdge *ke, BMVert *kv, const short check_edge_dou
* \par Examples:
*
* A B
- * ---------- ----------
+ * +--------+ +--------+
* | | | |
* | f1 | | f1 |
* v1========v2 = Ok! v1==V2==v3 == Wrong!
* | f2 | | f2 |
* | | | |
- * ---------- ----------
+ * +--------+ +--------+
*
* In the example A, faces \a f1 and \a f2 are joined by a single edge,
* and the euler can safely be used.
@@ -1617,36 +1616,25 @@ BMEdge *bmesh_jekv(BMesh *bm, BMEdge *ke, BMVert *kv, const short check_edge_dou
BMFace *bmesh_jfke(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e)
{
BMLoop *l_iter, *f1loop = NULL, *f2loop = NULL;
- int newlen = 0, i, f1len = 0, f2len = 0, radlen = 0, edok, shared;
- BMIter iter;
+ int newlen = 0, i, f1len = 0, f2len = 0, edok;
- /* can't join a face to itsel */
+ /* can't join a face to itself */
if (f1 == f2) {
return NULL;
}
+ /* validate that edge is 2-manifold edge */
+ if (!BM_edge_is_manifold(e)) {
+ return NULL;
+ }
+
/* verify that e is in both f1 and f2 */
f1len = f1->len;
f2len = f2->len;
- BM_ITER(l_iter, &iter, bm, BM_LOOPS_OF_FACE, f1) {
- if (l_iter->e == e) {
- f1loop = l_iter;
- break;
- }
- }
- BM_ITER(l_iter, &iter, bm, BM_LOOPS_OF_FACE, f2) {
- if (l_iter->e == e) {
- f2loop = l_iter;
- break;
- }
- }
- if (!(f1loop && f2loop)) {
- return NULL;
- }
-
- /* validate that edge is 2-manifold edg */
- radlen = bmesh_radial_length(f1loop);
- if (radlen != 2) {
+
+ if (!((f1loop = BM_face_edge_share_loop(f1, e)) &&
+ (f2loop = BM_face_edge_share_loop(f2, e))))
+ {
return NULL;
}
@@ -1657,37 +1645,36 @@ BMFace *bmesh_jfke(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e)
/* validate that for each face, each vertex has another edge in its disk cycle that is
* not e, and not shared. */
- if ( bmesh_radial_face_find(f1loop->next->e, f2) ||
- bmesh_radial_face_find(f1loop->prev->e, f2) ||
- bmesh_radial_face_find(f2loop->next->e, f1) ||
- bmesh_radial_face_find(f2loop->prev->e, f1) )
+ if (bmesh_radial_face_find(f1loop->next->e, f2) ||
+ bmesh_radial_face_find(f1loop->prev->e, f2) ||
+ bmesh_radial_face_find(f2loop->next->e, f1) ||
+ bmesh_radial_face_find(f2loop->prev->e, f1) )
{
return NULL;
}
- /* validate only one shared edg */
- shared = BM_face_share_edge_count(f1, f2);
- if (shared > 1) {
+ /* validate only one shared edge */
+ if (BM_face_share_edge_count(f1, f2) > 1) {
return NULL;
}
/* validate no internal join */
for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f1); i < f1len; i++, l_iter = l_iter->next) {
- BM_elem_flag_disable(l_iter->v, BM_ELEM_TAG);
+ BM_elem_flag_disable(l_iter->v, BM_ELEM_INTERNAL_TAG);
}
for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f2); i < f2len; i++, l_iter = l_iter->next) {
- BM_elem_flag_disable(l_iter->v, BM_ELEM_TAG);
+ BM_elem_flag_disable(l_iter->v, BM_ELEM_INTERNAL_TAG);
}
for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f1); i < f1len; i++, l_iter = l_iter->next) {
if (l_iter != f1loop) {
- BM_elem_flag_enable(l_iter->v, BM_ELEM_TAG);
+ BM_elem_flag_enable(l_iter->v, BM_ELEM_INTERNAL_TAG);
}
}
for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f2); i < f2len; i++, l_iter = l_iter->next) {
if (l_iter != f2loop) {
/* as soon as a duplicate is found, bail out */
- if (BM_elem_flag_test(l_iter->v, BM_ELEM_TAG)) {
+ if (BM_elem_flag_test(l_iter->v, BM_ELEM_INTERNAL_TAG)) {
return NULL;
}
}
@@ -1707,7 +1694,7 @@ BMFace *bmesh_jfke(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e)
/* increase length of f1 */
f1->len += (f2->len - 2);
- /* make sure each loop points to the proper fac */
+ /* make sure each loop points to the proper face */
newlen = f1->len;
for (i = 0, l_iter = BM_FACE_FIRST_LOOP(f1); i < newlen; i++, l_iter = l_iter->next)
l_iter->f = f1;
@@ -1730,7 +1717,7 @@ BMFace *bmesh_jfke(BMesh *bm, BMFace *f1, BMFace *f2, BMEdge *e)
/* account for both above */
bm->elem_index_dirty |= BM_EDGE | BM_FACE;
- BM_CHECK_ELEMENT(bm, f1);
+ BM_CHECK_ELEMENT(f1);
/* validate the new loop cycle */
edok = bmesh_loop_validate(f1);
@@ -1758,7 +1745,7 @@ int BM_vert_splice(BMesh *bm, BMVert *v, BMVert *vtarget)
}
/* retarget all the loops of v to vtarget */
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_VERT, v) {
+ BM_ITER_ELEM (l, &liter, v, BM_LOOPS_OF_VERT) {
l->v = vtarget;
}
@@ -1769,8 +1756,8 @@ int BM_vert_splice(BMesh *bm, BMVert *v, BMVert *vtarget)
bmesh_disk_edge_append(e, vtarget);
}
- BM_CHECK_ELEMENT(bm, v);
- BM_CHECK_ELEMENT(bm, vtarget);
+ BM_CHECK_ELEMENT(v);
+ BM_CHECK_ELEMENT(vtarget);
/* v is unused now, and can be killed */
BM_vert_kill(bm, v);
@@ -1804,7 +1791,7 @@ int bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len)
visithash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, __func__);
maxindex = 0;
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) {
if (BLI_ghash_haskey(visithash, e)) {
continue;
}
@@ -1817,7 +1804,7 @@ int bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len)
while ((e = BLI_array_pop(stack))) {
BLI_ghash_insert(visithash, e, SET_INT_IN_POINTER(maxindex));
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_EDGE, e) {
+ BM_ITER_ELEM (l, &liter, e, BM_LOOPS_OF_EDGE) {
nl = (l->v == v) ? l->prev : l->next;
if (!BLI_ghash_haskey(visithash, nl->e)) {
BLI_array_append(stack, nl->e);
@@ -1837,7 +1824,7 @@ int bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len)
/* Replace v with the new verts in each group */
#if 0
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_VERT, v) {
+ BM_ITER_ELEM (l, &liter, v, BM_LOOPS_OF_VERT) {
/* call first since its faster then a hash lookup */
if (l->v != v) {
continue;
@@ -1863,20 +1850,21 @@ int bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len)
* bad practice but save alloc'ing a new array - note, the comment above is useful, keep it
* if you are tidying up code - campbell */
BLI_array_empty(stack);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_VERT, v) {
- if ((l->v == v) && (i = GET_INT_FROM_POINTER(BLI_ghash_lookup(visithash, l->e)))) {
- BM_elem_index_set(l, i); /* would be nice to assign vert here but cant, so assign the vert index */
+ BM_ITER_ELEM (l, &liter, v, BM_LOOPS_OF_VERT) {
+ if (l->v == v) {
BLI_array_append(stack, (BMEdge *)l);
}
}
while ((l = (BMLoop *)(BLI_array_pop(stack)))) {
- l->v = verts[BM_elem_index_get(l)];
+ if ((i = GET_INT_FROM_POINTER(BLI_ghash_lookup(visithash, l->e)))) {
+ l->v = verts[i];
+ }
}
#endif
BLI_array_free(stack);
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) {
i = GET_INT_FROM_POINTER(BLI_ghash_lookup(visithash, e));
if (i == 0) {
continue;
@@ -1891,7 +1879,7 @@ int bmesh_vert_separate(BMesh *bm, BMVert *v, BMVert ***r_vout, int *r_vout_len)
BLI_ghash_free(visithash, NULL, NULL);
for (i = 0; i < maxindex; i++) {
- BM_CHECK_ELEMENT(bm, verts[i]);
+ BM_CHECK_ELEMENT(verts[i]);
}
if (r_vout_len != NULL) {
@@ -1954,8 +1942,8 @@ int BM_edge_splice(BMesh *bm, BMEdge *e, BMEdge *etarget)
BLI_assert(bmesh_radial_length(e->l) == 0);
- BM_CHECK_ELEMENT(bm, e);
- BM_CHECK_ELEMENT(bm, etarget);
+ BM_CHECK_ELEMENT(e);
+ BM_CHECK_ELEMENT(etarget);
/* removes from disks too */
BM_edge_kill(bm, e);
@@ -2000,8 +1988,8 @@ int bmesh_edge_separate(BMesh *bm, BMEdge *e, BMLoop *l_sep)
BLI_assert(bmesh_radial_length(e->l) == radlen - 1);
BLI_assert(bmesh_radial_length(ne->l) == 1);
- BM_CHECK_ELEMENT(bm, ne);
- BM_CHECK_ELEMENT(bm, e);
+ BM_CHECK_ELEMENT(ne);
+ BM_CHECK_ELEMENT(e);
return TRUE;
}
diff --git a/source/blender/bmesh/intern/bmesh_interp.c b/source/blender/bmesh/intern/bmesh_interp.c
index 2a3242d87c1..5149a5436a2 100644
--- a/source/blender/bmesh/intern/bmesh_interp.c
+++ b/source/blender/bmesh/intern/bmesh_interp.c
@@ -327,16 +327,16 @@ static void mdisp_axis_from_quad(float v1[3], float v2[3], float UNUSED(v3[3]),
/* tl is loop to project onto, l is loop whose internal displacement, co, is being
* projected. x and y are location in loop's mdisps grid of point co. */
-static int mdisp_in_mdispquad(BMesh *bm, BMLoop *l, BMLoop *tl, float p[3], float *x, float *y,
+static int mdisp_in_mdispquad(BMLoop *l, BMLoop *tl, float p[3], float *x, float *y,
int res, float axis_x[3], float axis_y[3])
{
float v1[3], v2[3], c[3], v3[3], v4[3], e1[3], e2[3];
float eps = FLT_EPSILON * 4000;
if (len_v3(l->v->no) == 0.0f)
- BM_vert_normal_update_all(bm, l->v);
+ BM_vert_normal_update_all(l->v);
if (len_v3(tl->v->no) == 0.0f)
- BM_vert_normal_update_all(bm, tl->v);
+ BM_vert_normal_update_all(tl->v);
compute_mdisp_quad(tl, v1, v2, v3, v4, e1, e2);
@@ -466,7 +466,7 @@ static void bm_loop_interp_mdisps(BMesh *bm, BMLoop *target, BMFace *source)
md1 = CustomData_bmesh_get(&bm->ldata, target->head.data, CD_MDISPS);
md2 = CustomData_bmesh_get(&bm->ldata, l_iter->head.data, CD_MDISPS);
- if (mdisp_in_mdispquad(bm, target, l_iter, co, &x2, &y2, res, src_axis_x, src_axis_y)) {
+ if (mdisp_in_mdispquad(target, l_iter, co, &x2, &y2, res, src_axis_x, src_axis_y)) {
old_mdisps_bilinear(md1->disps[iy * res + ix], md2->disps, res, (float)x2, (float)y2);
bm_loop_flip_disp(src_axis_x, src_axis_y, axis_x, axis_y, md1->disps[iy * res + ix]);
@@ -489,7 +489,7 @@ void BM_face_multires_bounds_smooth(BMesh *bm, BMFace *f)
if (!CustomData_has_layer(&bm->ldata, CD_MDISPS))
return;
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
MDisps *mdp = CustomData_bmesh_get(&bm->ldata, l->prev->head.data, CD_MDISPS);
MDisps *mdl = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MDISPS);
MDisps *mdn = CustomData_bmesh_get(&bm->ldata, l->next->head.data, CD_MDISPS);
@@ -521,7 +521,7 @@ void BM_face_multires_bounds_smooth(BMesh *bm, BMFace *f)
}
}
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
MDisps *mdl1 = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MDISPS);
MDisps *mdl2;
float co1[3], co2[3], co[3];
@@ -726,7 +726,7 @@ static void update_data_blocks(BMesh *bm, CustomData *olddata, CustomData *data)
CustomData_bmesh_init_pool(data, bm->totvert, BM_VERT);
- BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
block = NULL;
CustomData_bmesh_set_default(data, &block);
CustomData_bmesh_copy_data(olddata, data, eve->head.data, &block);
@@ -739,7 +739,7 @@ static void update_data_blocks(BMesh *bm, CustomData *olddata, CustomData *data)
CustomData_bmesh_init_pool(data, bm->totedge, BM_EDGE);
- BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
block = NULL;
CustomData_bmesh_set_default(data, &block);
CustomData_bmesh_copy_data(olddata, data, eed->head.data, &block);
@@ -753,8 +753,8 @@ static void update_data_blocks(BMesh *bm, CustomData *olddata, CustomData *data)
BMLoop *l;
CustomData_bmesh_init_pool(data, bm->totloop, BM_LOOP);
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
block = NULL;
CustomData_bmesh_set_default(data, &block);
CustomData_bmesh_copy_data(olddata, data, l->head.data, &block);
@@ -768,7 +768,7 @@ static void update_data_blocks(BMesh *bm, CustomData *olddata, CustomData *data)
CustomData_bmesh_init_pool(data, bm->totface, BM_FACE);
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
block = NULL;
CustomData_bmesh_set_default(data, &block);
CustomData_bmesh_copy_data(olddata, data, efa->head.data, &block);
diff --git a/source/blender/bmesh/intern/bmesh_iterators.c b/source/blender/bmesh/intern/bmesh_iterators.c
index b53896ae722..384715d74f7 100644
--- a/source/blender/bmesh/intern/bmesh_iterators.c
+++ b/source/blender/bmesh/intern/bmesh_iterators.c
@@ -83,18 +83,17 @@ void *BM_iter_at_index(BMesh *bm, const char itype, void *data, int index)
* Sometimes its convenient to get the iterator as an array
* to avoid multiple calls to #BM_iter_at_index.
*/
-int BM_iter_as_array(BMesh *bm, const char type, void *data, void **array, const int len)
+int BM_iter_as_array(BMesh *bm, const char itype, void *data, void **array, const int len)
{
int i = 0;
/* sanity check */
if (len > 0) {
-
BMIter iter;
- void *val;
+ void *ele;
- BM_ITER(val, &iter, bm, type, data) {
- array[i] = val;
+ for (ele = BM_iter_new(&iter, bm, itype, data); ele; ele = BM_iter_step(&iter)) {
+ array[i] = ele;
i++;
if (i == len) {
return len;
diff --git a/source/blender/bmesh/intern/bmesh_iterators.h b/source/blender/bmesh/intern/bmesh_iterators.h
index d3566d8aead..c687e4b4e7a 100644
--- a/source/blender/bmesh/intern/bmesh_iterators.h
+++ b/source/blender/bmesh/intern/bmesh_iterators.h
@@ -82,14 +82,17 @@ typedef enum BMIterType {
/* the iterator htype for each iterator */
extern const char bm_iter_itype_htype_map[BM_ITYPE_MAX];
+#define BM_ITER_MESH(ele, iter, bm, itype) \
+ for (ele = BM_iter_new(iter, bm, itype, NULL); ele; ele = BM_iter_step(iter))
-#define BM_ITER(ele, iter, bm, itype, data) \
- ele = BM_iter_new(iter, bm, itype, data); \
- for ( ; ele; ele = BM_iter_step(iter))
+#define BM_ITER_MESH_INDEX(ele, iter, bm, itype, indexvar) \
+ for (ele = BM_iter_new(iter, bm, itype, NULL), indexvar = 0; ele; ele = BM_iter_step(iter), (indexvar)++)
-#define BM_ITER_INDEX(ele, iter, bm, itype, data, indexvar) \
- ele = BM_iter_new(iter, bm, itype, data); \
- for (indexvar = 0; ele; indexvar++, ele = BM_iter_step(iter))
+#define BM_ITER_ELEM(ele, iter, data, itype) \
+ for (ele = BM_iter_new(iter, NULL, itype, data); ele; ele = BM_iter_step(iter))
+
+#define BM_ITER_ELEM_INDEX(ele, iter, data, itype, indexvar) \
+ for (ele = BM_iter_new(iter, NULL, itype, data), indexvar = 0; ele; ele = BM_iter_step(iter), (indexvar)++)
/* Iterator Structure */
typedef struct BMIter {
diff --git a/source/blender/bmesh/intern/bmesh_iterators_inline.h b/source/blender/bmesh/intern/bmesh_iterators_inline.h
index 57f0da4081b..96816521493 100644
--- a/source/blender/bmesh/intern/bmesh_iterators_inline.h
+++ b/source/blender/bmesh/intern/bmesh_iterators_inline.h
@@ -59,14 +59,20 @@ BLI_INLINE int BM_iter_init(BMIter *iter, BMesh *bm, const char itype, void *dat
/* inlining optimizes out this switch when called with the defined type */
switch ((BMIterType)itype) {
case BM_VERTS_OF_MESH:
+ BLI_assert(bm != NULL);
+ BLI_assert(data == NULL);
iter->begin = bmiter__vert_of_mesh_begin;
iter->step = bmiter__vert_of_mesh_step;
break;
case BM_EDGES_OF_MESH:
+ BLI_assert(bm != NULL);
+ BLI_assert(data == NULL);
iter->begin = bmiter__edge_of_mesh_begin;
iter->step = bmiter__edge_of_mesh_step;
break;
case BM_FACES_OF_MESH:
+ BLI_assert(bm != NULL);
+ BLI_assert(data == NULL);
iter->begin = bmiter__face_of_mesh_begin;
iter->step = bmiter__face_of_mesh_step;
break;
@@ -161,10 +167,14 @@ BLI_INLINE int BM_iter_init(BMIter *iter, BMesh *bm, const char itype, void *dat
iter->edata = data;
break;
default:
+ /* should never happen */
+ BLI_assert(0);
+ return FALSE;
break;
}
-
+
iter->begin(iter);
+
return TRUE;
}
diff --git a/source/blender/bmesh/intern/bmesh_marking.c b/source/blender/bmesh/intern/bmesh_marking.c
index 3492b4257cb..7b6d562658e 100644
--- a/source/blender/bmesh/intern/bmesh_marking.c
+++ b/source/blender/bmesh/intern/bmesh_marking.c
@@ -84,7 +84,7 @@ void BM_mesh_select_mode_flush(BMesh *bm)
int ok;
if (bm->selectmode & SCE_SELECT_VERTEX) {
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(e->v1, BM_ELEM_SELECT) &&
BM_elem_flag_test(e->v2, BM_ELEM_SELECT) &&
!BM_elem_flag_test(e, BM_ELEM_HIDDEN))
@@ -95,7 +95,7 @@ void BM_mesh_select_mode_flush(BMesh *bm)
BM_elem_flag_disable(e, BM_ELEM_SELECT);
}
}
- BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
ok = TRUE;
if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
@@ -114,7 +114,7 @@ void BM_mesh_select_mode_flush(BMesh *bm)
}
}
else if (bm->selectmode & SCE_SELECT_EDGE) {
- BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
ok = TRUE;
if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
@@ -154,7 +154,7 @@ void BM_mesh_deselect_flush(BMesh *bm)
int ok;
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
if (!(BM_elem_flag_test(e->v1, BM_ELEM_SELECT) &&
BM_elem_flag_test(e->v2, BM_ELEM_SELECT) &&
!BM_elem_flag_test(e, BM_ELEM_HIDDEN)))
@@ -163,7 +163,7 @@ void BM_mesh_deselect_flush(BMesh *bm)
}
}
- BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
ok = TRUE;
if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
@@ -205,7 +205,7 @@ void BM_mesh_select_flush(BMesh *bm)
int ok;
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(e->v1, BM_ELEM_SELECT) &&
BM_elem_flag_test(e->v2, BM_ELEM_SELECT) &&
!BM_elem_flag_test(e, BM_ELEM_HIDDEN))
@@ -214,7 +214,7 @@ void BM_mesh_select_flush(BMesh *bm)
}
}
- BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
ok = TRUE;
if (!BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
l_iter = l_first = BM_FACE_FIRST_LOOP(f);
@@ -245,8 +245,7 @@ void BM_mesh_select_flush(BMesh *bm)
*/
void BM_vert_select_set(BMesh *bm, BMVert *v, int select)
{
- /* BMIter iter; */
- /* BMEdge *e; */
+ BLI_assert(v->head.htype == BM_VERT);
if (BM_elem_flag_test(v, BM_ELEM_HIDDEN)) {
return;
@@ -273,6 +272,8 @@ void BM_vert_select_set(BMesh *bm, BMVert *v, int select)
*/
void BM_edge_select_set(BMesh *bm, BMEdge *e, int select)
{
+ BLI_assert(e->head.htype == BM_EDGE);
+
if (BM_elem_flag_test(e, BM_ELEM_HIDDEN)) {
return;
}
@@ -281,8 +282,8 @@ void BM_edge_select_set(BMesh *bm, BMEdge *e, int select)
if (!BM_elem_flag_test(e, BM_ELEM_SELECT)) bm->totedgesel += 1;
BM_elem_flag_enable(e, BM_ELEM_SELECT);
- BM_elem_select_set(bm, e->v1, TRUE);
- BM_elem_select_set(bm, e->v2, TRUE);
+ BM_vert_select_set(bm, e->v1, TRUE);
+ BM_vert_select_set(bm, e->v2, TRUE);
}
else {
if (BM_elem_flag_test(e, BM_ELEM_SELECT)) bm->totedgesel -= 1;
@@ -318,8 +319,8 @@ void BM_edge_select_set(BMesh *bm, BMEdge *e, int select)
}
}
else {
- BM_elem_select_set(bm, e->v1, FALSE);
- BM_elem_select_set(bm, e->v2, FALSE);
+ BM_vert_select_set(bm, e->v1, FALSE);
+ BM_vert_select_set(bm, e->v2, FALSE);
}
}
@@ -336,6 +337,8 @@ void BM_face_select_set(BMesh *bm, BMFace *f, int select)
BMLoop *l_iter;
BMLoop *l_first;
+ BLI_assert(f->head.htype == BM_FACE);
+
if (BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
return;
}
@@ -360,30 +363,30 @@ void BM_face_select_set(BMesh *bm, BMFace *f, int select)
BM_elem_flag_disable(f, BM_ELEM_SELECT);
/* flush down to edges */
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
BMIter fiter;
BMFace *f2;
- BM_ITER(f2, &fiter, bm, BM_FACES_OF_EDGE, l->e) {
+ BM_ITER_ELEM (f2, &fiter, l->e, BM_FACES_OF_EDGE) {
if (BM_elem_flag_test(f2, BM_ELEM_SELECT))
break;
}
if (!f2) {
- BM_elem_select_set(bm, l->e, FALSE);
+ BM_edge_select_set(bm, l->e, FALSE);
}
}
/* flush down to verts */
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
BMIter eiter;
BMEdge *e;
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, l->v) {
+ BM_ITER_ELEM (e, &eiter, l->v, BM_EDGES_OF_VERT) {
if (BM_elem_flag_test(e, BM_ELEM_SELECT))
break;
}
if (!e) {
- BM_elem_select_set(bm, l->v, FALSE);
+ BM_vert_select_set(bm, l->v, FALSE);
}
}
}
@@ -405,10 +408,10 @@ void BM_mesh_select_mode_set(BMesh *bm, int selectmode)
if (bm->selectmode & SCE_SELECT_VERTEX) {
/* disabled because selection flushing handles these */
#if 0
- BM_ITER(ele, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (ele, &iter, bm, BM_EDGES_OF_MESH) {
BM_elem_flag_disable(ele, BM_ELEM_SELECT);
}
- BM_ITER(ele, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (ele, &iter, bm, BM_FACES_OF_MESH) {
BM_elem_flag_disable(ele, BM_ELEM_SELECT);
}
#endif
@@ -417,12 +420,12 @@ void BM_mesh_select_mode_set(BMesh *bm, int selectmode)
else if (bm->selectmode & SCE_SELECT_EDGE) {
/* disabled because selection flushing handles these */
#if 0
- BM_ITER(ele, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (ele, &iter, bm, BM_VERTS_OF_MESH) {
BM_elem_flag_disable(ele, BM_ELEM_SELECT);
}
#endif
- BM_ITER(ele, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (ele, &iter, bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(ele, BM_ELEM_SELECT)) {
BM_edge_select_set(bm, (BMEdge *)ele, TRUE);
}
@@ -432,11 +435,11 @@ void BM_mesh_select_mode_set(BMesh *bm, int selectmode)
else if (bm->selectmode & SCE_SELECT_FACE) {
/* disabled because selection flushing handles these */
#if 0
- BM_ITER(ele, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (ele, &iter, bm, BM_EDGES_OF_MESH) {
BM_elem_flag_disable(ele, BM_ELEM_SELECT);
}
#endif
- BM_ITER(ele, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (ele, &iter, bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(ele, BM_ELEM_SELECT)) {
BM_face_select_set(bm, (BMFace *)ele, TRUE);
}
@@ -543,7 +546,7 @@ BMFace *BM_active_face_get(BMesh *bm, int sloppy)
}
/* Last attempt: try to find any selected face */
if (f == NULL) {
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(f, BM_ELEM_SELECT)) {
break;
}
@@ -563,7 +566,7 @@ BMFace *BM_active_face_get(BMesh *bm, int sloppy)
* - #EM_editselection_normal
* - #EM_editselection_plane
*/
-void BM_editselection_center(BMesh *bm, float r_center[3], BMEditSelection *ese)
+void BM_editselection_center(float r_center[3], BMEditSelection *ese)
{
if (ese->htype == BM_VERT) {
BMVert *eve = (BMVert *)ese->ele;
@@ -576,7 +579,7 @@ void BM_editselection_center(BMesh *bm, float r_center[3], BMEditSelection *ese)
}
else if (ese->htype == BM_FACE) {
BMFace *efa = (BMFace *)ese->ele;
- BM_face_center_bounds_calc(bm, efa, r_center);
+ BM_face_center_bounds_calc(efa, r_center);
}
}
@@ -621,7 +624,7 @@ void BM_editselection_plane(BMesh *bm, float r_plane[3], BMEditSelection *ese)
float vec[3] = {0.0f, 0.0f, 0.0f};
if (ese->prev) { /* use previously selected data to make a useful vertex plane */
- BM_editselection_center(bm, vec, ese->prev);
+ BM_editselection_center(vec, ese->prev);
sub_v3_v3v3(r_plane, vec, eve->co);
}
else {
@@ -890,33 +893,33 @@ void BM_mesh_elem_hflag_enable_all(BMesh *bm, const char htype, const char hflag
/***************** Mesh Hiding stuff *********** */
-static void vert_flush_hide_set(BMesh *bm, BMVert *v)
+static void vert_flush_hide_set(BMVert *v)
{
BMIter iter;
BMEdge *e;
int hide = TRUE;
- BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e, &iter, v, BM_EDGES_OF_VERT) {
hide = hide && BM_elem_flag_test(e, BM_ELEM_HIDDEN);
}
BM_elem_flag_set(v, BM_ELEM_HIDDEN, hide);
}
-static void edge_flush_hide(BMesh *bm, BMEdge *e)
+static void edge_flush_hide(BMEdge *e)
{
BMIter iter;
BMFace *f;
int hide = TRUE;
- BM_ITER(f, &iter, bm, BM_FACES_OF_EDGE, e) {
+ BM_ITER_ELEM (f, &iter, e, BM_FACES_OF_EDGE) {
hide = hide && BM_elem_flag_test(f, BM_ELEM_HIDDEN);
}
BM_elem_flag_set(e, BM_ELEM_HIDDEN, hide);
}
-void BM_vert_hide_set(BMesh *bm, BMVert *v, int hide)
+void BM_vert_hide_set(BMVert *v, int hide)
{
/* vert hiding: vert + surrounding edges and faces */
BMIter iter, fiter;
@@ -925,46 +928,46 @@ void BM_vert_hide_set(BMesh *bm, BMVert *v, int hide)
BM_elem_flag_set(v, BM_ELEM_HIDDEN, hide);
- BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e, &iter, v, BM_EDGES_OF_VERT) {
BM_elem_flag_set(e, BM_ELEM_HIDDEN, hide);
- BM_ITER(f, &fiter, bm, BM_FACES_OF_EDGE, e) {
+ BM_ITER_ELEM (f, &fiter, e, BM_FACES_OF_EDGE) {
BM_elem_flag_set(f, BM_ELEM_HIDDEN, hide);
}
}
}
-void BM_edge_hide_set(BMesh *bm, BMEdge *e, int hide)
+void BM_edge_hide_set(BMEdge *e, int hide)
{
BMIter iter;
BMFace *f;
/* BMVert *v; */
/* edge hiding: faces around the edge */
- BM_ITER(f, &iter, bm, BM_FACES_OF_EDGE, e) {
+ BM_ITER_ELEM (f, &iter, e, BM_FACES_OF_EDGE) {
BM_elem_flag_set(f, BM_ELEM_HIDDEN, hide);
}
BM_elem_flag_set(e, BM_ELEM_HIDDEN, hide);
/* hide vertices if necessary */
- vert_flush_hide_set(bm, e->v1);
- vert_flush_hide_set(bm, e->v2);
+ vert_flush_hide_set(e->v1);
+ vert_flush_hide_set(e->v2);
}
-void BM_face_hide_set(BMesh *bm, BMFace *f, int hide)
+void BM_face_hide_set(BMFace *f, int hide)
{
BMIter iter;
BMLoop *l;
BM_elem_flag_set(f, BM_ELEM_HIDDEN, hide);
- BM_ITER(l, &iter, bm, BM_LOOPS_OF_FACE, f) {
- edge_flush_hide(bm, l->e);
+ BM_ITER_ELEM (l, &iter, f, BM_LOOPS_OF_FACE) {
+ edge_flush_hide(l->e);
}
- BM_ITER(l, &iter, bm, BM_LOOPS_OF_FACE, f) {
- vert_flush_hide_set(bm, l->v);
+ BM_ITER_ELEM (l, &iter, f, BM_LOOPS_OF_FACE) {
+ vert_flush_hide_set(l->v);
}
}
@@ -975,15 +978,15 @@ void _bm_elem_hide_set(BMesh *bm, BMHeader *head, int hide)
switch (head->htype) {
case BM_VERT:
if (hide) BM_vert_select_set(bm, (BMVert *)head, FALSE);
- BM_vert_hide_set(bm, (BMVert *)head, hide);
+ BM_vert_hide_set((BMVert *)head, hide);
break;
case BM_EDGE:
if (hide) BM_edge_select_set(bm, (BMEdge *)head, FALSE);
- BM_edge_hide_set(bm, (BMEdge *)head, hide);
+ BM_edge_hide_set((BMEdge *)head, hide);
break;
case BM_FACE:
if (hide) BM_face_select_set(bm, (BMFace *)head, FALSE);
- BM_face_hide_set(bm, (BMFace *)head, hide);
+ BM_face_hide_set((BMFace *)head, hide);
break;
default:
BMESH_ASSERT(0);
diff --git a/source/blender/bmesh/intern/bmesh_marking.h b/source/blender/bmesh/intern/bmesh_marking.h
index 73423bc181d..a3e97ea9677 100644
--- a/source/blender/bmesh/intern/bmesh_marking.h
+++ b/source/blender/bmesh/intern/bmesh_marking.h
@@ -37,9 +37,9 @@ typedef struct BMEditSelection
/* geometry hiding code */
#define BM_elem_hide_set(bm, ele, hide) _bm_elem_hide_set(bm, &(ele)->head, hide)
void _bm_elem_hide_set(BMesh *bm, BMHeader *ele, int hide);
-void BM_vert_hide_set(BMesh *bm, BMVert *v, int hide);
-void BM_edge_hide_set(BMesh *bm, BMEdge *e, int hide);
-void BM_face_hide_set(BMesh *bm, BMFace *f, int hide);
+void BM_vert_hide_set(BMVert *v, int hide);
+void BM_edge_hide_set(BMEdge *e, int hide);
+void BM_face_hide_set(BMFace *f, int hide);
/* Selection code */
#define BM_elem_select_set(bm, ele, hide) _bm_elem_select_set(bm, &(ele)->head, hide)
@@ -71,9 +71,9 @@ int BM_mesh_elem_hflag_count_enabled(BMesh *bm, const char htype, const char hfl
int BM_mesh_elem_hflag_count_disabled(BMesh *bm, const char htype, const char hflag, int respecthide);
/* edit selection stuff */
-void BM_active_face_set(BMesh *em, BMFace *f);
+void BM_active_face_set(BMesh *bm, BMFace *f);
BMFace *BM_active_face_get(BMesh *bm, int sloppy);
-void BM_editselection_center(BMesh *bm, float r_center[3], BMEditSelection *ese);
+void BM_editselection_center(float r_center[3], BMEditSelection *ese);
void BM_editselection_normal(float r_normal[3], BMEditSelection *ese);
void BM_editselection_plane(BMesh *bm, float r_plane[3], BMEditSelection *ese);
diff --git a/source/blender/bmesh/intern/bmesh_mesh.c b/source/blender/bmesh/intern/bmesh_mesh.c
index c15937abf1d..454ab58d720 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.c
+++ b/source/blender/bmesh/intern/bmesh_mesh.c
@@ -104,15 +104,15 @@ void BM_mesh_data_free(BMesh *bm)
BMIter iter;
BMIter itersub;
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
CustomData_bmesh_free_block(&(bm->vdata), &(v->head.data));
}
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
CustomData_bmesh_free_block(&(bm->edata), &(e->head.data));
}
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
CustomData_bmesh_free_block(&(bm->pdata), &(f->head.data));
- BM_ITER(l, &itersub, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &itersub, f, BM_LOOPS_OF_FACE) {
CustomData_bmesh_free_block(&(bm->ldata), &(l->head.data));
}
}
@@ -211,19 +211,19 @@ void BM_mesh_normals_update(BMesh *bm, const short skip_hidden)
float (*edgevec)[3];
/* calculate all face normals */
- BM_ITER(f, &faces, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &faces, bm, BM_FACES_OF_MESH) {
if (skip_hidden && BM_elem_flag_test(f, BM_ELEM_HIDDEN))
continue;
-#if 0 /* UNUSED */
+#if 0 /* UNUSED */
if (f->head.flag & BM_NONORMCALC)
continue;
#endif
- BM_face_normal_update(bm, f);
+ BM_face_normal_update(f);
}
/* Zero out vertex normals */
- BM_ITER(v, &verts, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &verts, bm, BM_VERTS_OF_MESH) {
if (skip_hidden && BM_elem_flag_test(v, BM_ELEM_HIDDEN))
continue;
@@ -235,7 +235,7 @@ void BM_mesh_normals_update(BMesh *bm, const short skip_hidden)
* normals */
index = 0;
edgevec = MEM_callocN(sizeof(float) * 3 * bm->totedge, "BM normal computation array");
- BM_ITER(e, &edges, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &edges, bm, BM_EDGES_OF_MESH) {
BM_elem_index_set(e, index); /* set_inline */
if (e->l) {
@@ -251,12 +251,12 @@ void BM_mesh_normals_update(BMesh *bm, const short skip_hidden)
bm->elem_index_dirty &= ~BM_EDGE;
/* add weighted face normals to vertices */
- BM_ITER(f, &faces, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &faces, bm, BM_FACES_OF_MESH) {
if (skip_hidden && BM_elem_flag_test(f, BM_ELEM_HIDDEN))
continue;
- BM_ITER(l, &loops, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &loops, f, BM_LOOPS_OF_FACE) {
float *e1diff, *e2diff;
float dotprod;
float fac;
@@ -282,7 +282,7 @@ void BM_mesh_normals_update(BMesh *bm, const short skip_hidden)
}
/* normalize the accumulated vertex normals */
- BM_ITER(v, &verts, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &verts, bm, BM_VERTS_OF_MESH) {
if (skip_hidden && BM_elem_flag_test(v, BM_ELEM_HIDDEN))
continue;
@@ -304,7 +304,7 @@ void BM_mesh_normals_update(BMesh *bm, const short skip_hidden)
*/
//keep in sycn with utils.c!
-#define FACE_FLIP 8
+#define FACE_FLIP 8
static void bm_rationalize_normals(BMesh *bm, int undo)
{
BMOperator bmop;
@@ -312,7 +312,7 @@ static void bm_rationalize_normals(BMesh *bm, int undo)
BMIter iter;
if (undo) {
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(f, BM_ELEM_TAG)) {
BM_face_normal_flip(bm, f);
}
@@ -327,7 +327,7 @@ static void bm_rationalize_normals(BMesh *bm, int undo)
BMO_push(bm, &bmop);
bmo_righthandfaces_exec(bm, &bmop);
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
BM_elem_flag_set(f, BM_ELEM_TAG, BMO_elem_flag_test(bm, f, FACE_FLIP));
}
@@ -350,10 +350,10 @@ static void UNUSED_FUNCTION(bm_mdisps_space_set)(Object *ob, BMesh *bm, int from
mdisps = CustomData_get_layer(&dm->loopData, CD_MDISPS);
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
BMLoop *l;
BMIter liter;
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
MDisps *lmd = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MDISPS);
if (!lmd->disps) {
@@ -463,7 +463,7 @@ void BM_mesh_elem_index_ensure(BMesh *bm, const char hflag)
if (hflag & BM_VERT) {
if (bm->elem_index_dirty & BM_VERT) {
int index = 0;
- BM_ITER(ele, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (ele, &iter, bm, BM_VERTS_OF_MESH) {
BM_elem_index_set(ele, index); /* set_ok */
index++;
}
@@ -478,7 +478,7 @@ void BM_mesh_elem_index_ensure(BMesh *bm, const char hflag)
if (hflag & BM_EDGE) {
if (bm->elem_index_dirty & BM_EDGE) {
int index = 0;
- BM_ITER(ele, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (ele, &iter, bm, BM_EDGES_OF_MESH) {
BM_elem_index_set(ele, index); /* set_ok */
index++;
}
@@ -493,7 +493,7 @@ void BM_mesh_elem_index_ensure(BMesh *bm, const char hflag)
if (hflag & BM_FACE) {
if (bm->elem_index_dirty & BM_FACE) {
int index = 0;
- BM_ITER(ele, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (ele, &iter, bm, BM_FACES_OF_MESH) {
BM_elem_index_set(ele, index); /* set_ok */
index++;
}
@@ -540,7 +540,7 @@ void BM_mesh_elem_index_validate(BMesh *bm, const char *location, const char *fu
int err_val = 0;
int err_idx = 0;
- BM_ITER(ele, &iter, bm, iter_types[i], NULL) {
+ BM_ITER_MESH (ele, &iter, bm, iter_types[i]) {
if (!is_dirty) {
if (BM_elem_index_get(ele) != index) {
err_val = BM_elem_index_get(ele);
@@ -561,7 +561,7 @@ void BM_mesh_elem_index_validate(BMesh *bm, const char *location, const char *fu
}
else if ((is_error == FALSE) && (is_dirty == TRUE)) {
-#if 0 /* mostly annoying */
+#if 0 /* mostly annoying */
/* dirty may have been incorrectly set */
fprintf(stderr,
@@ -584,6 +584,176 @@ void BM_mesh_elem_index_validate(BMesh *bm, const char *location, const char *fu
}
+/**
+ * Remaps the vertices, edges and/or faces of the bmesh as indicated by vert/edge/face_idx arrays
+ * (xxx_idx[org_index] = new_index).
+ *
+ * A NULL array means no changes.
+ *
+ * Note: - Does not mess with indices, just sets elem_index_dirty flag.
+ * - For verts/edges/faces only (as loops must remain "ordered" and "aligned"
+ * on a per-face basis...).
+ *
+ * WARNING: Be careful if you keep pointers to affected BM elements, or arrays, when using this func!
+ */
+void BM_mesh_remap(BMesh *bm, int *vert_idx, int *edge_idx, int *face_idx)
+{
+ /* Mapping old to new pointers. */
+ GHash *vptr_map = NULL, *eptr_map = NULL, *fptr_map = NULL;
+ BMIter iter, iterl;
+ BMVert *ve;
+ BMEdge *ed;
+ BMFace *fa;
+ BMLoop *lo;
+
+ if (!(vert_idx || edge_idx || face_idx))
+ return;
+
+ /* Remap vertices */
+ if (vert_idx) {
+ BMVert **verts_pool, *verts_copy, **vep;
+ int i, totvert = bm->totvert;
+ int *new_idx = NULL;
+
+ /* Init the old-to-new vert pointers mapping */
+ vptr_map = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "BM_mesh_remap vert pointers mapping");
+
+ /* Make a copy of all vertices. */
+ verts_pool = MEM_callocN(sizeof(BMVert *) * totvert, "BM_mesh_remap verts pool");
+ BM_iter_as_array(bm, BM_VERTS_OF_MESH, NULL, (void **)verts_pool, totvert);
+ verts_copy = MEM_mallocN(sizeof(BMVert) * totvert, "BM_mesh_remap verts copy");
+ for (i = totvert, ve = verts_copy + totvert - 1, vep = verts_pool + totvert - 1; i--; ve--, vep--) {
+ *ve = **vep;
+/* printf("*vep: %p, verts_pool[%d]: %p\n", *vep, i, verts_pool[i]);*/
+ }
+
+ /* Copy back verts to their new place, and update old2new pointers mapping. */
+ new_idx = vert_idx + totvert - 1;
+ ve = verts_copy + totvert - 1;
+ vep = verts_pool + totvert - 1; /* old, org pointer */
+ for (i = totvert; i--; new_idx--, ve--, vep--) {
+ BMVert *new_vep = verts_pool[*new_idx];
+ *new_vep = *ve;
+/* printf("mapping vert from %d to %d (%p/%p to %p)\n", i, *new_idx, *vep, verts_pool[i], new_vep);*/
+ BLI_ghash_insert(vptr_map, (void *)*vep, (void *)new_vep);
+ }
+ bm->elem_index_dirty |= BM_VERT;
+
+ MEM_freeN(verts_pool);
+ MEM_freeN(verts_copy);
+ }
+
+ /* XXX Code not tested yet (though I don't why it would fail)! */
+ if (edge_idx) {
+ BMEdge **edges_pool, *edges_copy, **edp;
+ int i, totedge = bm->totedge;
+ int *new_idx = NULL;
+
+ /* Init the old-to-new vert pointers mapping */
+ eptr_map = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "BM_mesh_remap edge pointers mapping");
+
+ /* Make a copy of all vertices. */
+ edges_pool = MEM_callocN(sizeof(BMEdge *) * totedge, "BM_mesh_remap edges pool");
+ BM_iter_as_array(bm, BM_EDGES_OF_MESH, NULL, (void **)edges_pool, totedge);
+ edges_copy = MEM_mallocN(sizeof(BMEdge) * totedge, "BM_mesh_remap edges copy");
+ for (i = totedge, ed = edges_copy + totedge - 1, edp = edges_pool + totedge - 1; i--; ed--, edp--) {
+ *ed = **edp;
+ }
+
+ /* Copy back verts to their new place, and update old2new pointers mapping. */
+ new_idx = edge_idx + totedge - 1;
+ ed = edges_copy + totedge - 1;
+ edp = edges_pool + totedge - 1; /* old, org pointer */
+ for (i = totedge; i--; new_idx--, ed--, edp--) {
+ BMEdge *new_edp = edges_pool[*new_idx];
+ *new_edp = *ed;
+ BLI_ghash_insert(eptr_map, (void *)*edp, (void *)new_edp);
+ }
+
+ bm->elem_index_dirty |= BM_EDGE;
+
+ MEM_freeN(edges_pool);
+ MEM_freeN(edges_copy);
+ }
+
+ /* XXX Code not tested yet (though I don't why it would fail)! */
+ if (face_idx) {
+ BMFace **faces_pool, *faces_copy, **fap;
+ int i, totface = bm->totface;
+ int *new_idx = NULL;
+
+ /* Init the old-to-new vert pointers mapping */
+ fptr_map = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "BM_mesh_remap face pointers mapping");
+
+ /* Make a copy of all vertices. */
+ faces_pool = MEM_callocN(sizeof(BMFace *) * totface, "BM_mesh_remap faces pool");
+ BM_iter_as_array(bm, BM_FACES_OF_MESH, NULL, (void **)faces_pool, totface);
+ faces_copy = MEM_mallocN(sizeof(BMFace) * totface, "BM_mesh_remap faces copy");
+ for (i = totface, fa = faces_copy + totface - 1, fap = faces_pool + totface - 1; i--; fa--, fap--) {
+ *fa = **fap;
+ }
+
+ /* Copy back verts to their new place, and update old2new pointers mapping. */
+ new_idx = face_idx + totface - 1;
+ fa = faces_copy + totface - 1;
+ fap = faces_pool + totface - 1; /* old, org pointer */
+ for (i = totface; i--; new_idx--, fa--, fap--) {
+ BMFace *new_fap = faces_pool[*new_idx];
+ *new_fap = *fa;
+ BLI_ghash_insert(fptr_map, (void *)*fap, (void *)new_fap);
+ }
+
+ bm->elem_index_dirty |= BM_FACE;
+
+ MEM_freeN(faces_pool);
+ MEM_freeN(faces_copy);
+ }
+
+ /* And now, fix all vertices/edges/faces/loops pointers! */
+ /* Verts' pointers, only edge pointers... */
+ if (eptr_map) {
+ BM_ITER_MESH (ve, &iter, bm, BM_VERTS_OF_MESH) {
+/* printf("Vert e: %p -> %p\n", ve->e, BLI_ghash_lookup(eptr_map, (const void*)ve->e));*/
+ ve->e = BLI_ghash_lookup(eptr_map, (const void *)ve->e);
+ }
+ }
+
+ /* Edges' pointers, only vert pointers (as we don’t mess with loops!)... */
+ if (vptr_map) {
+ BM_ITER_MESH (ed, &iter, bm, BM_EDGES_OF_MESH) {
+/* printf("Edge v1: %p -> %p\n", ed->v1, BLI_ghash_lookup(vptr_map, (const void*)ed->v1));*/
+/* printf("Edge v2: %p -> %p\n", ed->v2, BLI_ghash_lookup(vptr_map, (const void*)ed->v2));*/
+ ed->v1 = BLI_ghash_lookup(vptr_map, (const void *)ed->v1);
+ ed->v2 = BLI_ghash_lookup(vptr_map, (const void *)ed->v2);
+ }
+ }
+
+ /* Faces' pointers (loops, in fact), always needed... */
+ BM_ITER_MESH (fa, &iter, bm, BM_FACES_OF_MESH) {
+ BM_ITER_ELEM (lo, &iterl, fa, BM_LOOPS_OF_FACE) {
+ if (vptr_map) {
+/* printf("Loop v: %p -> %p\n", lo->v, BLI_ghash_lookup(vptr_map, (const void*)lo->v));*/
+ lo->v = BLI_ghash_lookup(vptr_map, (const void *)lo->v);
+ }
+ if (eptr_map) {
+/* printf("Loop e: %p -> %p\n", lo->e, BLI_ghash_lookup(eptr_map, (const void*)lo->e));*/
+ lo->e = BLI_ghash_lookup(eptr_map, (const void *)lo->e);
+ }
+ if (fptr_map) {
+/* printf("Loop f: %p -> %p\n", lo->f, BLI_ghash_lookup(fptr_map, (const void*)lo->f));*/
+ lo->f = BLI_ghash_lookup(fptr_map, (const void *)lo->f);
+ }
+ }
+ }
+
+ if (vptr_map)
+ BLI_ghash_free(vptr_map, NULL, NULL);
+ if (eptr_map)
+ BLI_ghash_free(eptr_map, NULL, NULL);
+ if (fptr_map)
+ BLI_ghash_free(fptr_map, NULL, NULL);
+}
+
BMVert *BM_vert_at_index(BMesh *bm, const int index)
{
return BLI_mempool_findelem(bm->vpool, index);
diff --git a/source/blender/bmesh/intern/bmesh_mesh.h b/source/blender/bmesh/intern/bmesh_mesh.h
index f48cc09af3b..970db6339c3 100644
--- a/source/blender/bmesh/intern/bmesh_mesh.h
+++ b/source/blender/bmesh/intern/bmesh_mesh.h
@@ -43,6 +43,7 @@ void bmesh_edit_end(BMesh *bm, int flag);
void BM_mesh_elem_index_ensure(BMesh *bm, const char hflag);
void BM_mesh_elem_index_validate(BMesh *bm, const char *location, const char *func,
const char *msg_a, const char *msg_b);
+void BM_mesh_remap(BMesh *bm, int *vert_idx, int *edge_idx, int *face_idx);
BMVert *BM_vert_at_index(BMesh *bm, const int index);
BMEdge *BM_edge_at_index(BMesh *bm, const int index);
diff --git a/source/blender/bmesh/intern/bmesh_mesh_conv.c b/source/blender/bmesh/intern/bmesh_mesh_conv.c
index 2be9d4c7490..e247a69f1e9 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_conv.c
+++ b/source/blender/bmesh/intern/bmesh_mesh_conv.c
@@ -89,6 +89,7 @@
#include "BKE_mesh.h"
#include "BKE_customdata.h"
+#include "BKE_multires.h"
#include "BKE_global.h" /* ugh - for looping over all objects */
#include "BKE_main.h"
@@ -262,7 +263,7 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me, int set_key, int act_key_nr)
/* this is necessary for selection counts to work properly */
if (medge->flag & SELECT) {
- BM_elem_select_set(bm, e, TRUE);
+ BM_edge_select_set(bm, e, TRUE);
}
/* Copy Custom Data */
@@ -328,14 +329,14 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me, int set_key, int act_key_nr)
/* this is necessary for selection counts to work properly */
if (mpoly->flag & ME_FACE_SEL) {
- BM_elem_select_set(bm, f, TRUE);
+ BM_face_select_set(bm, f, TRUE);
}
f->mat_nr = mpoly->mat_nr;
if (i == me->act_face) bm->act_face = f;
j = 0;
- BM_ITER_INDEX(l, &iter, bm, BM_LOOPS_OF_FACE, f, j) {
+ BM_ITER_ELEM_INDEX (l, &iter, f, BM_LOOPS_OF_FACE, j) {
/* Save index of correspsonding MLoop */
BM_elem_index_set(l, mpoly->loopstart + j); /* set_loop */
}
@@ -354,8 +355,8 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me, int set_key, int act_key_nr)
* but is an optimization, to avoid copying a bunch of interpolated customdata
* for each BMLoop (from previous BMLoops using the same edge), always followed
* by freeing the interpolated data and overwriting it with data from the Mesh. */
- BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
int li = BM_elem_index_get(l);
CustomData_to_bmesh_block(&me->ldata, &bm->ldata, li, &l->head.data);
BM_elem_index_set(l, 0); /* set_loop */
@@ -378,9 +379,9 @@ void BM_mesh_bm_from_me(BMesh *bm, Mesh *me, int set_key, int act_key_nr)
BMFace *face;
MSelect *msel;
- BM_ITER_INDEX(vert, &iter, bm, BM_VERTS_OF_MESH, NULL, i) { vert_array[i] = vert; }
- BM_ITER_INDEX(edge, &iter, bm, BM_EDGES_OF_MESH, NULL, i) { edge_array[i] = edge; }
- BM_ITER_INDEX(face, &iter, bm, BM_FACES_OF_MESH, NULL, i) { face_array[i] = face; }
+ BM_ITER_MESH_INDEX (vert, &iter, bm, BM_VERTS_OF_MESH, i) { vert_array[i] = vert; }
+ BM_ITER_MESH_INDEX (edge, &iter, bm, BM_EDGES_OF_MESH, i) { edge_array[i] = edge; }
+ BM_ITER_MESH_INDEX (face, &iter, bm, BM_FACES_OF_MESH, i) { face_array[i] = face; }
for (i = 0, msel = me->mselect; i < me->totselect; i++, msel++) {
switch (msel->type) {
@@ -431,7 +432,7 @@ static BMVert **bm_to_mesh_vertex_map(BMesh *bm, int ototvert)
vertMap = MEM_callocN(sizeof(*vertMap) * ototvert, "vertMap");
if (CustomData_has_layer(&bm->vdata, CD_SHAPE_KEYINDEX)) {
int *keyi;
- BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
keyi = CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_SHAPE_KEYINDEX);
if (keyi) {
if (((index = *keyi) != ORIGINDEX_NONE) && (index < ototvert)) {
@@ -447,7 +448,7 @@ static BMVert **bm_to_mesh_vertex_map(BMesh *bm, int ototvert)
}
}
else {
- BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
if (i < ototvert) {
vertMap[i] = eve;
}
@@ -563,7 +564,7 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, int dotess)
mesh_update_customdata_pointers(me, 0);
i = 0;
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
float *bweight = CustomData_bmesh_get(&bm->vdata, v->head.data, CD_BWEIGHT);
mvert->bweight = bweight ? (char)((*bweight) * 255) : 0;
@@ -581,13 +582,13 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, int dotess)
i++;
mvert++;
- BM_CHECK_ELEMENT(bm, v);
+ BM_CHECK_ELEMENT(v);
}
bm->elem_index_dirty &= ~BM_VERT;
med = medge;
i = 0;
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
float *crease = CustomData_bmesh_get(&bm->edata, e->head.data, CD_CREASE);
float *bweight = CustomData_bmesh_get(&bm->edata, e->head.data, CD_BWEIGHT);
@@ -607,13 +608,13 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, int dotess)
i++;
med++;
- BM_CHECK_ELEMENT(bm, e);
+ BM_CHECK_ELEMENT(e);
}
bm->elem_index_dirty &= ~BM_EDGE;
i = 0;
j = 0;
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
mpoly->loopstart = j;
mpoly->totloop = f->len;
mpoly->mat_nr = f->mat_nr;
@@ -626,9 +627,9 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, int dotess)
/* copy over customdat */
CustomData_from_bmesh_block(&bm->ldata, &me->ldata, l->head.data, j);
- BM_CHECK_ELEMENT(bm, l);
- BM_CHECK_ELEMENT(bm, l->e);
- BM_CHECK_ELEMENT(bm, l->v);
+ BM_CHECK_ELEMENT(l);
+ BM_CHECK_ELEMENT(l->e);
+ BM_CHECK_ELEMENT(l->v);
}
if (f == bm->act_face) me->act_face = i;
@@ -638,7 +639,7 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, int dotess)
i++;
mpoly++;
- BM_CHECK_ELEMENT(bm, f);
+ BM_CHECK_ELEMENT(f);
}
/* patch hook indices and vertex parents */
@@ -782,7 +783,7 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, int dotess)
ofs = MEM_callocN(sizeof(float) * 3 * bm->totvert, "currkey->data");
mvert = me->mvert;
- BM_ITER_INDEX(eve, &iter, bm, BM_VERTS_OF_MESH, NULL, i) {
+ BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
keyi = CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_SHAPE_KEYINDEX);
if (keyi && *keyi != ORIGINDEX_NONE) {
sub_v3_v3v3(ofs[i], mvert->co, fp[*keyi]);
@@ -805,7 +806,7 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, int dotess)
oldkey = currkey->data;
mvert = me->mvert;
- BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
if (currkey == actkey) {
copy_v3_v3(fp, eve->co);
@@ -823,7 +824,10 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, int dotess)
/* in most cases this runs */
copy_v3_v3(fp, CustomData_bmesh_get_n(&bm->vdata, eve->head.data, CD_SHAPEKEY, j));
}
- else if (oldkey) {
+ else if (oldkey &&
+ (keyi = CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_SHAPE_KEYINDEX)) &&
+ (*keyi != ORIGINDEX_NONE && *keyi < currkey->totelem))
+ {
/* old method of reconstructing keys via vertice's original key indices,
* currently used if the new method above fails (which is theoretically
* possible in certain cases of undo) */
@@ -854,4 +858,7 @@ void BM_mesh_bm_to_me(BMesh *bm, Mesh *me, int dotess)
}
if (oldverts) MEM_freeN(oldverts);
+
+ /* topology could be changed, ensure mdisps are ok */
+ multires_topology_changed(me);
}
diff --git a/source/blender/bmesh/intern/bmesh_mesh_validate.c b/source/blender/bmesh/intern/bmesh_mesh_validate.c
index f91e9d82879..3ec3b84c120 100644
--- a/source/blender/bmesh/intern/bmesh_mesh_validate.c
+++ b/source/blender/bmesh/intern/bmesh_mesh_validate.c
@@ -70,7 +70,7 @@ int BM_mesh_validate(BMesh *bm)
bm->elem_index_dirty |= BM_ALL;
BM_mesh_elem_index_ensure(bm, BM_ALL);
- BM_ITER_INDEX(v, &iter, bm, BM_VERTS_OF_MESH, NULL, i) {
+ BM_ITER_MESH_INDEX (v, &iter, bm, BM_VERTS_OF_MESH, i) {
if (BM_elem_flag_test(v, BM_ELEM_SELECT | BM_ELEM_HIDDEN) == (BM_ELEM_SELECT | BM_ELEM_HIDDEN)) {
ERRMSG("vert %d: is hidden and selected", i);
}
@@ -83,13 +83,13 @@ int BM_mesh_validate(BMesh *bm)
}
/* check edges */
- BM_ITER_INDEX(e, &iter, bm, BM_EDGES_OF_MESH, NULL, i) {
+ BM_ITER_MESH_INDEX (e, &iter, bm, BM_EDGES_OF_MESH, i) {
if (e->v1 == e->v2)
ERRMSG("edge %d: duplicate index: %d", i, BM_elem_index_get(e->v1));
}
/* edge radial structure */
- BM_ITER_INDEX(e, &iter, bm, BM_EDGES_OF_MESH, NULL, i) {
+ BM_ITER_MESH_INDEX (e, &iter, bm, BM_EDGES_OF_MESH, i) {
if (BM_elem_flag_test(e, BM_ELEM_SELECT | BM_ELEM_HIDDEN) == (BM_ELEM_SELECT | BM_ELEM_HIDDEN)) {
ERRMSG("edge %d: is hidden and selected", i);
}
@@ -117,7 +117,7 @@ int BM_mesh_validate(BMesh *bm)
}
/* face structure */
- BM_ITER_INDEX(f, &iter, bm, BM_FACES_OF_MESH, NULL, i) {
+ BM_ITER_MESH_INDEX (f, &iter, bm, BM_FACES_OF_MESH, i) {
BMLoop *l_iter;
BMLoop *l_first;
diff --git a/source/blender/bmesh/intern/bmesh_mods.c b/source/blender/bmesh/intern/bmesh_mods.c
index 78db5baffd0..21654097219 100644
--- a/source/blender/bmesh/intern/bmesh_mods.c
+++ b/source/blender/bmesh/intern/bmesh_mods.c
@@ -286,8 +286,8 @@ BMEdge *BM_verts_connect(BMesh *bm, BMVert *v1, BMVert *v2, BMFace **r_f)
BMFace *f_iter;
/* be warned: this can do weird things in some ngon situation, see BM_face_legal_splits */
- BM_ITER(f_iter, &fiter, bm, BM_FACES_OF_VERT, v1) {
- BM_ITER(v_iter, &viter, bm, BM_FACES_OF_VERT, f_iter) {
+ BM_ITER_ELEM (f_iter, &fiter, v1, BM_FACES_OF_VERT) {
+ BM_ITER_ELEM (v_iter, &viter, f_iter, BM_FACES_OF_VERT) {
if (v_iter == v2) {
BMLoop *nl;
@@ -521,7 +521,7 @@ BMEdge *BM_vert_collapse_faces(BMesh *bm, BMEdge *ke, BMVert *kv, float fac,
BMFace *f;
BLI_array_staticdeclare(faces, 8);
- BM_ITER(f, &iter, bm, BM_FACES_OF_VERT, kv) {
+ BM_ITER_ELEM (f, &iter, kv, BM_FACES_OF_VERT) {
BLI_array_append(faces, f);
}
@@ -544,18 +544,28 @@ BMEdge *BM_vert_collapse_faces(BMesh *bm, BMEdge *ke, BMVert *kv, float fac,
ne = bmesh_jekv(bm, ke, kv, TRUE);
/* ne = BM_edge_exists(tv, tv2); */ /* same as return above */
- if (kill_degenerate_faces) {
+ if (ne && kill_degenerate_faces) {
+ BLI_array_declare(bad_faces);
+ BMFace **bad_faces = NULL;
+
BMIter fiter;
BMFace *f;
BMVert *verts[2] = {ne->v1, ne->v2};
int i;
+
for (i = 0; i < 2; i++) {
- BM_ITER(f, &fiter, bm, BM_FACES_OF_VERT, verts[i]) {
+ /* cant kill data we loop on, build a list and remove those */
+ BLI_array_empty(bad_faces);
+ BM_ITER_ELEM (f, &fiter, verts[i], BM_FACES_OF_VERT) {
if (f->len < 3) {
- BM_face_kill(bm, f);
+ BLI_array_append(bad_faces, f);
}
}
+ while ((f = BLI_array_pop(bad_faces))) {
+ BM_face_kill(bm, f);
+ }
}
+ BLI_array_free(bad_faces);
}
}
@@ -807,14 +817,14 @@ int BM_face_validate(BMesh *bm, BMFace *face, FILE *err)
*
* \note #BM_edge_rotate_check must have already run.
*/
-void BM_edge_rotate_calc(BMesh *bm, BMEdge *e, int ccw,
+void BM_edge_rotate_calc(BMEdge *e, int ccw,
BMLoop **r_l1, BMLoop **r_l2)
{
BMVert *v1, *v2;
BMFace *fa, *fb;
/* this should have already run */
- BLI_assert(BM_edge_rotate_check(bm, e) == TRUE);
+ BLI_assert(BM_edge_rotate_check(e) == TRUE);
/* we know this will work */
BM_edge_face_pair(e, &fa, &fb);
@@ -832,9 +842,6 @@ void BM_edge_rotate_calc(BMesh *bm, BMEdge *e, int ccw,
*r_l1 = BM_face_other_vert_loop(fb, v2, v1);
*r_l2 = BM_face_other_vert_loop(fa, v1, v2);
-
- /* when assert isn't used */
- (void)bm;
}
/**
@@ -843,7 +850,7 @@ void BM_edge_rotate_calc(BMesh *bm, BMEdge *e, int ccw,
* Quick check to see if we could rotate the edge,
* use this to avoid calling exceptions on common cases.
*/
-int BM_edge_rotate_check(BMesh *UNUSED(bm), BMEdge *e)
+int BM_edge_rotate_check(BMEdge *e)
{
BMFace *fa, *fb;
if (BM_edge_face_pair(e, &fa, &fb)) {
@@ -884,8 +891,7 @@ int BM_edge_rotate_check(BMesh *UNUSED(bm), BMEdge *e)
* \param l1,l2 are the loops of the proposed verts to rotate too and should
* be the result of calling #BM_edge_rotate_calc
*/
-int BM_edge_rotate_check_degenerate(BMesh *bm, BMEdge *e,
- BMLoop *l1, BMLoop *l2)
+int BM_edge_rotate_check_degenerate(BMEdge *e, BMLoop *l1, BMLoop *l2)
{
/* note: for these vars 'old' just means initial edge state. */
@@ -912,7 +918,7 @@ int BM_edge_rotate_check_degenerate(BMesh *bm, BMEdge *e,
BMVert *v1_alt, *v2_alt;
/* this should have already run */
- BLI_assert(BM_edge_rotate_check(bm, e) == TRUE);
+ BLI_assert(BM_edge_rotate_check(e) == TRUE);
BM_edge_ordered_verts(e, &v1_old, &v2_old);
@@ -971,12 +977,9 @@ int BM_edge_rotate_check_degenerate(BMesh *bm, BMEdge *e,
}
return TRUE;
-
- /* when assert isn't used */
- (void)bm;
}
-int BM_edge_rotate_check_beauty(BMesh *UNUSED(bm), BMEdge *e,
+int BM_edge_rotate_check_beauty(BMEdge *e,
BMLoop *l1, BMLoop *l2)
{
/* Stupid check for now:
@@ -1009,11 +1012,11 @@ BMEdge *BM_edge_rotate(BMesh *bm, BMEdge *e, const short ccw, const short check_
char f_hflag_prev_1;
char f_hflag_prev_2;
- if (!BM_edge_rotate_check(bm, e)) {
+ if (!BM_edge_rotate_check(e)) {
return NULL;
}
- BM_edge_rotate_calc(bm, e, ccw, &l1, &l2);
+ BM_edge_rotate_calc(e, ccw, &l1, &l2);
/* the loops will be freed so assign verts */
v1 = l1->v;
@@ -1023,7 +1026,7 @@ BMEdge *BM_edge_rotate(BMesh *bm, BMEdge *e, const short ccw, const short check_
/* Checking Code - make sure we can rotate */
if (check_flag & BM_EDGEROT_CHECK_BEAUTY) {
- if (!BM_edge_rotate_check_beauty(bm, e, l1, l2)) {
+ if (!BM_edge_rotate_check_beauty(e, l1, l2)) {
return NULL;
}
}
@@ -1037,7 +1040,7 @@ BMEdge *BM_edge_rotate(BMesh *bm, BMEdge *e, const short ccw, const short check_
/* slowest, check last */
if (check_flag & BM_EDGEROT_CHECK_DEGENERATE) {
- if (!BM_edge_rotate_check_degenerate(bm, e, l1, l2)) {
+ if (!BM_edge_rotate_check_degenerate(e, l1, l2)) {
return NULL;
}
}
diff --git a/source/blender/bmesh/intern/bmesh_mods.h b/source/blender/bmesh/intern/bmesh_mods.h
index ba601eb64dc..ba6acac1a27 100644
--- a/source/blender/bmesh/intern/bmesh_mods.h
+++ b/source/blender/bmesh/intern/bmesh_mods.h
@@ -43,9 +43,9 @@ BMFace *BM_face_split(BMesh *bm, BMFace *f,
BMEdge *example, const short nodouble);
BMFace *BM_face_split_n(BMesh *bm, BMFace *f,
- BMVert *v1, BMVert *v2,
- float cos[][3], int n,
- BMLoop **r_l, BMEdge *example);
+ BMVert *v1, BMVert *v2,
+ float cos[][3], int n,
+ BMLoop **r_l, BMEdge *example);
BMEdge* BM_vert_collapse_faces(BMesh *bm, BMEdge *ke, BMVert *kv, float fac,
const short join_faces, const short kill_degenerate_faces);
@@ -59,12 +59,12 @@ BMVert *BM_edge_split_n(BMesh *bm, BMEdge *e, int numcuts);
int BM_face_validate(BMesh *bm, BMFace *face, FILE *err);
-void BM_edge_rotate_calc(BMesh *bm, BMEdge *e, int ccw,
- BMLoop **r_l1, BMLoop **r_l2);
-int BM_edge_rotate_check(BMesh *UNUSED(bm), BMEdge *e);
-int BM_edge_rotate_check_degenerate(BMesh *bm, BMEdge *e,
+void BM_edge_rotate_calc(BMEdge *e, int ccw,
+ BMLoop **r_l1, BMLoop **r_l2);
+int BM_edge_rotate_check(BMEdge *e);
+int BM_edge_rotate_check_degenerate(BMEdge *e,
BMLoop *l1, BMLoop *l2);
-int BM_edge_rotate_check_beauty(BMesh *bm, BMEdge *e,
+int BM_edge_rotate_check_beauty(BMEdge *e,
BMLoop *l1, BMLoop *l2);
BMEdge *BM_edge_rotate(BMesh *bm, BMEdge *e, const short ccw, const short check_flag);
diff --git a/source/blender/bmesh/intern/bmesh_opdefines.c b/source/blender/bmesh/intern/bmesh_opdefines.c
index 3352df71414..98d2b31e57c 100644
--- a/source/blender/bmesh/intern/bmesh_opdefines.c
+++ b/source/blender/bmesh/intern/bmesh_opdefines.c
@@ -1099,6 +1099,7 @@ static BMOpDefine bmo_inset_def = {
{BMO_OP_SLOT_BOOL, "use_even_offset"},
{BMO_OP_SLOT_BOOL, "use_relative_offset"},
{BMO_OP_SLOT_FLT, "thickness"},
+ {BMO_OP_SLOT_FLT, "depth"},
{BMO_OP_SLOT_BOOL, "use_outset"},
{0} /* null-terminating sentinel */},
bmo_inset_exec,
@@ -1110,14 +1111,14 @@ static BMOpDefine bmo_inset_def = {
*
* Translates vertes along an edge
*/
-static BMOpDefine bmo_vert_slide_def = {
-"vertslide",
+static BMOpDefine bmo_vertex_slide_def = {
+ "vertex_slide",
{{BMO_OP_SLOT_ELEMENT_BUF, "vert"},
{BMO_OP_SLOT_ELEMENT_BUF, "edge"},
{BMO_OP_SLOT_ELEMENT_BUF, "vertout"},
{BMO_OP_SLOT_FLT, "distance_t"},
{0} /* null-terminating sentinel */},
- bmo_vert_slide_exec,
+ bmo_vertex_slide_exec,
BMO_OP_FLAG_UNTAN_MULTIRES
};
@@ -1189,7 +1190,7 @@ BMOpDefine *opdefines[] = {
&bmo_bridge_loops_def,
&bmo_solidify_def,
&bmo_inset_def,
- &bmo_vert_slide_def,
+ &bmo_vertex_slide_def,
};
int bmesh_total_ops = (sizeof(opdefines) / sizeof(void *));
diff --git a/source/blender/bmesh/intern/bmesh_operators.c b/source/blender/bmesh/intern/bmesh_operators.c
index a1cdcc65f1c..dce491efe72 100644
--- a/source/blender/bmesh/intern/bmesh_operators.c
+++ b/source/blender/bmesh/intern/bmesh_operators.c
@@ -473,7 +473,7 @@ static int bmo_mesh_flag_count(BMesh *bm, const char htype, const short oflag,
for (i = 0; i < 3; i++) {
if (htype & flag_types[i]) {
- BM_ITER(ele_f, &iter, bm, iter_types[i], NULL) {
+ BM_ITER_MESH (ele_f, &iter, bm, iter_types[i]) {
if (BMO_elem_flag_test_bool(bm, ele_f, oflag) == test_for_enabled)
count++;
}
@@ -508,7 +508,7 @@ void BMO_mesh_flag_disable_all(BMesh *bm, BMOperator *UNUSED(op), const char hty
for (i = 0; i < 3; i++) {
if (htype & flag_types[i]) {
- BM_ITER(ele, &iter, bm, iter_types[i], NULL) {
+ BM_ITER_MESH (ele, &iter, bm, iter_types[i]) {
BMO_elem_flag_disable(bm, ele, oflag);
}
}
@@ -663,21 +663,21 @@ static void BMO_slot_buffer_from_all(BMesh *bm, BMOperator *op, const char *slot
/* TODO - collapse these loops into one */
if (htype & BM_VERT) {
- BM_ITER(ele, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (ele, &iter, bm, BM_VERTS_OF_MESH) {
((BMHeader **)output->data.p)[i] = ele;
i++;
}
}
if (htype & BM_EDGE) {
- BM_ITER(ele, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (ele, &iter, bm, BM_EDGES_OF_MESH) {
((BMHeader **)output->data.p)[i] = ele;
i++;
}
}
if (htype & BM_FACE) {
- BM_ITER(ele, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (ele, &iter, bm, BM_FACES_OF_MESH) {
((BMHeader **)output->data.p)[i] = ele;
i++;
}
@@ -714,7 +714,7 @@ static void bmo_slot_buffer_from_hflag(BMesh *bm, BMOperator *op, const char *sl
/* TODO - collapse these loops into one */
if (htype & BM_VERT) {
- BM_ITER(ele, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (ele, &iter, bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(ele, BM_ELEM_HIDDEN) &&
BM_elem_flag_test_bool(ele, hflag) == test_for_enabled)
{
@@ -725,7 +725,7 @@ static void bmo_slot_buffer_from_hflag(BMesh *bm, BMOperator *op, const char *sl
}
if (htype & BM_EDGE) {
- BM_ITER(ele, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (ele, &iter, bm, BM_EDGES_OF_MESH) {
if (!BM_elem_flag_test(ele, BM_ELEM_HIDDEN) &&
BM_elem_flag_test_bool(ele, hflag) == test_for_enabled)
{
@@ -736,7 +736,7 @@ static void bmo_slot_buffer_from_hflag(BMesh *bm, BMOperator *op, const char *sl
}
if (htype & BM_FACE) {
- BM_ITER(ele, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (ele, &iter, bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(ele, BM_ELEM_HIDDEN) &&
BM_elem_flag_test_bool(ele, hflag) == test_for_enabled)
{
@@ -828,7 +828,7 @@ static void bmo_slot_buffer_from_flag(BMesh *bm, BMOperator *op, const char *slo
/* TODO - collapse these loops into one */
if (htype & BM_VERT) {
- BM_ITER(ele, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (ele, &iter, bm, BM_VERTS_OF_MESH) {
if (BMO_elem_flag_test_bool(bm, (BMElemF *)ele, oflag) == test_for_enabled) {
ele_array[i] = ele;
i++;
@@ -837,7 +837,7 @@ static void bmo_slot_buffer_from_flag(BMesh *bm, BMOperator *op, const char *slo
}
if (htype & BM_EDGE) {
- BM_ITER(ele, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (ele, &iter, bm, BM_EDGES_OF_MESH) {
if (BMO_elem_flag_test_bool(bm, (BMElemF *)ele, oflag) == test_for_enabled) {
ele_array[i] = ele;
i++;
@@ -846,7 +846,7 @@ static void bmo_slot_buffer_from_flag(BMesh *bm, BMOperator *op, const char *slo
}
if (htype & BM_FACE) {
- BM_ITER(ele, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (ele, &iter, bm, BM_FACES_OF_MESH) {
if (BMO_elem_flag_test_bool(bm, (BMElemF *)ele, oflag) == test_for_enabled) {
ele_array[i] = ele;
i++;
@@ -1035,19 +1035,19 @@ static void bmo_flag_layer_alloc(BMesh *bm)
bm->toolflagpool = newpool = BLI_mempool_create(sizeof(BMFlagLayer) * bm->totflags, 512, 512, 0);
/* now go through and memcpy all the flags. Loops don't get a flag layer at this time.. */
- BM_ITER_INDEX(ele, &iter, bm, BM_VERTS_OF_MESH, NULL, i) {
+ BM_ITER_MESH_INDEX (ele, &iter, bm, BM_VERTS_OF_MESH, i) {
oldflags = ele->oflags;
ele->oflags = BLI_mempool_calloc(newpool);
memcpy(ele->oflags, oldflags, old_totflags_size);
BM_elem_index_set(ele, i); /* set_inline */
}
- BM_ITER_INDEX(ele, &iter, bm, BM_EDGES_OF_MESH, NULL, i) {
+ BM_ITER_MESH_INDEX (ele, &iter, bm, BM_EDGES_OF_MESH, i) {
oldflags = ele->oflags;
ele->oflags = BLI_mempool_calloc(newpool);
memcpy(ele->oflags, oldflags, old_totflags_size);
BM_elem_index_set(ele, i); /* set_inline */
}
- BM_ITER_INDEX(ele, &iter, bm, BM_FACES_OF_MESH, NULL, i) {
+ BM_ITER_MESH_INDEX (ele, &iter, bm, BM_FACES_OF_MESH, i) {
oldflags = ele->oflags;
ele->oflags = BLI_mempool_calloc(newpool);
memcpy(ele->oflags, oldflags, old_totflags_size);
@@ -1080,19 +1080,19 @@ static void bmo_flag_layer_free(BMesh *bm)
bm->toolflagpool = newpool = BLI_mempool_create(new_totflags_size, 512, 512, BLI_MEMPOOL_SYSMALLOC);
/* now go through and memcpy all the flag */
- BM_ITER_INDEX(ele, &iter, bm, BM_VERTS_OF_MESH, NULL, i) {
+ BM_ITER_MESH_INDEX (ele, &iter, bm, BM_VERTS_OF_MESH, i) {
oldflags = ele->oflags;
ele->oflags = BLI_mempool_calloc(newpool);
memcpy(ele->oflags, oldflags, new_totflags_size);
BM_elem_index_set(ele, i); /* set_inline */
}
- BM_ITER_INDEX(ele, &iter, bm, BM_EDGES_OF_MESH, NULL, i) {
+ BM_ITER_MESH_INDEX (ele, &iter, bm, BM_EDGES_OF_MESH, i) {
oldflags = ele->oflags;
ele->oflags = BLI_mempool_calloc(newpool);
memcpy(ele->oflags, oldflags, new_totflags_size);
BM_elem_index_set(ele, i); /* set_inline */
}
- BM_ITER_INDEX(ele, &iter, bm, BM_FACES_OF_MESH, NULL, i) {
+ BM_ITER_MESH_INDEX (ele, &iter, bm, BM_FACES_OF_MESH, i) {
oldflags = ele->oflags;
ele->oflags = BLI_mempool_calloc(newpool);
memcpy(ele->oflags, oldflags, new_totflags_size);
@@ -1115,15 +1115,15 @@ static void bmo_flag_layer_clear(BMesh *bm)
const int totflags_offset = bm->totflags - 1;
/* now go through and memcpy all the flag */
- BM_ITER_INDEX(ele, &iter, bm, BM_VERTS_OF_MESH, NULL, i) {
+ BM_ITER_MESH_INDEX (ele, &iter, bm, BM_VERTS_OF_MESH, i) {
memset(ele->oflags + totflags_offset, 0, sizeof(BMFlagLayer));
BM_elem_index_set(ele, i); /* set_inline */
}
- BM_ITER_INDEX(ele, &iter, bm, BM_EDGES_OF_MESH, NULL, i) {
+ BM_ITER_MESH_INDEX (ele, &iter, bm, BM_EDGES_OF_MESH, i) {
memset(ele->oflags + totflags_offset, 0, sizeof(BMFlagLayer));
BM_elem_index_set(ele, i); /* set_inline */
}
- BM_ITER_INDEX(ele, &iter, bm, BM_FACES_OF_MESH, NULL, i) {
+ BM_ITER_MESH_INDEX (ele, &iter, bm, BM_FACES_OF_MESH, i) {
memset(ele->oflags + totflags_offset, 0, sizeof(BMFlagLayer));
BM_elem_index_set(ele, i); /* set_inline */
}
diff --git a/source/blender/bmesh/intern/bmesh_operators_private.h b/source/blender/bmesh/intern/bmesh_operators_private.h
index c4b4f01b5b5..423b30a503a 100644
--- a/source/blender/bmesh/intern/bmesh_operators_private.h
+++ b/source/blender/bmesh/intern/bmesh_operators_private.h
@@ -37,13 +37,13 @@ void bmo_split_exec(BMesh *bm, BMOperator *op);
void bmo_spin_exec(BMesh *bm, BMOperator *op);
void bmo_dupe_exec(BMesh *bm, BMOperator *op);
void bmo_del_exec(BMesh *bm, BMOperator *op);
-void bmo_esubd_exec(BMesh *bmesh, BMOperator *op);
-void bmo_triangulate_exec(BMesh *bmesh, BMOperator *op);
-void bmo_dissolve_faces_exec(BMesh *bmesh, BMOperator *op);
-void bmo_dissolve_verts_exec(BMesh *bmesh, BMOperator *op);
-void bmo_dissolve_limit_exec(BMesh *bmesh, BMOperator *op);
+void bmo_esubd_exec(BMesh *bm, BMOperator *op);
+void bmo_triangulate_exec(BMesh *bm, BMOperator *op);
+void bmo_dissolve_faces_exec(BMesh *bm, BMOperator *op);
+void bmo_dissolve_verts_exec(BMesh *bm, BMOperator *op);
+void bmo_dissolve_limit_exec(BMesh *bm, BMOperator *op);
void bmo_extrude_face_region_exec(BMesh *bm, BMOperator *op);
-void bmo_vert_slide_exec(BMesh *bm, BMOperator *op);
+void bmo_vertex_slide_exec(BMesh *bm, BMOperator *op);
void bmo_connectverts_exec(BMesh *bm, BMOperator *op);
void bmo_extrude_vert_indiv_exec(BMesh *bm, BMOperator *op);
void bmo_mesh_to_bmesh_exec(BMesh *bm, BMOperator *op);
diff --git a/source/blender/bmesh/intern/bmesh_polygon.c b/source/blender/bmesh/intern/bmesh_polygon.c
index 33549660cb3..e7ee5cb605d 100644
--- a/source/blender/bmesh/intern/bmesh_polygon.c
+++ b/source/blender/bmesh/intern/bmesh_polygon.c
@@ -84,9 +84,7 @@ static void compute_poly_normal(float normal[3], float verts[][3], int nverts)
/* Newell's Method */
for (i = 0; i < nverts; v_prev = v_curr, v_curr = verts[++i]) {
- n[0] += (v_prev[1] - v_curr[1]) * (v_prev[2] + v_curr[2]);
- n[1] += (v_prev[2] - v_curr[2]) * (v_prev[0] + v_curr[0]);
- n[2] += (v_prev[0] - v_curr[0]) * (v_prev[1] + v_curr[1]);
+ add_newell_cross_v3_v3v3(n, v_prev, v_curr);
}
if (UNLIKELY(normalize_v3_v3(normal, n) == 0.0f)) {
@@ -109,9 +107,7 @@ static void bm_face_compute_poly_normal(BMFace *f)
/* Newell's Method */
do {
- n[0] += (v_prev[1] - v_curr[1]) * (v_prev[2] + v_curr[2]);
- n[1] += (v_prev[2] - v_curr[2]) * (v_prev[0] + v_curr[0]);
- n[2] += (v_prev[0] - v_curr[0]) * (v_prev[1] + v_curr[1]);
+ add_newell_cross_v3_v3v3(n, v_prev, v_curr);
l_iter = l_iter->next;
v_prev = v_curr;
@@ -142,9 +138,7 @@ static void bm_face_compute_poly_normal_vertex_cos(BMFace *f, float n[3],
/* Newell's Method */
do {
- n[0] += (v_prev[1] - v_curr[1]) * (v_prev[2] + v_curr[2]);
- n[1] += (v_prev[2] - v_curr[2]) * (v_prev[0] + v_curr[0]);
- n[2] += (v_prev[0] - v_curr[0]) * (v_prev[1] + v_curr[1]);
+ add_newell_cross_v3_v3v3(n, v_prev, v_curr);
l_iter = l_iter->next;
v_prev = v_curr;
@@ -159,7 +153,7 @@ static void bm_face_compute_poly_normal_vertex_cos(BMFace *f, float n[3],
/**
* get the area of the face
*/
-float BM_face_area_calc(BMesh *bm, BMFace *f)
+float BM_face_area_calc(BMFace *f)
{
BMLoop *l;
BMIter iter;
@@ -170,7 +164,7 @@ float BM_face_area_calc(BMesh *bm, BMFace *f)
BLI_array_fixedstack_declare(verts, BM_NGON_STACK_SIZE, f->len, __func__);
- BM_ITER_INDEX(l, &iter, bm, BM_LOOPS_OF_FACE, f, i) {
+ BM_ITER_ELEM_INDEX (l, &iter, f, BM_LOOPS_OF_FACE, i) {
copy_v3_v3(verts[i], l->v->co);
}
@@ -191,9 +185,25 @@ float BM_face_area_calc(BMesh *bm, BMFace *f)
}
/**
+ * compute the perimeter of an ngon
+ */
+float BM_face_perimeter_calc(BMFace *f)
+{
+ BMLoop *l_iter, *l_first;
+ float perimeter = 0.0f;
+
+ l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+ do {
+ perimeter += len_v3v3(l_iter->v->co, l_iter->next->v->co);
+ } while ((l_iter = l_iter->next) != l_first);
+
+ return perimeter;
+}
+
+/**
* computes center of face in 3d. uses center of bounding box.
*/
-void BM_face_center_bounds_calc(BMesh *UNUSED(bm), BMFace *f, float r_cent[3])
+void BM_face_center_bounds_calc(BMFace *f, float r_cent[3])
{
BMLoop *l_iter;
BMLoop *l_first;
@@ -212,7 +222,7 @@ void BM_face_center_bounds_calc(BMesh *UNUSED(bm), BMFace *f, float r_cent[3])
/**
* computes the center of a face, using the mean average
*/
-void BM_face_center_mean_calc(BMesh *UNUSED(bm), BMFace *f, float r_cent[3])
+void BM_face_center_mean_calc(BMFace *f, float r_cent[3])
{
BMLoop *l_iter;
BMLoop *l_first;
@@ -322,24 +332,23 @@ void poly_rotate_plane(const float normal[3], float (*verts)[3], const int nvert
/**
* updates face and vertex normals incident on an edge
*/
-void BM_edge_normals_update(BMesh *bm, BMEdge *e)
+void BM_edge_normals_update(BMEdge *e)
{
BMIter iter;
BMFace *f;
- f = BM_iter_new(&iter, bm, BM_FACES_OF_EDGE, e);
- for (; f; f = BM_iter_step(&iter)) {
- BM_face_normal_update(bm, f);
+ BM_ITER_ELEM (f, &iter, e, BM_FACES_OF_EDGE) {
+ BM_face_normal_update(f);
}
- BM_vert_normal_update(bm, e->v1);
- BM_vert_normal_update(bm, e->v2);
+ BM_vert_normal_update(e->v1);
+ BM_vert_normal_update(e->v2);
}
/**
* update a vert normal (but not the faces incident on it)
*/
-void BM_vert_normal_update(BMesh *bm, BMVert *v)
+void BM_vert_normal_update(BMVert *v)
{
/* TODO, we can normalize each edge only once, then compare with previous edge */
@@ -350,7 +359,7 @@ void BM_vert_normal_update(BMesh *bm, BMVert *v)
zero_v3(v->no);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_VERT, v) {
+ BM_ITER_ELEM (l, &liter, v, BM_LOOPS_OF_VERT) {
/* Same calculation used in BM_mesh_normals_update */
sub_v3_v3v3(vec1, l->v->co, l->prev->v->co);
sub_v3_v3v3(vec2, l->next->v->co, l->v->co);
@@ -369,16 +378,16 @@ void BM_vert_normal_update(BMesh *bm, BMVert *v)
}
}
-void BM_vert_normal_update_all(BMesh *bm, BMVert *v)
+void BM_vert_normal_update_all(BMVert *v)
{
BMIter iter;
BMFace *f;
- BM_ITER(f, &iter, bm, BM_FACES_OF_VERT, v) {
- BM_face_normal_update(bm, f);
+ BM_ITER_ELEM (f, &iter, v, BM_FACES_OF_VERT) {
+ BM_face_normal_update(f);
}
- BM_vert_normal_update(bm, v);
+ BM_vert_normal_update(v);
}
/**
@@ -391,7 +400,7 @@ void BM_vert_normal_update_all(BMesh *bm, BMVert *v)
* is passed in as well.
*/
-void BM_face_normal_update(BMesh *UNUSED(bm), BMFace *f)
+void BM_face_normal_update(BMFace *f)
{
BMLoop *l;
@@ -519,8 +528,8 @@ static int linecrossesf(const float v1[2], const float v2[2], const float v3[2],
GETMIN2(v1, v2, mv1, mv2);
GETMIN2(v3, v4, mv3, mv4);
- /* do an interval test on the x and y axe */
- /* first do x axi */
+ /* do an interval test on the x and y axes */
+ /* first do x axis */
if (ABS(v1[1] - v2[1]) < EPS &&
ABS(v3[1] - v4[1]) < EPS &&
ABS(v1[1] - v3[1]) < EPS)
@@ -528,7 +537,7 @@ static int linecrossesf(const float v1[2], const float v2[2], const float v3[2],
return (mv4[0] >= mv1[0] && mv3[0] <= mv2[0]);
}
- /* now do y axi */
+ /* now do y axis */
if (ABS(v1[0] - v2[0]) < EPS &&
ABS(v3[0] - v4[0]) < EPS &&
ABS(v1[0] - v3[0]) < EPS)
@@ -554,7 +563,7 @@ static int linecrossesf(const float v1[2], const float v2[2], const float v3[2],
* instead of projecting co directly into f's orientation space,
* so there might be accuracy issues.
*/
-int BM_face_point_inside_test(BMesh *bm, BMFace *f, const float co[3])
+int BM_face_point_inside_test(BMFace *f, const float co[3])
{
int ax, ay;
float co2[2], cent[2] = {0.0f, 0.0f}, out[2] = {FLT_MAX * 0.5f, FLT_MAX * 0.5f};
@@ -564,7 +573,7 @@ int BM_face_point_inside_test(BMesh *bm, BMFace *f, const float co[3])
float onepluseps = 1.0f + (float)FLT_EPSILON * 150.0f;
if (dot_v3v3(f->no, f->no) <= FLT_EPSILON * 10)
- BM_face_normal_update(bm, f);
+ BM_face_normal_update(f);
/* find best projection of face XY, XZ or YZ: barycentric weights of
* the 2d projected coords are the same and faster to compute
@@ -649,7 +658,7 @@ static int goodline(float const (*projectverts)[3], BMFace *f,
*
* \param use_beauty Currently only applies to quads, can be extended later on.
*/
-static BMLoop *find_ear(BMesh *UNUSED(bm), BMFace *f, float (*verts)[3], const int nvert, const int use_beauty)
+static BMLoop *find_ear(BMFace *f, float (*verts)[3], const int nvert, const int use_beauty)
{
BMLoop *bestear = NULL;
@@ -769,7 +778,7 @@ void BM_face_triangulate(BMesh *bm, BMFace *f, float (*projectverts)[3],
done = 0;
while (!done && f->len > 3) {
done = 1;
- l_iter = find_ear(bm, f, projectverts, nvert, use_beauty);
+ l_iter = find_ear(f, projectverts, nvert, use_beauty);
if (l_iter) {
done = 0;
/* v = l->v; */ /* UNUSED */
diff --git a/source/blender/bmesh/intern/bmesh_polygon.h b/source/blender/bmesh/intern/bmesh_polygon.h
index 3c8f3dc3339..117a47d34f2 100644
--- a/source/blender/bmesh/intern/bmesh_polygon.h
+++ b/source/blender/bmesh/intern/bmesh_polygon.h
@@ -27,21 +27,22 @@
* \ingroup bmesh
*/
-float BM_face_area_calc(BMesh *bm, BMFace *f);
-void BM_face_center_bounds_calc(BMesh *bm, BMFace *f, float center[3]);
-void BM_face_center_mean_calc(BMesh *bm, BMFace *f, float center[3]);
+float BM_face_area_calc(BMFace *f);
+float BM_face_perimeter_calc(BMFace *f);
+void BM_face_center_bounds_calc(BMFace *f, float center[3]);
+void BM_face_center_mean_calc(BMFace *f, float center[3]);
-void BM_face_normal_update(BMesh *bm, BMFace *f);
+void BM_face_normal_update(BMFace *f);
void BM_face_normal_update_vcos(BMesh *bm, BMFace *f, float no[3],
float const (*vertexCos)[3]);
-void BM_edge_normals_update(BMesh *bm, BMEdge *e);
+void BM_edge_normals_update(BMEdge *e);
-void BM_vert_normal_update(BMesh *bm, BMVert *v);
-void BM_vert_normal_update_all(BMesh *bm, BMVert *v);
+void BM_vert_normal_update(BMVert *v);
+void BM_vert_normal_update_all(BMVert *v);
void BM_face_normal_flip(BMesh *bm, BMFace *f);
-int BM_face_point_inside_test(BMesh *bm, BMFace *f, const float co[3]);
+int BM_face_point_inside_test(BMFace *f, const float co[3]);
void BM_face_triangulate(BMesh *bm, BMFace *f, float (*projectverts)[3],
const short newedge_oflag, const short newface_oflag, BMFace **newfaces,
diff --git a/source/blender/bmesh/intern/bmesh_private.h b/source/blender/bmesh/intern/bmesh_private.h
index 791c8d68880..f963425e1bd 100644
--- a/source/blender/bmesh/intern/bmesh_private.h
+++ b/source/blender/bmesh/intern/bmesh_private.h
@@ -37,13 +37,13 @@
*/
/* returns positive nonzero on error */
-int bmesh_elem_check(BMesh *bm, void *element, const char htype);
+int bmesh_elem_check(void *element, const char htype);
-#define BM_CHECK_ELEMENT(bm, el) \
- if (bmesh_elem_check(bm, el, ((BMHeader *)el)->htype)) { \
+#define BM_CHECK_ELEMENT(el) \
+ if (bmesh_elem_check(el, ((BMHeader *)el)->htype)) { \
printf("check_element failure, with code %i on line %i in file\n" \
" \"%s\"\n\n", \
- bmesh_elem_check(bm, el, ((BMHeader *)el)->htype), \
+ bmesh_elem_check(el, ((BMHeader *)el)->htype), \
__LINE__, __FILE__); \
}
diff --git a/source/blender/bmesh/intern/bmesh_queries.c b/source/blender/bmesh/intern/bmesh_queries.c
index 45edfd9628a..37935f33521 100644
--- a/source/blender/bmesh/intern/bmesh_queries.c
+++ b/source/blender/bmesh/intern/bmesh_queries.c
@@ -125,7 +125,7 @@ BMLoop *BM_face_other_vert_loop(BMFace *f, BMVert *v_prev, BMVert *v)
BLI_assert(BM_edge_exists(v_prev, v) != NULL);
- BM_ITER(l_iter, &liter, NULL, BM_LOOPS_OF_VERT, v) {
+ BM_ITER_ELEM (l_iter, &liter, v, BM_LOOPS_OF_VERT) {
if (l_iter->f == f) {
break;
}
@@ -309,6 +309,59 @@ BMVert *BM_edge_other_vert(BMEdge *e, BMVert *v)
}
/**
+ * The function takes a vertex at the center of a fan and returns the opposite edge in the fan.
+ * All edges in the fan must be manifold, otherwise return NULL.
+ *
+ * \note This could (probably) be done more effieiently.
+ */
+BMEdge *BM_vert_other_disk_edge(BMVert *v, BMEdge *e_first)
+{
+ BMLoop *l_a;
+ int tot = 0;
+ int i;
+
+ BLI_assert(BM_vert_in_edge(e_first, v));
+
+ l_a = e_first->l;
+ do {
+ l_a = BM_loop_other_vert_loop(l_a, v);
+ l_a = BM_vert_in_edge(l_a->e, v) ? l_a : l_a->prev;
+ if (BM_edge_is_manifold(l_a->e)) {
+ l_a = l_a->radial_next;
+ }
+ else {
+ return NULL;
+ }
+
+ tot++;
+ } while (l_a != e_first->l);
+
+ /* we know the total, now loop half way */
+ tot /= 2;
+ i = 0;
+
+ l_a = e_first->l;
+ do {
+ if (i == tot) {
+ l_a = BM_vert_in_edge(l_a->e, v) ? l_a : l_a->prev;
+ return l_a->e;
+ }
+
+ l_a = BM_loop_other_vert_loop(l_a, v);
+ l_a = BM_vert_in_edge(l_a->e, v) ? l_a : l_a->prev;
+ if (BM_edge_is_manifold(l_a->e)) {
+ l_a = l_a->radial_next;
+ }
+ /* this wont have changed from the previous loop */
+
+
+ i++;
+ } while (l_a != e_first->l);
+
+ return NULL;
+}
+
+/**
* Returms edge length
*/
float BM_edge_length_calc(BMEdge *e)
@@ -379,7 +432,7 @@ int BM_vert_edge_count_nonwire(BMVert *v)
int count = 0;
BMIter eiter;
BMEdge *edge;
- BM_ITER(edge, &eiter, NULL, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (edge, &eiter, v, BM_EDGES_OF_VERT) {
if (edge->l) {
count++;
}
@@ -416,7 +469,7 @@ int BM_vert_face_count(BMVert *v)
BMLoop *l;
BMIter iter;
- BM_ITER(l, &iter, NULL, BM_LOOPS_OF_VERT, v) {
+ BM_ITER_ELEM (l, &iter, v, BM_LOOPS_OF_VERT) {
count++;
}
@@ -470,10 +523,10 @@ int BM_edge_is_wire(BMEdge *e)
/**
* A vertex is non-manifold if it meets the following conditions:
- * 1: Loose - (has no edges/faces incident upon it)
- * 2: Joins two distinct regions - (two pyramids joined at the tip)
- * 3: Is part of a non-manifold edge (edge with more than 2 faces)
- * 4: Is part of a wire edge
+ * 1: Loose - (has no edges/faces incident upon it).
+ * 2: Joins two distinct regions - (two pyramids joined at the tip).
+ * 3: Is part of a an edge with more than 2 faces.
+ * 4: Is part of a wire edge.
*/
int BM_vert_is_manifold(BMVert *v)
{
@@ -487,18 +540,17 @@ int BM_vert_is_manifold(BMVert *v)
}
/* count edges while looking for non-manifold edges */
- oe = v->e;
- for (len = 0, e = v->e; e != oe || (e == oe && len == 0); len++, e = bmesh_disk_edge_next(e, v)) {
- if (e->l == NULL) {
- /* loose edge */
+ len = 0;
+ oe = e = v->e;
+ do {
+ /* loose edge or edge shared by more than two faces,
+ * edges with 1 face user are OK, otherwise we could
+ * use BM_edge_is_manifold() here */
+ if (e->l == NULL || bmesh_radial_length(e->l) > 2) {
return FALSE;
}
-
- if (bmesh_radial_length(e->l) > 2) {
- /* edge shared by more than two faces */
- return FALSE;
- }
- }
+ len++;
+ } while ((e = bmesh_disk_edge_next(e, v)) != oe);
count = 1;
flag = 1;
@@ -652,7 +704,7 @@ BMVert *BM_edge_share_vert(BMEdge *e1, BMEdge *e2)
}
/**
- * \brief Radial Find a Vertex Loop in Face
+ * \brief Return the Loop Shared by Face and Vertex
*
* Finds the loop used which uses \a v in face loop \a l
*
@@ -675,30 +727,45 @@ BMLoop *BM_face_vert_share_loop(BMFace *f, BMVert *v)
}
/**
+ * \brief Return the Loop Shared by Face and Edge
+ *
+ * Finds the loop used which uses \a e in face loop \a l
+ *
+ * \note currenly this just uses simple loop in future may be speeded up
+ * using radial vars
+ */
+BMLoop *BM_face_edge_share_loop(BMFace *f, BMEdge *e)
+{
+ BMLoop *l_first;
+ BMLoop *l_iter;
+
+ l_iter = l_first = e->l;
+ do {
+ if (l_iter->f == f) {
+ return l_iter;
+ }
+ } while ((l_iter = l_iter->radial_next) != l_first);
+
+ return NULL;
+}
+
+/**
* Returns the verts of an edge as used in a face
* if used in a face at all, otherwise just assign as used in the edge.
*
* Useful to get a deterministic winding order when calling
* BM_face_create_ngon() on an arbitrary array of verts,
* though be sure to pick an edge which has a face.
+ *
+ * \note This is infact quite a simple check, mainly include this function so the intent is more obvious.
+ * We know these 2 verts will _always_ make up the loops edge
*/
void BM_edge_ordered_verts_ex(BMEdge *edge, BMVert **r_v1, BMVert **r_v2,
BMLoop *edge_loop)
{
BLI_assert(edge_loop->e == edge);
-
- if ((edge_loop == NULL) ||
- (((edge_loop->prev->v == edge->v1) && (edge_loop->v == edge->v2)) ||
- ((edge_loop->v == edge->v1) && (edge_loop->next->v == edge->v2)))
- )
- {
- *r_v1 = edge->v1;
- *r_v2 = edge->v2;
- }
- else {
- *r_v1 = edge->v2;
- *r_v2 = edge->v1;
- }
+ *r_v1 = edge_loop->v;
+ *r_v2 = edge_loop->next->v;
}
void BM_edge_ordered_verts(BMEdge *edge, BMVert **r_v1, BMVert **r_v2)
@@ -788,7 +855,7 @@ void BM_loop_face_tangent(BMLoop *l, float r_tangent[3])
*/
float BM_edge_face_angle(BMEdge *e)
{
- if (BM_edge_face_count(e) == 2) {
+ if (BM_edge_is_manifold(e)) {
BMLoop *l1 = e->l;
BMLoop *l2 = e->l->radial_next;
return angle_normalized_v3v3(l1->f->no, l2->f->no);
@@ -799,6 +866,31 @@ float BM_edge_face_angle(BMEdge *e)
}
/**
+ * \brief BMESH EDGE/FACE TANGENT
+ *
+ * Calculate the tangent at this loop corner or fallback to the face normal on straignt lines.
+ * This vector always points inward into the face.
+ *
+ * \brief BM_edge_face_tangent
+ * \param e
+ * \param e_loop The loop to calculate the tangent at,
+ * used to get the face and winding direction.
+ */
+
+void BM_edge_face_tangent(BMEdge *e, BMLoop *e_loop, float r_tangent[3])
+{
+ float tvec[3];
+ BMVert *v1, *v2;
+ BM_edge_ordered_verts_ex(e, &v1, &v2, e_loop);
+
+ sub_v3_v3v3(tvec, v1->co, v2->co); /* use for temp storage */
+ /* note, we could average the tangents of both loops,
+ * for non flat ngons it will give a better direction */
+ cross_v3_v3v3(r_tangent, tvec, e_loop->f->no);
+ normalize_v3(r_tangent);
+}
+
+/**
* \brief BMESH VERT/EDGE ANGLE
*
* Calculates the angle a verts 2 edges.
@@ -828,6 +920,26 @@ float BM_vert_edge_angle(BMVert *v)
}
/**
+ * \note this isn't optimal to run on an array of verts,
+ * see 'solidify_add_thickness' for a function which runs on an array.
+ */
+float BM_vert_shell_factor(BMVert *v)
+{
+ BMIter iter;
+ BMLoop *l;
+ float accum_shell = 0.0f;
+ float accum_angle = 0.0f;
+
+ BM_ITER_ELEM (l, &iter, v, BM_LOOPS_OF_VERT) {
+ const float face_angle = BM_loop_face_angle(l);
+ accum_shell += shell_angle_to_dist(angle_normalized_v3v3(v->no, l->f->no)) * face_angle;
+ accum_angle += face_angle;
+ }
+
+ return accum_shell / accum_angle;
+}
+
+/**
* Returns the edge existing between v1 and v2, or NULL if there isn't one.
*
* \note multiple edges may exist between any two vertices, and therefore
@@ -838,7 +950,7 @@ BMEdge *BM_edge_exists(BMVert *v1, BMVert *v2)
BMIter iter;
BMEdge *e;
- BM_ITER(e, &iter, NULL, BM_EDGES_OF_VERT, v1) {
+ BM_ITER_ELEM (e, &iter, v1, BM_EDGES_OF_VERT) {
if (e->v1 == v2 || e->v2 == v2)
return e;
}
@@ -863,7 +975,7 @@ int BM_face_exists_overlap(BMesh *bm, BMVert **varr, int len, BMFace **r_overlap
int i, amount;
for (i = 0; i < len; i++) {
- BM_ITER(f, &viter, bm, BM_FACES_OF_VERT, varr[i]) {
+ BM_ITER_ELEM (f, &viter, varr[i], BM_FACES_OF_VERT) {
amount = BM_verts_in_face(bm, f, varr, len);
if (amount >= len) {
if (r_overlapface) {
@@ -893,7 +1005,7 @@ int BM_face_exists(BMesh *bm, BMVert **varr, int len, BMFace **r_existface)
int i, amount;
for (i = 0; i < len; i++) {
- BM_ITER(f, &viter, bm, BM_FACES_OF_VERT, varr[i]) {
+ BM_ITER_ELEM (f, &viter, varr[i], BM_FACES_OF_VERT) {
amount = BM_verts_in_face(bm, f, varr, len);
if (amount == len && amount == f->len) {
if (r_existface) {
@@ -923,7 +1035,7 @@ int BM_face_exists(BMesh *bm, BMVert **varr, int len, BMFace **r_existface)
*
* \a earr and \a varr can be in any order, however they _must_ form a closed loop.
*/
-int BM_face_exists_multi(BMesh *bm, BMVert **varr, BMEdge **earr, int len)
+int BM_face_exists_multi(BMVert **varr, BMEdge **earr, int len)
{
BMFace *f;
BMEdge *e;
@@ -939,15 +1051,15 @@ int BM_face_exists_multi(BMesh *bm, BMVert **varr, BMEdge **earr, int len)
for (i = 0; i < len; i++) {
/* save some time by looping over edge faces rather then vert faces
* will still loop over some faces twice but not as many */
- BM_ITER(f, &fiter, bm, BM_FACES_OF_EDGE, earr[i]) {
+ BM_ITER_ELEM (f, &fiter, earr[i], BM_FACES_OF_EDGE) {
BM_elem_flag_disable(f, BM_ELEM_INTERNAL_TAG);
- BM_ITER(v, &viter, bm, BM_VERTS_OF_FACE, f) {
+ BM_ITER_ELEM (v, &viter, f, BM_VERTS_OF_FACE) {
BM_elem_flag_disable(v, BM_ELEM_INTERNAL_TAG);
}
}
/* clear all edge tags */
- BM_ITER(e, &fiter, bm, BM_EDGES_OF_VERT, varr[i]) {
+ BM_ITER_ELEM (e, &fiter, varr[i], BM_EDGES_OF_VERT) {
BM_elem_flag_disable(e, BM_ELEM_INTERNAL_TAG);
}
}
@@ -966,10 +1078,10 @@ int BM_face_exists_multi(BMesh *bm, BMVert **varr, BMEdge **earr, int len)
/* 1) tag all faces connected to edges - if all their verts are boundary */
tot_tag = 0;
for (i = 0; i < len; i++) {
- BM_ITER(f, &fiter, bm, BM_FACES_OF_EDGE, earr[i]) {
+ BM_ITER_ELEM (f, &fiter, earr[i], BM_FACES_OF_EDGE) {
if (!BM_elem_flag_test(f, BM_ELEM_INTERNAL_TAG)) {
ok = TRUE;
- BM_ITER(v, &viter, bm, BM_VERTS_OF_FACE, f) {
+ BM_ITER_ELEM (v, &viter, f, BM_VERTS_OF_FACE) {
if (!BM_elem_flag_test(v, BM_ELEM_INTERNAL_TAG)) {
ok = FALSE;
break;
@@ -997,7 +1109,7 @@ int BM_face_exists_multi(BMesh *bm, BMVert **varr, BMEdge **earr, int len)
* check each have 2 tagges faces connected (faces that only use 'varr' verts) */
ok = TRUE;
for (i = 0; i < len; i++) {
- BM_ITER(e, &fiter, bm, BM_EDGES_OF_VERT, varr[i]) {
+ BM_ITER_ELEM (e, &fiter, varr[i], BM_EDGES_OF_VERT) {
if (/* non-boundary edge */
BM_elem_flag_test(e, BM_ELEM_INTERNAL_TAG) == FALSE &&
@@ -1006,7 +1118,7 @@ int BM_face_exists_multi(BMesh *bm, BMVert **varr, BMEdge **earr, int len)
BM_elem_flag_test(e->v2, BM_ELEM_INTERNAL_TAG) == TRUE)
{
int tot_face_tag = 0;
- BM_ITER(f, &fiter, bm, BM_FACES_OF_EDGE, e) {
+ BM_ITER_ELEM (f, &fiter, e, BM_FACES_OF_EDGE) {
if (BM_elem_flag_test(f, BM_ELEM_INTERNAL_TAG)) {
tot_face_tag++;
}
@@ -1029,7 +1141,7 @@ int BM_face_exists_multi(BMesh *bm, BMVert **varr, BMEdge **earr, int len)
}
/* same as 'BM_face_exists_multi' but built vert array from edges */
-int BM_face_exists_multi_edge(BMesh *bm, BMEdge **earr, int len)
+int BM_face_exists_multi_edge(BMEdge **earr, int len)
{
BMVert **varr;
BLI_array_fixedstack_declare(varr, BM_NGON_STACK_SIZE, len, __func__);
@@ -1052,7 +1164,7 @@ int BM_face_exists_multi_edge(BMesh *bm, BMEdge **earr, int len)
return FALSE;
}
- ok = BM_face_exists_multi(bm, varr, earr, len);
+ ok = BM_face_exists_multi(varr, earr, len);
BLI_array_fixedstack_free(varr);
diff --git a/source/blender/bmesh/intern/bmesh_queries.h b/source/blender/bmesh/intern/bmesh_queries.h
index f3dfa754f00..5178311eea4 100644
--- a/source/blender/bmesh/intern/bmesh_queries.h
+++ b/source/blender/bmesh/intern/bmesh_queries.h
@@ -49,6 +49,7 @@ int BM_vert_edge_count_nonwire(BMVert *v);
int BM_vert_edge_count(BMVert *v);
int BM_edge_face_count(BMEdge *e);
int BM_vert_face_count(BMVert *v);
+BMEdge *BM_vert_other_disk_edge(BMVert *v, BMEdge *e);
int BM_vert_is_wire(BMVert *v);
int BM_edge_is_wire(BMEdge *e);
@@ -62,7 +63,10 @@ void BM_loop_face_normal(BMLoop *l, float r_normal[3]);
void BM_loop_face_tangent(BMLoop *l, float r_tangent[3]);
float BM_edge_face_angle(BMEdge *e);
+void BM_edge_face_tangent(BMEdge *e, BMLoop *e_loop, float r_tangent[3]);
+
float BM_vert_edge_angle(BMVert *v);
+float BM_vert_shell_factor(BMVert *v);
BMEdge *BM_edge_exists(BMVert *v1, BMVert *v2);
@@ -70,8 +74,8 @@ int BM_face_exists_overlap(BMesh *bm, BMVert **varr, int len, BMFace **r_exi
int BM_face_exists(BMesh *bm, BMVert **varr, int len, BMFace **r_existface);
-int BM_face_exists_multi(BMesh *bm, BMVert **varr, BMEdge **earr, int len);
-int BM_face_exists_multi_edge(BMesh *bm, BMEdge **earr, int len);
+int BM_face_exists_multi(BMVert **varr, BMEdge **earr, int len);
+int BM_face_exists_multi_edge(BMEdge **earr, int len);
int BM_face_share_edge_count(BMFace *f1, BMFace *f2);
int BM_edge_share_face_count(BMEdge *e1, BMEdge *e2);
@@ -79,6 +83,7 @@ int BM_edge_share_vert_count(BMEdge *e1, BMEdge *e2);
BMVert *BM_edge_share_vert(BMEdge *e1, BMEdge *e2);
BMLoop *BM_face_vert_share_loop(BMFace *f, BMVert *v);
+BMLoop *BM_face_edge_share_loop(BMFace *f, BMEdge *e);
void BM_edge_ordered_verts(BMEdge *edge, BMVert **r_v1, BMVert **r_v2);
void BM_edge_ordered_verts_ex(BMEdge *edge, BMVert **r_v1, BMVert **r_v2,
diff --git a/source/blender/bmesh/intern/bmesh_walkers_impl.c b/source/blender/bmesh/intern/bmesh_walkers_impl.c
index ae7294ed4b6..113e1ddc164 100644
--- a/source/blender/bmesh/intern/bmesh_walkers_impl.c
+++ b/source/blender/bmesh/intern/bmesh_walkers_impl.c
@@ -115,7 +115,7 @@ static void bmw_ShellWalker_begin(BMWalker *walker, void *data)
/* starting the walk at a vert, add all the edges
* to the worklist */
v = (BMVert *)h;
- BM_ITER(e, &eiter, walker->bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) {
bmw_ShellWalker_visitEdge(walker, e);
}
break;
@@ -151,7 +151,7 @@ static void *bmw_ShellWalker_step(BMWalker *walker)
for (i = 0; i < 2; i++) {
v = i ? e->v2 : e->v1;
- BM_ITER(e2, &iter, walker->bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e2, &iter, v, BM_EDGES_OF_VERT) {
bmw_ShellWalker_visitEdge(walker, e2);
}
}
@@ -249,7 +249,7 @@ static void *bmw_ConnectedVertexWalker_step(BMWalker *walker)
BMW_state_remove(walker);
- BM_ITER(e, &iter, walker->bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e, &iter, v, BM_EDGES_OF_VERT) {
v2 = BM_edge_other_vert(e, v);
if (!BLI_ghash_haskey(walker->visithash, v2)) {
bmw_ConnectedVertexWalker_visitVertex(walker, v2);
@@ -450,7 +450,7 @@ static void bmw_LoopWalker_begin(BMWalker *walker, void *data)
BMFace *f_iter;
BMFace *f_best = NULL;
- BM_ITER(f_iter, &iter, walker->bm, BM_FACES_OF_EDGE, e) {
+ BM_ITER_ELEM (f_iter, &iter, e, BM_FACES_OF_EDGE) {
if (f_best == NULL || f_best->len < f_iter->len) {
f_best = f_iter;
}
@@ -606,7 +606,7 @@ static void *bmw_LoopWalker_step(BMWalker *walker)
for (i = 0; i < 2; i++) {
v = i ? e->v2 : e->v1;
- BM_ITER(nexte, &eiter, walker->bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (nexte, &eiter, v, BM_EDGES_OF_VERT) {
if ((nexte->l == NULL) &&
bmw_mask_check_edge(walker, nexte) &&
!BLI_ghash_haskey(walker->visithash, nexte))
@@ -743,7 +743,7 @@ static void *bmw_FaceLoopWalker_step(BMWalker *walker)
if (!bmw_FaceLoopWalker_include_face(walker, l)) {
l = lwalk->l;
l = l->next->next;
- if (BM_edge_face_count(l->e) != 2) {
+ if (!BM_edge_is_manifold(l->e)) {
l = l->prev->prev;
}
l = l->radial_next;
@@ -953,7 +953,7 @@ static void *bmw_UVEdgeWalker_step(BMWalker *walker)
* mloopuv's coordinates. in addition, push on l->next if necessary */
for (i = 0; i < 2; i++) {
cl = i ? nl : l;
- BM_ITER(l2, &liter, walker->bm, BM_LOOPS_OF_VERT, cl->v) {
+ BM_ITER_ELEM (l2, &liter, cl->v, BM_LOOPS_OF_VERT) {
d1 = CustomData_bmesh_get_layer_n(&walker->bm->ldata,
cl->head.data, walker->layer);
diff --git a/source/blender/bmesh/operators/bmo_bevel.c b/source/blender/bmesh/operators/bmo_bevel.c
index 0165195475a..46dd7606940 100644
--- a/source/blender/bmesh/operators/bmo_bevel.c
+++ b/source/blender/bmesh/operators/bmo_bevel.c
@@ -53,7 +53,7 @@ typedef struct EdgeTag {
BMVert *newv1, *newv2;
} EdgeTag;
-static void calc_corner_co(BMesh *bm, BMLoop *l, const float fac, float r_co[3],
+static void calc_corner_co(BMLoop *l, const float fac, float r_co[3],
const short do_dist, const short do_even)
{
float no[3], l_vec_prev[3], l_vec_next[3], l_co_prev[3], l_co[3], l_co_next[3], co_ofs[3];
@@ -80,7 +80,7 @@ static void calc_corner_co(BMesh *bm, BMLoop *l, const float fac, float r_co[3],
copy_v3_v3(l_co_prev, l->prev->v->co);
copy_v3_v3(l_co, l->v->co);
- BM_ITER(l2, &iter, bm, BM_LOOPS_OF_VERT, l->v) {
+ BM_ITER_ELEM (l2, &iter, l->v, BM_LOOPS_OF_VERT) {
if (l2->f != l->f) {
copy_v3_v3(l_co_next, BM_edge_other_vert(l2->e, l2->next->v)->co);
break;
@@ -207,7 +207,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
BLI_smallhash_init(&hash);
- BMO_ITER(e, &siter, bm, op, "geom", BM_EDGE) {
+ BMO_ITER (e, &siter, bm, op, "geom", BM_EDGE) {
BMO_elem_flag_enable(bm, e, BEVEL_FLAG|BEVEL_DEL);
BMO_elem_flag_enable(bm, e->v1, BEVEL_FLAG|BEVEL_DEL);
BMO_elem_flag_enable(bm, e->v2, BEVEL_FLAG|BEVEL_DEL);
@@ -228,14 +228,14 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
#endif
}
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
BMO_elem_flag_enable(bm, v, VERT_OLD);
}
#if 0
//a bit of cleaner code that, alas, doens't work.
/* build edge tag */
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
if (BMO_elem_flag_test(bm, e->v1, BEVEL_FLAG) || BMO_elem_flag_test(bm, e->v2, BEVEL_FLAG)) {
BMIter liter;
BMLoop *l;
@@ -247,14 +247,14 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
BMO_elem_flag_enable(bm, e, EDGE_OLD);
}
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_EDGE, e) {
+ BM_ITER_ELEM (l, &liter, e, BM_LOOPS_OF_EDGE) {
BMLoop *l2;
BMIter liter2;
if (BMO_elem_flag_test(bm, l->f, BEVEL_FLAG))
continue;
- BM_ITER(l2, &liter2, bm, BM_LOOPS_OF_FACE, l->f) {
+ BM_ITER_ELEM (l2, &liter2, l->f, BM_LOOPS_OF_FACE) {
BM_elem_index_set(l2, BLI_array_count(tags)); /* set_loop */
BLI_array_growone(tags);
@@ -277,7 +277,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
#endif
/* create and assign looptag structure */
- BMO_ITER(e, &siter, bm, op, "geom", BM_EDGE) {
+ BMO_ITER (e, &siter, bm, op, "geom", BM_EDGE) {
BMLoop *l;
BMIter liter;
@@ -299,7 +299,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
/* find all faces surrounding e->v1 and, e->v2 */
for (i = 0; i < 2; i++) {
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_VERT, i ? e->v2:e->v1) {
+ BM_ITER_ELEM (l, &liter, i ? e->v2:e->v1, BM_LOOPS_OF_VERT) {
BMLoop *l2;
BMIter liter2;
@@ -308,7 +308,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
continue;
/* create tags for all loops in l-> */
- BM_ITER(l2, &liter2, bm, BM_LOOPS_OF_FACE, l->f) {
+ BM_ITER_ELEM (l2, &liter2, l->f, BM_LOOPS_OF_FACE) {
BLI_array_growone(tags);
BM_elem_index_set(l2, BLI_array_count(tags) - 1); /* set_loop */
@@ -329,13 +329,13 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
bm->elem_index_dirty |= BM_EDGE;
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
BMIter eiter;
if (!BMO_elem_flag_test(bm, v, BEVEL_FLAG))
continue;
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) {
if (!BMO_elem_flag_test(bm, e, BEVEL_FLAG) && !ETAG_GET(e, v)) {
BMVert *v2;
float co[3];
@@ -364,13 +364,13 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
BMO_elem_flag_enable(bm, faces[i], FACE_OLD);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, faces[i]) {
+ BM_ITER_ELEM (l, &liter, faces[i], BM_LOOPS_OF_FACE) {
float co[3];
if (BMO_elem_flag_test(bm, l->e, BEVEL_FLAG)) {
if (BMO_elem_flag_test(bm, l->prev->e, BEVEL_FLAG)) {
tag = tags + BM_elem_index_get(l);
- calc_corner_co(bm, l, fac, co, do_dist, do_even);
+ calc_corner_co(l, fac, co, do_dist, do_even);
tag->newv = BM_vert_create(bm, co, l->v);
}
else {
@@ -438,7 +438,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
BLI_array_empty(verts);
BLI_array_empty(edges);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, faces[i]) {
+ BM_ITER_ELEM (l, &liter, faces[i], BM_LOOPS_OF_FACE) {
BMVert *v2;
tag = tags + BM_elem_index_get(l);
@@ -489,7 +489,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
int j;
/* create quad spans between split edge */
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, faces[i]) {
+ BM_ITER_ELEM (l, &liter, faces[i], BM_LOOPS_OF_FACE) {
BMVert *v1 = NULL, *v2 = NULL, *v3 = NULL, *v4 = NULL;
if (!BMO_elem_flag_test(bm, l->e, BEVEL_FLAG))
@@ -516,7 +516,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
BMIter eiter;
BMVert *v = j ? v4 : v3;
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) {
if (!BM_vert_in_edge(e, v3) || !BM_vert_in_edge(e, v4))
continue;
@@ -600,7 +600,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
BMO_elem_flag_enable(bm, f, FACE_NEW|FACE_SPAN);
/* un-tag edges in f for deletio */
- BM_ITER(l2, &liter2, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l2, &liter2, f, BM_LOOPS_OF_FACE) {
BMO_elem_flag_disable(bm, l2->e, BEVEL_DEL);
}
}
@@ -611,7 +611,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
}
/* fill in holes at vertices */
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
BMIter eiter;
BMVert *vv, *vstart = NULL, *lastv = NULL;
SmallHash tmphash;
@@ -625,7 +625,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
BLI_array_empty(verts);
BLI_array_empty(edges);
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) {
BMIter liter;
BMVert *v1 = NULL, *v2 = NULL;
BMLoop *l;
@@ -637,7 +637,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
continue;
rad = 0;
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_EDGE, e) {
+ BM_ITER_ELEM (l, &liter, e, BM_LOOPS_OF_EDGE) {
if (!BMO_elem_flag_test(bm, l->f, FACE_OLD))
continue;
@@ -685,7 +685,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
vstart = vstart ? vstart : verts[0];
vv = vstart;
do {
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, vv) {
+ BM_ITER_ELEM (e, &eiter, vv, BM_EDGES_OF_VERT) {
BMVert *vv2 = BM_edge_other_vert(e, vv);
if (vv2 != lastv && BLI_smallhash_haskey(&tmphash, (intptr_t)vv2)) {
@@ -730,7 +730,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
lastv = NULL;
BLI_array_empty(edges);
do {
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, vv) {
+ BM_ITER_ELEM (e, &eiter, vv, BM_EDGES_OF_VERT) {
BMVert *vv2 = BM_edge_other_vert(e, vv);
if (vv2 != lastv && BLI_smallhash_haskey(&tmphash, (intptr_t)vv2)) {
@@ -787,7 +787,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
BMIter liter;
BMFace *f = faces[i];
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
BMLoop *l2;
BMIter liter2;
@@ -795,7 +795,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
if (!tag->newv)
continue;
- BM_ITER(l2, &liter2, bm, BM_LOOPS_OF_VERT, tag->newv) {
+ BM_ITER_ELEM (l2, &liter2, tag->newv, BM_LOOPS_OF_VERT) {
if (!BMO_elem_flag_test(bm, l2->f, FACE_NEW) || (l2->v != tag->newv && l2->v != l->v))
continue;
@@ -812,7 +812,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
BMLoop *l3;
BMIter liter3;
- BM_ITER(l3, &liter3, bm, BM_LOOPS_OF_FACE, l2->f) {
+ BM_ITER_ELEM (l3, &liter3, l2->f, BM_LOOPS_OF_FACE) {
BM_loop_interp_multires(bm, l3, l->f);
}
}
@@ -821,7 +821,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
}
/* handle vertices along boundary edge */
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
if (BMO_elem_flag_test(bm, v, VERT_OLD) &&
BMO_elem_flag_test(bm, v, BEVEL_FLAG) &&
!BMO_elem_flag_test(bm, v, BEVEL_DEL))
@@ -830,7 +830,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
BMLoop *lorig = NULL;
BMIter liter;
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_VERT, v) {
+ BM_ITER_ELEM (l, &liter, v, BM_LOOPS_OF_VERT) {
// BMIter liter2;
// BMLoop *l2 = l->v == v ? l : l->next, *l3;
@@ -843,7 +843,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
if (!lorig)
continue;
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_VERT, v) {
+ BM_ITER_ELEM (l, &liter, v, BM_LOOPS_OF_VERT) {
BMLoop *l2 = l->v == v ? l : l->next;
BM_elem_attrs_copy(bm, bm, lorig->f, l2->f);
@@ -853,7 +853,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
}
#if 0
/* clean up any remaining 2-edged face */
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
if (f->len == 2) {
BMFace *faces[2] = {f, BM_FACE_FIRST_LOOP(f)->radial_next->f};
@@ -868,7 +868,7 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
BMO_op_callf(bm, "del geom=%fv context=%i", BEVEL_DEL, DEL_VERTS);
/* clean up any edges that might not get properly delete */
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
if (BMO_elem_flag_test(bm, e, EDGE_OLD) && !e->l)
BMO_elem_flag_enable(bm, e, BEVEL_DEL);
}
diff --git a/source/blender/bmesh/operators/bmo_connect.c b/source/blender/bmesh/operators/bmo_connect.c
index 69a9b75b258..3c1f10be4c4 100644
--- a/source/blender/bmesh/operators/bmo_connect.c
+++ b/source/blender/bmesh/operators/bmo_connect.c
@@ -135,7 +135,7 @@ static BMVert *get_outer_vert(BMesh *bm, BMEdge *e)
int i;
i = 0;
- BM_ITER(e2, &iter, bm, BM_EDGES_OF_VERT, e->v1) {
+ BM_ITER_ELEM (e2, &iter, e->v1, BM_EDGES_OF_VERT) {
if (BMO_elem_flag_test(bm, e2, EDGE_MARK)) {
i++;
}
@@ -191,7 +191,7 @@ static void bm_vert_loop_pair(BMesh *bm, BMVert *v1, BMVert *v2, BMLoop **l1, BM
if ((v1->e && v1->e->l) &&
(v2->e && v2->e->l))
{
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_VERT, v1) {
+ BM_ITER_ELEM (l, &liter, v1, BM_LOOPS_OF_VERT) {
if (l->prev->v == v2) {
*l1 = l;
*l2 = l->prev;
@@ -225,7 +225,7 @@ void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op)
BMO_slot_buffer_flag_enable(bm, op, "edges", BM_EDGE, EDGE_MARK);
- BMO_ITER(e, &siter, bm, op, "edges", BM_EDGE) {
+ BMO_ITER (e, &siter, bm, op, "edges", BM_EDGE) {
if (!BMO_elem_flag_test(bm, e, EDGE_DONE)) {
BMVert *v, *ov;
/* BMEdge *e2, *e3, *oe = e; */ /* UNUSED */
@@ -241,7 +241,7 @@ void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op)
do {
v = BM_edge_other_vert(e2, v);
nexte = NULL;
- BM_ITER(e3, &iter, bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e3, &iter, v, BM_EDGES_OF_VERT) {
if (e3 != e2 && BMO_elem_flag_test(bm, e3, EDGE_MARK)) {
if (nexte == NULL) {
nexte = e3;
@@ -278,7 +278,7 @@ void bmo_bridge_loops_exec(BMesh *bm, BMOperator *op)
BMO_elem_flag_enable(bm, e2, EDGE_DONE);
v = BM_edge_other_vert(e2, v);
- BM_ITER(e3, &iter, bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e3, &iter, v, BM_EDGES_OF_VERT) {
if (e3 != e2 && BMO_elem_flag_test(bm, e3, EDGE_MARK) && !BMO_elem_flag_test(bm, e3, EDGE_DONE)) {
break;
}
diff --git a/source/blender/bmesh/operators/bmo_create.c b/source/blender/bmesh/operators/bmo_create.c
index bf34806ee26..6272c43d0c5 100644
--- a/source/blender/bmesh/operators/bmo_create.c
+++ b/source/blender/bmesh/operators/bmo_create.c
@@ -225,7 +225,7 @@ static int UNUSED_FUNCTION(rotsys_fill_faces)(BMesh *bm, EdgeData *edata, VertDa
SmallHash visithash, *hash = &visithash;
int i;
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
BMEdge *e2, *starte;
BMVert *startv;
int rad, ok;
@@ -366,7 +366,7 @@ static void init_rotsys(BMesh *bm, EdgeData *edata, VertData *vdata)
#define SIGN(n) ((n)<0.0f)
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
BMIter eiter;
float no[3], cent[3];
int j, k = 0, totedge = 0;
@@ -376,7 +376,7 @@ static void init_rotsys(BMesh *bm, EdgeData *edata, VertData *vdata)
BLI_array_empty(edges);
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) {
if (BMO_elem_flag_test(bm, e, EDGE_MARK)) {
BLI_array_append(edges, e);
totedge++;
@@ -581,7 +581,7 @@ static void init_rotsys(BMesh *bm, EdgeData *edata, VertData *vdata)
#if 0
/* create visualizing geometr */
BMVert *lastv;
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
BMVert *v2;
BMFace *f;
int totedge = BM_vert_edge_count(v);
@@ -614,10 +614,10 @@ static void init_rotsys(BMesh *bm, EdgeData *edata, VertData *vdata)
BM_elem_index_set(v2, -1); /* set_dirty! */
//BM_edge_create(bm, cv, v2, NULL, FALSE);
- BM_elem_select_set(bm, v2, TRUE);
+ BM_vert_select_set(bm, v2, TRUE);
if (lastv) {
e2 = BM_edge_create(bm, lastv, v2, NULL, FALSE);
- BM_elem_select_set(bm, e2, TRUE);
+ BM_edge_select_set(bm, e2, TRUE);
}
lastv = v2;
@@ -915,12 +915,12 @@ void bmo_edgenet_fill_exec(BMesh *bm, BMOperator *op)
BM_mesh_elem_index_ensure(bm, BM_VERT);
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
BMO_elem_flag_enable(bm, f, ELE_ORIG);
}
i = 0;
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
BM_elem_index_set(e, i); /* set_inline */
if (!BMO_elem_flag_test(bm, e, EDGE_MARK)) {
@@ -937,7 +937,7 @@ void bmo_edgenet_fill_exec(BMesh *bm, BMOperator *op)
edge = NULL;
group = 0;
- BMO_ITER(e, &siter, bm, op, "edges", BM_EDGE) {
+ BMO_ITER (e, &siter, bm, op, "edges", BM_EDGE) {
/* if restrict is on, only start on faces in the restrict map */
if (use_restrict && !BMO_slot_map_contains(bm, op, "restrict", e))
continue;
@@ -1043,7 +1043,7 @@ void bmo_edgenet_fill_exec(BMesh *bm, BMOperator *op)
if ((use_fill_check == FALSE) ||
/* fairly expensive check - see if there are already faces filling this area */
- (BM_face_exists_multi_edge(bm, edges, i) == FALSE))
+ (BM_face_exists_multi_edge(edges, i) == FALSE))
{
f = BM_face_create_ngon(bm, v1, v2, edges, i, TRUE);
if (f && !BMO_elem_flag_test(bm, f, ELE_ORIG)) {
@@ -1076,7 +1076,7 @@ static BMEdge *edge_next(BMesh *bm, BMEdge *e)
int i;
for (i = 0; i < 2; i++) {
- BM_ITER(e2, &iter, bm, BM_EDGES_OF_VERT, i ? e->v2 : e->v1) {
+ BM_ITER_ELEM (e2, &iter, i ? e->v2 : e->v1, BM_EDGES_OF_VERT) {
if ((BMO_elem_flag_test(bm, e2, EDGE_MARK)) &&
(!BMO_elem_flag_test(bm, e2, EDGE_VIS)) &&
(e2 != e))
@@ -1104,7 +1104,7 @@ void bmo_edgenet_prepare(BMesh *bm, BMOperator *op)
/* validate that each edge has at most one other tagged edge in the
* disk cycle around each of it's vertices */
- BMO_ITER(e, &siter, bm, op, "edges", BM_EDGE) {
+ BMO_ITER (e, &siter, bm, op, "edges", BM_EDGE) {
for (i = 0; i < 2; i++) {
count = BMO_vert_edge_flags_count(bm, i ? e->v2 : e->v1, EDGE_MARK);
if (count > 2) {
@@ -1126,7 +1126,7 @@ void bmo_edgenet_prepare(BMesh *bm, BMOperator *op)
/* find connected loops within the input edge */
count = 0;
while (1) {
- BMO_ITER(e, &siter, bm, op, "edges", BM_EDGE) {
+ BMO_ITER (e, &siter, bm, op, "edges", BM_EDGE) {
if (!BMO_elem_flag_test(bm, e, EDGE_VIS)) {
if (BMO_vert_edge_flags_count(bm, e->v1, EDGE_MARK) == 1 ||
BMO_vert_edge_flags_count(bm, e->v2, EDGE_MARK) == 1)
@@ -1280,7 +1280,7 @@ void bmo_contextual_create_exec(BMesh *bm, BMOperator *op)
const short mat_nr = BMO_slot_int_get(op, "mat_nr");
/* count number of each element type we were passe */
- BMO_ITER(h, &oiter, bm, op, "geom", BM_VERT|BM_EDGE|BM_FACE) {
+ BMO_ITER (h, &oiter, bm, op, "geom", BM_VERT|BM_EDGE|BM_FACE) {
switch (h->htype) {
case BM_VERT: totv++; break;
case BM_EDGE: tote++; break;
@@ -1314,10 +1314,10 @@ void bmo_contextual_create_exec(BMesh *bm, BMOperator *op)
int ok = TRUE;
- BMO_ITER(v, &oiter, bm, op, "geom", BM_VERT) {
+ BMO_ITER (v, &oiter, bm, op, "geom", BM_VERT) {
/* count how many flagged edges this vertex uses */
int tot_edges = 0;
- BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e, &iter, v, BM_EDGES_OF_VERT) {
if (BMO_elem_flag_test(bm, e, ELE_NEW)) {
tot_edges++;
if (tot_edges > 2) {
@@ -1392,7 +1392,7 @@ void bmo_contextual_create_exec(BMesh *bm, BMOperator *op)
/* now, count how many verts we have */
amount = 0;
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
if (BMO_elem_flag_test(bm, v, ELE_NEW)) {
verts[amount] = v;
amount++;
@@ -1459,7 +1459,7 @@ void bmo_contextual_create_exec(BMesh *bm, BMOperator *op)
BMVert **vert_arr = MEM_mallocN(sizeof(BMVert **) * totv, __func__);
int i = 0;
- BMO_ITER(v, &oiter, bm, op, "geom", BM_VERT) {
+ BMO_ITER (v, &oiter, bm, op, "geom", BM_VERT) {
vert_arr[i] = v;
i++;
}
diff --git a/source/blender/bmesh/operators/bmo_dissolve.c b/source/blender/bmesh/operators/bmo_dissolve.c
index 7edacb45b34..f0e8ad81d07 100644
--- a/source/blender/bmesh/operators/bmo_dissolve.c
+++ b/source/blender/bmesh/operators/bmo_dissolve.c
@@ -52,7 +52,7 @@ static int UNUSED_FUNCTION(check_hole_in_region)(BMesh *bm, BMFace *f)
BMW_init(&regwalker, bm, BMW_ISLAND,
BMW_MASK_NOP, BMW_MASK_NOP, FACE_MARK,
- BMW_FLAG_NOP, /* BMESH_TODO - should be BMW_FLAG_TEST_HIDDEN ? */
+ BMW_FLAG_NOP,
BMW_NIL_LAY);
f2 = BMW_begin(&regwalker, f);
@@ -93,7 +93,7 @@ void bmo_dissolve_faces_exec(BMesh *bm, BMOperator *op)
BMIter viter;
BMVert *v;
- BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
BMO_elem_flag_set(bm, v, VERT_MARK, (BM_vert_edge_count(v) != 2));
}
}
@@ -101,7 +101,7 @@ void bmo_dissolve_faces_exec(BMesh *bm, BMOperator *op)
BMO_slot_buffer_flag_enable(bm, op, "faces", BM_FACE, FACE_MARK);
/* collect region */
- BMO_ITER(f, &oiter, bm, op, "faces", BM_FACE) {
+ BMO_ITER (f, &oiter, bm, op, "faces", BM_FACE) {
if (!BMO_elem_flag_test(bm, f, FACE_MARK)) {
continue;
@@ -110,10 +110,9 @@ void bmo_dissolve_faces_exec(BMesh *bm, BMOperator *op)
BLI_array_empty(faces);
faces = NULL; /* forces different allocatio */
- /* yay, walk */
BMW_init(&regwalker, bm, BMW_ISLAND,
BMW_MASK_NOP, BMW_MASK_NOP, FACE_MARK,
- BMW_FLAG_NOP, /* BMESH_TODO - should be BMW_FLAG_TEST_HIDDEN ? */
+ BMW_FLAG_NOP, /* no need to check BMW_FLAG_TEST_HIDDEN, faces are already marked by the bmo */
BMW_NIL_LAY);
f2 = BMW_begin(&regwalker, f);
@@ -172,7 +171,7 @@ void bmo_dissolve_faces_exec(BMesh *bm, BMOperator *op)
BMIter viter;
BMVert *v;
- BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
if (BMO_elem_flag_test(bm, v, VERT_MARK)) {
if (BM_vert_edge_count(v) == 2) {
BM_vert_collapse_edge(bm, v->e, v, TRUE);
@@ -209,7 +208,7 @@ void bmo_dissolve_edgeloop_exec(BMesh *bm, BMOperator *op)
int i;
- BMO_ITER(e, &oiter, bm, op, "edges", BM_EDGE) {
+ BMO_ITER (e, &oiter, bm, op, "edges", BM_EDGE) {
if (BM_edge_face_pair(e, &fa, &fb)) {
BMO_elem_flag_enable(bm, e->v1, VERT_MARK);
BMO_elem_flag_enable(bm, e->v2, VERT_MARK);
@@ -220,7 +219,7 @@ void bmo_dissolve_edgeloop_exec(BMesh *bm, BMOperator *op)
}
}
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
if (BMO_elem_flag_test(bm, v, VERT_MARK) && BM_vert_edge_count(v) == 2) {
BLI_array_append(verts, v);
}
@@ -258,12 +257,12 @@ void bmo_dissolve_edges_exec(BMesh *bm, BMOperator *op)
int use_verts = BMO_slot_bool_get(op, "use_verts");
if (use_verts) {
- BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
BMO_elem_flag_set(bm, v, VERT_MARK, (BM_vert_edge_count(v) != 2));
}
}
- BMO_ITER(e, &eiter, bm, op, "edges", BM_EDGE) {
+ BMO_ITER (e, &eiter, bm, op, "edges", BM_EDGE) {
BMFace *fa, *fb;
if (BM_edge_face_pair(e, &fa, &fb)) {
@@ -277,7 +276,7 @@ void bmo_dissolve_edges_exec(BMesh *bm, BMOperator *op)
}
if (use_verts) {
- BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
if (BMO_elem_flag_test(bm, v, VERT_MARK)) {
if (BM_vert_edge_count(v) == 2) {
BM_vert_collapse_edge(bm, v->e, v, TRUE);
@@ -309,7 +308,7 @@ static int test_extra_verts(BMesh *bm, BMVert *v)
found = FALSE;
e = BM_iter_new(&iter2, bm, BM_EDGES_OF_VERT, l->v);
for ( ; e; e = BM_iter_step(&iter2)) {
- if (BM_edge_face_count(e) == 1) {
+ if (BM_edge_is_boundary(e)) {
found = TRUE;
}
f2 = BM_iter_new(&iter3, bm, BM_FACES_OF_EDGE, e);
@@ -555,7 +554,7 @@ void bmo_dissolve_limit_exec(BMesh *bm, BMOperator *op)
/* there may be some errors, we don't mind, just move on */
if (nf) {
- BM_face_normal_update(bm, nf);
+ BM_face_normal_update(nf);
}
else {
BMO_error_clear(bm);
@@ -605,7 +604,7 @@ void bmo_dissolve_limit_exec(BMesh *bm, BMOperator *op)
BMEdge *ne = BM_vert_collapse_edge(bm, v->e, v, TRUE); /* join edges */
if (ne && ne->l) {
- BM_edge_normals_update(bm, ne);
+ BM_edge_normals_update(ne);
}
}
}
diff --git a/source/blender/bmesh/operators/bmo_dupe.c b/source/blender/bmesh/operators/bmo_dupe.c
index 24e25ef720f..36d446a0a8c 100644
--- a/source/blender/bmesh/operators/bmo_dupe.c
+++ b/source/blender/bmesh/operators/bmo_dupe.c
@@ -163,8 +163,8 @@ static BMFace *copy_face(BMOperator *op, BMesh *source_mesh,
BMO_elem_flag_enable(target_mesh, target_face, DUPE_NEW);
/* copy per-loop custom data */
- BM_ITER(source_loop, &iter, source_mesh, BM_LOOPS_OF_FACE, source_face) {
- BM_ITER(target_loop, &iter2, target_mesh, BM_LOOPS_OF_FACE, target_face) {
+ BM_ITER_ELEM (source_loop, &iter, source_face, BM_LOOPS_OF_FACE) {
+ BM_ITER_ELEM (target_loop, &iter2, target_face, BM_LOOPS_OF_FACE) {
if (BLI_ghash_lookup(vhash, source_loop->v) == target_loop->v) {
BM_elem_attrs_copy(source_mesh, target_mesh, source_loop, target_loop);
break;
@@ -201,7 +201,7 @@ static void copy_mesh(BMOperator *op, BMesh *source, BMesh *target)
ehash = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "bmesh dupeops e");
/* duplicate flagged vertices */
- BM_ITER(v, &viter, source, BM_VERTS_OF_MESH, source) {
+ BM_ITER_MESH (v, &viter, source, BM_VERTS_OF_MESH) {
if (BMO_elem_flag_test(source, v, DUPE_INPUT) &&
!BMO_elem_flag_test(source, v, DUPE_DONE))
{
@@ -210,7 +210,7 @@ static void copy_mesh(BMOperator *op, BMesh *source, BMesh *target)
v2 = copy_vertex(source, v, target, vhash);
- BM_ITER(f, &iter, source, BM_FACES_OF_VERT, v) {
+ BM_ITER_ELEM (f, &iter, v, BM_FACES_OF_VERT) {
if (BMO_elem_flag_test(source, f, DUPE_INPUT)) {
isolated = 0;
break;
@@ -218,7 +218,7 @@ static void copy_mesh(BMOperator *op, BMesh *source, BMesh *target)
}
if (isolated) {
- BM_ITER(e, &iter, source, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e, &iter, v, BM_EDGES_OF_VERT) {
if (BMO_elem_flag_test(source, e, DUPE_INPUT)) {
isolated = 0;
break;
@@ -235,7 +235,7 @@ static void copy_mesh(BMOperator *op, BMesh *source, BMesh *target)
}
/* now we dupe all the edges */
- BM_ITER(e, &eiter, source, BM_EDGES_OF_MESH, source) {
+ BM_ITER_MESH (e, &eiter, source, BM_EDGES_OF_MESH) {
if (BMO_elem_flag_test(source, e, DUPE_INPUT) &&
!BMO_elem_flag_test(source, e, DUPE_DONE))
{
@@ -255,10 +255,10 @@ static void copy_mesh(BMOperator *op, BMesh *source, BMesh *target)
}
/* first we dupe all flagged faces and their elements from source */
- BM_ITER(f, &fiter, source, BM_FACES_OF_MESH, source) {
+ BM_ITER_MESH (f, &fiter, source, BM_FACES_OF_MESH) {
if (BMO_elem_flag_test(source, f, DUPE_INPUT)) {
/* vertex pass */
- BM_ITER(v, &viter, source, BM_VERTS_OF_FACE, f) {
+ BM_ITER_ELEM (v, &viter, f, BM_VERTS_OF_FACE) {
if (!BMO_elem_flag_test(source, v, DUPE_DONE)) {
copy_vertex(source, v, target, vhash);
BMO_elem_flag_enable(source, v, DUPE_DONE);
@@ -266,7 +266,7 @@ static void copy_mesh(BMOperator *op, BMesh *source, BMesh *target)
}
/* edge pass */
- BM_ITER(e, &eiter, source, BM_EDGES_OF_FACE, f) {
+ BM_ITER_ELEM (e, &eiter, f, BM_EDGES_OF_FACE) {
if (!BMO_elem_flag_test(source, e, DUPE_DONE)) {
copy_edge(op, source, e, target, vhash, ehash);
BMO_elem_flag_enable(source, e, DUPE_DONE);
diff --git a/source/blender/bmesh/operators/bmo_edgesplit.c b/source/blender/bmesh/operators/bmo_edgesplit.c
index 557860e1056..ccbcb293915 100644
--- a/source/blender/bmesh/operators/bmo_edgesplit.c
+++ b/source/blender/bmesh/operators/bmo_edgesplit.c
@@ -60,7 +60,7 @@ static void bm_edgesplit_validate_seams(BMesh *bm, BMOperator *op)
vtouch = MEM_callocN(sizeof(char) * bm->totvert, __func__);
/* tag all boundary verts so as not to untag an edge which is inbetween only 2 faces [] */
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
/* unrelated to flag assignment in this function - since this is the
* only place we loop over all edges, disable tag */
@@ -81,14 +81,14 @@ static void bm_edgesplit_validate_seams(BMesh *bm, BMOperator *op)
/* single marked edges unconnected to any other marked edges
* are illegal, go through and unmark them */
- BMO_ITER(e, &siter, bm, op, "edges", BM_EDGE) {
+ BMO_ITER (e, &siter, bm, op, "edges", BM_EDGE) {
/* lame, but we don't want the count to exceed 255,
* so just count to 2, its all we need */
unsigned char *vt;
vt = &vtouch[BM_elem_index_get(e->v1)]; if (*vt < 2) (*vt)++;
vt = &vtouch[BM_elem_index_get(e->v2)]; if (*vt < 2) (*vt)++;
}
- BMO_ITER(e, &siter, bm, op, "edges", BM_EDGE) {
+ BMO_ITER (e, &siter, bm, op, "edges", BM_EDGE) {
if (vtouch[BM_elem_index_get(e->v1)] == 1 &&
vtouch[BM_elem_index_get(e->v2)] == 1)
{
@@ -118,7 +118,7 @@ void bmo_edgesplit_exec(BMesh *bm, BMOperator *op)
* This is needed so we don't split off the edge but then none of its verts which
* would leave a duplicate edge.
*/
- BMO_ITER(e, &siter, bm, op, "edges", BM_EDGE) {
+ BMO_ITER (e, &siter, bm, op, "edges", BM_EDGE) {
if (UNLIKELY((BMO_elem_flag_test(bm, e->v1, VERT_SEAM) == FALSE &&
(BMO_elem_flag_test(bm, e->v2, VERT_SEAM) == FALSE))))
{
@@ -130,19 +130,23 @@ void bmo_edgesplit_exec(BMesh *bm, BMOperator *op)
bm_edgesplit_validate_seams(bm, op);
- BMO_ITER(e, &siter, bm, op, "edges", BM_EDGE) {
+ BMO_ITER (e, &siter, bm, op, "edges", BM_EDGE) {
if (BMO_elem_flag_test(bm, e, EDGE_SEAM)) {
/* this flag gets copied so we can be sure duplicate edges get it too (important) */
BM_elem_flag_enable(e, BM_ELEM_INTERNAL_TAG);
- bmesh_edge_separate(bm, e, e->l);
+ /* keep splitting until each loop has its own edge */
+ do {
+ bmesh_edge_separate(bm, e, e->l);
+ } while (!BM_edge_is_boundary(e));
+
BM_elem_flag_enable(e->v1, BM_ELEM_TAG);
BM_elem_flag_enable(e->v2, BM_ELEM_TAG);
}
}
if (use_verts) {
- BMO_ITER(e, &siter, bm, op, "edges", BM_EDGE) {
+ BMO_ITER (e, &siter, bm, op, "edges", BM_EDGE) {
if (BMO_elem_flag_test(bm, e->v1, VERT_SEAM) == FALSE) {
BM_elem_flag_disable(e->v1, BM_ELEM_TAG);
}
@@ -152,7 +156,7 @@ void bmo_edgesplit_exec(BMesh *bm, BMOperator *op)
}
}
- BMO_ITER(e, &siter, bm, op, "edges", BM_EDGE) {
+ BMO_ITER (e, &siter, bm, op, "edges", BM_EDGE) {
if (BMO_elem_flag_test(bm, e, EDGE_SEAM)) {
if (BM_elem_flag_test(e->v1, BM_ELEM_TAG)) {
BM_elem_flag_disable(e->v1, BM_ELEM_TAG);
diff --git a/source/blender/bmesh/operators/bmo_extrude.c b/source/blender/bmesh/operators/bmo_extrude.c
index fa4c3c5751b..73997c774af 100644
--- a/source/blender/bmesh/operators/bmo_extrude.c
+++ b/source/blender/bmesh/operators/bmo_extrude.c
@@ -56,13 +56,13 @@ void bmo_extrude_face_indiv_exec(BMesh *bm, BMOperator *op)
BLI_array_declare(edges);
int i;
- BMO_ITER(f, &siter, bm, op, "faces", BM_FACE) {
+ BMO_ITER (f, &siter, bm, op, "faces", BM_FACE) {
BLI_array_empty(edges);
BLI_array_growitems(edges, f->len);
i = 0;
firstv = lastv = NULL;
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
v = BM_vert_create(bm, l->v->co, l->v);
/* skip on the first iteration */
@@ -93,7 +93,7 @@ void bmo_extrude_face_indiv_exec(BMesh *bm, BMOperator *op)
BM_elem_attrs_copy(bm, bm, f, f2);
l2 = BM_iter_new(&liter2, bm, BM_LOOPS_OF_FACE, f2);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
BM_elem_attrs_copy(bm, bm, l, l2);
l3 = l->next;
@@ -118,52 +118,53 @@ void bmo_extrude_face_indiv_exec(BMesh *bm, BMOperator *op)
BMO_slot_buffer_from_enabled_flag(bm, op, "faceout", BM_FACE, EXT_KEEP);
}
-static void bm_extrude_copy_face_loop_attributes(BMesh *bm, BMFace *f, BMEdge *e, BMEdge *newedge)
+/**
+ * \brief Copy the loop pair from an adjacent face to both sides of this quad.
+ *
+ * The face is assumed to be a quad, created by extruding.
+ * This function won't crash if its not but won't work right either.
+ * \a e_b is the new edge.
+ *
+ * \note this function could be exposed as an api call if other areas need it,
+ * so far only extrude does.
+ */
+static void bm_extrude_copy_face_loop_attributes(BMesh *bm, BMFace *f, BMEdge *e_a, BMEdge *e_b)
{
- BMIter iter;
- BMLoop *l, *l_other;
-
- /* copy attributes */
- BM_ITER(l, &iter, bm, BM_LOOPS_OF_FACE, f) {
- if (l->e != e && l->e != newedge) {
- continue;
- }
+ /* 'a' is the starting edge #e, 'b' is the final edge #newedge */
+ BMLoop *l_dst_a = BM_face_edge_share_loop(f, e_a);
+ BMLoop *l_dst_b = BM_face_edge_share_loop(f, e_b);
+ /* we could only have a face on one-or the other edges,
+ * chech if either side of the face has an adjacent face */
+ BMLoop *l_src_1;
+ BMLoop *l_src_2;
+
+ /* there is no l_src_b */
+
+ /* sanity */
+ BLI_assert(l_dst_a->f == l_dst_b->f);
+
+ if (l_dst_a != l_dst_a->radial_next) {
+ l_src_1 = l_dst_a->radial_next;
+ l_src_2 = l_src_1->next;
+ }
+ else if (l_dst_b != l_dst_b->radial_next) {
+ l_src_2 = l_dst_b->radial_next;
+ l_src_1 = l_src_2->next;
+ }
+ else {
+ /* no new faces on either edge, nothing to copy from */
+ return;
+ }
- l_other = l->radial_next;
-
- if (l_other == l) {
- l_other = newedge->l;
+ BM_elem_attrs_copy(bm, bm, l_src_1->f, l_dst_a->f);
+ BM_elem_flag_disable(f, BM_ELEM_HIDDEN); /* possibly we copy from a hidden face */
- if (l_other != l) {
- BM_elem_attrs_copy(bm, bm, l_other->f, f);
- BM_elem_flag_disable(f, BM_ELEM_HIDDEN); /* possibly we copy from a hidden face */
+ /* copy data */
+ BM_elem_attrs_copy(bm, bm, l_src_2, l_dst_a);
+ BM_elem_attrs_copy(bm, bm, l_src_2, l_dst_b->next);
- BM_elem_attrs_copy(bm, bm, l_other, l);
- l_other = l_other->next;
- l = l->next;
- BM_elem_attrs_copy(bm, bm, l_other, l);
- }
- }
- else {
- BM_elem_attrs_copy(bm, bm, l_other->f, f);
- BM_elem_flag_disable(f, BM_ELEM_HIDDEN); /* possibly we copy from a hidden face */
-
- /* copy data */
- if (l_other->v == l->v) {
- BM_elem_attrs_copy(bm, bm, l_other, l);
- l_other = l_other->next;
- l = l->next;
- BM_elem_attrs_copy(bm, bm, l_other, l);
- }
- else {
- l_other = l_other->next;
- BM_elem_attrs_copy(bm, bm, l_other, l);
- l_other = l_other->prev;
- l = l->next;
- BM_elem_attrs_copy(bm, bm, l_other, l);
- }
- }
- }
+ BM_elem_attrs_copy(bm, bm, l_src_1, l_dst_a->next);
+ BM_elem_attrs_copy(bm, bm, l_src_1, l_dst_b);
}
void bmo_extrude_edge_only_exec(BMesh *bm, BMOperator *op)
@@ -174,7 +175,7 @@ void bmo_extrude_edge_only_exec(BMesh *bm, BMOperator *op)
BMEdge *e, *e2;
BMFace *f;
- BMO_ITER(e, &siter, bm, op, "edges", BM_EDGE) {
+ BMO_ITER (e, &siter, bm, op, "edges", BM_EDGE) {
BMO_elem_flag_enable(bm, e, EXT_INPUT);
BMO_elem_flag_enable(bm, e->v1, EXT_INPUT);
BMO_elem_flag_enable(bm, e->v2, EXT_INPUT);
@@ -257,7 +258,7 @@ void bmo_extrude_face_region_exec(BMesh *bm, BMOperator *op)
/* if one flagged face is bordered by an un-flagged face, then we delete
* original geometry unless caller explicitly asked to keep it. */
if (!BMO_slot_bool_get(op, "alwayskeeporig")) {
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
int edge_face_tot;
@@ -268,7 +269,7 @@ void bmo_extrude_face_region_exec(BMesh *bm, BMOperator *op)
found = FALSE; /* found a face that isn't input? */
edge_face_tot = 0; /* edge/face count */
- BM_ITER(f, &fiter, bm, BM_FACES_OF_EDGE, e) {
+ BM_ITER_ELEM (f, &fiter, e, BM_FACES_OF_EDGE) {
if (!BMO_elem_flag_test(bm, f, EXT_INPUT)) {
found = TRUE;
delorig = TRUE;
@@ -286,10 +287,10 @@ void bmo_extrude_face_region_exec(BMesh *bm, BMOperator *op)
}
/* calculate verts to delete */
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
found = FALSE;
- BM_ITER(e, &viter, bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e, &viter, v, BM_EDGES_OF_VERT) {
if (!BMO_elem_flag_test(bm, e, EXT_INPUT) || !BMO_elem_flag_test(bm, e, EXT_DEL)) {
found = TRUE;
break;
@@ -298,7 +299,7 @@ void bmo_extrude_face_region_exec(BMesh *bm, BMOperator *op)
/* avoid an extra loop */
if (found == TRUE) {
- BM_ITER(f, &viter, bm, BM_FACES_OF_VERT, v) {
+ BM_ITER_ELEM (f, &viter, v, BM_FACES_OF_VERT) {
if (!BMO_elem_flag_test(bm, f, EXT_INPUT)) {
found = TRUE;
break;
@@ -311,7 +312,7 @@ void bmo_extrude_face_region_exec(BMesh *bm, BMOperator *op)
}
}
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
if (BMO_elem_flag_test(bm, f, EXT_INPUT)) {
BMO_elem_flag_enable(bm, f, EXT_DEL);
}
@@ -334,7 +335,7 @@ void bmo_extrude_face_region_exec(BMesh *bm, BMOperator *op)
/* if not delorig, reverse loops of original face */
if (!delorig) {
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
if (BMO_elem_flag_test(bm, f, EXT_INPUT)) {
BM_face_normal_flip(bm, f);
}
@@ -417,18 +418,18 @@ static void calc_solidify_normals(BMesh *bm)
/* can't use BM_edge_face_count because we need to count only marked faces */
int *edge_face_count = MEM_callocN(sizeof(int) * bm->totedge, __func__);
- BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
BM_elem_flag_enable(v, BM_ELEM_TAG);
}
BM_mesh_elem_index_ensure(bm, BM_EDGE);
- BM_ITER(f, &fiter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
if (!BMO_elem_flag_test(bm, f, FACE_MARK)) {
continue;
}
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_FACE, f) {
+ BM_ITER_ELEM (e, &eiter, f, BM_EDGES_OF_FACE) {
/* And mark all edges and vertices on the
* marked faces */
@@ -439,7 +440,7 @@ static void calc_solidify_normals(BMesh *bm)
}
}
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
if (!BMO_elem_flag_test(bm, e, EDGE_MARK)) {
continue;
}
@@ -457,7 +458,7 @@ static void calc_solidify_normals(BMesh *bm)
MEM_freeN(edge_face_count);
edge_face_count = NULL; /* don't re-use */
- BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
if (!BM_vert_is_manifold(v)) {
BMO_elem_flag_enable(bm, v, VERT_NONMAN);
continue;
@@ -468,7 +469,7 @@ static void calc_solidify_normals(BMesh *bm)
}
}
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
/* If the edge is not part of a the solidify region
* its normal should not be considered */
@@ -484,7 +485,7 @@ static void calc_solidify_normals(BMesh *bm)
f1 = f2 = NULL;
- BM_ITER(f, &fiter, bm, BM_FACES_OF_EDGE, e) {
+ BM_ITER_ELEM (f, &fiter, e, BM_FACES_OF_EDGE) {
if (BMO_elem_flag_test(bm, f, FACE_MARK)) {
if (f1 == NULL) {
f1 = f;
@@ -529,19 +530,19 @@ static void calc_solidify_normals(BMesh *bm)
}
/* normalize accumulated vertex normal */
- BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
if (!BMO_elem_flag_test(bm, v, VERT_MARK)) {
continue;
}
if (BMO_elem_flag_test(bm, v, VERT_NONMAN)) {
/* use standard normals for vertices connected to non-manifold edges */
- BM_vert_normal_update(bm, v);
+ BM_vert_normal_update(v);
}
else if (normalize_v3(v->no) == 0.0f && !BM_elem_flag_test(v, BM_ELEM_TAG)) {
/* exceptional case, totally flat. use the normal
* of any marked face around the vertex */
- BM_ITER(f, &fiter, bm, BM_FACES_OF_VERT, v) {
+ BM_ITER_ELEM (f, &fiter, v, BM_FACES_OF_VERT) {
if (BMO_elem_flag_test(bm, f, FACE_MARK)) {
break;
}
@@ -570,13 +571,13 @@ static void solidify_add_thickness(BMesh *bm, const float dist)
BM_mesh_elem_index_ensure(bm, BM_VERT);
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
if (!BMO_elem_flag_test(bm, f, FACE_MARK)) {
continue;
}
BLI_array_growitems(verts, f->len);
- BM_ITER_INDEX(l, &loopIter, bm, BM_LOOPS_OF_FACE, f, i) {
+ BM_ITER_ELEM_INDEX (l, &loopIter, f, BM_LOOPS_OF_FACE, i) {
verts[i] = l->v->co;
}
@@ -584,7 +585,7 @@ static void solidify_add_thickness(BMesh *bm, const float dist)
angle_poly_v3(face_angles, (const float **)verts, f->len);
i = 0;
- BM_ITER(l, &loopIter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &loopIter, f, BM_LOOPS_OF_FACE) {
v = l->v;
index = BM_elem_index_get(v);
vert_accum[index] += face_angles[i];
@@ -596,7 +597,7 @@ static void solidify_add_thickness(BMesh *bm, const float dist)
BLI_array_empty(face_angles);
}
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
index = BM_elem_index_get(v);
if (vert_accum[index]) { /* zero if unselected */
madd_v3_v3fl(v->co, v->no, dist * (vert_angles[index] / vert_accum[index]));
diff --git a/source/blender/bmesh/operators/bmo_inset.c b/source/blender/bmesh/operators/bmo_inset.c
index 3bfacb29197..c6fc173148f 100644
--- a/source/blender/bmesh/operators/bmo_inset.c
+++ b/source/blender/bmesh/operators/bmo_inset.c
@@ -42,17 +42,6 @@ typedef struct SplitEdgeInfo {
BMLoop *l;
} SplitEdgeInfo;
-static void edge_loop_tangent(BMEdge *e, BMLoop *e_loop, float r_no[3])
-{
- float tvec[3];
- BMVert *v1, *v2;
- BM_edge_ordered_verts_ex(e, &v1, &v2, e_loop);
-
- sub_v3_v3v3(tvec, v1->co, v2->co); /* use for temp storage */
- cross_v3_v3v3(r_no, tvec, e_loop->f->no);
- normalize_v3(r_no);
-}
-
/**
* return the tag loop where there is...
* - only 1 tagged face attached to this edge.
@@ -91,6 +80,22 @@ static BMLoop *bm_edge_is_mixed_face_tag(BMLoop *l)
}
}
+float bm_vert_avg_tag_dist(BMVert *v)
+{
+ BMIter iter;
+ BMEdge *e;
+ int tot;
+ float length = 0.0f;
+
+ BM_ITER_ELEM_INDEX (e, &iter, v, BM_EDGES_OF_VERT, tot) {
+ BMVert *v_other = BM_edge_other_vert(e, v);
+ if (BM_elem_flag_test(v_other, BM_ELEM_TAG)) {
+ length += BM_edge_length_calc(e);
+ }
+ }
+
+ return length / (float)tot;
+}
/**
* implementation is as follows...
@@ -109,7 +114,8 @@ void bmo_inset_exec(BMesh *bm, BMOperator *op)
const int use_even_offset = BMO_slot_bool_get(op, "use_even_offset");
const int use_even_boundry = use_even_offset; /* could make own option */
const int use_relative_offset = BMO_slot_bool_get(op, "use_relative_offset");
- const float thickness = BMO_slot_float_get(op, "thickness");
+ const float thickness = BMO_slot_float_get(op, "thickness");
+ const float depth = BMO_slot_float_get(op, "depth");
int edge_info_len = 0;
@@ -133,7 +139,7 @@ void bmo_inset_exec(BMesh *bm, BMOperator *op)
/* first count all inset edges we will split */
/* fill in array and initialize tagging */
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
if (
/* tag if boundary is enabled */
(use_boundary && BM_edge_is_boundary(e) && BM_elem_flag_test(e->l->f, BM_ELEM_TAG)) ||
@@ -163,7 +169,7 @@ void bmo_inset_exec(BMesh *bm, BMOperator *op)
/* fill in array and initialize tagging */
es = edge_info;
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
i = BM_elem_index_get(e);
if (i != -1) {
/* calc edge-split info */
@@ -188,7 +194,7 @@ void bmo_inset_exec(BMesh *bm, BMOperator *op)
/* calc edge-split info */
es->e_new = es->l->e;
- edge_loop_tangent(es->e_new, es->l, es->no);
+ BM_edge_face_tangent(es->e_new, es->l, es->no);
if (es->e_new == es->e_old) { /* happens on boundary edges */
/* take care here, we're creating this double edge which _must_ have its verts replaced later on */
@@ -257,7 +263,7 @@ void bmo_inset_exec(BMesh *bm, BMOperator *op)
int vecpair[2];
/* find adjacent */
- BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v_split) {
+ BM_ITER_ELEM (e, &iter, v_split, BM_EDGES_OF_VERT) {
if (BM_elem_flag_test(e, BM_ELEM_TAG) &&
e->l && BM_elem_flag_test(e->l->f, BM_ELEM_TAG))
{
@@ -422,7 +428,7 @@ void bmo_inset_exec(BMesh *bm, BMOperator *op)
if (r_vout_len > 2) {
int ok = TRUE;
/* last step, NULL this vertex if has a tagged face */
- BM_ITER(f, &iter, bm, BM_FACES_OF_VERT, v_split) {
+ BM_ITER_ELEM (f, &iter, v_split, BM_FACES_OF_VERT) {
if (BM_elem_flag_test(f, BM_ELEM_TAG)) {
ok = FALSE;
break;
@@ -493,4 +499,42 @@ void bmo_inset_exec(BMesh *bm, BMOperator *op)
/* we could flag new edges/verts too, is it useful? */
BMO_slot_buffer_from_enabled_flag(bm, op, "faceout", BM_FACE, ELE_NEW);
+
+ /* cheap feature to add depth to the inset */
+ if (depth != 0.0f) {
+ float (*varr_co)[3];
+ BMOIter oiter;
+
+ /* untag verts */
+ BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_TAG, FALSE);
+
+ /* tag face verts */
+ BMO_ITER (f, &oiter, bm, op, "faces", BM_FACE) {
+ BM_ITER_ELEM (v, &iter, f, BM_VERTS_OF_FACE) {
+ BM_elem_flag_enable(v, BM_ELEM_TAG);
+ }
+ }
+
+ /* do in 2 passes so moving the verts doesn't feed back into face angle checks
+ * which BM_vert_shell_factor uses. */
+
+ /* over allocate */
+ varr_co = MEM_callocN(sizeof(*varr_co) * bm->totvert, __func__);
+
+ BM_ITER_MESH_INDEX (v, &iter, bm, BM_VERTS_OF_MESH, i) {
+ if (BM_elem_flag_test(v, BM_ELEM_TAG)) {
+ const float fac = (depth *
+ (use_relative_offset ? bm_vert_avg_tag_dist(v) : 1.0f) *
+ (use_even_boundry ? BM_vert_shell_factor(v) : 1.0f));
+ madd_v3_v3v3fl(varr_co[i], v->co, v->no, fac);
+ }
+ }
+
+ BM_ITER_MESH_INDEX (v, &iter, bm, BM_VERTS_OF_MESH, i) {
+ if (BM_elem_flag_test(v, BM_ELEM_TAG)) {
+ copy_v3_v3(v->co, varr_co[i]);
+ }
+ }
+ MEM_freeN(varr_co);
+ }
}
diff --git a/source/blender/bmesh/operators/bmo_join_triangles.c b/source/blender/bmesh/operators/bmo_join_triangles.c
index 01028116da3..582039fc1a2 100644
--- a/source/blender/bmesh/operators/bmo_join_triangles.c
+++ b/source/blender/bmesh/operators/bmo_join_triangles.c
@@ -43,7 +43,7 @@
#define T2QJOIN 4
/* assumes edges are validated before reaching this poin */
-static float measure_facepair(BMesh *UNUSED(bm), BMVert *v1, BMVert *v2,
+static float measure_facepair(BMVert *v1, BMVert *v2,
BMVert *v3, BMVert *v4, float limit)
{
/* gives a 'weight' to a pair of triangles that join an edge to decide how good a join they would make */
@@ -237,15 +237,15 @@ void bmo_join_triangles_exec(BMesh *bm, BMOperator *op)
int i, totedge;
/* flag all edges of all input face */
- BMO_ITER(f1, &siter, bm, op, "faces", BM_FACE) {
+ BMO_ITER (f1, &siter, bm, op, "faces", BM_FACE) {
BMO_elem_flag_enable(bm, f1, FACE_INPUT);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f1) {
+ BM_ITER_ELEM (l, &liter, f1, BM_LOOPS_OF_FACE) {
BMO_elem_flag_enable(bm, l->e, EDGE_MARK);
}
}
/* unflag edges that are invalid; e.g. aren't surrounded by triangle */
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
if (!BMO_elem_flag_test(bm, e, EDGE_MARK))
continue;
@@ -266,7 +266,7 @@ void bmo_join_triangles_exec(BMesh *bm, BMOperator *op)
}
i = 0;
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
BMVert *v1, *v2, *v3, *v4;
BMFace *f1, *f2;
float measure;
@@ -291,7 +291,7 @@ void bmo_join_triangles_exec(BMesh *bm, BMOperator *op)
if (domat && f1->mat_nr != f2->mat_nr)
continue;
- measure = measure_facepair(bm, v1, v2, v3, v4, limit);
+ measure = measure_facepair(v1, v2, v3, v4, limit);
if (measure < limit) {
BLI_array_growone(jedges);
@@ -323,7 +323,7 @@ void bmo_join_triangles_exec(BMesh *bm, BMOperator *op)
BMO_elem_flag_enable(bm, e, EDGE_CHOSEN);
}
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
if (!BMO_elem_flag_test(bm, e, EDGE_CHOSEN))
continue;
@@ -332,7 +332,7 @@ void bmo_join_triangles_exec(BMesh *bm, BMOperator *op)
BM_faces_join_pair(bm, f1, f2, e, TRUE);
}
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
if (BMO_elem_flag_test(bm, e, EDGE_MARK)) {
/* ok, this edge wasn't merged, check if it's
* in a 2-tri-pair island, and if so merg */
@@ -344,7 +344,7 @@ void bmo_join_triangles_exec(BMesh *bm, BMOperator *op)
continue;
for (i = 0; i < 2; i++) {
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, i ? f2 : f1) {
+ BM_ITER_ELEM (l, &liter, i ? f2 : f1, BM_LOOPS_OF_FACE) {
if (l->e != e && BMO_elem_flag_test(bm, l->e, EDGE_MARK)) {
break;
}
diff --git a/source/blender/bmesh/operators/bmo_mirror.c b/source/blender/bmesh/operators/bmo_mirror.c
index 28c9c53fa8a..cf1669d441e 100644
--- a/source/blender/bmesh/operators/bmo_mirror.c
+++ b/source/blender/bmesh/operators/bmo_mirror.c
@@ -43,7 +43,7 @@ void bmo_mirror_exec(BMesh *bm, BMOperator *op)
BMOperator dupeop, weldop;
BMOIter siter;
BMIter iter;
- BMVert *v, *v2, **vmap = NULL;
+ BMVert *v /* , *v2 */ /* UNUSED */, **vmap = NULL;
BLI_array_declare(vmap);
BMEdge /* *e, */ **emap = NULL;
BLI_array_declare(emap);
@@ -69,15 +69,11 @@ void bmo_mirror_exec(BMesh *bm, BMOperator *op)
/* create old -> new mappin */
i = 0;
- v2 = BM_iter_new(&iter, bm, BM_VERTS_OF_MESH, NULL);
- BMO_ITER(v, &siter, bm, &dupeop, "newout", BM_VERT) {
+ /* v2 = BM_iter_new(&iter, bm, BM_VERTS_OF_MESH, NULL); */ /* UNUSED */
+ BMO_ITER (v, &siter, bm, &dupeop, "newout", BM_VERT) {
BLI_array_growone(vmap);
vmap[i] = v;
-
- /* BMESH_TODO, double check this is being used, calling following operators will overwrite anyway - campbell */
- BM_elem_index_set(v2, i); /* set_dirty! */
- v2 = BM_iter_step(&iter);
-
+ /* v2 = BM_iter_step(&iter); */ /* UNUSED */
i++;
}
bm->elem_index_dirty |= BM_VERT;
@@ -105,8 +101,8 @@ void bmo_mirror_exec(BMesh *bm, BMOperator *op)
int totlayer;
BMIter liter;
- BMO_ITER(f, &siter, bm, &dupeop, "newout", BM_FACE) {
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BMO_ITER (f, &siter, bm, &dupeop, "newout", BM_FACE) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
totlayer = CustomData_number_of_layers(&bm->ldata, CD_MLOOPUV);
for (i = 0; i < totlayer; i++) {
luv = CustomData_bmesh_get_n(&bm->ldata, l->head.data, CD_MLOOPUV, i);
diff --git a/source/blender/bmesh/operators/bmo_primitive.c b/source/blender/bmesh/operators/bmo_primitive.c
index 4e89b7b7efe..e526e2eaca0 100644
--- a/source/blender/bmesh/operators/bmo_primitive.c
+++ b/source/blender/bmesh/operators/bmo_primitive.c
@@ -370,7 +370,7 @@ void bmo_create_uvsphere_exec(BMesh *bm, BMOperator *op)
}
/* and now do imat */
- BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
if (BMO_elem_flag_test(bm, eve, VERT_MARK)) {
mul_m4_v3(mat, eve->co);
}
@@ -415,7 +415,7 @@ void bmo_create_icosphere_exec(BMesh *bm, BMOperator *op)
eftemp = BM_face_create_quad_tri(bm, v1, v2, v3, NULL, NULL, FALSE);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, eftemp) {
+ BM_ITER_ELEM (l, &liter, eftemp, BM_LOOPS_OF_FACE) {
BMO_elem_flag_enable(bm, l->e, EDGE_MARK);
}
@@ -437,7 +437,7 @@ void bmo_create_icosphere_exec(BMesh *bm, BMOperator *op)
}
/* must transform after because of sphere subdivision */
- BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
if (BMO_elem_flag_test(bm, v, VERT_MARK)) {
mul_m4_v3(mat, v->co);
}
diff --git a/source/blender/bmesh/operators/bmo_removedoubles.c b/source/blender/bmesh/operators/bmo_removedoubles.c
index aad0089b1d7..8cdb3b9b373 100644
--- a/source/blender/bmesh/operators/bmo_removedoubles.c
+++ b/source/blender/bmesh/operators/bmo_removedoubles.c
@@ -43,7 +43,7 @@ static void remdoubles_splitface(BMFace *f, BMesh *bm, BMOperator *op)
BMVert *v2, *doub;
int split = FALSE;
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
v2 = BMO_slot_map_ptr_get(bm, op, "targetmap", l->v);
/* ok: if v2 is NULL (e.g. not in the map) then it's
* a target vert, otherwise it's a double */
@@ -108,7 +108,7 @@ void bmo_weldverts_exec(BMesh *bm, BMOperator *op)
int a, b;
/* mark merge verts for deletion */
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
if ((v2 = BMO_slot_map_ptr_get(bm, op, "targetmap", v))) {
BMO_elem_flag_enable(bm, v, ELE_DEL);
@@ -119,11 +119,11 @@ void bmo_weldverts_exec(BMesh *bm, BMOperator *op)
/* check if any faces are getting their own corners merged
together, split face if so */
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
remdoubles_splitface(f, bm, op);
}
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
if (BMO_elem_flag_test(bm, e->v1, ELE_DEL) || BMO_elem_flag_test(bm, e->v2, ELE_DEL)) {
v = BMO_slot_map_ptr_get(bm, op, "targetmap", e->v1);
v2 = BMO_slot_map_ptr_get(bm, op, "targetmap", e->v2);
@@ -143,9 +143,9 @@ void bmo_weldverts_exec(BMesh *bm, BMOperator *op)
}
/* BMESH_TODO, stop abusing face index here */
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
BM_elem_index_set(f, 0); /* set_dirty! */
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
if (BMO_elem_flag_test(bm, l->v, ELE_DEL)) {
BMO_elem_flag_enable(bm, f, FACE_MARK|ELE_DEL);
}
@@ -158,7 +158,7 @@ void bmo_weldverts_exec(BMesh *bm, BMOperator *op)
/* faces get "modified" by creating new faces here, then at the
end the old faces are deleted */
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
if (!BMO_elem_flag_test(bm, f, FACE_MARK))
continue;
@@ -170,7 +170,7 @@ void bmo_weldverts_exec(BMesh *bm, BMOperator *op)
BLI_array_empty(edges);
BLI_array_empty(loops);
a = 0;
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
v = l->v;
v2 = l->next->v;
if (BMO_elem_flag_test(bm, v, ELE_DEL)) {
@@ -218,7 +218,7 @@ void bmo_weldverts_exec(BMesh *bm, BMOperator *op)
BM_elem_attrs_copy(bm, bm, f, f2);
a = 0;
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f2) {
+ BM_ITER_ELEM (l, &liter, f2, BM_LOOPS_OF_FACE) {
l2 = loops[a];
BM_elem_attrs_copy(bm, bm, l2, l);
@@ -269,7 +269,7 @@ void bmo_pointmerge_facedata_exec(BMesh *bm, BMOperator *op)
return;
fac = 1.0f / tot;
- BM_ITER(l, &iter, bm, BM_LOOPS_OF_VERT, snapv) {
+ BM_ITER_ELEM (l, &iter, snapv, BM_LOOPS_OF_VERT) {
if (!firstl) {
firstl = l;
}
@@ -290,8 +290,8 @@ void bmo_pointmerge_facedata_exec(BMesh *bm, BMOperator *op)
}
}
- BMO_ITER(v, &siter, bm, op, "verts", BM_VERT) {
- BM_ITER(l, &iter, bm, BM_LOOPS_OF_VERT, v) {
+ BMO_ITER (v, &siter, bm, op, "verts", BM_VERT) {
+ BM_ITER_ELEM (l, &iter, v, BM_LOOPS_OF_VERT) {
if (l == firstl) {
continue;
}
@@ -318,8 +318,8 @@ void bmo_vert_average_facedata_exec(BMesh *bm, BMOperator *op)
type = bm->ldata.layers[i].type;
CustomData_data_initminmax(type, &min, &max);
- BMO_ITER(v, &siter, bm, op, "verts", BM_VERT) {
- BM_ITER(l, &iter, bm, BM_LOOPS_OF_VERT, v) {
+ BMO_ITER (v, &siter, bm, op, "verts", BM_VERT) {
+ BM_ITER_ELEM (l, &iter, v, BM_LOOPS_OF_VERT) {
block = CustomData_bmesh_get_layer_n(&bm->ldata, l->head.data, i);
CustomData_data_dominmax(type, block, &min, &max);
}
@@ -329,8 +329,8 @@ void bmo_vert_average_facedata_exec(BMesh *bm, BMOperator *op)
CustomData_data_multiply(type, &max, 0.5f);
CustomData_data_add(type, &min, &max);
- BMO_ITER(v, &siter, bm, op, "verts", BM_VERT) {
- BM_ITER(l, &iter, bm, BM_LOOPS_OF_VERT, v) {
+ BMO_ITER (v, &siter, bm, op, "verts", BM_VERT) {
+ BM_ITER_ELEM (l, &iter, v, BM_LOOPS_OF_VERT) {
block = CustomData_bmesh_get_layer_n(&bm->ldata, l->head.data, i);
CustomData_data_copy_value(type, &min, block);
}
@@ -350,7 +350,7 @@ void bmo_pointmerge_exec(BMesh *bm, BMOperator *op)
//BMO_op_callf(bm, "collapse_uvs edges=%s", op, "edges");
BMO_op_init(bm, &weldop, "weldverts");
- BMO_ITER(v, &siter, bm, op, "verts", BM_VERT) {
+ BMO_ITER (v, &siter, bm, op, "verts", BM_VERT) {
if (!snapv) {
snapv = v;
copy_v3_v3(snapv->co, vec);
@@ -381,10 +381,10 @@ void bmo_collapse_exec(BMesh *bm, BMOperator *op)
BMW_init(&walker, bm, BMW_SHELL,
BMW_MASK_NOP, EDGE_MARK, BMW_MASK_NOP,
- BMW_FLAG_NOP, /* BMESH_TODO - should be BMW_FLAG_TEST_HIDDEN ? */
+ BMW_FLAG_NOP, /* no need to use BMW_FLAG_TEST_HIDDEN, already marked data */
BMW_NIL_LAY);
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
if (!BMO_elem_flag_test(bm, e, EDGE_MARK))
continue;
@@ -441,11 +441,11 @@ static void bmo_collapsecon_do_layer(BMesh *bm, BMOperator *op, int layer)
BMW_init(&walker, bm, BMW_LOOPDATA_ISLAND,
BMW_MASK_NOP, EDGE_MARK, BMW_MASK_NOP,
- BMW_FLAG_NOP, /* BMESH_TODO - should be BMW_FLAG_TEST_HIDDEN ? */
+ BMW_FLAG_NOP, /* no need to use BMW_FLAG_TEST_HIDDEN, already marked data */
layer);
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
if (BMO_elem_flag_test(bm, l->e, EDGE_MARK)) {
/* walk */
BLI_array_empty(blocks);
@@ -500,7 +500,7 @@ void bmesh_finddoubles_common(BMesh *bm, BMOperator *op, BMOperator *optarget, c
dist3 = dist * 3.0f;
i = 0;
- BMO_ITER(v, &oiter, bm, op, "verts", BM_VERT) {
+ BMO_ITER (v, &oiter, bm, op, "verts", BM_VERT) {
BLI_array_growone(verts);
verts[i++] = v;
}
@@ -583,7 +583,7 @@ void bmo_automerge_exec(BMesh *bm, BMOperator *op)
* can be merged away into any other verts. Mark all other verts
* as VERT_KEEP. */
BMO_slot_buffer_flag_enable(bm, op, "verts", BM_VERT, VERT_IN);
- BM_ITER(v, &viter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
if (!BMO_elem_flag_test(bm, v, VERT_IN)) {
BMO_elem_flag_enable(bm, v, VERT_KEEP);
}
diff --git a/source/blender/bmesh/operators/bmo_slide.c b/source/blender/bmesh/operators/bmo_slide.c
index 9414c7308b6..57bda579603 100644
--- a/source/blender/bmesh/operators/bmo_slide.c
+++ b/source/blender/bmesh/operators/bmo_slide.c
@@ -40,7 +40,7 @@
* Slides a vertex along a connected edge
*
*/
-void bmo_vert_slide_exec(BMesh *bm, BMOperator *op)
+void bmo_vertex_slide_exec(BMesh *bm, BMOperator *op)
{
BMOIter oiter;
BMIter iter;
@@ -60,13 +60,15 @@ void bmo_vert_slide_exec(BMesh *bm, BMOperator *op)
if (!vertex) {
- if (G.debug & G_DEBUG)
- fprintf(stderr, "vertslide: No vertex selected...");
+ if (G.debug & G_DEBUG) {
+ fprintf(stderr, "vertex_slide: No vertex selected...");
+ }
+ BMO_error_raise(bm, op, BMERR_INVALID_SELECTION, "Vertex Slide Error: Invalid selection.");
return;
}
/* Count selected edges */
- BMO_ITER(h, &oiter, bm, op, "edge", BM_VERT | BM_EDGE) {
+ BMO_ITER (h, &oiter, bm, op, "edge", BM_VERT | BM_EDGE) {
switch (h->htype) {
case BM_EDGE:
selected_edges++;
@@ -78,13 +80,15 @@ void bmo_vert_slide_exec(BMesh *bm, BMOperator *op)
/* Only allow sliding if an edge is selected */
if (selected_edges == 0) {
- if (G.debug & G_DEBUG)
- fprintf(stderr, "vertslide: select a single edge\n");
+ if (G.debug & G_DEBUG) {
+ fprintf(stderr, "vertex_slide: select a single edge\n");
+ }
+ BMO_error_raise(bm, op, BMERR_INVALID_SELECTION, "Vertex Slide Error: Invalid selection.");
return;
}
/* Make sure we get the correct edge. */
- BM_ITER(edge, &iter, bm, BM_EDGES_OF_VERT, vertex) {
+ BM_ITER_ELEM (edge, &iter, vertex, BM_EDGES_OF_VERT) {
if (BMO_elem_flag_test(bm, edge, EDGE_MARK) && BM_vert_in_edge(edge, vertex)) {
slide_edge = edge;
break;
@@ -102,9 +106,6 @@ void bmo_vert_slide_exec(BMesh *bm, BMOperator *op)
interp_v3_v3v3(vertex->co, vertex->co, other->co, distance_t);
}
- /* Deselect the edges */
- BMO_slot_buffer_hflag_disable(bm, op, "edge", BM_ALL, BM_ELEM_SELECT, TRUE);
-
/* Return the new edge. The same previously marked with VERT_MARK */
BMO_slot_buffer_from_enabled_flag(bm, op, "vertout", BM_VERT, VERT_MARK);
return;
diff --git a/source/blender/bmesh/operators/bmo_subdivide.c b/source/blender/bmesh/operators/bmo_subdivide.c
index 335b0257572..d629585f7cd 100644
--- a/source/blender/bmesh/operators/bmo_subdivide.c
+++ b/source/blender/bmesh/operators/bmo_subdivide.c
@@ -105,7 +105,7 @@ static void alter_co(BMesh *bm, BMVert *v, BMEdge *UNUSED(origed), const SubDPar
float *co = NULL;
int i, totlayer = CustomData_number_of_layers(&bm->vdata, CD_SHAPEKEY);
- BM_vert_normal_update_all(bm, v);
+ BM_vert_normal_update_all(v);
co = CustomData_bmesh_get_n(&bm->vdata, v->head.data, CD_SHAPEKEY, params->origkey);
copy_v3_v3(co, v->co);
@@ -257,9 +257,9 @@ static void bm_subdivide_multicut(BMesh *bm, BMEdge *edge, const SubDParams *par
BMO_elem_flag_enable(bm, eed, ELE_SPLIT);
BMO_elem_flag_enable(bm, newe, SUBD_SPLIT);
- BM_CHECK_ELEMENT(bm, v);
- if (v->e) BM_CHECK_ELEMENT(bm, v->e);
- if (v->e && v->e->l) BM_CHECK_ELEMENT(bm, v->e->l->f);
+ BM_CHECK_ELEMENT(v);
+ if (v->e) BM_CHECK_ELEMENT(v->e);
+ if (v->e && v->e->l) BM_CHECK_ELEMENT(v->e->l->f);
}
alter_co(bm, v1, &temp, params, 0, &ov1, &ov2);
@@ -673,7 +673,7 @@ typedef struct SubDFaceData {
BMFace *face;
} SubDFaceData;
-void bmo_esubd_exec(BMesh *bmesh, BMOperator *op)
+void bmo_esubd_exec(BMesh *bm, BMOperator *op)
{
BMOpSlot *einput;
SubDPattern *pat;
@@ -693,7 +693,7 @@ void bmo_esubd_exec(BMesh *bmesh, BMOperator *op)
int beauty, cornertype, singleedge, gridfill;
int skey, seed, i, j, matched, a, b, numcuts, totesel;
- BMO_slot_buffer_flag_enable(bmesh, op, "edges", BM_EDGE, SUBD_SPLIT);
+ BMO_slot_buffer_flag_enable(bm, op, "edges", BM_EDGE, SUBD_SPLIT);
numcuts = BMO_slot_int_get(op, "numcuts");
seed = BMO_slot_int_get(op, "seed");
@@ -739,16 +739,16 @@ void bmo_esubd_exec(BMesh *bmesh, BMOperator *op)
}
/* add a temporary shapekey layer to store displacements on current geometry */
- BM_data_layer_add(bmesh, &bmesh->vdata, CD_SHAPEKEY);
- skey = CustomData_number_of_layers(&bmesh->vdata, CD_SHAPEKEY) - 1;
+ BM_data_layer_add(bm, &bm->vdata, CD_SHAPEKEY);
+ skey = CustomData_number_of_layers(&bm->vdata, CD_SHAPEKEY) - 1;
- BM_ITER(v, &viter, bmesh, BM_VERTS_OF_MESH, NULL) {
- float *co = CustomData_bmesh_get_n(&bmesh->vdata, v->head.data, CD_SHAPEKEY, skey);
+ BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
+ float *co = CustomData_bmesh_get_n(&bm->vdata, v->head.data, CD_SHAPEKEY, skey);
copy_v3_v3(co, v->co);
}
/* first go through and tag edges */
- BMO_slot_buffer_from_enabled_flag(bmesh, op, "edges", BM_EDGE, SUBD_SPLIT);
+ BMO_slot_buffer_from_enabled_flag(bm, op, "edges", BM_EDGE, SUBD_SPLIT);
params.numcuts = numcuts;
params.op = op;
@@ -761,14 +761,14 @@ void bmo_esubd_exec(BMesh *bmesh, BMOperator *op)
params.off[1] = (float)BLI_drand() * 200.0f;
params.off[2] = (float)BLI_drand() * 200.0f;
- BMO_slot_map_to_flag(bmesh, op, "custompatterns",
+ BMO_slot_map_to_flag(bm, op, "custompatterns",
BM_FACE, FACE_CUSTOMFILL);
- BMO_slot_map_to_flag(bmesh, op, "edgepercents",
+ BMO_slot_map_to_flag(bm, op, "edgepercents",
BM_EDGE, EDGE_PERCENT);
- BM_ITER(face, &fiter, bmesh, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (face, &fiter, bm, BM_FACES_OF_MESH) {
BMEdge *e1 = NULL, *e2 = NULL;
float vec1[3], vec2[3];
@@ -783,11 +783,11 @@ void bmo_esubd_exec(BMesh *bmesh, BMOperator *op)
matched = 0;
totesel = 0;
- BM_ITER_INDEX(nl, &liter, bmesh, BM_LOOPS_OF_FACE, face, i) {
+ BM_ITER_ELEM_INDEX (nl, &liter, face, BM_LOOPS_OF_FACE, i) {
edges[i] = nl->e;
verts[i] = nl->v;
- if (BMO_elem_flag_test(bmesh, edges[i], SUBD_SPLIT)) {
+ if (BMO_elem_flag_test(bm, edges[i], SUBD_SPLIT)) {
if (!e1) e1 = edges[i];
else e2 = edges[i];
@@ -811,14 +811,14 @@ void bmo_esubd_exec(BMesh *bmesh, BMOperator *op)
}
}
- if (BMO_elem_flag_test(bmesh, face, FACE_CUSTOMFILL)) {
- pat = BMO_slot_map_data_get(bmesh, op,
+ if (BMO_elem_flag_test(bm, face, FACE_CUSTOMFILL)) {
+ pat = BMO_slot_map_data_get(bm, op,
"custompatterns", face);
for (i = 0; i < pat->len; i++) {
matched = 1;
for (j = 0; j < pat->len; j++) {
a = (j + i) % pat->len;
- if ((!!BMO_elem_flag_test(bmesh, edges[a], SUBD_SPLIT)) != (!!pat->seledges[j])) {
+ if ((!!BMO_elem_flag_test(bm, edges[a], SUBD_SPLIT)) != (!!pat->seledges[j])) {
matched = 0;
break;
}
@@ -830,7 +830,7 @@ void bmo_esubd_exec(BMesh *bmesh, BMOperator *op)
facedata[b].start = verts[i];
facedata[b].face = face;
facedata[b].totedgesel = totesel;
- BMO_elem_flag_enable(bmesh, face, SUBD_SPLIT);
+ BMO_elem_flag_enable(bm, face, SUBD_SPLIT);
break;
}
}
@@ -850,7 +850,7 @@ void bmo_esubd_exec(BMesh *bmesh, BMOperator *op)
matched = 1;
for (b = 0; b < pat->len; b++) {
j = (b + a) % pat->len;
- if ((!!BMO_elem_flag_test(bmesh, edges[j], SUBD_SPLIT)) != (!!pat->seledges[b])) {
+ if ((!!BMO_elem_flag_test(bm, edges[j], SUBD_SPLIT)) != (!!pat->seledges[b])) {
matched = 0;
break;
}
@@ -863,7 +863,7 @@ void bmo_esubd_exec(BMesh *bmesh, BMOperator *op)
BLI_array_growone(facedata);
j = BLI_array_count(facedata) - 1;
- BMO_elem_flag_enable(bmesh, face, SUBD_SPLIT);
+ BMO_elem_flag_enable(bm, face, SUBD_SPLIT);
facedata[j].pat = pat;
facedata[j].start = verts[a];
@@ -879,7 +879,7 @@ void bmo_esubd_exec(BMesh *bmesh, BMOperator *op)
BLI_array_growone(facedata);
j = BLI_array_count(facedata) - 1;
- BMO_elem_flag_enable(bmesh, face, SUBD_SPLIT);
+ BMO_elem_flag_enable(bm, face, SUBD_SPLIT);
facedata[j].totedgesel = totesel;
facedata[j].face = face;
}
@@ -890,12 +890,12 @@ void bmo_esubd_exec(BMesh *bmesh, BMOperator *op)
/* go through and split edges */
for (i = 0; i < einput->len; i++) {
edge = ((BMEdge **)einput->data.p)[i];
- bm_subdivide_multicut(bmesh, edge, &params, edge->v1, edge->v2);
+ bm_subdivide_multicut(bm, edge, &params, edge->v1, edge->v2);
}
/* copy original-geometry displacements to current coordinates */
- BM_ITER(v, &viter, bmesh, BM_VERTS_OF_MESH, NULL) {
- float *co = CustomData_bmesh_get_n(&bmesh->vdata, v->head.data, CD_SHAPEKEY, skey);
+ BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
+ float *co = CustomData_bmesh_get_n(&bm->vdata, v->head.data, CD_SHAPEKEY, skey);
copy_v3_v3(v->co, co);
}
@@ -916,7 +916,7 @@ void bmo_esubd_exec(BMesh *bmesh, BMOperator *op)
BLI_array_empty(splits);
/* for case of two edges, connecting them shouldn't be too hard */
- BM_ITER(l, &liter, bmesh, BM_LOOPS_OF_FACE, face) {
+ BM_ITER_ELEM (l, &liter, face, BM_LOOPS_OF_FACE) {
BLI_array_growone(loops);
loops[BLI_array_count(loops) - 1] = l;
}
@@ -925,22 +925,22 @@ void bmo_esubd_exec(BMesh *bmesh, BMOperator *op)
/* find the boundary of one of the split edges */
for (a = 1; a < vlen; a++) {
- if (!BMO_elem_flag_test(bmesh, loops[a - 1]->v, ELE_INNER) &&
- BMO_elem_flag_test(bmesh, loops[a]->v, ELE_INNER))
+ if (!BMO_elem_flag_test(bm, loops[a - 1]->v, ELE_INNER) &&
+ BMO_elem_flag_test(bm, loops[a]->v, ELE_INNER))
{
break;
}
}
- if (BMO_elem_flag_test(bmesh, loops[(a + numcuts + 1) % vlen]->v, ELE_INNER)) {
+ if (BMO_elem_flag_test(bm, loops[(a + numcuts + 1) % vlen]->v, ELE_INNER)) {
b = (a + numcuts + 1) % vlen;
}
else {
/* find the boundary of the other edge. */
for (j = 0; j < vlen; j++) {
b = (j + a + numcuts + 1) % vlen;
- if (!BMO_elem_flag_test(bmesh, loops[b == 0 ? vlen - 1 : b - 1]->v, ELE_INNER) &&
- BMO_elem_flag_test(bmesh, loops[b]->v, ELE_INNER))
+ if (!BMO_elem_flag_test(bm, loops[b == 0 ? vlen - 1 : b - 1]->v, ELE_INNER) &&
+ BMO_elem_flag_test(bm, loops[b]->v, ELE_INNER))
{
break;
}
@@ -965,7 +965,7 @@ void bmo_esubd_exec(BMesh *bmesh, BMOperator *op)
for (j = 0; j < BLI_array_count(splits) / 2; j++) {
if (splits[j * 2]) {
/* BMFace *nf = */ /* UNUSED */
- BM_face_split(bmesh, face, splits[j * 2]->v, splits[j * 2 + 1]->v, &nl, NULL, FALSE);
+ BM_face_split(bm, face, splits[j * 2]->v, splits[j * 2 + 1]->v, &nl, NULL, FALSE);
}
}
@@ -976,7 +976,7 @@ void bmo_esubd_exec(BMesh *bmesh, BMOperator *op)
}
j = a = 0;
- for (nl = BM_iter_new(&liter, bmesh, BM_LOOPS_OF_FACE, face);
+ for (nl = BM_iter_new(&liter, bm, BM_LOOPS_OF_FACE, face);
nl;
nl = BM_iter_step(&liter))
{
@@ -992,23 +992,23 @@ void bmo_esubd_exec(BMesh *bmesh, BMOperator *op)
}
j = 0;
- for (nl = BM_iter_new(&liter, bmesh, BM_LOOPS_OF_FACE, face); nl; nl = BM_iter_step(&liter)) {
+ for (nl = BM_iter_new(&liter, bm, BM_LOOPS_OF_FACE, face); nl; nl = BM_iter_step(&liter)) {
b = (j - a + face->len) % face->len;
verts[b] = nl->v;
j += 1;
}
- BM_CHECK_ELEMENT(bmesh, face);
- pat->connectexec(bmesh, face, verts, &params);
+ BM_CHECK_ELEMENT(face);
+ pat->connectexec(bm, face, verts, &params);
}
/* copy original-geometry displacements to current coordinates */
- BM_ITER(v, &viter, bmesh, BM_VERTS_OF_MESH, NULL) {
- float *co = CustomData_bmesh_get_n(&bmesh->vdata, v->head.data, CD_SHAPEKEY, skey);
+ BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
+ float *co = CustomData_bmesh_get_n(&bm->vdata, v->head.data, CD_SHAPEKEY, skey);
copy_v3_v3(v->co, co);
}
- BM_data_layer_free_n(bmesh, &bmesh->vdata, CD_SHAPEKEY, skey);
+ BM_data_layer_free_n(bm, &bm->vdata, CD_SHAPEKEY, skey);
if (facedata) BLI_array_free(facedata);
if (edges) BLI_array_free(edges);
@@ -1016,10 +1016,10 @@ void bmo_esubd_exec(BMesh *bmesh, BMOperator *op)
BLI_array_free(splits);
BLI_array_free(loops);
- BMO_slot_buffer_from_enabled_flag(bmesh, op, "outinner", BM_ALL, ELE_INNER);
- BMO_slot_buffer_from_enabled_flag(bmesh, op, "outsplit", BM_ALL, ELE_SPLIT);
+ BMO_slot_buffer_from_enabled_flag(bm, op, "outinner", BM_ALL, ELE_INNER);
+ BMO_slot_buffer_from_enabled_flag(bm, op, "outsplit", BM_ALL, ELE_SPLIT);
- BMO_slot_buffer_from_enabled_flag(bmesh, op, "geomout", BM_ALL, ELE_INNER|ELE_SPLIT|SUBD_SPLIT);
+ BMO_slot_buffer_from_enabled_flag(bm, op, "geomout", BM_ALL, ELE_INNER|ELE_SPLIT|SUBD_SPLIT);
}
/* editmesh-emulating function */
@@ -1064,18 +1064,18 @@ void BM_mesh_esubdivideflag(Object *UNUSED(obedit), BMesh *bm, int flag, float s
BMEdge *e;
BMIter eiter;
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, ele) {
+ BM_ITER_ELEM (e, &eiter, ele, BM_EDGES_OF_VERT) {
if (!BM_elem_flag_test(e, BM_ELEM_SELECT) &&
BM_elem_flag_test(e->v1, BM_ELEM_SELECT) &&
BM_elem_flag_test(e->v2, BM_ELEM_SELECT))
{
- BM_elem_select_set(bm, e, TRUE);
+ BM_edge_select_set(bm, e, TRUE);
}
else if (BM_elem_flag_test(e, BM_ELEM_SELECT) &&
(!BM_elem_flag_test(e->v1, BM_ELEM_SELECT) ||
!BM_elem_flag_test(e->v2, BM_ELEM_SELECT)))
{
- BM_elem_select_set(bm, e, FALSE);
+ BM_edge_select_set(bm, e, FALSE);
}
}
}
@@ -1101,7 +1101,7 @@ void bmo_edgebisect_exec(BMesh *bm, BMOperator *op)
params.origkey = skey;
/* go through and split edges */
- BMO_ITER(e, &siter, bm, op, "edges", BM_EDGE) {
+ BMO_ITER (e, &siter, bm, op, "edges", BM_EDGE) {
bm_subdivide_multicut(bm, e, &params, e->v1, e->v2);
}
diff --git a/source/blender/bmesh/operators/bmo_triangulate.c b/source/blender/bmesh/operators/bmo_triangulate.c
index dd23bc604be..916b10d707e 100644
--- a/source/blender/bmesh/operators/bmo_triangulate.c
+++ b/source/blender/bmesh/operators/bmo_triangulate.c
@@ -25,11 +25,12 @@
*/
#include "MEM_guardedalloc.h"
+#include "DNA_listBase.h"
-#include "BLI_scanfill.h"
#include "BLI_math.h"
#include "BLI_array.h"
#include "BLI_smallhash.h"
+#include "BLI_scanfill.h"
#include "bmesh.h"
#include "intern/bmesh_private.h"
@@ -93,7 +94,7 @@ void bmo_beautify_fill_exec(BMesh *bm, BMOperator *op)
BMO_slot_buffer_flag_enable(bm, op, "constrain_edges", BM_EDGE, EDGE_MARK);
- BMO_ITER(f, &siter, bm, op, "faces", BM_FACE) {
+ BMO_ITER (f, &siter, bm, op, "faces", BM_FACE) {
if (f->len == 3) {
BMO_elem_flag_enable(bm, f, FACE_MARK);
}
@@ -102,10 +103,10 @@ void bmo_beautify_fill_exec(BMesh *bm, BMOperator *op)
while (!stop) {
stop = 1;
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
BMVert *v1, *v2, *v3, *v4;
- if (BM_edge_face_count(e) != 2 || BMO_elem_flag_test(bm, e, EDGE_MARK)) {
+ if (!BM_edge_is_manifold(e) || BMO_elem_flag_test(bm, e, EDGE_MARK)) {
continue;
}
@@ -164,6 +165,7 @@ void bmo_triangle_fill_exec(BMesh *bm, BMOperator *op)
BMOIter siter;
BMEdge *e;
BMOperator bmop;
+ ScanFillContext sf_ctx;
/* ScanFillEdge *eed; */ /* UNUSED */
ScanFillVert *eve, *v1, *v2;
ScanFillFace *efa;
@@ -171,32 +173,32 @@ void bmo_triangle_fill_exec(BMesh *bm, BMOperator *op)
BLI_smallhash_init(&hash);
- BLI_begin_edgefill();
+ BLI_begin_edgefill(&sf_ctx);
- BMO_ITER(e, &siter, bm, op, "edges", BM_EDGE) {
+ BMO_ITER (e, &siter, bm, op, "edges", BM_EDGE) {
BMO_elem_flag_enable(bm, e, EDGE_MARK);
if (!BLI_smallhash_haskey(&hash, (uintptr_t)e->v1)) {
- eve = BLI_addfillvert(e->v1->co);
+ eve = BLI_addfillvert(&sf_ctx, e->v1->co);
eve->tmp.p = e->v1;
BLI_smallhash_insert(&hash, (uintptr_t)e->v1, eve);
}
if (!BLI_smallhash_haskey(&hash, (uintptr_t)e->v2)) {
- eve = BLI_addfillvert(e->v2->co);
+ eve = BLI_addfillvert(&sf_ctx, e->v2->co);
eve->tmp.p = e->v2;
BLI_smallhash_insert(&hash, (uintptr_t)e->v2, eve);
}
v1 = BLI_smallhash_lookup(&hash, (uintptr_t)e->v1);
v2 = BLI_smallhash_lookup(&hash, (uintptr_t)e->v2);
- /* eed = */ BLI_addfilledge(v1, v2);
+ /* eed = */ BLI_addfilledge(&sf_ctx, v1, v2);
/* eed->tmp.p = e; */ /* UNUSED */
}
- BLI_edgefill(0);
+ BLI_edgefill(&sf_ctx, FALSE);
- for (efa = fillfacebase.first; efa; efa = efa->next) {
+ for (efa = sf_ctx.fillfacebase.first; efa; efa = efa->next) {
BMFace *f = BM_face_create_quad_tri(bm,
efa->v1->tmp.p, efa->v2->tmp.p, efa->v3->tmp.p, NULL,
NULL, TRUE);
@@ -204,14 +206,14 @@ void bmo_triangle_fill_exec(BMesh *bm, BMOperator *op)
BMIter liter;
BMO_elem_flag_enable(bm, f, ELE_NEW);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
if (!BMO_elem_flag_test(bm, l->e, EDGE_MARK)) {
BMO_elem_flag_enable(bm, l->e, ELE_NEW);
}
}
}
- BLI_end_edgefill();
+ BLI_end_edgefill(&sf_ctx);
BLI_smallhash_release(&hash);
/* clean up fill */
diff --git a/source/blender/bmesh/operators/bmo_utils.c b/source/blender/bmesh/operators/bmo_utils.c
index e67dde812dc..538c6709b85 100644
--- a/source/blender/bmesh/operators/bmo_utils.c
+++ b/source/blender/bmesh/operators/bmo_utils.c
@@ -59,7 +59,7 @@ void bmo_transform_exec(BMesh *bm, BMOperator *op)
BMO_slot_mat4_get(op, "mat", mat);
- BMO_ITER(v, &iter, bm, op, "verts", BM_VERT) {
+ BMO_ITER (v, &iter, bm, op, "verts", BM_VERT) {
mul_m4_v3(mat, v->co);
}
}
@@ -113,7 +113,7 @@ void bmo_reversefaces_exec(BMesh *bm, BMOperator *op)
BMOIter siter;
BMFace *f;
- BMO_ITER(f, &siter, bm, op, "faces", BM_FACE) {
+ BMO_ITER (f, &siter, bm, op, "faces", BM_FACE) {
BM_face_normal_flip(bm, f);
}
}
@@ -131,11 +131,11 @@ void bmo_edgerotate_exec(BMesh *bm, BMOperator *op)
#define EDGE_OUT 1
#define FACE_TAINT 1
- BMO_ITER(e, &siter, bm, op, "edges", BM_EDGE) {
+ BMO_ITER (e, &siter, bm, op, "edges", BM_EDGE) {
/**
* this ends up being called twice, could add option to not to call check in
* #BM_edge_rotate to get some extra speed */
- if (BM_edge_rotate_check(bm, e)) {
+ if (BM_edge_rotate_check(e)) {
BMFace *fa, *fb;
if (BM_edge_face_pair(e, &fa, &fb)) {
@@ -180,14 +180,14 @@ static void bmo_regionextend_extend(BMesh *bm, BMOperator *op, int usefaces)
BMOIter siter;
if (!usefaces) {
- BMO_ITER(v, &siter, bm, op, "geom", BM_VERT) {
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, v) {
+ BMO_ITER (v, &siter, bm, op, "geom", BM_VERT) {
+ BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) {
if (!BMO_elem_flag_test(bm, e, SEL_ORIG))
break;
}
if (e) {
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) {
BMO_elem_flag_enable(bm, e, SEL_FLAG);
BMO_elem_flag_enable(bm, BM_edge_other_vert(e, v), SEL_FLAG);
}
@@ -199,9 +199,9 @@ static void bmo_regionextend_extend(BMesh *bm, BMOperator *op, int usefaces)
BMFace *f, *f2;
BMLoop *l;
- BMO_ITER(f, &siter, bm, op, "geom", BM_FACE) {
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
- BM_ITER(f2, &fiter, bm, BM_FACES_OF_EDGE, l->e) {
+ BMO_ITER (f, &siter, bm, op, "geom", BM_FACE) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
+ BM_ITER_ELEM (f2, &fiter, l->e, BM_FACES_OF_EDGE) {
if (!BMO_elem_flag_test(bm, f2, SEL_ORIG)) {
BMO_elem_flag_enable(bm, f2, SEL_FLAG);
}
@@ -219,8 +219,8 @@ static void bmo_regionextend_constrict(BMesh *bm, BMOperator *op, int usefaces)
BMOIter siter;
if (!usefaces) {
- BMO_ITER(v, &siter, bm, op, "geom", BM_VERT) {
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, v) {
+ BMO_ITER (v, &siter, bm, op, "geom", BM_VERT) {
+ BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) {
if (!BMO_elem_flag_test(bm, e, SEL_ORIG))
break;
}
@@ -228,7 +228,7 @@ static void bmo_regionextend_constrict(BMesh *bm, BMOperator *op, int usefaces)
if (e) {
BMO_elem_flag_enable(bm, v, SEL_FLAG);
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) {
BMO_elem_flag_enable(bm, e, SEL_FLAG);
}
@@ -240,9 +240,9 @@ static void bmo_regionextend_constrict(BMesh *bm, BMOperator *op, int usefaces)
BMFace *f, *f2;
BMLoop *l;
- BMO_ITER(f, &siter, bm, op, "geom", BM_FACE) {
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
- BM_ITER(f2, &fiter, bm, BM_FACES_OF_EDGE, l->e) {
+ BMO_ITER (f, &siter, bm, op, "geom", BM_FACE) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
+ BM_ITER_ELEM (f2, &fiter, l->e, BM_FACES_OF_EDGE) {
if (!BMO_elem_flag_test(bm, f2, SEL_ORIG)) {
BMO_elem_flag_enable(bm, f, SEL_FLAG);
break;
@@ -312,7 +312,7 @@ void bmo_righthandfaces_exec(BMesh *bm, BMOperator *op)
BMO_slot_buffer_flag_enable(bm, op, "faces", BM_FACE, FACE_FLAG);
/* find a starting face */
- BMO_ITER(f, &siter, bm, op, "faces", BM_FACE) {
+ BMO_ITER (f, &siter, bm, op, "faces", BM_FACE) {
/* clear dirty flag */
BM_elem_flag_disable(f, BM_ELEM_TAG);
@@ -322,7 +322,7 @@ void bmo_righthandfaces_exec(BMesh *bm, BMOperator *op)
if (!startf) startf = f;
- BM_face_center_bounds_calc(bm, f, cent);
+ BM_face_center_bounds_calc(f, cent);
if ((maxx_test = dot_v3v3(cent, cent)) > maxx) {
maxx = maxx_test;
@@ -332,7 +332,7 @@ void bmo_righthandfaces_exec(BMesh *bm, BMOperator *op)
if (!startf) return;
- BM_face_center_bounds_calc(bm, startf, cent);
+ BM_face_center_bounds_calc(startf, cent);
/* make sure the starting face has the correct winding */
if (dot_v3v3(cent, startf->no) < 0.0f) {
@@ -358,8 +358,8 @@ void bmo_righthandfaces_exec(BMesh *bm, BMOperator *op)
f = fstack[i];
i--;
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
- BM_ITER(l2, &liter2, bm, BM_LOOPS_OF_LOOP, l) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
+ BM_ITER_ELEM (l2, &liter2, l, BM_LOOPS_OF_LOOP) {
if (!BMO_elem_flag_test(bm, l2->f, FACE_FLAG) || l2 == l)
continue;
@@ -395,7 +395,7 @@ void bmo_righthandfaces_exec(BMesh *bm, BMOperator *op)
BLI_array_free(fstack);
/* check if we have faces yet to do. if so, recurse */
- BMO_ITER(f, &siter, bm, op, "faces", BM_FACE) {
+ BMO_ITER (f, &siter, bm, op, "faces", BM_FACE) {
if (!BMO_elem_flag_test(bm, f, FACE_VIS)) {
bmo_righthandfaces_exec(bm, op);
break;
@@ -419,12 +419,12 @@ void bmo_vertexsmooth_exec(BMesh *bm, BMOperator *op)
clipz = BMO_slot_bool_get(op, "mirror_clip_z");
i = 0;
- BMO_ITER(v, &siter, bm, op, "verts", BM_VERT) {
+ BMO_ITER (v, &siter, bm, op, "verts", BM_VERT) {
BLI_array_growone(cos);
co = cos[i];
j = 0;
- BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e, &iter, v, BM_EDGES_OF_VERT) {
co2 = BM_edge_other_vert(e, v)->co;
add_v3_v3v3(co, co, co2);
j += 1;
@@ -450,7 +450,7 @@ void bmo_vertexsmooth_exec(BMesh *bm, BMOperator *op)
}
i = 0;
- BMO_ITER(v, &siter, bm, op, "verts", BM_VERT) {
+ BMO_ITER (v, &siter, bm, op, "verts", BM_VERT) {
copy_v3_v3(v->co, cos[i]);
i++;
}
@@ -459,43 +459,13 @@ void bmo_vertexsmooth_exec(BMesh *bm, BMOperator *op)
}
/*
- * compute the perimeter of an ngon
- *
- * NOTE: This should probably go to bmesh_polygon.c
- */
-static float ngon_perimeter(BMesh *bm, BMFace *f)
-{
- BMIter liter;
- BMLoop *l;
- int num_verts = 0;
- float v[3], sv[3];
- float perimeter = 0.0f;
-
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
- if (num_verts == 0) {
- copy_v3_v3(v, l->v->co);
- copy_v3_v3(sv, l->v->co);
- }
- else {
- perimeter += len_v3v3(v, l->v->co);
- copy_v3_v3(v, l->v->co);
- }
- num_verts++;
- }
-
- perimeter += len_v3v3(v, sv);
-
- return perimeter;
-}
-
-/*
* compute the fake surface of an ngon
* This is done by decomposing the ngon into triangles who share the centroid of the ngon
* while this method is far from being exact, it should garantee an invariance.
*
* NOTE: This should probably go to bmesh_polygon.c
*/
-static float ngon_fake_area(BMesh *bm, BMFace *f)
+static float ngon_fake_area(BMFace *f)
{
BMIter liter;
BMLoop *l;
@@ -503,9 +473,9 @@ static float ngon_fake_area(BMesh *bm, BMFace *f)
float v[3], sv[3], c[3];
float area = 0.0f;
- BM_face_center_mean_calc(bm, f, c);
+ BM_face_center_mean_calc(f, c);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
if (num_verts == 0) {
copy_v3_v3(v, l->v->co);
copy_v3_v3(sv, l->v->co);
@@ -563,7 +533,7 @@ void bmo_similarfaces_exec(BMesh *bm, BMOperator *op)
* so the overall complexity will be less than $O(mn)$ where is the total number of selected faces,
* and n is the total number of faces
*/
- BMO_ITER(fs, &fs_iter, bm, op, "faces", BM_FACE) {
+ BMO_ITER (fs, &fs_iter, bm, op, "faces", BM_FACE) {
if (!BMO_elem_flag_test(bm, fs, FACE_MARK)) { /* is this really needed ? */
BMO_elem_flag_enable(bm, fs, FACE_MARK);
num_sels++;
@@ -575,7 +545,7 @@ void bmo_similarfaces_exec(BMesh *bm, BMOperator *op)
f_ext = (SimSel_FaceExt *)MEM_callocN(sizeof(SimSel_FaceExt) * num_total, "f_ext util.c");
/* loop through all the faces and fill the faces/indices structure */
- BM_ITER(fm, &fm_iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (fm, &fm_iter, bm, BM_FACES_OF_MESH) {
f_ext[i].f = fm;
if (BMO_elem_flag_test(bm, fm, FACE_MARK)) {
indices[idx] = i;
@@ -593,12 +563,12 @@ void bmo_similarfaces_exec(BMesh *bm, BMOperator *op)
switch (type) {
case SIMFACE_PERIMETER:
/* set the perimeter */
- f_ext[i].perim = ngon_perimeter(bm, f_ext[i].f);
+ f_ext[i].perim = BM_face_perimeter_calc(f_ext[i].f);
break;
case SIMFACE_COPLANAR:
/* compute the center of the polygon */
- BM_face_center_mean_calc(bm, f_ext[i].f, f_ext[i].c);
+ BM_face_center_mean_calc(f_ext[i].f, f_ext[i].c);
/* normalize the polygon normal */
copy_v3_v3(t_no, f_ext[i].f->no);
@@ -609,7 +579,7 @@ void bmo_similarfaces_exec(BMesh *bm, BMOperator *op)
break;
case SIMFACE_AREA:
- f_ext[i].area = ngon_fake_area(bm, f_ext[i].f);
+ f_ext[i].area = ngon_fake_area(f_ext[i].f);
break;
case SIMFACE_IMAGE:
@@ -701,27 +671,6 @@ void bmo_similarfaces_exec(BMesh *bm, BMOperator *op)
#define EDGE_MARK 1
/*
- * compute the angle of an edge (i.e. the angle between two faces)
- */
-static float edge_angle(BMesh *bm, BMEdge *e)
-{
- BMIter fiter;
- BMFace *f, *f_prev = NULL;
-
- /* first edge faces, don't account for 3+ */
-
- BM_ITER(f, &fiter, bm, BM_FACES_OF_EDGE, e) {
- if (f_prev == NULL) {
- f_prev = f;
- }
- else {
- return angle_v3v3(f_prev->no, f->no);
- }
- }
-
- return 0.0f;
-}
-/*
* extra edge information
*/
typedef struct SimSel_EdgeExt {
@@ -760,7 +709,7 @@ void bmo_similaredges_exec(BMesh *bm, BMOperator *op)
num_total = BM_mesh_elem_count(bm, BM_EDGE);
/* iterate through all selected edges and mark them */
- BMO_ITER(es, &es_iter, bm, op, "edges", BM_EDGE) {
+ BMO_ITER (es, &es_iter, bm, op, "edges", BM_EDGE) {
BMO_elem_flag_enable(bm, es, EDGE_MARK);
num_sels++;
}
@@ -770,7 +719,7 @@ void bmo_similaredges_exec(BMesh *bm, BMOperator *op)
e_ext = (SimSel_EdgeExt *)MEM_callocN(sizeof(SimSel_EdgeExt) * num_total, "e_ext util.c");
/* loop through all the edges and fill the edges/indices structure */
- BM_ITER(e, &e_iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &e_iter, bm, BM_EDGES_OF_MESH) {
e_ext[i].e = e;
if (BMO_elem_flag_test(bm, e, EDGE_MARK)) {
indices[idx] = i;
@@ -798,7 +747,7 @@ void bmo_similaredges_exec(BMesh *bm, BMOperator *op)
case SIMEDGE_FACE_ANGLE:
e_ext[i].faces = BM_edge_face_count(e_ext[i].e);
if (e_ext[i].faces == 2)
- e_ext[i].angle = edge_angle(bm, e_ext[i].e);
+ e_ext[i].angle = BM_edge_face_angle(e_ext[i].e);
break;
}
}
@@ -931,7 +880,7 @@ void bmo_similarverts_exec(BMesh *bm, BMOperator *op)
num_total = BM_mesh_elem_count(bm, BM_VERT);
/* iterate through all selected edges and mark them */
- BMO_ITER(vs, &vs_iter, bm, op, "verts", BM_VERT) {
+ BMO_ITER (vs, &vs_iter, bm, op, "verts", BM_VERT) {
BMO_elem_flag_enable(bm, vs, VERT_MARK);
num_sels++;
}
@@ -941,7 +890,7 @@ void bmo_similarverts_exec(BMesh *bm, BMOperator *op)
v_ext = (SimSel_VertExt *)MEM_mallocN(sizeof(SimSel_VertExt) * num_total, "vertex extra");
/* loop through all the vertices and fill the vertices/indices structure */
- BM_ITER(v, &v_iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &v_iter, bm, BM_VERTS_OF_MESH) {
v_ext[i].v = v;
if (BMO_elem_flag_test(bm, v, VERT_MARK)) {
indices[idx] = i;
@@ -1028,7 +977,7 @@ void bmo_face_rotateuvs_exec(BMesh *bm, BMOperator *op)
int dir = BMO_slot_int_get(op, "dir");
- BMO_ITER(fs, &fs_iter, bm, op, "faces", BM_FACE) {
+ BMO_ITER (fs, &fs_iter, bm, op, "faces", BM_FACE) {
if (CustomData_has_layer(&(bm->ldata), CD_MLOOPUV)) {
if (dir == DIRECTION_CW) { /* same loops direction */
BMLoop *lf; /* current face loops */
@@ -1037,7 +986,7 @@ void bmo_face_rotateuvs_exec(BMesh *bm, BMOperator *op)
float t_uv[2]; /* tmp uvs */
int n = 0;
- BM_ITER(lf, &l_iter, bm, BM_LOOPS_OF_FACE, fs) {
+ BM_ITER_ELEM (lf, &l_iter, fs, BM_LOOPS_OF_FACE) {
/* current loop uv is the previous loop uv */
MLoopUV *luv = CustomData_bmesh_get(&bm->ldata, lf->head.data, CD_MLOOPUV);
if (n == 0) {
@@ -1061,7 +1010,7 @@ void bmo_face_rotateuvs_exec(BMesh *bm, BMOperator *op)
float t_uv[2]; /* current uvs */
int n = 0;
- BM_ITER(lf, &l_iter, bm, BM_LOOPS_OF_FACE, fs) {
+ BM_ITER_ELEM (lf, &l_iter, fs, BM_LOOPS_OF_FACE) {
/* previous loop uv is the current loop uv */
luv = CustomData_bmesh_get(&bm->ldata, lf->head.data, CD_MLOOPUV);
if (n == 0) {
@@ -1094,7 +1043,7 @@ void bmo_face_reverseuvs_exec(BMesh *bm, BMOperator *op)
BLI_array_declare(uvs);
float (*uvs)[2] = NULL;
- BMO_ITER(fs, &fs_iter, bm, op, "faces", BM_FACE) {
+ BMO_ITER (fs, &fs_iter, bm, op, "faces", BM_FACE) {
if (CustomData_has_layer(&(bm->ldata), CD_MLOOPUV)) {
BMLoop *lf; /* current face loops */
int i;
@@ -1102,7 +1051,7 @@ void bmo_face_reverseuvs_exec(BMesh *bm, BMOperator *op)
BLI_array_empty(uvs);
BLI_array_growitems(uvs, fs->len);
- BM_ITER_INDEX(lf, &l_iter, bm, BM_LOOPS_OF_FACE, fs, i) {
+ BM_ITER_ELEM_INDEX (lf, &l_iter, fs, BM_LOOPS_OF_FACE, i) {
MLoopUV *luv = CustomData_bmesh_get(&bm->ldata, lf->head.data, CD_MLOOPUV);
/* current loop uv is the previous loop uv */
@@ -1111,7 +1060,7 @@ void bmo_face_reverseuvs_exec(BMesh *bm, BMOperator *op)
/* now that we have the uvs in the array, reverse! */
i = 0;
- BM_ITER(lf, &l_iter, bm, BM_LOOPS_OF_FACE, fs) {
+ BM_ITER_ELEM (lf, &l_iter, fs, BM_LOOPS_OF_FACE) {
/* current loop uv is the previous loop uv */
MLoopUV *luv = CustomData_bmesh_get(&bm->ldata, lf->head.data, CD_MLOOPUV);
luv->uv[0] = uvs[(fs->len - i - 1)][0];
@@ -1137,7 +1086,7 @@ void bmo_rotatecolors_exec(BMesh *bm, BMOperator *op)
int dir = BMO_slot_int_get(op, "dir");
- BMO_ITER(fs, &fs_iter, bm, op, "faces", BM_FACE) {
+ BMO_ITER (fs, &fs_iter, bm, op, "faces", BM_FACE) {
if (CustomData_has_layer(&(bm->ldata), CD_MLOOPCOL)) {
if (dir == DIRECTION_CW) { /* same loops direction */
BMLoop *lf; /* current face loops */
@@ -1146,7 +1095,7 @@ void bmo_rotatecolors_exec(BMesh *bm, BMOperator *op)
MLoopCol t_col; /* tmp color */
int n = 0;
- BM_ITER(lf, &l_iter, bm, BM_LOOPS_OF_FACE, fs) {
+ BM_ITER_ELEM (lf, &l_iter, fs, BM_LOOPS_OF_FACE) {
/* current loop color is the previous loop color */
MLoopCol *luv = CustomData_bmesh_get(&bm->ldata, lf->head.data, CD_MLOOPCOL);
if (n == 0) {
@@ -1170,7 +1119,7 @@ void bmo_rotatecolors_exec(BMesh *bm, BMOperator *op)
MLoopCol t_col; /* current color */
int n = 0;
- BM_ITER(lf, &l_iter, bm, BM_LOOPS_OF_FACE, fs) {
+ BM_ITER_ELEM (lf, &l_iter, fs, BM_LOOPS_OF_FACE) {
/* previous loop color is the current loop color */
lcol = CustomData_bmesh_get(&bm->ldata, lf->head.data, CD_MLOOPCOL);
if (n == 0) {
@@ -1202,13 +1151,13 @@ void bmo_face_reversecolors_exec(BMesh *bm, BMOperator *op)
BLI_array_declare(cols);
MLoopCol *cols = NULL;
- BMO_ITER(fs, &fs_iter, bm, op, "faces", BM_FACE) {
+ BMO_ITER (fs, &fs_iter, bm, op, "faces", BM_FACE) {
if (CustomData_has_layer(&(bm->ldata), CD_MLOOPCOL)) {
BMLoop *lf; /* current face loops */
int i = 0;
BLI_array_empty(cols);
- BM_ITER(lf, &l_iter, bm, BM_LOOPS_OF_FACE, fs) {
+ BM_ITER_ELEM (lf, &l_iter, fs, BM_LOOPS_OF_FACE) {
MLoopCol *lcol = CustomData_bmesh_get(&bm->ldata, lf->head.data, CD_MLOOPCOL);
/* current loop uv is the previous loop color */
@@ -1219,7 +1168,7 @@ void bmo_face_reversecolors_exec(BMesh *bm, BMOperator *op)
/* now that we have the uvs in the array, reverse! */
i = 0;
- BM_ITER(lf, &l_iter, bm, BM_LOOPS_OF_FACE, fs) {
+ BM_ITER_ELEM (lf, &l_iter, fs, BM_LOOPS_OF_FACE) {
/* current loop uv is the previous loop color */
MLoopCol *lcol = CustomData_bmesh_get(&bm->ldata, lf->head.data, CD_MLOOPCOL);
*lcol = cols[(fs->len - i - 1)];
@@ -1256,10 +1205,10 @@ void bmo_vertexshortestpath_exec(BMesh *bm, BMOperator *op)
int num_total = 0 /*, num_sels = 0 */, i = 0;
int type = BMO_slot_int_get(op, "type");
- BMO_ITER(vs, &vs_iter, bm, op, "startv", BM_VERT) {
+ BMO_ITER (vs, &vs_iter, bm, op, "startv", BM_VERT) {
sv = vs;
}
- BMO_ITER(vs, &vs_iter, bm, op, "endv", BM_VERT) {
+ BMO_ITER (vs, &vs_iter, bm, op, "endv", BM_VERT) {
ev = vs;
}
@@ -1271,7 +1220,7 @@ void bmo_vertexshortestpath_exec(BMesh *bm, BMOperator *op)
/* iterate through all the mesh vertices */
/* loop through all the vertices and fill the vertices/indices structure */
i = 0;
- BM_ITER(v, &v_iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &v_iter, bm, BM_VERTS_OF_MESH) {
vert_list[i].v = v;
vert_list[i].parent = NULL;
vert_list[i].weight = FLT_MAX;
@@ -1306,7 +1255,7 @@ void bmo_vertexshortestpath_exec(BMesh *bm, BMOperator *op)
v_weight = vert_list[BM_elem_index_get(v)].weight;
- BM_ITER(e, &e_i, bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e, &e_i, v, BM_EDGES_OF_VERT) {
BMVert *u;
float e_weight = v_weight;
diff --git a/source/blender/bmesh/tools/BME_bevel.c b/source/blender/bmesh/tools/BME_bevel.c
index 63976f25eff..0d177f5ab18 100644
--- a/source/blender/bmesh/tools/BME_bevel.c
+++ b/source/blender/bmesh/tools/BME_bevel.c
@@ -51,7 +51,7 @@
* Sender: Andrew Wiggin
* Status update: I have code changes to actually make basic bevel modifier work. The things that still need to be done:
* - clean up the changes
- * - get bevel by weight and bevel by angles working
+ * - get bevel by weight and bevel by angles working for vertex only bevel.
* - the code uses adaptations of a couple of bmesh APIs,
* that work a little differently. for example, a join faces that doesn't just create a new face and then delete the
* original two faces and all associated loops, it extends one of the original faces to cover all the original loops
@@ -83,10 +83,9 @@ void BME_free_transdata(BME_TransData_Head *td)
MEM_freeN(td);
}
-BME_TransData *BME_assign_transdata(
- BME_TransData_Head *td, BMesh *bm, BMVert *v,
- float *co, float *org, float *vec, float *loc,
- float factor, float weight, float maxfactor, float *max)
+BME_TransData *BME_assign_transdata(BME_TransData_Head *td, BMesh *bm, BMVert *v,
+ float *co, float *org, float *vec, float *loc,
+ float factor, float weight, float maxfactor, float *max)
{
BME_TransData *vtd;
int is_new = 0;
@@ -144,64 +143,34 @@ float *BME_new_transdata_float(BME_TransData_Head *td)
return BLI_memarena_alloc(td->ma, sizeof(float));
}
-/* BM_disk_dissolve is a real mess, and crashes bevel if called instead of this.
- * The drawback, though, is that this code doesn't merge customdata. */
-static int BME_Bevel_Dissolve_Disk(BMesh *bm, BMVert *v)
+/* ported from before bmesh merge into trunk (was called)
+ * problem with this is it creates 2 vert faces */
+static void BME_Bevel_Dissolve_Disk(BMesh *bm, BMVert *v)
{
- BMIter iter;
- BMEdge *e, *elast;
- BMLoop *l1, *l2;
-
- if (!BM_vert_is_manifold(v)) {
- return 0;
- }
-
- BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v) {
- if (BM_edge_face_count(e) != 2) {
- return 0;
- }
- }
+ BMFace *f;
+ BMEdge *e;
+ int done;
- if (BM_vert_edge_count(v) > 2) {
- while (BM_vert_edge_count(v) > 2) {
- e = v->e;
- l1 = e->l;
- l2 = l1->radial_next;
- if (l1->v == l2->v) {
- /* faces have incompatible directions; need to reverse one */
- if (!bmesh_loop_reverse(bm, l2->f)) {
- BLI_assert(!"bevel dissolve disk cannot reverse loop");
- return 0;
+ if (v->e) {
+ done = 0;
+ while (!done) {
+ done = 1;
+ e = v->e; /*loop the edge looking for a edge to dissolve*/
+ do {
+ f = NULL;
+ if (BM_edge_is_manifold(e)) {
+ f = bmesh_jfke(bm, e->l->f, e->l->radial_next->f, e);
}
- l2 = l1->radial_next;
- }
- if (!bmesh_jfke(bm, l1->f, l2->f, e)) {
- BLI_assert(!"bevel dissolve disk cannot join faces");
- return 0;
- }
- }
-
- e = v->e;
- elast = bmesh_disk_edge_next(e, v);
-
- /* BMESH_TODO, figure out if its possible we had a double edge here and need to splice it,
- * last bool arg */
- bmesh_jekv(bm, e, v, FALSE);
-
- l1 = elast->l;
- l2 = l1->radial_next;
- if (l1->v == l2->v) {
- /* faces have incompatible directions */
- if (!bmesh_loop_reverse(bm, l2->f)) {
- BLI_assert(!"bevel dissolve disk cannot reverse loop");
- return 0;
+ if (f) {
+ done = 0;
+ break;
}
- l2 = l1->radial_next;
+ e = bmesh_disk_edge_next(e, v);
+ } while (e != v->e);
}
- bmesh_jfke(bm, l1->f, l2->f, elast);
+ BM_vert_collapse_edge(bm, v->e, v, TRUE);
+ // bmesh_jekv(bm, v->e, v, FALSE);
}
-
- return 1;
}
static int BME_bevel_is_split_vert(BMesh *bm, BMLoop *l)
@@ -211,8 +180,8 @@ static int BME_bevel_is_split_vert(BMesh *bm, BMLoop *l)
* vert and the edges around it for originality
*/
if (!BMO_elem_flag_test(bm, l->v, BME_BEVEL_ORIG) &&
- BMO_elem_flag_test(bm, l->e, BME_BEVEL_ORIG) &&
- BMO_elem_flag_test(bm, l->prev->e, BME_BEVEL_ORIG))
+ BMO_elem_flag_test(bm, l->e, BME_BEVEL_ORIG) &&
+ BMO_elem_flag_test(bm, l->prev->e, BME_BEVEL_ORIG))
{
return 1;
}
@@ -683,7 +652,7 @@ static BMLoop *BME_bevel_vert(BMesh *bm, BMLoop *l, float value, int UNUSED(opti
*/
static BMFace *BME_bevel_poly(BMesh *bm, BMFace *f, float value, int options, BME_TransData_Head *td)
{
- BMLoop *l/*, *o */;
+ BMLoop *l /*, *o */;
BME_TransData *vtd1, *vtd2;
float up_vec[3], vec1[3], vec2[3], vec3[3], fac1, fac2, max = -1;
int len, i;
@@ -692,7 +661,7 @@ static BMFace *BME_bevel_poly(BMesh *bm, BMFace *f, float value, int options, BM
zero_v3(up_vec);
/* find a good normal for this face (there's better ways, I'm sure) */
- BM_ITER(l, &iter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &iter, f, BM_LOOPS_OF_FACE) {
BME_bevel_get_vec(vec1, l->v, l->next->v, td);
BME_bevel_get_vec(vec2, l->prev->v, l->v, td);
cross_v3_v3v3(vec3, vec2, vec1);
@@ -709,7 +678,7 @@ static BMFace *BME_bevel_poly(BMesh *bm, BMFace *f, float value, int options, BM
}
else if (BMO_elem_flag_test(bm, l->v, BME_BEVEL_BEVEL) &&
BMO_elem_flag_test(bm, l->v, BME_BEVEL_ORIG) &&
- !BMO_elem_flag_test(bm, l->prev->e, BME_BEVEL_BEVEL))
+ !BMO_elem_flag_test(bm, l->prev->e, BME_BEVEL_BEVEL))
{
max = 1.0f;
l = BME_bevel_vert(bm, l, value, options, up_vec, td);
@@ -721,7 +690,7 @@ static BMFace *BME_bevel_poly(BMesh *bm, BMFace *f, float value, int options, BM
/* max pass */
if (value > 0.5f && max > 0) {
max = -1;
- BM_ITER(l, &iter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &iter, f, BM_LOOPS_OF_FACE) {
if (BMO_elem_flag_test(bm, l->e, BME_BEVEL_BEVEL) || BMO_elem_flag_test(bm, l->e, BME_BEVEL_ORIG)) {
BME_bevel_get_vec(vec1, l->v, l->next->v, td);
vtd1 = BME_get_transdata(td, l->v);
@@ -755,7 +724,7 @@ static BMFace *BME_bevel_poly(BMesh *bm, BMFace *f, float value, int options, BM
}
}
if (fac1 || fac2) {
- max = len_v3(vec1)/(fac1 + fac2);
+ max = len_v3(vec1) / (fac1 + fac2);
if (vtd1->max && (*vtd1->max < 0 || max < *vtd1->max)) {
*vtd1->max = max;
}
@@ -771,6 +740,69 @@ static BMFace *BME_bevel_poly(BMesh *bm, BMFace *f, float value, int options, BM
return NULL;
}
+static float BME_bevel_get_angle(BMEdge *e, BMVert *v)
+{
+ BMVert *v1, *v2;
+ BMLoop *l1, *l2;
+ float vec1[3], vec2[3], vec3[3], vec4[3];
+
+ l1 = e->l;
+ l2 = e->l->radial_next;
+ if (l1->v == v) {
+ v1 = l1->prev->v;
+ v2 = l1->next->v;
+ }
+ else {
+ v1 = l1->next->next->v;
+ v2 = l1->v;
+ }
+ sub_v3_v3v3(vec1, v1->co, v->co);
+ sub_v3_v3v3(vec2, v2->co, v->co);
+ cross_v3_v3v3(vec3, vec1, vec2);
+
+ l1 = l2;
+ if (l1->v == v) {
+ v1 = l1->prev->v;
+ v2 = l1->next->v;
+ }
+ else {
+ v1 = l1->next->next->v;
+ v2 = l1->v;
+ }
+ sub_v3_v3v3(vec1, v1->co, v->co);
+ sub_v3_v3v3(vec2, v2->co, v->co);
+ cross_v3_v3v3(vec4, vec2, vec1);
+
+ normalize_v3(vec3);
+ normalize_v3(vec4);
+
+ return dot_v3v3(vec3, vec4);
+}
+
+static float UNUSED_FUNCTION(BME_bevel_get_angle_vert)(BMVert *v)
+{
+ BMIter iter;
+ BMLoop *l;
+ float n[3];
+ float n_tmp[3];
+ float angle_diff = 0.0f;
+
+
+ BM_ITER_ELEM (l, &iter, v, BM_LOOPS_OF_VERT) {
+ BM_loop_face_normal(l, n_tmp);
+ madd_v3_v3fl(n, n_tmp, BM_loop_face_angle(l));
+ }
+ normalize_v3(n);
+
+ BM_ITER_ELEM (l, &iter, v, BM_LOOPS_OF_VERT) {
+ /* could cache from before */
+ BM_loop_face_normal(l, n_tmp);
+ angle_diff += angle_normalized_v3v3(n, n_tmp) * (BM_loop_face_angle(l) * (float)(M_PI * 0.5));
+ }
+
+ return angle_diff;
+}
+
static void BME_bevel_add_vweight(BME_TransData_Head *td, BMesh *bm, BMVert *v, float weight, float factor, int options)
{
BME_TransData *vtd;
@@ -808,12 +840,15 @@ static void BME_bevel_add_vweight(BME_TransData_Head *td, BMesh *bm, BMVert *v,
}
}
-static void bevel_init_verts(BMesh *bm, int options, BME_TransData_Head *td)
+static void bevel_init_verts(BMesh *bm, int options, float angle, BME_TransData_Head *td)
{
BMVert *v;
BMIter iter;
float weight;
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+// const float threshold = (options & BME_BEVEL_ANGLE) ? cosf(angle + 0.001) : 0.0f;
+ (void)angle;
+
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
weight = 0.0f;
if (!BMO_elem_flag_test(bm, v, BME_BEVEL_NONMAN)) {
/* modifiers should not use selection */
@@ -826,6 +861,14 @@ static void bevel_init_verts(BMesh *bm, int options, BME_TransData_Head *td)
else if (options & BME_BEVEL_WEIGHT) {
weight = BM_elem_float_data_get(&bm->vdata, v, CD_BWEIGHT);
}
+#if 0 // not working well
+ else if (options & BME_BEVEL_ANGLE) {
+ /* dont set weight_v1/weight_v2 here, add direct */
+ if (BME_bevel_get_angle_vert(bm, v) < threshold) {
+ weight = 1.0f;
+ }
+ }
+#endif
else {
weight = 1.0f;
}
@@ -838,29 +881,48 @@ static void bevel_init_verts(BMesh *bm, int options, BME_TransData_Head *td)
}
}
-static void bevel_init_edges(BMesh *bm, int options, BME_TransData_Head *td)
+static void bevel_init_edges(BMesh *bm, int options, float angle, BME_TransData_Head *td)
{
BMEdge *e;
int count;
float weight;
BMIter iter;
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ const float threshold = (options & BME_BEVEL_ANGLE) ? cosf(angle + 0.001) : 0.0f;
+
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
weight = 0.0;
if (!BMO_elem_flag_test(bm, e, BME_BEVEL_NONMAN)) {
if (options & BME_BEVEL_SELECT) {
- if (BM_elem_flag_test(e, BM_ELEM_SELECT)) weight = 1.0;
+ if (BM_elem_flag_test(e, BM_ELEM_SELECT)) {
+ weight = 1.0;
+ }
}
else if (options & BME_BEVEL_WEIGHT) {
weight = BM_elem_float_data_get(&bm->edata, e, CD_BWEIGHT);
}
+ else if (options & BME_BEVEL_ANGLE) {
+ /* dont set weight_v1/weight_v2 here, add direct */
+ if (!BMO_elem_flag_test(bm, e->v1, BME_BEVEL_NONMAN) && BME_bevel_get_angle(e, e->v1) < threshold) {
+ BMO_elem_flag_enable(bm, e, BME_BEVEL_BEVEL);
+ BME_bevel_add_vweight(td, bm, e->v1, 1.0, 1.0, options);
+ }
+ else {
+ BME_bevel_add_vweight(td, bm, e->v1, 0.0, 1.0, options);
+ }
+ if (!BMO_elem_flag_test(bm, e->v2, BME_BEVEL_NONMAN) && BME_bevel_get_angle(e, e->v2) < threshold) {
+ BMO_elem_flag_enable(bm, e, BME_BEVEL_BEVEL);
+ BME_bevel_add_vweight(td, bm, e->v2, 1.0, 1.0, options);
+ }
+ else {
+ BME_bevel_add_vweight(td, bm, e->v2, 0.0, 1.0, options);
+ }
+ }
else {
weight = 1.0;
}
if (weight > 0.0) {
BMO_elem_flag_enable(bm, e, BME_BEVEL_BEVEL);
- BMO_elem_flag_enable(bm, e->v1, BME_BEVEL_BEVEL);
- BMO_elem_flag_enable(bm, e->v2, BME_BEVEL_BEVEL);
BME_bevel_add_vweight(td, bm, e->v1, weight, 1.0, options);
BME_bevel_add_vweight(td, bm, e->v2, weight, 1.0, options);
}
@@ -868,7 +930,7 @@ static void bevel_init_edges(BMesh *bm, int options, BME_TransData_Head *td)
}
/* clean up edges with 2 faces that share more than one edg */
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
if (BMO_elem_flag_test(bm, e, BME_BEVEL_BEVEL)) {
count = BM_face_share_edge_count(e->l->f, e->l->radial_next->f);
if (count > 1) BMO_elem_flag_disable(bm, e, BME_BEVEL_BEVEL);
@@ -876,16 +938,16 @@ static void bevel_init_edges(BMesh *bm, int options, BME_TransData_Head *td)
}
}
-static BMesh *BME_bevel_initialize(BMesh *bm, int options, int UNUSED(defgrp_index), float UNUSED(angle), BME_TransData_Head *td)
+static BMesh *BME_bevel_initialize(BMesh *bm, int options, int UNUSED(defgrp_index), float angle, BME_TransData_Head *td)
{
- BMVert *v/*, *v2 */;
- BMEdge *e/*, *curedg */;
+ BMVert *v /*, *v2 */;
+ BMEdge *e /*, *curedg */;
BMFace *f;
BMIter iter;
int /* wire, */ len;
/* tag non-manifold geometr */
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
BMO_elem_flag_enable(bm, v, BME_BEVEL_ORIG);
if (v->e) {
BME_assign_transdata(td, bm, v, v->co, v->co, NULL, NULL, 0, -1, -1, NULL);
@@ -903,7 +965,7 @@ static BMesh *BME_bevel_initialize(BMesh *bm, int options, int UNUSED(defgrp_ind
}
}
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
BMO_elem_flag_enable(bm, e, BME_BEVEL_ORIG);
if (!(BM_edge_is_boundary(e) || BM_edge_is_manifold(e))) {
BMO_elem_flag_enable(bm, e->v1, BME_BEVEL_NONMAN);
@@ -915,15 +977,15 @@ static BMesh *BME_bevel_initialize(BMesh *bm, int options, int UNUSED(defgrp_ind
}
}
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
BMO_elem_flag_enable(bm, f, BME_BEVEL_ORIG);
}
if (options & BME_BEVEL_VERT) {
- bevel_init_verts(bm, options, td);
+ bevel_init_verts(bm, options, angle, td);
}
else {
- bevel_init_edges(bm, options, td);
+ bevel_init_edges(bm, options, angle, td);
}
return bm;
@@ -939,13 +1001,13 @@ static BMesh *BME_bevel_reinitialize(BMesh *bm)
BMFace *f;
BMIter iter;
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
BMO_elem_flag_enable(bm, v, BME_BEVEL_ORIG);
}
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
BMO_elem_flag_enable(bm, e, BME_BEVEL_ORIG);
}
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
BMO_elem_flag_enable(bm, f, BME_BEVEL_ORIG);
}
return bm;
@@ -979,21 +1041,21 @@ static BMesh *BME_bevel_mesh(BMesh *bm, float value, int UNUSED(res), int option
/* unsigned int i, len; */
/* bevel poly */
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
if (BMO_elem_flag_test(bm, f, BME_BEVEL_ORIG)) {
BME_bevel_poly(bm, f, value, options, td);
}
}
/* get rid of beveled edge */
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
if (BMO_elem_flag_test(bm, e, BME_BEVEL_BEVEL) && BMO_elem_flag_test(bm, e, BME_BEVEL_ORIG)) {
BM_faces_join_pair(bm, e->l->f, e->l->radial_next->f, e, TRUE);
}
}
/* link up corners and cli */
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
if (BMO_elem_flag_test(bm, v, BME_BEVEL_ORIG) && BMO_elem_flag_test(bm, v, BME_BEVEL_BEVEL)) {
curedge = v->e;
do {
@@ -1002,21 +1064,23 @@ static BMesh *BME_bevel_mesh(BMesh *bm, float value, int UNUSED(res), int option
if (l->v != v) l = l->next;
if (l2->v != v) l2 = l2->next;
if (l->f->len > 3)
- BM_face_split(bm, l->f, l->next->v, l->prev->v, &l, l->e, FALSE); /* clip this corner off */
+ BM_face_split(bm, l->f, l->next->v, l->prev->v, &l, l->e, FALSE); /* clip this corner off */
if (l2->f->len > 3)
- BM_face_split(bm, l2->f, l2->next->v, l2->prev->v, &l, l2->e, FALSE); /* clip this corner off */
+ BM_face_split(bm, l2->f, l2->next->v, l2->prev->v, &l, l2->e, FALSE); /* clip this corner off */
curedge = bmesh_disk_edge_next(curedge, v);
} while (curedge != v->e);
BME_Bevel_Dissolve_Disk(bm, v);
}
}
+#ifdef DEBUG
/* Debug print, remov */
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
if (f->len == 2) {
- printf("warning");
+ printf("%s: warning, 2 edge face\n", __func__);
}
}
+#endif
return bm;
}
@@ -1064,7 +1128,7 @@ BMesh *BME_bevel(BMEditMesh *em, float value, int res, int options, int defgrp_i
}
/* otherwise apply transforms */
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
if ((vtd = BME_get_transdata(td, v))) {
if (vtd->max && (*vtd->max > 0 && value > *vtd->max)) {
d = *vtd->max;
diff --git a/source/blender/editors/curve/editcurve.c b/source/blender/editors/curve/editcurve.c
index 9190cd940d6..2e9aa8ec675 100644
--- a/source/blender/editors/curve/editcurve.c
+++ b/source/blender/editors/curve/editcurve.c
@@ -1015,9 +1015,8 @@ static void calc_shapeKeys(Object *obedit)
/* ********************* Amimation data *************** */
-static int curve_is_animated(Object *ob)
+static int curve_is_animated(Curve *cu)
{
- Curve *cu= (Curve*)ob->data;
AnimData *ad= BKE_animdata_from_id(&cu->id);
return ad && (ad->action || ad->drivers.first);
@@ -1063,10 +1062,9 @@ static void fcurve_remove(AnimData *ad, ListBase *orig_curves, FCurve *fcu)
free_fcurve(fcu);
}
-static void curve_rename_fcurves(Object *obedit, ListBase *orig_curves)
+static void curve_rename_fcurves(Curve *cu, ListBase *orig_curves)
{
int nu_index= 0, a, pt_index;
- Curve *cu= (Curve*)obedit->data;
EditNurb *editnurb= cu->editnurb;
Nurb *nu= editnurb->nurbs.first;
CVKeyIndex *keyIndex;
@@ -1178,17 +1176,16 @@ static void curve_rename_fcurves(Object *obedit, ListBase *orig_curves)
}
/* return 0 if animation data wasn't changed, 1 otherwise */
-int ED_curve_updateAnimPaths(Object *obedit)
+int ED_curve_updateAnimPaths(Curve *cu)
{
- Curve *cu= (Curve*)obedit->data;
AnimData *ad= BKE_animdata_from_id(&cu->id);
- if (!curve_is_animated(obedit)) return 0;
+ if (!curve_is_animated(cu)) return 0;
if (ad->action)
- curve_rename_fcurves(obedit, &ad->action->curves);
+ curve_rename_fcurves(cu, &ad->action->curves);
- curve_rename_fcurves(obedit, &ad->drivers);
+ curve_rename_fcurves(cu, &ad->drivers);
return 1;
}
@@ -1221,7 +1218,7 @@ void load_editNurb(Object *obedit)
cu->nurb= newnurb;
calc_shapeKeys(obedit);
- ED_curve_updateAnimPaths(obedit);
+ ED_curve_updateAnimPaths(obedit->data);
freeNurblist(&oldnurb);
}
@@ -1702,7 +1699,7 @@ static int deleteflagNurb(bContext *C, wmOperator *UNUSED(op), int flag)
nu= next;
}
- if (ED_curve_updateAnimPaths(obedit))
+ if (ED_curve_updateAnimPaths(obedit->data))
WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
return OPERATOR_FINISHED;
@@ -2017,7 +2014,7 @@ static int switch_direction_exec(bContext *C, wmOperator *UNUSED(op))
keyData_switchDirectionNurb(cu, nu);
}
- if (ED_curve_updateAnimPaths(obedit))
+ if (ED_curve_updateAnimPaths(obedit->data))
WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
DAG_id_tag_update(obedit->data, 0);
@@ -3191,7 +3188,7 @@ static int subdivide_exec(bContext *C, wmOperator *op)
subdividenurb(obedit, number_cuts);
- if (ED_curve_updateAnimPaths(obedit))
+ if (ED_curve_updateAnimPaths(obedit->data))
WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
@@ -3512,7 +3509,7 @@ static int set_spline_type_exec(bContext *C, wmOperator *op)
}
if (changed) {
- if (ED_curve_updateAnimPaths(obedit))
+ if (ED_curve_updateAnimPaths(obedit->data))
WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
DAG_id_tag_update(obedit->data, 0);
@@ -4104,7 +4101,7 @@ static int make_segment_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- if (ED_curve_updateAnimPaths(obedit))
+ if (ED_curve_updateAnimPaths(obedit->data))
WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
@@ -4323,7 +4320,7 @@ static int spin_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- if (ED_curve_updateAnimPaths(obedit))
+ if (ED_curve_updateAnimPaths(obedit->data))
WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
@@ -4626,7 +4623,7 @@ static int addvert_Nurb(bContext *C, short mode, float location[3])
if (ok) {
test2DNurb(nu);
- if (ED_curve_updateAnimPaths(obedit))
+ if (ED_curve_updateAnimPaths(obedit->data))
WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
@@ -4719,7 +4716,7 @@ static int extrude_exec(bContext *C, wmOperator *UNUSED(op))
}
else {
if (extrudeflagNurb(editnurb, 1)) { /* '1'= flag */
- if (ED_curve_updateAnimPaths(obedit))
+ if (ED_curve_updateAnimPaths(obedit->data))
WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
@@ -5640,7 +5637,7 @@ static int delete_exec(bContext *C, wmOperator *op)
keyIndex_delNurbList(editnurb, nubase);
freeNurblist(nubase);
- if (ED_curve_updateAnimPaths(obedit))
+ if (ED_curve_updateAnimPaths(obedit->data))
WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
}
@@ -5941,7 +5938,7 @@ static int delete_exec(bContext *C, wmOperator *op)
freeNurblist(nubase);
}
- if (ED_curve_updateAnimPaths(obedit))
+ if (ED_curve_updateAnimPaths(obedit->data))
WM_event_add_notifier(C, NC_OBJECT|ND_KEYS, obedit);
WM_event_add_notifier(C, NC_GEOM|ND_DATA, obedit->data);
@@ -6987,10 +6984,7 @@ static void undoCurve_to_editCurve(void *ucu, void *UNUSED(edata), void *cu_v)
cu->lastsel= lastsel;
cu->actnu= undoCurve->actnu;
- /* BMESH_TODO */
-#if 0
- ED_curve_updateAnimPaths(obedit);
-#endif
+ ED_curve_updateAnimPaths(cu);
}
static void *editCurve_to_undoCurve(void *UNUSED(edata), void *cu_v)
diff --git a/source/blender/editors/include/ED_curve.h b/source/blender/editors/include/ED_curve.h
index bffb5543460..50e43c46de5 100644
--- a/source/blender/editors/include/ED_curve.h
+++ b/source/blender/editors/include/ED_curve.h
@@ -87,7 +87,7 @@ int CU_select_nth(struct Object *obedit, int nth);
void ED_curve_beztcpy(struct EditNurb *editnurb, struct BezTriple *dst, struct BezTriple *src, int count);
void ED_curve_bpcpy(struct EditNurb *editnurb, struct BPoint *dst, struct BPoint *src, int count);
-int ED_curve_updateAnimPaths(struct Object *obedit);
+int ED_curve_updateAnimPaths(struct Curve *cu);
int ED_curve_actSelection(struct Curve *cu, float center[3]);
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h
index 0ab9c5dd977..16b3e0654bd 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -136,7 +136,7 @@ void EDBM_selectmode_convert(struct BMEditMesh *em, short oldmode, short selectm
void undo_push_mesh(struct bContext *C, const char *name);
int EDBM_editselection_active_get(struct BMEditMesh *em, struct BMEditSelection *ese);
-void EDBM_editselection_center(struct BMEditMesh *em, float *center, struct BMEditSelection *ese);
+void EDBM_editselection_center(float *center, struct BMEditSelection *ese);
void EDBM_editselection_plane(struct BMEditMesh *em, float *plane, struct BMEditSelection *ese);
void EDBM_editselection_normal(float *normal, struct BMEditSelection *ese);
int EDBM_vert_color_check(struct BMEditMesh *em);
diff --git a/source/blender/editors/include/ED_uvedit.h b/source/blender/editors/include/ED_uvedit.h
index f122987b4e1..dfdbb1969cf 100644
--- a/source/blender/editors/include/ED_uvedit.h
+++ b/source/blender/editors/include/ED_uvedit.h
@@ -78,6 +78,8 @@ void ED_uvedit_live_unwrap_begin(struct Scene *scene, struct Object *obedit);
void ED_uvedit_live_unwrap_re_solve(void);
void ED_uvedit_live_unwrap_end(short cancel);
+void ED_uvedit_live_unwrap(struct Scene *scene, struct Object *obedit);
+
/* single call up unwrap using scene settings, used for edge tag unwrapping */
void ED_unwrap_lscm(struct Scene *scene, struct Object *obedit, const short sel);
diff --git a/source/blender/editors/interface/interface_icons.c b/source/blender/editors/interface/interface_icons.c
index ba7c12d164b..e20b60cd77e 100644
--- a/source/blender/editors/interface/interface_icons.c
+++ b/source/blender/editors/interface/interface_icons.c
@@ -33,12 +33,13 @@
#include <string.h>
#ifndef WIN32
-#include <unistd.h>
+# include <unistd.h>
#else
-#include <io.h>
-#include <direct.h>
-#include "BLI_winstuff.h"
-#endif
+# include <io.h>
+# include <direct.h>
+# include "BLI_winstuff.h"
+#endif
+
#include "MEM_guardedalloc.h"
#include "GPU_extensions.h"
diff --git a/source/blender/editors/interface/interface_ops.c b/source/blender/editors/interface/interface_ops.c
index c3adadafe58..93546d74c1b 100644
--- a/source/blender/editors/interface/interface_ops.c
+++ b/source/blender/editors/interface/interface_ops.c
@@ -346,8 +346,10 @@ static void UI_OT_reset_default_button(wmOperatorType *ot)
/* Copy To Selected Operator ------------------------ */
-static int copy_to_selected_list(bContext *C, PointerRNA *ptr, ListBase *lb)
+static int copy_to_selected_list(bContext *C, PointerRNA *ptr, ListBase *lb, int *use_path)
{
+ *use_path = 0;
+
if (RNA_struct_is_a(ptr->type, &RNA_EditBone))
*lb = CTX_data_collection_get(C, "selected_editable_bones");
else if (RNA_struct_is_a(ptr->type, &RNA_PoseBone))
@@ -357,8 +359,10 @@ static int copy_to_selected_list(bContext *C, PointerRNA *ptr, ListBase *lb)
else {
ID *id = ptr->id.data;
- if(id && GS(id->name) == ID_OB)
+ if (id && GS(id->name) == ID_OB) {
*lb = CTX_data_collection_get(C, "selected_editable_objects");
+ *use_path = 1;
+ }
else
return 0;
}
@@ -375,26 +379,39 @@ static int copy_to_selected_button_poll(bContext *C)
uiContextActiveProperty(C, &ptr, &prop, &index);
if (ptr.data && prop) {
- char *path = RNA_path_from_ID_to_property(&ptr, prop);
+ char *path = NULL;
+ int use_path;
CollectionPointerLink *link;
ListBase lb;
- if (path && copy_to_selected_list(C, &ptr, &lb)) {
+ if (!copy_to_selected_list(C, &ptr, &lb, &use_path))
+ return success;
+
+ if (!use_path || (path = RNA_path_from_ID_to_property(&ptr, prop))) {
for (link = lb.first; link; link = link->next) {
if (link->ptr.data != ptr.data) {
- RNA_id_pointer_create(link->ptr.id.data, &idptr);
+ if (use_path) {
+ lprop = NULL;
+ RNA_id_pointer_create(link->ptr.id.data, &idptr);
+ RNA_path_resolve(&idptr, path, &lptr, &lprop);
+ }
+ else {
+ lptr = link->ptr;
+ lprop = prop;
+ }
- if (RNA_path_resolve(&idptr, path, &lptr, &lprop) && lprop == prop) {
+ if (lprop == prop) {
if (RNA_property_editable(&lptr, prop))
success = 1;
}
}
}
- BLI_freelistN(&lb);
+ if (path)
+ MEM_freeN(path);
}
- MEM_freeN(path);
+ BLI_freelistN(&lb);
}
return success;
@@ -412,16 +429,29 @@ static int copy_to_selected_button_exec(bContext *C, wmOperator *op)
/* if there is a valid property that is editable... */
if (ptr.data && prop) {
- char *path = RNA_path_from_ID_to_property(&ptr, prop);
+ char *path = NULL;
+ int use_path;
CollectionPointerLink *link;
ListBase lb;
- if (path && copy_to_selected_list(C, &ptr, &lb)) {
+ if (!copy_to_selected_list(C, &ptr, &lb, &use_path))
+ return success;
+
+ if (!use_path || (path = RNA_path_from_ID_to_property(&ptr, prop))) {
for (link = lb.first; link; link = link->next) {
if (link->ptr.data != ptr.data) {
- RNA_id_pointer_create(link->ptr.id.data, &idptr);
- if (RNA_path_resolve(&idptr, path, &lptr, &lprop) && lprop == prop) {
- if(RNA_property_editable(&lptr, lprop)) {
+ if (use_path) {
+ lprop = NULL;
+ RNA_id_pointer_create(link->ptr.id.data, &idptr);
+ RNA_path_resolve(&idptr, path, &lptr, &lprop);
+ }
+ else {
+ lptr = link->ptr;
+ lprop = prop;
+ }
+
+ if (lprop == prop) {
+ if (RNA_property_editable(&lptr, lprop)) {
if (RNA_property_copy(&lptr, &ptr, prop, (all) ? -1 : index)) {
RNA_property_update(C, &lptr, prop);
success = 1;
@@ -431,10 +461,11 @@ static int copy_to_selected_button_exec(bContext *C, wmOperator *op)
}
}
- BLI_freelistN(&lb);
+ if (path)
+ MEM_freeN(path);
}
- MEM_freeN(path);
+ BLI_freelistN(&lb);
}
return (success) ? OPERATOR_FINISHED : OPERATOR_CANCELLED;
diff --git a/source/blender/editors/mesh/CMakeLists.txt b/source/blender/editors/mesh/CMakeLists.txt
index 3026eeb8f50..246c323213c 100644
--- a/source/blender/editors/mesh/CMakeLists.txt
+++ b/source/blender/editors/mesh/CMakeLists.txt
@@ -43,6 +43,7 @@ set(SRC
editmesh_bvh.c
editmesh_knife.c
editmesh_loopcut.c
+ editmesh_rip.c
editmesh_select.c
editmesh_tools.c
editmesh_utils.c
diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c
index d4a799764df..f38bdb1ebe3 100644
--- a/source/blender/editors/mesh/editface.c
+++ b/source/blender/editors/mesh/editface.c
@@ -814,7 +814,7 @@ void ED_mesh_mirrtopo_init(Mesh *me, const int ob_mode, MirrTopoStore_t *mesh_to
if (em) {
totedge = me->edit_btmesh->bm->totedge;
- BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
topo_hash[BM_elem_index_get(eed->v1)]++;
topo_hash[BM_elem_index_get(eed->v2)]++;
}
@@ -835,7 +835,7 @@ void ED_mesh_mirrtopo_init(Mesh *me, const int ob_mode, MirrTopoStore_t *mesh_to
/* use the number of edges per vert to give verts unique topology IDs */
if (em) {
- BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
topo_hash[BM_elem_index_get(eed->v1)] += topo_hash_prev[BM_elem_index_get(eed->v2)];
topo_hash[BM_elem_index_get(eed->v2)] += topo_hash_prev[BM_elem_index_get(eed->v1)];
}
diff --git a/source/blender/editors/mesh/editmesh_bvh.c b/source/blender/editors/mesh/editmesh_bvh.c
index f9c673010f3..6155ad1be1c 100644
--- a/source/blender/editors/mesh/editmesh_bvh.c
+++ b/source/blender/editors/mesh/editmesh_bvh.c
@@ -90,6 +90,7 @@ BMBVHTree *BMBVH_NewBVH(BMEditMesh *em, int flag, Scene *scene, Object *obedit)
SmallHash shash;
float cos[3][3], (*cagecos)[3] = NULL;
int i;
+ int tottri;
/* when initializing cage verts, we only want the first cage coordinate for each vertex,
* so that e.g. mirror or array use original vertex coordinates and not mirrored or duplicate */
@@ -103,8 +104,28 @@ BMBVHTree *BMBVH_NewBVH(BMEditMesh *em, int flag, Scene *scene, Object *obedit)
tree->bm = em->bm;
tree->epsilon = FLT_EPSILON * 2.0f;
tree->flag = flag;
-
- tree->tree = BLI_bvhtree_new(em->tottri, tree->epsilon, 8, 8);
+
+ if (flag & (BMBVH_RESPECT_SELECT)) {
+ tottri = 0;
+ for (i = 0; i < em->tottri; i++) {
+ if (BM_elem_flag_test(em->looptris[i][0]->f, BM_ELEM_SELECT)) {
+ tottri++;
+ }
+ }
+ }
+ else if (flag & (BMBVH_RESPECT_HIDDEN)) {
+ tottri = 0;
+ for (i = 0; i < em->tottri; i++) {
+ if (!BM_elem_flag_test(em->looptris[i][0]->f, BM_ELEM_HIDDEN)) {
+ tottri++;
+ }
+ }
+ }
+ else {
+ tottri = em->tottri;
+ }
+
+ tree->tree = BLI_bvhtree_new(tottri, tree->epsilon, 8, 8);
if (flag & BMBVH_USE_CAGE) {
BMIter iter;
@@ -112,7 +133,7 @@ BMBVHTree *BMBVH_NewBVH(BMEditMesh *em, int flag, Scene *scene, Object *obedit)
void *data[3];
tree->cos = MEM_callocN(sizeof(float) * 3 * em->bm->totvert, "bmbvh cos");
- BM_ITER_INDEX(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL, i) {
+ BM_ITER_MESH_INDEX (v, &iter, em->bm, BM_VERTS_OF_MESH, i) {
BM_elem_index_set(v, i); /* set_inline */
copy_v3_v3(tree->cos[i], v->co);
}
@@ -132,6 +153,21 @@ BMBVHTree *BMBVH_NewBVH(BMEditMesh *em, int flag, Scene *scene, Object *obedit)
tree->cagecos = cagecos;
for (i = 0; i < em->tottri; i++) {
+
+
+ if (flag & BMBVH_RESPECT_SELECT) {
+ /* note, the arrays wont allign now! take care */
+ if (!BM_elem_flag_test(em->looptris[i][0]->f, BM_ELEM_SELECT)) {
+ continue;
+ }
+ }
+ else if (flag & BMBVH_RESPECT_HIDDEN) {
+ /* note, the arrays wont allign now! take care */
+ if (BM_elem_flag_test(em->looptris[i][0]->f, BM_ELEM_HIDDEN)) {
+ continue;
+ }
+ }
+
if (flag & BMBVH_USE_CAGE) {
copy_v3_v3(cos[0], cagecos[BM_elem_index_get(em->looptris[i][0]->v)]);
copy_v3_v3(cos[1], cagecos[BM_elem_index_get(em->looptris[i][1]->v)]);
@@ -305,19 +341,6 @@ BMVert *BMBVH_FindClosestVert(BMBVHTree *tree, float *co, float maxdist)
return NULL;
}
-typedef struct walklist {
- BMVert *v;
- int valence;
- int depth;
- float w, r;
- int totwalked;
-
- /* state data */
- BMVert *lastv;
- BMLoop *curl, *firstl;
- BMEdge *cure;
-} walklist;
-
/* UNUSED */
#if 0
static short winding(float *v1, float *v2, float *v3)
diff --git a/source/blender/editors/mesh/editmesh_bvh.h b/source/blender/editors/mesh/editmesh_bvh.h
index c8baa804205..e2b45062e41 100644
--- a/source/blender/editors/mesh/editmesh_bvh.h
+++ b/source/blender/editors/mesh/editmesh_bvh.h
@@ -60,8 +60,12 @@ int BMBVH_EdgeVisible(struct BMBVHTree *tree, struct BMEdge *e,
/*find a vert closest to co in a sphere of radius maxdist*/
struct BMVert *BMBVH_FindClosestVert(struct BMBVHTree *tree, float *co, float maxdist);
-/*BMBVH_NewBVH flag parameter*/
-#define BMBVH_USE_CAGE 1 /*project geometry onto modifier cage */
-#define BMBVH_RETURN_ORIG 2 /*use with BMBVH_USE_CAGE, returns hits in relation to original geometry*/
+/* BMBVH_NewBVH flag parameter */
+enum {
+ BMBVH_USE_CAGE = 1, /* project geometry onto modifier cage */
+ BMBVH_RETURN_ORIG = 2, /* use with BMBVH_USE_CAGE, returns hits in relation to original geometry */
+ BMBVH_RESPECT_SELECT = 4, /* restrict to hidden geometry (overrides BMBVH_RESPECT_HIDDEN) */
+ BMBVH_RESPECT_HIDDEN = 8 /* omit hidden geometry */
+};
#endif /* __EDITBMESH_BVH_H__ */
diff --git a/source/blender/editors/mesh/editmesh_knife.c b/source/blender/editors/mesh/editmesh_knife.c
index f33e1271e4e..11c19af4914 100644
--- a/source/blender/editors/mesh/editmesh_knife.c
+++ b/source/blender/editors/mesh/editmesh_knife.c
@@ -60,6 +60,10 @@
#include "DNA_mesh_types.h"
#include "DNA_object_types.h"
#include "BKE_tessmesh.h"
+#include "UI_resources.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
#include "mesh_intern.h"
@@ -67,6 +71,15 @@
#define KMAXDIST 10 /* max mouse distance from edge before not detecting it */
+typedef struct KnifeColors {
+ unsigned char line[3];
+ unsigned char edge[3];
+ unsigned char curpoint[3];
+ unsigned char curpoint_a[4];
+ unsigned char point[3];
+ unsigned char point_a[4];
+} KnifeColors;
+
/* knifetool operator */
typedef struct KnifeVert {
BMVert *v; /* non-NULL if this is an original vert */
@@ -117,11 +130,11 @@ typedef struct KnifePosData {
} KnifePosData;
/* struct for properties used while drawing */
-typedef struct knifetool_opdata {
+typedef struct KnifeTool_OpData {
ARegion *ar; /* region that knifetool was activated in */
void *draw_handle; /* for drawing preview loop */
ViewContext vc;
- bContext *C;
+ //bContext *C;
Object *ob;
BMEditMesh *em;
@@ -153,8 +166,15 @@ typedef struct knifetool_opdata {
BLI_mempool *refs;
float projmat[4][4];
- int is_ortho;
- int cut_through;
+
+ KnifeColors colors;
+
+ /* operatpr options */
+ char cut_through; /* preference, can be modified at runtime (that feature may go) */
+ char only_select; /* set on initialization */
+ char select_result; /* set on initialization */
+
+ short is_ortho;
float clipsta, clipend;
enum {
@@ -176,14 +196,30 @@ typedef struct knifetool_opdata {
} angle_snapping;
float (*cagecos)[3];
-} knifetool_opdata;
+} KnifeTool_OpData;
-static ListBase *knife_get_face_kedges(knifetool_opdata *kcd, BMFace *f);
+static ListBase *knife_get_face_kedges(KnifeTool_OpData *kcd, BMFace *f);
-static void knife_input_ray_cast(knifetool_opdata *kcd, const int mval_i[2],
+static void knife_input_ray_cast(KnifeTool_OpData *kcd, const int mval_i[2],
float r_origin[3], float r_ray[3]);
-static void knife_project_v3(knifetool_opdata *kcd, const float co[3], float sco[3])
+static void knife_update_header(bContext *C, KnifeTool_OpData *kcd)
+{
+ #define HEADER_LENGTH 180
+ char header[HEADER_LENGTH];
+
+ BLI_snprintf(header, HEADER_LENGTH, "LMB: define cut lines, Return: confirm, Esc or RMB: cancel, E: new cut, Ctrl: midpoint snap (%s), "
+ "Shift: ignore snap (%s), C: angle constrain (%s), Z: cut through (%s)",
+ kcd->snap_midpoints ? "On" : "Off",
+ kcd->ignore_edge_snapping ? "On" : "Off",
+ kcd->angle_snapping ? "On" : "Off",
+ kcd->cut_through ? "On" : "Off");
+
+ ED_area_headerprint(CTX_wm_area(C), header);
+}
+
+
+static void knife_project_v3(KnifeTool_OpData *kcd, const float co[3], float sco[3])
{
ED_view3d_project_float_v3(kcd->ar, co, sco, kcd->projmat);
}
@@ -199,7 +235,7 @@ static void knife_pos_data_clear(KnifePosData *kpd)
kpd->mval[1] = 0;
}
-static ListBase *knife_empty_list(knifetool_opdata *kcd)
+static ListBase *knife_empty_list(KnifeTool_OpData *kcd)
{
ListBase *lst;
@@ -208,7 +244,7 @@ static ListBase *knife_empty_list(knifetool_opdata *kcd)
return lst;
}
-static void knife_append_list(knifetool_opdata *kcd, ListBase *lst, void *elem)
+static void knife_append_list(KnifeTool_OpData *kcd, ListBase *lst, void *elem)
{
Ref *ref;
@@ -229,19 +265,19 @@ static Ref *find_ref(ListBase *lb, void *ref)
return NULL;
}
-static KnifeEdge *new_knife_edge(knifetool_opdata *kcd)
+static KnifeEdge *new_knife_edge(KnifeTool_OpData *kcd)
{
kcd->totkedge++;
return BLI_mempool_calloc(kcd->kedges);
}
-static void knife_add_to_vert_edges(knifetool_opdata *kcd, KnifeEdge *kfe)
+static void knife_add_to_vert_edges(KnifeTool_OpData *kcd, KnifeEdge *kfe)
{
knife_append_list(kcd, &kfe->v1->edges, kfe);
knife_append_list(kcd, &kfe->v2->edges, kfe);
}
-static KnifeVert *new_knife_vert(knifetool_opdata *kcd, float *co, float *cageco)
+static KnifeVert *new_knife_vert(KnifeTool_OpData *kcd, float *co, float *cageco)
{
KnifeVert *kfv = BLI_mempool_calloc(kcd->kverts);
@@ -257,7 +293,7 @@ static KnifeVert *new_knife_vert(knifetool_opdata *kcd, float *co, float *cageco
}
/* get a KnifeVert wrapper for an existing BMVert */
-static KnifeVert *get_bm_knife_vert(knifetool_opdata *kcd, BMVert *v)
+static KnifeVert *get_bm_knife_vert(KnifeTool_OpData *kcd, BMVert *v)
{
KnifeVert *kfv = BLI_ghash_lookup(kcd->origvertmap, v);
@@ -273,7 +309,7 @@ static KnifeVert *get_bm_knife_vert(knifetool_opdata *kcd, BMVert *v)
/**
* get a KnifeEdge wrapper for an existing BMEdge
* \note #knife_get_face_kedges / #get_bm_knife_edge are called recusively - KEEP STACK MEM USAGE LOW */
-static KnifeEdge *get_bm_knife_edge(knifetool_opdata *kcd, BMEdge *e)
+static KnifeEdge *get_bm_knife_edge(KnifeTool_OpData *kcd, BMEdge *e)
{
KnifeEdge *kfe = BLI_ghash_lookup(kcd->origedgemap, e);
if (!kfe) {
@@ -306,7 +342,7 @@ static KnifeEdge *get_bm_knife_edge(knifetool_opdata *kcd, BMEdge *e)
/* User has just clicked for first time or first time after a restart (E key).
* Copy the current position data into prev. */
-static void knife_start_cut(knifetool_opdata *kcd)
+static void knife_start_cut(KnifeTool_OpData *kcd)
{
kcd->prev = kcd->cur;
kcd->cur.is_space = 0; /*TODO: why do we do this? */
@@ -330,7 +366,7 @@ static void knife_start_cut(knifetool_opdata *kcd)
/**
* \note #knife_get_face_kedges / #get_bm_knife_edge are called recusively - KEEP STACK MEM USAGE LOW */
-static ListBase *knife_get_face_kedges(knifetool_opdata *kcd, BMFace *f)
+static ListBase *knife_get_face_kedges(KnifeTool_OpData *kcd, BMFace *f)
{
ListBase *lst = BLI_ghash_lookup(kcd->kedgefacemap, f);
@@ -353,7 +389,7 @@ static ListBase *knife_get_face_kedges(knifetool_opdata *kcd, BMFace *f)
}
/* finds the proper face to restrict face fill to */
-static void knife_find_basef(knifetool_opdata *kcd, KnifeEdge *kfe)
+static void knife_find_basef(KnifeTool_OpData *kcd, KnifeEdge *kfe)
{
if (!kfe->basef) {
Ref *r1, *r2, *r3, *r4;
@@ -384,13 +420,13 @@ static void knife_find_basef(knifetool_opdata *kcd, KnifeEdge *kfe)
}
}
-static void knife_edge_append_face(knifetool_opdata *kcd, KnifeEdge *kfe, BMFace *f)
+static void knife_edge_append_face(KnifeTool_OpData *kcd, KnifeEdge *kfe, BMFace *f)
{
knife_append_list(kcd, knife_get_face_kedges(kcd, f), kfe);
knife_append_list(kcd, &kfe->faces, f);
}
-static KnifeVert *knife_split_edge(knifetool_opdata *kcd, KnifeEdge *kfe, float co[3], KnifeEdge **newkfe_out)
+static KnifeVert *knife_split_edge(KnifeTool_OpData *kcd, KnifeEdge *kfe, float co[3], KnifeEdge **newkfe_out)
{
KnifeEdge *newkfe = new_knife_edge(kcd);
Ref *ref;
@@ -431,7 +467,7 @@ static KnifeVert *knife_split_edge(knifetool_opdata *kcd, KnifeEdge *kfe, float
/* Make a single KnifeEdge for cut from kcd->prev to kcd->cur.
* and move cur data to prev. */
-static void knife_add_single_cut(knifetool_opdata *kcd)
+static void knife_add_single_cut(KnifeTool_OpData *kcd)
{
KnifeEdge *kfe = new_knife_edge(kcd), *kfe2 = NULL, *kfe3 = NULL;
@@ -504,11 +540,11 @@ static int verge_linehit(const void *vlh1, const void *vlh2)
const BMEdgeHit *lh1 = vlh1, *lh2 = vlh2;
if (lh1->l < lh2->l) return -1;
- else if (lh1->l > lh2->l) return 1;
+ else if (lh1->l > lh2->l) return 1;
else return 0;
}
-static void knife_add_single_cut_through(knifetool_opdata *kcd, KnifeVert *v1, KnifeVert *v2, BMFace *f)
+static void knife_add_single_cut_through(KnifeTool_OpData *kcd, KnifeVert *v1, KnifeVert *v2, BMFace *f)
{
KnifeEdge *kfenew;
@@ -525,7 +561,7 @@ static void knife_add_single_cut_through(knifetool_opdata *kcd, KnifeVert *v1, K
knife_edge_append_face(kcd, kfenew, f);
}
-static void knife_get_vert_faces(knifetool_opdata *kcd, KnifeVert *kfv, BMFace *facef, ListBase *lst)
+static void knife_get_vert_faces(KnifeTool_OpData *kcd, KnifeVert *kfv, BMFace *facef, ListBase *lst)
{
BMIter bmiter;
BMFace *f;
@@ -534,21 +570,19 @@ static void knife_get_vert_faces(knifetool_opdata *kcd, KnifeVert *kfv, BMFace *
knife_append_list(kcd, lst, facef);
}
else if (kfv->v) {
- BMesh *bm = kcd->em->bm;
- BM_ITER(f, &bmiter, bm, BM_FACES_OF_VERT, kfv->v) {
+ BM_ITER_ELEM (f, &bmiter, kfv->v, BM_FACES_OF_VERT) {
knife_append_list(kcd, lst, f);
}
}
}
-static void knife_get_edge_faces(knifetool_opdata *kcd, KnifeEdge *kfe, ListBase *lst)
+static void knife_get_edge_faces(KnifeTool_OpData *kcd, KnifeEdge *kfe, ListBase *lst)
{
BMIter bmiter;
BMFace *f;
if (kfe->e) {
- BMesh *bm = kcd->em->bm;
- BM_ITER(f, &bmiter, bm, BM_FACES_OF_EDGE, kfe->e) {
+ BM_ITER_ELEM (f, &bmiter, kfe->e, BM_FACES_OF_EDGE) {
knife_append_list(kcd, lst, f);
}
}
@@ -557,7 +591,7 @@ static void knife_get_edge_faces(knifetool_opdata *kcd, KnifeEdge *kfe, ListBase
/* BMESH_TODO: add more functionality to cut-through:
* - cutting "in face" (e.g., holes) should cut in all faces, not just visible one
* - perhaps improve O(n^2) algorithm used here */
-static void knife_cut_through(knifetool_opdata *kcd)
+static void knife_cut_through(KnifeTool_OpData *kcd)
{
BMEdgeHit *lh, *lh2;
BMFace *f;
@@ -671,7 +705,7 @@ static void knife_cut_through(knifetool_opdata *kcd)
/* User has just left-clicked after the first time.
* Add all knife cuts implied by line from prev to cur.
* If that line crossed edges then kcd->linehits will be non-NULL. */
-static void knife_add_cut(knifetool_opdata *kcd)
+static void knife_add_cut(KnifeTool_OpData *kcd)
{
KnifePosData savcur = kcd->cur;
@@ -750,12 +784,12 @@ static void knife_add_cut(knifetool_opdata *kcd)
}
}
-static void knife_finish_cut(knifetool_opdata *UNUSED(kcd))
+static void knife_finish_cut(KnifeTool_OpData *UNUSED(kcd))
{
}
-static void knifetool_draw_angle_snapping(knifetool_opdata *kcd)
+static void knifetool_draw_angle_snapping(KnifeTool_OpData *kcd)
{
bglMats mats;
double u[3], u1[2], u2[2], v1[3], v2[3], dx, dy;
@@ -844,7 +878,7 @@ static void knifetool_draw_angle_snapping(knifetool_opdata *kcd)
mats.modelview, mats.projection, mats.viewport,
&v2[0], &v2[1], &v2[2]);
- glColor3f(0.6, 0.6, 0.6);
+ UI_ThemeColor(TH_TRANSFORM);
glLineWidth(2.0);
glBegin(GL_LINES);
glVertex3dv(v1);
@@ -852,12 +886,28 @@ static void knifetool_draw_angle_snapping(knifetool_opdata *kcd)
glEnd();
}
+static void knife_init_colors(KnifeColors *colors)
+{
+ /* possible BMESH_TODO: add explicit themes or calculate these by
+ * figuring out constrasting colors with grid / edges / verts
+ * a la UI_make_axis_color */
+ UI_GetThemeColor3ubv(TH_NURB_VLINE, colors->line);
+ UI_GetThemeColor3ubv(TH_NURB_ULINE, colors->edge);
+ UI_GetThemeColor3ubv(TH_HANDLE_SEL_VECT, colors->curpoint);
+ UI_GetThemeColor3ubv(TH_HANDLE_SEL_VECT, colors->curpoint_a);
+ colors->curpoint_a[3] = 102;
+ UI_GetThemeColor3ubv(TH_ACTIVE_SPLINE, colors->point);
+ UI_GetThemeColor3ubv(TH_ACTIVE_SPLINE, colors->point_a);
+ colors->point_a[3] = 102;
+}
+
/* modal loop selection drawing callback */
-static void knifetool_draw(const bContext *UNUSED(C), ARegion *UNUSED(ar), void *arg)
+static void knifetool_draw(const bContext *C, ARegion *UNUSED(ar), void *arg)
{
- knifetool_opdata *kcd = arg;
+ View3D *v3d = CTX_wm_view3d(C);
+ KnifeTool_OpData *kcd = arg;
- glDisable(GL_DEPTH_TEST);
+ if (v3d->zbuf) glDisable(GL_DEPTH_TEST);
glPolygonOffset(1.0f, 1.0f);
@@ -868,7 +918,8 @@ static void knifetool_draw(const bContext *UNUSED(C), ARegion *UNUSED(ar), void
if (kcd->angle_snapping != ANGLE_FREE)
knifetool_draw_angle_snapping(kcd);
- glColor3f(0.1, 0.1, 0.1);
+ glColor3ubv(kcd->colors.line);
+
glLineWidth(2.0);
glBegin(GL_LINES);
@@ -880,7 +931,7 @@ static void knifetool_draw(const bContext *UNUSED(C), ARegion *UNUSED(ar), void
}
if (kcd->cur.edge) {
- glColor3f(0.5, 0.3, 0.15);
+ glColor3ubv(kcd->colors.edge);
glLineWidth(2.0);
glBegin(GL_LINES);
@@ -891,7 +942,7 @@ static void knifetool_draw(const bContext *UNUSED(C), ARegion *UNUSED(ar), void
glLineWidth(1.0);
}
else if (kcd->cur.vert) {
- glColor3f(0.8, 0.2, 0.1);
+ glColor3ubv(kcd->colors.point);
glPointSize(11);
glBegin(GL_POINTS);
@@ -900,7 +951,7 @@ static void knifetool_draw(const bContext *UNUSED(C), ARegion *UNUSED(ar), void
}
if (kcd->cur.bmface) {
- glColor3f(0.1, 0.8, 0.05);
+ glColor3ubv(kcd->colors.curpoint);
glPointSize(9);
glBegin(GL_POINTS);
@@ -916,7 +967,7 @@ static void knifetool_draw(const bContext *UNUSED(C), ARegion *UNUSED(ar), void
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
/* draw any snapped verts first */
- glColor4f(0.8, 0.2, 0.1, 0.4);
+ glColor4ubv(kcd->colors.point_a);
glPointSize(11);
glBegin(GL_POINTS);
lh = kcd->linehits;
@@ -941,7 +992,7 @@ static void knifetool_draw(const bContext *UNUSED(C), ARegion *UNUSED(ar), void
glEnd();
/* now draw the rest */
- glColor4f(0.1, 0.8, 0.05, 0.4);
+ glColor4ubv(kcd->colors.curpoint_a);
glPointSize(7);
glBegin(GL_POINTS);
lh = kcd->linehits;
@@ -964,7 +1015,7 @@ static void knifetool_draw(const bContext *UNUSED(C), ARegion *UNUSED(ar), void
if (!kfe->draw)
continue;
- glColor3f(0.2, 0.2, 0.2);
+ glColor3ubv(kcd->colors.line);
glVertex3fv(kfe->v1->cageco);
glVertex3fv(kfe->v2->cageco);
@@ -986,7 +1037,7 @@ static void knifetool_draw(const bContext *UNUSED(C), ARegion *UNUSED(ar), void
if (!kfv->draw)
continue;
- glColor3f(0.6, 0.1, 0.2);
+ glColor3ubv(kcd->colors.point);
glVertex3fv(kfv->cageco);
}
@@ -995,7 +1046,8 @@ static void knifetool_draw(const bContext *UNUSED(C), ARegion *UNUSED(ar), void
}
glPopMatrix();
- glEnable(GL_DEPTH_TEST);
+
+ if (v3d->zbuf) glEnable(GL_DEPTH_TEST);
}
static float len_v3_tri_side_max(const float v1[3], const float v2[3], const float v3[3])
@@ -1007,7 +1059,7 @@ static float len_v3_tri_side_max(const float v1[3], const float v2[3], const flo
return MAX3(s1, s2, s3);
}
-static BMEdgeHit *knife_edge_tri_isect(knifetool_opdata *kcd, BMBVHTree *bmtree,
+static BMEdgeHit *knife_edge_tri_isect(KnifeTool_OpData *kcd, BMBVHTree *bmtree,
const float v1[3], const float v2[3], const float v3[3],
SmallHash *ehash, bglMats *mats, int *count)
{
@@ -1022,7 +1074,7 @@ static BMEdgeHit *knife_edge_tri_isect(knifetool_opdata *kcd, BMBVHTree *bmtree,
/* for comparing distances, error of intersection depends on triangle scale.
* need to scale down before squaring for accurate comparison */
- const float depsilon = 50 * FLT_EPSILON *len_v3_tri_side_max(v1, v2, v3);
+ const float depsilon = 50 * FLT_EPSILON * len_v3_tri_side_max(v1, v2, v3);
const float depsilon_squared = depsilon * depsilon;
copy_v3_v3(cos + 0, v1);
@@ -1149,7 +1201,7 @@ static BMEdgeHit *knife_edge_tri_isect(knifetool_opdata *kcd, BMBVHTree *bmtree,
return edges;
}
-static void knife_bgl_get_mats(knifetool_opdata *UNUSED(kcd), bglMats *mats)
+static void knife_bgl_get_mats(KnifeTool_OpData *UNUSED(kcd), bglMats *mats)
{
bgl_get_mats(mats);
//copy_m4_m4(mats->modelview, kcd->vc.rv3d->viewmat);
@@ -1157,7 +1209,7 @@ static void knife_bgl_get_mats(knifetool_opdata *UNUSED(kcd), bglMats *mats)
}
/* Finds visible (or all, if cutting through) edges that intersects the current screen drag line */
-static void knife_find_line_hits(knifetool_opdata *kcd)
+static void knife_find_line_hits(KnifeTool_OpData *kcd)
{
bglMats mats;
BMEdgeHit *e1, *e2;
@@ -1229,7 +1281,7 @@ static void knife_find_line_hits(knifetool_opdata *kcd)
BLI_smallhash_release(ehash);
}
-static void knife_input_ray_cast(knifetool_opdata *kcd, const int mval_i[2],
+static void knife_input_ray_cast(KnifeTool_OpData *kcd, const int mval_i[2],
float r_origin[3], float r_ray[3])
{
bglMats mats;
@@ -1260,7 +1312,7 @@ static void knife_input_ray_cast(knifetool_opdata *kcd, const int mval_i[2],
mul_m3_v3(imat, r_ray);
}
-static BMFace *knife_find_closest_face(knifetool_opdata *kcd, float co[3], float cageco[3], int *is_space)
+static BMFace *knife_find_closest_face(KnifeTool_OpData *kcd, float co[3], float cageco[3], int *is_space)
{
BMFace *f;
int dist = KMAXDIST;
@@ -1291,7 +1343,7 @@ static BMFace *knife_find_closest_face(knifetool_opdata *kcd, float co[3], float
/* find the 2d screen space density of vertices within a radius. used to scale snapping
* distance for picking edges/verts.*/
-static int knife_sample_screen_density(knifetool_opdata *kcd, float radius)
+static int knife_sample_screen_density(KnifeTool_OpData *kcd, float radius)
{
BMFace *f;
int is_space;
@@ -1344,7 +1396,7 @@ static int knife_sample_screen_density(knifetool_opdata *kcd, float radius)
/* returns snapping distance for edges/verts, scaled by the density of the
* surrounding mesh (in screen space)*/
-static float knife_snap_size(knifetool_opdata *kcd, float maxsize)
+static float knife_snap_size(KnifeTool_OpData *kcd, float maxsize)
{
float density = (float)knife_sample_screen_density(kcd, maxsize * 2.0f);
@@ -1354,7 +1406,7 @@ static float knife_snap_size(knifetool_opdata *kcd, float maxsize)
}
/* p is closest point on edge to the mouse cursor */
-static KnifeEdge *knife_find_closest_edge(knifetool_opdata *kcd, float p[3], float cagep[3], BMFace **fptr, int *is_space)
+static KnifeEdge *knife_find_closest_edge(KnifeTool_OpData *kcd, float p[3], float cagep[3], BMFace **fptr, int *is_space)
{
BMFace *f;
float co[3], cageco[3], sco[3], maxdist = knife_snap_size(kcd, kcd->ethresh);
@@ -1443,7 +1495,7 @@ static KnifeEdge *knife_find_closest_edge(knifetool_opdata *kcd, float p[3], flo
}
/* find a vertex near the mouse cursor, if it exists */
-static KnifeVert *knife_find_closest_vert(knifetool_opdata *kcd, float p[3], float cagep[3], BMFace **fptr,
+static KnifeVert *knife_find_closest_vert(KnifeTool_OpData *kcd, float p[3], float cagep[3], BMFace **fptr,
int *is_space)
{
BMFace *f;
@@ -1523,7 +1575,7 @@ static KnifeVert *knife_find_closest_vert(knifetool_opdata *kcd, float p[3], flo
return NULL;
}
-static void knife_snap_angle(knifetool_opdata *kcd)
+static void knife_snap_angle(KnifeTool_OpData *kcd)
{
int dx, dy;
float w, abs_tan;
@@ -1556,7 +1608,7 @@ static void knife_snap_angle(knifetool_opdata *kcd)
}
/* update active knife edge/vert pointers */
-static int knife_update_active(knifetool_opdata *kcd)
+static int knife_update_active(KnifeTool_OpData *kcd)
{
if (kcd->angle_snapping != ANGLE_FREE && kcd->mode == MODE_DRAGGING)
knife_snap_angle(kcd);
@@ -1610,11 +1662,11 @@ static void rnd_offset_co(float co[3], float scale)
int i;
for (i = 0; i < 3; i++) {
- co[i] += (BLI_drand() - 0.5) * scale;
+ co[i] += (BLI_frand() - 0.5) * scale;
}
}
-static void remerge_faces(knifetool_opdata *kcd)
+static void remerge_faces(KnifeTool_OpData *kcd)
{
BMesh *bm = kcd->em->bm;
SmallHash svisit, *visit = &svisit;
@@ -1635,7 +1687,7 @@ static void remerge_faces(knifetool_opdata *kcd)
BMO_op_finish(bm, &bmop);
BLI_smallhash_init(visit);
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
BMIter eiter;
BMEdge *e;
BMFace *f2;
@@ -1656,14 +1708,14 @@ static void remerge_faces(knifetool_opdata *kcd)
BLI_array_append(faces, f2);
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_FACE, f2) {
+ BM_ITER_ELEM (e, &eiter, f2, BM_EDGES_OF_FACE) {
BMIter fiter;
BMFace *f3;
if (BMO_elem_flag_test(bm, e, BOUNDARY))
continue;
- BM_ITER(f3, &fiter, bm, BM_FACES_OF_EDGE, e) {
+ BM_ITER_ELEM (f3, &fiter, e, BM_FACES_OF_EDGE) {
if (!BMO_elem_flag_test(bm, f3, FACE_NEW))
continue;
if (BLI_smallhash_haskey(visit, (intptr_t)f3))
@@ -1678,7 +1730,7 @@ static void remerge_faces(knifetool_opdata *kcd)
if (BLI_array_count(faces) > 0) {
idx = BM_elem_index_get(faces[0]);
- f2 = BM_faces_join(bm, faces, BLI_array_count(faces));
+ f2 = BM_faces_join(bm, faces, BLI_array_count(faces), TRUE);
if (f2) {
BMO_elem_flag_enable(bm, f2, FACE_NEW);
BM_elem_index_set(f2, idx); /* set_dirty! *//* BMESH_TODO, check if this is valid or not */
@@ -1696,8 +1748,9 @@ static void remerge_faces(knifetool_opdata *kcd)
}
/* use edgenet to fill faces. this is a bit annoying and convoluted.*/
-static void knifenet_fill_faces(knifetool_opdata *kcd)
+static void knifenet_fill_faces(KnifeTool_OpData *kcd)
{
+ ScanFillContext sf_ctx;
BMesh *bm = kcd->em->bm;
BMIter bmiter;
BLI_mempool_iter iter;
@@ -1717,14 +1770,14 @@ static void knifenet_fill_faces(knifetool_opdata *kcd)
/* BMESH_TODO this should be valid now, leaving here until we can ensure this - campbell */
i = 0;
- BM_ITER(f, &bmiter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &bmiter, bm, BM_FACES_OF_MESH) {
BM_elem_index_set(f, i); /* set_inline */
faces[i] = f;
i++;
}
bm->elem_index_dirty &= ~BM_FACE;
- BM_ITER(e, &bmiter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &bmiter, bm, BM_EDGES_OF_MESH) {
BMO_elem_flag_enable(bm, e, BOUNDARY);
}
@@ -1809,6 +1862,8 @@ static void knifenet_fill_faces(knifetool_opdata *kcd)
}
}
+ BLI_srand(0);
+
for (i = 0; i < totface; i++) {
SmallHash *hash = &shash;
ScanFillFace *efa;
@@ -1822,11 +1877,11 @@ static void knifenet_fill_faces(knifetool_opdata *kcd)
if (face_nets[i].first)
BMO_elem_flag_enable(bm, f, DEL);
- BLI_begin_edgefill();
+ BLI_begin_edgefill(&sf_ctx);
for (entry = face_nets[i].first; entry; entry = entry->next) {
if (!BLI_smallhash_haskey(hash, (intptr_t)entry->kfe->v1)) {
- eve = BLI_addfillvert(entry->kfe->v1->v->co);
+ eve = BLI_addfillvert(&sf_ctx, entry->kfe->v1->v->co);
eve->poly_nr = 0;
rnd_offset_co(eve->co, rndscale);
eve->tmp.p = entry->kfe->v1->v;
@@ -1834,7 +1889,7 @@ static void knifenet_fill_faces(knifetool_opdata *kcd)
}
if (!BLI_smallhash_haskey(hash, (intptr_t)entry->kfe->v2)) {
- eve = BLI_addfillvert(entry->kfe->v2->v->co);
+ eve = BLI_addfillvert(&sf_ctx, entry->kfe->v2->v->co);
eve->poly_nr = 0;
rnd_offset_co(eve->co, rndscale);
eve->tmp.p = entry->kfe->v2->v;
@@ -1856,24 +1911,24 @@ static void knifenet_fill_faces(knifetool_opdata *kcd)
if (eve->poly_nr > 1 && lasteve->poly_nr > 1) {
ScanFillEdge *eed;
- eed = BLI_addfilledge(lasteve, eve);
+ eed = BLI_addfilledge(&sf_ctx, lasteve, eve);
if (entry->kfe->oe)
- eed->f = FILLBOUNDARY; /* mark as original boundary edge */
+ eed->f = SF_EDGE_BOUNDARY; /* mark as original boundary edge */
BMO_elem_flag_disable(bm, entry->kfe->e->v1, DEL);
BMO_elem_flag_disable(bm, entry->kfe->e->v2, DEL);
}
else {
if (lasteve->poly_nr < 2)
- BLI_remlink(&fillvertbase, lasteve);
+ BLI_remlink(&sf_ctx.fillvertbase, lasteve);
if (eve->poly_nr < 2)
- BLI_remlink(&fillvertbase, eve);
+ BLI_remlink(&sf_ctx.fillvertbase, eve);
}
}
- BLI_edgefill(0);
+ BLI_edgefill(&sf_ctx, FALSE);
- for (efa = fillfacebase.first; efa; efa = efa->next) {
+ for (efa = sf_ctx.fillfacebase.first; efa; efa = efa->next) {
BMVert *v1 = efa->v3->tmp.p, *v2 = efa->v2->tmp.p, *v3 = efa->v1->tmp.p;
BMFace *f2;
BMLoop *l_iter;
@@ -1898,19 +1953,19 @@ static void knifenet_fill_faces(knifetool_opdata *kcd)
BMO_elem_flag_disable(bm, f2, DEL);
BM_elem_index_set(f2, i); /* set_dirty! *//* note, not 100% sure this is dirty? need to check */
- BM_face_normal_update(bm, f2);
+ BM_face_normal_update(f2);
if (dot_v3v3(f->no, f2->no) < 0.0f) {
BM_face_normal_flip(bm, f2);
}
}
- BLI_end_edgefill();
+ BLI_end_edgefill(&sf_ctx);
BLI_smallhash_release(hash);
}
bm->elem_index_dirty |= BM_FACE;
/* interpolate customdata */
- BM_ITER(f, &bmiter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &bmiter, bm, BM_FACES_OF_MESH) {
BMLoop *l1;
BMFace *f2;
BMIter liter1;
@@ -1925,7 +1980,7 @@ static void knifenet_fill_faces(knifetool_opdata *kcd)
BM_elem_attrs_copy(bm, bm, f2, f);
- BM_ITER(l1, &liter1, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l1, &liter1, f, BM_LOOPS_OF_FACE) {
BM_loop_interp_from_face(bm, l1, f2, TRUE, TRUE);
}
}
@@ -2000,7 +2055,7 @@ static void sort_by_frac_along(ListBase *lst, BMEdge *e)
/* The chain so far goes from an instantiated vertex to kfv (some may be reversed).
* If possible, complete the chain to another instantiated vertex and return 1, else return 0.
* The visited hash says which KnifeVert's have already been tried, not including kfv. */
-static int find_chain_search(knifetool_opdata *kcd, KnifeVert *kfv, ListBase *fedges, SmallHash *visited,
+static int find_chain_search(KnifeTool_OpData *kcd, KnifeVert *kfv, ListBase *fedges, SmallHash *visited,
ListBase *chain)
{
Ref *r;
@@ -2032,7 +2087,7 @@ static int find_chain_search(knifetool_opdata *kcd, KnifeVert *kfv, ListBase *fe
return FALSE;
}
-static ListBase *find_chain_from_vertex(knifetool_opdata *kcd, KnifeEdge *kfe, BMVert *v, ListBase *fedges)
+static ListBase *find_chain_from_vertex(KnifeTool_OpData *kcd, KnifeEdge *kfe, BMVert *v, ListBase *fedges)
{
SmallHash visited_, *visited = &visited_;
ListBase *ans;
@@ -2062,7 +2117,7 @@ static ListBase *find_chain_from_vertex(knifetool_opdata *kcd, KnifeEdge *kfe, B
/* Find a chain in fedges from one instantiated vertex to another.
* Remove the edges in the chain from fedges and return a separate list of the chain. */
-static ListBase *find_chain(knifetool_opdata *kcd, ListBase *fedges)
+static ListBase *find_chain(KnifeTool_OpData *kcd, ListBase *fedges)
{
Ref *r, *ref;
KnifeEdge *kfe;
@@ -2101,7 +2156,7 @@ static ListBase *find_chain(knifetool_opdata *kcd, ListBase *fedges)
/* The hole so far goes from kfvfirst to kfv (some may be reversed).
* If possible, complete the hole back to kfvfirst and return 1, else return 0.
* The visited hash says which KnifeVert's have already been tried, not including kfv or kfvfirst. */
-static int find_hole_search(knifetool_opdata *kcd, KnifeVert *kfvfirst, KnifeVert *kfv, ListBase *fedges,
+static int find_hole_search(KnifeTool_OpData *kcd, KnifeVert *kfvfirst, KnifeVert *kfv, ListBase *fedges,
SmallHash *visited, ListBase *hole)
{
Ref *r;
@@ -2136,7 +2191,7 @@ static int find_hole_search(knifetool_opdata *kcd, KnifeVert *kfvfirst, KnifeVer
/* Find a hole (simple cycle with no instantiated vertices).
* Remove the edges in the cycle from fedges and return a separate list of the cycle */
-static ListBase *find_hole(knifetool_opdata *kcd, ListBase *fedges)
+static ListBase *find_hole(KnifeTool_OpData *kcd, ListBase *fedges)
{
ListBase *ans;
Ref *r, *ref;
@@ -2179,7 +2234,7 @@ static ListBase *find_hole(knifetool_opdata *kcd, ListBase *fedges)
* If found, return TRUE and make a 'main chain' going across f which uses
* the two diagonals and one part of the hole, and a 'side chain' that
* completes the hole. */
-static int find_hole_chains(knifetool_opdata *kcd, ListBase *hole, BMFace *f, ListBase **mainchain,
+static int find_hole_chains(KnifeTool_OpData *kcd, ListBase *hole, BMFace *f, ListBase **mainchain,
ListBase **sidechain)
{
float **fco, **hco;
@@ -2232,7 +2287,7 @@ static int find_hole_chains(knifetool_opdata *kcd, ListBase *hole, BMFace *f, Li
}
j = 0;
- BM_ITER(v, &iter, kcd->em->bm, BM_VERTS_OF_FACE, f) {
+ BM_ITER_ELEM (v, &iter, f, BM_VERTS_OF_FACE) {
fco[j] = BLI_memarena_alloc(kcd->arena, 2 * sizeof(float));
fco[j][0] = v->co[ax];
fco[j][1] = v->co[ay];
@@ -2321,9 +2376,9 @@ static int find_hole_chains(knifetool_opdata *kcd, ListBase *hole, BMFace *f, Li
}
}
-static int knife_edge_in_face(knifetool_opdata *kcd, KnifeEdge *kfe, BMFace *f)
+static int knife_edge_in_face(KnifeTool_OpData *UNUSED(kcd), KnifeEdge *kfe, BMFace *f)
{
- BMesh *bm = kcd->em->bm;
+ /* BMesh *bm = kcd->em->bm; */ /* UNUSED */
BMVert *v1, *v2;
BMLoop *l1, *l2, *l;
float mid[3];
@@ -2339,7 +2394,7 @@ static int knife_edge_in_face(knifetool_opdata *kcd, KnifeEdge *kfe, BMFace *f)
l2 = NULL;
/* find out if v1 and v2, if set, are part of the face */
- BM_ITER(l, &iter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &iter, f, BM_LOOPS_OF_FACE) {
if (v1 && l->v == v1)
l1 = l;
if (v2 && l->v == v2)
@@ -2347,8 +2402,8 @@ static int knife_edge_in_face(knifetool_opdata *kcd, KnifeEdge *kfe, BMFace *f)
}
/* BM_face_point_inside_test uses best-axis projection so this isn't most accurate test... */
- v1inside = l1 ? 0 : BM_face_point_inside_test(bm, f, kfe->v1->co);
- v2inside = l2 ? 0 : BM_face_point_inside_test(bm, f, kfe->v2->co);
+ v1inside = l1 ? 0 : BM_face_point_inside_test(f, kfe->v1->co);
+ v2inside = l2 ? 0 : BM_face_point_inside_test(f, kfe->v2->co);
if ((l1 && v2inside) || (l2 && v1inside) || (v1inside && v2inside))
return TRUE;
if (l1 && l2) {
@@ -2357,14 +2412,14 @@ static int knife_edge_in_face(knifetool_opdata *kcd, KnifeEdge *kfe, BMFace *f)
* but it is expensive and maybe a bit buggy, so use a simple
* "is the midpoint in the face" test */
mid_v3_v3v3(mid, kfe->v1->co, kfe->v2->co);
- return BM_face_point_inside_test(bm, f, mid);
+ return BM_face_point_inside_test(f, mid);
}
return FALSE;
}
/* Split face f with KnifeEdges on chain. f remains as one side, the face formed is put in *newface.
* The new face will be on the left side of the chain as viewed from the normal-out side of f. */
-static void knife_make_chain_cut(knifetool_opdata *kcd, BMFace *f, ListBase *chain, BMFace **newface)
+static void knife_make_chain_cut(KnifeTool_OpData *kcd, BMFace *f, ListBase *chain, BMFace **newface)
{
BMesh *bm = kcd->em->bm;
KnifeEdge *kfe, *kfelast;
@@ -2400,7 +2455,8 @@ static void knife_make_chain_cut(knifetool_opdata *kcd, BMFace *f, ListBase *cha
/* Want to prevent creating two-sided polygons */
if (BM_edge_exists(v1, v2)) {
*newface = NULL;
- } else {
+ }
+ else {
*newface = BM_face_split(bm, f, v1, v2, &lnew, NULL, TRUE);
}
}
@@ -2412,16 +2468,26 @@ static void knife_make_chain_cut(knifetool_opdata *kcd, BMFace *f, ListBase *cha
/* Now go through lnew chain matching up chain kv's and assign real v's to them */
for (l_iter = lnew->next, i = 0; i < nco; l_iter = l_iter->next, i++) {
BLI_assert(equals_v3v3(cos[i], l_iter->v->co));
+ if (kcd->select_result) {
+ BM_edge_select_set(bm, l_iter->e, TRUE);
+ }
kverts[i]->v = l_iter->v;
}
}
}
+ /* the select chain above doesnt account for the first loop */
+ if (kcd->select_result) {
+ if (lnew) {
+ BM_edge_select_set(bm, lnew->e, TRUE);
+ }
+ }
+
BLI_array_fixedstack_free(cos);
BLI_array_fixedstack_free(kverts);
}
-static void knife_make_face_cuts(knifetool_opdata *kcd, BMFace *f, ListBase *kfedges)
+static void knife_make_face_cuts(KnifeTool_OpData *kcd, BMFace *f, ListBase *kfedges)
{
BMesh *bm = kcd->em->bm;
KnifeEdge *kfe;
@@ -2526,7 +2592,7 @@ static void knife_make_face_cuts(knifetool_opdata *kcd, BMFace *f, ListBase *kfe
}
/* Use the network of KnifeEdges and KnifeVerts accumulated to make real BMVerts and BMEdedges */
-static void knife_make_cuts(knifetool_opdata *kcd)
+static void knife_make_cuts(KnifeTool_OpData *kcd)
{
BMesh *bm = kcd->em->bm;
KnifeEdge *kfe;
@@ -2591,6 +2657,10 @@ static void knife_make_cuts(knifetool_opdata *kcd)
}
}
+ if (kcd->only_select) {
+ EDBM_flag_disable_all(kcd->em, BM_ELEM_SELECT);
+ }
+
/* do cuts for each face */
for (lst = BLI_smallhash_iternew(fhash, &hiter, (uintptr_t *)&f); lst;
lst = BLI_smallhash_iternext(&hiter, (uintptr_t *)&f))
@@ -2606,7 +2676,7 @@ static void knife_make_cuts(knifetool_opdata *kcd)
/* called on tool confirmation */
static void knifetool_finish(bContext *C, wmOperator *op)
{
- knifetool_opdata *kcd = op->customdata;
+ KnifeTool_OpData *kcd = op->customdata;
#if SCANFILL_CUTS
knifenet_fill_faces(kcd);
@@ -2631,15 +2701,10 @@ static int project_knife_view_clip(View3D *v3d, RegionView3D *rv3d, float *clips
return orth;
}
-static void knife_recalc_projmat(knifetool_opdata *kcd)
+static void knife_recalc_projmat(KnifeTool_OpData *kcd)
{
- ARegion *ar = CTX_wm_region(kcd->C);
-
- if (!ar)
- return;
-
invert_m4_m4(kcd->ob->imat, kcd->ob->obmat);
- ED_view3d_ob_project_mat_get(ar->regiondata, kcd->ob, kcd->projmat);
+ ED_view3d_ob_project_mat_get(kcd->ar->regiondata, kcd->ob, kcd->projmat);
//mult_m4_m4m4(kcd->projmat, kcd->vc.rv3d->winmat, kcd->vc.rv3d->viewmat);
kcd->is_ortho = project_knife_view_clip(kcd->vc.v3d, kcd->vc.rv3d,
@@ -2647,13 +2712,19 @@ static void knife_recalc_projmat(knifetool_opdata *kcd)
}
/* called when modal loop selection is done... */
-static void knifetool_exit(bContext *UNUSED(C), wmOperator *op)
+static void knifetool_exit(bContext *C, wmOperator *op)
{
- knifetool_opdata *kcd = op->customdata;
+ KnifeTool_OpData *kcd = op->customdata;
if (!kcd)
return;
+ WM_cursor_restore(CTX_wm_window(C));
+
+ /* remember setting for later */
+ RNA_boolean_set(op->ptr, "use_occlude_geometry", !kcd->cut_through);
+ WM_operator_last_properties_store(op); /* XXX - this is clunky but modal ops wont do this automatic */
+
/* deactivate the extra drawing stuff in 3D-View */
ED_region_draw_cb_exit(kcd->ar->type, kcd->draw_handle);
@@ -2694,23 +2765,34 @@ static void cage_mapped_verts_callback(void *userData, int index, const float co
}
}
+static void knifetool_update_mval(KnifeTool_OpData *kcd, int mval[2])
+{
+ knife_recalc_projmat(kcd);
+ kcd->vc.mval[0] = mval[0];
+ kcd->vc.mval[1] = mval[1];
+
+ if (knife_update_active(kcd)) {
+ ED_region_tag_redraw(kcd->ar);
+ }
+}
+
/* called when modal loop selection gets set up... */
static int knifetool_init(bContext *C, wmOperator *op, int UNUSED(do_cut))
{
- knifetool_opdata *kcd;
+ KnifeTool_OpData *kcd;
Scene *scene = CTX_data_scene(C);
Object *obedit = CTX_data_edit_object(C);
DerivedMesh *cage, *final;
SmallHash shash;
void *data[3];
+ const short only_select = RNA_boolean_get(op->ptr, "only_select");
/* alloc new customdata */
- kcd = op->customdata = MEM_callocN(sizeof(knifetool_opdata), "knifetool Modal Op Data");
+ kcd = op->customdata = MEM_callocN(sizeof(KnifeTool_OpData), "knifetool Modal Op Data");
/* assign the drawing handle for drawing preview line... */
kcd->ob = obedit;
kcd->ar = CTX_wm_region(C);
- kcd->C = C;
kcd->draw_handle = ED_region_draw_cb_activate(kcd->ar->type, knifetool_draw, kcd, REGION_DRAW_POST_VIEW);
em_setup_viewcontext(C, &kcd->vc);
@@ -2728,7 +2810,11 @@ static int knifetool_init(bContext *C, wmOperator *op, int UNUSED(do_cut))
cage->foreachMappedVert(cage, cage_mapped_verts_callback, data);
BLI_smallhash_release(&shash);
- kcd->bmbvh = BMBVH_NewBVH(kcd->em, BMBVH_USE_CAGE | BMBVH_RETURN_ORIG, scene, obedit);
+ kcd->bmbvh = BMBVH_NewBVH(kcd->em,
+ (BMBVH_USE_CAGE | BMBVH_RETURN_ORIG) |
+ (only_select ? BMBVH_RESPECT_SELECT : BMBVH_RESPECT_HIDDEN),
+ scene, obedit);
+
kcd->arena = BLI_memarena_new(1 << 15, "knife");
kcd->vthresh = KMAXDIST - 1;
kcd->ethresh = KMAXDIST;
@@ -2748,11 +2834,17 @@ static int knifetool_init(bContext *C, wmOperator *op, int UNUSED(do_cut))
kcd->kedgefacemap = BLI_ghash_new(BLI_ghashutil_ptrhash, BLI_ghashutil_ptrcmp, "knife origvertmap");
/* cut all the way through the mesh if use_occlude_geometry button not pushed */
- kcd->cut_through = !(kcd->vc.v3d->flag & V3D_ZBUF_SELECT);
+ kcd->cut_through = !RNA_boolean_get(op->ptr, "use_occlude_geometry");
+ kcd->only_select = only_select;
+
+ /* can't usefully select resulting edges in face mode */
+ kcd->select_result = (kcd->em->selectmode != SCE_SELECT_FACE);
knife_pos_data_clear(&kcd->cur);
knife_pos_data_clear(&kcd->prev);
+ knife_init_colors(&kcd->colors);
+
return 1;
}
@@ -2765,7 +2857,7 @@ static int knifetool_cancel(bContext *C, wmOperator *op)
static int knifetool_invoke(bContext *C, wmOperator *op, wmEvent *evt)
{
- knifetool_opdata *kcd;
+ KnifeTool_OpData *kcd;
view3d_operator_needs_opengl(C);
@@ -2773,15 +2865,13 @@ static int knifetool_invoke(bContext *C, wmOperator *op, wmEvent *evt)
return OPERATOR_CANCELLED;
/* add a modal handler for this operator - handles loop selection */
+ WM_cursor_modal(CTX_wm_window(C), BC_KNIFECURSOR);
WM_event_add_modal_handler(C, op);
kcd = op->customdata;
- kcd->vc.mval[0] = evt->mval[0];
- kcd->vc.mval[1] = evt->mval[1];
+ knifetool_update_mval(kcd, evt->mval);
- ED_area_headerprint(CTX_wm_area(C),
- "LMB: define cut lines, Return or RMB: confirm, E: new cut, Ctrl: midpoint snap, "
- "Shift: ignore snap, C: angle constrain, Turn off limit selection to visibile: cut through");
+ knife_update_header(C, kcd);
return OPERATOR_RUNNING_MODAL;
}
@@ -2795,7 +2885,8 @@ enum {
KNF_MODEL_IGNORE_SNAP_ON,
KNF_MODEL_IGNORE_SNAP_OFF,
KNF_MODAL_ADD_CUT,
- KNF_MODAL_ANGLE_SNAP_TOGGLE
+ KNF_MODAL_ANGLE_SNAP_TOGGLE,
+ KNF_MODAL_CUT_THROUGH_TOGGLE
};
wmKeyMap *knifetool_modal_keymap(wmKeyConfig *keyconf)
@@ -2808,6 +2899,7 @@ wmKeyMap *knifetool_modal_keymap(wmKeyConfig *keyconf)
{KNF_MODEL_IGNORE_SNAP_ON, "IGNORE_SNAP_ON", 0, "Ignore Snapping On", ""},
{KNF_MODEL_IGNORE_SNAP_OFF, "IGNORE_SNAP_OFF", 0, "Ignore Snapping Off", ""},
{KNF_MODAL_ANGLE_SNAP_TOGGLE, "ANGLE_SNAP_TOGGLE", 0, "Toggle Angle Snapping", ""},
+ {KNF_MODAL_CUT_THROUGH_TOGGLE, "CUT_THROUGH_TOGGLE", 0, "Toggle Cut Through", ""},
{KNF_MODAL_NEW_CUT, "NEW_CUT", 0, "End Current Cut", ""},
{KNF_MODAL_ADD_CUT, "ADD_CUT", 0, "Add Cut", ""},
{0, NULL, 0, NULL, NULL}};
@@ -2815,7 +2907,7 @@ wmKeyMap *knifetool_modal_keymap(wmKeyConfig *keyconf)
wmKeyMap *keymap = WM_modalkeymap_get(keyconf, "Knife Tool Modal Map");
/* this function is called for each spacetype, only needs to add map once */
- if (keymap)
+ if (keymap && keymap->modal_items)
return NULL;
keymap = WM_modalkeymap_add(keyconf, "Knife Tool Modal Map", modal_items);
@@ -2823,7 +2915,7 @@ wmKeyMap *knifetool_modal_keymap(wmKeyConfig *keyconf)
/* items for modal map */
WM_modalkeymap_add_item(keymap, ESCKEY, KM_PRESS, KM_ANY, 0, KNF_MODAL_CANCEL);
WM_modalkeymap_add_item(keymap, LEFTMOUSE, KM_PRESS, KM_ANY, 0, KNF_MODAL_ADD_CUT);
- WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_PRESS, KM_ANY, 0, KNF_MODAL_CONFIRM);
+ WM_modalkeymap_add_item(keymap, RIGHTMOUSE, KM_PRESS, KM_ANY, 0, KNF_MODAL_CANCEL);
WM_modalkeymap_add_item(keymap, RETKEY, KM_PRESS, KM_ANY, 0, KNF_MODAL_CONFIRM);
WM_modalkeymap_add_item(keymap, PADENTER, KM_PRESS, KM_ANY, 0, KNF_MODAL_CONFIRM);
WM_modalkeymap_add_item(keymap, EKEY, KM_PRESS, 0, 0, KNF_MODAL_NEW_CUT);
@@ -2839,8 +2931,9 @@ wmKeyMap *knifetool_modal_keymap(wmKeyConfig *keyconf)
WM_modalkeymap_add_item(keymap, RIGHTSHIFTKEY, KM_RELEASE, KM_ANY, 0, KNF_MODEL_IGNORE_SNAP_OFF);
WM_modalkeymap_add_item(keymap, CKEY, KM_PRESS, 0, 0, KNF_MODAL_ANGLE_SNAP_TOGGLE);
+ WM_modalkeymap_add_item(keymap, ZKEY, KM_PRESS, 0, 0, KNF_MODAL_CUT_THROUGH_TOGGLE);
- WM_modalkeymap_assign(keymap, "MESH_OT_knifetool");
+ WM_modalkeymap_assign(keymap, "MESH_OT_knife_tool");
return keymap;
}
@@ -2848,7 +2941,7 @@ wmKeyMap *knifetool_modal_keymap(wmKeyConfig *keyconf)
static int knifetool_modal(bContext *C, wmOperator *op, wmEvent *event)
{
Object *obedit;
- knifetool_opdata *kcd = op->customdata;
+ KnifeTool_OpData *kcd = op->customdata;
if (!C) {
return OPERATOR_FINISHED;
@@ -2891,6 +2984,7 @@ static int knifetool_modal(bContext *C, wmOperator *op, wmEvent *event)
knife_recalc_projmat(kcd);
knife_update_active(kcd);
+ knife_update_header(C, kcd);
ED_region_tag_redraw(kcd->ar);
break;
case KNF_MODAL_MIDPOINT_OFF:
@@ -2898,18 +2992,26 @@ static int knifetool_modal(bContext *C, wmOperator *op, wmEvent *event)
knife_recalc_projmat(kcd);
knife_update_active(kcd);
+ knife_update_header(C, kcd);
ED_region_tag_redraw(kcd->ar);
break;
case KNF_MODEL_IGNORE_SNAP_ON:
ED_region_tag_redraw(kcd->ar);
kcd->ignore_vert_snapping = kcd->ignore_edge_snapping = 1;
+ knife_update_header(C, kcd);
break;
case KNF_MODEL_IGNORE_SNAP_OFF:
ED_region_tag_redraw(kcd->ar);
kcd->ignore_vert_snapping = kcd->ignore_edge_snapping = 0;
+ knife_update_header(C, kcd);
break;
case KNF_MODAL_ANGLE_SNAP_TOGGLE:
kcd->angle_snapping = !kcd->angle_snapping;
+ knife_update_header(C, kcd);
+ break;
+ case KNF_MODAL_CUT_THROUGH_TOGGLE:
+ kcd->cut_through = !kcd->cut_through;
+ knife_update_header(C, kcd);
break;
case KNF_MODAL_NEW_CUT:
ED_region_tag_redraw(kcd->ar);
@@ -2955,12 +3057,7 @@ static int knifetool_modal(bContext *C, wmOperator *op, wmEvent *event)
case MOUSEMOVE: /* mouse moved somewhere to select another loop */
if (kcd->mode != MODE_PANNING) {
- knife_recalc_projmat(kcd);
- kcd->vc.mval[0] = event->mval[0];
- kcd->vc.mval[1] = event->mval[1];
-
- if (knife_update_active(kcd))
- ED_region_tag_redraw(kcd->ar);
+ knifetool_update_mval(kcd, event->mval);
}
break;
@@ -2971,11 +3068,11 @@ static int knifetool_modal(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
-void MESH_OT_knifetool(wmOperatorType *ot)
+void MESH_OT_knife_tool(wmOperatorType *ot)
{
/* description */
ot->name = "Knife Topology Tool";
- ot->idname = "MESH_OT_knifetool";
+ ot->idname = "MESH_OT_knife_tool";
ot->description = "Cut new topology";
/* callbacks */
@@ -2986,4 +3083,7 @@ void MESH_OT_knifetool(wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_BLOCKING;
+
+ RNA_def_boolean(ot->srna, "use_occlude_geometry", TRUE, "Occlude Geometry", "Only cut the front most geometry");
+ RNA_def_boolean(ot->srna, "only_select", FALSE, "Only Selected", "Only cut selected geometry");
}
diff --git a/source/blender/editors/mesh/editmesh_loopcut.c b/source/blender/editors/mesh/editmesh_loopcut.c
index 90f88abe141..45a975e5d52 100644
--- a/source/blender/editors/mesh/editmesh_loopcut.c
+++ b/source/blender/editors/mesh/editmesh_loopcut.c
@@ -134,7 +134,7 @@ static void ringsel_draw(const bContext *C, ARegion *UNUSED(ar), void *arg)
/* given two opposite edges in a face, finds the ordering of their vertices so
* that cut preview lines won't cross each other */
-static void edgering_find_order(BMEditMesh *em, BMEdge *lasteed, BMEdge *eed,
+static void edgering_find_order(BMEdge *lasteed, BMEdge *eed,
BMVert *lastv1, BMVert *v[2][2])
{
BMIter liter;
@@ -145,7 +145,7 @@ static void edgering_find_order(BMEditMesh *em, BMEdge *lasteed, BMEdge *eed,
/* find correct order for v[1] */
if (!(BM_edge_in_face(l->f, eed) && BM_edge_in_face(l->f, lasteed))) {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_LOOP, l) {
+ BM_ITER_ELEM (l, &liter, l, BM_LOOPS_OF_LOOP) {
if (BM_edge_in_face(l->f, eed) && BM_edge_in_face(l->f, lasteed))
break;
}
@@ -211,7 +211,7 @@ static void edgering_sel(tringselOpData *lcd, int previewlines, int select)
eed = BMW_begin(&walker, startedge);
for ( ; eed; eed = BMW_step(&walker)) {
- BM_elem_select_set(em->bm, eed, TRUE);
+ BM_edge_select_set(em->bm, eed, TRUE);
}
BMW_end(&walker);
@@ -237,7 +237,7 @@ static void edgering_sel(tringselOpData *lcd, int previewlines, int select)
lastv1 = lasteed->v1;
}
- edgering_find_order(em, lasteed, eed, lastv1, v);
+ edgering_find_order(lasteed, eed, lastv1, v);
lastv1 = v[0][0];
BLI_array_growitems(edges, previewlines);
@@ -263,7 +263,7 @@ static void edgering_sel(tringselOpData *lcd, int previewlines, int select)
v[1][0] = v[0][0];
v[1][1] = v[0][1];
- edgering_find_order(em, lasteed, startedge, lastv1, v);
+ edgering_find_order(lasteed, startedge, lastv1, v);
BLI_array_growitems(edges, previewlines);
diff --git a/source/blender/editors/mesh/editmesh_rip.c b/source/blender/editors/mesh/editmesh_rip.c
new file mode 100644
index 00000000000..37b12803962
--- /dev/null
+++ b/source/blender/editors/mesh/editmesh_rip.c
@@ -0,0 +1,757 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2004 by Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): Joseph Eagar
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/editors/mesh/editmesh_rip.c
+ * \ingroup edmesh
+ */
+
+#include "MEM_guardedalloc.h"
+
+#include "DNA_scene_types.h"
+#include "DNA_object_types.h"
+
+#include "RNA_define.h"
+#include "RNA_access.h"
+
+#include "BLI_math.h"
+#include "BLI_array.h"
+
+#include "BKE_context.h"
+#include "BKE_object.h"
+#include "BKE_report.h"
+#include "BKE_tessmesh.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "ED_mesh.h"
+#include "ED_screen.h"
+#include "ED_transform.h"
+#include "ED_view3d.h"
+
+#include "mesh_intern.h"
+
+/* helper to find edge for edge_rip */
+static float edbm_rip_rip_edgedist(ARegion *ar, float mat[][4], float *co1, float *co2, const float mvalf[2])
+{
+ float vec1[3], vec2[3];
+
+ ED_view3d_project_float_v2(ar, co1, vec1, mat);
+ ED_view3d_project_float_v2(ar, co2, vec2, mat);
+
+ return dist_to_line_segment_v2(mvalf, vec1, vec2);
+}
+
+static float edbm_rip_edge_side_measure(BMEdge *e, BMLoop *e_l,
+ ARegion *ar,
+ float projectMat[4][4], const float fmval[2])
+{
+ float cent[3] = {0, 0, 0}, mid[3];
+
+ float vec[2];
+ float fmval_tweak[2];
+ float e_v1_co[2], e_v2_co[2];
+ float score;
+
+ BMVert *v1_other;
+ BMVert *v2_other;
+
+ BLI_assert(BM_vert_in_edge(e, e_l->v));
+
+ /* method for calculating distance:
+ *
+ * for each edge: calculate face center, then made a vector
+ * from edge midpoint to face center. offset edge midpoint
+ * by a small amount along this vector. */
+
+ /* rather then the face center, get the middle of
+ * both edge verts connected to this one */
+ v1_other = BM_face_other_vert_loop(e_l->f, e->v2, e->v1)->v;
+ v2_other = BM_face_other_vert_loop(e_l->f, e->v1, e->v2)->v;
+ mid_v3_v3v3(cent, v1_other->co, v2_other->co);
+ mid_v3_v3v3(mid, e->v1->co, e->v2->co);
+
+ ED_view3d_project_float_v2(ar, cent, cent, projectMat);
+ ED_view3d_project_float_v2(ar, mid, mid, projectMat);
+
+ ED_view3d_project_float_v2(ar, e->v1->co, e_v1_co, projectMat);
+ ED_view3d_project_float_v2(ar, e->v2->co, e_v2_co, projectMat);
+
+ sub_v2_v2v2(vec, cent, mid);
+ normalize_v2(vec);
+ mul_v2_fl(vec, 0.01f);
+
+ /* rather then adding to both verts, subtract from the mouse */
+ sub_v2_v2v2(fmval_tweak, fmval, vec);
+
+ score = len_v2v2(e_v1_co, e_v2_co);
+
+ if (dist_to_line_segment_v2(fmval_tweak, e_v1_co, e_v2_co) >
+ dist_to_line_segment_v2(fmval, e_v1_co, e_v2_co))
+ {
+ return score;
+ }
+ else {
+ return -score;
+ }
+}
+
+
+/* - Advanced selection handling 'ripsel' functions ----- */
+
+/**
+ * How rip selection works
+ *
+ * Firstly - rip is basically edge split with side-selection & grab.
+ * Things would be much more simple if we didn't have to worry about side selection
+ *
+ * The method used for checking the side of selection is as follows...
+ * - First tag all rip-able edges.
+ * - Build a contiguous edge list by looping over tagged edges and following each ones tagged siblings in both
+ * directions.
+ * - The loops are not stored in an array, Instead both loops on either side of each edge has its index values set
+ * to count down from the last edge, this way, once we have the 'last' edge its very easy to walk down the
+ * connected edge loops.
+ * The reason for using loops like this is because when the edges are split we don't which face user gets the newly
+ * created edge (its as good as random so we cant assume new edges will be on once side).
+ * After splittingm, its very simple to walk along boundary loops since each only has one edge from a single side.
+ * - The end loop pairs are stored in an array however to support multiple edge-selection-islands, so you can rip
+ * multiple selections at once.
+ * - * Execute the split *
+ * - For each #EdgeLoopPair walk down both sides of the split using the loops and measure which is facing the mouse.
+ * - Deselect the edge loop facing away.
+ *
+ * Limitation!
+ * This currently works very poorly with intersecting edge islands (verts with more then 2 tagged edges)
+ * This is nice to but for now not essential.
+ *
+ * - campbell.
+ */
+
+
+#define IS_VISIT_POSSIBLE(e) (BM_edge_is_manifold(e) && BM_elem_flag_test(e, BM_ELEM_TAG))
+#define IS_VISIT_DONE(e) ((e)->l && (BM_elem_index_get((e)->l) != INVALID_UID))
+#define INVALID_UID INT_MIN
+
+/* mark, assign uid and step */
+static BMEdge *edbm_ripsel_edge_mark_step(BMVert *v, const int uid)
+{
+ BMIter iter;
+ BMEdge *e;
+ BM_ITER_ELEM (e, &iter, v, BM_EDGES_OF_VERT) {
+ if (IS_VISIT_POSSIBLE(e) && !IS_VISIT_DONE(e)) {
+ BMLoop *l_a, *l_b;
+
+ BM_edge_loop_pair(e, &l_a, &l_b); /* no need to check, we know this will be true */
+
+ /* so (IS_VISIT_DONE == TRUE) */
+ BM_elem_index_set(l_a, uid);
+ BM_elem_index_set(l_b, uid);
+
+ return e;
+ }
+ }
+ return NULL;
+}
+
+typedef struct EdgeLoopPair {
+ BMLoop *l_a;
+ BMLoop *l_b;
+} EdgeLoopPair;
+
+static EdgeLoopPair *edbm_ripsel_looptag_helper(BMesh *bm)
+{
+ BMIter fiter;
+ BMIter liter;
+
+ BMFace *f;
+ BMLoop *l;
+
+ int uid_start;
+ int uid_end;
+ int uid = bm->totedge; /* can start anywhere */
+
+ EdgeLoopPair *eloop_pairs = NULL;
+ BLI_array_declare(eloop_pairs);
+ EdgeLoopPair *lp;
+
+ /* initialize loops with dummy invalid index values */
+ BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
+ BM_elem_index_set(l, INVALID_UID);
+ }
+ }
+
+ /* set contiguous loops ordered 'uid' values for walking after split */
+ while (TRUE) {
+ int tot = 0;
+ BMIter eiter;
+ BMEdge *e_step;
+ BMVert *v_step;
+ BMEdge *e;
+ BMEdge *e_first;
+ BMEdge *e_last;
+
+ e_first = NULL;
+ BM_ITER_MESH (e, &eiter, bm, BM_EDGES_OF_MESH) {
+ if (IS_VISIT_POSSIBLE(e) && !IS_VISIT_DONE(e)) {
+ e_first = e;
+ break;
+ }
+ }
+
+ if (e_first == NULL) {
+ break;
+ }
+
+ /* initialize */
+ e_first = e;
+ v_step = e_first->v1;
+ e_step = NULL; /* quiet warning, will never remain this value */
+
+ uid_start = uid;
+ while ((e = edbm_ripsel_edge_mark_step(v_step, uid))) {
+ BM_elem_flag_disable(e, BM_ELEM_SMOOTH);
+ v_step = BM_edge_other_vert((e_step = e), v_step);
+ uid++; /* only different line */
+ tot++;
+ }
+
+ /* this edges loops have the highest uid's, store this to walk down later */
+ e_last = e_step;
+
+ /* always store the highest 'uid' edge for the stride */
+ uid_end = uid - 1;
+ uid = uid_start - 1;
+
+ /* initialize */
+ v_step = e_first->v1;
+
+ while ((e = edbm_ripsel_edge_mark_step(v_step, uid))) {
+ BM_elem_flag_disable(e, BM_ELEM_SMOOTH);
+ v_step = BM_edge_other_vert((e_step = e), v_step);
+ uid--; /* only different line */
+ tot++;
+ }
+
+ /* stride far enough not to _ever_ overlap range */
+ uid_start = uid;
+ uid = uid_end + bm->totedge;
+
+ BLI_array_growone(eloop_pairs);
+ lp = &eloop_pairs[BLI_array_count(eloop_pairs) - 1];
+ BM_edge_loop_pair(e_last, &lp->l_a, &lp->l_b); /* no need to check, we know this will be true */
+
+
+ BLI_assert(tot == uid_end - uid_start);
+
+#if 0
+ printf("%s: found contiguous edge loop of (%d)\n", __func__, uid_end - uid_start);
+#endif
+
+ }
+
+ /* null terminate */
+ BLI_array_growone(eloop_pairs);
+ lp = &eloop_pairs[BLI_array_count(eloop_pairs) - 1];
+ lp->l_a = lp->l_b = NULL;
+
+ return eloop_pairs;
+}
+
+
+/* - De-Select the worst rip-edge side -------------------------------- */
+
+
+static BMEdge *edbm_ripsel_edge_uid_step(BMEdge *e_orig, BMVert **v_prev)
+{
+ BMIter eiter;
+ BMEdge *e;
+ BMVert *v = BM_edge_other_vert(e_orig, *v_prev);
+ const int uid_cmp = BM_elem_index_get(e_orig->l) - 1;
+
+ BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) {
+ if (BM_elem_index_get(e->l) == uid_cmp) {
+ *v_prev = v;
+ return e;
+ }
+ }
+ return NULL;
+}
+
+static BMVert *edbm_ripsel_edloop_pair_start_vert(BMEdge *e)
+{
+ /* try step in a direction, if it fails we know do go the other way */
+ BMVert *v_test = e->v1;
+ return (edbm_ripsel_edge_uid_step(e, &v_test)) ? e->v1 : e->v2;
+}
+
+static void edbm_ripsel_deselect_helper(BMesh *bm, EdgeLoopPair *eloop_pairs,
+ ARegion *ar, float projectMat[4][4], float fmval[2])
+{
+ EdgeLoopPair *lp;
+
+ for (lp = eloop_pairs; lp->l_a; lp++) {
+ BMEdge *e;
+ BMVert *v_prev;
+
+ float score_a = 0.0f;
+ float score_b = 0.0f;
+
+ e = lp->l_a->e;
+ v_prev = edbm_ripsel_edloop_pair_start_vert(e);
+ for (; e; e = edbm_ripsel_edge_uid_step(e, &v_prev)) {
+ score_a += edbm_rip_edge_side_measure(e, e->l, ar, projectMat, fmval);
+ }
+ e = lp->l_b->e;
+ v_prev = edbm_ripsel_edloop_pair_start_vert(e);
+ for (; e; e = edbm_ripsel_edge_uid_step(e, &v_prev)) {
+ score_b += edbm_rip_edge_side_measure(e, e->l, ar, projectMat, fmval);
+ }
+
+ e = (score_a > score_b) ? lp->l_a->e : lp->l_b->e;
+ v_prev = edbm_ripsel_edloop_pair_start_vert(e);
+ for (; e; e = edbm_ripsel_edge_uid_step(e, &v_prev)) {
+ BM_edge_select_set(bm, e, FALSE);
+ }
+ }
+}
+/* --- end 'ripsel' selection handling code --- */
+
+static int edbm_rip_call_edgesplit(BMEditMesh *em, wmOperator *op)
+{
+ BMOperator bmop;
+
+ if (!EDBM_op_init(em, &bmop, op, "edgesplit edges=%he verts=%hv use_verts=%b",
+ BM_ELEM_TAG, BM_ELEM_SELECT, TRUE)) {
+ return FALSE;
+ }
+ BMO_op_exec(em->bm, &bmop);
+ if (!EDBM_op_finish(em, &bmop, op, TRUE)) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * This is the main vert ripping function (rip when one vertex is selected)
+ */
+static int edbm_rip_invoke__vert(bContext *C, wmOperator *op, wmEvent *event)
+{
+ Object *obedit = CTX_data_edit_object(C);
+ ARegion *ar = CTX_wm_region(C);
+ RegionView3D *rv3d = CTX_wm_region_view3d(C);
+ BMEditMesh *em = BMEdit_FromObject(obedit);
+ BMesh *bm = em->bm;
+ BMIter iter, liter;
+ BMLoop *l;
+ BMEdge *e, *e2;
+ BMVert *v, *ripvert = NULL;
+ int i;
+ float projectMat[4][4], fmval[3] = {event->mval[0], event->mval[1]};
+ float dist = FLT_MAX;
+ float d;
+
+ BMEditSelection ese;
+ int totboundary_edge = 0;
+
+ ED_view3d_ob_project_mat_get(rv3d, obedit, projectMat);
+
+ /* find selected vert - same some time and check history first */
+ if (EDBM_editselection_active_get(em, &ese) && ese.htype == BM_VERT) {
+ v = (BMVert *)ese.ele;
+ }
+ else {
+ ese.ele = NULL;
+
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
+ if (BM_elem_flag_test(v, BM_ELEM_SELECT))
+ break;
+ }
+ }
+
+ /* this should be impossible, but sanity checks are a good thing */
+ if (!v)
+ return OPERATOR_CANCELLED;
+
+ e2 = NULL;
+
+ if (v->e) {
+ /* find closest edge to mouse cursor */
+ BM_ITER_ELEM (e, &iter, v, BM_EDGES_OF_VERT) {
+ int is_boundary = BM_edge_is_boundary(e);
+ /* consider wire as boundary for this purpose,
+ * otherwise we can't a face away from a wire edge */
+ totboundary_edge += (is_boundary != 0 || BM_edge_is_wire(e));
+ if (!BM_elem_flag_test(e, BM_ELEM_HIDDEN)) {
+ if (is_boundary == FALSE && BM_edge_is_manifold(e)) {
+ d = edbm_rip_rip_edgedist(ar, projectMat, e->v1->co, e->v2->co, fmval);
+ if (d < dist) {
+ dist = d;
+ e2 = e;
+ }
+ }
+ }
+ }
+
+ }
+
+ /* should we go ahead with edge rip or do we need to do special case, split off vertex?:
+ * split off vertex if...
+ * - we cant find an edge - this means we are ripping a faces vert that is connected to other
+ * geometry only at the vertex.
+ * - the boundary edge total is greater then 2,
+ * in this case edge split _can_ work but we get far nicer results if we use this special case. */
+ if (totboundary_edge > 2) {
+ BMVert **vout;
+ int vout_len;
+
+ BM_vert_select_set(bm, v, FALSE);
+ bmesh_vert_separate(bm, v, &vout, &vout_len);
+
+ if (vout_len < 2) {
+ /* set selection back to avoid active-unselected vertex */
+ BM_vert_select_set(bm, v, TRUE);
+ /* should never happen */
+ BKE_report(op->reports, RPT_ERROR, "Error ripping vertex from faces");
+ return OPERATOR_CANCELLED;
+ }
+ else {
+ int vi_best = 0;
+
+ if (ese.ele) {
+ EDBM_editselection_remove(em, &ese.ele->head);
+ }
+
+ dist = FLT_MAX;
+
+ for (i = 0; i < vout_len; i++) {
+ BM_ITER_ELEM (l, &iter, vout[i], BM_LOOPS_OF_VERT) {
+ if (!BM_elem_flag_test(l->f, BM_ELEM_HIDDEN)) {
+ float l_mid_co[3];
+ BM_loop_face_tangent(l, l_mid_co);
+
+ /* scale to average of surrounding edge size, only needs to be approx */
+ mul_v3_fl(l_mid_co, (BM_edge_length_calc(l->e) + BM_edge_length_calc(l->prev->e)) / 2.0f);
+ add_v3_v3(l_mid_co, v->co);
+
+ d = edbm_rip_rip_edgedist(ar, projectMat, v->co, l_mid_co, fmval);
+
+ if (d < dist) {
+ dist = d;
+ vi_best = i;
+ }
+ }
+ }
+ }
+
+ /* select the vert from the best region */
+ v = vout[vi_best];
+ BM_vert_select_set(bm, v, TRUE);
+
+ if (ese.ele) {
+ EDBM_editselection_store(em, &v->head);
+ }
+
+ /* splice all others back together */
+ if (vout_len > 2) {
+
+ /* vout[0] == best
+ * vout[1] == glue
+ * vout[2+] == splice with glue
+ */
+ if (vi_best != 0) {
+ SWAP(BMVert *, vout[0], vout[vi_best]);
+ vi_best = 0;
+ }
+
+ for (i = 2; i < vout_len; i++) {
+ BM_vert_splice(bm, vout[i], vout[1]);
+ }
+ }
+
+ MEM_freeN(vout);
+
+ return OPERATOR_FINISHED;
+ }
+ }
+
+ if (!e2) {
+ BKE_report(op->reports, RPT_ERROR, "Selected vertex has no edge/face pairs attached");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* rip two adjacent edges */
+ if (BM_edge_is_boundary(e2) || BM_vert_face_count(v) == 2) {
+ l = e2->l;
+ ripvert = BM_face_vert_separate(bm, l->f, v);
+
+ BLI_assert(ripvert);
+ if (!ripvert) {
+ return OPERATOR_CANCELLED;
+ }
+ }
+ else if (BM_edge_is_manifold(e2)) {
+ l = e2->l;
+ e = BM_face_other_edge_loop(l->f, e2, v)->e;
+ BM_elem_flag_enable(e, BM_ELEM_TAG);
+
+ l = e2->l->radial_next;
+ e = BM_face_other_edge_loop(l->f, e2, v)->e;
+ BM_elem_flag_enable(e, BM_ELEM_TAG);
+ }
+
+ dist = FLT_MAX;
+
+ if (!edbm_rip_call_edgesplit(em, op)) {
+ return OPERATOR_CANCELLED;
+ }
+ else {
+ /* --- select which vert --- */
+ BMVert *v_best = NULL;
+ float l_prev_co[3], l_next_co[3], l_corner_co[3];
+ float scale;
+
+ dist = FLT_MAX;
+ BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) {
+ if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
+ /* disable by default, re-enable winner at end */
+ BM_vert_select_set(bm, v, FALSE);
+
+ BM_ITER_ELEM (l, &liter, v, BM_LOOPS_OF_VERT) {
+ /* calculate a point in the face, rather then calculate the middle,
+ * make a vector pointing between the 2 edges attached to this loop */
+ sub_v3_v3v3(l_prev_co, l->prev->v->co, l->v->co);
+ sub_v3_v3v3(l_next_co, l->next->v->co, l->v->co);
+
+ scale = normalize_v3(l_prev_co) + normalize_v3(l_next_co);
+ mul_v3_fl(l_prev_co, scale);
+ mul_v3_fl(l_next_co, scale);
+
+ add_v3_v3v3(l_corner_co, l_prev_co, l_next_co);
+ add_v3_v3(l_corner_co, l->v->co);
+
+ d = edbm_rip_rip_edgedist(ar, projectMat, l->v->co, l_corner_co, fmval);
+ if (d < dist) {
+ v_best = v;
+ dist = d;
+ }
+ }
+ }
+ }
+
+ if (v_best) {
+ BM_vert_select_set(bm, v_best, TRUE);
+ if (ese.ele) {
+ EDBM_editselection_store(em, &v_best->head);
+ }
+ }
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+/**
+ * This is the main edge ripping function
+ */
+static int edbm_rip_invoke__edge(bContext *C, wmOperator *op, wmEvent *event)
+{
+ Object *obedit = CTX_data_edit_object(C);
+ ARegion *ar = CTX_wm_region(C);
+ RegionView3D *rv3d = CTX_wm_region_view3d(C);
+ BMEditMesh *em = BMEdit_FromObject(obedit);
+ BMesh *bm = em->bm;
+ BMIter iter, eiter;
+ BMLoop *l;
+ BMEdge *e, *e2;
+ BMVert *v;
+ int i;
+ float projectMat[4][4], fmval[3] = {event->mval[0], event->mval[1]};
+
+ int totedge;
+ int all_minifold;
+
+ EdgeLoopPair *eloop_pairs;
+
+ ED_view3d_ob_project_mat_get(rv3d, obedit, projectMat);
+
+ /* important this runs on the original selection, before tempering with tagging */
+ eloop_pairs = edbm_ripsel_looptag_helper(bm);
+
+ /* expand edge selection */
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
+ e2 = NULL;
+ i = 0;
+ totedge = 0;
+ all_minifold = TRUE;
+ BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) {
+
+ if (!BM_edge_is_wire(e) &&
+ !BM_elem_flag_test(e, BM_ELEM_HIDDEN))
+ {
+ /* important to check selection rather then tag here
+ * else we get feedback loop */
+ if (BM_elem_flag_test(e, BM_ELEM_SELECT)) {
+ e2 = e;
+ i++;
+ }
+ totedge++;
+ }
+
+ /** #BM_vert_other_disk_edge has no hidden checks so don't check hidden here */
+ if ((all_minifold == TRUE) && (BM_edge_is_manifold(e) == FALSE)) {
+ all_minifold = FALSE;
+ }
+ }
+
+ /* single edge, extend */
+ if (i == 1 && e2->l) {
+ if ((totedge == 4) || (all_minifold == FALSE)) {
+ BMLoop *l_a = e2->l;
+ BMLoop *l_b = l_a->radial_next;
+
+ /* find the best face to follow, this wat the edge won't point away from
+ * the mouse when there are more then 4 (takes the shortest face fan around) */
+ l = (edbm_rip_edge_side_measure(e2, l_a, ar, projectMat, fmval) <
+ edbm_rip_edge_side_measure(e2, l_b, ar, projectMat, fmval)) ? l_a : l_b;
+
+ l = BM_face_other_edge_loop(l->f, e2, v);
+ l = l->radial_next;
+ l = BM_face_other_edge_loop(l->f, l->e, v);
+
+ if (l) {
+ BM_elem_flag_enable(l->e, BM_ELEM_TAG);
+ }
+ }
+ else {
+ e = BM_vert_other_disk_edge(v, e2);
+
+ if (e) {
+ BM_elem_flag_enable(e, BM_ELEM_TAG);
+ }
+ }
+ }
+ }
+
+ edbm_ripsel_deselect_helper(bm, eloop_pairs,
+ ar, projectMat, fmval);
+ MEM_freeN(eloop_pairs);
+
+ if (!edbm_rip_call_edgesplit(em, op)) {
+ return OPERATOR_CANCELLED;
+ }
+
+ return OPERATOR_FINISHED;
+}
+
+/* based on mouse cursor position, it defines how is being ripped */
+static int edbm_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
+{
+ Object *obedit = CTX_data_edit_object(C);
+ BMEditMesh *em = BMEdit_FromObject(obedit);
+ BMesh *bm = em->bm;
+ BMIter iter;
+ BMEdge *e;
+ int singlesel = (bm->totvertsel == 1 && bm->totedgesel == 0 && bm->totfacesel == 0);
+ const int totedge_orig = bm->totedge;
+ int ret;
+
+ /* running in face mode hardly makes sense, so convert to region loop and rip */
+ if (em->bm->totfacesel) {
+ /* highly nifty but hard to sypport since the operator can fail and we're left
+ * with modified selection */
+ // WM_operator_name_call(C, "MESH_OT_region_to_loop", WM_OP_INVOKE_DEFAULT, NULL);
+
+ BKE_report(op->reports, RPT_ERROR, "Can't rip selected faces");
+ return OPERATOR_CANCELLED;
+ }
+
+ /* note on selection:
+ * When calling edge split we operate on tagged edges rather then selected
+ * this is important because the edges to operate on are extended by one,
+ * but the selection is left alone.
+ *
+ * After calling edge split - the duplicated edges have the same selection state as the
+ * original, so all we do is de-select the far side from the mouse and we have a
+ * useful selection for grabbing.
+ */
+
+ /* BM_ELEM_SELECT --> BM_ELEM_TAG */
+ BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) {
+ BM_elem_flag_set(e, BM_ELEM_TAG, BM_elem_flag_test(e, BM_ELEM_SELECT));
+ }
+
+ /* split 2 main parts of this operator out into vertex and edge ripping */
+ if (singlesel) {
+ ret = edbm_rip_invoke__vert(C, op, event);
+ }
+ else {
+ ret = edbm_rip_invoke__edge(C, op, event);
+ }
+
+ if (ret == OPERATOR_CANCELLED) {
+ return OPERATOR_CANCELLED;
+ }
+
+ EDBM_selectmode_flush(em);
+
+ if (totedge_orig == bm->totedge) {
+ BKE_report(op->reports, RPT_ERROR, "No edges could be ripped");
+ return OPERATOR_CANCELLED;
+ }
+
+ BLI_assert(singlesel ? (bm->totvertsel > 0) : (bm->totedgesel > 0));
+
+ if (bm->totvertsel == 0) {
+ return OPERATOR_CANCELLED;
+ }
+
+ EDBM_update_generic(C, em, TRUE);
+
+ return OPERATOR_FINISHED;
+}
+
+
+void MESH_OT_rip(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Rip";
+ ot->idname = "MESH_OT_rip";
+ ot->description = "Disconnect vertex or edges from connected geometry";
+
+ /* api callbacks */
+ ot->invoke = edbm_rip_invoke;
+ ot->poll = EM_view3d_poll;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ /* to give to transform */
+ Transform_Properties(ot, P_PROPORTIONAL);
+ RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", "");
+}
diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c
index 0cf27c61381..228c29cb4a0 100644
--- a/source/blender/editors/mesh/editmesh_select.c
+++ b/source/blender/editors/mesh/editmesh_select.c
@@ -56,6 +56,7 @@
#include "ED_mesh.h"
#include "ED_screen.h"
+#include "ED_uvedit.h"
#include "ED_view3d.h"
#include "BIF_gl.h"
@@ -74,7 +75,7 @@ void EDBM_select_mirrored(Object *UNUSED(obedit), BMEditMesh *em, int extend)
BMVert *v1, *v2;
BMIter iter;
- BM_ITER(v1, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v1, &iter, em->bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(v1, BM_ELEM_SELECT) || BM_elem_flag_test(v1, BM_ELEM_HIDDEN)) {
BM_elem_flag_disable(v1, BM_ELEM_TAG);
}
@@ -88,13 +89,13 @@ void EDBM_select_mirrored(Object *UNUSED(obedit), BMEditMesh *em, int extend)
if (!extend)
EDBM_flag_disable_all(em, BM_ELEM_SELECT);
- BM_ITER(v1, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v1, &iter, em->bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(v1, BM_ELEM_TAG) || BM_elem_flag_test(v1, BM_ELEM_HIDDEN))
continue;
v2 = EDBM_verts_mirror_get(em, v1);
if (v2 && !BM_elem_flag_test(v2, BM_ELEM_HIDDEN)) {
- BM_elem_select_set(em->bm, v2, TRUE);
+ BM_vert_select_set(em->bm, v2, TRUE);
}
}
@@ -873,12 +874,12 @@ void MESH_OT_select_similar(wmOperatorType *ot)
/* identifiers */
ot->name = "Select Similar";
ot->idname = "MESH_OT_select_similar";
+ ot->description = "Select similar vertices, edges or faces by property types";
/* api callbacks */
ot->invoke = WM_menu_invoke;
ot->exec = edbm_select_similar_exec;
ot->poll = ED_operator_editmesh;
- ot->description = "Select similar vertices, edges or faces by property types";
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -976,11 +977,11 @@ void MESH_OT_loop_multi_select(wmOperatorType *ot)
/* identifiers */
ot->name = "Multi Select Loops";
ot->idname = "MESH_OT_loop_multi_select";
+ ot->description = "Select a loop of connected edges by connection type";
/* api callbacks */
ot->exec = edbm_loop_multiselect_exec;
ot->poll = ED_operator_editmesh;
- ot->description = "Select a loop of connected edges by connection type";
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -1081,12 +1082,11 @@ void MESH_OT_loop_select(wmOperatorType *ot)
/* identifiers */
ot->name = "Loop Select";
ot->idname = "MESH_OT_loop_select";
- ot->description = "Select a loop";
+ ot->description = "Select a loop of connected edges";
/* api callbacks */
ot->invoke = edbm_select_loop_invoke;
ot->poll = ED_operator_editmesh_region_view3d;
- ot->description = "Select a loop of connected edges";
/* flags */
ot->flag = OPTYPE_UNDO;
@@ -1168,7 +1168,7 @@ static void edgetag_context_set(BMEditMesh *em, Scene *scene, BMEdge *e, int val
switch (scene->toolsettings->edge_mode) {
case EDGE_MODE_SELECT:
- BM_elem_select_set(em->bm, e, val);
+ BM_edge_select_set(em->bm, e, val);
break;
case EDGE_MODE_TAG_SEAM:
BM_elem_flag_set(e, BM_ELEM_SEAM, val);
@@ -1228,9 +1228,7 @@ static int edgetag_shortest_path(Scene *scene, BMEditMesh *em, BMEdge *source, B
/* note, would pass BM_EDGE except we are looping over all edges anyway */
BM_mesh_elem_index_ensure(em->bm, BM_VERT /* | BM_EDGE */);
- BM_ITER(e, &iter, em->bm, BM_EDGES_OF_MESH, NULL)
- {
- e->oflags[0].f = 0; /* XXX, whats this for, BMESH_TODO, double check if this is needed */
+ BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(e, BM_ELEM_HIDDEN)) {
BLI_smallhash_insert(&visithash, (uintptr_t)e, NULL);
}
@@ -1248,7 +1246,7 @@ static int edgetag_shortest_path(Scene *scene, BMEditMesh *em, BMEdge *source, B
cost = MEM_mallocN(sizeof(*cost) * totedge, "SeamPathCost");
/* count edges, compute adjacent edges offsets and fill adjacent */
- BM_ITER(e, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) {
nedges[BM_elem_index_get(e->v1) + 1]++;
nedges[BM_elem_index_get(e->v2) + 1]++;
}
@@ -1261,7 +1259,7 @@ static int edgetag_shortest_path(Scene *scene, BMEditMesh *em, BMEdge *source, B
nedges[0] = nedges[1] = 0;
i = 0;
- BM_ITER(e, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) {
edges[nedges[BM_elem_index_get(e->v1) + 1]++] = i;
edges[nedges[BM_elem_index_get(e->v2) + 1]++] = i;
@@ -1284,15 +1282,6 @@ static int edgetag_shortest_path(Scene *scene, BMEditMesh *em, BMEdge *source, B
* by the shortest path found so far to the edge.
*/
-#if 0 /* UNUSED */ /* this block does nothing, not sure why its here? - campbell */
- for (i = 0; i < totvert; i++) {
- int start = nedges[i], end = nedges[i + 1], cur;
- for (cur = start; cur < end; cur++) {
- BMEdge *e = EDBM_edge_at_index(em, edges[cur]);
- }
- }
-#endif
-
/* regular dijkstra shortest path, but over edges instead of vertices */
heap = BLI_heap_new();
BLI_heap_insert(heap, 0.0f, SET_INT_IN_POINTER(BM_elem_index_get(source)));
@@ -1406,6 +1395,7 @@ static void mouse_mesh_shortest_path(bContext *C, int mval[2])
case EDGE_MODE_TAG_SEAM:
me->drawflag |= ME_DRAWSEAMS;
+ ED_uvedit_live_unwrap(vc.scene, vc.obedit);
break;
case EDGE_MODE_TAG_SHARP:
me->drawflag |= ME_DRAWSHARP;
@@ -1441,11 +1431,11 @@ void MESH_OT_select_shortest_path(wmOperatorType *ot)
/* identifiers */
ot->name = "Shortest Path Select";
ot->idname = "MESH_OT_select_shortest_path";
+ ot->description = "Select shortest path between two selections";
/* api callbacks */
ot->invoke = edbm_shortest_path_select_invoke;
ot->poll = ED_operator_editmesh;
- ot->description = "Select shortest path between two selections";
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -1479,31 +1469,31 @@ int mouse_mesh(bContext *C, const int mval[2], short extend)
if (!BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
EDBM_editselection_store(vc.em, &efa->head);
- BM_elem_select_set(vc.em->bm, efa, TRUE);
+ BM_face_select_set(vc.em->bm, efa, TRUE);
}
else if (extend) {
EDBM_editselection_remove(vc.em, &efa->head);
- BM_elem_select_set(vc.em->bm, efa, FALSE);
+ BM_face_select_set(vc.em->bm, efa, FALSE);
}
}
else if (eed) {
if (!BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
EDBM_editselection_store(vc.em, &eed->head);
- BM_elem_select_set(vc.em->bm, eed, TRUE);
+ BM_edge_select_set(vc.em->bm, eed, TRUE);
}
else if (extend) {
EDBM_editselection_remove(vc.em, &eed->head);
- BM_elem_select_set(vc.em->bm, eed, FALSE);
+ BM_edge_select_set(vc.em->bm, eed, FALSE);
}
}
else if (eve) {
if (!BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
EDBM_editselection_store(vc.em, &eve->head);
- BM_elem_select_set(vc.em->bm, eve, TRUE);
+ BM_vert_select_set(vc.em->bm, eve, TRUE);
}
else if (extend) {
EDBM_editselection_remove(vc.em, &eve->head);
- BM_elem_select_set(vc.em->bm, eve, FALSE);
+ BM_vert_select_set(vc.em->bm, eve, FALSE);
}
}
@@ -1574,12 +1564,12 @@ void EDBM_selectmode_set(BMEditMesh *em)
else if (em->selectmode & SCE_SELECT_EDGE) {
/* deselect vertices, and select again based on edge select */
eve = BM_iter_new(&iter, em->bm, BM_VERTS_OF_MESH, NULL);
- for (; eve; eve = BM_iter_step(&iter)) BM_elem_select_set(em->bm, eve, FALSE);
+ for (; eve; eve = BM_iter_step(&iter)) BM_vert_select_set(em->bm, eve, FALSE);
eed = BM_iter_new(&iter, em->bm, BM_EDGES_OF_MESH, NULL);
for (; eed; eed = BM_iter_step(&iter)) {
if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
- BM_elem_select_set(em->bm, eed, TRUE);
+ BM_edge_select_set(em->bm, eed, TRUE);
}
}
@@ -1589,12 +1579,12 @@ void EDBM_selectmode_set(BMEditMesh *em)
else if (em->selectmode & SCE_SELECT_FACE) {
/* deselect eges, and select again based on face select */
eed = BM_iter_new(&iter, em->bm, BM_EDGES_OF_MESH, NULL);
- for (; eed; eed = BM_iter_step(&iter)) BM_elem_select_set(em->bm, eed, FALSE);
+ for (; eed; eed = BM_iter_step(&iter)) BM_edge_select_set(em->bm, eed, FALSE);
efa = BM_iter_new(&iter, em->bm, BM_FACES_OF_MESH, NULL);
for (; efa; efa = BM_iter_step(&iter)) {
if (BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
- BM_elem_select_set(em->bm, efa, TRUE);
+ BM_face_select_set(em->bm, efa, TRUE);
}
}
}
@@ -1615,7 +1605,7 @@ void EDBM_selectmode_convert(BMEditMesh *em, short oldmode, short selectmode)
if ((BM_elem_flag_test(eed->v1, BM_ELEM_SELECT) ||
BM_elem_flag_test(eed->v2, BM_ELEM_SELECT)))
{
- BM_elem_select_set(em->bm, eed, TRUE);
+ BM_edge_select_set(em->bm, eed, TRUE);
}
}
}
@@ -1629,7 +1619,7 @@ void EDBM_selectmode_convert(BMEditMesh *em, short oldmode, short selectmode)
l = BM_iter_new(&liter, em->bm, BM_LOOPS_OF_FACE, efa);
for (; l; l = BM_iter_step(&liter)) {
if (BM_elem_flag_test(l->v, BM_ELEM_SELECT)) {
- BM_elem_select_set(em->bm, efa, TRUE);
+ BM_face_select_set(em->bm, efa, TRUE);
break;
}
}
@@ -1648,7 +1638,7 @@ void EDBM_selectmode_convert(BMEditMesh *em, short oldmode, short selectmode)
l = BM_iter_new(&liter, em->bm, BM_LOOPS_OF_FACE, efa);
for (; l; l = BM_iter_step(&liter)) {
if (BM_elem_flag_test(l->v, BM_ELEM_SELECT)) {
- BM_elem_select_set(em->bm, efa, TRUE);
+ BM_face_select_set(em->bm, efa, TRUE);
break;
}
}
@@ -1663,11 +1653,11 @@ void EDBM_deselect_by_material(BMEditMesh *em, const short index, const short se
BMIter iter;
BMFace *efa;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN))
continue;
if (efa->mat_nr == index) {
- BM_elem_select_set(em->bm, efa, select);
+ BM_face_select_set(em->bm, efa, select);
}
}
}
@@ -1688,24 +1678,24 @@ void EDBM_select_swap(BMEditMesh *em) /* exported for UV */
BMFace *efa;
if (em->bm->selectmode & SCE_SELECT_VERTEX) {
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_HIDDEN))
continue;
- BM_elem_select_set(em->bm, eve, !BM_elem_flag_test(eve, BM_ELEM_SELECT));
+ BM_vert_select_set(em->bm, eve, !BM_elem_flag_test(eve, BM_ELEM_SELECT));
}
}
else if (em->selectmode & SCE_SELECT_EDGE) {
- BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(eed, BM_ELEM_HIDDEN))
continue;
- BM_elem_select_set(em->bm, eed, !BM_elem_flag_test(eed, BM_ELEM_SELECT));
+ BM_edge_select_set(em->bm, eed, !BM_elem_flag_test(eed, BM_ELEM_SELECT));
}
}
else {
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN))
continue;
- BM_elem_select_set(em->bm, efa, !BM_elem_flag_test(efa, BM_ELEM_SELECT));
+ BM_face_select_set(em->bm, efa, !BM_elem_flag_test(efa, BM_ELEM_SELECT));
}
}
@@ -1722,13 +1712,13 @@ int EDBM_select_interior_faces(BMEditMesh *em)
int ok;
int change = FALSE;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN))
continue;
ok = TRUE;
- BM_ITER(eed, &eiter, bm, BM_EDGES_OF_FACE, efa) {
+ BM_ITER_ELEM (eed, &eiter, efa, BM_EDGES_OF_FACE) {
if (BM_edge_face_count(eed) < 3) {
ok = FALSE;
break;
@@ -1736,7 +1726,7 @@ int EDBM_select_interior_faces(BMEditMesh *em)
}
if (ok) {
- BM_elem_select_set(bm, efa, TRUE);
+ BM_face_select_set(bm, efa, TRUE);
change = TRUE;
}
}
@@ -1805,7 +1795,7 @@ static int edbm_select_linked_pick_invoke(bContext *C, wmOperator *op, wmEvent *
if (limit) {
/* hflag no-seam --> bmo-tag */
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
/* BMESH_TODO, don't use 'BM_ELEM_SELECT' here, its a HFLAG only! */
BMO_elem_flag_set(bm, e, BM_ELEM_SELECT, !BM_elem_flag_test(e, BM_ELEM_SEAM));
}
@@ -1819,7 +1809,7 @@ static int edbm_select_linked_pick_invoke(bContext *C, wmOperator *op, wmEvent *
e = BMW_begin(&walker, efa);
for (; efa; efa = BMW_step(&walker)) {
- BM_elem_select_set(bm, efa, sel);
+ BM_face_select_set(bm, efa, sel);
}
BMW_end(&walker);
}
@@ -1841,7 +1831,7 @@ static int edbm_select_linked_pick_invoke(bContext *C, wmOperator *op, wmEvent *
e = BMW_begin(&walker, eed->v1);
for (; e; e = BMW_step(&walker)) {
- BM_elem_select_set(bm, e, sel);
+ BM_edge_select_set(bm, e, sel);
}
BMW_end(&walker);
@@ -1857,11 +1847,11 @@ void MESH_OT_select_linked_pick(wmOperatorType *ot)
/* identifiers */
ot->name = "Select Linked";
ot->idname = "MESH_OT_select_linked_pick";
+ ot->description = "(De)select all vertices linked to the edge under the mouse cursor";
/* api callbacks */
ot->invoke = edbm_select_linked_pick_invoke;
ot->poll = ED_operator_editmesh;
- ot->description = "(De)select all vertices linked to the edge under the mouse cursor";
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -1890,13 +1880,13 @@ static int edbm_select_linked_exec(bContext *C, wmOperator *op)
if (em->selectmode == SCE_SELECT_FACE) {
BMFace *efa;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
BM_elem_flag_set(efa, BM_ELEM_TAG, (BM_elem_flag_test(efa, BM_ELEM_SELECT) &&
!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)));
}
if (limit) {
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
/* BMESH_TODO, don't use 'BM_ELEM_SELECT' here, its a HFLAG only! */
BMO_elem_flag_set(bm, e, BM_ELEM_SELECT, !BM_elem_flag_test(e, BM_ELEM_SEAM));
}
@@ -1904,21 +1894,21 @@ static int edbm_select_linked_exec(bContext *C, wmOperator *op)
BMW_init(&walker, bm, BMW_ISLAND,
BMW_MASK_NOP, limit ? BM_ELEM_SELECT : BMW_MASK_NOP, BMW_MASK_NOP,
- BMW_FLAG_NOP, /* BMESH_TODO - should be BMW_FLAG_TEST_HIDDEN ? */
+ BMW_FLAG_TEST_HIDDEN,
BMW_NIL_LAY);
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(efa, BM_ELEM_TAG)) {
e = BMW_begin(&walker, efa);
for (; efa; efa = BMW_step(&walker)) {
- BM_elem_select_set(bm, efa, TRUE);
+ BM_face_select_set(bm, efa, TRUE);
}
}
}
BMW_end(&walker);
}
else {
- BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
BM_elem_flag_enable(v, BM_ELEM_TAG);
}
@@ -1932,12 +1922,12 @@ static int edbm_select_linked_exec(bContext *C, wmOperator *op)
BMW_FLAG_TEST_HIDDEN,
BMW_NIL_LAY);
- BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(v, BM_ELEM_TAG)) {
e = BMW_begin(&walker, v);
for (; e; e = BMW_step(&walker)) {
- BM_elem_select_set(em->bm, e->v1, TRUE);
- BM_elem_select_set(em->bm, e->v2, TRUE);
+ BM_vert_select_set(em->bm, e->v1, TRUE);
+ BM_vert_select_set(em->bm, e->v2, TRUE);
}
}
}
@@ -1955,11 +1945,11 @@ void MESH_OT_select_linked(wmOperatorType *ot)
/* identifiers */
ot->name = "Select Linked All";
ot->idname = "MESH_OT_select_linked";
+ ot->description = "Select all vertices linked to the active mesh";
/* api callbacks */
ot->exec = edbm_select_linked_exec;
ot->poll = ED_operator_editmesh;
- ot->description = "Select all vertices linked to the active mesh";
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -2064,8 +2054,7 @@ static void walker_deselect_nth(BMEditMesh *em, int nth, int offset, BMHeader *h
/* Walker restrictions uses BMO flags, not header flags,
* so transfer BM_ELEM_SELECT from HFlags onto a BMO flag layer. */
BMO_push(bm, NULL);
- BM_ITER(ele, &iter, bm, itertype, NULL)
- {
+ BM_ITER_MESH (ele, &iter, bm, itertype) {
if (BM_elem_flag_test(ele, BM_ELEM_SELECT)) {
/* BMESH_TODO, don't use 'BM_ELEM_SELECT' here, its a HFLAG only! */
BMO_elem_flag_enable(bm, (BMElemF *)ele, BM_ELEM_SELECT);
@@ -2075,7 +2064,7 @@ static void walker_deselect_nth(BMEditMesh *em, int nth, int offset, BMHeader *h
/* Walk over selected elements starting at active */
BMW_init(&walker, bm, walktype,
mask_vert, mask_edge, mask_face,
- BMW_FLAG_NOP, /* BMESH_TODO - should be BMW_FLAG_TEST_HIDDEN ? */
+ BMW_FLAG_NOP, /* don't use BMW_FLAG_TEST_HIDDEN here since we want to desel all */
BMW_NIL_LAY);
BLI_assert(walker.order == BMW_BREADTH_FIRST);
@@ -2123,7 +2112,7 @@ static void deselect_nth_active(BMEditMesh *em, BMVert **r_eve, BMEdge **r_eed,
}
if (em->selectmode & SCE_SELECT_VERTEX) {
- BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
*r_eve = v;
return;
@@ -2131,7 +2120,7 @@ static void deselect_nth_active(BMEditMesh *em, BMVert **r_eve, BMEdge **r_eed,
}
}
else if (em->selectmode & SCE_SELECT_EDGE) {
- BM_ITER(e, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(e, BM_ELEM_SELECT)) {
*r_eed = e;
return;
@@ -2195,8 +2184,8 @@ void MESH_OT_select_nth(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Select Nth";
- ot->description = "";
ot->idname = "MESH_OT_select_nth";
+ ot->description = "Select every Nth element starting from a selected vertex, edge or face";
/* api callbacks */
ot->exec = edbm_select_nth_exec;
@@ -2244,7 +2233,7 @@ static int edbm_select_sharp_edges_exec(bContext *C, wmOperator *op)
sharp = DEG2RADF(sharp);
- BM_ITER(e, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(e, BM_ELEM_HIDDEN) || !e->l)
continue;
@@ -2258,7 +2247,7 @@ static int edbm_select_sharp_edges_exec(bContext *C, wmOperator *op)
angle = angle_normalized_v3v3(l1->f->no, l2->f->no);
if (fabsf(angle) > sharp) {
- BM_elem_select_set(em->bm, e, TRUE);
+ BM_edge_select_set(em->bm, e, TRUE);
}
}
@@ -2299,11 +2288,11 @@ static int edbm_select_linked_flat_faces_exec(bContext *C, wmOperator *op)
sharp = (sharp * M_PI) / 180.0;
- BM_ITER(f, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) {
BM_elem_flag_disable(f, BM_ELEM_TAG);
}
- BM_ITER(f, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(f, BM_ELEM_HIDDEN) || !BM_elem_flag_test(f, BM_ELEM_SELECT) || BM_elem_flag_test(f, BM_ELEM_TAG))
continue;
@@ -2317,12 +2306,12 @@ static int edbm_select_linked_flat_faces_exec(bContext *C, wmOperator *op)
f = stack[i - 1];
i--;
- BM_elem_select_set(em->bm, f, TRUE);
+ BM_face_select_set(em->bm, f, TRUE);
BM_elem_flag_enable(f, BM_ELEM_TAG);
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, f) {
- BM_ITER(l2, &liter2, em->bm, BM_LOOPS_OF_LOOP, l) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
+ BM_ITER_ELEM (l2, &liter2, l, BM_LOOPS_OF_LOOP) {
float angle;
if (BM_elem_flag_test(l2->f, BM_ELEM_TAG) || BM_elem_flag_test(l2->f, BM_ELEM_HIDDEN))
@@ -2384,15 +2373,15 @@ static int edbm_select_non_manifold_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(v, BM_ELEM_HIDDEN) && !BM_vert_is_manifold(v)) {
- BM_elem_select_set(em->bm, v, TRUE);
+ BM_vert_select_set(em->bm, v, TRUE);
}
}
- BM_ITER(e, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
- if (!BM_elem_flag_test(e, BM_ELEM_HIDDEN) && BM_edge_face_count(e) != 2) {
- BM_elem_select_set(em->bm, e, TRUE);
+ BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) {
+ if (!BM_elem_flag_test(e, BM_ELEM_HIDDEN) && !BM_edge_is_manifold(e)) {
+ BM_edge_select_set(em->bm, e, TRUE);
}
}
@@ -2432,25 +2421,25 @@ static int edbm_select_random_exec(bContext *C, wmOperator *op)
EDBM_flag_disable_all(em, BM_ELEM_SELECT);
if (em->selectmode & SCE_SELECT_VERTEX) {
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN) && BLI_frand() < randfac) {
- BM_elem_select_set(em->bm, eve, TRUE);
+ BM_vert_select_set(em->bm, eve, TRUE);
}
}
EDBM_selectmode_flush(em);
}
else if (em->selectmode & SCE_SELECT_EDGE) {
- BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN) && BLI_frand() < randfac) {
- BM_elem_select_set(em->bm, eed, TRUE);
+ BM_edge_select_set(em->bm, eed, TRUE);
}
}
EDBM_selectmode_flush(em);
}
else {
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN) && BLI_frand() < randfac) {
- BM_elem_select_set(em->bm, efa, TRUE);
+ BM_face_select_set(em->bm, efa, TRUE);
}
}
EDBM_selectmode_flush(em);
@@ -2490,25 +2479,25 @@ static int edbm_select_next_loop_exec(bContext *C, wmOperator *UNUSED(op))
BMVert *v;
BMIter iter;
- BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) {
BM_elem_flag_disable(v, BM_ELEM_TAG);
}
- BM_ITER(f, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) {
BMLoop *l;
BMIter liter;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
if (BM_elem_flag_test(l->v, BM_ELEM_SELECT)) {
BM_elem_flag_enable(l->next->v, BM_ELEM_TAG);
- BM_elem_select_set(em->bm, l->v, FALSE);
+ BM_vert_select_set(em->bm, l->v, FALSE);
}
}
}
- BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(v, BM_ELEM_TAG)) {
- BM_elem_select_set(em->bm, v, TRUE);
+ BM_vert_select_set(em->bm, v, TRUE);
}
}
@@ -2521,7 +2510,7 @@ void MESH_OT_select_next_loop(wmOperatorType *ot)
/* identifiers */
ot->name = "Select Next Loop";
ot->idname = "MESH_OT_select_next_loop";
- ot->description = "";
+ ot->description = "Select next edge loop adjacent to a selected loop";
/* api callbacks */
ot->exec = edbm_select_next_loop_exec;
@@ -2539,22 +2528,17 @@ static int edbm_region_to_loop_exec(bContext *C, wmOperator *UNUSED(op))
BMFace *f;
BMEdge *e;
BMIter iter;
- ViewContext vc;
-
- em_setup_viewcontext(C, &vc);
-
- BM_ITER(e, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
- BM_elem_flag_disable(e, BM_ELEM_TAG);
- }
- BM_ITER(f, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_mesh_elem_hflag_disable_all(em->bm, BM_EDGE, BM_ELEM_TAG, FALSE);
+
+ BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) {
BMLoop *l1, *l2;
BMIter liter1, liter2;
- BM_ITER(l1, &liter1, em->bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l1, &liter1, f, BM_LOOPS_OF_FACE) {
int tot = 0, totsel = 0;
- BM_ITER(l2, &liter2, em->bm, BM_LOOPS_OF_EDGE, l1->e) {
+ BM_ITER_ELEM (l2, &liter2, l1->e, BM_LOOPS_OF_EDGE) {
tot++;
totsel += BM_elem_flag_test(l2->f, BM_ELEM_SELECT) != 0;
}
@@ -2566,9 +2550,10 @@ static int edbm_region_to_loop_exec(bContext *C, wmOperator *UNUSED(op))
EDBM_flag_disable_all(em, BM_ELEM_SELECT);
- BM_ITER(e, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
- if (BM_elem_flag_test(e, BM_ELEM_TAG) && !BM_elem_flag_test(e, BM_ELEM_HIDDEN))
+ BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) {
+ if (BM_elem_flag_test(e, BM_ELEM_TAG)) {
BM_edge_select_set(em->bm, e, TRUE);
+ }
}
/* If in face-only select mode, switch to edge select mode so that
@@ -2589,6 +2574,7 @@ void MESH_OT_region_to_loop(wmOperatorType *ot)
/* identifiers */
ot->name = "Select Boundary Loop";
ot->idname = "MESH_OT_region_to_loop";
+ ot->description = "Select boundary edges around the selected faces";
/* api callbacks */
ot->exec = edbm_region_to_loop_exec;
@@ -2598,7 +2584,7 @@ void MESH_OT_region_to_loop(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
-static int loop_find_region(BMEditMesh *em, BMLoop *l, int flag,
+static int loop_find_region(BMLoop *l, int flag,
SmallHash *fhash, BMFace ***region_out)
{
BLI_array_declare(region);
@@ -2617,11 +2603,11 @@ static int loop_find_region(BMEditMesh *em, BMLoop *l, int flag,
f = BLI_array_pop(stack);
BLI_array_append(region, f);
- BM_ITER(l1, &liter1, em->bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l1, &liter1, f, BM_LOOPS_OF_FACE) {
if (BM_elem_flag_test(l1->e, flag))
continue;
- BM_ITER(l2, &liter2, em->bm, BM_LOOPS_OF_EDGE, l1->e) {
+ BM_ITER_ELEM (l2, &liter2, l1->e, BM_LOOPS_OF_EDGE) {
if (BLI_smallhash_haskey(fhash, (uintptr_t)l2->f))
continue;
@@ -2664,11 +2650,11 @@ static int loop_find_regions(BMEditMesh *em, int selbigger)
BLI_smallhash_init(&visithash);
- BM_ITER(f, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) {
BM_elem_flag_disable(f, BM_ELEM_TAG);
}
- BM_ITER(e, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(e, BM_ELEM_SELECT)) {
BLI_array_append(edges, e);
BM_elem_flag_enable(e, BM_ELEM_TAG);
@@ -2692,11 +2678,11 @@ static int loop_find_regions(BMEditMesh *em, int selbigger)
if (!BM_elem_flag_test(e, BM_ELEM_TAG))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_EDGE, e) {
+ BM_ITER_ELEM (l, &liter, e, BM_LOOPS_OF_EDGE) {
if (BLI_smallhash_haskey(&visithash, (uintptr_t)l->f))
continue;
- c = loop_find_region(em, l, BM_ELEM_SELECT, &visithash, &region_out);
+ c = loop_find_region(l, BM_ELEM_SELECT, &visithash, &region_out);
if (!region || (selbigger ? c >= tot : c < tot)) {
/* this region is the best seen so far */
@@ -2719,7 +2705,7 @@ static int loop_find_regions(BMEditMesh *em, int selbigger)
for (j = 0; j < tot; j++) {
BM_elem_flag_enable(region[j], BM_ELEM_TAG);
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, region[j]) {
+ BM_ITER_ELEM (l, &liter, region[j], BM_LOOPS_OF_FACE) {
BM_elem_flag_disable(l->e, BM_ELEM_TAG);
}
}
@@ -2755,7 +2741,7 @@ static int edbm_loop_to_region_exec(bContext *C, wmOperator *op)
EDBM_flag_disable_all(em, BM_ELEM_SELECT);
- BM_ITER(f, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(f, BM_ELEM_TAG) && !BM_elem_flag_test(f, BM_ELEM_HIDDEN)) {
BM_face_select_set(em->bm, f, TRUE);
}
@@ -2770,6 +2756,7 @@ void MESH_OT_loop_to_region(wmOperatorType *ot)
/* identifiers */
ot->name = "Select Loop Inner-Region";
ot->idname = "MESH_OT_loop_to_region";
+ ot->description = "Select region of faces inside of a selected loop of edges";
/* api callbacks */
ot->exec = edbm_loop_to_region_exec;
diff --git a/source/blender/editors/mesh/editmesh_slide.c b/source/blender/editors/mesh/editmesh_slide.c
index 94c546f0f1b..6534210601c 100644
--- a/source/blender/editors/mesh/editmesh_slide.c
+++ b/source/blender/editors/mesh/editmesh_slide.c
@@ -55,7 +55,7 @@
#include "mesh_intern.h"
-#define VTX_SLIDE_SNAP_THRSH 0.15
+#define VTX_SLIDE_SNAP_THRSH 15
/* Cusom VertexSlide Operator data */
typedef struct VertexSlideOp {
@@ -99,9 +99,9 @@ typedef struct VertexSlideOp {
} VertexSlideOp;
static void vtx_slide_draw(const bContext *C, ARegion *ar, void *arg);
-static int edbm_vert_slide_exec(bContext *C, wmOperator *op);
+static int edbm_vertex_slide_exec(bContext *C, wmOperator *op);
static void vtx_slide_exit(const bContext *C, wmOperator *op);
-static void vtx_slide_set_frame(VertexSlideOp *vso);
+static int vtx_slide_set_frame(VertexSlideOp *vso);
static int vtx_slide_init(bContext *C, wmOperator *op)
{
@@ -158,9 +158,6 @@ static int vtx_slide_init(bContext *C, wmOperator *op)
vso->snap_threshold = 0.2f;
- /* Add handler for the vertex sliding */
- WM_event_add_modal_handler(C, op);
-
/* Notify the viewport */
view3d_operator_needs_opengl(C);
@@ -178,7 +175,14 @@ static int vtx_slide_init(bContext *C, wmOperator *op)
vso->obj = obedit;
/* Init frame */
- vtx_slide_set_frame(vso);
+ if (!vtx_slide_set_frame(vso)) {
+ BKE_report(op->reports, RPT_ERROR_INVALID_INPUT, "Vertex Slide: Can't find starting vertex!");
+ vtx_slide_exit(C, op);
+ return FALSE;
+ }
+
+ /* Add handler for the vertex sliding */
+ WM_event_add_modal_handler(C, op);
/* Tag for redraw */
ED_region_tag_redraw(vso->active_region);
@@ -196,7 +200,7 @@ static void vtx_slide_confirm(bContext *C, wmOperator *op)
BM_edge_select_set(bm, vso->sel_edge, TRUE);
/* Invoke operator */
- edbm_vert_slide_exec(C, op);
+ edbm_vertex_slide_exec(C, op);
if (vso->snap_n_merge) {
float other_d;
@@ -260,6 +264,7 @@ static void vtx_slide_exit(const bContext *C, wmOperator *op)
MEM_freeN(vso);
vso = NULL;
+ op->customdata = NULL;
/* Clear the header */
ED_area_headerprint(CTX_wm_area(C), NULL);
@@ -273,7 +278,9 @@ static void vtx_slide_draw(const bContext *C, ARegion *UNUSED(ar), void *arg)
if (vso && vso->sel_edge) {
/* Get 3d view */
View3D *view3d = CTX_wm_view3d(C);
- const int outline_w = UI_GetThemeValuef(TH_OUTLINE_WIDTH) + 1;
+ const float outline_w = UI_GetThemeValuef(TH_OUTLINE_WIDTH) + 0.8f;
+ const float pt_size = UI_GetThemeValuef(TH_FACEDOT_SIZE) + 1.5;
+
int i = 0;
if (view3d && view3d->zbuf)
@@ -286,17 +293,7 @@ static void vtx_slide_draw(const bContext *C, ARegion *UNUSED(ar), void *arg)
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- /* Draw selected edge
- * Add color offset and reduce alpha */
- UI_ThemeColorShadeAlpha(TH_EDGE_SELECT, 50, -50);
-
- glLineWidth(outline_w);
-
- glBegin(GL_LINES);
- bglVertex3fv(vso->sel_edge->v1->co);
- bglVertex3fv(vso->sel_edge->v2->co);
- glEnd();
+
if (vso->slide_mode && vso->disk_edges > 0) {
/* Draw intermediate edge frame */
@@ -310,10 +307,21 @@ static void vtx_slide_draw(const bContext *C, ARegion *UNUSED(ar), void *arg)
}
}
+ /* Draw selected edge
+ * Add color offset and reduce alpha */
+ UI_ThemeColorShadeAlpha(TH_EDGE_SELECT, 40, -50);
+
+ glLineWidth(outline_w);
+
+ glBegin(GL_LINES);
+ bglVertex3fv(vso->sel_edge->v1->co);
+ bglVertex3fv(vso->sel_edge->v2->co);
+ glEnd();
+
if (vso->slide_mode) {
/* Draw interpolated vertex */
- int pt_size = UI_GetThemeValuef(TH_FACEDOT_SIZE) + 2;
- UI_ThemeColorShadeAlpha(TH_FACE_DOT, -90, -50);
+
+ UI_ThemeColorShadeAlpha(TH_FACE_DOT, -80, -50);
glPointSize(pt_size);
@@ -377,17 +385,12 @@ static void vtx_slide_find_edge(VertexSlideOp *vso, wmEvent *event)
if (nst_edge) {
/* Find a connected edge */
if (BM_vert_in_edge(nst_edge, vso->start_vtx)) {
- float edge_len;
/* Save mouse coords */
copy_v2_v2_int(vso->m_co, event->mval);
/* Set edge */
vso->sel_edge = nst_edge;
-
- /* Set snap threshold to be proportional to edge length */
- edge_len = len_v3v3(nst_edge->v1->co, nst_edge->v2->co);
- vso->snap_threshold = edge_len * VTX_SLIDE_SNAP_THRSH;
}
}
}
@@ -403,6 +406,7 @@ static void vtx_slide_update(VertexSlideOp *vso, wmEvent *event)
if (edge) {
float edge_other_proj[3];
float start_vtx_proj[3];
+ float edge_len;
BMVert *other;
float interp[3];
@@ -426,6 +430,16 @@ static void vtx_slide_update(VertexSlideOp *vso, wmEvent *event)
t_val = line_point_factor_v2(closest_2d, start_vtx_proj, edge_other_proj);
+ /* Set snap threshold to be proportional to edge length */
+ edge_len = len_v3v3(start_vtx_proj, edge_other_proj);
+
+ if (edge_len <= 0.0f)
+ edge_len = VTX_SLIDE_SNAP_THRSH;
+
+ edge_len = (len_v3v3(edge->v1->co, edge->v2->co) * VTX_SLIDE_SNAP_THRSH) / edge_len;
+
+ vso->snap_threshold = edge_len;
+
/* Snap to mid */
if (vso->snap_to_mid) {
t_val = 0.5f;
@@ -463,16 +477,15 @@ static void vtx_slide_update(VertexSlideOp *vso, wmEvent *event)
}
/* Sets the outline frame */
-static void vtx_slide_set_frame(VertexSlideOp *vso)
+static int vtx_slide_set_frame(VertexSlideOp *vso)
{
BMEdge *edge;
float (*vtx_frame)[3] = NULL;
BMEdge** edge_frame = NULL;
+ BMVert *curr_vert = NULL;
BLI_array_declare(vtx_frame);
BLI_array_declare(edge_frame);
BMIter iter;
- BMEditMesh *em = BMEdit_FromObject(vso->obj);
- BMesh *bm = em->bm;
BMVert *sel_vtx = vso->start_vtx;
int idx = 0;
@@ -489,14 +502,16 @@ static void vtx_slide_set_frame(VertexSlideOp *vso)
}
/* Iterate over edges of vertex and copy them */
- BM_ITER_INDEX(edge, &iter, bm, BM_EDGES_OF_VERT, sel_vtx, idx)
- {
- BLI_array_growone(vtx_frame);
+ BM_ITER_ELEM_INDEX (edge, &iter, sel_vtx, BM_EDGES_OF_VERT, idx) {
+ curr_vert = BM_edge_other_vert(edge, sel_vtx);
+ if (curr_vert) {
+ BLI_array_growone(vtx_frame);
- copy_v3_v3(vtx_frame[idx], BM_edge_other_vert(edge, sel_vtx)->co);
+ copy_v3_v3(vtx_frame[idx], curr_vert->co);
- BLI_array_append(edge_frame, edge);
- vso->disk_edges++;
+ BLI_array_append(edge_frame, edge);
+ vso->disk_edges++;
+ }
}
vso->edge_frame = edge_frame;
@@ -504,11 +519,17 @@ static void vtx_slide_set_frame(VertexSlideOp *vso)
/* Set the interp at starting vtx */
copy_v3_v3(vso->interp, sel_vtx->co);
+
+ return vso->disk_edges > 0;
}
-static int edbm_vert_slide_modal(bContext *C, wmOperator *op, wmEvent *event)
+static int edbm_vertex_slide_modal(bContext *C, wmOperator *op, wmEvent *event)
{
VertexSlideOp *vso = op->customdata;
+ char buff[128];
+
+ if (!vso)
+ return OPERATOR_CANCELLED;
/* Notify the viewport */
view3d_operator_needs_opengl(C);
@@ -588,13 +609,14 @@ static int edbm_vert_slide_modal(bContext *C, wmOperator *op, wmEvent *event)
}
case MOUSEMOVE:
{
+ sprintf(buff, "Vertex Slide: %f", vso->distance);
if (!vso->slide_mode) {
vtx_slide_find_edge(vso, event);
}
else {
vtx_slide_update(vso, event);
}
-
+ ED_area_headerprint(CTX_wm_area(C), buff);
ED_region_tag_redraw(vso->active_region);
break;
}
@@ -603,7 +625,7 @@ static int edbm_vert_slide_modal(bContext *C, wmOperator *op, wmEvent *event)
return OPERATOR_RUNNING_MODAL;
}
-static int edbm_vert_slide_cancel(bContext *C, wmOperator *op)
+static int edbm_vertex_slide_cancel(bContext *C, wmOperator *op)
{
/* Exit the modal */
vtx_slide_exit(C, op);
@@ -611,7 +633,7 @@ static int edbm_vert_slide_cancel(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
-static int edbm_vert_slide_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
+static int edbm_vertex_slide_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(event))
{
/* Initialize the operator */
if (vtx_slide_init(C, op))
@@ -621,20 +643,20 @@ static int edbm_vert_slide_invoke(bContext *C, wmOperator *op, wmEvent *UNUSED(e
}
/* Vertex Slide */
-static int edbm_vert_slide_exec(bContext *C, wmOperator *op)
+static int edbm_vertex_slide_exec(bContext *C, wmOperator *op)
{
Object *obedit = CTX_data_edit_object(C);
BMEditMesh *em = BMEdit_FromObject(obedit);
BMesh *bm = em->bm;
BMVert *start_vert;
BMOperator bmop;
- BMEditSelection *ese = em->bm->selected.last;
+ BMEditSelection *ese = (BMEditSelection *)em->bm->selected.last;
float distance_t = 0.0f;
/* Invoked modally? */
- if (op->type->modal == edbm_vert_slide_modal && op->customdata) {
- VertexSlideOp *vso = op->customdata;
+ if (op->type->modal == edbm_vertex_slide_modal && op->customdata) {
+ VertexSlideOp *vso = (VertexSlideOp *)op->customdata;
if (bm->totedgesel > 1) {
/* Reset selections */
@@ -644,7 +666,7 @@ static int edbm_vert_slide_exec(bContext *C, wmOperator *op)
EDBM_editselection_store(em, &vso->sel_edge->head);
EDBM_editselection_store(em, &vso->start_vtx->head);
- ese = em->bm->selected.last;
+ ese = (BMEditSelection *)em->bm->selected.last;
}
distance_t = vso->distance;
RNA_float_set(op->ptr, "distance_t", distance_t);
@@ -663,13 +685,16 @@ static int edbm_vert_slide_exec(bContext *C, wmOperator *op)
start_vert = (BMVert *)ese->ele;
/* Prepare operator */
- if (!EDBM_op_init(em, &bmop, op, "vertslide vert=%e edge=%hev distance_t=%f", start_vert, BM_ELEM_SELECT, distance_t)) {
+ if (!EDBM_op_init(em, &bmop, op, "vertex_slide vert=%e edge=%hev distance_t=%f", start_vert, BM_ELEM_SELECT, distance_t)) {
return OPERATOR_CANCELLED;
}
/* Execute operator */
BMO_op_exec(bm, &bmop);
- /* Select the edge */
+ /* Deselect the input edges */
+ BMO_slot_buffer_hflag_disable(bm, &bmop, "edge", BM_ALL, BM_ELEM_SELECT, TRUE);
+
+ /* Select the output vert */
BMO_slot_buffer_hflag_enable(bm, &bmop, "vertout", BM_ALL, BM_ELEM_SELECT, TRUE);
/* Flush the select buffers */
@@ -695,12 +720,12 @@ void MESH_OT_vert_slide(wmOperatorType *ot)
ot->description = "Vertex slide";
/* api callback */
- ot->invoke = edbm_vert_slide_invoke;
- ot->modal = edbm_vert_slide_modal;
- ot->cancel = edbm_vert_slide_cancel;
+ ot->invoke = edbm_vertex_slide_invoke;
+ ot->modal = edbm_vertex_slide_modal;
+ ot->cancel = edbm_vertex_slide_cancel;
ot->poll = ED_operator_editmesh_region_view3d;
- /* ot->exec = edbm_vert_slide_exec;
+ /* ot->exec = edbm_vertex_slide_exec;
* ot->poll = ED_operator_editmesh; */
/* flags */
diff --git a/source/blender/editors/mesh/editmesh_tools.c b/source/blender/editors/mesh/editmesh_tools.c
index 2954f0ebcb4..58ef3d739cd 100644
--- a/source/blender/editors/mesh/editmesh_tools.c
+++ b/source/blender/editors/mesh/editmesh_tools.c
@@ -58,10 +58,11 @@
#include "WM_types.h"
#include "ED_mesh.h"
-#include "ED_view3d.h"
+#include "ED_object.h"
#include "ED_screen.h"
#include "ED_transform.h"
-#include "ED_object.h"
+#include "ED_uvedit.h"
+#include "ED_view3d.h"
#include "RE_render_ext.h"
@@ -142,8 +143,7 @@ void MESH_OT_subdivide(wmOperatorType *ot)
/* avoid re-using last var because it can cause _very_ high poly meshes and annoy users (or worse crash) */
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
- /* BMESH_TODO, this currently does nothing, just add to stop UI from erroring out! */
- RNA_def_float(ot->srna, "smoothness", 0.0f, 0.0f, FLT_MAX, "Smoothness", "Smoothness factor (BMESH TODO)", 0.0f, 1.0f);
+ RNA_def_float(ot->srna, "smoothness", 0.0f, 0.0f, FLT_MAX, "Smoothness", "Smoothness factor", 0.0f, 1.0f);
RNA_def_boolean(ot->srna, "quadtri", 0, "Quad/Tri Mode", "Tries to prevent ngons");
RNA_def_enum(ot->srna, "quadcorner", prop_mesh_cornervert_types, SUBD_STRAIGHT_CUT,
@@ -159,7 +159,7 @@ void EMBM_project_snap_verts(bContext *C, ARegion *ar, Object *obedit, BMEditMes
BMIter iter;
BMVert *eve;
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
float mval[2], vec[3], no_dummy[3];
int dist_dummy;
@@ -190,11 +190,11 @@ static short edbm_extrude_face_indiv(BMEditMesh *em, wmOperator *op, const char
BMO_op_exec(em->bm, &bmop);
- BMO_ITER(f, &siter, em->bm, &bmop, "faceout", BM_FACE) {
- BM_elem_select_set(em->bm, f, TRUE);
+ BMO_ITER (f, &siter, em->bm, &bmop, "faceout", BM_FACE) {
+ BM_face_select_set(em->bm, f, TRUE);
/* set face vertex normals to face normal */
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
copy_v3_v3(l->v->no, f->no);
}
}
@@ -327,7 +327,7 @@ static short edbm_extrude_edge(Object *obedit, BMEditMesh *em, const char hflag,
zero_v3(nor);
- BMO_ITER(ele, &siter, bm, &extop, "geomout", BM_ALL) {
+ BMO_ITER (ele, &siter, bm, &extop, "geomout", BM_ALL) {
BM_elem_select_set(bm, ele, TRUE);
if (ele->head.htype == BM_FACE) {
@@ -350,12 +350,11 @@ static short edbm_extrude_vert(Object *obedit, BMEditMesh *em, const char hflag,
BMEdge *eed;
/* ensure vert flags are consistent for edge selections */
- eed = BM_iter_new(&iter, em->bm, BM_EDGES_OF_MESH, NULL);
- for ( ; eed; eed = BM_iter_step(&iter)) {
+ BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(eed, hflag)) {
if (hflag & BM_ELEM_SELECT) {
- BM_elem_select_set(em->bm, eed->v1, TRUE);
- BM_elem_select_set(em->bm, eed->v2, TRUE);
+ BM_vert_select_set(em->bm, eed->v1, TRUE);
+ BM_vert_select_set(em->bm, eed->v2, TRUE);
}
BM_elem_flag_enable(eed->v1, hflag & ~BM_ELEM_SELECT);
@@ -364,7 +363,7 @@ static short edbm_extrude_vert(Object *obedit, BMEditMesh *em, const char hflag,
else {
if (BM_elem_flag_test(eed->v1, hflag) && BM_elem_flag_test(eed->v2, hflag)) {
if (hflag & BM_ELEM_SELECT) {
- BM_elem_select_set(em->bm, eed, TRUE);
+ BM_edge_select_set(em->bm, eed, TRUE);
}
BM_elem_flag_enable(eed, hflag & ~BM_ELEM_SELECT);
@@ -537,6 +536,7 @@ void MESH_OT_extrude_region(wmOperatorType *ot)
/* identifiers */
ot->name = "Extrude Region";
ot->idname = "MESH_OT_extrude_region";
+ ot->description = "Extrude region of faces";
/* api callbacks */
//ot->invoke = mesh_extrude_region_invoke;
@@ -567,6 +567,7 @@ void MESH_OT_extrude_verts_indiv(wmOperatorType *ot)
/* identifiers */
ot->name = "Extrude Only Vertices";
ot->idname = "MESH_OT_extrude_verts_indiv";
+ ot->description = "Extrude individual vertices only";
/* api callbacks */
ot->exec = edbm_extrude_verts_exec;
@@ -597,6 +598,7 @@ void MESH_OT_extrude_edges_indiv(wmOperatorType *ot)
/* identifiers */
ot->name = "Extrude Only Edges";
ot->idname = "MESH_OT_extrude_edges_indiv";
+ ot->description = "Extrude individual edges only";
/* api callbacks */
ot->exec = edbm_extrude_edges_exec;
@@ -627,6 +629,7 @@ void MESH_OT_extrude_faces_indiv(wmOperatorType *ot)
/* identifiers */
ot->name = "Extrude Individual Faces";
ot->idname = "MESH_OT_extrude_faces_indiv";
+ ot->description = "Extrude individual faces only";
/* api callbacks */
ot->exec = edbm_extrude_faces_exec;
@@ -727,11 +730,12 @@ static int edbm_dupli_extrude_cursor_invoke(bContext *C, wmOperator *op, wmEvent
em_setup_viewcontext(C, &vc);
- use_proj = (vc.scene->toolsettings->snap_flag & SCE_SNAP) && (vc.scene->toolsettings->snap_mode == SCE_SNAP_MODE_FACE);
+ use_proj = ((vc.scene->toolsettings->snap_flag & SCE_SNAP) &&
+ (vc.scene->toolsettings->snap_mode == SCE_SNAP_MODE_FACE));
INIT_MINMAX(min, max);
- BM_ITER(v1, &iter, vc.em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v1, &iter, vc.em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(v1, BM_ELEM_SELECT)) {
DO_MINMAX(v1->co, min, max);
done = 1;
@@ -753,7 +757,7 @@ static int edbm_dupli_extrude_cursor_invoke(bContext *C, wmOperator *op, wmEvent
/* check for edges that are half selected, use for rotation */
done = 0;
- BM_ITER(eed, &iter, vc.em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, vc.em->bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
float co1[3], co2[3];
mul_v3_m4v3(co1, vc.obedit->obmat, eed->v1->co);
@@ -855,8 +859,8 @@ static int edbm_dupli_extrude_cursor_invoke(bContext *C, wmOperator *op, wmEvent
EDBM_op_init(vc.em, &bmop, op, "makevert co=%v", min);
BMO_op_exec(vc.em->bm, &bmop);
- BMO_ITER(v1, &oiter, vc.em->bm, &bmop, "newvertout", BM_VERT) {
- BM_elem_select_set(vc.em->bm, v1, TRUE);
+ BMO_ITER (v1, &oiter, vc.em->bm, &bmop, "newvertout", BM_VERT) {
+ BM_vert_select_set(vc.em->bm, v1, TRUE);
}
if (!EDBM_op_finish(vc.em, &bmop, op, TRUE)) {
@@ -882,10 +886,10 @@ void MESH_OT_dupli_extrude_cursor(wmOperatorType *ot)
/* identifiers */
ot->name = "Duplicate or Extrude at 3D Cursor";
ot->idname = "MESH_OT_dupli_extrude_cursor";
+ ot->description = "Duplicate and extrude selected vertices, edges or faces towards the mouse cursor";
/* api callbacks */
ot->invoke = edbm_dupli_extrude_cursor_invoke;
- ot->description = "Duplicate and extrude selected vertices, edges or faces towards the mouse cursor";
ot->poll = ED_operator_editmesh;
/* flags */
@@ -1056,6 +1060,7 @@ void MESH_OT_edge_face_add(wmOperatorType *ot)
static int edbm_mark_seam(bContext *C, wmOperator *op)
{
+ Scene *scene = CTX_data_scene(C);
Object *obedit = CTX_data_edit_object(C);
Mesh *me = ((Mesh *)obedit->data);
BMEditMesh *em = BMEdit_FromObject(obedit);
@@ -1070,7 +1075,7 @@ static int edbm_mark_seam(bContext *C, wmOperator *op)
}
if (clear) {
- BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
if (!BM_elem_flag_test(eed, BM_ELEM_SELECT) || BM_elem_flag_test(eed, BM_ELEM_HIDDEN))
continue;
@@ -1078,13 +1083,14 @@ static int edbm_mark_seam(bContext *C, wmOperator *op)
}
}
else {
- BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
if (!BM_elem_flag_test(eed, BM_ELEM_SELECT) || BM_elem_flag_test(eed, BM_ELEM_HIDDEN))
continue;
BM_elem_flag_enable(eed, BM_ELEM_SEAM);
}
}
+ ED_uvedit_live_unwrap(scene, obedit);
EDBM_update_generic(C, em, TRUE);
return OPERATOR_FINISHED;
@@ -1095,7 +1101,7 @@ void MESH_OT_mark_seam(wmOperatorType *ot)
/* identifiers */
ot->name = "Mark Seam";
ot->idname = "MESH_OT_mark_seam";
- ot->description = "(un)mark selected edges as a seam";
+ ot->description = "(Un)mark selected edges as a seam";
/* api callbacks */
ot->exec = edbm_mark_seam;
@@ -1123,7 +1129,7 @@ static int edbm_mark_sharp(bContext *C, wmOperator *op)
}
if (!clear) {
- BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
if (!BM_elem_flag_test(eed, BM_ELEM_SELECT) || BM_elem_flag_test(eed, BM_ELEM_HIDDEN))
continue;
@@ -1131,7 +1137,7 @@ static int edbm_mark_sharp(bContext *C, wmOperator *op)
}
}
else {
- BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
if (!BM_elem_flag_test(eed, BM_ELEM_SELECT) || BM_elem_flag_test(eed, BM_ELEM_HIDDEN))
continue;
@@ -1149,7 +1155,7 @@ void MESH_OT_mark_sharp(wmOperatorType *ot)
/* identifiers */
ot->name = "Mark Sharp";
ot->idname = "MESH_OT_mark_sharp";
- ot->description = "(un)mark selected edges as sharp";
+ ot->description = "(Un)mark selected edges as sharp";
/* api callbacks */
ot->exec = edbm_mark_sharp;
@@ -1189,7 +1195,7 @@ void MESH_OT_vert_connect(wmOperatorType *ot)
/* identifiers */
ot->name = "Vertex Connect";
ot->idname = "MESH_OT_vert_connect";
- ot->description = "Connect 2 vertices in a face with by an edge, splitting the face in half";
+ ot->description = "Connect 2 vertices of a face by an edge, splitting the face in two";
/* api callbacks */
ot->exec = edbm_vert_connect;
@@ -1335,7 +1341,7 @@ static int edbm_edge_rotate_selected_exec(bContext *C, wmOperator *op)
}
/* first see if we have two adjacent faces */
- BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
BM_elem_flag_disable(eed, BM_ELEM_TAG);
if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
BMFace *fa, *fb;
@@ -1414,11 +1420,11 @@ void MESH_OT_hide(wmOperatorType *ot)
/* identifiers */
ot->name = "Hide Selection";
ot->idname = "MESH_OT_hide";
+ ot->description = "Hide (un)selected vertices, edges or faces";
/* api callbacks */
ot->exec = edbm_hide_exec;
ot->poll = ED_operator_editmesh;
- ot->description = "Hide (un)selected vertices, edges or faces";
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -1575,7 +1581,7 @@ static void mesh_set_smooth_faces(BMEditMesh *em, short smooth)
if (em == NULL) return;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
BM_elem_flag_set(efa, BM_ELEM_SMOOTH, smooth);
}
@@ -1744,6 +1750,7 @@ void MESH_OT_uvs_rotate(wmOperatorType *ot)
/* identifiers */
ot->name = "Rotate UVs";
ot->idname = "MESH_OT_uvs_rotate";
+ ot->description = "Rotate UV coordinates inside faces";
/* api callbacks */
ot->exec = edbm_rotate_uvs_exec;
@@ -1762,6 +1769,7 @@ void MESH_OT_uvs_reverse(wmOperatorType *ot)
/* identifiers */
ot->name = "Reverse UVs";
ot->idname = "MESH_OT_uvs_reverse";
+ ot->description = "Flip direction of UV coordinates inside faces";
/* api callbacks */
ot->exec = edbm_reverse_uvs_exec;
@@ -1779,6 +1787,7 @@ void MESH_OT_colors_rotate(wmOperatorType *ot)
/* identifiers */
ot->name = "Rotate Colors";
ot->idname = "MESH_OT_colors_rotate";
+ ot->description = "Rotate vertex colors inside faces";
/* api callbacks */
ot->exec = edbm_rotate_colors_exec;
@@ -1796,6 +1805,7 @@ void MESH_OT_colors_reverse(wmOperatorType *ot)
/* identifiers */
ot->name = "Reverse Colors";
ot->idname = "MESH_OT_colors_reverse";
+ ot->description = "Flip direction of vertex colors inside faces";
/* api callbacks */
ot->exec = edbm_reverse_colors_exec;
@@ -1853,7 +1863,7 @@ static int merge_target(BMEditMesh *em, Scene *scene, View3D *v3d, Object *ob,
else {
float fac;
int i = 0;
- BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(v, BM_ELEM_SELECT))
continue;
add_v3_v3(cent, v->co);
@@ -2023,7 +2033,7 @@ void MESH_OT_remove_doubles(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Remove Doubles";
- ot->description= "Remove duplicate vertices";
+ ot->description = "Remove duplicate vertices";
ot->idname = "MESH_OT_remove_doubles";
/* api callbacks */
@@ -2041,8 +2051,8 @@ void MESH_OT_remove_doubles(wmOperatorType *ot)
/************************ Vertex Path Operator *************************/
typedef struct PathNode {
- int u;
- int visited;
+ /* int u; */ /* UNUSED */
+ /* int visited; */ /* UNUSED */
ListBase edges;
} PathNode;
@@ -2110,6 +2120,7 @@ void MESH_OT_select_vertex_path(wmOperatorType *ot)
/* identifiers */
ot->name = "Select Vertex Path";
ot->idname = "MESH_OT_select_vertex_path";
+ ot->description = "Selected vertex path between two vertices";
/* api callbacks */
ot->exec = edbm_select_vertex_path_exec;
@@ -2123,362 +2134,6 @@ void MESH_OT_select_vertex_path(wmOperatorType *ot)
}
/********************** Rip Operator *************************/
-/* helper to find edge for edge_rip */
-static float mesh_rip_edgedist(ARegion *ar, float mat[][4], float *co1, float *co2, const float mvalf[2])
-{
- float vec1[3], vec2[3];
-
- ED_view3d_project_float_v2(ar, co1, vec1, mat);
- ED_view3d_project_float_v2(ar, co2, vec2, mat);
-
- return dist_to_line_segment_v2(mvalf, vec1, vec2);
-}
-
-
-
-/* based on mouse cursor position, it defines how is being ripped */
-static int edbm_rip_invoke(bContext *C, wmOperator *op, wmEvent *event)
-{
- Object *obedit = CTX_data_edit_object(C);
- ARegion *ar = CTX_wm_region(C);
- RegionView3D *rv3d = CTX_wm_region_view3d(C);
- BMEditMesh *em = BMEdit_FromObject(obedit);
- BMesh *bm = em->bm;
- BMOperator bmop;
- BMOIter siter;
- BMIter iter, eiter, liter;
- BMLoop *l;
- BMEdge *e, *e2;
- BMVert *v, *ripvert = NULL;
- int i, singlesel = FALSE;
- float projectMat[4][4], fmval[3] = {event->mval[0], event->mval[1]};
- float dist = FLT_MAX;
- float d;
- const int totedge_orig = bm->totedge;
-
- /* note on selection:
- * When calling edge split we operate on tagged edges rather then selected
- * this is important because the edges to operate on are extended by one,
- * but the selection is left alone.
- *
- * After calling edge split - the duplicated edges have the same selection state as the
- * original, so all we do is de-select the far side from the mouse and we have a
- * useful selection for grabbing.
- */
-
- ED_view3d_ob_project_mat_get(rv3d, obedit, projectMat);
-
- /* BM_ELEM_SELECT --> BM_ELEM_TAG */
- BM_ITER(e, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
- BM_elem_flag_set(e, BM_ELEM_TAG, BM_elem_flag_test(e, BM_ELEM_SELECT));
- }
-
- /* handle case of one vert selected. identify
- * closest edge around that vert to mouse cursor,
- * then rip two adjacent edges in the vert fan. */
- if (bm->totvertsel == 1 && bm->totedgesel == 0 && bm->totfacesel == 0) {
- BMEditSelection ese;
- int totboundary_edge = 0;
- singlesel = TRUE;
-
- /* find selected vert - same some time and check history first */
- if (EDBM_editselection_active_get(em, &ese) && ese.htype == BM_VERT) {
- v = (BMVert *)ese.ele;
- }
- else {
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
- if (BM_elem_flag_test(v, BM_ELEM_SELECT))
- break;
- }
- }
-
- /* this should be impossible, but sanity checks are a good thing */
- if (!v)
- return OPERATOR_CANCELLED;
-
- e2 = NULL;
-
- if (v->e) {
- /* find closest edge to mouse cursor */
- BM_ITER(e, &iter, bm, BM_EDGES_OF_VERT, v) {
- int is_boundary = BM_edge_is_boundary(e);
- /* consider wire as boundary for this purpose,
- * otherwise we can't a face away from a wire edge */
- totboundary_edge += (is_boundary != 0 || BM_edge_is_wire(e));
- if (!BM_elem_flag_test(e, BM_ELEM_HIDDEN)) {
- if (is_boundary == FALSE && BM_edge_face_count(e) == 2) {
- d = mesh_rip_edgedist(ar, projectMat, e->v1->co, e->v2->co, fmval);
- if (d < dist) {
- dist = d;
- e2 = e;
- }
- }
- }
- }
-
- }
-
- /* should we go ahead with edge rip or do we need to do special case, split off vertex?:
- * split off vertex if...
- * - we cant find an edge - this means we are ripping a faces vert that is connected to other
- * geometry only at the vertex.
- * - the boundary edge total is greater then 2,
- * in this case edge split _can_ work but we get far nicer results if we use this special case. */
- if (totboundary_edge > 2) {
- BMVert **vout;
- int vout_len;
-
- BM_elem_select_set(bm, v, FALSE);
- bmesh_vert_separate(bm, v, &vout, &vout_len);
-
- if (vout_len < 2) {
- /* should never happen */
- BKE_report(op->reports, RPT_ERROR, "Error ripping vertex from faces");
- return OPERATOR_CANCELLED;
- }
- else {
- int vi_best = 0;
-
- dist = FLT_MAX;
-
- for (i = 0; i < vout_len; i++) {
- BM_ITER(l, &iter, bm, BM_LOOPS_OF_VERT, vout[i]) {
- if (!BM_elem_flag_test(l->f, BM_ELEM_HIDDEN)) {
- float l_mid_co[3];
- BM_loop_face_tangent(l, l_mid_co);
-
- /* scale to average of surrounding edge size, only needs to be approx */
- mul_v3_fl(l_mid_co, (BM_edge_length_calc(l->e) + BM_edge_length_calc(l->prev->e)) / 2.0f);
- add_v3_v3(l_mid_co, v->co);
-
- d = mesh_rip_edgedist(ar, projectMat, v->co, l_mid_co, fmval);
-
- if (d < dist) {
- dist = d;
- vi_best = i;
- }
- }
- }
- }
-
- /* select the vert from the best region */
- v = vout[vi_best];
- BM_elem_select_set(bm, v, TRUE);
-
- /* splice all others back together */
- if (vout_len > 2) {
-
- /* vout[0] == best
- * vout[1] == glue
- * vout[2+] == splice with glue
- */
- if (vi_best != 0) {
- SWAP(BMVert *, vout[0], vout[vi_best]);
- vi_best = 0;
- }
-
- for (i = 2; i < vout_len; i++) {
- BM_vert_splice(bm, vout[i], vout[1]);
- }
- }
-
- MEM_freeN(vout);
-
- return OPERATOR_FINISHED;
- }
- }
-
- if (!e2) {
- BKE_report(op->reports, RPT_ERROR, "Selected vertex has no edge/face pairs attached");
- return OPERATOR_CANCELLED;
- }
-
- /* rip two adjacent edges */
- if (BM_edge_face_count(e2) == 1 || BM_vert_face_count(v) == 2) {
- l = e2->l;
- ripvert = BM_face_vert_separate(bm, l->f, v);
-
- BLI_assert(ripvert);
- if (!ripvert) {
- return OPERATOR_CANCELLED;
- }
- }
- else if (BM_edge_face_count(e2) == 2) {
- l = e2->l;
- e = BM_face_other_edge_loop(l->f, e2, v)->e;
- BM_elem_flag_enable(e, BM_ELEM_TAG);
-
- l = e2->l->radial_next;
- e = BM_face_other_edge_loop(l->f, e2, v)->e;
- BM_elem_flag_enable(e, BM_ELEM_TAG);
- }
-
- dist = FLT_MAX;
- }
- else {
- /* expand edge selection */
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
- e2 = NULL;
- i = 0;
- BM_ITER(e, &eiter, bm, BM_EDGES_OF_VERT, v) {
- /* important to check selection rather then tag here
- * else we get feedback loop */
- if (BM_elem_flag_test(e, BM_ELEM_SELECT)) {
- e2 = e;
- i++;
- }
- }
-
- if (i == 1 && e2->l) {
- l = BM_face_other_edge_loop(e2->l->f, e2, v);
- l = l->radial_next;
- l = BM_face_other_edge_loop(l->f, l->e, v);
-
- if (l) {
- BM_elem_flag_enable(l->e, BM_ELEM_TAG);
- }
- }
- }
- }
-
- if (!EDBM_op_init(em, &bmop, op, "edgesplit edges=%he verts=%hv use_verts=%b",
- BM_ELEM_TAG, BM_ELEM_SELECT, TRUE)) {
- return OPERATOR_CANCELLED;
- }
-
- BMO_op_exec(bm, &bmop);
-
- if (totedge_orig == bm->totedge) {
- EDBM_op_finish(em, &bmop, op, TRUE);
-
- BKE_report(op->reports, RPT_ERROR, "No edges could be ripped");
- return OPERATOR_CANCELLED;
- }
-
- BMO_ITER(e, &siter, bm, &bmop, "edgeout", BM_EDGE) {
- float cent[3] = {0, 0, 0}, mid[3];
-
- float vec[2];
- float fmval_tweak[2];
- float e_v1_co[2], e_v2_co[2];
-
- BMVert *v1_other;
- BMVert *v2_other;
-
- /* method for calculating distance:
- *
- * for each edge: calculate face center, then made a vector
- * from edge midpoint to face center. offset edge midpoint
- * by a small amount along this vector. */
-
- /* rather then the face center, get the middle of
- * both edge verts connected to this one */
- v1_other = BM_face_other_vert_loop(e->l->f, e->v2, e->v1)->v;
- v2_other = BM_face_other_vert_loop(e->l->f, e->v1, e->v2)->v;
- mid_v3_v3v3(cent, v1_other->co, v2_other->co);
- mid_v3_v3v3(mid, e->v1->co, e->v2->co);
-
- ED_view3d_project_float_v2(ar, cent, cent, projectMat);
- ED_view3d_project_float_v2(ar, mid, mid, projectMat);
-
- ED_view3d_project_float_v2(ar, e->v1->co, e_v1_co, projectMat);
- ED_view3d_project_float_v2(ar, e->v2->co, e_v2_co, projectMat);
-
- sub_v2_v2v2(vec, cent, mid);
- normalize_v2(vec);
- mul_v2_fl(vec, 0.01f);
-
- /* rather then adding to both verts, subtract from the mouse */
- sub_v2_v2v2(fmval_tweak, fmval, vec);
-
- if (dist_to_line_segment_v2(fmval_tweak, e_v1_co, e_v2_co) >
- dist_to_line_segment_v2(fmval, e_v1_co, e_v2_co))
- {
- BM_elem_select_set(bm, e, FALSE);
- }
- }
-
- if (singlesel) {
- BMVert *v_best = NULL;
- float l_prev_co[3], l_next_co[3], l_corner_co[3];
- float scale;
-
- /* not good enough! - original vert may not be attached to the closest edge */
-#if 0
- EDBM_flag_disable_all(em, BM_ELEM_SELECT);
- BM_elem_select_set(bm, ripvert, TRUE);
-#else
-
- dist = FLT_MAX;
- BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
- if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
- /* disable by default, re-enable winner at end */
- BM_elem_select_set(bm, v, FALSE);
-
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_VERT, v) {
- /* calculate a point in the face, rather then calculate the middle,
- * make a vector pointing between the 2 edges attached to this loop */
- sub_v3_v3v3(l_prev_co, l->prev->v->co, l->v->co);
- sub_v3_v3v3(l_next_co, l->next->v->co, l->v->co);
-
- scale = normalize_v3(l_prev_co) + normalize_v3(l_next_co);
- mul_v3_fl(l_prev_co, scale);
- mul_v3_fl(l_next_co, scale);
-
- add_v3_v3v3(l_corner_co, l_prev_co, l_next_co);
- add_v3_v3(l_corner_co, l->v->co);
-
- d = mesh_rip_edgedist(ar, projectMat, l->v->co, l_corner_co, fmval);
- if (d < dist) {
- v_best = v;
- dist = d;
- }
- }
- }
- }
-
- if (v_best) {
- BM_elem_select_set(bm, v_best, TRUE);
- }
-#endif
- }
-
- EDBM_selectmode_flush(em);
-
- BLI_assert(singlesel ? (bm->totvertsel > 0) : (bm->totedgesel > 0));
-
- if (!EDBM_op_finish(em, &bmop, op, TRUE)) {
- return OPERATOR_CANCELLED;
- }
-
- if (bm->totvertsel == 0) {
- return OPERATOR_CANCELLED;
- }
-
- EDBM_update_generic(C, em, TRUE);
-
- return OPERATOR_FINISHED;
-}
-
-void MESH_OT_rip(wmOperatorType *ot)
-{
- /* identifiers */
- ot->name = "Rip";
- ot->idname = "MESH_OT_rip";
- ot->description = "Disconnect vertex or edges from connected geometry";
-
- /* api callbacks */
- ot->invoke = edbm_rip_invoke;
- ot->poll = EM_view3d_poll;
-
- /* flags */
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
- /* to give to transform */
- Transform_Properties(ot, P_PROPORTIONAL);
- RNA_def_boolean(ot->srna, "mirror", 0, "Mirror Editing", "");
-}
-
/************************ Shape Operators *************************/
/* BMESH_TODO this should be properly encapsulated in a bmop. but later.*/
@@ -2494,7 +2149,7 @@ static void shape_propagate(BMEditMesh *em, wmOperator *op)
return;
}
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(eve, BM_ELEM_SELECT) || BM_elem_flag_test(eve, BM_ELEM_HIDDEN))
continue;
@@ -2563,7 +2218,7 @@ static int edbm_blend_from_shape_exec(bContext *C, wmOperator *op)
if (totshape == 0 || shape < 0 || shape >= totshape)
return OPERATOR_CANCELLED;
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(eve, BM_ELEM_SELECT) || BM_elem_flag_test(eve, BM_ELEM_HIDDEN))
continue;
@@ -2668,20 +2323,20 @@ static int edbm_select_axis_exec(bContext *C, wmOperator *op)
else if (mode == 1)
value += limit;
- BM_ITER(ev, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (ev, &iter, em->bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(ev, BM_ELEM_HIDDEN)) {
switch (mode) {
case -1: /* aligned */
if (fabs(ev->co[axis] - value) < limit)
- BM_elem_select_set(em->bm, ev, TRUE);
+ BM_vert_select_set(em->bm, ev, TRUE);
break;
case 0: /* neg */
if (ev->co[axis] > value)
- BM_elem_select_set(em->bm, ev, TRUE);
+ BM_vert_select_set(em->bm, ev, TRUE);
break;
case 1: /* pos */
if (ev->co[axis] < value)
- BM_elem_select_set(em->bm, ev, TRUE);
+ BM_vert_select_set(em->bm, ev, TRUE);
break;
}
}
@@ -3008,7 +2663,7 @@ static int edbm_knife_cut_exec(bContext *C, wmOperator *op)
}
/* get the cut curve */
- RNA_BEGIN(op->ptr, itemptr, "path") {
+ RNA_BEGIN (op->ptr, itemptr, "path") {
RNA_float_get_array(&itemptr, "loc", (float *)&curve[len]);
len++;
if (len >= MAX_CUTS) {
@@ -3120,7 +2775,7 @@ static int mesh_separate_selected(Main *bmain, Scene *scene, Base *editbase, wmO
BMesh *bm_new;
if (!em)
- return OPERATOR_CANCELLED;
+ return FALSE;
bm_new = BM_mesh_create(&bm_mesh_allocsize_default);
CustomData_copy(&em->bm->vdata, &bm_new->vdata, CD_MASK_BMESH, CD_CALLOC, 0);
@@ -3142,23 +2797,23 @@ static int mesh_separate_selected(Main *bmain, Scene *scene, Base *editbase, wmO
EDBM_op_callf(em, wmop, "del geom=%hvef context=%i", BM_ELEM_SELECT, DEL_FACES);
/* clean up any loose edges */
- BM_ITER(e, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, em->bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(e, BM_ELEM_HIDDEN))
continue;
- if (BM_edge_face_count(e) != 0) {
- BM_elem_select_set(em->bm, e, FALSE);
+ if (!BM_edge_is_wire(e)) {
+ BM_edge_select_set(em->bm, e, FALSE);
}
}
EDBM_op_callf(em, wmop, "del geom=%hvef context=%i", BM_ELEM_SELECT, DEL_EDGES);
/* clean up any loose verts */
- BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(v, BM_ELEM_HIDDEN))
continue;
if (BM_vert_edge_count(v) != 0) {
- BM_elem_select_set(em->bm, v, FALSE);
+ BM_vert_select_set(em->bm, v, FALSE);
}
}
@@ -3171,13 +2826,41 @@ static int mesh_separate_selected(Main *bmain, Scene *scene, Base *editbase, wmO
BM_mesh_free(bm_new);
((Mesh *)basenew->object->data)->edit_btmesh = NULL;
- return 1;
+ return TRUE;
}
-//BMESH_TODO
-static int mesh_separate_material(Main *UNUSED(bmain), Scene *UNUSED(scene), Base *UNUSED(editbase), wmOperator *UNUSED(wmop))
+static int mesh_separate_material(Main *bmain, Scene *scene, Base *editbase, wmOperator *wmop)
{
- return 0;
+ BMFace *f_cmp, *f;
+ BMIter iter;
+ int result = FALSE;
+ Object *obedit = editbase->object;
+ BMEditMesh *em = BMEdit_FromObject(obedit);
+ BMesh *bm = em->bm;
+
+ EDBM_flag_disable_all(em, BM_ELEM_SELECT);
+
+ while ((f_cmp = BM_iter_at_index(bm, BM_FACES_OF_MESH, NULL, 0))) {
+ const short mat_nr = f_cmp->mat_nr;
+ int tot = 0;
+
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
+ if (f->mat_nr == mat_nr) {
+ BM_face_select_set(bm, f, TRUE);
+ tot++;
+ }
+ }
+
+ /* leave the current object with some materials */
+ if (tot == bm->totface) {
+ break;
+ }
+
+ /* Move selection into a separate object */
+ result |= mesh_separate_selected(bmain, scene, editbase, wmop);
+ }
+
+ return result;
}
static int mesh_separate_loose(Main *bmain, Scene *scene, Base *editbase, wmOperator *wmop)
@@ -3188,21 +2871,14 @@ static int mesh_separate_loose(Main *bmain, Scene *scene, Base *editbase, wmOper
BMVert *v_seed;
BMWalker walker;
BMIter iter;
- int result = 0;
+ int result = FALSE;
Object *obedit = editbase->object;
- Mesh *me = obedit->data;
- BMEditMesh *em = me->edit_btmesh;
+ BMEditMesh *em = BMEdit_FromObject(obedit);
BMesh *bm = em->bm;
int max_iter = bm->totvert;
/* Clear all selected vertices */
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
- BM_elem_select_set(bm, v, FALSE);
- }
-
- /* Flush the selection to clear edge/face selections to match
- * selected vertices */
- EDBM_selectmode_flush_ex(em, SCE_SELECT_VERTEX);
+ EDBM_flag_disable_all(em, BM_ELEM_SELECT);
/* A "while (true)" loop should work here as each iteration should
* select and remove at least one vertex and when all vertices
@@ -3212,7 +2888,7 @@ static int mesh_separate_loose(Main *bmain, Scene *scene, Base *editbase, wmOper
for (i = 0; i < max_iter; i++) {
/* Get a seed vertex to start the walk */
v_seed = NULL;
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
v_seed = v;
break;
}
@@ -3223,7 +2899,7 @@ static int mesh_separate_loose(Main *bmain, Scene *scene, Base *editbase, wmOper
}
/* Select the seed explicitly, in case it has no edges */
- BM_elem_select_set(bm, v_seed, TRUE);
+ BM_vert_select_set(bm, v_seed, TRUE);
/* Walk from the single vertex, selecting everything connected
* to it */
@@ -3234,8 +2910,8 @@ static int mesh_separate_loose(Main *bmain, Scene *scene, Base *editbase, wmOper
e = BMW_begin(&walker, v_seed);
for (; e; e = BMW_step(&walker)) {
- BM_elem_select_set(bm, e->v1, TRUE);
- BM_elem_select_set(bm, e->v2, TRUE);
+ BM_vert_select_set(bm, e->v1, TRUE);
+ BM_vert_select_set(bm, e->v2, TRUE);
}
BMW_end(&walker);
@@ -3811,7 +3487,7 @@ static int edbm_select_by_number_vertices_exec(bContext *C, wmOperator *op)
}
if (select) {
- BM_elem_select_set(em->bm, efa, TRUE);
+ BM_face_select_set(em->bm, efa, TRUE);
}
}
@@ -3859,7 +3535,7 @@ static int edbm_select_loose_verts_exec(bContext *C, wmOperator *UNUSED(op))
eve; eve = BM_iter_step(&iter)) {
if (!eve->e) {
- BM_elem_select_set(em->bm, eve, TRUE);
+ BM_vert_select_set(em->bm, eve, TRUE);
}
}
@@ -3867,7 +3543,7 @@ static int edbm_select_loose_verts_exec(bContext *C, wmOperator *UNUSED(op))
eed; eed = BM_iter_step(&iter)) {
if (!eed->l) {
- BM_elem_select_set(em->bm, eed, TRUE);
+ BM_edge_select_set(em->bm, eed, TRUE);
}
}
@@ -3923,15 +3599,18 @@ void MESH_OT_select_mirror(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "extend", 0, "Extend", "Extend the existing selection");
}
-#if 0 /* UNUSED */
/* qsort routines. not sure how to make these
* work, since we aren't using linked lists for
* geometry anymore. might need a sortof "swap"
* function for bmesh elements. */
+/* TODO All this section could probably use a refresh...
+ * face code works in object mode, does everything in one op, while vert uses several...
+ */
+
typedef struct xvertsort {
- float x;
- BMVert *v1;
+ int x; /* X screen-coordinate */
+ int org_idx; /* Original index of this vertex _in the mempool_ */
} xvertsort;
@@ -3939,11 +3618,13 @@ static int vergxco(const void *v1, const void *v2)
{
const xvertsort *x1 = v1, *x2 = v2;
- if (x1->x > x2->x) return 1;
- else if (x1->x < x2->x) return -1;
- return 0;
+ /* We move unchanged vertices (org_idx < 0) at the begining of the sorted list. */
+ if (x1->org_idx >= 0 && x2->org_idx >= 0)
+ return (x1->x > x2->x) - (x1->x < x2->x);
+ return (x2->org_idx < 0) - (x1->org_idx < 0);
}
+#if 0 /* Unused */
struct facesort {
uintptr_t x;
struct EditFace *efa;
@@ -3959,67 +3640,77 @@ static int vergface(const void *v1, const void *v2)
}
#endif
-// XXX is this needed?
-/* called from buttons */
-#if 0 /* UNUSED */
-static void xsortvert_flag__doSetX(void *userData, EditVert *UNUSED(eve), int x, int UNUSED(y), int index)
+static void xsortvert_flag__doSetX(void *userData, BMVert *UNUSED(eve), int x, int UNUSED(y), int index)
{
xvertsort *sortblock = userData;
sortblock[index].x = x;
}
-#endif
/* all verts with (flag & 'flag') are sorted */
-static void xsortvert_flag(bContext *UNUSED(C), int UNUSED(flag))
+static void xsortvert_flag(bContext *C, int flag)
{
- /* BMESH_TODO */
-#if 0 //hrm, geometry isn't in linked lists anymore. . .
ViewContext vc;
BMEditMesh *em;
- BMVert *eve;
+ BMVert *ve;
BMIter iter;
xvertsort *sortblock;
- ListBase tbase;
- int i, amount;
+ int *unchangedblock, *vmap;
+ int totvert, sorted = 0, unchanged = 0, i;
em_setup_viewcontext(C, &vc);
em = vc.em;
- amount = em->bm->totvert;
- sortblock = MEM_callocN(sizeof(xvertsort) * amount, "xsort");
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL)
- {
- if (BM_elem_flag_test(eve, BM_ELEM_SELECT))
- sortblock[i].v1 = eve;
+ totvert = em->bm->totvert;
+
+ sortblock = MEM_callocN(sizeof(xvertsort) * totvert, "xsort sorted");
+ /* Stores unchanged verts, will be reused as final old2new vert mapping... */
+ unchangedblock = MEM_callocN(sizeof(int) * totvert, "xsort unchanged");
+ BM_ITER_MESH_INDEX (ve, &iter, em->bm, BM_VERTS_OF_MESH, i) {
+ if (BM_elem_flag_test(ve, flag)) {
+ sortblock[i].org_idx = i;
+ sorted++;
+ }
+ else {
+ unchangedblock[unchanged++] = i;
+ sortblock[i].org_idx = -1;
+ }
}
-
+/* printf("%d verts: %d to be sorted, %d unchanged…\n", totvert, sorted, unchanged);*/
+ if (sorted == 0)
+ return;
+
ED_view3d_init_mats_rv3d(vc.obedit, vc.rv3d);
mesh_foreachScreenVert(&vc, xsortvert_flag__doSetX, sortblock, V3D_CLIP_TEST_OFF);
- qsort(sortblock, amount, sizeof(xvertsort), vergxco);
+ qsort(sortblock, totvert, sizeof(xvertsort), vergxco);
- /* make temporal listbase */
- tbase.first = tbase.last = 0;
- for (i = 0; i < amount; i++) {
- eve = sortblock[i].v1;
-
- if (eve) {
- BLI_remlink(&vc.em->verts, eve);
- BLI_addtail(&tbase, eve);
- }
+ /* Convert sortblock into an array mapping old idx to new. */
+ vmap = unchangedblock;
+ unchangedblock = NULL;
+ if (unchanged) {
+ unchangedblock = MEM_mallocN(sizeof(int) * unchanged, "xsort unchanged");
+ memcpy(unchangedblock, vmap, unchanged * sizeof(int));
+ }
+ for (i = totvert; i--; ) {
+ if (i < unchanged)
+ vmap[unchangedblock[i]] = i;
+ else
+ vmap[sortblock[i].org_idx] = i;
}
-
- BLI_movelisttolist(&vc.em->verts, &tbase);
MEM_freeN(sortblock);
-#endif
+ if (unchangedblock)
+ MEM_freeN(unchangedblock);
+
+ BM_mesh_remap(em->bm, vmap, NULL, NULL);
+ MEM_freeN(vmap);
}
static int edbm_vertices_sort_exec(bContext *C, wmOperator *UNUSED(op))
{
- xsortvert_flag(C, SELECT);
+ xsortvert_flag(C, BM_ELEM_SELECT);
return OPERATOR_FINISHED;
}
@@ -4067,8 +3758,8 @@ static int float_sort(const void *v1, const void *v2)
x1 = face_sort_floats[((int *) v1)[0]];
x2 = face_sort_floats[((int *) v2)[0]];
- if (x1 > x2) return 1;
- else if (x1 < x2) return -1;
+ if (x1 > x2) return 1;
+ else if (x1 < x2) return -1;
return 0;
}
@@ -4221,75 +3912,66 @@ void MESH_OT_sort_faces(wmOperatorType *ot)
ot->prop = RNA_def_enum(ot->srna, "type", type_items, 0, "Type", "");
}
-#if 0
-/* called from buttons */
-static void hashvert_flag(EditMesh *em, int flag)
-{
- /* switch vertex order using hash table */
- EditVert *eve;
- struct xvertsort *sortblock, *sb, onth, *newsort;
- ListBase tbase;
- int amount, a, b;
-
- /* count */
- eve = em->verts.first;
- amount = 0;
- while (eve) {
- if (eve->f & flag) amount++;
- eve = eve->next;
- }
- if (amount == 0) return;
-
- /* allocate memory */
- sb = sortblock = (struct xvertsort *)MEM_mallocN(sizeof(struct xvertsort) * amount, "sortremovedoub");
- eve = em->verts.first;
- while (eve) {
- if (eve->f & flag) {
- sb->v1 = eve;
- sb++;
+/* ******************************* Randomize verts ************************* */
+static void hashvert_flag(BMEditMesh *em, int flag, unsigned int seed)
+{
+ BMVert *ve;
+ BMIter iter;
+ char *block /* Just to mark protected vertices */, *t_blk;
+ int *randblock, *vmap, *t_idx, *r_idx;
+ int totvert, randomized = 0, /*protected = 0, */ i;
+
+ totvert = em->bm->totvert;
+
+ block = MEM_callocN(sizeof(char) * totvert, "randvert block");
+ randblock = MEM_callocN(sizeof(int) * totvert, "randvert randblock");
+ BM_ITER_MESH_INDEX (ve, &iter, em->bm, BM_VERTS_OF_MESH, i) {
+ if (BM_elem_flag_test(ve, flag)) {
+ block[i] = FALSE;
+ randblock[randomized++] = i;
}
- eve = eve->next;
- }
-
- BLI_srand(1);
-
- sb = sortblock;
- for (a = 0; a < amount; a++, sb++) {
- b = (int)(amount * BLI_drand());
- if (b >= 0 && b < amount) {
- newsort = sortblock + b;
- onth = *sb;
- *sb = *newsort;
- *newsort = onth;
+ else {
+ block[i] = TRUE;
}
}
+/* protected = totvert - randomized;*/
+/* printf("%d verts: %d to be randomized, %d protected…\n", totvert, randomized, protected);*/
+ if (randomized == 0)
+ return;
- /* make temporal listbase */
- tbase.first = tbase.last = 0;
- sb = sortblock;
- while (amount--) {
- eve = sb->v1;
- BLI_remlink(&em->verts, eve);
- BLI_addtail(&tbase, eve);
- sb++;
+
+ /* Randomize non-protected vertices indices, and create an array mapping old idx to new
+ * from both blocks, keeping protected vertices at the same indices. */
+ vmap = randblock;
+ randblock = MEM_mallocN(sizeof(int) * randomized, "randvert randblock");
+ memcpy(randblock, vmap, randomized * sizeof(int));
+ BLI_array_randomize((void *)randblock, sizeof(int), randomized, seed);
+ t_blk = block + totvert - 1;
+ t_idx = vmap + totvert - 1;
+ r_idx = randblock + randomized - 1;
+ for (i = totvert; i--; t_blk--, t_idx--) {
+ if (*t_blk) /* Protected! */
+ *t_idx = i;
+ else
+ *t_idx = *r_idx--;
}
- BLI_movelisttolist(&em->verts, &tbase);
+ MEM_freeN(randblock);
+ MEM_freeN(block);
- MEM_freeN(sortblock);
+ BM_mesh_remap(em->bm, vmap, NULL, NULL);
+ MEM_freeN(vmap);
}
-#endif
-static int edbm_vertices_randomize_exec(bContext *C, wmOperator *UNUSED(op))
+static int edbm_vertices_randomize_exec(bContext *C, wmOperator *op)
{
Object *obedit = CTX_data_edit_object(C);
BMEditMesh *em = BMEdit_FromObject(obedit);
-#if 1 /* BMESH TODO */
- (void)em;
-#else
- hashvert_flag(em, SELECT);
-#endif
+ unsigned int seed = RNA_int_get(op->ptr, "seed");
+
+ hashvert_flag(em, BM_ELEM_SELECT, seed);
+
return OPERATOR_FINISHED;
}
@@ -4307,6 +3989,9 @@ void MESH_OT_vertices_randomize(wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
+
+ /* Properties */
+ ot->prop = RNA_def_int(ot->srna, "seed", 0, 0, INT_MAX, "Seed", "Seed for the random generator", 0, 255);
}
/******end of qsort stuff ****/
@@ -4336,7 +4021,7 @@ static int edbm_noise_exec(bContext *C, wmOperator *op)
if (tex->type == TEX_STUCCI) {
float b2, vec[3];
float ofs = tex->turbul / 200.0;
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
b2 = BLI_hnoise(tex->noisesize, eve->co[0], eve->co[1], eve->co[2]);
if (tex->stype) ofs *= (b2 * b2);
@@ -4349,7 +4034,7 @@ static int edbm_noise_exec(bContext *C, wmOperator *op)
}
}
else {
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
float tin, dum;
externtex(ma->mtex[0], eve->co, &tin, &dum, &dum, &dum, &dum, 0);
@@ -4400,7 +4085,7 @@ static int edbm_bevel_exec(bContext *C, wmOperator *op)
BM_data_layer_add(em->bm, &em->bm->edata, CD_PROP_FLT);
li = CustomData_number_of_layers(&em->bm->edata, CD_PROP_FLT) - 1;
- BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
float d = len_v3v3(eed->v1->co, eed->v2->co);
float *dv = CustomData_bmesh_get_n(&em->bm->edata, eed->head.data, CD_PROP_FLT, li);
@@ -4515,13 +4200,16 @@ static int edbm_inset_exec(bContext *C, wmOperator *op)
const int use_boundary = RNA_boolean_get(op->ptr, "use_boundary");
const int use_even_offset = RNA_boolean_get(op->ptr, "use_even_offset");
const int use_relative_offset = RNA_boolean_get(op->ptr, "use_relative_offset");
- const float thickness = RNA_float_get(op->ptr, "thickness");
+ const float thickness = RNA_float_get(op->ptr, "thickness");
+ const float depth = RNA_float_get(op->ptr, "depth");
const int use_outset = RNA_boolean_get(op->ptr, "use_outset");
const int use_select_inset = RNA_boolean_get(op->ptr, "use_select_inset"); /* not passed onto the BMO */
EDBM_op_init(em, &bmop, op,
- "inset faces=%hf use_boundary=%b use_even_offset=%b use_relative_offset=%b thickness=%f use_outset=%b",
- BM_ELEM_SELECT, use_boundary, use_even_offset, use_relative_offset, thickness, use_outset);
+ "inset faces=%hf use_boundary=%b use_even_offset=%b use_relative_offset=%b "
+ "thickness=%f depth=%f use_outset=%b",
+ BM_ELEM_SELECT, use_boundary, use_even_offset, use_relative_offset,
+ thickness, depth, use_outset);
BMO_op_exec(em->bm, &bmop);
@@ -4553,11 +4241,11 @@ void MESH_OT_inset(wmOperatorType *ot)
/* identifiers */
ot->name = "Inset Faces";
ot->idname = "MESH_OT_inset";
+ ot->description = "Inset new faces into selected faces";
/* api callbacks */
ot->exec = edbm_inset_exec;
ot->poll = ED_operator_editmesh;
- ot->description = "";
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -4567,9 +4255,11 @@ void MESH_OT_inset(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "use_even_offset", TRUE, "Offset Even", "Scale the offset to give more even thickness");
RNA_def_boolean(ot->srna, "use_relative_offset", FALSE, "Offset Relative", "Scale the offset by surrounding geometry");
- prop = RNA_def_float(ot->srna, "thickness", 0.01f, 0.0f, FLT_MAX, "thickness", "", 0.0f, 10.0f);
+ prop = RNA_def_float(ot->srna, "thickness", 0.01f, 0.0f, FLT_MAX, "Thickness", "", 0.0f, 10.0f);
/* use 1 rather then 10 for max else dragging the button moves too far */
RNA_def_property_ui_range(prop, 0.0, 1.0, 0.01, 4);
+ prop = RNA_def_float(ot->srna, "depth", 0.0f, -FLT_MAX, FLT_MAX, "Depth", "", -10.0f, 10.0f);
+ RNA_def_property_ui_range(prop, -10.0f, 10.0f, 0.01, 4);
RNA_def_boolean(ot->srna, "use_outset", FALSE, "Outset", "Outset rather than inset");
RNA_def_boolean(ot->srna, "use_select_inset", TRUE, "Select Outer", "Select the new inset faces");
@@ -4592,13 +4282,13 @@ static int edbm_mark_freestyle_edge(bContext *C, wmOperator *op)
}
if (clear) {
- BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(eed, BM_ELEM_SELECT) && !BM_elem_flag_test(eed, BM_ELEM_HIDDEN))
BM_elem_flag_disable(eed, BM_ELEM_FREESTYLE);
}
}
else {
- BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(eed, BM_ELEM_SELECT) && !BM_elem_flag_test(eed, BM_ELEM_HIDDEN))
BM_elem_flag_enable(eed, BM_ELEM_FREESTYLE);
}
@@ -4644,12 +4334,12 @@ static int edbm_mark_freestyle_face_exec(bContext *C, wmOperator *op)
}
if(clear) {
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(efa, BM_ELEM_SELECT) && !BM_elem_flag_test(efa, BM_ELEM_HIDDEN))
BM_elem_flag_disable(efa, BM_ELEM_FREESTYLE);
}
} else {
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(efa, BM_ELEM_SELECT) && !BM_elem_flag_test(efa, BM_ELEM_HIDDEN))
BM_elem_flag_enable(efa, BM_ELEM_FREESTYLE);
}
diff --git a/source/blender/editors/mesh/editmesh_utils.c b/source/blender/editors/mesh/editmesh_utils.c
index 56c7fae0029..468f5699bce 100644
--- a/source/blender/editors/mesh/editmesh_utils.c
+++ b/source/blender/editors/mesh/editmesh_utils.c
@@ -313,7 +313,6 @@ void EDBM_mesh_load(Object *ob)
#ifdef USE_TESSFACE_DEFAULT
BKE_mesh_tessface_calc(me);
#endif
-
}
void EDBM_mesh_free(BMEditMesh *tm)
@@ -517,7 +516,6 @@ static void *getEditMesh(bContext *C)
typedef struct UndoMesh {
Mesh me;
int selectmode;
- char obname[MAX_ID_NAME - 2];
} UndoMesh;
/* undo simply makes copies of a bmesh */
@@ -527,7 +525,6 @@ static void *editbtMesh_to_undoMesh(void *emv, void *obdata)
Mesh *obme = obdata;
UndoMesh *um = MEM_callocN(sizeof(UndoMesh), "undo Mesh");
- BLI_strncpy(um->obname, em->ob->id.name + 2, sizeof(um->obname));
/* make sure shape keys work */
um->me.key = obme->key ? copy_key_nolib(obme->key) : NULL;
@@ -544,12 +541,10 @@ static void *editbtMesh_to_undoMesh(void *emv, void *obdata)
static void undoMesh_to_editbtMesh(void *umv, void *em_v, void *UNUSED(obdata))
{
BMEditMesh *em = em_v, *em_tmp;
- Object *ob;
+ Object *ob = em->ob;
UndoMesh *um = umv;
BMesh *bm;
- /* BMESH_TODO - its possible the name wont be found right?, should fallback */
- ob = (Object *)find_id("OB", um->obname);
ob->shapenr = em->bm->shapenr;
BMEdit_Free(em);
@@ -619,7 +614,7 @@ UvVertMap *EDBM_uv_vert_map_create(BMEditMesh *em, int selected, int do_face_idx
totuv = 0;
/* generate UvMapVert array */
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!selected || ((!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) && BM_elem_flag_test(efa, BM_ELEM_SELECT)))
totuv += efa->len;
}
@@ -647,10 +642,10 @@ UvVertMap *EDBM_uv_vert_map_create(BMEditMesh *em, int selected, int do_face_idx
}
a = 0;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!selected || ((!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) && BM_elem_flag_test(efa, BM_ELEM_SELECT))) {
i = 0;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
buf->tfindex = i;
buf->f = a;
buf->separate = 0;
@@ -668,7 +663,7 @@ UvVertMap *EDBM_uv_vert_map_create(BMEditMesh *em, int selected, int do_face_idx
/* sort individual uvs for each vert */
a = 0;
- BM_ITER(ev, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (ev, &iter, em->bm, BM_VERTS_OF_MESH) {
UvMapVert *newvlist = NULL, *vlist = vmap->vert[a];
UvMapVert *iterv, *v, *lastv, *next;
float *uv, *uv2, uvdiff[2];
@@ -767,7 +762,7 @@ UvElementMap *EDBM_uv_element_map_create(BMEditMesh *em, int selected, int do_is
}
/* generate UvElement array */
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!selected || ((!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) && BM_elem_flag_test(efa, BM_ELEM_SELECT)))
totuv += efa->len;
}
@@ -792,10 +787,10 @@ UvElementMap *EDBM_uv_element_map_create(BMEditMesh *em, int selected, int do_is
}
j = 0;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
island_number[j++] = INVALID_ISLAND;
if (!selected || ((!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) && BM_elem_flag_test(efa, BM_ELEM_SELECT))) {
- BM_ITER_INDEX(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa, i) {
+ BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
buf->l = l;
buf->face = efa;
buf->separate = 0;
@@ -812,7 +807,7 @@ UvElementMap *EDBM_uv_element_map_create(BMEditMesh *em, int selected, int do_is
/* sort individual uvs for each vert */
i = 0;
- BM_ITER(ev, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (ev, &iter, em->bm, BM_VERTS_OF_MESH) {
UvElement *newvlist = NULL, *vlist = element_map->vert[i];
UvElement *iterv, *v, *lastv, *next;
float *uv, *uv2, uvdiff[2];
@@ -876,7 +871,7 @@ UvElementMap *EDBM_uv_element_map_create(BMEditMesh *em, int selected, int do_is
while (stacksize > 0) {
efa = stack[--stacksize];
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
UvElement *element, *initelement = element_map->vert[BM_elem_index_get(l->v)];
for (element = initelement; element; element = element->next) {
@@ -1024,7 +1019,7 @@ static BMVert *cache_mirr_intptr_as_bmvert(intptr_t *index_lookup, int index)
* EDBM_verts_mirror_cache_begin(em);
* ...
* ...
- * BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ * BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) {
* mirrorv = EDBM_verts_mirror_get(em, v);
* }
* ...
@@ -1076,7 +1071,7 @@ void EDBM_verts_mirror_cache_begin(BMEditMesh *em, const short use_select)
tree = BMBVH_NewBVH(em, 0, NULL, NULL);
}
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
/* temporary for testing, check for selection */
if (use_select && !BM_elem_flag_test(v, BM_ELEM_SELECT)) {
@@ -1164,7 +1159,7 @@ void EDBM_verts_mirror_apply(BMEditMesh *em, const int sel_from, const int sel_t
BLI_assert(em->vert_index != NULL);
- BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(v, BM_ELEM_SELECT) == sel_from) {
BMVert *mirr = EDBM_verts_mirror_get(em, v);
if (mirr) {
@@ -1194,7 +1189,7 @@ void EDBM_mesh_hide(BMEditMesh *em, int swap)
else
itermode = BM_FACES_OF_MESH;
- BM_ITER(ele, &iter, em->bm, itermode, NULL) {
+ BM_ITER_MESH (ele, &iter, em->bm, itermode) {
if (BM_elem_flag_test(ele, BM_ELEM_SELECT) ^ swap)
BM_elem_hide_set(em->bm, ele, TRUE);
}
@@ -1228,7 +1223,7 @@ void EDBM_mesh_reveal(BMEditMesh *em)
/* Use tag flag to remember what was hidden before all is revealed.
* BM_ELEM_HIDDEN --> BM_ELEM_TAG */
for (i = 0; i < 3; i++) {
- BM_ITER(ele, &iter, em->bm, iter_types[i], NULL) {
+ BM_ITER_MESH (ele, &iter, em->bm, iter_types[i]) {
BM_elem_flag_set(ele, BM_ELEM_TAG, BM_elem_flag_test(ele, BM_ELEM_HIDDEN));
}
}
@@ -1242,7 +1237,7 @@ void EDBM_mesh_reveal(BMEditMesh *em)
continue;
}
- BM_ITER(ele, &iter, em->bm, iter_types[i], NULL) {
+ BM_ITER_MESH (ele, &iter, em->bm, iter_types[i]) {
if (BM_elem_flag_test(ele, BM_ELEM_TAG)) {
BM_elem_select_set(em->bm, ele, TRUE);
}
@@ -1275,9 +1270,9 @@ void EDBM_update_generic(bContext *C, BMEditMesh *em, const short do_tessface)
* need (at the moment) to wrap them, but on the other hand having these
* wrapped avoids a confusing mess of mixing BM_ and EDBM_ namespaces. */
-void EDBM_editselection_center(BMEditMesh *em, float *center, BMEditSelection *ese)
+void EDBM_editselection_center(float *center, BMEditSelection *ese)
{
- BM_editselection_center(em->bm, center, ese);
+ BM_editselection_center(center, ese);
}
void EDBM_editselection_normal(float *normal, BMEditSelection *ese)
diff --git a/source/blender/editors/mesh/mesh_data.c b/source/blender/editors/mesh/mesh_data.c
index 69aeee48a4b..d1fb437e114 100644
--- a/source/blender/editors/mesh/mesh_data.c
+++ b/source/blender/editors/mesh/mesh_data.c
@@ -199,7 +199,7 @@ static void editmesh_face_copy_customdata(BMEditMesh *em, int type, int index)
const int n = CustomData_get_active_layer(pdata, type);
/* ensure all current elements follow new customdata layout */
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
void *data = CustomData_bmesh_get_n(pdata, efa->head.data, type, n);
CustomData_bmesh_set_n(pdata, efa->head.data, type, index, data);
}
@@ -217,8 +217,8 @@ static void editmesh_loop_copy_customdata(BMEditMesh *em, int type, int index)
const int n = CustomData_get_active_layer(ldata, type);
/* ensure all current elements follow new customdata layout */
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
- BM_ITER(loop, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
+ BM_ITER_ELEM (loop, &liter, efa, BM_LOOPS_OF_FACE) {
void *data = CustomData_bmesh_get_n(ldata, loop->head.data, type, n);
CustomData_bmesh_set_n(ldata, loop->head.data, type, index, data);
}
@@ -245,12 +245,12 @@ int ED_mesh_uv_loop_reset_ex(struct bContext *C, struct Mesh *me, const int laye
BLI_assert(CustomData_has_layer(&em->bm->ldata, CD_MLOOPUV));
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_SELECT))
continue;
i = 0;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get_n(&em->bm->ldata, l->head.data, CD_MLOOPUV, layernum);
BLI_array_append(uvs, luv->uv);
i++;
@@ -816,12 +816,9 @@ void ED_mesh_update(Mesh *mesh, bContext *C, int calc_edges, int calc_tessface)
/* would only be converting back again, don't bother */
tessface_input = TRUE;
-
- /* it also happens that converting the faces calculates edges, skip this */
- calc_edges = FALSE;
}
- if (calc_edges || (mesh->totpoly && mesh->totedge == 0))
+ if (calc_edges || ((mesh->totpoly || mesh->totface) && mesh->totedge == 0))
BKE_mesh_calc_edges(mesh, calc_edges);
if (calc_tessface) {
diff --git a/source/blender/editors/mesh/mesh_intern.h b/source/blender/editors/mesh/mesh_intern.h
index a4ede97984a..33e08beeb16 100644
--- a/source/blender/editors/mesh/mesh_intern.h
+++ b/source/blender/editors/mesh/mesh_intern.h
@@ -211,7 +211,7 @@ void MESH_OT_extrude_faces_indiv(struct wmOperatorType *ot);
void MESH_OT_edgering_select(struct wmOperatorType *ot);
void MESH_OT_loopcut(struct wmOperatorType *ot);
-void MESH_OT_knifetool(struct wmOperatorType *ot);
+void MESH_OT_knife_tool(struct wmOperatorType *ot);
void MESH_OT_bevel(struct wmOperatorType *ot);
void MESH_OT_bridge_edge_loops(struct wmOperatorType *ot);
diff --git a/source/blender/editors/mesh/mesh_navmesh.c b/source/blender/editors/mesh/mesh_navmesh.c
index f1b0a82b654..71aaacb7e49 100644
--- a/source/blender/editors/mesh/mesh_navmesh.c
+++ b/source/blender/editors/mesh/mesh_navmesh.c
@@ -345,6 +345,7 @@ static Object *createRepresentation(bContext *C, struct recast_polyMesh *pmesh,
/* create custom data layer to save polygon idx */
CustomData_add_layer_named(&em->bm->pdata, CD_RECAST, CD_CALLOC, NULL, 0, "createRepresentation recastData");
+ CustomData_bmesh_init_pool(&em->bm->pdata, 0, BM_FACE);
/* create verts and faces for detailed mesh */
meshes = recast_polyMeshDetailGetMeshes(dmesh, &nmeshes);
@@ -499,7 +500,7 @@ static int navmesh_face_copy_exec(bContext *C, wmOperator *op)
if (targetPolyIdx > 0) {
/* set target poly idx to other selected faces */
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(efa, BM_ELEM_SELECT) && efa != efa_act) {
int *recastDataBlock = (int *)CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_RECAST);
*recastDataBlock = targetPolyIdx;
@@ -548,7 +549,7 @@ static int findFreeNavPolyIndex(BMEditMesh *em)
int i, idx = em->bm->totface - 1, freeIdx = 1;
/*XXX this originally went last to first, but that isn't possible anymore*/
- BM_ITER(ef, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (ef, &iter, em->bm, BM_FACES_OF_MESH) {
int polyIdx = *(int *)CustomData_bmesh_get(&em->bm->pdata, ef->head.data, CD_RECAST);
indices[idx] = polyIdx;
idx--;
@@ -584,7 +585,7 @@ static int navmesh_face_add_exec(bContext *C, wmOperator *UNUSED(op))
/* set target poly idx to selected faces */
/*XXX this originally went last to first, but that isn't possible anymore*/
- BM_ITER(ef, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (ef, &iter, em->bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(ef, BM_ELEM_SELECT)) {
int *recastDataBlock = (int *)CustomData_bmesh_get(&em->bm->pdata, ef->head.data, CD_RECAST);
*recastDataBlock = targetPolyIdx;
diff --git a/source/blender/editors/mesh/mesh_ops.c b/source/blender/editors/mesh/mesh_ops.c
index 984a1d1d56e..d9de024af0f 100644
--- a/source/blender/editors/mesh/mesh_ops.c
+++ b/source/blender/editors/mesh/mesh_ops.c
@@ -158,7 +158,7 @@ void ED_operatortypes_mesh(void)
WM_operatortype_append(MESH_OT_select_nth);
WM_operatortype_append(MESH_OT_vert_connect);
WM_operatortype_append(MESH_OT_vert_slide);
- WM_operatortype_append(MESH_OT_knifetool);
+ WM_operatortype_append(MESH_OT_knife_tool);
WM_operatortype_append(MESH_OT_bevel);
@@ -349,8 +349,13 @@ void ED_keymap_mesh(wmKeyConfig *keyconf)
WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_delete", XKEY, KM_PRESS, 0, 0);
WM_keymap_add_menu(keymap, "VIEW3D_MT_edit_mesh_delete", DELKEY, KM_PRESS, 0, 0);
- WM_keymap_add_item(keymap, "MESH_OT_knifetool", KKEY, KM_PRESS, 0, 0);
- //RNA_enum_set(WM_keymap_add_item(keymap, "MESH_OT_knife_cut", LEFTMOUSE, KM_PRESS, KM_SHIFT, KKEY)->ptr, "type", 2/*KNIFE_MIDPOINT*/);
+ kmi = WM_keymap_add_item(keymap, "MESH_OT_knife_tool", KKEY, KM_PRESS, 0, 0);
+ RNA_boolean_set(kmi->ptr, "use_occlude_geometry", TRUE);
+ RNA_boolean_set(kmi->ptr, "only_select", FALSE);
+
+ kmi = WM_keymap_add_item(keymap, "MESH_OT_knife_tool", KKEY, KM_PRESS, KM_SHIFT, 0);
+ RNA_boolean_set(kmi->ptr, "use_occlude_geometry", FALSE);
+ RNA_boolean_set(kmi->ptr, "only_select", TRUE);
WM_keymap_add_item(keymap, "OBJECT_OT_vertex_parent_set", PKEY, KM_PRESS, KM_CTRL, 0);
diff --git a/source/blender/editors/mesh/meshtools.c b/source/blender/editors/mesh/meshtools.c
index 87640c9d419..7c02f26dbdc 100644
--- a/source/blender/editors/mesh/meshtools.c
+++ b/source/blender/editors/mesh/meshtools.c
@@ -803,8 +803,7 @@ intptr_t mesh_octree_table(Object *ob, BMEditMesh *em, float *co, char mode)
BMIter iter;
BMVert *eve;
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL)
- {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
DO_MINMAX(eve->co, min, max);
}
}
@@ -841,8 +840,7 @@ intptr_t mesh_octree_table(Object *ob, BMEditMesh *em, float *co, char mode)
BMVert *eve;
BMIter iter;
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL)
- {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
mesh_octree_add_nodes(MeshOctree.table, eve->co, MeshOctree.offs, MeshOctree.div, (intptr_t)(eve));
}
}
@@ -955,8 +953,7 @@ static BMVert *editbmesh_get_x_mirror_vert_topo(Object *ob, struct BMEditMesh *e
BMVert *v;
index = 0;
- BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL)
- {
+ BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) {
if (v == eve)
break;
index++;
@@ -1018,16 +1015,14 @@ static float *editmesh_get_mirror_uv(BMEditMesh *em, int axis, float *uv, float
BMIter iter;
BMFace *efa;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL)
- {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
poly_uv_center(em, efa, cent);
if ( (fabs(cent[0] - cent_vec[0]) < 0.001) && (fabs(cent[1] - cent_vec[1]) < 0.001) ) {
BMIter liter;
BMLoop *l;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa)
- {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
MLoopUV *luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if ( (fabs(luv->uv[0] - vec[0]) < 0.001) && (fabs(luv->uv[1] - vec[1]) < 0.001) ) {
return luv->uv;
diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c
index 4e967b6791b..ef428b5b1b7 100644
--- a/source/blender/editors/object/object_hook.c
+++ b/source/blender/editors/object/object_hook.c
@@ -78,7 +78,7 @@ static int return_editmesh_indexar(BMEditMesh *em, int *tot, int **indexar, floa
BMIter iter;
int *index, nr, totvert=0;
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) totvert++;
}
if (totvert==0) return 0;
@@ -88,7 +88,7 @@ static int return_editmesh_indexar(BMEditMesh *em, int *tot, int **indexar, floa
nr= 0;
zero_v3(cent);
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
*index= nr; index++;
add_v3_v3(cent, eve->co);
@@ -114,7 +114,7 @@ static int return_editmesh_vgroup(Object *obedit, BMEditMesh *em, char *name, fl
BMIter iter;
/* find the vertices */
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
dvert= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
if (dvert) {
@@ -146,9 +146,9 @@ static void select_editbmesh_hook(Object *ob, HookModifierData *hmd)
if (hmd->indexar == NULL)
return;
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (nr==hmd->indexar[index]) {
- BM_elem_select_set(em->bm, eve, TRUE);
+ BM_vert_select_set(em->bm, eve, TRUE);
if (index < hmd->totindex-1) index++;
}
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index 57d0de522a1..7ee57dd78d3 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -137,7 +137,7 @@ static int vertex_parent_set_exec(bContext *C, wmOperator *op)
* so re-create it here */
makeDerivedMesh(scene, obedit, em, CD_MASK_BAREMESH, 0);
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
if (v1==0) v1= nr;
else if (v2==0) v2= nr;
diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c
index 474d10ffbd8..55954790687 100644
--- a/source/blender/editors/object/object_transform.c
+++ b/source/blender/editors/object/object_transform.c
@@ -687,7 +687,7 @@ static int object_origin_set_exec(bContext *C, wmOperator *op)
mul_m4_v3(obedit->imat, cent);
}
else {
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (around==V3D_CENTROID) {
total++;
add_v3_v3(cent, eve->co);
@@ -700,7 +700,7 @@ static int object_origin_set_exec(bContext *C, wmOperator *op)
}
}
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
sub_v3_v3(eve->co, cent);
}
diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
index e4b8e21c13a..eb380700a61 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -206,14 +206,14 @@ static int ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_to
i = 0;
if (use_vert_sel) {
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
(*dvert_arr)[i] = BM_elem_flag_test(eve, BM_ELEM_SELECT) ?
CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT) : NULL;
i++;
}
}
else {
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
(*dvert_arr)[i] = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
i++;
}
@@ -593,11 +593,11 @@ static void vgroup_select_verts(Object *ob, int select)
BMIter iter;
BMVert *eve;
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
dv= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
if (defvert_find_index(dv, def_nr)) {
- BM_elem_select_set(em->bm, eve, select);
+ BM_vert_select_set(em->bm, eve, select);
}
}
}
@@ -1296,7 +1296,7 @@ static void vgroup_blend(Object *ob, const float fac)
vg_users = MEM_callocN(sizeof(int) * dvert_tot, "vgroup_blend_i");
if (bm) {
- BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
sel1 = BM_elem_flag_test(eed->v1, BM_ELEM_SELECT);
sel2 = BM_elem_flag_test(eed->v2, BM_ELEM_SELECT);
@@ -1322,7 +1322,7 @@ static void vgroup_blend(Object *ob, const float fac)
}
}
- BM_ITER_INDEX(eve, &iter, bm, BM_VERTS_OF_MESH, NULL, i) {
+ BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT) && vg_users[i] > 0) {
dv = CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_MDEFORMVERT);
@@ -1571,7 +1571,7 @@ void ED_vgroup_mirror(Object *ob, const short mirror_weights, const short flip_v
EDBM_verts_mirror_cache_begin(em, FALSE);
/* Go through the list of editverts and assign them */
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if ((eve_mirr= EDBM_verts_mirror_get(em, eve))) {
sel= BM_elem_flag_test(eve, BM_ELEM_SELECT);
sel_mirr= BM_elem_flag_test(eve_mirr, BM_ELEM_SELECT);
@@ -1796,7 +1796,7 @@ static void vgroup_active_remove_verts(Object *ob, const int allverts, bDeformGr
BMVert *eve;
BMIter iter;
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
dv= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
if (dv && dv->dw && (allverts || BM_elem_flag_test(eve, BM_ELEM_SELECT))) {
@@ -1866,7 +1866,7 @@ static void vgroup_delete_edit_mode(Object *ob, bDeformGroup *dg)
BMVert *eve;
MDeformVert *dvert;
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
dvert= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
if (dvert)
@@ -1998,7 +1998,7 @@ static void vgroup_assign_verts(Object *ob, const float weight)
BM_data_layer_add(em->bm, &em->bm->vdata, CD_MDEFORMVERT);
/* Go through the list of editverts and assign them */
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
MDeformWeight *dw;
dv= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT); /* can be NULL */
@@ -2855,7 +2855,7 @@ static int vgroup_do_remap(Object *ob, char *name_array, wmOperator *op)
BMIter iter;
BMVert *eve;
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
dvert= CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
if (dvert && dvert->totweight) {
defvert_remap(dvert, sort_map, defbase_tot);
diff --git a/source/blender/editors/physics/physics_fluid.c b/source/blender/editors/physics/physics_fluid.c
index 6a074a542c3..20fa4c5753f 100644
--- a/source/blender/editors/physics/physics_fluid.c
+++ b/source/blender/editors/physics/physics_fluid.c
@@ -98,19 +98,7 @@
static float get_fluid_viscosity(FluidsimSettings *settings)
{
- switch (settings->viscosityMode) {
- case 0: /* unused */
- return -1.0;
- case 2: /* water */
- return 1.0e-6;
- case 3: /* some (thick) oil */
- return 5.0e-5;
- case 4: /* ca. honey */
- return 2.0e-3;
- case 1: /* manual */
- default:
- return (1.0f/powf(10.0f, settings->viscosityExponent)) * settings->viscosityValue;
- }
+ return (1.0f/powf(10.0f, settings->viscosityExponent)) * settings->viscosityValue;
}
static float get_fluid_rate(FluidsimSettings *settings)
diff --git a/source/blender/editors/render/render_shading.c b/source/blender/editors/render/render_shading.c
index 1153f7023b2..89a8c7b0852 100644
--- a/source/blender/editors/render/render_shading.c
+++ b/source/blender/editors/render/render_shading.c
@@ -174,8 +174,7 @@ static int material_slot_assign_exec(bContext *C, wmOperator *UNUSED(op))
BMIter iter;
if (em) {
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL)
- {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(efa, BM_ELEM_SELECT))
efa->mat_nr = ob->actcol - 1;
}
diff --git a/source/blender/editors/sculpt_paint/paint_image.c b/source/blender/editors/sculpt_paint/paint_image.c
index 18f3094fa31..9f7cc7a75b1 100644
--- a/source/blender/editors/sculpt_paint/paint_image.c
+++ b/source/blender/editors/sculpt_paint/paint_image.c
@@ -41,8 +41,9 @@
#include "MEM_guardedalloc.h"
#ifdef WIN32
-#include "BLI_winstuff.h"
+# include "BLI_winstuff.h"
#endif
+
#include "BLI_math.h"
#include "BLI_blenlib.h"
#include "BLI_dynstr.h"
diff --git a/source/blender/editors/sculpt_paint/paint_utils.c b/source/blender/editors/sculpt_paint/paint_utils.c
index 6a31e96b51b..89a46272a8f 100644
--- a/source/blender/editors/sculpt_paint/paint_utils.c
+++ b/source/blender/editors/sculpt_paint/paint_utils.c
@@ -388,8 +388,6 @@ void BRUSH_OT_curve_preset(wmOperatorType *ot)
ot->exec = brush_curve_preset_exec;
ot->poll = brush_curve_preset_poll;
- ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
-
RNA_def_enum(ot->srna, "shape", prop_shape_items, CURVE_PRESET_SMOOTH, "Mode", "");
}
diff --git a/source/blender/editors/sculpt_paint/paint_vertex.c b/source/blender/editors/sculpt_paint/paint_vertex.c
index 1aeaad1bfab..aad0a778d4b 100644
--- a/source/blender/editors/sculpt_paint/paint_vertex.c
+++ b/source/blender/editors/sculpt_paint/paint_vertex.c
@@ -2770,9 +2770,7 @@ static void vpaint_paint_face(VPaint *vp, VPaintData *vpd, Object *ob,
static void vpaint_paint_poly(VPaint *vp, VPaintData *vpd, Object *ob,
const unsigned int index, const float mval[2],
- const float brush_size_pressure, const float brush_alpha_pressure,
- int UNUSED(flip)
- )
+ const float brush_size_pressure, const float brush_alpha_pressure)
{
ViewContext *vc = &vpd->vc;
Brush *brush = paint_brush(&vp->paint);
@@ -2871,7 +2869,7 @@ static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
Mesh *me = ob->data;
float mat[4][4];
int *indexar = vpd->indexar;
- int totindex, index, flip;
+ int totindex, index;
float mval[2];
const float pressure = RNA_float_get(itemptr, "pressure");
@@ -2879,9 +2877,6 @@ static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
const float brush_alpha_pressure = brush_alpha(scene, brush) * (brush_use_alpha_pressure(scene, brush) ? pressure : 1.0f);
RNA_float_get_array(itemptr, "mouse", mval);
- flip = RNA_boolean_get(itemptr, "pen_flip");
-
- (void)flip; /* BMESH_TODO */
view3d_operator_needs_opengl(C);
@@ -2932,7 +2927,7 @@ static void vpaint_stroke_update_step(bContext *C, struct PaintStroke *stroke, P
for (index = 0; index < totindex; index++) {
if (indexar[index] && indexar[index] <= me->totpoly) {
- vpaint_paint_poly(vp, vpd, ob, indexar[index] - 1, mval, brush_size_pressure, brush_alpha_pressure, flip);
+ vpaint_paint_poly(vp, vpd, ob, indexar[index] - 1, mval, brush_size_pressure, brush_alpha_pressure);
}
}
diff --git a/source/blender/editors/sculpt_paint/sculpt_uv.c b/source/blender/editors/sculpt_paint/sculpt_uv.c
index 2a0118f9c24..4b866c3c9c3 100644
--- a/source/blender/editors/sculpt_paint/sculpt_uv.c
+++ b/source/blender/editors/sculpt_paint/sculpt_uv.c
@@ -594,8 +594,8 @@ static UvSculptData *uv_sculpt_stroke_init(bContext *C, wmOperator *op, wmEvent
/* Now, on to generate our uv connectivity data */
counter = 0;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
int offset1, itmp1 = uv_element_offset_from_face_get(data->elementMap, efa, l, island_index, do_island_optimization);
int offset2, itmp2 = uv_element_offset_from_face_get(data->elementMap, efa, l->next, island_index, do_island_optimization);
diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c
index f7598045f81..b50c3f11534 100644
--- a/source/blender/editors/sound/sound_ops.c
+++ b/source/blender/editors/sound/sound_ops.c
@@ -283,8 +283,7 @@ static int sound_bake_animation_exec(bContext *C, wmOperator *UNUSED(op))
sound_update_animation_flags_exec(C, NULL);
- for (cfra = scene->r.sfra > 0 ? scene->r.sfra - 1 : 0; cfra <= scene->r.efra + 1; cfra++)
- {
+ for (cfra = (scene->r.sfra > 0) ? (scene->r.sfra - 1) : 0; cfra <= scene->r.efra + 1; cfra++) {
scene->r.cfra = cfra;
scene_update_for_newframe(bmain, scene, scene->lay);
}
diff --git a/source/blender/editors/space_clip/tracking_ops.c b/source/blender/editors/space_clip/tracking_ops.c
index 79569b82476..35986fa2700 100644
--- a/source/blender/editors/space_clip/tracking_ops.c
+++ b/source/blender/editors/space_clip/tracking_ops.c
@@ -2433,7 +2433,7 @@ void CLIP_OT_set_plane(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_enum(ot->srna, "plane", plane_items, 0, "Plane", "Plane to be sued for orientation");
+ RNA_def_enum(ot->srna, "plane", plane_items, 0, "Plane", "Plane to be used for orientation");
}
/********************** set axis operator *********************/
@@ -3517,8 +3517,10 @@ void CLIP_OT_clean_tracks(wmOperatorType *ot)
ot->flag = OPTYPE_REGISTER|OPTYPE_UNDO;
/* properties */
- RNA_def_int(ot->srna, "frames", 0, 0, INT_MAX, "Tracked Frames", "Effect on tracks which are tracked less than specified amount of frames", 0, INT_MAX);
- RNA_def_float(ot->srna, "error", 0.0f, 0.0f, FLT_MAX, "Reprojection Error", "Effect on tracks with have got larger re-projection error", 0.0f, 100.0f);
+ RNA_def_int(ot->srna, "frames", 0, 0, INT_MAX, "Tracked Frames",
+ "Effect on tracks which are tracked less than specified amount of frames", 0, INT_MAX);
+ RNA_def_float(ot->srna, "error", 0.0f, 0.0f, FLT_MAX, "Reprojection Error",
+ "Effect on tracks which have got larger re-projection error", 0.0f, 100.0f);
RNA_def_enum(ot->srna, "action", actions_items, 0, "Action", "Cleanup action to execute");
}
diff --git a/source/blender/editors/space_console/space_console.c b/source/blender/editors/space_console/space_console.c
index b71ca6c36c4..39757aa393a 100644
--- a/source/blender/editors/space_console/space_console.c
+++ b/source/blender/editors/space_console/space_console.c
@@ -28,7 +28,7 @@
#include <stdio.h>
#ifdef WIN32
-#include "BLI_winstuff.h"
+# include "BLI_winstuff.h"
#endif
#include "MEM_guardedalloc.h"
diff --git a/source/blender/editors/space_file/file_draw.c b/source/blender/editors/space_file/file_draw.c
index 4d764bff311..516f6532c4a 100644
--- a/source/blender/editors/space_file/file_draw.c
+++ b/source/blender/editors/space_file/file_draw.c
@@ -35,8 +35,9 @@
#include "BLI_blenlib.h"
#include "BLI_utildefines.h"
#include "BLI_dynstr.h"
+
#ifdef WIN32
-#include "BLI_winstuff.h"
+# include "BLI_winstuff.h"
#endif
#include "BIF_gl.h"
@@ -223,11 +224,11 @@ void file_draw_buttons(const bContext *C, ARegion *ar)
/* Execute / cancel buttons. */
if (loadbutton) {
-
- uiDefButO(block, BUT, "FILE_OT_execute", WM_OP_EXEC_REGION_WIN, IFACE_(params->title),
- max_x - loadbutton, line1_y, loadbutton, btn_h, TIP_(params->title));
+ /* params->title is already translated! */
+ uiDefButO(block, BUT, "FILE_OT_execute", WM_OP_EXEC_REGION_WIN, params->title,
+ max_x - loadbutton, line1_y, loadbutton, btn_h, "");
uiDefButO(block, BUT, "FILE_OT_cancel", WM_OP_EXEC_REGION_WIN, IFACE_("Cancel"),
- max_x - loadbutton, line2_y, loadbutton, btn_h, TIP_("Cancel"));
+ max_x - loadbutton, line2_y, loadbutton, btn_h, "");
}
uiEndBlock(C, block);
diff --git a/source/blender/editors/space_file/file_ops.c b/source/blender/editors/space_file/file_ops.c
index 62b7aafb187..eb706dcca75 100644
--- a/source/blender/editors/space_file/file_ops.c
+++ b/source/blender/editors/space_file/file_ops.c
@@ -37,8 +37,9 @@
#include "BLI_blenlib.h"
#include "BLI_utildefines.h"
+
#ifdef WIN32
-#include "BLI_winstuff.h"
+# include "BLI_winstuff.h"
#endif
#include "ED_screen.h"
diff --git a/source/blender/editors/space_file/filelist.c b/source/blender/editors/space_file/filelist.c
index 694664f1f62..d8d25741f98 100644
--- a/source/blender/editors/space_file/filelist.c
+++ b/source/blender/editors/space_file/filelist.c
@@ -50,7 +50,7 @@
#include "BLI_utildefines.h"
#ifdef WIN32
-#include "BLI_winstuff.h"
+# include "BLI_winstuff.h"
#endif
#include "BKE_context.h"
diff --git a/source/blender/editors/space_file/filesel.c b/source/blender/editors/space_file/filesel.c
index 3ed3c0690a2..a7197cb31e6 100644
--- a/source/blender/editors/space_file/filesel.c
+++ b/source/blender/editors/space_file/filesel.c
@@ -36,22 +36,16 @@
#include <sys/stat.h>
#include <sys/types.h>
-#ifdef WIN32
-#include <io.h>
-#include <direct.h>
-#include "BLI_winstuff.h"
-#else
-#include <unistd.h>
-#include <sys/times.h>
-#endif
-
/* path/file handeling stuff */
-#ifndef WIN32
- #include <dirent.h>
- #include <unistd.h>
+#ifdef WIN32
+# include <io.h>
+# include <direct.h>
+# include "BLI_winstuff.h"
#else
- #include <io.h>
- #include "BLI_winstuff.h"
+# include <unistd.h>
+# include <sys/times.h>
+# include <dirent.h>
+# include <unistd.h>
#endif
#include "DNA_space_types.h"
@@ -123,7 +117,7 @@ short ED_fileselect_set_params(SpaceFile *sfile)
const short is_directory= (RNA_struct_find_property(op->ptr, "directory") != NULL);
const short is_relative_path= (RNA_struct_find_property(op->ptr, "relative_path") != NULL);
- BLI_strncpy(params->title, op->type->name, sizeof(params->title));
+ BLI_strncpy(params->title, RNA_struct_ui_name(op->type->srna), sizeof(params->title));
if (RNA_struct_find_property(op->ptr, "filemode"))
params->type = RNA_int_get(op->ptr, "filemode");
diff --git a/source/blender/editors/space_file/fsmenu.c b/source/blender/editors/space_file/fsmenu.c
index ddd4b31d145..48449ac8870 100644
--- a/source/blender/editors/space_file/fsmenu.c
+++ b/source/blender/editors/space_file/fsmenu.c
@@ -44,20 +44,20 @@
#include "BLI_dynstr.h"
#ifdef WIN32
-#include <windows.h> /* need to include windows.h so _WIN32_IE is defined */
-#ifndef _WIN32_IE
-#define _WIN32_IE 0x0400 /* minimal requirements for SHGetSpecialFolderPath on MINGW MSVC has this defined already */
-#endif
-#include <shlobj.h> /* for SHGetSpecialFolderPath, has to be done before BLI_winstuff because 'near' is disabled through BLI_windstuff */
-#include "BLI_winstuff.h"
+# include <windows.h> /* need to include windows.h so _WIN32_IE is defined */
+# ifndef _WIN32_IE
+# define _WIN32_IE 0x0400 /* minimal requirements for SHGetSpecialFolderPath on MINGW MSVC has this defined already */
+# endif
+# include <shlobj.h> /* for SHGetSpecialFolderPath, has to be done before BLI_winstuff
+ * because 'near' is disabled through BLI_windstuff */
+# include "BLI_winstuff.h"
#endif
#ifdef __APPLE__
-/* XXX BIG WARNING: carbon.h can not be included in blender code, it conflicts with struct ID */
-#define ID ID_
-#include <CoreServices/CoreServices.h>
-
-#endif
+ /* XXX BIG WARNING: carbon.h can not be included in blender code, it conflicts with struct ID */
+# define ID ID_
+# include <CoreServices/CoreServices.h>
+#endif /* __APPLE__ */
#ifdef __linux__
#include <mntent.h>
diff --git a/source/blender/editors/space_node/node_buttons.c b/source/blender/editors/space_node/node_buttons.c
index c67cb5f7c71..f7d517915da 100644
--- a/source/blender/editors/space_node/node_buttons.c
+++ b/source/blender/editors/space_node/node_buttons.c
@@ -44,6 +44,8 @@
#include "BLI_rand.h"
#include "BLI_utildefines.h"
+#include "BLF_translation.h"
+
#include "BKE_context.h"
#include "BKE_global.h"
#include "BKE_node.h"
@@ -150,7 +152,7 @@ void node_buttons_register(ARegionType *art)
pt= MEM_callocN(sizeof(PanelType), "spacetype node panel active node");
strcpy(pt->idname, "NODE_PT_item");
- strcpy(pt->label, "Active Node");
+ strcpy(pt->label, IFACE_("Active Node"));
pt->draw= active_node_panel;
pt->poll= active_node_poll;
BLI_addtail(&art->paneltypes, pt);
diff --git a/source/blender/editors/space_node/node_edit.c b/source/blender/editors/space_node/node_edit.c
index f73a89702af..c41cb2b6211 100644
--- a/source/blender/editors/space_node/node_edit.c
+++ b/source/blender/editors/space_node/node_edit.c
@@ -1605,38 +1605,38 @@ void NODE_OT_resize(wmOperatorType *ot)
/* ********************** hidden sockets ******************** */
-int node_has_hidden_sockets(bNode *node, short flag)
+int node_has_hidden_sockets(bNode *node)
{
bNodeSocket *sock;
for (sock= node->inputs.first; sock; sock= sock->next)
- if (sock->flag & flag)
+ if (sock->flag & SOCK_HIDDEN)
return 1;
for (sock= node->outputs.first; sock; sock= sock->next)
- if (sock->flag & flag)
+ if (sock->flag & SOCK_HIDDEN)
return 1;
return 0;
}
-void node_set_hidden_sockets(SpaceNode *snode, bNode *node, short flag, int set)
+void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set)
{
bNodeSocket *sock;
if (set==0) {
for (sock= node->inputs.first; sock; sock= sock->next)
- sock->flag &= ~flag;
+ sock->flag &= ~SOCK_HIDDEN;
for (sock= node->outputs.first; sock; sock= sock->next)
- sock->flag &= ~flag;
+ sock->flag &= ~SOCK_HIDDEN;
}
else {
/* hide unused sockets */
for (sock= node->inputs.first; sock; sock= sock->next) {
if (sock->link==NULL)
- sock->flag |= flag;
+ sock->flag |= SOCK_HIDDEN;
}
for (sock= node->outputs.first; sock; sock= sock->next) {
if (nodeCountSocketLinks(snode->edittree, sock)==0)
- sock->flag |= flag;
+ sock->flag |= SOCK_HIDDEN;
}
}
}
@@ -2281,7 +2281,7 @@ static void node_remove_extra_links(SpaceNode *snode, bNodeSocket *tsock, bNodeL
}
if (sock) {
tlink->tosock= sock;
- sock->flag &= ~(SOCK_HIDDEN|SOCK_AUTO_HIDDEN);
+ sock->flag &= ~SOCK_HIDDEN;
}
else {
nodeRemLink(snode->edittree, tlink);
@@ -2765,7 +2765,7 @@ static bNodeSocket *socket_best_match(ListBase *sockets)
for (type=maxtype; type >= 0; --type) {
for (sock= sockets->first; sock; sock= sock->next) {
if (type==sock->type) {
- sock->flag &= ~(SOCK_HIDDEN|SOCK_AUTO_HIDDEN);
+ sock->flag &= ~SOCK_HIDDEN;
return sock;
}
}
@@ -3109,20 +3109,10 @@ static void node_flag_toggle_exec(SpaceNode *snode, int toggle_flag)
if (toggle_flag== NODE_OPTIONS && (node->typeinfo->flag & NODE_OPTIONS)==0)
continue;
- if ( (tot_eq && tot_neq) || tot_eq==0) {
+ if ( (tot_eq && tot_neq) || tot_eq==0)
node->flag |= toggle_flag;
-
- /* hide/unhide node also toggles unlinked socket display */
- if (toggle_flag== NODE_HIDDEN)
- node_set_hidden_sockets(snode, node, SOCK_AUTO_HIDDEN, 1);
- }
- else {
+ else
node->flag &= ~toggle_flag;
-
- /* hide/unhide node also toggles unlinked socket display */
- if (toggle_flag== NODE_HIDDEN)
- node_set_hidden_sockets(snode, node, SOCK_AUTO_HIDDEN, 0);
- }
}
}
}
@@ -3235,7 +3225,7 @@ static int node_socket_toggle_exec(bContext *C, wmOperator *UNUSED(op))
hidden = 0;
for (node= snode->edittree->nodes.first; node; node= node->next) {
if (node->flag & SELECT) {
- if (node_has_hidden_sockets(node, SOCK_HIDDEN)) {
+ if (node_has_hidden_sockets(node)) {
hidden= 1;
break;
}
@@ -3244,7 +3234,7 @@ static int node_socket_toggle_exec(bContext *C, wmOperator *UNUSED(op))
for (node= snode->edittree->nodes.first; node; node= node->next) {
if (node->flag & SELECT) {
- node_set_hidden_sockets(snode, node, SOCK_HIDDEN, !hidden);
+ node_set_hidden_sockets(snode, node, !hidden);
}
}
diff --git a/source/blender/editors/space_node/node_intern.h b/source/blender/editors/space_node/node_intern.h
index ea8fdd8059b..aa80f729343 100644
--- a/source/blender/editors/space_node/node_intern.h
+++ b/source/blender/editors/space_node/node_intern.h
@@ -121,8 +121,8 @@ void snode_make_group_editable(SpaceNode *snode, bNode *gnode);
void snode_composite_job(const struct bContext *C, ScrArea *sa);
bNode *node_tree_get_editgroup(bNodeTree *ntree);
void snode_autoconnect(SpaceNode *snode, int allow_multiple, int replace);
-int node_has_hidden_sockets(bNode *node, short flag);
-void node_set_hidden_sockets(SpaceNode *snode, bNode *node, short flag, int set);
+int node_has_hidden_sockets(bNode *node);
+void node_set_hidden_sockets(SpaceNode *snode, bNode *node, int set);
int node_render_changed_exec(bContext *, wmOperator *);
int node_find_indicated_socket(struct SpaceNode *snode, struct bNode **nodep, struct bNodeSocket **sockp, int in_out);
diff --git a/source/blender/editors/space_outliner/CMakeLists.txt b/source/blender/editors/space_outliner/CMakeLists.txt
index 27b4a568860..5a7bbc21934 100644
--- a/source/blender/editors/space_outliner/CMakeLists.txt
+++ b/source/blender/editors/space_outliner/CMakeLists.txt
@@ -22,6 +22,7 @@ set(INC
../include
../../blenkernel
../../blenlib
+ ../../blenfont
../../blenloader
../../imbuf
../../makesdna
@@ -47,4 +48,8 @@ set(SRC
outliner_intern.h
)
+if(WITH_INTERNATIONAL)
+ add_definitions(-DWITH_INTERNATIONAL)
+endif()
+
blender_add_lib(bf_editor_space_outliner "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/editors/space_outliner/SConscript b/source/blender/editors/space_outliner/SConscript
index ab0b8582d33..a6f2e3c2a5d 100644
--- a/source/blender/editors/space_outliner/SConscript
+++ b/source/blender/editors/space_outliner/SConscript
@@ -2,9 +2,13 @@
Import ('env')
sources = env.Glob('*.c')
+defs = []
-incs = '../include ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
+incs = '../include ../../blenlib ../../blenfont ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc ../../makesrna ../../blenloader'
incs += ' #/extern/glew/include'
-env.BlenderLib ( 'bf_editors_space_outliner', sources, Split(incs), [], libtype=['core'], priority=[60] )
+if env['WITH_BF_INTERNATIONAL']:
+ defs.append('WITH_INTERNATIONAL')
+
+env.BlenderLib ( 'bf_editors_space_outliner', sources, Split(incs), defines=defs, libtype=['core'], priority=[60] )
diff --git a/source/blender/editors/space_outliner/outliner_edit.c b/source/blender/editors/space_outliner/outliner_edit.c
index c59cd626a93..981c4a5d867 100644
--- a/source/blender/editors/space_outliner/outliner_edit.c
+++ b/source/blender/editors/space_outliner/outliner_edit.c
@@ -65,6 +65,7 @@
# include <fnmatch.h>
#endif
+#include "BLF_translation.h"
#include "BKE_animsys.h"
#include "BKE_context.h"
@@ -1538,7 +1539,7 @@ static int parent_drop_invoke(bContext *C, wmOperator *op, wmEvent *event)
}
else {
/* Menu creation */
- uiPopupMenu *pup= uiPupMenuBegin(C, "Set Parent To", ICON_NONE);
+ uiPopupMenu *pup= uiPupMenuBegin(C, IFACE_("Set Parent To"), ICON_NONE);
uiLayout *layout= uiPupMenuLayout(pup);
PointerRNA ptr;
@@ -1548,7 +1549,8 @@ static int parent_drop_invoke(bContext *C, wmOperator *op, wmEvent *event)
RNA_string_set(&ptr, "child", childname);
RNA_enum_set(&ptr, "type", PAR_OBJECT);
/* Cannot use uiItemEnumO()... have multiple properties to set. */
- uiItemFullO(layout, "OUTLINER_OT_parent_drop", "Object", 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
+ uiItemFullO(layout, "OUTLINER_OT_parent_drop", IFACE_("Object"),
+ 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
/* par becomes parent, make the associated menus */
if (par->type==OB_ARMATURE) {
@@ -1556,57 +1558,66 @@ static int parent_drop_invoke(bContext *C, wmOperator *op, wmEvent *event)
RNA_string_set(&ptr, "parent", parname);
RNA_string_set(&ptr, "child", childname);
RNA_enum_set(&ptr, "type", PAR_ARMATURE);
- uiItemFullO(layout, "OUTLINER_OT_parent_drop", "Armature Deform", 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
+ uiItemFullO(layout, "OUTLINER_OT_parent_drop", IFACE_("Armature Deform"),
+ 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
WM_operator_properties_create(&ptr, "OUTLINER_OT_parent_drop");
RNA_string_set(&ptr, "parent", parname);
RNA_string_set(&ptr, "child", childname);
RNA_enum_set(&ptr, "type", PAR_ARMATURE_NAME);
- uiItemFullO(layout, "OUTLINER_OT_parent_drop", " With Empty Groups", 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
+ uiItemFullO(layout, "OUTLINER_OT_parent_drop", IFACE_(" With Empty Groups"),
+ 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
WM_operator_properties_create(&ptr, "OUTLINER_OT_parent_drop");
RNA_string_set(&ptr, "parent", parname);
RNA_string_set(&ptr, "child", childname);
RNA_enum_set(&ptr, "type", PAR_ARMATURE_ENVELOPE);
- uiItemFullO(layout, "OUTLINER_OT_parent_drop", " With Envelope Weights", 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
+ uiItemFullO(layout, "OUTLINER_OT_parent_drop", IFACE_(" With Envelope Weights"),
+ 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
WM_operator_properties_create(&ptr, "OUTLINER_OT_parent_drop");
RNA_string_set(&ptr, "parent", parname);
RNA_string_set(&ptr, "child", childname);
RNA_enum_set(&ptr, "type", PAR_ARMATURE_AUTO);
- uiItemFullO(layout, "OUTLINER_OT_parent_drop", " With Automatic Weights", 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
+ uiItemFullO(layout, "OUTLINER_OT_parent_drop", IFACE_(" With Automatic Weights"),
+ 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
WM_operator_properties_create(&ptr, "OUTLINER_OT_parent_drop");
RNA_string_set(&ptr, "parent", parname);
RNA_string_set(&ptr, "child", childname);
RNA_enum_set(&ptr, "type", PAR_BONE);
- uiItemFullO(layout, "OUTLINER_OT_parent_drop", "Bone", 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
+ uiItemFullO(layout, "OUTLINER_OT_parent_drop", IFACE_("Bone"),
+ 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
}
else if (par->type==OB_CURVE) {
WM_operator_properties_create(&ptr, "OUTLINER_OT_parent_drop");
RNA_string_set(&ptr, "parent", parname);
RNA_string_set(&ptr, "child", childname);
RNA_enum_set(&ptr, "type", PAR_CURVE);
- uiItemFullO(layout, "OUTLINER_OT_parent_drop", "Curve Deform", 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
+ uiItemFullO(layout, "OUTLINER_OT_parent_drop", IFACE_("Curve Deform"),
+ 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
WM_operator_properties_create(&ptr, "OUTLINER_OT_parent_drop");
RNA_string_set(&ptr, "parent", parname);
RNA_string_set(&ptr, "child", childname);
RNA_enum_set(&ptr, "type", PAR_FOLLOW);
- uiItemFullO(layout, "OUTLINER_OT_parent_drop", "Follow Path", 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
+ uiItemFullO(layout, "OUTLINER_OT_parent_drop", IFACE_("Follow Path"),
+ 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
WM_operator_properties_create(&ptr, "OUTLINER_OT_parent_drop");
RNA_string_set(&ptr, "parent", parname);
RNA_string_set(&ptr, "child", childname);
RNA_enum_set(&ptr, "type", PAR_PATH_CONST);
- uiItemFullO(layout, "OUTLINER_OT_parent_drop", "Path Constraint", 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
+ uiItemFullO(layout, "OUTLINER_OT_parent_drop", IFACE_("Path Constraint"),
+ 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
}
else if (par->type == OB_LATTICE) {
WM_operator_properties_create(&ptr, "OUTLINER_OT_parent_drop");
RNA_string_set(&ptr, "parent", parname);
RNA_string_set(&ptr, "child", childname);
RNA_enum_set(&ptr, "type", PAR_LATTICE);
- uiItemFullO(layout, "OUTLINER_OT_parent_drop", "Lattice Deform", 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
+ uiItemFullO(layout, "OUTLINER_OT_parent_drop", IFACE_("Lattice Deform"),
+ 0, ptr.data, WM_OP_EXEC_DEFAULT, 0);
}
uiPupMenuEnd(C, pup);
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c
index 29fdf80f667..38183ac52c7 100644
--- a/source/blender/editors/space_sequencer/sequencer_edit.c
+++ b/source/blender/editors/space_sequencer/sequencer_edit.c
@@ -1319,7 +1319,8 @@ void SEQUENCER_OT_reload(struct wmOperatorType *ot)
/* flags */
ot->flag = OPTYPE_REGISTER; /* no undo, the data changed is stored outside 'main' */
- prop = RNA_def_boolean(ot->srna, "adjust_length", 0, "Adjust Length", "Adjust lenght of strips to their data length");
+ prop = RNA_def_boolean(ot->srna, "adjust_length", 0, "Adjust Length",
+ "Adjust lenght of strips to their data lenght");
RNA_def_property_flag(prop, PROP_SKIP_SAVE);
}
diff --git a/source/blender/editors/space_text/text_header.c b/source/blender/editors/space_text/text_header.c
index a7b455a6ff3..b0cd6aeaab4 100644
--- a/source/blender/editors/space_text/text_header.c
+++ b/source/blender/editors/space_text/text_header.c
@@ -39,10 +39,10 @@
#include <sys/stat.h>
#ifndef _WIN32
-#include <unistd.h>
+# include <unistd.h>
#else
-#include <io.h>
-#include "BLI_winstuff.h"
+# include <io.h>
+# include "BLI_winstuff.h"
#endif
#include "DNA_windowmanager_types.h"
diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c
index 5e992762d16..8a4d2f86a9c 100644
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@ -1288,7 +1288,6 @@ static void drawlamp(Scene *scene, View3D *v3d, RegionView3D *rv3d, Base *base,
if (la->mode & LA_SPHERE) {
drawcircball(GL_LINE_LOOP, vec, la->dist, imat);
}
- /* yafray: for photonlight also draw lightcone as for spot */
}
glPopMatrix(); /* back in object space */
@@ -2927,7 +2926,7 @@ static void draw_em_measure_stats(View3D *v3d, Object *ob, BMEditMesh *em, UnitS
BMIter liter;
BMLoop *loop;
- BM_face_center_bounds_calc(em->bm, efa, vmid);
+ BM_face_center_bounds_calc(efa, vmid);
for (loop = BM_iter_new(&liter, em->bm, BM_LOOPS_OF_FACE, efa);
loop; loop = BM_iter_step(&liter))
@@ -2974,7 +2973,7 @@ static void draw_em_indices(BMEditMesh *em)
i = 0;
if (em->selectmode & SCE_SELECT_VERTEX) {
UI_GetThemeColor3ubv(TH_DRAWEXTRA_FACEANG, col);
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
sprintf(numstr, "%d", i);
view3d_cached_text_draw_add(v->co, numstr, 0, txt_flag, col);
@@ -2986,7 +2985,7 @@ static void draw_em_indices(BMEditMesh *em)
if (em->selectmode & SCE_SELECT_EDGE) {
i = 0;
UI_GetThemeColor3ubv(TH_DRAWEXTRA_EDGELEN, col);
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(e, BM_ELEM_SELECT)) {
sprintf(numstr, "%d", i);
mid_v3_v3v3(pos, e->v1->co, e->v2->co);
@@ -2999,9 +2998,9 @@ static void draw_em_indices(BMEditMesh *em)
if (em->selectmode & SCE_SELECT_FACE) {
i = 0;
UI_GetThemeColor3ubv(TH_DRAWEXTRA_FACEAREA, col);
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(f, BM_ELEM_SELECT)) {
- BM_face_center_mean_calc(bm, f, pos);
+ BM_face_center_mean_calc(f, pos);
sprintf(numstr, "%d", i);
view3d_cached_text_draw_add(pos, numstr, 0, txt_flag, col);
}
diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c
index f77ed74c7bc..c3ff00e3c82 100644
--- a/source/blender/editors/space_view3d/view3d_buttons.c
+++ b/source/blender/editors/space_view3d/view3d_buttons.c
@@ -157,7 +157,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
BMEdge *eed;
BMIter iter;
- BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
evedef = eve;
tot++;
@@ -165,7 +165,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
}
}
- BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
float *f;
@@ -310,70 +310,83 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
if (block) { /* buttons */
uiBut *but;
+ int yi = 200;
+ const int buth = 20 * UI_DPI_ICON_FAC;
+ const int but_margin = 2;
memcpy(tfp->ve_median, median, sizeof(tfp->ve_median));
uiBlockBeginAlign(block);
if (tot == 1) {
- uiDefBut(block, LABEL, 0, IFACE_("Vertex:"), 0, 150, 200, 20, NULL, 0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, IFACE_("Vertex:"), 0, yi -= buth, 200, buth, NULL, 0, 0, 0, 0, "");
}
else {
- uiDefBut(block, LABEL, 0, IFACE_("Median:"), 0, 150, 200, 20, NULL, 0, 0, 0, 0, "");
+ uiDefBut(block, LABEL, 0, IFACE_("Median:"), 0, yi -= buth, 200, buth, NULL, 0, 0, 0, 0, "");
}
uiBlockBeginAlign(block);
/* Should be no need to translate these. */
- but = uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "X:", 0, 130, 200, 20,
+ but = uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "X:", 0, yi -= buth, 200, buth,
&(tfp->ve_median[0]), -lim, lim, 10, RNA_TRANSLATION_PREC_DEFAULT, "");
uiButSetUnitType(but, PROP_UNIT_LENGTH);
- but = uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Y:", 0, 110, 200, 20,
+ but = uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Y:", 0, yi -= buth, 200, buth,
&(tfp->ve_median[1]), -lim, lim, 10, RNA_TRANSLATION_PREC_DEFAULT, "");
uiButSetUnitType(but, PROP_UNIT_LENGTH);
- but = uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Z:", 0, 90, 200, 20,
+ but = uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "Z:",0, yi -= buth, 200, buth,
&(tfp->ve_median[2]), -lim, lim, 10, RNA_TRANSLATION_PREC_DEFAULT, "");
uiButSetUnitType(but, PROP_UNIT_LENGTH);
if (totw == tot) {
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "W:", 0, 70, 200, 20,
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, "W:", 0, yi -= buth, 200, buth,
&(tfp->ve_median[3]), 0.01, 100.0, 1, 3, "");
}
uiBlockBeginAlign(block);
- uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, B_REDR, IFACE_("Global"), 0, 65, 100, 20,
+ uiDefButBitS(block, TOG, V3D_GLOBAL_STATS, B_REDR, IFACE_("Global"),
+ 0, yi -= buth + but_margin, 100, buth,
&v3d->flag, 0, 0, 0, 0, "Displays global values");
- uiDefButBitS(block, TOGN, V3D_GLOBAL_STATS, B_REDR, IFACE_("Local"), 100, 65, 100, 20,
+ uiDefButBitS(block, TOGN, V3D_GLOBAL_STATS, B_REDR, IFACE_("Local"),
+ 100, yi, 100, buth,
&v3d->flag, 0, 0, 0, 0, "Displays local values");
uiBlockEndAlign(block);
if (totweight == 1) {
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, IFACE_("Weight:"), 0, 40, 200, 20,
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, IFACE_("Weight:"),
+ 0, yi -= buth + but_margin, 200, buth,
&(tfp->ve_median[4]), 0.0, 1.0, 1, 3, TIP_("Weight used for SoftBody Goal"));
}
else if (totweight > 1) {
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, IFACE_("Mean Weight:"), 0, 40, 200, 20,
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, IFACE_("Mean Weight:"),
+ 0, yi -= buth, 200, buth,
&(tfp->ve_median[4]), 0.0, 1.0, 1, 3, TIP_("Weight used for SoftBody Goal"));
}
if (totradius == 1) {
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, IFACE_("Radius:"), 0, 20, 200, 20,
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, IFACE_("Radius:"),
+ 0, yi -= buth + but_margin, 200, buth,
&(tfp->ve_median[5]), 0.0, 100.0, 1, 3, TIP_("Radius of curve control points"));
}
else if (totradius > 1) {
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, IFACE_("Mean Radius:"), 0, 20, 200, 20,
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, IFACE_("Mean Radius:"),
+ 0, yi -= buth + but_margin, 200, buth,
&(tfp->ve_median[5]), 0.0, 100.0, 1, 3, TIP_("Radius of curve control points"));
}
if (totedge == 1) {
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, IFACE_("Crease:"), 0, 40, 200, 20,
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, IFACE_("Crease:"),
+ 0, yi -= buth + but_margin, 200, buth,
&(tfp->ve_median[3]), 0.0, 1.0, 1, 3, TIP_("Weight used by SubSurf modifier"));
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, IFACE_("Bevel Weight:"), 0, 20, 200, 20,
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, IFACE_("Bevel Weight:"),
+ 0, yi -= buth + but_margin, 200, buth,
&(tfp->ve_median[6]), 0.0, 1.0, 1, 3, TIP_("Weight used by Bevel modifier"));
}
else if (totedge > 1) {
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, IFACE_("Mean Crease:"), 0, 40, 200, 20,
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, IFACE_("Mean Crease:"),
+ 0, yi -= buth + but_margin, 200, buth,
&(tfp->ve_median[3]), 0.0, 1.0, 1, 3, TIP_("Weight used by SubSurf modifier"));
- uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, IFACE_("Mean Bevel Weight:"), 0, 20, 200, 20,
+ uiDefButF(block, NUM, B_OBJECTPANELMEDIAN, IFACE_("Mean Bevel Weight:"),
+ 0, yi -= buth + but_margin, 200, buth,
&(tfp->ve_median[6]), 0.0, 1.0, 1, 3, TIP_("Weight used by Bevel modifier"));
}
@@ -404,7 +417,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
if (len_v3(median) > 0.000001f) {
- BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
add_v3_v3(eve->co, median);
}
@@ -418,7 +431,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
const float sca = compute_scale_factor(ve_median[3], median[3]);
if (ELEM(sca, 0.0f, 1.0f)) {
- BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
float *crease = (float *)CustomData_bmesh_get(&bm->edata, eed->head.data, CD_CREASE);
if (crease) {
@@ -428,7 +441,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
}
}
else if (sca > 0.0f) {
- BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(eed, BM_ELEM_SELECT) && !BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
float *crease = (float *)CustomData_bmesh_get(&bm->edata, eed->head.data, CD_CREASE);
if (crease) {
@@ -439,7 +452,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
}
}
else {
- BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(eed, BM_ELEM_SELECT) && !BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
float *crease = (float *)CustomData_bmesh_get(&bm->edata, eed->head.data, CD_CREASE);
if (crease) {
@@ -456,7 +469,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
const float sca = compute_scale_factor(ve_median[6], median[6]);
if (ELEM(sca, 0.0f, 1.0f)) {
- BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
float *bweight = (float *)CustomData_bmesh_get(&bm->edata, eed->head.data, CD_BWEIGHT);
if (bweight) {
@@ -466,7 +479,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
}
}
else if (sca > 0.0f) {
- BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(eed, BM_ELEM_SELECT) && !BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
float *bweight = (float *)CustomData_bmesh_get(&bm->edata, eed->head.data, CD_BWEIGHT);
if (bweight) {
@@ -477,7 +490,7 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
}
}
else {
- BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(eed, BM_ELEM_SELECT) && !BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
float *bweight = (float *)CustomData_bmesh_get(&bm->edata, eed->head.data, CD_BWEIGHT);
if (bweight) {
@@ -678,7 +691,7 @@ static void vgroup_copy_active_to_sel(Object *ob)
MDeformVert *dvert;
int index = 0;
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT) && eve != eve_act) {
dvert = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
if (dvert) {
diff --git a/source/blender/editors/space_view3d/view3d_edit.c b/source/blender/editors/space_view3d/view3d_edit.c
index b0b5643f2ba..50eaa3b7ccc 100644
--- a/source/blender/editors/space_view3d/view3d_edit.c
+++ b/source/blender/editors/space_view3d/view3d_edit.c
@@ -599,7 +599,7 @@ void viewrotate_modal_keymap(wmKeyConfig *keyconf)
wmKeyMap *keymap = WM_modalkeymap_get(keyconf, "View3D Rotate Modal");
/* this function is called for each spacetype, only needs to add map once */
- if (keymap) return;
+ if (keymap && keymap->modal_items) return;
keymap = WM_modalkeymap_add(keyconf, "View3D Rotate Modal", modal_items);
@@ -1262,7 +1262,7 @@ void viewmove_modal_keymap(wmKeyConfig *keyconf)
wmKeyMap *keymap = WM_modalkeymap_get(keyconf, "View3D Move Modal");
/* this function is called for each spacetype, only needs to add map once */
- if (keymap) return;
+ if (keymap && keymap->modal_items) return;
keymap = WM_modalkeymap_add(keyconf, "View3D Move Modal", modal_items);
@@ -1423,7 +1423,7 @@ void viewzoom_modal_keymap(wmKeyConfig *keyconf)
wmKeyMap *keymap = WM_modalkeymap_get(keyconf, "View3D Zoom Modal");
/* this function is called for each spacetype, only needs to add map once */
- if (keymap) return;
+ if (keymap && keymap->modal_items) return;
keymap = WM_modalkeymap_add(keyconf, "View3D Zoom Modal", modal_items);
@@ -1695,7 +1695,7 @@ void viewdolly_modal_keymap(wmKeyConfig *keyconf)
wmKeyMap *keymap = WM_modalkeymap_get(keyconf, "View3D Dolly Modal");
/* this function is called for each spacetype, only needs to add map once */
- if (keymap) return;
+ if (keymap && keymap->modal_items) return;
keymap = WM_modalkeymap_add(keyconf, "View3D Dolly Modal", modal_items);
diff --git a/source/blender/editors/space_view3d/view3d_fly.c b/source/blender/editors/space_view3d/view3d_fly.c
index 31beda3b3f9..5b6624889c8 100644
--- a/source/blender/editors/space_view3d/view3d_fly.c
+++ b/source/blender/editors/space_view3d/view3d_fly.c
@@ -113,7 +113,7 @@ void fly_modal_keymap(wmKeyConfig *keyconf)
wmKeyMap *keymap = WM_modalkeymap_get(keyconf, "View3D Fly Modal");
/* this function is called for each spacetype, only needs to add map once */
- if (keymap)
+ if (keymap && keymap->modal_items)
return;
keymap = WM_modalkeymap_add(keyconf, "View3D Fly Modal", modal_items);
diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index 5646570a623..c6a93a80b2e 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -474,7 +474,7 @@ static void do_lasso_select_mesh__doSelectVert(void *userData, BMVert *eve, int
LassoSelectUserData *data = userData;
if (BLI_in_rcti(data->rect, x, y) && lasso_inside(data->mcords, data->moves, x, y)) {
- BM_elem_select_set(data->vc->em->bm, eve, data->select);
+ BM_vert_select_set(data->vc->em->bm, eve, data->select);
}
}
static void do_lasso_select_mesh__doSelectEdge(void *userData, BMEdge *eed, int x0, int y0, int x1, int y1, int index)
@@ -486,13 +486,13 @@ static void do_lasso_select_mesh__doSelectEdge(void *userData, BMEdge *eed, int
if (edge_fully_inside_rect(data->rect, x0, y0, x1, y1) &&
lasso_inside(data->mcords, data->moves, x0, y0) &&
lasso_inside(data->mcords, data->moves, x1, y1)) {
- BM_elem_select_set(data->vc->em->bm, eed, data->select);
+ BM_edge_select_set(data->vc->em->bm, eed, data->select);
data->done = 1;
}
}
else {
if (lasso_inside_edge(data->mcords, data->moves, x0, y0, x1, y1)) {
- BM_elem_select_set(data->vc->em->bm, eed, data->select);
+ BM_edge_select_set(data->vc->em->bm, eed, data->select);
}
}
}
@@ -502,7 +502,7 @@ static void do_lasso_select_mesh__doSelectFace(void *userData, BMFace *efa, int
LassoSelectUserData *data = userData;
if (BLI_in_rcti(data->rect, x, y) && lasso_inside(data->mcords, data->moves, x, y)) {
- BM_elem_select_set(data->vc->em->bm, efa, data->select);
+ BM_face_select_set(data->vc->em->bm, efa, data->select);
}
}
@@ -1756,7 +1756,7 @@ static void do_mesh_box_select__doSelectVert(void *userData, BMVert *eve, int x,
BoxSelectUserData *data = userData;
if (BLI_in_rcti(data->rect, x, y)) {
- BM_elem_select_set(data->vc->em->bm, eve, data->select);
+ BM_vert_select_set(data->vc->em->bm, eve, data->select);
}
}
static void do_mesh_box_select__doSelectEdge(void *userData, BMEdge *eed, int x0, int y0, int x1, int y1, int index)
@@ -1766,13 +1766,13 @@ static void do_mesh_box_select__doSelectEdge(void *userData, BMEdge *eed, int x0
if (EDBM_backbuf_check(bm_solidoffs + index)) {
if (data->pass == 0) {
if (edge_fully_inside_rect(data->rect, x0, y0, x1, y1)) {
- BM_elem_select_set(data->vc->em->bm, eed, data->select);
+ BM_edge_select_set(data->vc->em->bm, eed, data->select);
data->done = 1;
}
}
else {
if (edge_inside_rect(data->rect, x0, y0, x1, y1)) {
- BM_elem_select_set(data->vc->em->bm, eed, data->select);
+ BM_edge_select_set(data->vc->em->bm, eed, data->select);
}
}
}
@@ -1782,7 +1782,7 @@ static void do_mesh_box_select__doSelectFace(void *userData, BMFace *efa, int x,
BoxSelectUserData *data = userData;
if (BLI_in_rcti(data->rect, x, y)) {
- BM_elem_select_set(data->vc->em->bm, efa, data->select);
+ BM_face_select_set(data->vc->em->bm, efa, data->select);
}
}
static int do_mesh_box_select(ViewContext *vc, rcti *rect, int select, int extend)
@@ -2304,7 +2304,7 @@ static void mesh_circle_doSelectVert(void *userData, BMVert *eve, int x, int y,
float r = sqrt(mx * mx + my * my);
if (r <= data->radius) {
- BM_elem_select_set(data->vc->em->bm, eve, data->select);
+ BM_vert_select_set(data->vc->em->bm, eve, data->select);
}
}
static void mesh_circle_doSelectEdge(void *userData, BMEdge *eed, int x0, int y0, int x1, int y1, int UNUSED(index))
@@ -2312,7 +2312,7 @@ static void mesh_circle_doSelectEdge(void *userData, BMEdge *eed, int x0, int y0
CircleSelectUserData *data = userData;
if (edge_inside_circle(data->mval[0], data->mval[1], (short) data->radius, x0, y0, x1, y1)) {
- BM_elem_select_set(data->vc->em->bm, eed, data->select);
+ BM_edge_select_set(data->vc->em->bm, eed, data->select);
}
}
static void mesh_circle_doSelectFace(void *userData, BMFace *efa, int x, int y, int UNUSED(index))
@@ -2322,7 +2322,7 @@ static void mesh_circle_doSelectFace(void *userData, BMFace *efa, int x, int y,
float r = sqrt(mx * mx + my * my);
if (r <= data->radius) {
- BM_elem_select_set(data->vc->em->bm, efa, data->select);
+ BM_face_select_set(data->vc->em->bm, efa, data->select);
}
}
diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c
index faf765fdaef..f19c8891f96 100644
--- a/source/blender/editors/space_view3d/view3d_snap.c
+++ b/source/blender/editors/space_view3d/view3d_snap.c
@@ -242,7 +242,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
// transform now requires awareness for select mode, so we tag the f1 flags in verts
tottrans = 0;
if (em->selectmode & SCE_SELECT_VERTEX) {
- BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN) && BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
BM_elem_index_set(eve, 1); /* set_dirty! */
tottrans++;
@@ -253,41 +253,42 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
else if (em->selectmode & SCE_SELECT_EDGE) {
BMEdge *eed;
- BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
BM_elem_index_set(eve, 0); /* set_dirty! */
}
- BM_ITER(eed, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN) && BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
BM_elem_index_set(eed->v1, 1); /* set_dirty! */
BM_elem_index_set(eed->v2, 1); /* set_dirty! */
}
}
- BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
if (BM_elem_index_get(eve)) tottrans++;
}
}
else {
BMFace *efa;
- BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
BM_elem_index_set(eve, 0); /* set_dirty! */
}
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN) && BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
BMIter liter;
BMLoop *l;
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
BM_elem_index_set(l->v, 1); /* set_dirty! */
}
}
}
- BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL)
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
if (BM_elem_index_get(eve)) tottrans++;
+ }
}
/* for any of the 3 loops above which all dirty the indices */
bm->elem_index_dirty |= BM_VERT;
@@ -297,7 +298,7 @@ static void make_trans_verts(Object *obedit, float *min, float *max, int mode)
tv = transvmain = MEM_callocN(tottrans * sizeof(TransVert), "maketransverts");
a = 0;
- BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
if (BM_elem_index_get(eve)) {
BM_elem_index_set(eve, a); /* set_dirty! */
copy_v3_v3(tv->oldloc, eve->co);
@@ -993,7 +994,7 @@ static int snap_curs_to_active(bContext *C, wmOperator *UNUSED(op))
BMEditSelection ese;
if (EDBM_editselection_active_get(me->edit_btmesh, &ese)) {
- EDBM_editselection_center(me->edit_btmesh, curs, &ese);
+ EDBM_editselection_center(curs, &ese);
}
mul_m4_v3(obedit->obmat, curs);
diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c
index 739ccc48f14..19f86dd5b95 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -539,7 +539,7 @@ wmKeyMap* transform_modal_keymap(wmKeyConfig *keyconf)
wmKeyMap *keymap= WM_modalkeymap_get(keyconf, "Transform Modal Map");
/* this function is called for each spacetype, only needs to add map once */
- if (keymap) return NULL;
+ if (keymap && keymap->modal_items) return NULL;
keymap= WM_modalkeymap_add(keyconf, "Transform Modal Map", modal_items);
@@ -2516,6 +2516,8 @@ int Shear(TransInfo *t, const int UNUSED(mval[2]))
sprintf(str, "Shear: %.3f %s", value, t->proptext);
}
+ t->values[0] = value;
+
unit_m3(smat);
// Custom data signals shear direction
@@ -3616,6 +3618,7 @@ int ShrinkFatten(TransInfo *t, const int UNUSED(mval[2]))
sprintf(str, "Shrink/Fatten: %.4f %s", distance, t->proptext);
}
+ t->values[0] = distance;
for (i = 0 ; i < t->total; i++, td++) {
if (td->flag & TD_NOACTION)
@@ -3821,6 +3824,8 @@ int PushPull(TransInfo *t, const int UNUSED(mval[2]))
sprintf(str, "Push/Pull: %.4f%s %s", distance, t->con.text, t->proptext);
}
+ t->values[0] = distance;
+
if (t->con.applyRot && t->con.mode & CON_APPLY) {
t->con.applyRot(t, NULL, axis, NULL);
}
@@ -4308,12 +4313,12 @@ int BoneEnvelope(TransInfo *t, const int UNUSED(mval[2]))
}
/* ******************** Edge Slide *************** */
-static BMEdge *get_other_edge(BMesh *bm, BMVert *v, BMEdge *e)
+static BMEdge *get_other_edge(BMVert *v, BMEdge *e)
{
BMIter iter;
BMEdge *e2;
- BM_ITER(e2, &iter, bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e2, &iter, v, BM_EDGES_OF_VERT) {
if (BM_elem_flag_test(e2, BM_ELEM_SELECT) && e2 != e)
return e2;
}
@@ -4321,7 +4326,7 @@ static BMEdge *get_other_edge(BMesh *bm, BMVert *v, BMEdge *e)
return NULL;
}
-static BMLoop *get_next_loop(BMesh *UNUSED(bm), BMVert *v, BMLoop *l,
+static BMLoop *get_next_loop(BMVert *v, BMLoop *l,
BMEdge *olde, BMEdge *nexte, float vec[3])
{
BMLoop *firstl;
@@ -4414,10 +4419,10 @@ static int createSlideVerts(TransInfo *t)
BLI_smallhash_init(&table);
/*ensure valid selection*/
- BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
numsel = 0;
- BM_ITER(e, &iter2, em->bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e, &iter2, v, BM_EDGES_OF_VERT) {
if (BM_elem_flag_test(e, BM_ELEM_SELECT)) {
/* BMESH_TODO: this is probably very evil,
* set v->e to a selected edge*/
@@ -4435,9 +4440,9 @@ static int createSlideVerts(TransInfo *t)
}
}
- BM_ITER(e, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(e, BM_ELEM_SELECT)) {
- if (BM_edge_face_count(e) != 2) {
+ if (!BM_edge_is_manifold(e)) {
MEM_freeN(sld);
BMBVH_FreeBVH(btree);
return 0; /* can only handle exactly 2 faces around each edge */
@@ -4446,7 +4451,7 @@ static int createSlideVerts(TransInfo *t)
}
j = 0;
- BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
BM_elem_flag_enable(v, BM_ELEM_TAG);
BLI_smallhash_insert(&table, (uintptr_t)v, SET_INT_IN_POINTER(j));
@@ -4468,7 +4473,7 @@ static int createSlideVerts(TransInfo *t)
j = 0;
while (1) {
v = NULL;
- BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(v, BM_ELEM_TAG))
break;
@@ -4488,7 +4493,7 @@ static int createSlideVerts(TransInfo *t)
/*first, rewind*/
numsel = 0;
do {
- e = get_other_edge(bm, v, e);
+ e = get_other_edge(v, e);
if (!e) {
e = v->e;
break;
@@ -4541,7 +4546,7 @@ static int createSlideVerts(TransInfo *t)
v2=v, v = BM_edge_other_vert(e, v);
e1 = e;
- e = get_other_edge(bm, v, e);
+ e = get_other_edge(v, e);
if (!e) {
//v2=v, v = BM_edge_other_vert(l1->e, v);
@@ -4566,8 +4571,8 @@ static int createSlideVerts(TransInfo *t)
break;
}
- l1 = get_next_loop(bm, v, l1, e1, e, vec);
- l2 = l2 ? get_next_loop(bm, v, l2, e1, e, vec2) : NULL;
+ l1 = get_next_loop(v, l1, e1, e, vec);
+ l2 = l2 ? get_next_loop(v, l2, e1, e, vec2) : NULL;
j += 1;
@@ -4586,7 +4591,7 @@ static int createSlideVerts(TransInfo *t)
/* size = 50.0; */ /* UNUSED */
zero_v3(lastvec); zero_v3(dir);
/* ee = le = NULL; */ /* UNUSED */
- BM_ITER(e, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(e, BM_ELEM_SELECT)) {
BMIter iter2;
BMEdge *e2;
@@ -4597,7 +4602,7 @@ static int createSlideVerts(TransInfo *t)
dis2 = -1.0f;
for (i=0; i<2; i++) {
v = i?e->v1:e->v2;
- BM_ITER(e2, &iter2, em->bm, BM_EDGES_OF_VERT, v) {
+ BM_ITER_ELEM (e2, &iter2, v, BM_EDGES_OF_VERT) {
if (BM_elem_flag_test(e2, BM_ELEM_SELECT))
continue;
@@ -4634,7 +4639,7 @@ static int createSlideVerts(TransInfo *t)
}
}
- bmesh_edit_begin(em->bm, BMO_OP_FLAG_UNTAN_MULTIRES);
+ bmesh_edit_begin(bm, BMO_OP_FLAG_UNTAN_MULTIRES);
/*create copies of faces for customdata projection*/
tempsv = sld->sv;
@@ -4643,17 +4648,17 @@ static int createSlideVerts(TransInfo *t)
BMFace *f;
BMLoop *l;
- BM_ITER(f, &fiter, em->bm, BM_FACES_OF_VERT, tempsv->v) {
+ BM_ITER_ELEM (f, &fiter, tempsv->v, BM_FACES_OF_VERT) {
if (!BLI_smallhash_haskey(&sld->origfaces, (uintptr_t)f)) {
- BMFace *copyf = BM_face_copy(em->bm, f, TRUE, TRUE);
+ BMFace *copyf = BM_face_copy(bm, f, TRUE, TRUE);
- BM_elem_select_set(em->bm, copyf, FALSE);
+ BM_face_select_set(bm, copyf, FALSE);
BM_elem_flag_enable(copyf, BM_ELEM_HIDDEN);
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, copyf) {
- BM_elem_select_set(em->bm, l->v, FALSE);
+ BM_ITER_ELEM (l, &liter, copyf, BM_LOOPS_OF_FACE) {
+ BM_vert_select_set(bm, l->v, FALSE);
BM_elem_flag_enable(l->v, BM_ELEM_HIDDEN);
- BM_elem_select_set(em->bm, l->e, FALSE);
+ BM_edge_select_set(bm, l->e, FALSE);
BM_elem_flag_enable(l->e, BM_ELEM_HIDDEN);
}
@@ -4697,15 +4702,17 @@ void projectSVData(TransInfo *t, int final)
BMEditMesh *em = sld->em;
SmallHash visit;
int i;
-
+
if (!em)
return;
- /* BMESH_TODO, (t->settings->uvcalc_flag & UVCALC_TRANSFORM_CORRECT)
- * currently all vertex data is interpolated which is nice mostly
- * except for shape keys where you don't want to modify UVs for eg.
- * current BMesh code doesnt make it easy to pick which data we interpolate
- * - campbell */
+ if(!(t->settings->uvcalc_flag & UVCALC_TRANSFORM_CORRECT))
+ return;
+
+ /* don't do this at all for non-basis shape keys, too easy to
+ accidentally break uv maps or vertex colors then */
+ if(em->bm->shapenr > 1)
+ return;
BLI_smallhash_init(&visit);
@@ -4713,18 +4720,18 @@ void projectSVData(TransInfo *t, int final)
BMIter fiter;
BMFace *f;
- BM_ITER(f, &fiter, em->bm, BM_FACES_OF_VERT, tempsv->v) {
+ BM_ITER_ELEM (f, &fiter, tempsv->v, BM_FACES_OF_VERT) {
BMIter liter2;
BMFace *copyf, *copyf2;
BMLoop *l2;
- int sel, hide /*, do_vdata */ /* UNUSED */;
+ int sel, hide;
if (BLI_smallhash_haskey(&visit, (uintptr_t)f))
continue;
BLI_smallhash_insert(&visit, (uintptr_t)f, NULL);
- /*the face attributes of the copied face will get
+ /* the face attributes of the copied face will get
* copied over, so its necessary to save the selection
* and hidden state*/
sel = BM_elem_flag_test(f, BM_ELEM_SELECT);
@@ -4732,16 +4739,13 @@ void projectSVData(TransInfo *t, int final)
copyf2 = BLI_smallhash_lookup(&sld->origfaces, (uintptr_t)f);
- /*project onto copied projection face*/
- BM_ITER(l2, &liter2, em->bm, BM_LOOPS_OF_FACE, f) {
+ /* project onto copied projection face */
+ BM_ITER_ELEM (l2, &liter2, f, BM_LOOPS_OF_FACE) {
copyf = copyf2;
- /* do_vdata = l2->v==tempsv->v; */ /* UNUSED */
if (BM_elem_flag_test(l2->e, BM_ELEM_SELECT) || BM_elem_flag_test(l2->prev->e, BM_ELEM_SELECT)) {
BMLoop *l3 = l2;
- /* do_vdata = 1; */ /* UNUSED */
-
if (!BM_elem_flag_test(l2->e, BM_ELEM_SELECT))
l3 = l3->prev;
@@ -4755,10 +4759,9 @@ void projectSVData(TransInfo *t, int final)
continue; /* shouldn't happen, but protection */
}
- /* do not run interpolation of all layers for now because it's not actually what you'll always expect
- * and layers like shapekeys shouldn't be interpolated from here because oherwise they'll
- * propagate to basis keys and will propagate twice to related keys (sergey) */
- // BM_loop_interp_from_face(em->bm, l2, copyf, do_vdata, FALSE);
+ /* only loop data, no vertex data since that contains shape keys,
+ * and we do not want to mess up other shape keys */
+ BM_loop_interp_from_face(em->bm, l2, copyf, FALSE, FALSE);
if (final) {
BM_loop_interp_multires(em->bm, l2, copyf);
@@ -4772,7 +4775,7 @@ void projectSVData(TransInfo *t, int final)
BM_elem_attrs_copy(em->bm, em->bm, copyf2, f);
/* restore selection and hidden flags */
- BM_elem_select_set(em->bm, f, sel);
+ BM_face_select_set(em->bm, f, sel);
if (!hide) { /* this check is a workaround for bug, see note - [#30735], without this edge can be hidden and selected */
BM_elem_hide_set(em->bm, f, hide);
}
@@ -4893,10 +4896,7 @@ static int doEdgeSlide(TransInfo *t, float perc)
}
}
- /* BMESH_TODO: simply not all layers should be interpolated from there
- * but it's quite complicated to set this up with current API.
- * details are in comments in projectSVData function */
- // projectSVData(t, 0);
+ projectSVData(t, 0);
return 1;
}
@@ -4928,6 +4928,8 @@ int EdgeSlide(TransInfo *t, const int UNUSED(mval[2]))
CLAMP(final, -1.0f, 1.0f);
+ t->values[0] = final;
+
/*do stuff here*/
if (t->customData)
doEdgeSlide(t, final);
diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index c273d6a5b4c..ba720ea8087 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -309,7 +309,7 @@ static void createTransEdge(TransInfo *t)
int count=0, countsel=0;
int propmode = t->flag & T_PROP_EDIT;
- BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) countsel++;
if (propmode) count++;
@@ -331,7 +331,7 @@ static void createTransEdge(TransInfo *t)
copy_m3_m4(mtx, t->obedit->obmat);
invert_m3_m3(smtx, mtx);
- BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN) && (BM_elem_flag_test(eed, BM_ELEM_SELECT) || propmode)) {
float *bweight = CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_BWEIGHT);
float *crease = CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_CREASE);
@@ -1888,7 +1888,7 @@ static void editmesh_set_connectivity_distance(BMEditMesh *em, float mtx[][3], f
BLI_smallhash_init(visit);
- BM_ITER(v, &viter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &viter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(v, BM_ELEM_SELECT)==0 || BM_elem_flag_test(v, BM_ELEM_HIDDEN))
continue;
@@ -1909,7 +1909,7 @@ static void editmesh_set_connectivity_distance(BMEditMesh *em, float mtx[][3], f
v2 = queue[start];
d = dqueue[start];
- BM_ITER(e, &eiter, em->bm, BM_EDGES_OF_VERT, v2) {
+ BM_ITER_ELEM (e, &eiter, v2, BM_EDGES_OF_VERT) {
float d2;
v3 = BM_edge_other_vert(e, v2);
@@ -1953,26 +1953,26 @@ static void editmesh_set_connectivity_distance(BMEditMesh *em, float mtx[][3], f
}
/* loop-in-a-loop I know, but we need it! (ton) */
- static void get_face_center(float cent_r[3], BMesh *bm, BMVert *eve)
+ static void get_face_center(float cent_r[3], BMVert *eve)
{
BMFace *efa;
BMIter iter;
- BM_ITER(efa, &iter, bm, BM_FACES_OF_VERT, eve) {
+ BM_ITER_ELEM (efa, &iter, eve, BM_FACES_OF_VERT) {
if (BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
- BM_face_center_mean_calc(bm, efa, cent_r);
+ BM_face_center_mean_calc(efa, cent_r);
break;
}
}
}
-static void get_edge_center(float cent_r[3], BMesh *bm, BMVert *eve)
+static void get_edge_center(float cent_r[3], BMVert *eve)
{
BMEdge *eed;
BMIter iter;
- BM_ITER(eed, &iter, bm, BM_EDGES_OF_VERT, eve) {
+ BM_ITER_ELEM (eed, &iter, eve, BM_EDGES_OF_VERT) {
if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
mid_v3_v3v3(cent_r, eed->v1->co, eed->v2->co);
break;
@@ -1993,9 +1993,9 @@ static void VertsToTransData(TransInfo *t, TransData *td, BMEditMesh *em, BMVert
if (t->around==V3D_LOCAL) {
if (em->selectmode & SCE_SELECT_FACE)
- get_face_center(td->center, em->bm, eve);
+ get_face_center(td->center, eve);
else if (em->selectmode & SCE_SELECT_EDGE)
- get_edge_center(td->center, em->bm, eve);
+ get_edge_center(td->center, eve);
}
copy_v3_v3(td->iloc, td->loc);
@@ -2051,7 +2051,7 @@ static void createTransEditVerts(bContext *C, TransInfo *t)
// transform now requires awareness for select mode, so we tag the f1 flags in verts
if (selectmode & SCE_SELECT_VERTEX) {
- BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
BM_elem_flag_set(eve, BM_ELEM_TAG, BM_elem_flag_test(eve, BM_ELEM_SELECT));
}
}
@@ -2452,7 +2452,7 @@ static void createTransUVs(bContext *C, TransInfo *t)
if (!ED_space_image_show_uvedit(sima, t->obedit)) return;
/* count */
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf= CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tf)) {
@@ -2461,7 +2461,7 @@ static void createTransUVs(bContext *C, TransInfo *t)
}
BM_elem_flag_enable(efa, BM_ELEM_TAG);
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
if (uvedit_uv_selected(em, scene, l))
countsel++;
@@ -2485,11 +2485,11 @@ static void createTransUVs(bContext *C, TransInfo *t)
td= t->data;
td2d= t->data2d;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
if (!propmode && !uvedit_uv_selected(em, scene, l))
continue;
@@ -2662,6 +2662,7 @@ static void createTransNlaData(bContext *C, TransInfo *t)
td= t->data;
t->customData= MEM_callocN(t->total*sizeof(TransDataNla), "TransDataNla (NLA Editor)");
tdn= t->customData;
+ t->flag |= T_FREE_CUSTOMDATA;
/* loop 2: build transdata array */
for (ale= anim_data.first; ale; ale= ale->next) {
@@ -4892,10 +4893,6 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
}
EDBM_automerge(t->scene, t->obedit, 1);
}
-#if 0
- /* BMESH_TODO: simply nothing to cancel from here, but when interpolation of
- * some custom layers would be added this code would eb needed
- * some details are in comments in projectSVData (sergey) */
else {
if (t->mode == TFM_EDGE_SLIDE) {
SlideData *sld = t->customData;
@@ -4904,7 +4901,6 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
projectSVData(t, FALSE);
}
}
-#endif
}
}
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index eb04ad04aa7..a7f58373e41 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -1524,7 +1524,7 @@ void calculateCenter(TransInfo *t)
BMEditMesh *em = BMEdit_FromObject(t->obedit);
if (EDBM_editselection_active_get(em, &ese)) {
- EDBM_editselection_center(em, t->center, &ese);
+ EDBM_editselection_center(t->center, &ese);
calculateCenter2D(t);
break;
}
diff --git a/source/blender/editors/transform/transform_manipulator.c b/source/blender/editors/transform/transform_manipulator.c
index c6b8403d54f..82e57cca705 100644
--- a/source/blender/editors/transform/transform_manipulator.c
+++ b/source/blender/editors/transform/transform_manipulator.c
@@ -301,7 +301,7 @@ int calc_manipulator_stats(const bContext *C)
/* USE LAST SELECTE WITH ACTIVE */
if (v3d->around==V3D_ACTIVE && EDBM_editselection_active_get(em, &ese)) {
- EDBM_editselection_center(em, vec, &ese);
+ EDBM_editselection_center(vec, &ese);
calc_tw_center(scene, vec);
totsel= 1;
}
@@ -315,7 +315,7 @@ int calc_manipulator_stats(const bContext *C)
* mode. note we can't use just vertex selection flag because
* it is not flush down on changes */
if (ts->selectmode & SCE_SELECT_VERTEX) {
- BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
totsel++;
@@ -327,10 +327,10 @@ int calc_manipulator_stats(const bContext *C)
else if (ts->selectmode & SCE_SELECT_EDGE) {
BMIter itersub;
BMEdge *eed;
- BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
/* check the vertex has a selected edge, only add it once */
- BM_ITER(eed, &itersub, bm, BM_EDGES_OF_VERT, eve) {
+ BM_ITER_ELEM (eed, &itersub, eve, BM_EDGES_OF_VERT) {
if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
totsel++;
calc_tw_center(scene, eve->co);
@@ -343,10 +343,10 @@ int calc_manipulator_stats(const bContext *C)
else {
BMIter itersub;
BMFace *efa;
- BM_ITER(eve, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
/* check the vertex has a selected face, only add it once */
- BM_ITER(efa, &itersub, bm, BM_FACES_OF_VERT, eve) {
+ BM_ITER_ELEM (efa, &itersub, eve, BM_FACES_OF_VERT) {
if (BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
totsel++;
calc_tw_center(scene, eve->co);
diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c
index cb7d9ae723b..09078c199c4 100644
--- a/source/blender/editors/transform/transform_ops.c
+++ b/source/blender/editors/transform/transform_ops.c
@@ -500,12 +500,12 @@ void Transform_Properties(struct wmOperatorType *ot, int flags)
if (flags & P_OPTIONS)
{
- RNA_def_boolean(ot->srna, "texture_space", 0, "Edit Object data texture space", "");
+ RNA_def_boolean(ot->srna, "texture_space", 0, "Edit Texture Space", "Edit Object data texture space");
}
if (flags & P_CORRECT_UV)
{
- RNA_def_boolean(ot->srna, "correct_uv", 0, "Correct UV coords when transforming", "");
+ RNA_def_boolean(ot->srna, "correct_uv", 0, "Correct UVs", "Correct UV coordinates when transforming");
}
// Add confirm method all the time. At the end because it's not really that important and should be hidden only in log, not in keymap edit
diff --git a/source/blender/editors/transform/transform_orientations.c b/source/blender/editors/transform/transform_orientations.c
index af9c03af1b6..bdd7c633df2 100644
--- a/source/blender/editors/transform/transform_orientations.c
+++ b/source/blender/editors/transform/transform_orientations.c
@@ -598,7 +598,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
BMFace *efa;
BMIter iter;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
add_v3_v3(normal, efa->no);
sub_v3_v3v3(vec,
@@ -615,7 +615,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
BMIter iter;
float cotangent[3];
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
if (v1 == NULL) {
v1 = eve;
@@ -639,7 +639,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
BMEdge *eed = NULL;
BMIter iter;
- BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
sub_v3_v3v3(plane, eed->v2->co, eed->v1->co);
break;
@@ -653,7 +653,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
BMEdge *eed = NULL;
BMIter iter;
- BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(eed, BM_ELEM_SELECT)) {
/* use average vert normals as plane and edge vector as normal */
copy_v3_v3(plane, eed->v1->no);
@@ -668,7 +668,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
BMVert *v1 = NULL, *v2 = NULL;
BMIter iter;
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
if (v1 == NULL) {
v1 = eve;
@@ -688,7 +688,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
else if (em->bm->totvertsel == 1) {
BMIter iter;
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
copy_v3_v3(normal, eve->no);
break;
@@ -701,7 +701,7 @@ int getTransformOrientation(const bContext *C, float normal[3], float plane[3],
zero_v3(normal);
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
add_v3_v3(normal, eve->no);
}
diff --git a/source/blender/editors/transform/transform_snap.c b/source/blender/editors/transform/transform_snap.c
index ea21a636300..7bdd3ddc069 100644
--- a/source/blender/editors/transform/transform_snap.c
+++ b/source/blender/editors/transform/transform_snap.c
@@ -1874,10 +1874,9 @@ static int peelObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, L
ED_view3d_win_to_ray(ar, v3d, mval, ray_start, ray_normal);
for (base = scene->base.first; base != NULL; base = base->next) {
- if ( BASE_SELECTABLE(v3d, base) ) {
+ if (BASE_SELECTABLE(v3d, base)) {
Object *ob = base->object;
-
-#if 0 //BMESH_TODO
+
if (ob->transflag & OB_DUPLI) {
DupliObject *dupli_ob;
ListBase *lb = object_duplilist(scene, ob);
@@ -1887,7 +1886,7 @@ static int peelObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, L
Object *dob = dupli_ob->ob;
if (dob->type == OB_MESH) {
- EditMesh *em;
+ BMEditMesh *em;
DerivedMesh *dm = NULL;
int val;
@@ -1897,8 +1896,8 @@ static int peelObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, L
val = peelDerivedMesh(dob, dm, dob->obmat, ray_start, ray_normal, mval, depth_peels);
}
else {
- em = ((Mesh *)dob->data)->edit_mesh;
- dm = editmesh_get_derived_cage(scene, obedit, em, CD_MASK_BAREMESH);
+ em = BMEdit_FromObject(dob);
+ dm = editbmesh_get_derived_cage(scene, obedit, em, CD_MASK_BAREMESH);
val = peelDerivedMesh(dob, dm, dob->obmat, ray_start, ray_normal, mval, depth_peels);
}
@@ -1911,7 +1910,6 @@ static int peelObjects(Scene *scene, View3D *v3d, ARegion *ar, Object *obedit, L
free_object_duplilist(lb);
}
-#endif
if (ob->type == OB_MESH) {
int val = 0;
diff --git a/source/blender/editors/util/CMakeLists.txt b/source/blender/editors/util/CMakeLists.txt
index 8eab2fda545..c13e6c16413 100644
--- a/source/blender/editors/util/CMakeLists.txt
+++ b/source/blender/editors/util/CMakeLists.txt
@@ -89,4 +89,8 @@ set(SRC
../include/UI_view2d.h
)
+if(WITH_INTERNATIONAL)
+ add_definitions(-DWITH_INTERNATIONAL)
+endif()
+
blender_add_lib(bf_editor_util "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/editors/util/SConscript b/source/blender/editors/util/SConscript
index 0a49c9c24a6..74879e54850 100644
--- a/source/blender/editors/util/SConscript
+++ b/source/blender/editors/util/SConscript
@@ -2,10 +2,14 @@
Import ('env')
sources = env.Glob('*.c')
+defs = []
incs = '../include ../../blenfont ../../blenlib ../../blenkernel ../../makesdna ../../imbuf'
incs += ' ../../windowmanager #/intern/guardedalloc #/extern/glew/include'
incs += ' ../../makesrna ../../bmesh'
incs += ' ../../blenloader'
-env.BlenderLib ( 'bf_editors_util', sources, Split(incs), [], libtype=['core','player'], priority=[330,210] )
+if env['WITH_BF_INTERNATIONAL']:
+ defs.append('WITH_INTERNATIONAL')
+
+env.BlenderLib ( 'bf_editors_util', sources, Split(incs), defines=defs, libtype=['core','player'], priority=[330,210] )
diff --git a/source/blender/editors/util/crazyspace.c b/source/blender/editors/util/crazyspace.c
index 504d296bda8..4b03c846f3e 100644
--- a/source/blender/editors/util/crazyspace.c
+++ b/source/blender/editors/util/crazyspace.c
@@ -149,13 +149,11 @@ void crazyspace_set_quats_editmesh(BMEditMesh *em, float *origcos, float *mapped
BM_mesh_elem_index_ensure(em->bm, BM_VERT);
- BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL)
- {
+ BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(v, BM_ELEM_SELECT) || BM_elem_flag_test(v, BM_ELEM_HIDDEN))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_VERT, v)
- {
+ BM_ITER_ELEM (l, &liter, v, BM_LOOPS_OF_VERT) {
BMLoop *l2 = BM_face_other_edge_loop(l->f, l->e, v);
/* retrieve mapped coordinates */
@@ -178,7 +176,7 @@ void crazyspace_set_quats_editmesh(BMEditMesh *em, float *origcos, float *mapped
}
index = 0;
- BM_ITER(v, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, em->bm, BM_VERTS_OF_MESH) {
if (vert_table[index] != 0)
BM_elem_index_set(v, vert_table[index] - 1); /* set_dirty! */
else
diff --git a/source/blender/editors/uvedit/uvedit_buttons.c b/source/blender/editors/uvedit/uvedit_buttons.c
index 123fe58100f..394b8952a13 100644
--- a/source/blender/editors/uvedit/uvedit_buttons.c
+++ b/source/blender/editors/uvedit/uvedit_buttons.c
@@ -72,12 +72,12 @@ static int uvedit_center(Scene *scene, BMEditMesh *em, Image *ima, float center[
int tot = 0.0;
zero_v2(center);
- BM_ITER(f, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, f->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, f, tf))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (uvedit_uv_selected(em, scene, l)) {
add_v2_v2(center, luv->uv);
@@ -101,8 +101,8 @@ static void uvedit_translate(Scene *scene, BMEditMesh *em, Image *UNUSED(ima), f
BMIter iter, liter;
MLoopUV *luv;
- BM_ITER(f, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (uvedit_uv_selected(em, scene, l)) {
add_v2_v2(luv->uv, delta);
diff --git a/source/blender/editors/uvedit/uvedit_draw.c b/source/blender/editors/uvedit/uvedit_draw.c
index c079388be1c..f40e344deb7 100644
--- a/source/blender/editors/uvedit/uvedit_draw.c
+++ b/source/blender/editors/uvedit/uvedit_draw.c
@@ -136,9 +136,9 @@ static void draw_uvs_shadow(Object *obedit)
/* draws the grey mesh when painting */
glColor3ub(112, 112, 112);
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
glBegin(GL_LINE_LOOP);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
glVertex2fv(luv->uv);
@@ -181,7 +181,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
{
float totarea = 0.0f, totuvarea = 0.0f, areadiff, uvarea, area;
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_MTEXPOLY);
BLI_array_empty(tf_uv);
@@ -190,7 +190,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
BLI_array_growitems(tf_uvorig, efa->len);
i = 0;
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
copy_v2_v2(tf_uvorig[i], luv->uv);
@@ -200,7 +200,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
poly_copy_aspect(tf_uvorig, tf_uv, aspx, aspy, efa->len);
- totarea += BM_face_area_calc(bm, efa);
+ totarea += BM_face_area_calc(efa);
//totuvarea += tf_area(tf, efa->v4!=0);
totuvarea += poly_uv_area(tf_uv, efa->len);
@@ -218,10 +218,10 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
col[0] = 1.0;
col[1] = col[2] = 0.0;
glColor3fv(col);
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(efa, BM_ELEM_TAG)) {
glBegin(GL_POLYGON);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
glVertex2fv(luv->uv);
}
@@ -230,9 +230,9 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
}
}
else {
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(efa, BM_ELEM_TAG)) {
- area = BM_face_area_calc(bm, efa) / totarea;
+ area = BM_face_area_calc(efa) / totarea;
BLI_array_empty(tf_uv);
BLI_array_empty(tf_uvorig);
@@ -240,7 +240,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
BLI_array_growitems(tf_uvorig, efa->len);
i = 0;
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
copy_v2_v2(tf_uvorig[i], luv->uv);
@@ -264,7 +264,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
glColor3fv(col);
glBegin(GL_POLYGON);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
glVertex2fv(luv->uv);
}
@@ -291,7 +291,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
glShadeModel(GL_SMOOTH);
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_MTEXPOLY);
if (uvedit_face_visible(scene, ima, efa, tf)) {
@@ -310,7 +310,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
BLI_array_growitems(av, nverts);
BLI_array_growitems(auv, nverts);
- BM_ITER_INDEX(l, &liter, bm, BM_LOOPS_OF_FACE, efa, i) {
+ BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
copy_v2_v2(tf_uvorig[i], luv->uv);
}
@@ -318,7 +318,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
poly_copy_aspect(tf_uvorig, tf_uv, aspx, aspy, nverts);
j = nverts - 1;
- BM_ITER_INDEX(l, &liter, bm, BM_LOOPS_OF_FACE, efa, i) {
+ BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
sub_v2_v2v2(auv[i], tf_uv[j], tf_uv[i]); normalize_v2(auv[i]);
sub_v3_v3v3(av[i], l->prev->v->co, l->v->co); normalize_v3(av[i]);
j = i;
@@ -336,7 +336,7 @@ static void draw_uvs_stretch(SpaceImage *sima, Scene *scene, BMEditMesh *em, MTe
}
glBegin(GL_POLYGON);
- BM_ITER_INDEX(l, &liter, bm, BM_LOOPS_OF_FACE, efa, i) {
+ BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
a = fabsf(uvang[i] - ang[i]) / (float)M_PI;
weight_to_rgb(col, 1.0f - powf((1.0f - a), 2.0f));
@@ -503,7 +503,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_MTEXPOLY);
if (uvedit_face_visible(scene, ima, efa, tf)) {
@@ -516,7 +516,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
glColor4ubv((GLubyte *)col1);
glBegin(GL_POLYGON);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
glVertex2fv(luv->uv);
}
@@ -533,7 +533,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
else {
/* would be nice to do this within a draw loop but most below are optional, so it would involve too many checks */
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_MTEXPOLY);
if (uvedit_face_visible(scene, ima, efa, tf)) {
@@ -561,7 +561,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
glPolygonStipple(stipple_quarttone);
glBegin(GL_POLYGON);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, activef) {
+ BM_ITER_ELEM (l, &liter, activef, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
glVertex2fv(luv->uv);
}
@@ -582,7 +582,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
switch (sima->dt_uv) {
case SI_UVDT_DASH:
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
continue;
tf = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_MTEXPOLY);
@@ -591,7 +591,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
cpack(0x111111);
glBegin(GL_LINE_LOOP);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
glVertex2fv(luv->uv);
}
@@ -601,7 +601,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
cpack(0x909090);
glBegin(GL_LINE_LOOP);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
glVertex2fv(luv->uv);
}
@@ -625,12 +625,12 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
if (sima->dt_uv == SI_UVDT_WHITE) glColor3f(1.0f, 1.0f, 1.0f);
else glColor3f(0.0f, 0.0f, 0.0f);
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
continue;
glBegin(GL_LINE_LOOP);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
glVertex2fv(luv->uv);
}
@@ -641,12 +641,12 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
glLineWidth(3);
cpack(0x0);
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
continue;
glBegin(GL_LINE_LOOP);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
glVertex2fv(luv->uv);
}
@@ -664,12 +664,12 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
if (interpedges) {
glShadeModel(GL_SMOOTH);
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
continue;
glBegin(GL_LINE_LOOP);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
sel = (uvedit_uv_selected(em, scene, l) ? 1 : 0);
glColor4ubv(sel ? (GLubyte *)col1 : (GLubyte *)col2);
@@ -682,12 +682,12 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
glShadeModel(GL_FLAT);
}
else {
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
continue;
glBegin(GL_LINES);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
sel = (uvedit_edge_selected(em, scene, l) ? 1 : 0);
if (sel != lastsel) {
glColor4ubv(sel ? (GLubyte *)col1 : (GLubyte *)col2);
@@ -704,12 +704,12 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
}
else {
/* no nice edges */
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
continue;
glBegin(GL_LINE_LOOP);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
glVertex2fv(luv->uv);
}
@@ -737,7 +737,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
UI_ThemeColor(TH_WIRE);
bglBegin(GL_POINTS);
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
continue;
@@ -752,7 +752,7 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
UI_ThemeColor(TH_FACE_DOT);
bglBegin(GL_POINTS);
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
continue;
@@ -773,11 +773,11 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
glPointSize(pointsize);
bglBegin(GL_POINTS);
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
continue;
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
if (!uvedit_uv_selected(em, scene, l))
bglVertex2fv(luv->uv);
@@ -791,11 +791,11 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
cpack(0xFF);
bglBegin(GL_POINTS);
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
continue;
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
if (luv->flag & MLOOPUV_PINNED)
@@ -809,11 +809,11 @@ static void draw_uvs(SpaceImage *sima, Scene *scene, Object *obedit)
glPointSize(pointsize);
bglBegin(GL_POINTS);
- BM_ITER(efa, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_TAG))
continue;
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
if (uvedit_uv_selected(em, scene, l))
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index 0556e7fecc0..969fa684c80 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -204,7 +204,7 @@ void ED_uvedit_assign_image(Main *bmain, Scene *scene, Object *obedit, Image *im
}
/* now assign to all visible faces */
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (uvedit_face_visible(scene, previma, efa, tf)) {
@@ -251,7 +251,7 @@ static int uvedit_set_tile(Object *obedit, Image *ima, int curtile)
em = BMEdit_FromObject(obedit);
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN) && BM_elem_flag_test(efa, BM_ELEM_SELECT))
@@ -314,7 +314,7 @@ int uvedit_face_selected(Scene *scene, BMEditMesh *em, BMFace *efa)
MLoopUV *luv;
BMIter liter;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (!(luv->flag & MLOOPUV_VERTSEL))
return 0;
@@ -329,13 +329,13 @@ int uvedit_face_select(Scene *scene, BMEditMesh *em, BMFace *efa)
ToolSettings *ts = scene->toolsettings;
if (ts->uv_flag & UV_SYNC_SELECTION)
- BM_elem_select_set(em->bm, efa, TRUE);
+ BM_face_select_set(em->bm, efa, TRUE);
else {
BMLoop *l;
MLoopUV *luv;
BMIter liter;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
luv->flag |= MLOOPUV_VERTSEL;
}
@@ -351,14 +351,14 @@ int uvedit_face_deselect(Scene *scene, BMEditMesh *em, BMFace *efa)
ToolSettings *ts = scene->toolsettings;
if (ts->uv_flag & UV_SYNC_SELECTION) {
- BM_elem_select_set(em->bm, efa, FALSE);
+ BM_face_select_set(em->bm, efa, FALSE);
}
else {
BMLoop *l;
MLoopUV *luv;
BMIter liter;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
luv->flag &= ~MLOOPUV_VERTSEL;
}
@@ -402,12 +402,12 @@ void uvedit_edge_select(BMEditMesh *em, Scene *scene, BMLoop *l)
if (ts->uv_flag & UV_SYNC_SELECTION) {
if (ts->selectmode & SCE_SELECT_FACE)
- BM_elem_select_set(em->bm, l->f, TRUE);
+ BM_face_select_set(em->bm, l->f, TRUE);
else if (ts->selectmode & SCE_SELECT_EDGE)
- BM_elem_select_set(em->bm, l->e, TRUE);
+ BM_edge_select_set(em->bm, l->e, TRUE);
else {
- BM_elem_select_set(em->bm, l->e->v1, TRUE);
- BM_elem_select_set(em->bm, l->e->v2, TRUE);
+ BM_vert_select_set(em->bm, l->e->v1, TRUE);
+ BM_vert_select_set(em->bm, l->e->v2, TRUE);
}
}
else {
@@ -428,12 +428,12 @@ void uvedit_edge_deselect(BMEditMesh *em, Scene *scene, BMLoop *l)
if (ts->uv_flag & UV_SYNC_SELECTION) {
if (ts->selectmode & SCE_SELECT_FACE)
- BM_elem_select_set(em->bm, l->f, FALSE);
+ BM_face_select_set(em->bm, l->f, FALSE);
else if (ts->selectmode & SCE_SELECT_EDGE)
- BM_elem_select_set(em->bm, l->e, FALSE);
+ BM_edge_select_set(em->bm, l->e, FALSE);
else {
- BM_elem_select_set(em->bm, l->e->v1, FALSE);
- BM_elem_select_set(em->bm, l->e->v2, FALSE);
+ BM_vert_select_set(em->bm, l->e->v1, FALSE);
+ BM_vert_select_set(em->bm, l->e->v2, FALSE);
}
}
else {
@@ -470,9 +470,9 @@ void uvedit_uv_select(BMEditMesh *em, Scene *scene, BMLoop *l)
if (ts->uv_flag & UV_SYNC_SELECTION) {
if (ts->selectmode & SCE_SELECT_FACE)
- BM_elem_select_set(em->bm, l->f, TRUE);
+ BM_face_select_set(em->bm, l->f, TRUE);
else
- BM_elem_select_set(em->bm, l->v, TRUE);
+ BM_vert_select_set(em->bm, l->v, TRUE);
}
else {
MLoopUV *luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
@@ -487,9 +487,9 @@ void uvedit_uv_deselect(BMEditMesh *em, Scene *scene, BMLoop *l)
if (ts->uv_flag & UV_SYNC_SELECTION) {
if (ts->selectmode & SCE_SELECT_FACE)
- BM_elem_select_set(em->bm, l->f, FALSE);
+ BM_face_select_set(em->bm, l->f, FALSE);
else
- BM_elem_select_set(em->bm, l->v, FALSE);
+ BM_vert_select_set(em->bm, l->v, FALSE);
}
else {
MLoopUV *luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
@@ -518,7 +518,7 @@ void poly_uv_center(BMEditMesh *em, BMFace *f, float cent[2])
zero_v2(cent);
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
add_v2_v2(cent, luv->uv);
}
@@ -597,12 +597,12 @@ int ED_uvedit_minmax(Scene *scene, Image *ima, Object *obedit, float *min, float
INIT_MINMAX2(min, max);
sel = 0;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tf))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
if (uvedit_uv_selected(em, scene, l)) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
DO_MINMAX2(luv->uv, min, max);
@@ -625,12 +625,12 @@ static int ED_uvedit_median(Scene *scene, Image *ima, Object *obedit, float co[2
unsigned int sel = 0;
zero_v2(co);
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tf))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (uvedit_uv_selected(em, scene, l)) {
add_v2_v2(co, luv->uv);
@@ -681,13 +681,13 @@ void uv_find_nearest_edge(Scene *scene, Image *ima, BMEditMesh *em, float co[2],
BM_mesh_elem_index_ensure(em->bm, BM_VERT);
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tf))
continue;
i = 0;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
nextluv = CustomData_bmesh_get(&em->bm->ldata, l->next->head.data, CD_MLOOPUV);
@@ -730,13 +730,13 @@ static void find_nearest_uv_face(Scene *scene, Image *ima, BMEditMesh *em, float
hit->l = hit->nextl = NULL;
hit->luv = hit->nextluv = NULL;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tf))
continue;
cent[0] = cent[1] = 0.0f;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
add_v2_v2(cent, luv->uv);
@@ -770,7 +770,7 @@ static int nearest_uv_between(BMEditMesh *em, BMFace *efa, int UNUSED(nverts), i
m[1] = co[1] - uv[1];
i = 0;
- BM_ITER(l, &iter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &iter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (i == id1)
@@ -821,13 +821,13 @@ void uv_find_nearest_vert(Scene *scene, Image *ima, BMEditMesh *em,
BM_mesh_elem_index_ensure(em->bm, BM_VERT);
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tf))
continue;
i = 0;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (penalty && uvedit_uv_selected(em, scene, l))
@@ -874,12 +874,12 @@ int ED_uvedit_nearest_uv(Scene *scene, Object *obedit, Image *ima, float co[2],
uv[0] = co[0];
uv[1] = co[1];
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tf))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
dist = fabs(co[0] - luv->uv[0]) + fabs(co[1] - luv->uv[1]);
@@ -1014,7 +1014,7 @@ static int select_edgeloop(Scene *scene, Image *ima, BMEditMesh *em, NearestHit
BM_mesh_elem_index_ensure(em->bm, BM_VERT);
count = 0;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!extend) {
uvedit_face_deselect(scene, em, efa);
}
@@ -1047,7 +1047,7 @@ static int select_edgeloop(Scene *scene, Image *ima, BMEditMesh *em, NearestHit
/* find correct valence edges which are not tagged yet, but connect to tagged one */
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!BMO_elem_flag_test(em->bm, efa, EFA_F1_FLAG) && uvedit_face_visible(scene, ima, efa, tf)) {
@@ -1092,9 +1092,9 @@ static int select_edgeloop(Scene *scene, Image *ima, BMEditMesh *em, NearestHit
else
select = 1;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
a = 0;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
iterv1 = uv_vertex_map_get(vmap, efa, a);
if (iterv1->flag) {
@@ -1138,11 +1138,11 @@ static void select_linked(Scene *scene, Image *ima, BMEditMesh *em, float limit[
flag = MEM_callocN(sizeof(*flag) * em->bm->totface, "UvLinkFlag");
if (!hit) {
- BM_ITER_INDEX(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL, a) {
+ BM_ITER_MESH_INDEX (efa, &iter, em->bm, BM_FACES_OF_MESH, a) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (uvedit_face_visible(scene, ima, efa, tf)) {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (luv->flag & MLOOPUV_VERTSEL) {
@@ -1158,7 +1158,7 @@ static void select_linked(Scene *scene, Image *ima, BMEditMesh *em, float limit[
}
else {
a = 0;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (efa == hit->efa) {
stack[stacksize] = a;
stacksize++;
@@ -1177,7 +1177,7 @@ static void select_linked(Scene *scene, Image *ima, BMEditMesh *em, float limit[
a = stack[stacksize];
j = 0;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (j == a)
break;
@@ -1185,7 +1185,7 @@ static void select_linked(Scene *scene, Image *ima, BMEditMesh *em, float limit[
}
i = 0;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
/* make_uv_vert_map_EM sets verts tmp.l to the indices */
vlist = EDBM_uv_vert_map_at_index(vmap, BM_elem_index_get(l->v));
@@ -1215,8 +1215,8 @@ static void select_linked(Scene *scene, Image *ima, BMEditMesh *em, float limit[
if (!extend) {
a = 0;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (flag[a])
@@ -1229,13 +1229,13 @@ static void select_linked(Scene *scene, Image *ima, BMEditMesh *em, float limit[
}
else {
a = 0;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!flag[a]) {
a++;
continue;
}
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (luv->flag & MLOOPUV_VERTSEL)
@@ -1250,13 +1250,13 @@ static void select_linked(Scene *scene, Image *ima, BMEditMesh *em, float limit[
if (efa) {
a = 0;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!flag[a]) {
a++;
continue;
}
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
luv->flag &= ~MLOOPUV_VERTSEL;
@@ -1267,13 +1267,13 @@ static void select_linked(Scene *scene, Image *ima, BMEditMesh *em, float limit[
}
else {
a = 0;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!flag[a]) {
a++;
continue;
}
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
luv->flag |= MLOOPUV_VERTSEL;
@@ -1297,7 +1297,7 @@ static float *uv_sel_co_from_eve(Scene *scene, Image *ima, BMEditMesh *em, BMVer
BMIter liter;
BMLoop *l;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_VERT, eve) {
+ BM_ITER_ELEM (l, &liter, eve, BM_LOOPS_OF_VERT) {
MTexPoly *tf = CustomData_bmesh_get(&em->bm->pdata, l->f->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, l->f, tf))
@@ -1338,13 +1338,13 @@ static void weld_align_uv(bContext *C, int tool)
BMFace *efa;
BMLoop *l;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tf))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
if (uvedit_uv_selected(em, scene, l)) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
DO_MINMAX2(luv->uv, min, max);
@@ -1361,12 +1361,12 @@ static void weld_align_uv(bContext *C, int tool)
BMFace *efa;
BMLoop *l;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tf))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
if (uvedit_uv_selected(em, scene, l)) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
luv->uv[0] = cent[0];
@@ -1380,12 +1380,12 @@ static void weld_align_uv(bContext *C, int tool)
BMFace *efa;
BMLoop *l;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tf))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
if (uvedit_uv_selected(em, scene, l)) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
luv->uv[1] = cent[1];
@@ -1403,13 +1403,13 @@ static void weld_align_uv(bContext *C, int tool)
BMIter iter, liter, eiter;
/* clear tag */
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
BM_elem_flag_disable(eve, BM_ELEM_TAG);
}
/* tag verts with a selected UV */
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_VERT, eve) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
+ BM_ITER_ELEM (l, &liter, eve, BM_LOOPS_OF_VERT) {
tf = CustomData_bmesh_get(&em->bm->pdata, l->f->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, l->f, tf))
@@ -1423,16 +1423,16 @@ static void weld_align_uv(bContext *C, int tool)
}
/* flush vertex tags to edges */
- BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
BM_elem_flag_set(eed, BM_ELEM_TAG, (BM_elem_flag_test(eed->v1, BM_ELEM_TAG) &&
BM_elem_flag_test(eed->v2, BM_ELEM_TAG)));
}
/* find a vertex with only one tagged edge */
eve_start = NULL;
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
int tot_eed_tag = 0;
- BM_ITER(eed, &eiter, em->bm, BM_EDGES_OF_VERT, eve) {
+ BM_ITER_ELEM (eed, &eiter, eve, BM_EDGES_OF_VERT) {
if (BM_elem_flag_test(eed, BM_ELEM_TAG)) {
tot_eed_tag++;
}
@@ -1461,7 +1461,7 @@ static void weld_align_uv(bContext *C, int tool)
eve_next = NULL;
/* find next eve */
- BM_ITER(eed, &eiter, em->bm, BM_EDGES_OF_VERT, eve) {
+ BM_ITER_ELEM (eed, &eiter, eve, BM_EDGES_OF_VERT) {
if (BM_elem_flag_test(eed, BM_ELEM_TAG)) {
BMVert *eve_other = BM_edge_other_vert(eed, eve);
if (BM_elem_flag_test(eve_other, BM_ELEM_TAG)) {
@@ -1481,17 +1481,25 @@ static void weld_align_uv(bContext *C, int tool)
/* we know the returns from these must be valid */
float *uv_start = uv_sel_co_from_eve(scene, ima, em, eve_line[0]);
float *uv_end = uv_sel_co_from_eve(scene, ima, em, eve_line[BLI_array_count(eve_line) - 1]);
+ /* For t & u modes */
+ float a = 0.0f;
if (tool == 't') {
- uv_start[0] = uv_end[0] = (uv_start[0] + uv_end[0]) * 0.5f;
+ if (uv_start[1] == uv_end[1])
+ tool = 's';
+ else
+ a = (uv_end[0] - uv_start[0]) / (uv_end[1] - uv_start[1]);
}
else if (tool == 'u') {
- uv_start[1] = uv_end[1] = (uv_start[1] + uv_end[1]) * 0.5f;
+ if (uv_start[0] == uv_end[0])
+ tool = 's';
+ else
+ a = (uv_end[1] - uv_start[1]) / (uv_end[0] - uv_start[0]);
}
/* go over all verts except for endpoints */
for (i = 0; i < BLI_array_count(eve_line); i++) {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_VERT, eve_line[i]) {
+ BM_ITER_ELEM (l, &liter, eve_line[i], BM_LOOPS_OF_VERT) {
tf = CustomData_bmesh_get(&em->bm->pdata, l->f->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, l->f, tf))
@@ -1499,7 +1507,16 @@ static void weld_align_uv(bContext *C, int tool)
if (uvedit_uv_selected(em, scene, l)) {
MLoopUV *luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
- closest_to_line_segment_v2(luv->uv, luv->uv, uv_start, uv_end);
+ /* Projection of point (x, y) over line (x1, y1, x2, y2) along X axis:
+ * new_y = (y2 - y1) / (x2 - x1) * (x - x1) + y1
+ * Maybe this should be a BLI func? Or is it already existing?
+ * Could use interp_v2_v2v2, but not sure it’s worth it here...*/
+ if (tool == 't')
+ luv->uv[0] = a * (luv->uv[1] - uv_start[1]) + uv_start[0];
+ else if (tool == 'u')
+ luv->uv[1] = a * (luv->uv[0] - uv_start[0]) + uv_start[1];
+ else
+ closest_to_line_segment_v2(luv->uv, luv->uv, uv_start, uv_end);
}
}
}
@@ -1620,13 +1637,13 @@ static void select_all_perform(bContext *C, int action)
else {
if (action == SEL_TOGGLE) {
action = SEL_SELECT;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tf))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (luv->flag & MLOOPUV_VERTSEL) {
@@ -1638,13 +1655,13 @@ static void select_all_perform(bContext *C, int action)
}
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tf))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
switch (action) {
@@ -1839,7 +1856,7 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop)
BLI_array_growitems(hitv, hit.efa->len);
BLI_array_growitems(hituv, hit.efa->len);
i = 0;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, hit.efa) {
+ BM_ITER_ELEM (l, &liter, hit.efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
hituv[i] = luv->uv;
hitv[i] = BM_elem_index_get(l->v);
@@ -1918,12 +1935,12 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop)
/* deselect */
if (select == 0) {
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tf))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (sticky_select(limit, hitv, BM_elem_index_get(l->v), hituv, luv->uv, sticky, hitlen))
uvedit_uv_deselect(em, scene, l);
@@ -1933,12 +1950,12 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop)
}
/* select */
else {
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tf))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (sticky_select(limit, hitv, BM_elem_index_get(l->v), hituv, luv->uv, sticky, hitlen))
uvedit_uv_select(em, scene, l);
@@ -1951,7 +1968,7 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop)
}
else {
/* deselect all */
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
uvedit_face_deselect(scene, em, efa);
}
@@ -1972,12 +1989,12 @@ static int mouse_select(bContext *C, float co[2], int extend, int loop)
/* select sticky uvs */
if (sticky != SI_STICKY_DISABLE) {
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tf))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
if (sticky == SI_STICKY_DISABLE) continue;
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
@@ -2224,14 +2241,14 @@ static int unlink_selection_exec(bContext *C, wmOperator *op)
return OPERATOR_CANCELLED;
}
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
int desel = 0;
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tf))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (!(luv->flag & MLOOPUV_VERTSEL)) {
@@ -2241,7 +2258,7 @@ static int unlink_selection_exec(bContext *C, wmOperator *op)
}
if (desel) {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
luv->flag &= ~MLOOPUV_VERTSEL;
}
@@ -2296,23 +2313,23 @@ static void uv_faces_do_sticky(bContext *C, SpaceImage *sima, Scene *scene, Obje
* in the loop and select all MLoopUV's that use a touched vert. */
BMVert *eve;
- BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
BM_elem_flag_disable(eve, BM_ELEM_TAG);
}
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(efa, BM_ELEM_TAG)) {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
BM_elem_flag_enable(l->v, BM_ELEM_TAG);
}
}
}
/* now select tagged verts */
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
/* tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); */ /* UNUSED */
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
if (BM_elem_flag_test(l->v, BM_ELEM_TAG)) {
if (select)
uvedit_uv_select(em, scene, l);
@@ -2338,11 +2355,6 @@ static void uv_faces_do_sticky(bContext *C, SpaceImage *sima, Scene *scene, Obje
vmap = EDBM_uv_vert_map_create(em, 0, 0, limit);
/* verts are numbered above in make_uv_vert_map_EM, make sure this stays true! */
- /* BMESH_TODO - why keep this commented? - campbell */
-#if 0
- for (a = 0, eve = em->verts.first; eve; a++, eve = eve->next)
- eve->tmp.l = a;
-#endif
if (vmap == NULL) {
return;
}
@@ -2352,7 +2364,7 @@ static void uv_faces_do_sticky(bContext *C, SpaceImage *sima, Scene *scene, Obje
if (BM_elem_flag_test(efa, BM_ELEM_TAG)) {
/* tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); */ /* UNUSED */
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
if (select)
uvedit_uv_select(em, scene, l);
else
@@ -2395,7 +2407,7 @@ static void uv_faces_do_sticky(bContext *C, SpaceImage *sima, Scene *scene, Obje
}
else { /* SI_STICKY_DISABLE or ts->uv_flag & UV_SYNC_SELECTION */
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(efa, BM_ELEM_TAG)) {
if (select)
uvedit_face_select(scene, em, efa);
@@ -2453,7 +2465,7 @@ static int border_select_exec(bContext *C, wmOperator *op)
change = 0;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
/* assume not touched */
BM_elem_flag_disable(efa, BM_ELEM_TAG);
@@ -2475,11 +2487,11 @@ static int border_select_exec(bContext *C, wmOperator *op)
/* other selection modes */
change = 1;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tf))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (!pinned || (ts->uv_flag & UV_SYNC_SELECTION) ) {
@@ -2596,8 +2608,8 @@ static int circle_select_exec(bContext *C, wmOperator *op)
UI_view2d_region_to_view(&ar->v2d, x, y, &offset[0], &offset[1]);
/* do selection */
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
select_uv_inside_ellipse(em, sima, scene, select, offset, ellipse, l, luv);
}
@@ -2716,12 +2728,12 @@ static int snap_uvs_to_cursor(Scene *scene, Image *ima, Object *obedit, SpaceIma
MLoopUV *luv;
short change = 0;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tface = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tface))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
if (uvedit_uv_selected(em, scene, l)) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
copy_v2_v2(luv->uv, sima->cursor);
@@ -2746,11 +2758,11 @@ static int snap_uvs_to_adjacent_unselected(Scene *scene, Image *ima, Object *obe
/* index every vert that has a selected UV using it, but only once so as to
* get unique indices and to count how much to malloc */
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
tface = CustomData_bmesh_get(&bm->pdata, f->head.data, CD_MTEXPOLY);
if (uvedit_face_visible(scene, ima, f, tface)) {
BM_elem_flag_enable(f, BM_ELEM_TAG);
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
BM_elem_flag_set(l, BM_ELEM_TAG, uvedit_uv_selected(em, scene, l));
}
}
@@ -2759,14 +2771,14 @@ static int snap_uvs_to_adjacent_unselected(Scene *scene, Image *ima, Object *obe
}
}
- BM_ITER(f, &iter, bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(f, BM_ELEM_TAG)) { /* face: visible */
- BM_ITER(l, &liter, bm, BM_LOOPS_OF_FACE, f) {
+ BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
if (BM_elem_flag_test(l, BM_ELEM_TAG)) { /* loop: selected*/
float uv[2] = {0.0f, 0.0f};
int uv_tot = 0;
- BM_ITER(lsub, &lsubiter, bm, BM_LOOPS_OF_VERT, l->v) {
+ BM_ITER_ELEM (lsub, &lsubiter, l->v, BM_LOOPS_OF_VERT) {
if (BM_elem_flag_test(lsub->f, BM_ELEM_TAG) && /* face: visible */
!BM_elem_flag_test(lsub, BM_ELEM_TAG)) /* loop: unselected */
{
@@ -2807,12 +2819,12 @@ static int snap_uvs_to_pixels(SpaceImage *sima, Scene *scene, Object *obedit)
w = (float)width;
h = (float)height;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tface = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tface))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
if (uvedit_uv_selected(em, scene, l)) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
snap_uv_to_pixel(luv->uv, w, h);
@@ -2892,12 +2904,12 @@ static int pin_exec(bContext *C, wmOperator *op)
MLoopUV *luv;
int clear = RNA_boolean_get(op->ptr, "clear");
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tface = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tface))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (!clear) {
@@ -2946,12 +2958,12 @@ static int select_pinned_exec(bContext *C, wmOperator *UNUSED(op))
MTexPoly *tface;
MLoopUV *luv;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tface = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!uvedit_face_visible(scene, ima, efa, tface))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (luv->flag & MLOOPUV_PINNED)
@@ -3023,7 +3035,7 @@ static int hide_exec(bContext *C, wmOperator *op)
return OPERATOR_FINISHED;
}
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
int hide = 0;
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
@@ -3032,7 +3044,7 @@ static int hide_exec(bContext *C, wmOperator *op)
continue;
}
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (UV_SEL_TEST(luv, !swap)) {
@@ -3048,16 +3060,16 @@ static int hide_exec(bContext *C, wmOperator *op)
if (em->selectmode == SCE_SELECT_FACE) {
/* check that every UV is selected */
if (bm_face_is_all_uv_sel(em->bm, efa, TRUE) == !swap) {
- BM_elem_select_set(em->bm, efa, FALSE);
+ BM_face_select_set(em->bm, efa, FALSE);
}
uvedit_face_deselect(scene, em, efa);
}
else {
if (bm_face_is_all_uv_sel(em->bm, efa, TRUE) == !swap) {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (UV_SEL_TEST(luv, !swap)) {
- BM_elem_select_set(em->bm, l->v, FALSE);
+ BM_vert_select_set(em->bm, l->v, FALSE);
}
}
}
@@ -3069,15 +3081,15 @@ static int hide_exec(bContext *C, wmOperator *op)
else if (em->selectmode == SCE_SELECT_FACE) {
/* check if a UV is de-selected */
if (bm_face_is_all_uv_sel(em->bm, efa, FALSE) != !swap) {
- BM_elem_select_set(em->bm, efa, FALSE);
+ BM_face_select_set(em->bm, efa, FALSE);
uvedit_face_deselect(scene, em, efa);
}
}
else {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (UV_SEL_TEST(luv, !swap)) {
- BM_elem_select_set(em->bm, l->v, FALSE);
+ BM_vert_select_set(em->bm, l->v, FALSE);
if (!swap) luv->flag &= ~MLOOPUV_VERTSEL;
}
}
@@ -3141,14 +3153,14 @@ static int reveal_exec(bContext *C, wmOperator *UNUSED(op))
}
if (facemode) {
if (em->selectmode == SCE_SELECT_FACE) {
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
BM_elem_flag_disable(efa, BM_ELEM_TAG);
if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN) && !BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
luv->flag |= MLOOPUV_VERTSEL;
}
- /* BM_elem_select_set(em->bm, efa, TRUE); */
+ /* BM_face_select_set(em->bm, efa, TRUE); */
BM_elem_flag_enable(efa, BM_ELEM_TAG);
}
}
@@ -3156,36 +3168,36 @@ static int reveal_exec(bContext *C, wmOperator *UNUSED(op))
else {
/* enable adjacent faces to have disconnected UV selections if sticky is disabled */
if (!stickymode) {
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
BM_elem_flag_disable(efa, BM_ELEM_TAG);
if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN) && !BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
int totsel = 0;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
totsel += BM_elem_flag_test(l->v, BM_ELEM_SELECT);
}
if (!totsel) {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
luv->flag |= MLOOPUV_VERTSEL;
}
- /* BM_elem_select_set(em->bm, efa, TRUE); */
+ /* BM_face_select_set(em->bm, efa, TRUE); */
BM_elem_flag_enable(efa, BM_ELEM_TAG);
}
}
}
}
else {
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
BM_elem_flag_disable(efa, BM_ELEM_TAG);
if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN) && !BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
if (BM_elem_flag_test(l->v, BM_ELEM_SELECT) == 0) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
luv->flag |= MLOOPUV_VERTSEL;
}
}
- /* BM_elem_select_set(em->bm, efa, TRUE); */
+ /* BM_face_select_set(em->bm, efa, TRUE); */
BM_elem_flag_enable(efa, BM_ELEM_TAG);
}
}
@@ -3193,29 +3205,29 @@ static int reveal_exec(bContext *C, wmOperator *UNUSED(op))
}
}
else if (em->selectmode == SCE_SELECT_FACE) {
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
BM_elem_flag_disable(efa, BM_ELEM_TAG);
if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN) && !BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
luv->flag |= MLOOPUV_VERTSEL;
}
- /* BM_elem_select_set(em->bm, efa, TRUE); */
+ /* BM_face_select_set(em->bm, efa, TRUE); */
BM_elem_flag_enable(efa, BM_ELEM_TAG);
}
}
}
else {
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
BM_elem_flag_disable(efa, BM_ELEM_TAG);
if (!BM_elem_flag_test(efa, BM_ELEM_HIDDEN) && !BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
if (BM_elem_flag_test(l->v, BM_ELEM_SELECT) == 0) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
luv->flag |= MLOOPUV_VERTSEL;
}
}
- /* BM_elem_select_set(em->bm, efa, TRUE); */
+ /* BM_face_select_set(em->bm, efa, TRUE); */
BM_elem_flag_enable(efa, BM_ELEM_TAG);
}
}
@@ -3383,7 +3395,7 @@ static int seams_from_islands_exec(bContext *C, wmOperator *op)
EDBM_index_arrays_init(em, 0, 0, 1);
vmap = EDBM_uv_vert_map_create(em, 0, 0, limit);
- BM_ITER(editedge, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (editedge, &iter, bm, BM_EDGES_OF_MESH) {
/* flags to determine if we uv is separated from first editface match */
char separated1 = 0, separated2;
/* set to denote edge must be flagged as seam */
@@ -3499,10 +3511,10 @@ static int mark_seam_exec(bContext *C, wmOperator *UNUSED(op))
BMIter iter, liter;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
- BM_ITER(loop, &liter, bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
+ BM_ITER_ELEM (loop, &liter, efa, BM_LOOPS_OF_FACE) {
if (uvedit_edge_selected(em, scene, loop)) {
- BM_elem_flag_enable(loop, BM_ELEM_SEAM);
+ BM_elem_flag_enable(loop->e, BM_ELEM_SEAM);
}
}
}
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.c b/source/blender/editors/uvedit/uvedit_parametrizer.c
index d2c711fccf3..c99d6e992b7 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.c
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.c
@@ -742,7 +742,7 @@ static PEdge *p_edge_lookup(PHandle *handle, PHashKey *vkeys)
return NULL;
}
-int p_face_exists(ParamHandle *phandle, ParamKey *pvkeys, int i1, int i2, int i3)
+static int p_face_exists(ParamHandle *phandle, ParamKey *pvkeys, int i1, int i2, int i3)
{
PHandle *handle = (PHandle *)phandle;
PHashKey *vkeys = (PHashKey *)pvkeys;
@@ -4131,7 +4131,7 @@ void param_face_add(ParamHandle *handle, ParamKey key, int nverts,
p_face_add_construct(phandle, key, vkeys, co, uv, 1, 2, 3, pin, select);
}
}
- else
+ else if(!p_face_exists(phandle, vkeys, 0, 1, 2))
p_face_add_construct(phandle, key, vkeys, co, uv, 0, 1, 2, pin, select);
}
diff --git a/source/blender/editors/uvedit/uvedit_parametrizer.h b/source/blender/editors/uvedit/uvedit_parametrizer.h
index 00cbbd16073..1643a89b089 100644
--- a/source/blender/editors/uvedit/uvedit_parametrizer.h
+++ b/source/blender/editors/uvedit/uvedit_parametrizer.h
@@ -33,8 +33,6 @@ ParamHandle *param_construct_begin(void);
void param_aspect_ratio(ParamHandle *handle, float aspx, float aspy);
-int p_face_exists(ParamHandle *handle, ParamKey *vkeys, int i1, int i2, int i3);
-
void param_face_add(ParamHandle *handle,
ParamKey key,
int nverts,
diff --git a/source/blender/editors/uvedit/uvedit_smart_stitch.c b/source/blender/editors/uvedit/uvedit_smart_stitch.c
index 33ecf3c97ef..53572f114d2 100644
--- a/source/blender/editors/uvedit/uvedit_smart_stitch.c
+++ b/source/blender/editors/uvedit/uvedit_smart_stitch.c
@@ -686,7 +686,7 @@ static int stitch_process_data(StitchState *state, Scene *scene, int final)
}
/* copy data from MTFaces to the preview display buffers */
- BM_ITER(efa, &iter, state->em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, state->em->bm, BM_FACES_OF_MESH) {
/* just to test if face was added for processing. uvs of inselected vertices will return NULL */
UvElement *element = ED_uv_element_get(state->element_map, efa, BM_FACE_FIRST_LOOP(efa));
@@ -696,7 +696,7 @@ static int stitch_process_data(StitchState *state, Scene *scene, int final)
int face_preview_pos = preview_position[index].data_position;
if (face_preview_pos != STITCH_NO_PREVIEW) {
preview->uvs_per_polygon[preview_position[index].polycount_position] = efa->len;
- BM_ITER_INDEX(l, &liter, state->em->bm, BM_LOOPS_OF_FACE, efa, i) {
+ BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
luv = CustomData_bmesh_get(&state->em->bm->ldata, l->head.data, CD_MLOOPUV);
copy_v2_v2(preview->preview_polys + face_preview_pos + i * 2, luv->uv);
}
@@ -706,7 +706,7 @@ static int stitch_process_data(StitchState *state, Scene *scene, int final)
BMLoop *fl = BM_FACE_FIRST_LOOP(efa);
MLoopUV *fuv = CustomData_bmesh_get(&state->em->bm->ldata, fl->head.data, CD_MLOOPUV);
- BM_ITER_INDEX(l, &liter, state->em->bm, BM_LOOPS_OF_FACE, efa, i) {
+ BM_ITER_ELEM_INDEX (l, &liter, efa, BM_LOOPS_OF_FACE, i) {
if (i < numoftris) {
/* using next since the first uv is already accounted for */
BMLoop *lnext = l->next;
@@ -1061,11 +1061,11 @@ static int stitch_init(bContext *C, wmOperator *op)
counter = 0;
/* Now, on to generate our uv connectivity data */
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!(ts->uv_flag & UV_SYNC_SELECTION) && ((BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) || !BM_elem_flag_test(efa, BM_ELEM_SELECT)))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
UvElement *element = ED_uv_element_get(state->element_map, efa, l);
int offset1, itmp1 = element - state->element_map->buf;
int offset2, itmp2 = ED_uv_element_get(state->element_map, efa, l->next) - state->element_map->buf;
@@ -1177,9 +1177,9 @@ static int stitch_init(bContext *C, wmOperator *op)
}
else {
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
i = 0;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
if (uvedit_uv_selected(em, scene, l)) {
UvElement *element = ED_uv_element_get(state->element_map, efa, l);
stitch_select_uv(element, state, 1);
@@ -1197,7 +1197,7 @@ static int stitch_init(bContext *C, wmOperator *op)
state->tris_per_island[i] = 0;
}
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
UvElement *element = ED_uv_element_get(state->element_map, efa, BM_FACE_FIRST_LOOP(efa));
if (element) {
diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.c b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
index a3cbcc57a9c..ad78a5b6643 100644
--- a/source/blender/editors/uvedit/uvedit_unwrap_ops.c
+++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.c
@@ -138,7 +138,7 @@ static int ED_uvedit_ensure_uvs(bContext *C, Scene *scene, Object *obedit)
ED_uvedit_assign_image(bmain, scene, obedit, ima, NULL);
/* select new UV's */
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
uvedit_face_select(scene, em, efa);
}
@@ -156,7 +156,7 @@ static int uvedit_have_selection(Scene *scene, BMEditMesh *em, short implicit)
/* verify if we have any selected uv's before unwrapping,
* so we can cancel the operator early */
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (scene->toolsettings->uv_flag & UV_SYNC_SELECTION) {
if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN))
continue;
@@ -164,7 +164,7 @@ static int uvedit_have_selection(Scene *scene, BMEditMesh *em, short implicit)
else if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN) || !BM_elem_flag_test(efa, BM_ELEM_SELECT))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
if (!luv)
return 1;
@@ -186,6 +186,7 @@ static ParamHandle *construct_param_handle(Scene *scene, BMEditMesh *em,
short implicit, short fill, short sel,
short correct_aspect)
{
+ ScanFillContext sf_ctx;
ParamHandle *handle;
BMFace *efa;
BMLoop *l;
@@ -211,25 +212,25 @@ static ParamHandle *construct_param_handle(Scene *scene, BMEditMesh *em,
/* we need the vert indices */
BM_mesh_elem_index_ensure(em->bm, BM_VERT);
+
+ BLI_srand(0);
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
ScanFillVert *v, *lastv, *firstv;
ScanFillFace *sefa;
ParamKey key, vkeys[4];
ParamBool pin[4], select[4];
BMLoop *ls[3];
- MLoopUV *luvs[3];
float *co[4];
float *uv[4];
- int lsel;
+ int i, lsel;
if ((BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) || (sel && BM_elem_flag_test(efa, BM_ELEM_SELECT) == 0))
continue;
- /* tf= (MTexPoly *)CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); */ /* UNUSED */
lsel = 0;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
if (uvedit_uv_selected(em, scene, l)) {
lsel = 1;
break;
@@ -241,73 +242,76 @@ static ParamHandle *construct_param_handle(Scene *scene, BMEditMesh *em,
key = (ParamKey)efa;
- /*scanfill time!*/
- BLI_begin_edgefill();
-
- firstv = lastv = NULL;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
- int i;
-
- v = BLI_addfillvert(l->v->co);
-
- /*add small random offset*/
- for (i = 0; i < 3; i++) {
- v->co[i] += (BLI_drand() - 0.5f) * FLT_EPSILON * 50;
- }
-
- v->tmp.p = l;
- if (lastv) {
- BLI_addfilledge(lastv, v);
+ if(efa->len == 3 || efa->len == 4) {
+ /* for quads let parametrize split, it can make better decisions
+ about which split is best for unwrapping than scanfill */
+ i = 0;
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+ MLoopUV *luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
+ vkeys[i] = (ParamKey)BM_elem_index_get(l->v);
+ co[i] = l->v->co;
+ uv[i] = luv->uv;
+ pin[i] = (luv->flag & MLOOPUV_PINNED) != 0;
+ select[i] = uvedit_uv_selected(em, scene, l) != 0;
+
+ i++;
}
- lastv = v;
- if (!firstv)
- firstv = v;
+ param_face_add(handle, key, i, vkeys, co, uv, pin, select);
}
-
- BLI_addfilledge(firstv, v);
-
- /*mode 2 enables faster handling of tri/quads*/
- BLI_edgefill(2);
- for (sefa = fillfacebase.first; sefa; sefa = sefa->next) {
- ls[0] = sefa->v1->tmp.p;
- ls[1] = sefa->v2->tmp.p;
- ls[2] = sefa->v3->tmp.p;
+ else {
+ /* ngon - scanfill time! */
+ BLI_begin_edgefill(&sf_ctx);
- luvs[0] = CustomData_bmesh_get(&em->bm->ldata, ls[0]->head.data, CD_MLOOPUV);
- luvs[1] = CustomData_bmesh_get(&em->bm->ldata, ls[1]->head.data, CD_MLOOPUV);
- luvs[2] = CustomData_bmesh_get(&em->bm->ldata, ls[2]->head.data, CD_MLOOPUV);
-
- vkeys[0] = (ParamKey)BM_elem_index_get(ls[0]->v);
- vkeys[1] = (ParamKey)BM_elem_index_get(ls[1]->v);
- vkeys[2] = (ParamKey)BM_elem_index_get(ls[2]->v);
-
- co[0] = ls[0]->v->co;
- co[1] = ls[1]->v->co;
- co[2] = ls[2]->v->co;
+ firstv = lastv = NULL;
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
+ int i;
+
+ v = BLI_addfillvert(&sf_ctx, l->v->co);
+
+ /* add small random offset */
+ for (i = 0; i < 3; i++) {
+ v->co[i] += (BLI_frand() - 0.5f) * FLT_EPSILON * 50;
+ }
+
+ v->tmp.p = l;
- uv[0] = luvs[0]->uv;
- uv[1] = luvs[1]->uv;
- uv[2] = luvs[2]->uv;
+ if (lastv) {
+ BLI_addfilledge(&sf_ctx, lastv, v);
+ }
- pin[0] = (luvs[0]->flag & MLOOPUV_PINNED) != 0;
- pin[1] = (luvs[1]->flag & MLOOPUV_PINNED) != 0;
- pin[2] = (luvs[2]->flag & MLOOPUV_PINNED) != 0;
+ lastv = v;
+ if (!firstv)
+ firstv = v;
+ }
- select[0] = uvedit_uv_selected(em, scene, ls[0]) != 0;
- select[1] = uvedit_uv_selected(em, scene, ls[1]) != 0;
- select[2] = uvedit_uv_selected(em, scene, ls[2]) != 0;
+ BLI_addfilledge(&sf_ctx, firstv, v);
+
+ BLI_edgefill_ex(&sf_ctx, TRUE, efa->no);
+ for (sefa = sf_ctx.fillfacebase.first; sefa; sefa = sefa->next) {
+ ls[0] = sefa->v1->tmp.p;
+ ls[1] = sefa->v2->tmp.p;
+ ls[2] = sefa->v3->tmp.p;
+
+ for(i = 0; i < 3; i++) {
+ MLoopUV *luv = CustomData_bmesh_get(&em->bm->ldata, ls[i]->head.data, CD_MLOOPUV);
+ vkeys[i] = (ParamKey)BM_elem_index_get(ls[i]->v);
+ co[i] = ls[i]->v->co;
+ uv[i] = luv->uv;
+ pin[i] = (luv->flag & MLOOPUV_PINNED) != 0;
+ select[i] = uvedit_uv_selected(em, scene, ls[i]) != 0;
+ }
- if (!p_face_exists(handle, vkeys, 0, 1, 2))
param_face_add(handle, key, 3, vkeys, co, uv, pin, select);
- }
+ }
- BLI_end_edgefill();
+ BLI_end_edgefill(&sf_ctx);
+ }
}
if (!implicit) {
- BM_ITER(eed, &iter, em->bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (eed, &iter, em->bm, BM_EDGES_OF_MESH) {
if (BM_elem_flag_test(eed, BM_ELEM_SEAM)) {
ParamKey vkeys[2];
vkeys[0] = (ParamKey)BM_elem_index_get(eed->v1);
@@ -336,7 +340,7 @@ static void texface_from_original_index(BMFace *efa, int index, float **uv, Para
if (index == ORIGINDEX_NONE)
return;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
if (BM_elem_index_get(l->v) == index) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
*uv = luv->uv;
@@ -829,6 +833,16 @@ void ED_uvedit_live_unwrap_end(short cancel)
}
}
+void ED_uvedit_live_unwrap(Scene *scene, Object *obedit)
+{
+ BMEditMesh *em = BMEdit_FromObject(obedit);
+
+ if (scene->toolsettings->edge_mode_live_unwrap &&
+ CustomData_has_layer(&em->bm->ldata, CD_MLOOPUV)) {
+ ED_unwrap_lscm(scene, obedit, FALSE); /* unwrap all not just sel */
+ }
+}
+
/*************** UV Map Common Transforms *****************/
#define VIEW_ON_EQUATOR 0
@@ -854,9 +868,9 @@ static void uv_map_transform_center(Scene *scene, View3D *v3d, float *result,
min[0] = min[1] = min[2] = 1e20f;
max[0] = max[1] = max[2] = -1e20f;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (BM_elem_flag_test(efa, BM_ELEM_SELECT)) {
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
DO_MINMAX(l->v->co, min, max);
}
}
@@ -1006,11 +1020,11 @@ static void correct_uv_aspect(BMEditMesh *em)
if (aspx > aspy) {
scale = aspy / aspx;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_SELECT) || BM_elem_flag_test(efa, BM_ELEM_HIDDEN))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
luv->uv[0] = ((luv->uv[0] - 0.5) * scale) + 0.5;
}
@@ -1019,11 +1033,11 @@ static void correct_uv_aspect(BMEditMesh *em)
else {
scale = aspx / aspy;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_SELECT) || BM_elem_flag_test(efa, BM_ELEM_HIDDEN))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
luv->uv[1] = ((luv->uv[1] - 0.5) * scale) + 0.5;
}
@@ -1061,11 +1075,11 @@ static void uv_map_clip_correct(BMEditMesh *em, wmOperator *op)
if (scale_to_bounds) {
INIT_MINMAX2(min, max);
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_SELECT))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
DO_MINMAX2(luv->uv, min, max);
}
@@ -1080,11 +1094,11 @@ static void uv_map_clip_correct(BMEditMesh *em, wmOperator *op)
if (dy > 0.0f)
dy = 1.0f / dy;
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_SELECT))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
luv->uv[0] = (luv->uv[0] - min[0]) * dx;
@@ -1094,11 +1108,11 @@ static void uv_map_clip_correct(BMEditMesh *em, wmOperator *op)
}
else if (clip_to_bounds) {
/* clipping and wrapping */
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_SELECT))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
CLAMP(luv->uv[0], 0.0f, 1.0f);
CLAMP(luv->uv[1], 0.0f, 1.0f);
@@ -1243,11 +1257,11 @@ static int uv_from_view_exec(bContext *C, wmOperator *op)
if (RNA_boolean_get(op->ptr, "orthographic")) {
uv_map_rotation_matrix(rotmat, rv3d, obedit, 90.0f, 0.0f, 1.0f);
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_SELECT))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
project_from_view_ortho(luv->uv, l->v->co, rotmat);
}
@@ -1257,11 +1271,11 @@ static int uv_from_view_exec(bContext *C, wmOperator *op)
struct UvCameraInfo *uci = project_camera_info(v3d->camera, obedit->obmat, scene->r.xsch, scene->r.ysch);
if (uci) {
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_SELECT))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
project_from_camera(luv->uv, l->v->co, uci);
}
@@ -1273,11 +1287,11 @@ static int uv_from_view_exec(bContext *C, wmOperator *op)
else {
copy_m4_m4(rotmat, obedit->obmat);
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_SELECT))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
project_from_view(luv->uv, l->v->co, rv3d->persmat, rotmat, ar->winx, ar->winy);
}
@@ -1380,7 +1394,7 @@ static void uv_map_mirror(BMEditMesh *em, BMFace *efa, MTexPoly *UNUSED(tf))
int i, mi;
i = 0;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
uvs[i] = luv->uv;
i++;
@@ -1420,11 +1434,11 @@ static int sphere_project_exec(bContext *C, wmOperator *op)
uv_map_transform(C, op, center, rotmat);
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
if (!BM_elem_flag_test(efa, BM_ELEM_SELECT))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
uv_sphere_project(luv->uv, l->v->co, center, rotmat);
@@ -1493,12 +1507,12 @@ static int cylinder_project_exec(bContext *C, wmOperator *op)
uv_map_transform(C, op, center, rotmat);
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
if (!BM_elem_flag_test(efa, BM_ELEM_SELECT))
continue;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
uv_cylinder_project(luv->uv, l->v->co, center, rotmat);
@@ -1557,7 +1571,7 @@ static int cube_project_exec(bContext *C, wmOperator *op)
/* choose x,y,z axis for projection depending on the largest normal
* component, but clusters all together around the center of map. */
- BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+ BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
int first = 1;
/* tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); */ /* UNUSED */
@@ -1567,7 +1581,7 @@ static int cube_project_exec(bContext *C, wmOperator *op)
axis_dominant_v3(&cox, &coy, efa->no);
dx = dy = 0;
- BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+ BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
luv->uv[0] = 0.5f + 0.5f * cube_size * (loc[cox] + l->v->co[cox]);
diff --git a/source/blender/gpu/SConscript b/source/blender/gpu/SConscript
index ee4491c1c77..181af6bb1d4 100644
--- a/source/blender/gpu/SConscript
+++ b/source/blender/gpu/SConscript
@@ -13,6 +13,7 @@ if env['OURPLATFORM'] in ('win32-vc', 'win32-mingw', 'linuxcross', 'win64-vc'):
incs += ' ' + env['BF_OPENGL_INC']
-defs.append('WITH_SMOKE') # TODO, make optional
+if env['WITH_BF_SMOKE']:
+ defs.append('WITH_SMOKE')
env.BlenderLib ( 'bf_gpu', sources, Split(incs), defines = defs, libtype=['core','player'], priority=[160,110] )
diff --git a/source/blender/gpu/intern/gpu_extensions.c b/source/blender/gpu/intern/gpu_extensions.c
index 40e6a8b2a35..605b2d8901e 100644
--- a/source/blender/gpu/intern/gpu_extensions.c
+++ b/source/blender/gpu/intern/gpu_extensions.c
@@ -51,7 +51,9 @@
#include <stdio.h>
#include <string.h>
-#include "BLI_winstuff.h"
+#ifdef WIN32
+# include "BLI_winstuff.h"
+#endif
/* Extensions support */
diff --git a/source/blender/ikplugin/intern/iksolver_plugin.c b/source/blender/ikplugin/intern/iksolver_plugin.c
index 41700b96acc..8d4d01b7e97 100644
--- a/source/blender/ikplugin/intern/iksolver_plugin.c
+++ b/source/blender/ikplugin/intern/iksolver_plugin.c
@@ -347,11 +347,15 @@ static void execute_posetree(struct Scene *scene, Object *ob, PoseTree *tree)
/* first set the goal inverse transform, assuming the root of tree was done ok! */
pchan= tree->pchan[0];
- if (pchan->parent)
+ if (pchan->parent) {
/* transform goal by parent mat, so this rotation is not part of the
* segment's basis. otherwise rotation limits do not work on the
* local transform of the segment itself. */
copy_m4_m4(rootmat, pchan->parent->pose_mat);
+ /* However, we do not want to get (i.e. reverse) parent's scale, as it generates [#31008]
+ * kind of nasty bugs... */
+ normalize_m4(rootmat);
+ }
else
unit_m4(rootmat);
copy_v3_v3(rootmat[3], pchan->pose_head);
diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp
index caca00cbe20..ff3a816f478 100644
--- a/source/blender/imbuf/intern/openexr/openexr_api.cpp
+++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp
@@ -1007,7 +1007,6 @@ struct ImBuf *imb_load_openexr(unsigned char *mem, size_t size, int flags)
if (handle) {
IMB_exr_read_channels(handle);
ibuf->userdata= handle; /* potential danger, the caller has to check for this! */
- return ibuf;
}
}
else {
@@ -1055,11 +1054,12 @@ struct ImBuf *imb_load_openexr(unsigned char *mem, size_t size, int flags)
//
// if (flag & IM_rect)
// IMB_rect_from_float(ibuf);
+
+ /* file is no longer needed */
+ delete file;
}
}
-
}
- delete file;
return(ibuf);
}
catch (const std::exception &exc)
diff --git a/source/blender/imbuf/intern/thumbs.c b/source/blender/imbuf/intern/thumbs.c
index f5c22b67c1b..5d64e1b2aec 100644
--- a/source/blender/imbuf/intern/thumbs.c
+++ b/source/blender/imbuf/intern/thumbs.c
@@ -53,17 +53,18 @@
#include <stdio.h>
#ifdef WIN32
-#include <windows.h> /* need to include windows.h so _WIN32_IE is defined */
-#ifndef _WIN32_IE
-#define _WIN32_IE 0x0400 /* minimal requirements for SHGetSpecialFolderPath on MINGW MSVC has this defined already */
-#endif
-#include <shlobj.h> /* for SHGetSpecialFolderPath, has to be done before BLI_winstuff because 'near' is disabled through BLI_windstuff */
-#include <process.h> /* getpid */
-#include <direct.h> /* chdir */
-#include "BLI_winstuff.h"
-#include "utfconv.h"
+# include <windows.h> /* need to include windows.h so _WIN32_IE is defined */
+# ifndef _WIN32_IE
+# define _WIN32_IE 0x0400 /* minimal requirements for SHGetSpecialFolderPath on MINGW MSVC has this defined already */
+# endif
+# include <shlobj.h> /* for SHGetSpecialFolderPath, has to be done before BLI_winstuff
+ * because 'near' is disabled through BLI_windstuff */
+# include <process.h> /* getpid */
+# include <direct.h> /* chdir */
+# include "BLI_winstuff.h"
+# include "utfconv.h"
#else
-#include <unistd.h>
+# include <unistd.h>
#endif
#define URI_MAX FILE_MAX*3 + 8
@@ -222,6 +223,8 @@ static void thumbname_from_uri(const char* uri, char* thumb, const int thumb_len
to_hex_char(hexdigest, digest, 16);
hexdigest[32] = '\0';
BLI_snprintf(thumb, thumb_len, "%s.png", hexdigest);
+
+ // printf("%s: '%s' --> '%s'\n", __func__, uri, thumb);
}
static int thumbpath_from_uri(const char* uri, char* path, const int path_len, ThumbSize size)
@@ -377,7 +380,9 @@ ImBuf* IMB_thumb_create(const char* path, ThumbSize size, ThumbSource source, Im
if (IMB_saveiff(img, temp, IB_rect | IB_metadata)) {
#ifndef WIN32
chmod(temp, S_IRUSR | S_IWUSR);
-#endif
+#endif
+ // printf("%s saving thumb: '%s'\n", __func__, tpath);
+
BLI_rename(temp, tpath);
}
@@ -440,7 +445,13 @@ ImBuf* IMB_thumb_manage(const char* path, ThumbSize size, ThumbSource source)
if (thumbpath_from_uri(uri, thumb, sizeof(thumb), THB_FAIL)) {
/* failure thumb exists, don't try recreating */
if (BLI_exists(thumb)) {
- return NULL;
+ /* clear out of date fail case */
+ if (BLI_file_older(thumb, path)) {
+ BLI_delete(thumb, 0, 0);
+ }
+ else {
+ return NULL;
+ }
}
}
diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h
index 6caf0a7d8b2..1abce525be2 100644
--- a/source/blender/makesdna/DNA_node_types.h
+++ b/source/blender/makesdna/DNA_node_types.h
@@ -136,7 +136,8 @@ typedef struct bNodeSocket {
/* hide socket value, if it gets auto default */
#define SOCK_HIDE_VALUE 128
/* socket hidden automatically, to distinguish from manually hidden */
-#define SOCK_AUTO_HIDDEN 256
+ /* DEPRECATED, only kept here to avoid reusing the flag */
+#define SOCK_AUTO_HIDDEN__DEPRECATED 256
typedef struct bNodePreview {
unsigned char *rect;
diff --git a/source/blender/makesdna/DNA_object_fluidsim.h b/source/blender/makesdna/DNA_object_fluidsim.h
index 751d420daa7..a55b7b17a22 100644
--- a/source/blender/makesdna/DNA_object_fluidsim.h
+++ b/source/blender/makesdna/DNA_object_fluidsim.h
@@ -35,6 +35,7 @@
#define __DNA_OBJECT_FLUIDSIM_H__
#include "DNA_ID.h"
+#include "DNA_defs.h"
#ifdef __cplusplus
extern "C" {
@@ -66,7 +67,7 @@ typedef struct FluidsimSettings {
/* fluid properties */
float viscosityValue;
- short viscosityMode;
+ short viscosityMode DNA_DEPRECATED;
short viscosityExponent;
/* gravity strength */
float grav[3];
diff --git a/source/blender/makesdna/DNA_windowmanager_types.h b/source/blender/makesdna/DNA_windowmanager_types.h
index c86d9d17b1f..5a49e45cf5e 100644
--- a/source/blender/makesdna/DNA_windowmanager_types.h
+++ b/source/blender/makesdna/DNA_windowmanager_types.h
@@ -222,6 +222,7 @@ typedef struct wmKeyMapItem {
IDProperty *properties; /* operator properties, assigned to ptr->data and can be written to a file */
/* modal */
+ char propvalue_str[64]; /* runtime temporary storage for loading */
short propvalue; /* if used, the item is from modal map */
/* event */
diff --git a/source/blender/makesrna/RNA_access.h b/source/blender/makesrna/RNA_access.h
index d3a710c4cf4..c99cbe8cdbf 100644
--- a/source/blender/makesrna/RNA_access.h
+++ b/source/blender/makesrna/RNA_access.h
@@ -937,11 +937,11 @@ void RNA_collection_clear(PointerRNA *ptr, const char *name);
#define RNA_BEGIN(sptr, itemptr, propname) \
{ \
CollectionPropertyIterator rna_macro_iter; \
- for(RNA_collection_begin(sptr, propname, &rna_macro_iter); \
- rna_macro_iter.valid; \
- RNA_property_collection_next(&rna_macro_iter)) \
+ for (RNA_collection_begin(sptr, propname, &rna_macro_iter); \
+ rna_macro_iter.valid; \
+ RNA_property_collection_next(&rna_macro_iter)) \
{ \
- PointerRNA itemptr= rna_macro_iter.ptr;
+ PointerRNA itemptr = rna_macro_iter.ptr;
#define RNA_END \
} \
@@ -951,11 +951,11 @@ void RNA_collection_clear(PointerRNA *ptr, const char *name);
#define RNA_PROP_BEGIN(sptr, itemptr, prop) \
{ \
CollectionPropertyIterator rna_macro_iter; \
- for(RNA_property_collection_begin(sptr, prop, &rna_macro_iter); \
- rna_macro_iter.valid; \
- RNA_property_collection_next(&rna_macro_iter)) \
+ for (RNA_property_collection_begin(sptr, prop, &rna_macro_iter); \
+ rna_macro_iter.valid; \
+ RNA_property_collection_next(&rna_macro_iter)) \
{ \
- PointerRNA itemptr= rna_macro_iter.ptr;
+ PointerRNA itemptr = rna_macro_iter.ptr;
#define RNA_PROP_END \
} \
@@ -965,14 +965,14 @@ void RNA_collection_clear(PointerRNA *ptr, const char *name);
#define RNA_STRUCT_BEGIN(sptr, prop) \
{ \
CollectionPropertyIterator rna_macro_iter; \
- for(RNA_property_collection_begin( \
- sptr, \
- RNA_struct_iterator_property(sptr->type), \
- &rna_macro_iter); \
- rna_macro_iter.valid; \
- RNA_property_collection_next(&rna_macro_iter)) \
+ for (RNA_property_collection_begin( \
+ sptr, \
+ RNA_struct_iterator_property(sptr->type), \
+ &rna_macro_iter); \
+ rna_macro_iter.valid; \
+ RNA_property_collection_next(&rna_macro_iter)) \
{ \
- PropertyRNA *prop= rna_macro_iter.ptr.data;
+ PropertyRNA *prop = rna_macro_iter.ptr.data;
#define RNA_STRUCT_END \
} \
diff --git a/source/blender/makesrna/RNA_types.h b/source/blender/makesrna/RNA_types.h
index e826b81d617..c3beffbe223 100644
--- a/source/blender/makesrna/RNA_types.h
+++ b/source/blender/makesrna/RNA_types.h
@@ -346,8 +346,10 @@ typedef enum StructFlag {
typedef int (*StructValidateFunc)(struct PointerRNA *ptr, void *data, int *have_function);
typedef int (*StructCallbackFunc)(struct bContext *C, struct PointerRNA *ptr, struct FunctionRNA *func, ParameterList *list);
typedef void (*StructFreeFunc)(void *data);
-typedef struct StructRNA *(*StructRegisterFunc)(struct Main *bmain, struct ReportList *reports, void *data,
- const char *identifier, StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free);
+typedef struct StructRNA *(*StructRegisterFunc)(
+ struct Main *bmain, struct ReportList *reports, void *data, const char *identifier,
+ StructValidateFunc validate, StructCallbackFunc call, StructFreeFunc free);
+
typedef void (*StructUnregisterFunc)(struct Main *bmain, struct StructRNA *type);
typedef void **(*StructInstanceFunc)(PointerRNA *ptr);
diff --git a/source/blender/makesrna/SConscript b/source/blender/makesrna/SConscript
index f1817bfbe6f..20862aa626d 100644
--- a/source/blender/makesrna/SConscript
+++ b/source/blender/makesrna/SConscript
@@ -36,6 +36,9 @@ if env['WITH_BF_CINEON']:
if env['WITH_BF_HDR']:
defs.append('WITH_HDR')
+if env['WITH_BF_FRAMESERVER']:
+ defs.append('WITH_FRAMESERVER')
+
if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
incs += ' ' + env['BF_FFMPEG_INC']
diff --git a/source/blender/makesrna/intern/SConscript b/source/blender/makesrna/intern/SConscript
index 60818680d0c..c8d7e0ae421 100644
--- a/source/blender/makesrna/intern/SConscript
+++ b/source/blender/makesrna/intern/SConscript
@@ -54,7 +54,8 @@ if env['WITH_BF_CINEON']:
if env['WITH_BF_HDR']:
defs.append('WITH_HDR')
-defs.append('WITH_FRAMESERVER') # TODO, make optional
+if env['WITH_BF_FRAMESERVER']:
+ defs.append('WITH_FRAMESERVER')
if env['WITH_BF_FFMPEG']:
defs.append('WITH_FFMPEG')
diff --git a/source/blender/makesrna/intern/makesrna.c b/source/blender/makesrna/intern/makesrna.c
index 541a079b381..091147019e6 100644
--- a/source/blender/makesrna/intern/makesrna.c
+++ b/source/blender/makesrna/intern/makesrna.c
@@ -695,15 +695,18 @@ static void rna_clamp_value_range(FILE *f, PropertyRNA *prop)
if (prop->type == PROP_FLOAT) {
FloatPropertyRNA *fprop = (FloatPropertyRNA*)prop;
if (fprop->range) {
- fprintf(f, " float prop_clamp_min = -FLT_MAX, prop_clamp_max = FLT_MAX, prop_soft_min, prop_soft_max;\n");
- fprintf(f, " %s(ptr, &prop_clamp_min, &prop_clamp_max, &prop_soft_min, &prop_soft_max);\n", rna_function_string(fprop->range));
+ fprintf(f,
+ " float prop_clamp_min = -FLT_MAX, prop_clamp_max = FLT_MAX, prop_soft_min, prop_soft_max;\n");
+ fprintf(f, " %s(ptr, &prop_clamp_min, &prop_clamp_max, &prop_soft_min, &prop_soft_max);\n",
+ rna_function_string(fprop->range));
}
}
else if (prop->type == PROP_INT) {
IntPropertyRNA *iprop = (IntPropertyRNA*)prop;
if (iprop->range) {
fprintf(f, " int prop_clamp_min = INT_MIN, prop_clamp_max = INT_MAX, prop_soft_min, prop_soft_max;\n");
- fprintf(f, " %s(ptr, &prop_clamp_min, &prop_clamp_max, &prop_soft_min, &prop_soft_max);\n", rna_function_string(iprop->range));
+ fprintf(f, " %s(ptr, &prop_clamp_min, &prop_clamp_max, &prop_soft_min, &prop_soft_max);\n",
+ rna_function_string(iprop->range));
}
}
}
diff --git a/source/blender/makesrna/intern/rna_access.c b/source/blender/makesrna/intern/rna_access.c
index d5363b33fe9..3200b271718 100644
--- a/source/blender/makesrna/intern/rna_access.c
+++ b/source/blender/makesrna/intern/rna_access.c
@@ -4532,7 +4532,7 @@ char *RNA_pointer_as_string_keywords_ex(bContext *C, PointerRNA *ptr, PointerRNA
PropertyRNA *prop;
- DynStr *dynstr= BLI_dynstr_new();
+ DynStr *dynstr = BLI_dynstr_new();
char *cstring, *buf;
int first_iter = TRUE, ok = TRUE;
int flag;
@@ -4581,10 +4581,10 @@ char *RNA_pointer_as_string_keywords_ex(bContext *C, PointerRNA *ptr, PointerRNA
if (all_args == FALSE && ptr_default) {
/* not verbose, so only add in attributes that use non-default values
* slow but good for tooltips */
- prop_default= RNA_struct_find_property(ptr_default, arg_name);
+ prop_default = RNA_struct_find_property(ptr_default, arg_name);
if (prop_default) {
- buf_default= RNA_property_as_string(C, ptr_default, prop_default);
+ buf_default = RNA_property_as_string(C, ptr_default, prop_default);
if (strcmp(buf, buf_default) == 0)
ok = FALSE; /* values match, don't bother printing */
diff --git a/source/blender/makesrna/intern/rna_armature.c b/source/blender/makesrna/intern/rna_armature.c
index 5bd5bb1a778..79b776572cf 100644
--- a/source/blender/makesrna/intern/rna_armature.c
+++ b/source/blender/makesrna/intern/rna_armature.c
@@ -952,7 +952,7 @@ static void rna_def_armature(BlenderRNA *brna)
prop = RNA_def_property(srna, "use_auto_ik", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", ARM_AUTO_IK);
- RNA_def_property_ui_text(prop, "Auto IK", "Add temporaral IK constraints while grabbing bones in Pose Mode");
+ RNA_def_property_ui_text(prop, "Auto IK", "Add temporary IK constraints while grabbing bones in Pose Mode");
RNA_def_property_update(prop, 0, "rna_Armature_redraw_data");
RNA_def_property_flag(prop, PROP_LIB_EXCEPTION);
diff --git a/source/blender/makesrna/intern/rna_boid.c b/source/blender/makesrna/intern/rna_boid.c
index 1e77959a971..ce9edc17999 100644
--- a/source/blender/makesrna/intern/rna_boid.c
+++ b/source/blender/makesrna/intern/rna_boid.c
@@ -217,7 +217,8 @@ static PointerRNA rna_BoidSettings_active_boid_state_get(PointerRNA *ptr)
}
return rna_pointer_inherit_refine(ptr, &RNA_BoidState, NULL);
}
-static void rna_BoidSettings_active_boid_state_index_range(PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
+static void rna_BoidSettings_active_boid_state_index_range(PointerRNA *ptr, int *min, int *max,
+ int *softmin, int *softmax)
{
BoidSettings *boids = (BoidSettings*)ptr->data;
*min = 0;
diff --git a/source/blender/makesrna/intern/rna_constraint.c b/source/blender/makesrna/intern/rna_constraint.c
index 325d6721cd4..6d67f0c00dd 100644
--- a/source/blender/makesrna/intern/rna_constraint.c
+++ b/source/blender/makesrna/intern/rna_constraint.c
@@ -1501,7 +1501,7 @@ static void rna_def_constraint_clamp_to(BlenderRNA *brna)
srna = RNA_def_struct(brna, "ClampToConstraint", "Constraint");
RNA_def_struct_ui_text(srna, "Clamp To Constraint",
- "Constrains an object's location to the nearest point along the target path");
+ "Constrain an object's location to the nearest point along the target path");
RNA_def_struct_sdna_from(srna, "bClampToConstraint", "data");
prop = RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
@@ -1541,7 +1541,7 @@ static void rna_def_constraint_transform(BlenderRNA *brna)
{0, NULL, 0, NULL, NULL}};
srna = RNA_def_struct(brna, "TransformConstraint", "Constraint");
- RNA_def_struct_ui_text(srna, "Transformation Constraint", "Maps transformations of the target to the object");
+ RNA_def_struct_ui_text(srna, "Transformation Constraint", "Map transformations of the target to the object");
RNA_def_struct_sdna_from(srna, "bTransformConstraint", "data");
prop = RNA_def_property(srna, "target", PROP_POINTER, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_fcurve.c b/source/blender/makesrna/intern/rna_fcurve.c
index c7eeb633e25..bf5f51374fa 100644
--- a/source/blender/makesrna/intern/rna_fcurve.c
+++ b/source/blender/makesrna/intern/rna_fcurve.c
@@ -557,7 +557,8 @@ static void rna_FModifierLimits_maxy_range(PointerRNA *ptr, float *min, float *m
}
-static void rna_FModifierStepped_start_frame_range(PointerRNA *ptr, float *min, float *max, float *softmin, float *softmax)
+static void rna_FModifierStepped_start_frame_range(PointerRNA *ptr, float *min, float *max,
+ float *softmin, float *softmax)
{
FModifier *fcm = (FModifier*)ptr->data;
FMod_Stepped *data = fcm->data;
@@ -566,7 +567,8 @@ static void rna_FModifierStepped_start_frame_range(PointerRNA *ptr, float *min,
*max = (data->flag & FCM_STEPPED_NO_AFTER)? data->end_frame : MAXFRAMEF;
}
-static void rna_FModifierStepped_end_frame_range(PointerRNA *ptr, float *min, float *max, float *softmin, float *softmax)
+static void rna_FModifierStepped_end_frame_range(PointerRNA *ptr, float *min, float *max,
+ float *softmin, float *softmax)
{
FModifier *fcm = (FModifier*)ptr->data;
FMod_Stepped *data = fcm->data;
diff --git a/source/blender/makesrna/intern/rna_fluidsim.c b/source/blender/makesrna/intern/rna_fluidsim.c
index 057f82a44e9..a4aac6f345c 100644
--- a/source/blender/makesrna/intern/rna_fluidsim.c
+++ b/source/blender/makesrna/intern/rna_fluidsim.c
@@ -269,13 +269,6 @@ static void rna_def_fluidsim_domain(BlenderRNA *brna)
{OB_FSDOM_FINAL, "FINAL", 0, "Final", "Display final quality results"},
{0, NULL, 0, NULL, NULL}};
- static EnumPropertyItem viscosity_items[] = {
- {1, "MANUAL", 0, "Manual", "Manual viscosity settings"},
- {2, "WATER", 0, "Water", "Viscosity of 1.0 * 10^-6"},
- {3, "OIL", 0, "Oil", "Viscosity of 5.0 * 10^-5"},
- {4, "HONEY", 0, "Honey", "Viscosity of 2.0 * 10^-3"},
- {0, NULL, 0, NULL, NULL}};
-
srna = RNA_def_struct(brna, "DomainFluidSettings", "FluidSettings");
RNA_def_struct_sdna(srna, "FluidsimSettings");
RNA_def_struct_ui_text(srna, "Domain Fluid Simulation Settings",
@@ -287,11 +280,13 @@ static void rna_def_fluidsim_domain(BlenderRNA *brna)
RNA_def_property_int_sdna(prop, NULL, "resolutionxyz");
RNA_def_property_range(prop, 1, 1024);
RNA_def_property_ui_text(prop, "Resolution", "Domain resolution in X,Y and Z direction");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
prop = RNA_def_property(srna, "preview_resolution", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "previewresxyz");
RNA_def_property_range(prop, 1, 100);
RNA_def_property_ui_text(prop, "Preview Resolution", "Preview resolution in X,Y and Z direction");
+ RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
prop = RNA_def_property(srna, "viewport_display_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "guiDisplayMode");
@@ -358,12 +353,6 @@ static void rna_def_fluidsim_domain(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "animRate");
RNA_def_property_range(prop, 0.0, 100.0);
RNA_def_property_ui_text(prop, "Simulation Speed", "Fluid motion rate (0 = stationary, 1 = normal speed)");
-
- prop = RNA_def_property(srna, "viscosity_preset", PROP_ENUM, PROP_NONE);
- RNA_def_property_enum_sdna(prop, NULL, "viscosityMode");
- RNA_def_property_enum_items(prop, viscosity_items);
- RNA_def_property_ui_text(prop, "Viscosity Preset",
- "Set viscosity of the fluid to a preset value, or use manual input");
prop = RNA_def_property(srna, "viscosity_base", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_sdna(prop, NULL, "viscosityValue");
@@ -421,7 +410,9 @@ static void rna_def_fluidsim_domain(BlenderRNA *brna)
prop = RNA_def_property(srna, "surface_noobs", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "typeFlags", OB_FSSG_NOOBS);
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
- RNA_def_property_ui_text(prop, "Hide fluid surface", "");
+ RNA_def_property_ui_text(prop, "Remove air bubbles",
+ "Removes the air gap between fluid surface and obstacles - WARNING: Can result "
+ "in a dissolving surface in other areas");
/* particles */
@@ -598,7 +589,7 @@ static void rna_def_fluidsim_particle(BlenderRNA *brna)
RNA_def_property_range(prop, 0.0, 2.0);
RNA_def_property_ui_text(prop, "Alpha Influence",
"Amount of particle alpha change, inverse of size influence: 0=off (all same alpha), "
- "1=full (large particles get lower alphas, smaller ones higher values)");
+ "1=full (larger particles get lower alphas, smaller ones higher values)");
prop = RNA_def_property(srna, "filepath", PROP_STRING, PROP_FILEPATH);
RNA_def_property_string_maxlength(prop, FILE_MAX);
diff --git a/source/blender/makesrna/intern/rna_image_api.c b/source/blender/makesrna/intern/rna_image_api.c
index 1b50db36a3d..8594bda96d1 100644
--- a/source/blender/makesrna/intern/rna_image_api.c
+++ b/source/blender/makesrna/intern/rna_image_api.c
@@ -200,7 +200,7 @@ static int rna_Image_gl_load(Image *image, ReportList *reports, int filter, int
glBindTexture(GL_TEXTURE_2D, *bind);
if (filter != GL_NEAREST && filter != GL_LINEAR)
- error = (int)gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, ibuf->x, ibuf->y, GL_RGBA, GL_UNSIGNED_INT, ibuf->rect);
+ error = (int)gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, ibuf->x, ibuf->y, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
if (!error) {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, image->tpageflag & IMA_CLAMP_U ? GL_CLAMP : GL_REPEAT);
diff --git a/source/blender/makesrna/intern/rna_modifier.c b/source/blender/makesrna/intern/rna_modifier.c
index c2616e8655e..ca1b3a86087 100644
--- a/source/blender/makesrna/intern/rna_modifier.c
+++ b/source/blender/makesrna/intern/rna_modifier.c
@@ -2709,7 +2709,7 @@ static void rna_def_modifier_weightvgedit(BlenderRNA *brna)
prop = RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, weightvg_edit_falloff_type_items);
- RNA_def_property_ui_text(prop, "Falloff Type", "How weights are mapped to there new values");
+ RNA_def_property_ui_text(prop, "Falloff Type", "How weights are mapped to their new values");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
prop = RNA_def_property(srna, "use_add", PROP_BOOLEAN, PROP_NONE);
@@ -2907,7 +2907,7 @@ static void rna_def_modifier_weightvgproximity(BlenderRNA *brna)
prop = RNA_def_property(srna, "falloff_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, weightvg_proximity_falloff_type_items);
- RNA_def_property_ui_text(prop, "Falloff Type", "How weights are mapped to there new values");
+ RNA_def_property_ui_text(prop, "Falloff Type", "How weights are mapped to their new values");
RNA_def_property_update(prop, 0, "rna_Modifier_update");
/* Common masking properties. */
diff --git a/source/blender/makesrna/intern/rna_nodetree.c b/source/blender/makesrna/intern/rna_nodetree.c
index 67d0c08a628..f5bded42a1c 100644
--- a/source/blender/makesrna/intern/rna_nodetree.c
+++ b/source/blender/makesrna/intern/rna_nodetree.c
@@ -357,7 +357,7 @@ static void rna_Node_update(Main *bmain, Scene *scene, PointerRNA *ptr)
node_update(bmain, scene, ntree, node);
}
-static void rna_Node_image_update(Main *bmain, Scene *scene, PointerRNA *ptr)
+static void rna_Node_tex_image_update(Main *bmain, Scene *scene, PointerRNA *ptr)
{
bNodeTree *ntree = (bNodeTree*)ptr->id.data;
bNode *node = (bNode*)ptr->data;
@@ -685,7 +685,8 @@ static void rna_NodeTree_node_clear(bNodeTree *ntree)
WM_main_add_notifier(NC_NODE|NA_EDITED, ntree);
}
-static bNodeLink *rna_NodeTree_link_new(bNodeTree *ntree, ReportList *reports, bNodeSocket *fromsock, bNodeSocket *tosock)
+static bNodeLink *rna_NodeTree_link_new(bNodeTree *ntree, ReportList *reports,
+ bNodeSocket *fromsock, bNodeSocket *tosock)
{
bNodeLink *ret;
bNode *fromnode = NULL, *tonode = NULL;
@@ -1298,7 +1299,7 @@ static void def_sh_tex_environment(StructRNA *srna)
RNA_def_property_struct_type(prop, "Image");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Image", "");
- RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_image_update");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_tex_image_update");
RNA_def_struct_sdna_from(srna, "NodeTexEnvironment", "storage");
def_sh_tex(srna);
@@ -1332,7 +1333,7 @@ static void def_sh_tex_image(StructRNA *srna)
RNA_def_property_struct_type(prop, "Image");
RNA_def_property_flag(prop, PROP_EDITABLE);
RNA_def_property_ui_text(prop, "Image", "");
- RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_image_update");
+ RNA_def_property_update(prop, NC_NODE|NA_EDITED, "rna_Node_tex_image_update");
RNA_def_struct_sdna_from(srna, "NodeTexImage", "storage");
def_sh_tex(srna);
diff --git a/source/blender/makesrna/intern/rna_nodetree_types.h b/source/blender/makesrna/intern/rna_nodetree_types.h
index 745a956d831..5352bbd0e0f 100644
--- a/source/blender/makesrna/intern/rna_nodetree_types.h
+++ b/source/blender/makesrna/intern/rna_nodetree_types.h
@@ -37,7 +37,7 @@ DefNode( ShaderNode, SH_NODE_MATERIAL, def_sh_material, "MATER
DefNode( ShaderNode, SH_NODE_RGB, 0, "RGB", RGB, "RGB", "" )
DefNode( ShaderNode, SH_NODE_VALUE, 0, "VALUE", Value, "Value", "" )
DefNode( ShaderNode, SH_NODE_MIX_RGB, def_mix_rgb, "MIX_RGB", MixRGB, "MixRGB", "" )
-DefNode( ShaderNode, SH_NODE_VALTORGB, def_colorramp, "VALTORGB", ValToRGB, "Value to RGB", "" )
+DefNode( ShaderNode, SH_NODE_VALTORGB, def_colorramp, "VALTORGB", ValToRGB, "ColorRamp", "" )
DefNode( ShaderNode, SH_NODE_RGBTOBW, 0, "RGBTOBW", RGBToBW, "RGB to BW", "" )
DefNode( ShaderNode, SH_NODE_TEXTURE, def_texture, "TEXTURE", Texture, "Texture", "" )
DefNode( ShaderNode, SH_NODE_NORMAL, 0, "NORMAL", Normal, "Normal", "" )
@@ -94,7 +94,7 @@ DefNode( CompositorNode, CMP_NODE_VIEWER, 0, "VIEWE
DefNode( CompositorNode, CMP_NODE_RGB, 0, "RGB", RGB, "RGB", "" )
DefNode( CompositorNode, CMP_NODE_VALUE, 0, "VALUE", Value, "Value", "" )
DefNode( CompositorNode, CMP_NODE_MIX_RGB, def_mix_rgb, "MIX_RGB", MixRGB, "Mix RGB", "" )
-DefNode( CompositorNode, CMP_NODE_VALTORGB, def_colorramp, "VALTORGB", ValToRGB, "Value to RGB", "" )
+DefNode( CompositorNode, CMP_NODE_VALTORGB, def_colorramp, "VALTORGB", ValToRGB, "ColorRamp", "" )
DefNode( CompositorNode, CMP_NODE_RGBTOBW, 0, "RGBTOBW", RGBToBW, "RGB to BW", "" )
DefNode( CompositorNode, CMP_NODE_NORMAL, 0, "NORMAL", Normal, "Normal", "" )
DefNode( CompositorNode, CMP_NODE_CURVE_VEC, def_vector_curve, "CURVE_VEC", CurveVec, "Vector Curve", "" )
@@ -166,7 +166,7 @@ DefNode( TextureNode, TEX_NODE_BRICKS, def_tex_bricks, "BRICK
DefNode( TextureNode, TEX_NODE_MATH, def_math, "MATH", Math, "Math", "" )
DefNode( TextureNode, TEX_NODE_MIX_RGB, def_mix_rgb, "MIX_RGB", MixRGB, "Mix RGB", "" )
DefNode( TextureNode, TEX_NODE_RGBTOBW, 0, "RGBTOBW", RGBToBW, "RGB to BW", "" )
-DefNode( TextureNode, TEX_NODE_VALTORGB, def_colorramp, "VALTORGB", ValToRGB, "Value to RGB", "" )
+DefNode( TextureNode, TEX_NODE_VALTORGB, def_colorramp, "VALTORGB", ValToRGB, "ColorRamp", "" )
DefNode( TextureNode, TEX_NODE_IMAGE, def_tex_image, "IMAGE", Image, "Image", "" )
DefNode( TextureNode, TEX_NODE_CURVE_RGB, def_rgb_curve, "CURVE_RGB", CurveRGB, "RGB Curve", "" )
DefNode( TextureNode, TEX_NODE_INVERT, 0, "INVERT", Invert, "Invert", "" )
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index 21d4003bbf5..12d31b0a115 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -644,7 +644,8 @@ static void rna_Object_active_material_set(PointerRNA *ptr, PointerRNA value)
assign_material(ob, value.data, ob->actcol);
}
-static void rna_Object_active_particle_system_index_range(PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
+static void rna_Object_active_particle_system_index_range(PointerRNA *ptr, int *min, int *max,
+ int *softmin, int *softmax)
{
Object *ob = (Object*)ptr->id.data;
*min = 0;
diff --git a/source/blender/makesrna/intern/rna_object_force.c b/source/blender/makesrna/intern/rna_object_force.c
index d7dc09932cb..c52b6251223 100644
--- a/source/blender/makesrna/intern/rna_object_force.c
+++ b/source/blender/makesrna/intern/rna_object_force.c
@@ -1650,7 +1650,7 @@ static void rna_def_softbody(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "colball");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); /* code is not ready for that yet */
RNA_def_property_range(prop, -10.0f, 10.0f);
- RNA_def_property_ui_text(prop, "Ball Size", "Absolute ball size or factor if not manual adjusted");
+ RNA_def_property_ui_text(prop, "Ball Size", "Absolute ball size or factor if not manually adjusted");
RNA_def_property_update(prop, 0, "rna_softbody_update");
prop = RNA_def_property(srna, "ball_stiff", PROP_FLOAT, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_particle.c b/source/blender/makesrna/intern/rna_particle.c
index d1ccccd7387..c80ac4380fa 100644
--- a/source/blender/makesrna/intern/rna_particle.c
+++ b/source/blender/makesrna/intern/rna_particle.c
@@ -525,7 +525,8 @@ static PointerRNA rna_ParticleSystem_active_particle_target_get(PointerRNA *ptr)
}
return rna_pointer_inherit_refine(ptr, &RNA_ParticleTarget, NULL);
}
-static void rna_ParticleSystem_active_particle_target_index_range(PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax)
+static void rna_ParticleSystem_active_particle_target_index_range(PointerRNA *ptr, int *min, int *max,
+ int *softmin, int *softmax)
{
ParticleSystem *psys = (ParticleSystem*)ptr->data;
*min = 0;
@@ -1181,7 +1182,7 @@ static void rna_def_fluid_settings(BlenderRNA *brna)
RNA_def_property_float_sdna(prop, NULL, "viscosity_beta");
RNA_def_property_range(prop, 0.0f, 100.0f);
RNA_def_property_ui_range(prop, 0.0f, 2.0f, 1, 3);
- RNA_def_property_ui_text(prop, "Stiff viscosity", "Creates viscosity for expanding fluid)");
+ RNA_def_property_ui_text(prop, "Stiff viscosity", "Creates viscosity for expanding fluid");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
/* Double density relaxation */
@@ -1765,7 +1766,8 @@ static void rna_def_particle_settings(BlenderRNA *brna)
RNA_def_property_enum_sdna(prop, NULL, "rotmode");
RNA_def_property_clear_flag(prop, PROP_ANIMATABLE);
RNA_def_property_enum_items(prop, rot_mode_items);
- RNA_def_property_ui_text(prop, "Orientation axis", "Particle orientation axis (does not affect Explode modifier's results)");
+ RNA_def_property_ui_text(prop, "Orientation axis",
+ "Particle orientation axis (does not affect Explode modifier's results)");
RNA_def_property_update(prop, 0, "rna_Particle_reset");
prop = RNA_def_property(srna, "angular_velocity_mode", PROP_ENUM, PROP_NONE);
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index 6e9d94bd7fb..69d9ce05d7d 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -356,7 +356,7 @@ static void rna_def_render_engine(BlenderRNA *brna)
prop = RNA_def_property(srna, "is_preview", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", RE_ENGINE_PREVIEW);
- prop= RNA_def_property(srna, "camera_override", PROP_POINTER, PROP_NONE);
+ prop = RNA_def_property(srna, "camera_override", PROP_POINTER, PROP_NONE);
RNA_def_property_pointer_sdna(prop, NULL, "camera_override");
RNA_def_property_struct_type(prop, "Object");
diff --git a/source/blender/makesrna/intern/rna_space.c b/source/blender/makesrna/intern/rna_space.c
index 5e0a20c51ad..8d4b5a32969 100644
--- a/source/blender/makesrna/intern/rna_space.c
+++ b/source/blender/makesrna/intern/rna_space.c
@@ -1355,7 +1355,7 @@ static void rna_def_background_image(BlenderRNA *brna)
prop = RNA_def_property(srna, "show_on_foreground", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "flag", V3D_BGPIC_FOREGROUND);
- RNA_def_property_ui_text(prop, "Show On Foreground", "Show this image in fround of objects in viewport");
+ RNA_def_property_ui_text(prop, "Show On Foreground", "Show this image in front of objects in viewport");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_VIEW3D, NULL);
}
diff --git a/source/blender/makesrna/intern/rna_tracking.c b/source/blender/makesrna/intern/rna_tracking.c
index 56222c67a23..8d331670135 100644
--- a/source/blender/makesrna/intern/rna_tracking.c
+++ b/source/blender/makesrna/intern/rna_tracking.c
@@ -1074,7 +1074,7 @@ static void rna_def_trackingTrack(BlenderRNA *brna)
RNA_def_property_array(prop, 3);
RNA_def_property_range(prop, 0.0f, 1.0f);
RNA_def_property_ui_text(prop, "Color",
- "Color of the track in the Movie Track Editor and the 3D viewport after a solve");
+ "Color of the track in the Movie Clip Editor and the 3D viewport after a solve");
RNA_def_property_update(prop, NC_MOVIECLIP|ND_DISPLAY, NULL);
/* average error */
diff --git a/source/blender/makesrna/intern/rna_userdef.c b/source/blender/makesrna/intern/rna_userdef.c
index 67b97078225..3a0c3d8c95d 100644
--- a/source/blender/makesrna/intern/rna_userdef.c
+++ b/source/blender/makesrna/intern/rna_userdef.c
@@ -2679,7 +2679,7 @@ static void rna_def_userdef_edit(BlenderRNA *brna)
prop = RNA_def_property(srna, "fcurve_unselected_alpha", PROP_FLOAT, PROP_FACTOR);
RNA_def_property_float_sdna(prop, NULL, "fcu_inactive_alpha");
RNA_def_property_range(prop, 0.001f, 1.0f);
- RNA_def_property_ui_text(prop, "Unselected F-Curve Visibility",
+ RNA_def_property_ui_text(prop, "Unselected F-Curve Visibility",
"Amount that unselected F-Curves stand out from the background (Graph Editor)");
RNA_def_property_update(prop, NC_SPACE|ND_SPACE_GRAPH, NULL);
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 4d7e796aea3..8c4b7917cb8 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -1850,6 +1850,7 @@ static void rna_def_keyconfig(BlenderRNA *brna)
RNA_def_property_boolean_sdna(prop, NULL, "flag", KMI_EXPANDED);
RNA_def_property_ui_text(prop, "Expanded", "Show key map event and property details in the user interface");
RNA_def_property_ui_icon(prop, ICON_TRIA_RIGHT, 1);
+ RNA_def_property_update(prop, 0, "rna_KeyMapItem_update");
prop = RNA_def_property(srna, "propvalue", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "propvalue");
diff --git a/source/blender/makesrna/intern/rna_wm_api.c b/source/blender/makesrna/intern/rna_wm_api.c
index bad122ab761..9b3634bc8ac 100644
--- a/source/blender/makesrna/intern/rna_wm_api.c
+++ b/source/blender/makesrna/intern/rna_wm_api.c
@@ -120,16 +120,6 @@ static wmKeyMapItem *rna_KeyMap_item_new_modal(wmKeyMap *km, ReportList *reports
return NULL;
}
- if (!km->modal_items) {
- BKE_report(reports, RPT_ERROR, "No property values defined");
- return NULL;
- }
-
-
- if (RNA_enum_value_from_id(km->modal_items, propvalue_str, &propvalue) == 0) {
- BKE_report(reports, RPT_WARNING, "Property value not in enumeration");
- }
-
if (shift) modifier |= KM_SHIFT;
if (ctrl) modifier |= KM_CTRL;
if (alt) modifier |= KM_ALT;
@@ -137,6 +127,13 @@ static wmKeyMapItem *rna_KeyMap_item_new_modal(wmKeyMap *km, ReportList *reports
if (any) modifier = KM_ANY;
+ /* not initialized yet, do delayed lookup */
+ if (!km->modal_items)
+ return WM_modalkeymap_add_item_str(km, type, value, modifier, keymodifier, propvalue_str);
+
+ if (RNA_enum_value_from_id(km->modal_items, propvalue_str, &propvalue) == 0)
+ BKE_report(reports, RPT_WARNING, "Property value not in enumeration");
+
return WM_modalkeymap_add_item(km, type, value, modifier, keymodifier, propvalue);
}
diff --git a/source/blender/modifiers/intern/MOD_array.c b/source/blender/modifiers/intern/MOD_array.c
index ead657aaf24..8c90c62884e 100644
--- a/source/blender/modifiers/intern/MOD_array.c
+++ b/source/blender/modifiers/intern/MOD_array.c
@@ -179,12 +179,12 @@ static int *find_doubles_index_map(BMesh *bm, BMOperator *dupe_op,
BMO_op_exec(bm, &find_op);
i = 0;
- BMO_ITER(ele, &oiter, bm, dupe_op, "geom", BM_ALL) {
+ BMO_ITER (ele, &oiter, bm, dupe_op, "geom", BM_ALL) {
BM_elem_index_set(ele, i); /* set_dirty */
i++;
}
- BMO_ITER(ele, &oiter, bm, dupe_op, "newout", BM_ALL) {
+ BMO_ITER (ele, &oiter, bm, dupe_op, "newout", BM_ALL) {
BM_elem_index_set(ele, i); /* set_dirty */
i++;
}
@@ -196,7 +196,7 @@ static int *find_doubles_index_map(BMesh *bm, BMOperator *dupe_op,
index_map = MEM_callocN(sizeof(int) * (*index_map_length), "index_map");
/*element type argument doesn't do anything here*/
- BMO_ITER(v, &oiter, bm, &find_op, "targetmapout", 0) {
+ BMO_ITER (v, &oiter, bm, &find_op, "targetmapout", 0) {
v2 = BMO_iter_map_value_p(&oiter);
index_map[BM_elem_index_get(v)] = BM_elem_index_get(v2) + 1;
@@ -240,7 +240,7 @@ static void bm_merge_dm_transform(BMesh* bm, DerivedMesh *dm, float mat[4][4],
BMO_slot_buffer_append(&find_op, "verts", dupe_op, dupe_slot_name);
/* transform and tag verts */
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(v, BM_ELEM_TAG)) {
mul_m4_v3(mat, v->co);
BM_elem_flag_enable(v, BM_ELEM_TAG);
@@ -250,7 +250,7 @@ static void bm_merge_dm_transform(BMesh* bm, DerivedMesh *dm, float mat[4][4],
BMO_op_exec(bm, &find_op);
/* add new merge targets to weld operator */
- BMO_ITER(v, &oiter, bm, &find_op, "targetmapout", 0) {
+ BMO_ITER (v, &oiter, bm, &find_op, "targetmapout", 0) {
v2 = BMO_iter_map_value_p(&oiter);
BMO_slot_map_ptr_insert(bm, weld_op, "targetmap", v, v2);
}
@@ -259,7 +259,7 @@ static void bm_merge_dm_transform(BMesh* bm, DerivedMesh *dm, float mat[4][4],
}
else {
/* transform and tag verts */
- BM_ITER(v, &iter, bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(v, BM_ELEM_TAG)) {
mul_m4_v3(mat, v->co);
BM_elem_flag_enable(v, BM_ELEM_TAG);
@@ -289,7 +289,7 @@ static void merge_first_last(BMesh* bm,
BMO_op_exec(bm, &find_op);
/* add new merge targets to weld operator */
- BMO_ITER(v, &oiter, bm, &find_op, "targetmapout", 0) {
+ BMO_ITER (v, &oiter, bm, &find_op, "targetmapout", 0) {
v2 = BMO_iter_map_value_p(&oiter);
BMO_slot_map_ptr_insert(bm, weld_op, "targetmap", v, v2);
}
@@ -432,7 +432,7 @@ static DerivedMesh *arrayModifier_doArray(ArrayModifierData *amd,
}
/* apply transformation matrix */
- BMO_ITER(v, &oiter, em->bm, &dupe_op, "newout", BM_VERT) {
+ BMO_ITER (v, &oiter, em->bm, &dupe_op, "newout", BM_VERT) {
mul_m4_v3(offset, v->co);
}
diff --git a/source/blender/modifiers/intern/MOD_bevel.c b/source/blender/modifiers/intern/MOD_bevel.c
index 95447302d6c..613dfee8997 100644
--- a/source/blender/modifiers/intern/MOD_bevel.c
+++ b/source/blender/modifiers/intern/MOD_bevel.c
@@ -125,7 +125,7 @@ static DerivedMesh *applyModifier(ModifierData *md, struct Object *UNUSED(ob),
BMO_push(bm, NULL);
if (bmd->lim_flags & BME_BEVEL_ANGLE) {
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
/* check for 1 edge having 2 face users */
BMLoop *l1, *l2;
if ( (l1= e->l) &&
@@ -139,7 +139,7 @@ static DerivedMesh *applyModifier(ModifierData *md, struct Object *UNUSED(ob),
}
else {
/* crummy, is there a way just to operator on all? - campbell */
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
BMO_elem_flag_enable(bm, e, EDGE_MARK);
}
}
@@ -183,7 +183,7 @@ static DerivedMesh *applyModifier(ModifierData *md, Object *UNUSED(ob),
#endif
em = DM_to_editbmesh(derivedData, NULL, FALSE);
- BME_bevel(em, bmd->value, bmd->res, options, defgrp_index, bmd->bevel_angle, NULL, FALSE);
+ BME_bevel(em, bmd->value, bmd->res, options, defgrp_index, DEG2RADF(bmd->bevel_angle), NULL, FALSE);
BLI_assert(em->looptris == NULL);
result = CDDM_from_BMEditMesh(em, NULL, TRUE, FALSE);
BMEdit_Free(em);
diff --git a/source/blender/modifiers/intern/MOD_edgesplit.c b/source/blender/modifiers/intern/MOD_edgesplit.c
index 6ffacba3b68..def02081be8 100644
--- a/source/blender/modifiers/intern/MOD_edgesplit.c
+++ b/source/blender/modifiers/intern/MOD_edgesplit.c
@@ -73,7 +73,7 @@ static DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd, Obj
BMO_push(bm, NULL);
if (emd->flags & MOD_EDGESPLIT_FROMANGLE) {
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
/* check for 1 edge having 2 face users */
BMLoop *l1, *l2;
if ( (l1= e->l) &&
@@ -87,7 +87,7 @@ static DerivedMesh *doEdgeSplit(DerivedMesh *dm, EdgeSplitModifierData *emd, Obj
}
if (emd->flags & MOD_EDGESPLIT_FROMFLAG) {
- BM_ITER(e, &iter, bm, BM_EDGES_OF_MESH, NULL) {
+ BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
/* check for 2 or more edge users */
if ((e->l) &&
(e->l->next != e->l))
diff --git a/source/blender/modifiers/intern/MOD_fluidsim_util.c b/source/blender/modifiers/intern/MOD_fluidsim_util.c
index 9cd656c3621..fe0cb2e650f 100644
--- a/source/blender/modifiers/intern/MOD_fluidsim_util.c
+++ b/source/blender/modifiers/intern/MOD_fluidsim_util.c
@@ -85,7 +85,6 @@ void fluidsim_init(FluidsimModifierData *fluidmd)
fss->guiDisplayMode = 2; // preview
fss->renderDisplayMode = 3; // render
- fss->viscosityMode = 2; // default to water
fss->viscosityValue = 1.0;
fss->viscosityExponent = 6;
diff --git a/source/blender/modifiers/intern/MOD_remesh.c b/source/blender/modifiers/intern/MOD_remesh.c
index ea3912afad5..d408e5a3bee 100644
--- a/source/blender/modifiers/intern/MOD_remesh.c
+++ b/source/blender/modifiers/intern/MOD_remesh.c
@@ -26,6 +26,7 @@
#include "MEM_guardedalloc.h"
+#include "BLI_math_base.h"
#include "BLI_math_vector.h"
#include "BLI_utildefines.h"
diff --git a/source/blender/nodes/composite/node_composite_tree.c b/source/blender/nodes/composite/node_composite_tree.c
index 7bd0d03322d..049b5dd8178 100644
--- a/source/blender/nodes/composite/node_composite_tree.c
+++ b/source/blender/nodes/composite/node_composite_tree.c
@@ -757,26 +757,14 @@ void ntreeCompositForceHidden(bNodeTree *ntree, Scene *curscene)
if (srl)
force_hidden_passes(node, srl->passflag);
}
+ /* XXX this stuff is called all the time, don't want that.
+ * Updates should only happen when actually necessary.
+ */
+ #if 0
else if ( node->type==CMP_NODE_IMAGE) {
- Image *ima= (Image *)node->id;
- if (ima) {
- if (ima->rr) {
- ImageUser *iuser= node->storage;
- RenderLayer *rl= BLI_findlink(&ima->rr->layers, iuser->layer);
- if (rl)
- force_hidden_passes(node, rl->passflag);
- else
- force_hidden_passes(node, RRES_OUT_IMAGE|RRES_OUT_ALPHA);
- }
- else if (ima->type!=IMA_TYPE_MULTILAYER) { /* if ->rr not yet read we keep inputs */
- force_hidden_passes(node, RRES_OUT_IMAGE|RRES_OUT_ALPHA|RRES_OUT_Z);
- }
- else
- force_hidden_passes(node, RRES_OUT_IMAGE|RRES_OUT_ALPHA);
- }
- else
- force_hidden_passes(node, RRES_OUT_IMAGE|RRES_OUT_ALPHA);
+ nodeUpdate(ntree, node);
}
+ #endif
}
}
diff --git a/source/blender/nodes/composite/nodes/node_composite_image.c b/source/blender/nodes/composite/nodes/node_composite_image.c
index 44efbc6f9db..323767b64b1 100644
--- a/source/blender/nodes/composite/nodes/node_composite_image.c
+++ b/source/blender/nodes/composite/nodes/node_composite_image.c
@@ -32,7 +32,6 @@
#include "node_composite_util.h"
-
/* **************** IMAGE (and RenderResult, multilayer image) ******************** */
static bNodeSocketTemplate cmp_node_rlayers_out[]= {
@@ -67,6 +66,212 @@ static bNodeSocketTemplate cmp_node_rlayers_out[]= {
{ -1, 0, "" }
};
+static bNodeSocket *cmp_node_image_add_render_pass_output(bNodeTree *ntree, bNode *node, int UNUSED(pass), int rres_index)
+{
+ bNodeSocket *sock;
+
+ sock = node_add_output_from_template(ntree, node, &cmp_node_rlayers_out[rres_index]);
+ /* for render pass outputs store the pass type index as a lookup key */
+ sock->storage = SET_INT_IN_POINTER(rres_index);
+
+ return sock;
+}
+
+static void cmp_node_image_add_render_pass_outputs(bNodeTree *ntree, bNode *node, int passflag)
+{
+ if (passflag & SCE_PASS_COMBINED) {
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_COMBINED, RRES_OUT_IMAGE);
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_COMBINED, RRES_OUT_ALPHA);
+ }
+
+ if (passflag & SCE_PASS_Z)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_Z, RRES_OUT_Z);
+ if (passflag & SCE_PASS_NORMAL)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_NORMAL, RRES_OUT_NORMAL);
+ if (passflag & SCE_PASS_VECTOR)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_VECTOR, RRES_OUT_VEC);
+ if (passflag & SCE_PASS_UV)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_UV, RRES_OUT_UV);
+ if (passflag & SCE_PASS_RGBA)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_RGBA, RRES_OUT_RGBA);
+ if (passflag & SCE_PASS_DIFFUSE)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_DIFFUSE, RRES_OUT_DIFF);
+ if (passflag & SCE_PASS_SPEC)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_SPEC, RRES_OUT_SPEC);
+ if (passflag & SCE_PASS_SHADOW)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_SHADOW, RRES_OUT_SHADOW);
+ if (passflag & SCE_PASS_AO)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_AO, RRES_OUT_AO);
+ if (passflag & SCE_PASS_REFLECT)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_REFLECT, RRES_OUT_REFLECT);
+ if (passflag & SCE_PASS_REFRACT)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_REFRACT, RRES_OUT_REFRACT);
+ if (passflag & SCE_PASS_INDIRECT)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_INDIRECT, RRES_OUT_INDIRECT);
+ if (passflag & SCE_PASS_INDEXOB)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_INDEXOB, RRES_OUT_INDEXOB);
+ if (passflag & SCE_PASS_INDEXMA)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_INDEXMA, RRES_OUT_INDEXMA);
+ if (passflag & SCE_PASS_MIST)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_MIST, RRES_OUT_MIST);
+ if (passflag & SCE_PASS_EMIT)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_EMIT, RRES_OUT_EMIT);
+ if (passflag & SCE_PASS_ENVIRONMENT)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_ENVIRONMENT, RRES_OUT_ENV);
+
+ if (passflag & SCE_PASS_DIFFUSE_DIRECT)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_DIFFUSE_DIRECT, RRES_OUT_DIFF_DIRECT);
+ if (passflag & SCE_PASS_DIFFUSE_INDIRECT)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_DIFFUSE_INDIRECT, RRES_OUT_DIFF_INDIRECT);
+ if (passflag & SCE_PASS_DIFFUSE_COLOR)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_DIFFUSE_COLOR, RRES_OUT_DIFF_COLOR);
+
+ if (passflag & SCE_PASS_GLOSSY_DIRECT)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_GLOSSY_DIRECT, RRES_OUT_GLOSSY_DIRECT);
+ if (passflag & SCE_PASS_GLOSSY_INDIRECT)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_GLOSSY_INDIRECT, RRES_OUT_GLOSSY_INDIRECT);
+ if (passflag & SCE_PASS_GLOSSY_COLOR)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_GLOSSY_COLOR, RRES_OUT_GLOSSY_COLOR);
+
+ if (passflag & SCE_PASS_TRANSM_DIRECT)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_TRANSM_DIRECT, RRES_OUT_TRANSM_DIRECT);
+ if (passflag & SCE_PASS_TRANSM_INDIRECT)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_TRANSM_INDIRECT, RRES_OUT_TRANSM_INDIRECT);
+ if (passflag & SCE_PASS_TRANSM_COLOR)
+ cmp_node_image_add_render_pass_output(ntree, node, SCE_PASS_TRANSM_COLOR, RRES_OUT_TRANSM_COLOR);
+}
+
+static void cmp_node_image_add_multilayer_outputs(bNodeTree *ntree, bNode *node, RenderLayer *rl)
+{
+ bNodeSocket *sock;
+ RenderPass *rpass;
+ int index;
+ for (rpass=rl->passes.first, index=0; rpass; rpass=rpass->next, ++index) {
+ int type;
+ if (rpass->channels == 1)
+ type = SOCK_FLOAT;
+ else
+ type = SOCK_RGBA;
+
+ sock = nodeAddSocket(ntree, node, SOCK_OUT, rpass->name, type);
+ /* for multilayer image use pass index directly as key */
+ sock->storage = SET_INT_IN_POINTER(index);
+ }
+}
+
+static void cmp_node_image_create_outputs(bNodeTree *ntree, bNode *node)
+{
+ Image *ima= (Image *)node->id;
+ if (ima) {
+ ImageUser *iuser= node->storage;
+
+ /* make sure ima->type is correct */
+ BKE_image_get_ibuf(ima, iuser);
+
+ if (ima->rr) {
+ RenderLayer *rl= BLI_findlink(&ima->rr->layers, iuser->layer);
+
+ if (rl) {
+ if (ima->type!=IMA_TYPE_MULTILAYER)
+ cmp_node_image_add_render_pass_outputs(ntree, node, rl->passflag);
+ else
+ cmp_node_image_add_multilayer_outputs(ntree, node, rl);
+ }
+ else
+ cmp_node_image_add_render_pass_outputs(ntree, node, RRES_OUT_IMAGE|RRES_OUT_ALPHA);
+ }
+ else
+ cmp_node_image_add_render_pass_outputs(ntree, node, RRES_OUT_IMAGE|RRES_OUT_ALPHA|RRES_OUT_Z);
+ }
+ else
+ cmp_node_image_add_render_pass_outputs(ntree, node, RRES_OUT_IMAGE|RRES_OUT_ALPHA);
+}
+
+static bNodeSocket *cmp_node_image_output_find_match(bNode *UNUSED(node), bNodeSocket *newsock, ListBase *oldsocklist)
+{
+ bNodeSocket *sock;
+
+ for (sock=oldsocklist->first; sock; sock=sock->next)
+ if (strcmp(sock->name, newsock->name)==0)
+ return sock;
+ return NULL;
+}
+
+static bNodeSocket *cmp_node_image_output_relink(bNode *node, bNodeSocket *oldsock, int oldindex)
+{
+ bNodeSocket *sock;
+
+ /* first try to find matching socket name */
+ for (sock=node->outputs.first; sock; sock=sock->next)
+ if (strcmp(sock->name, oldsock->name)==0)
+ return sock;
+
+ /* no matching name, simply link to same index */
+ return BLI_findlink(&node->outputs, oldindex);
+}
+
+static void cmp_node_image_sync_output(bNode *UNUSED(node), bNodeSocket *UNUSED(newsock), bNodeSocket *UNUSED(oldsock))
+{
+ /* pass */
+}
+
+/* XXX make this into a generic socket verification function for dynamic socket replacement (multilayer, groups, static templates) */
+static void cmp_node_image_verify_outputs(bNodeTree *ntree, bNode *node)
+{
+ bNodeSocket *newsock, *oldsock, *oldsock_next;
+ ListBase oldsocklist;
+ int oldindex;
+ bNodeLink *link;
+
+ /* store current nodes in oldsocklist, then clear socket list */
+ oldsocklist = node->outputs;
+ node->outputs.first = node->outputs.last = NULL;
+
+ /* XXX make callback */
+ cmp_node_image_create_outputs(ntree, node);
+ /* flag all new sockets as dynamic, to prevent removal by socket verification function */
+ for (newsock=node->outputs.first; newsock; newsock=newsock->next)
+ newsock->flag |= SOCK_DYNAMIC;
+
+ for (newsock=node->outputs.first; newsock; newsock=newsock->next) {
+ /* XXX make callback */
+ oldsock = cmp_node_image_output_find_match(node, newsock, &oldsocklist);
+ if (oldsock) {
+ /* XXX make callback */
+ cmp_node_image_sync_output(node, newsock, oldsock);
+ }
+ }
+
+ /* move links to new socket */
+ for (oldsock=oldsocklist.first, oldindex=0; oldsock; oldsock=oldsock->next, ++oldindex) {
+ newsock = cmp_node_image_output_relink(node, oldsock, oldindex);
+
+ if (newsock) {
+ for (link=ntree->links.first; link; link=link->next) {
+ if (link->fromsock == oldsock)
+ link->fromsock = newsock;
+ }
+ }
+ }
+
+ /* delete old sockets
+ * XXX oldsock is not actually in the node->outputs list any more,
+ * but the nodeRemoveSocket function works anyway. In future this
+ * should become part of the core code, so can take care of this behavior.
+ */
+ for (oldsock=oldsocklist.first; oldsock; oldsock=oldsock_next) {
+ oldsock_next = oldsock->next;
+ nodeRemoveSocket(ntree, node, oldsock);
+ }
+}
+
+static void cmp_node_image_update(bNodeTree *ntree, bNode *node)
+{
+ /* avoid unnecessary updates, only changes to the image/image user data are of interest */
+ if (node->update & NODE_UPDATE_ID)
+ cmp_node_image_verify_outputs(ntree, node);
+}
+
/* float buffer from the image with matching color management */
float *node_composit_get_float_buffer(RenderData *rd, ImBuf *ibuf, int *alloc)
{
@@ -189,85 +394,21 @@ static CompBuf *node_composit_get_zimage(bNode *node, RenderData *rd)
}
/* check if layer is available, returns pass buffer */
-static CompBuf *compbuf_multilayer_get(RenderData *rd, RenderLayer *rl, Image *ima, ImageUser *iuser, int passtype)
+static CompBuf *compbuf_multilayer_get(RenderData *rd, RenderLayer *rl, Image *ima, ImageUser *iuser, int passindex)
{
- RenderPass *rpass;
- short index;
-
- for (index=0, rpass= rl->passes.first; rpass; rpass= rpass->next, index++)
- if (rpass->passtype==passtype)
- break;
-
+ RenderPass *rpass = BLI_findlink(&rl->passes, passindex);
if (rpass) {
CompBuf *cbuf;
- iuser->pass= index;
+ iuser->pass = passindex;
BKE_image_multilayer_index(ima->rr, iuser);
- cbuf= node_composit_get_image(rd, ima, iuser);
+ cbuf = node_composit_get_image(rd, ima, iuser);
return cbuf;
}
return NULL;
}
-static void outputs_multilayer_get(RenderData *rd, RenderLayer *rl, bNodeStack **out, Image *ima, ImageUser *iuser)
-{
- if (out[RRES_OUT_Z]->hasoutput)
- out[RRES_OUT_Z]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_Z);
- if (out[RRES_OUT_VEC]->hasoutput)
- out[RRES_OUT_VEC]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_VECTOR);
- if (out[RRES_OUT_NORMAL]->hasoutput)
- out[RRES_OUT_NORMAL]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_NORMAL);
- if (out[RRES_OUT_UV]->hasoutput)
- out[RRES_OUT_UV]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_UV);
-
- if (out[RRES_OUT_RGBA]->hasoutput)
- out[RRES_OUT_RGBA]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_RGBA);
- if (out[RRES_OUT_DIFF]->hasoutput)
- out[RRES_OUT_DIFF]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_DIFFUSE);
- if (out[RRES_OUT_SPEC]->hasoutput)
- out[RRES_OUT_SPEC]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_SPEC);
- if (out[RRES_OUT_SHADOW]->hasoutput)
- out[RRES_OUT_SHADOW]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_SHADOW);
- if (out[RRES_OUT_AO]->hasoutput)
- out[RRES_OUT_AO]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_AO);
- if (out[RRES_OUT_REFLECT]->hasoutput)
- out[RRES_OUT_REFLECT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_REFLECT);
- if (out[RRES_OUT_REFRACT]->hasoutput)
- out[RRES_OUT_REFRACT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_REFRACT);
- if (out[RRES_OUT_INDIRECT]->hasoutput)
- out[RRES_OUT_INDIRECT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDIRECT);
- if (out[RRES_OUT_INDEXOB]->hasoutput)
- out[RRES_OUT_INDEXOB]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXOB);
- if (out[RRES_OUT_INDEXMA]->hasoutput)
- out[RRES_OUT_INDEXMA]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_INDEXMA);
- if (out[RRES_OUT_MIST]->hasoutput)
- out[RRES_OUT_MIST]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_MIST);
- if (out[RRES_OUT_EMIT]->hasoutput)
- out[RRES_OUT_EMIT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_EMIT);
- if (out[RRES_OUT_ENV]->hasoutput)
- out[RRES_OUT_ENV]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_ENVIRONMENT);
- if (out[RRES_OUT_DIFF_DIRECT]->hasoutput)
- out[RRES_OUT_DIFF_DIRECT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_DIFFUSE_DIRECT);
- if (out[RRES_OUT_DIFF_INDIRECT]->hasoutput)
- out[RRES_OUT_DIFF_INDIRECT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_DIFFUSE_INDIRECT);
- if (out[RRES_OUT_DIFF_COLOR]->hasoutput)
- out[RRES_OUT_DIFF_COLOR]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_DIFFUSE_COLOR);
- if (out[RRES_OUT_GLOSSY_DIRECT]->hasoutput)
- out[RRES_OUT_GLOSSY_DIRECT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_GLOSSY_DIRECT);
- if (out[RRES_OUT_GLOSSY_INDIRECT]->hasoutput)
- out[RRES_OUT_GLOSSY_INDIRECT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_GLOSSY_INDIRECT);
- if (out[RRES_OUT_GLOSSY_COLOR]->hasoutput)
- out[RRES_OUT_GLOSSY_COLOR]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_GLOSSY_COLOR);
- if (out[RRES_OUT_TRANSM_DIRECT]->hasoutput)
- out[RRES_OUT_TRANSM_DIRECT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_TRANSM_DIRECT);
- if (out[RRES_OUT_TRANSM_INDIRECT]->hasoutput)
- out[RRES_OUT_TRANSM_INDIRECT]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_TRANSM_INDIRECT);
- if (out[RRES_OUT_TRANSM_COLOR]->hasoutput)
- out[RRES_OUT_TRANSM_COLOR]->data= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_TRANSM_COLOR);
-}
-
-
static void node_composit_exec_image(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
@@ -277,7 +418,6 @@ static void node_composit_exec_image(void *data, bNode *node, bNodeStack **UNUSE
RenderData *rd= data;
Image *ima= (Image *)node->id;
ImageUser *iuser= (ImageUser *)node->storage;
- CompBuf *stackbuf= NULL;
/* first set the right frame number in iuser */
BKE_image_user_calc_frame(iuser, rd->cfra, 0);
@@ -290,15 +430,36 @@ static void node_composit_exec_image(void *data, bNode *node, bNodeStack **UNUSE
RenderLayer *rl= BLI_findlink(&ima->rr->layers, iuser->layer);
if (rl) {
- out[0]->data= stackbuf= compbuf_multilayer_get(rd, rl, ima, iuser, SCE_PASS_COMBINED);
+ bNodeSocket *sock;
+ int out_index;
+ CompBuf *combinedbuf= NULL, *firstbuf= NULL;
- /* go over all layers */
- outputs_multilayer_get(rd, rl, out, ima, iuser);
+ for (sock=node->outputs.first, out_index=0; sock; sock=sock->next, ++out_index) {
+ int passindex = GET_INT_FROM_POINTER(sock->storage);
+ if (out[out_index]->hasoutput) {
+ CompBuf *stackbuf = out[out_index]->data = compbuf_multilayer_get(rd, rl, ima, iuser, passindex);
+ if (stackbuf) {
+ /* preview policy: take first 'Combined' pass if available,
+ * otherwise just use the first layer.
+ */
+ if (!firstbuf)
+ firstbuf = stackbuf;
+ if (!combinedbuf &&
+ (strcmp(sock->name, "Combined")==0 || strcmp(sock->name, "Image")==0))
+ combinedbuf = stackbuf;
+ }
+ }
+ }
+
+ /* preview */
+ if (combinedbuf)
+ generate_preview(data, node, combinedbuf);
+ else if (firstbuf)
+ generate_preview(data, node, firstbuf);
}
}
else {
- stackbuf= node_composit_get_image(rd, ima, iuser);
-
+ CompBuf *stackbuf = node_composit_get_image(rd, ima, iuser);
if (stackbuf) {
/*respect image premul option*/
if (stackbuf->type==CB_RGBA && ima->flag & IMA_DO_PREMUL) {
@@ -324,23 +485,23 @@ static void node_composit_exec_image(void *data, bNode *node, bNodeStack **UNUSE
/* put image on stack */
out[0]->data= stackbuf;
-
+
+ /* alpha output */
+ if (out[1]->hasoutput)
+ out[1]->data= valbuf_from_rgbabuf(stackbuf, CHAN_A);
+
+ /* Z output */
if (out[2]->hasoutput)
out[2]->data= node_composit_get_zimage(node, rd);
+
+ /* preview */
+ generate_preview(data, node, stackbuf);
}
}
-
- /* alpha and preview for both types */
- if (stackbuf) {
- if (out[1]->hasoutput)
- out[1]->data= valbuf_from_rgbabuf(stackbuf, CHAN_A);
-
- generate_preview(data, node, stackbuf);
- }
}
}
-static void node_composit_init_image(bNodeTree *UNUSED(ntree), bNode* node, bNodeTemplate *UNUSED(ntemp))
+static void node_composit_init_image(bNodeTree *ntree, bNode* node, bNodeTemplate *UNUSED(ntemp))
{
ImageUser *iuser= MEM_callocN(sizeof(ImageUser), "node image user");
node->storage= iuser;
@@ -348,6 +509,9 @@ static void node_composit_init_image(bNodeTree *UNUSED(ntree), bNode* node, bNod
iuser->sfra= 1;
iuser->fie_ima= 2;
iuser->ok= 1;
+
+ /* setup initial outputs */
+ cmp_node_image_verify_outputs(ntree, node);
}
void register_node_type_cmp_image(bNodeTreeType *ttype)
@@ -355,10 +519,10 @@ void register_node_type_cmp_image(bNodeTreeType *ttype)
static bNodeType ntype;
node_type_base(ttype, &ntype, CMP_NODE_IMAGE, "Image", NODE_CLASS_INPUT, NODE_PREVIEW|NODE_OPTIONS);
- node_type_socket_templates(&ntype, NULL, cmp_node_rlayers_out);
node_type_size(&ntype, 120, 80, 300);
node_type_init(&ntype, node_composit_init_image);
node_type_storage(&ntype, "ImageUser", node_free_standard_storage, node_copy_standard_storage);
+ node_type_update(&ntype, cmp_node_image_update, NULL);
node_type_exec(&ntype, node_composit_exec_image);
nodeRegisterType(ttype, &ntype);
@@ -449,6 +613,8 @@ static void node_composit_rlayers_out(RenderData *rd, RenderLayer *rl, bNodeStac
out[RRES_OUT_TRANSM_COLOR]->data= compbuf_from_pass(rd, rl, rectx, recty, SCE_PASS_TRANSM_COLOR);
}
+
+
static void node_composit_exec_rlayers(void *data, bNode *node, bNodeStack **UNUSED(in), bNodeStack **out)
{
Scene *sce= (Scene *)node->id;
diff --git a/source/blender/python/bmesh/bmesh_py_api.c b/source/blender/python/bmesh/bmesh_py_api.c
index 77276df49f2..4d8d4e3bc23 100644
--- a/source/blender/python/bmesh/bmesh_py_api.c
+++ b/source/blender/python/bmesh/bmesh_py_api.c
@@ -129,7 +129,7 @@ PyObject *BPyInit_bmesh(void)
{
PyObject *mod;
PyObject *submodule;
- PyObject *sys_modules = PySys_GetObject("modules"); /* not pretty */
+ PyObject *sys_modules = PyThreadState_GET()->interp->modules;
BPy_BM_init_types();
BPy_BM_init_types_select();
@@ -140,11 +140,11 @@ PyObject *BPyInit_bmesh(void)
/* bmesh.types */
PyModule_AddObject(mod, "types", (submodule = BPyInit_bmesh_types()));
- PyDict_SetItemString(sys_modules, "bmesh.types", submodule);
+ PyDict_SetItemString(sys_modules, PyModule_GetName(submodule), submodule);
Py_INCREF(submodule);
PyModule_AddObject(mod, "utils", (submodule = BPyInit_bmesh_utils()));
- PyDict_SetItemString(sys_modules, "bmesh.utils", submodule);
+ PyDict_SetItemString(sys_modules, PyModule_GetName(submodule), submodule);
Py_INCREF(submodule);
return mod;
diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c
index 4b4dc7caa7f..ee91b19a5a4 100644
--- a/source/blender/python/bmesh/bmesh_py_types.c
+++ b/source/blender/python/bmesh/bmesh_py_types.c
@@ -998,13 +998,13 @@ static PyObject *bpy_bmesh_transform(BPy_BMElem *self, PyObject *args, PyObject
mat_ptr = mat->matrix;
if (!filter_flags) {
- BM_ITER(eve, &iter, self->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, self->bm, BM_VERTS_OF_MESH) {
mul_m4_v3((float (*)[4])mat_ptr, eve->co);
}
}
else {
char filter_flags_ch = (char)filter_flags;
- BM_ITER(eve, &iter, self->bm, BM_VERTS_OF_MESH, NULL) {
+ BM_ITER_MESH (eve, &iter, self->bm, BM_VERTS_OF_MESH) {
if (eve->head.hflag & filter_flags_ch) {
mul_m4_v3((float (*)[4])mat_ptr, eve->co);
}
@@ -1189,9 +1189,9 @@ static PyObject *bpy_bmvert_copy_from_face_interp(BPy_BMVert *self, PyObject *ar
PyDoc_STRVAR(bpy_bmvert_calc_edge_angle_doc,
".. method:: calc_edge_angle()\n"
"\n"
-" Return the angle between 2 connected edges.\n"
+" Return the angle between this verts 2 connected edges.\n"
"\n"
-" :return: The angle between both edges in radians.\n"
+" :return: Angle between edges in radians.\n"
" :rtype: float\n"
);
static PyObject *bpy_bmvert_calc_edge_angle(BPy_BMVert *self)
@@ -1200,6 +1200,21 @@ static PyObject *bpy_bmvert_calc_edge_angle(BPy_BMVert *self)
return PyFloat_FromDouble(BM_vert_edge_angle(self->v));
}
+PyDoc_STRVAR(bpy_bmvert_calc_shell_factor_doc,
+".. method:: calc_shell_factor()\n"
+"\n"
+" Return a multiplier calculated based on the sharpness of the vertex.\n"
+" Where a flat surface gives 1.0, and higher values sharper edges.\n"
+" This is used to maintain shell thickness when offsetting verts along their normals.\n"
+"\n"
+" :return: offset multiplier\n"
+" :rtype: float\n"
+);
+static PyObject *bpy_bmvert_calc_shell_factor(BPy_BMVert *self)
+{
+ BPY_BM_CHECK_OBJ(self);
+ return PyFloat_FromDouble(BM_vert_shell_factor(self->v));
+}
PyDoc_STRVAR(bpy_bmvert_normal_update_doc,
".. method:: normal_update()\n"
@@ -1210,7 +1225,7 @@ static PyObject *bpy_bmvert_normal_update(BPy_BMVert *self)
{
BPY_BM_CHECK_OBJ(self);
- BM_vert_normal_update(self->bm, self->v);
+ BM_vert_normal_update(self->v);
Py_RETURN_NONE;
}
@@ -1243,6 +1258,36 @@ static PyObject *bpy_bmedge_calc_face_angle(BPy_BMEdge *self)
return PyFloat_FromDouble(BM_edge_face_angle(self->e));
}
+PyDoc_STRVAR(bpy_bmedge_calc_tangent_doc,
+".. method:: calc_tangent(loop)\n"
+"\n"
+" Return the tangent at this edge relative to a face (pointing inward into the face).\n"
+" This uses the face normal for calculation.\n"
+"\n"
+" :arg loop: The loop used for tangent calculation.\n"
+" :type loop: :class:`BMLoop`\n"
+" :return: a normalized vector.\n"
+" :rtype: :class:`mathutils.Vector`\n"
+);
+static PyObject *bpy_bmedge_calc_tangent(BPy_BMEdge *self, PyObject *args)
+{
+ BPy_BMLoop *py_loop;
+ BPY_BM_CHECK_OBJ(self);
+
+ if (!PyArg_ParseTuple(args, "O!:BMEdge.calc_face_tangent",
+ &BPy_BMLoop_Type, &py_loop))
+ {
+ return NULL;
+ }
+ else {
+ float vec[3];
+ BPY_BM_CHECK_OBJ(py_loop);
+ /* no need to check if they are from the same mesh or even connected */
+ BM_edge_face_tangent(self->e, py_loop->l, vec);
+ return Vector_CreatePyObject(vec, 3, Py_NEW, NULL);
+ }
+}
+
PyDoc_STRVAR(bpy_bmedge_other_vert_doc,
".. method:: other_vert(vert)\n"
@@ -1295,7 +1340,7 @@ static PyObject *bpy_bmedge_normal_update(BPy_BMEdge *self)
{
BPY_BM_CHECK_OBJ(self);
- BM_edge_normals_update(self->bm, self->e);
+ BM_edge_normals_update(self->e);
Py_RETURN_NONE;
}
@@ -1396,7 +1441,22 @@ PyDoc_STRVAR(bpy_bmface_calc_area_doc,
static PyObject *bpy_bmface_calc_area(BPy_BMFace *self)
{
BPY_BM_CHECK_OBJ(self);
- return PyFloat_FromDouble(BM_face_area_calc(self->bm, self->f));
+ return PyFloat_FromDouble(BM_face_area_calc(self->f));
+}
+
+
+PyDoc_STRVAR(bpy_bmface_calc_perimeter_doc,
+".. method:: calc_perimeter()\n"
+"\n"
+" Return the perimeter of the face.\n"
+"\n"
+" :return: Return the perimeter of the face.\n"
+" :rtype: float\n"
+);
+static PyObject *bpy_bmface_calc_perimeter(BPy_BMFace *self)
+{
+ BPY_BM_CHECK_OBJ(self);
+ return PyFloat_FromDouble(BM_face_perimeter_calc(self->f));
}
@@ -1413,7 +1473,7 @@ static PyObject *bpy_bmface_calc_center_mean(BPy_BMFace *self)
float cent[3];
BPY_BM_CHECK_OBJ(self);
- BM_face_center_mean_calc(self->bm, self->f, cent);
+ BM_face_center_mean_calc(self->f, cent);
return Vector_CreatePyObject(cent, 3, Py_NEW, NULL);
}
@@ -1431,7 +1491,7 @@ static PyObject *bpy_bmface_calc_center_bounds(BPy_BMFace *self)
float cent[3];
BPY_BM_CHECK_OBJ(self);
- BM_face_center_bounds_calc(self->bm, self->f, cent);
+ BM_face_center_bounds_calc(self->f, cent);
return Vector_CreatePyObject(cent, 3, Py_NEW, NULL);
}
@@ -1445,7 +1505,7 @@ static PyObject *bpy_bmface_normal_update(BPy_BMFace *self)
{
BPY_BM_CHECK_OBJ(self);
- BM_face_normal_update(self->bm, self->f);
+ BM_face_normal_update(self->f);
Py_RETURN_NONE;
}
@@ -2049,7 +2109,8 @@ static struct PyMethodDef bpy_bmvert_methods[] = {
{"copy_from_face_interp", (PyCFunction)bpy_bmvert_copy_from_face_interp, METH_VARARGS, bpy_bmvert_copy_from_face_interp_doc},
{"copy_from_vert_interp", (PyCFunction)bpy_bmvert_copy_from_vert_interp, METH_VARARGS, bpy_bmvert_copy_from_vert_interp_doc},
- {"calc_vert_angle", (PyCFunction)bpy_bmvert_calc_edge_angle, METH_NOARGS, bpy_bmvert_calc_edge_angle_doc},
+ {"calc_vert_angle", (PyCFunction)bpy_bmvert_calc_edge_angle, METH_NOARGS, bpy_bmvert_calc_edge_angle_doc},
+ {"calc_shell_factor", (PyCFunction)bpy_bmvert_calc_shell_factor, METH_NOARGS, bpy_bmvert_calc_shell_factor_doc},
{"normal_update", (PyCFunction)bpy_bmvert_normal_update, METH_NOARGS, bpy_bmvert_normal_update_doc},
@@ -2063,8 +2124,9 @@ static struct PyMethodDef bpy_bmedge_methods[] = {
{"other_vert", (PyCFunction)bpy_bmedge_other_vert, METH_O, bpy_bmedge_other_vert_doc},
- {"calc_length", (PyCFunction)bpy_bmedge_calc_length, METH_NOARGS, bpy_bmedge_calc_length_doc},
- {"calc_face_angle", (PyCFunction)bpy_bmedge_calc_face_angle, METH_NOARGS, bpy_bmedge_calc_face_angle_doc},
+ {"calc_length", (PyCFunction)bpy_bmedge_calc_length, METH_NOARGS, bpy_bmedge_calc_length_doc},
+ {"calc_face_angle", (PyCFunction)bpy_bmedge_calc_face_angle, METH_NOARGS, bpy_bmedge_calc_face_angle_doc},
+ {"calc_tangent", (PyCFunction)bpy_bmedge_calc_tangent, METH_VARARGS, bpy_bmedge_calc_tangent_doc},
{"normal_update", (PyCFunction)bpy_bmedge_normal_update, METH_NOARGS, bpy_bmedge_normal_update_doc},
@@ -2081,6 +2143,7 @@ static struct PyMethodDef bpy_bmface_methods[] = {
{"copy", (PyCFunction)bpy_bmface_copy, METH_VARARGS|METH_KEYWORDS, bpy_bmface_copy_doc},
{"calc_area", (PyCFunction)bpy_bmface_calc_area, METH_NOARGS, bpy_bmface_calc_area_doc},
+ {"calc_perimeter", (PyCFunction)bpy_bmface_calc_perimeter, METH_NOARGS, bpy_bmface_calc_perimeter_doc},
{"calc_center_median", (PyCFunction)bpy_bmface_calc_center_mean, METH_NOARGS, bpy_bmface_calc_center_mean_doc},
{"calc_center_bounds", (PyCFunction)bpy_bmface_calc_center_bounds, METH_NOARGS, bpy_bmface_calc_center_bounds_doc},
@@ -2138,7 +2201,7 @@ static struct PyMethodDef bpy_bmfaceseq_methods[] = {
static struct PyMethodDef bpy_bmloopseq_methods[] = {
/* odd function, initializes index values */
- {"index_update", (PyCFunction)bpy_bmelemseq_index_update, METH_NOARGS, bpy_bmelemseq_index_update_doc},
+ /* no: index_update() function since we cant iterate over loops */
{NULL, NULL, 0, NULL}
};
diff --git a/source/blender/python/bmesh/bmesh_py_types.h b/source/blender/python/bmesh/bmesh_py_types.h
index 0a94b346485..a69091cb7ec 100644
--- a/source/blender/python/bmesh/bmesh_py_types.h
+++ b/source/blender/python/bmesh/bmesh_py_types.h
@@ -138,8 +138,8 @@ void BPy_BM_init_types(void);
PyObject *BPyInit_bmesh_types(void);
enum {
- BPY_BMFLAG_NOP = 0, /* do nothing */
- BPY_BMFLAG_IS_WRAPPED = 1 /* the mesh is owned by editmode */
+ BPY_BMFLAG_NOP = 0, /* do nothing */
+ BPY_BMFLAG_IS_WRAPPED = 1 /* the mesh is owned by editmode */
};
PyObject *BPy_BMesh_CreatePyObject(BMesh *bm, int flag);
@@ -175,8 +175,15 @@ char *BPy_BMElem_StringFromHType(const char htype);
#define BPY_BM_IS_VALID(obj) (LIKELY((obj)->bm != NULL))
-#define BM_ITER_BPY_BM_SEQ(ele, iter, bpy_bmelemseq) \
- BM_ITER(ele, iter, (bpy_bmelemseq)->bm, (bpy_bmelemseq)->itype, \
- (bpy_bmelemseq)->py_ele ? ((BPy_BMElem *)(bpy_bmelemseq)->py_ele)->ele : NULL)
+#define BM_ITER_BPY_BM_SEQ(ele, iter, bpy_bmelemseq) \
+ for (ele = BM_iter_new(iter, \
+ (bpy_bmelemseq)->bm, \
+ (bpy_bmelemseq)->itype, \
+ (bpy_bmelemseq)->py_ele ? \
+ ((BPy_BMElem *)(bpy_bmelemseq)->py_ele)->ele : \
+ NULL \
+ ); \
+ ele; \
+ ele = BM_iter_step(iter))
#endif /* __BMESH_TYPES_H__ */
diff --git a/source/blender/python/generic/idprop_py_api.c b/source/blender/python/generic/idprop_py_api.c
index cd2b1fb148e..9fd120b11aa 100644
--- a/source/blender/python/generic/idprop_py_api.c
+++ b/source/blender/python/generic/idprop_py_api.c
@@ -886,7 +886,7 @@ static PyMappingMethods BPy_IDGroup_Mapping = {
PyTypeObject BPy_IDGroup_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
/* For printing, in format "<module>.<name>" */
- "Blender IDProperty", /* char *tp_name; */
+ "IDPropertyGroup", /* char *tp_name; */
sizeof(BPy_IDProperty), /* int tp_basicsize; */
0, /* tp_itemsize; For allocation */
@@ -1236,7 +1236,7 @@ static PyMappingMethods BPy_IDArray_AsMapping = {
PyTypeObject BPy_IDArray_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
/* For printing, in format "<module>.<name>" */
- "Blender IDArray", /* char *tp_name; */
+ "IDPropertyArray", /* char *tp_name; */
sizeof(BPy_IDArray), /* int tp_basicsize; */
0, /* tp_itemsize; For allocation */
@@ -1350,7 +1350,7 @@ static PyObject *BPy_Group_Iter_Next(BPy_IDGroup_Iter *self)
PyTypeObject BPy_IDGroup_Iter_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
/* For printing, in format "<module>.<name>" */
- "Blender IDGroup_Iter", /* char *tp_name; */
+ "IDPropertyGroupIter", /* char *tp_name; */
sizeof(BPy_IDGroup_Iter), /* int tp_basicsize; */
0, /* tp_itemsize; For allocation */
@@ -1410,3 +1410,76 @@ void IDProp_Init_Types(void)
PyType_Ready(&BPy_IDGroup_Iter_Type);
PyType_Ready(&BPy_IDArray_Type);
}
+
+/*----------------------------MODULE INIT-------------------------*/
+
+/* --- */
+
+static struct PyModuleDef IDProp_types_module_def = {
+ PyModuleDef_HEAD_INIT,
+ "idprop.types", /* m_name */
+ NULL, /* m_doc */
+ 0, /* m_size */
+ NULL, /* m_methods */
+ NULL, /* m_reload */
+ NULL, /* m_traverse */
+ NULL, /* m_clear */
+ NULL, /* m_free */
+};
+
+static PyObject *BPyInit_idprop_types(void)
+{
+ PyObject *submodule;
+
+ submodule = PyModule_Create(&IDProp_types_module_def);
+
+#define MODULE_TYPE_ADD(s, t) \
+ PyModule_AddObject(s, t.tp_name, (PyObject *)&t); Py_INCREF((PyObject *)&t)
+
+ /* bmesh_py_types.c */
+ MODULE_TYPE_ADD(submodule, BPy_IDGroup_Type);
+ MODULE_TYPE_ADD(submodule, BPy_IDGroup_Iter_Type);
+ MODULE_TYPE_ADD(submodule, BPy_IDArray_Type);
+
+#undef MODULE_TYPE_ADD
+
+ return submodule;
+}
+
+/* --- */
+
+static PyMethodDef IDProp_methods[] = {
+ {NULL, NULL, 0, NULL}
+};
+
+
+PyDoc_STRVAR(IDProp_module_doc,
+"This module provides access id property types (currently mainly for docs)."
+);
+static struct PyModuleDef IDProp_module_def = {
+ PyModuleDef_HEAD_INIT,
+ "idprop", /* m_name */
+ IDProp_module_doc, /* m_doc */
+ 0, /* m_size */
+ IDProp_methods, /* m_methods */
+ NULL, /* m_reload */
+ NULL, /* m_traverse */
+ NULL, /* m_clear */
+ NULL, /* m_free */
+};
+
+PyObject *BPyInit_idprop(void)
+{
+ PyObject *mod;
+ PyObject *submodule;
+ PyObject *sys_modules = PyThreadState_GET()->interp->modules;
+
+ mod = PyModule_Create(&IDProp_module_def);
+
+ /* bmesh.types */
+ PyModule_AddObject(mod, "types", (submodule = BPyInit_idprop_types()));
+ PyDict_SetItemString(sys_modules, PyModule_GetName(submodule), submodule);
+ Py_INCREF(submodule);
+
+ return mod;
+}
diff --git a/source/blender/python/generic/idprop_py_api.h b/source/blender/python/generic/idprop_py_api.h
index 35b130d005e..99e291f69c0 100644
--- a/source/blender/python/generic/idprop_py_api.h
+++ b/source/blender/python/generic/idprop_py_api.h
@@ -64,6 +64,8 @@ const char *BPy_IDProperty_Map_ValidateAndCreate(PyObject *key, struct IDPropert
void IDProp_Init_Types(void);
+PyObject *BPyInit_idprop(void);
+
#define IDPROP_ITER_KEYS 0
#define IDPROP_ITER_ITEMS 1
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c
index f68ef6838e8..f370c06194a 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -74,9 +74,11 @@
/* inittab initialization functions */
#include "../generic/bgl.h"
#include "../generic/blf_py_api.h"
+#include "../generic/idprop_py_api.h"
#include "../bmesh/bmesh_py_api.h"
#include "../mathutils/mathutils.h"
+
/* for internal use, when starting and ending python scripts */
/* in case a python script triggers another python call, stop bpy_context_clear from invalidating */
@@ -211,6 +213,7 @@ static struct _inittab bpy_internal_modules[] = {
{(char *)"_cycles", CCL_initPython},
#endif
{(char *)"gpu", GPU_initPython},
+ {(char *)"idprop", BPyInit_idprop},
{NULL, NULL}
};
diff --git a/source/blender/python/mathutils/mathutils.c b/source/blender/python/mathutils/mathutils.c
index 5ae58973602..f78050a7639 100644
--- a/source/blender/python/mathutils/mathutils.c
+++ b/source/blender/python/mathutils/mathutils.c
@@ -433,8 +433,8 @@ static struct PyModuleDef M_Mathutils_module_def = {
PyMODINIT_FUNC PyInit_mathutils(void)
{
+ PyObject *mod;
PyObject *submodule;
- PyObject *item;
PyObject *sys_modules = PyThreadState_GET()->interp->modules;
if (PyType_Ready(&vector_Type) < 0)
@@ -450,31 +450,31 @@ PyMODINIT_FUNC PyInit_mathutils(void)
if (PyType_Ready(&color_Type) < 0)
return NULL;
- submodule = PyModule_Create(&M_Mathutils_module_def);
+ mod = PyModule_Create(&M_Mathutils_module_def);
/* each type has its own new() function */
- PyModule_AddObject(submodule, "Vector", (PyObject *)&vector_Type);
- PyModule_AddObject(submodule, "Matrix", (PyObject *)&matrix_Type);
- PyModule_AddObject(submodule, "Euler", (PyObject *)&euler_Type);
- PyModule_AddObject(submodule, "Quaternion", (PyObject *)&quaternion_Type);
- PyModule_AddObject(submodule, "Color", (PyObject *)&color_Type);
+ PyModule_AddObject(mod, vector_Type.tp_name, (PyObject *)&vector_Type);
+ PyModule_AddObject(mod, matrix_Type.tp_name, (PyObject *)&matrix_Type);
+ PyModule_AddObject(mod, euler_Type.tp_name, (PyObject *)&euler_Type);
+ PyModule_AddObject(mod, quaternion_Type.tp_name, (PyObject *)&quaternion_Type);
+ PyModule_AddObject(mod, color_Type.tp_name, (PyObject *)&color_Type);
/* submodule */
- PyModule_AddObject(submodule, "geometry", (item = PyInit_mathutils_geometry()));
+ PyModule_AddObject(mod, "geometry", (submodule = PyInit_mathutils_geometry()));
/* XXX, python doesnt do imports with this usefully yet
* 'from mathutils.geometry import PolyFill'
* ...fails without this. */
- PyDict_SetItemString(sys_modules, "mathutils.geometry", item);
- Py_INCREF(item);
+ PyDict_SetItemString(sys_modules, PyModule_GetName(submodule), submodule);
+ Py_INCREF(submodule);
/* Noise submodule */
- PyModule_AddObject(submodule, "noise", (item = PyInit_mathutils_noise()));
- PyDict_SetItemString(sys_modules, "mathutils.noise", item);
- Py_INCREF(item);
+ PyModule_AddObject(mod, "noise", (submodule = PyInit_mathutils_noise()));
+ PyDict_SetItemString(sys_modules, PyModule_GetName(submodule), submodule);
+ Py_INCREF(submodule);
mathutils_matrix_row_cb_index = Mathutils_RegisterCallback(&mathutils_matrix_row_cb);
mathutils_matrix_col_cb_index = Mathutils_RegisterCallback(&mathutils_matrix_col_cb);
mathutils_matrix_translation_cb_index = Mathutils_RegisterCallback(&mathutils_matrix_translation_cb);
- return submodule;
+ return mod;
}
diff --git a/source/blender/python/mathutils/mathutils_Color.c b/source/blender/python/mathutils/mathutils_Color.c
index 9b06214b8ec..fc8b2886f37 100644
--- a/source/blender/python/mathutils/mathutils_Color.c
+++ b/source/blender/python/mathutils/mathutils_Color.c
@@ -807,7 +807,7 @@ PyDoc_STRVAR(color_doc,
);
PyTypeObject color_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "mathutils.Color", //tp_name
+ "Color", //tp_name
sizeof(ColorObject), //tp_basicsize
0, //tp_itemsize
(destructor)BaseMathObject_dealloc, //tp_dealloc
diff --git a/source/blender/python/mathutils/mathutils_Euler.c b/source/blender/python/mathutils/mathutils_Euler.c
index 4e3b5f8d52e..a663bd71130 100644
--- a/source/blender/python/mathutils/mathutils_Euler.c
+++ b/source/blender/python/mathutils/mathutils_Euler.c
@@ -650,7 +650,7 @@ PyDoc_STRVAR(euler_doc,
);
PyTypeObject euler_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "mathutils.Euler", //tp_name
+ "Euler", //tp_name
sizeof(EulerObject), //tp_basicsize
0, //tp_itemsize
(destructor)BaseMathObject_dealloc, //tp_dealloc
diff --git a/source/blender/python/mathutils/mathutils_Matrix.c b/source/blender/python/mathutils/mathutils_Matrix.c
index bd37b645cbb..a48e7ed854d 100644
--- a/source/blender/python/mathutils/mathutils_Matrix.c
+++ b/source/blender/python/mathutils/mathutils_Matrix.c
@@ -2316,7 +2316,7 @@ PyDoc_STRVAR(matrix_doc,
);
PyTypeObject matrix_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "mathutils.Matrix", /*tp_name*/
+ "Matrix", /*tp_name*/
sizeof(MatrixObject), /*tp_basicsize*/
0, /*tp_itemsize*/
(destructor)BaseMathObject_dealloc, /*tp_dealloc*/
diff --git a/source/blender/python/mathutils/mathutils_Quaternion.c b/source/blender/python/mathutils/mathutils_Quaternion.c
index 2a1cef5a241..d1da4660f3b 100644
--- a/source/blender/python/mathutils/mathutils_Quaternion.c
+++ b/source/blender/python/mathutils/mathutils_Quaternion.c
@@ -1192,7 +1192,7 @@ PyDoc_STRVAR(quaternion_doc,
);
PyTypeObject quaternion_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
- "mathutils.Quaternion", //tp_name
+ "Quaternion", //tp_name
sizeof(QuaternionObject), //tp_basicsize
0, //tp_itemsize
(destructor)BaseMathObject_dealloc, //tp_dealloc
diff --git a/source/blender/python/mathutils/mathutils_Vector.c b/source/blender/python/mathutils/mathutils_Vector.c
index 17fa9cdd802..07bda4c2b91 100644
--- a/source/blender/python/mathutils/mathutils_Vector.c
+++ b/source/blender/python/mathutils/mathutils_Vector.c
@@ -2791,7 +2791,7 @@ PyDoc_STRVAR(vector_doc,
PyTypeObject vector_Type = {
PyVarObject_HEAD_INIT(NULL, 0)
/* For printing, in format "<module>.<name>" */
- "mathutils.Vector", /* char *tp_name; */
+ "Vector", /* char *tp_name; */
sizeof(VectorObject), /* int tp_basicsize; */
0, /* tp_itemsize; For allocation */
diff --git a/source/blender/render/SConscript b/source/blender/render/SConscript
index 46e483a7194..6295399597e 100644
--- a/source/blender/render/SConscript
+++ b/source/blender/render/SConscript
@@ -5,7 +5,7 @@ sources = env.Glob('intern/source/*.c')
raysources = env.Glob('intern/raytrace/*.cpp')
incs = 'intern/include #/intern/guardedalloc ../blenlib ../makesdna ../makesrna'
-incs += ' extern/include ../blenkernel ../radiosity/extern/include ../imbuf ../blenfont'
+incs += ' extern/include ../blenkernel ../imbuf ../blenfont'
incs += ' ../include ../blenloader ../../../intern/smoke/extern ../../../intern/mikktspace ../bmesh'
incs += ' ../freestyle'
@@ -15,7 +15,8 @@ cxxflags_raytrace = env['CXXFLAGS']
defs = []
defs_raytrace = []
-defs.append('WITH_SMOKE') # TODO, make optional
+if env['WITH_BF_SMOKE']:
+ defs.append('WITH_SMOKE')
if env['WITH_BF_PYTHON']:
incs += ' ../python'
diff --git a/source/blender/render/extern/include/RE_render_ext.h b/source/blender/render/extern/include/RE_render_ext.h
index 054aaccb177..9d7393f9414 100644
--- a/source/blender/render/extern/include/RE_render_ext.h
+++ b/source/blender/render/extern/include/RE_render_ext.h
@@ -50,9 +50,6 @@ struct MTex;
struct ImBuf;
struct DerivedMesh;
-// RADIO REMOVED, Maybe this will be useful later
-//void RE_zbufferall_radio(struct RadView *vw, struct RNode **rg_elem, int rg_totelem, struct Render *re);
-
/* particle.c, effect.c, editmesh_modes.c and brush.c, returns 1 if rgb, 0 otherwise */
int externtex(struct MTex *mtex, const float vec[3], float *tin, float *tr, float *tg, float *tb, float *ta, const int thread);
diff --git a/source/blender/render/intern/source/convertblender.c b/source/blender/render/intern/source/convertblender.c
index 06eba111bbe..0263367b308 100644
--- a/source/blender/render/intern/source/convertblender.c
+++ b/source/blender/render/intern/source/convertblender.c
@@ -4736,9 +4736,7 @@ void RE_Database_Free(Render *re)
/* free orco */
free_mesh_orco_hash(re);
-#if 0 /* radio can be redone better */
- end_radio_render();
-#endif
+
end_render_materials(re->main);
end_render_textures(re);
diff --git a/source/blender/render/intern/source/shadeoutput.c b/source/blender/render/intern/source/shadeoutput.c
index e56c9874467..8d7c1bbe530 100644
--- a/source/blender/render/intern/source/shadeoutput.c
+++ b/source/blender/render/intern/source/shadeoutput.c
@@ -1860,7 +1860,7 @@ void shade_lamp_loop(ShadeInput *shi, ShadeResult *shr)
}
shr->alpha= shi->alpha;
- /* from now stuff everything in shr->combined: ambient, AO, radio, ramps, exposure */
+ /* from now stuff everything in shr->combined: ambient, AO, ramps, exposure */
if (!(ma->sss_flag & MA_DIFF_SSS) || !sss_pass_done(&R, ma)) {
if (R.r.mode & R_SHADOW) {
/* add AO in combined? */
diff --git a/source/blender/windowmanager/WM_keymap.h b/source/blender/windowmanager/WM_keymap.h
index db448397065..78dbd253cd6 100644
--- a/source/blender/windowmanager/WM_keymap.h
+++ b/source/blender/windowmanager/WM_keymap.h
@@ -80,6 +80,7 @@ int WM_keymap_item_compare(struct wmKeyMapItem *k1, struct wmKeyMapItem *k2);
wmKeyMap *WM_modalkeymap_add(struct wmKeyConfig *keyconf, const char *idname, struct EnumPropertyItem *items);
wmKeyMap *WM_modalkeymap_get(struct wmKeyConfig *keyconf, const char *idname);
wmKeyMapItem *WM_modalkeymap_add_item(struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, int value);
+wmKeyMapItem *WM_modalkeymap_add_item_str(struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, const char *value);
void WM_modalkeymap_assign(struct wmKeyMap *km, const char *opname);
/* Keymap Editor */
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index d6f0c490289..a3bc4f87b60 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -429,9 +429,6 @@ typedef struct wmTimer {
int sleep; /* internal, put timers to sleep when needed */
} wmTimer;
-/* Default context for operator names/labels. */
-#define WM_OPERATOR_DEFAULT_I18NCONTEXT "Operator"
-
typedef struct wmOperatorType {
const char *name; /* text for ui, undo */
const char *idname; /* unique identifier */
diff --git a/source/blender/windowmanager/intern/wm_dragdrop.c b/source/blender/windowmanager/intern/wm_dragdrop.c
index 5283bc0a7a5..bbb2a54887e 100644
--- a/source/blender/windowmanager/intern/wm_dragdrop.c
+++ b/source/blender/windowmanager/intern/wm_dragdrop.c
@@ -36,6 +36,8 @@
#include "MEM_guardedalloc.h"
+#include "BLF_translation.h"
+
#include "BLI_blenlib.h"
#include "BIF_gl.h"
@@ -55,6 +57,8 @@
#include "UI_interface.h"
#include "UI_interface_icons.h"
+#include "RNA_access.h"
+
#include "WM_api.h"
#include "WM_types.h"
#include "wm_event_system.h"
@@ -179,8 +183,10 @@ static const char *dropbox_active(bContext *C, ListBase *handlers, wmDrag *drag,
if (handler->dropboxes) {
wmDropBox *drop = handler->dropboxes->first;
for (; drop; drop = drop->next) {
- if (drop->poll(C, drag, event))
- return drop->ot->name;
+ if (drop->poll(C, drag, event))
+ /* XXX Doing translation here might not be ideal, but later we have no more
+ * access to ot (and hence op context)... */
+ return RNA_struct_ui_name(drop->ot->srna);
}
}
}
@@ -220,7 +226,7 @@ static void wm_drop_operator_options(bContext *C, wmDrag *drag, wmEvent *event)
/* check buttons (XXX todo rna and value) */
if (UI_but_active_drop_name(C) ) {
- strcpy(drag->opname, "Paste name");
+ strcpy(drag->opname, IFACE_("Paste name"));
}
else {
const char *opname = wm_dropbox_active(C, drag, event);
diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c
index 96420a6968c..874611150cb 100644
--- a/source/blender/windowmanager/intern/wm_files.c
+++ b/source/blender/windowmanager/intern/wm_files.c
@@ -38,15 +38,16 @@
#include "zlib.h" /* wm_read_exotic() */
#ifdef WIN32
-#include <windows.h> /* need to include windows.h so _WIN32_IE is defined */
-#ifndef _WIN32_IE
-#define _WIN32_IE 0x0400 /* minimal requirements for SHGetSpecialFolderPath on MINGW MSVC has this defined already */
-#endif
-#include <shlobj.h> /* for SHGetSpecialFolderPath, has to be done before BLI_winstuff because 'near' is disabled through BLI_windstuff */
-#include <process.h> /* getpid */
-#include "BLI_winstuff.h"
+# include <windows.h> /* need to include windows.h so _WIN32_IE is defined */
+# ifndef _WIN32_IE
+# define _WIN32_IE 0x0400 /* minimal requirements for SHGetSpecialFolderPath on MINGW MSVC has this defined already */
+# endif
+# include <shlobj.h> /* for SHGetSpecialFolderPath, has to be done before BLI_winstuff
+ * because 'near' is disabled through BLI_windstuff */
+# include <process.h> /* getpid */
+# include "BLI_winstuff.h"
#else
-#include <unistd.h> /* getpid */
+# include <unistd.h> /* getpid */
#endif
#include "MEM_guardedalloc.h"
@@ -79,6 +80,7 @@
#include "BKE_packedFile.h"
#include "BKE_report.h"
#include "BKE_sound.h"
+#include "BKE_screen.h"
#include "BKE_texture.h"
@@ -664,23 +666,47 @@ static void write_history(void)
}
}
-static ImBuf *blend_file_thumb(Scene *scene, int **thumb_pt)
+/* screen can be NULL */
+static ImBuf *blend_file_thumb(Scene *scene, bScreen *screen, int **thumb_pt)
{
/* will be scaled down, but gives some nice oversampling */
ImBuf *ibuf;
int *thumb;
char err_out[256] = "unknown";
+ /* screen if no camera found */
+ ScrArea *sa = NULL;
+ ARegion *ar = NULL;
+ View3D *v3d = NULL;
+
*thumb_pt = NULL;
/* scene can be NULL if running a script at startup and calling the save operator */
- if (G.background || scene == NULL || scene->camera == NULL)
+ if (G.background || scene == NULL)
return NULL;
+ if ((scene->camera == NULL) && (screen != NULL)) {
+ sa = BKE_screen_find_big_area(screen, SPACE_VIEW3D, 0);
+ ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
+ if (ar) {
+ v3d = sa->spacedata.first;
+ }
+ }
+
+ if (scene->camera == NULL && v3d == NULL) {
+ return NULL;
+ }
+
/* gets scaled to BLEN_THUMB_SIZE */
- ibuf = ED_view3d_draw_offscreen_imbuf_simple(scene, scene->camera,
- BLEN_THUMB_SIZE * 2, BLEN_THUMB_SIZE * 2,
- IB_rect, OB_SOLID, FALSE, err_out);
+ if (scene->camera) {
+ ibuf = ED_view3d_draw_offscreen_imbuf_simple(scene, scene->camera,
+ BLEN_THUMB_SIZE * 2, BLEN_THUMB_SIZE * 2,
+ IB_rect, OB_SOLID, FALSE, err_out);
+ }
+ else {
+ ibuf = ED_view3d_draw_offscreen_imbuf(scene, v3d, ar, BLEN_THUMB_SIZE * 2, BLEN_THUMB_SIZE * 2,
+ IB_rect, FALSE, err_out);
+ }
if (ibuf) {
float aspect = (scene->r.xsch * scene->r.xasp) / (scene->r.ysch * scene->r.yasp);
@@ -765,7 +791,7 @@ int WM_write_file(bContext *C, const char *target, int fileflags, ReportList *re
/* blend file thumbnail */
/* save before exit_editmode, otherwise derivedmeshes for shared data corrupt #27765) */
if (U.flag & USER_SAVE_PREVIEWS) {
- ibuf_thumb = blend_file_thumb(CTX_data_scene(C), &thumb);
+ ibuf_thumb = blend_file_thumb(CTX_data_scene(C), CTX_wm_screen(C), &thumb);
}
BLI_exec_cb(G.main, NULL, BLI_CB_EVT_SAVE_PRE);
@@ -807,6 +833,7 @@ int WM_write_file(bContext *C, const char *target, int fileflags, ReportList *re
/* run this function after because the file cant be written before the blend is */
if (ibuf_thumb) {
+ IMB_thumb_delete(filepath, THB_FAIL); /* without this a failed thumb overrides */
ibuf_thumb = IMB_thumb_create(filepath, THB_NORMAL, THB_SOURCE_BLEND, ibuf_thumb);
IMB_freeImBuf(ibuf_thumb);
}
diff --git a/source/blender/windowmanager/intern/wm_gesture.c b/source/blender/windowmanager/intern/wm_gesture.c
index 593d1b35abe..bfa3645bf57 100644
--- a/source/blender/windowmanager/intern/wm_gesture.c
+++ b/source/blender/windowmanager/intern/wm_gesture.c
@@ -230,12 +230,13 @@ static void wm_gesture_draw_circle(wmGesture *gt)
static void draw_filled_lasso(wmGesture *gt)
{
+ ScanFillContext sf_ctx;
ScanFillVert *v = NULL, *lastv = NULL, *firstv = NULL;
ScanFillFace *efa;
short *lasso = (short *)gt->customdata;
int i;
- BLI_begin_edgefill();
+ BLI_begin_edgefill(&sf_ctx);
for (i = 0; i < gt->points; i++, lasso += 2) {
float co[3];
@@ -243,22 +244,23 @@ static void draw_filled_lasso(wmGesture *gt)
co[1] = (float)lasso[1];
co[2] = 0.0f;
- v = BLI_addfillvert(co);
+ v = BLI_addfillvert(&sf_ctx, co);
if (lastv)
- /* e = */ /* UNUSED */ BLI_addfilledge(lastv, v);
+ /* e = */ /* UNUSED */ BLI_addfilledge(&sf_ctx, lastv, v);
lastv = v;
if (firstv == NULL) firstv = v;
}
/* highly unlikely this will fail, but could crash if (gt->points == 0) */
if (firstv) {
- BLI_addfilledge(firstv, v);
- BLI_edgefill(0);
+ float zvec[3] = {0.0f, 0.0f, 1.0f};
+ BLI_addfilledge(&sf_ctx, firstv, v);
+ BLI_edgefill_ex(&sf_ctx, FALSE, zvec);
glEnable(GL_BLEND);
glColor4f(1.0, 1.0, 1.0, 0.05);
glBegin(GL_TRIANGLES);
- for (efa = fillfacebase.first; efa; efa = efa->next) {
+ for (efa = sf_ctx.fillfacebase.first; efa; efa = efa->next) {
glVertex2fv(efa->v1->co);
glVertex2fv(efa->v2->co);
glVertex2fv(efa->v3->co);
@@ -266,7 +268,7 @@ static void draw_filled_lasso(wmGesture *gt)
glEnd();
glDisable(GL_BLEND);
- BLI_end_edgefill();
+ BLI_end_edgefill(&sf_ctx);
}
}
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c
index 39651cea3ab..0c95ccea5d7 100644
--- a/source/blender/windowmanager/intern/wm_init_exit.c
+++ b/source/blender/windowmanager/intern/wm_init_exit.c
@@ -63,7 +63,7 @@
#include "BKE_tracking.h" /* free tracking clipboard */
#include "BLI_listbase.h"
-#include "BLI_scanfill.h"
+// #include "BLI_scanfill.h"
#include "BLI_string.h"
#include "BLI_utildefines.h"
@@ -383,8 +383,6 @@ void WM_exit_ext(bContext *C, const short do_python)
BLF_exit();
- BLI_scanfill_free(); /* the order this is called doesn't matter */
-
#ifdef WITH_INTERNATIONAL
BLF_free_unifont();
#endif
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index ddbacc6b747..247eadbb698 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -710,6 +710,22 @@ wmKeyMapItem *WM_modalkeymap_add_item(wmKeyMap *km, int type, int val, int modif
return kmi;
}
+wmKeyMapItem *WM_modalkeymap_add_item_str(wmKeyMap *km, int type, int val, int modifier, int keymodifier, const char *value)
+{
+ wmKeyMapItem *kmi = MEM_callocN(sizeof(wmKeyMapItem), "keymap entry");
+
+ BLI_addtail(&km->items, kmi);
+ BLI_strncpy(kmi->propvalue_str, value, sizeof(kmi->propvalue_str));
+
+ keymap_event_set(kmi, type, val, modifier, keymodifier);
+
+ keymap_item_set_id(km, kmi);
+
+ WM_keyconfig_update_tag(km, kmi);
+
+ return kmi;
+}
+
void WM_modalkeymap_assign(wmKeyMap *km, const char *opname)
{
wmOperatorType *ot = WM_operatortype_find(opname, 0);
@@ -720,6 +736,33 @@ void WM_modalkeymap_assign(wmKeyMap *km, const char *opname)
printf("error: modalkeymap_assign, unknown operator %s\n", opname);
}
+static void wm_user_modal_keymap_set_items(wmWindowManager *wm, wmKeyMap *km)
+{
+ /* here we convert propvalue string values delayed, due to python keymaps
+ * being created before the actual modal keymaps, so no modal_items */
+ wmKeyMap *defaultkm;
+ wmKeyMapItem *kmi;
+ int propvalue;
+
+ if (km && (km->flag & KEYMAP_MODAL) && !km->modal_items) {
+ defaultkm = WM_keymap_list_find(&wm->defaultconf->keymaps, km->idname, 0, 0);
+
+ if (!defaultkm)
+ return;
+
+ km->modal_items = defaultkm->modal_items;
+ km->poll = defaultkm->poll;
+
+ for (kmi = km->items.first; kmi; kmi = kmi->next) {
+ if (kmi->propvalue_str[0]) {
+ if (RNA_enum_value_from_id(km->modal_items, kmi->propvalue_str, &propvalue))
+ kmi->propvalue = propvalue;
+ kmi->propvalue_str[0] = '\0';
+ }
+ }
+ }
+}
+
/* ***************** get string from key events **************** */
const char *WM_key_event_string(short type)
@@ -1034,6 +1077,8 @@ void WM_keyconfig_update(wmWindowManager *wm)
addonmap = WM_keymap_list_find(&wm->addonconf->keymaps, km->idname, km->spaceid, km->regionid);
usermap = WM_keymap_list_find(&U.user_keymaps, km->idname, km->spaceid, km->regionid);
+ wm_user_modal_keymap_set_items(wm, defaultmap);
+
/* add */
kmn = wm_keymap_patch_update(&wm->userconf->keymaps, defaultmap, addonmap, usermap);
@@ -1190,6 +1235,10 @@ wmKeyMap *WM_keymap_guess_opname(const bContext *C, const char *opname)
else if (strstr(opname, "MARKER_OT")) {
km = WM_keymap_find_all(C, "Markers", 0, 0);
}
+ /* Import/Export*/
+ else if (strstr(opname, "IMPORT_") || strstr(opname, "EXPORT_")) {
+ km = WM_keymap_find_all(C, "Window", 0, 0);
+ }
/* 3D View */
diff --git a/source/blender/windowmanager/intern/wm_operators.c b/source/blender/windowmanager/intern/wm_operators.c
index be7913b9181..028f7b5c41f 100644
--- a/source/blender/windowmanager/intern/wm_operators.c
+++ b/source/blender/windowmanager/intern/wm_operators.c
@@ -147,7 +147,7 @@ void WM_operatortype_append(void (*opfunc)(wmOperatorType *))
ot = MEM_callocN(sizeof(wmOperatorType), "operatortype");
ot->srna = RNA_def_struct(&BLENDER_RNA, "", "OperatorProperties");
/* Set the default i18n context now, so that opfunc can redefine it if needed! */
- RNA_def_struct_translation_context(ot->srna, WM_OPERATOR_DEFAULT_I18NCONTEXT);
+ RNA_def_struct_translation_context(ot->srna, BLF_I18NCONTEXT_OPERATOR_DEFAULT);
opfunc(ot);
if (ot->name == NULL) {
@@ -169,7 +169,7 @@ void WM_operatortype_append_ptr(void (*opfunc)(wmOperatorType *, void *), void *
ot = MEM_callocN(sizeof(wmOperatorType), "operatortype");
ot->srna = RNA_def_struct(&BLENDER_RNA, "", "OperatorProperties");
/* Set the default i18n context now, so that opfunc can redefine it if needed! */
- RNA_def_struct_translation_context(ot->srna, WM_OPERATOR_DEFAULT_I18NCONTEXT);
+ RNA_def_struct_translation_context(ot->srna, BLF_I18NCONTEXT_OPERATOR_DEFAULT);
opfunc(ot, userdata);
RNA_def_struct_ui_text(ot->srna, ot->name, ot->description ? ot->description : N_("(undocumented operator)"));
RNA_def_struct_identifier(ot->srna, ot->idname);
@@ -371,7 +371,7 @@ wmOperatorType *WM_operatortype_append_macro(const char *idname, const char *nam
RNA_def_struct_ui_text(ot->srna, ot->name, ot->description);
RNA_def_struct_identifier(ot->srna, ot->idname);
- RNA_def_struct_translation_context(ot->srna, WM_OPERATOR_DEFAULT_I18NCONTEXT);
+ RNA_def_struct_translation_context(ot->srna, BLF_I18NCONTEXT_OPERATOR_DEFAULT);
BLI_ghash_insert(global_ops_hash, (void *)ot->idname, ot);
@@ -396,7 +396,7 @@ void WM_operatortype_append_macro_ptr(void (*opfunc)(wmOperatorType *, void *),
ot->description = N_("(undocumented operator)");
/* Set the default i18n context now, so that opfunc can redefine it if needed! */
- RNA_def_struct_translation_context(ot->srna, WM_OPERATOR_DEFAULT_I18NCONTEXT);
+ RNA_def_struct_translation_context(ot->srna, BLF_I18NCONTEXT_OPERATOR_DEFAULT);
opfunc(ot, userdata);
RNA_def_struct_ui_text(ot->srna, ot->name, ot->description);
@@ -2147,6 +2147,7 @@ static int wm_collada_export_exec(bContext *C, wmOperator *op)
static void WM_OT_collada_export(wmOperatorType *ot)
{
ot->name = "Export COLLADA";
+ ot->description = "Save a Collada file";
ot->idname = "WM_OT_collada_export";
ot->invoke = wm_collada_export_invoke;
@@ -2181,6 +2182,7 @@ static int wm_collada_import_exec(bContext *C, wmOperator *op)
static void WM_OT_collada_import(wmOperatorType *ot)
{
ot->name = "Import COLLADA";
+ ot->description = "Load a Collada file";
ot->idname = "WM_OT_collada_import";
ot->invoke = WM_operator_filesel;
@@ -2237,9 +2239,11 @@ static int wm_console_toggle_op(bContext *UNUSED(C), wmOperator *UNUSED(op))
static void WM_OT_console_toggle(wmOperatorType *ot)
{
- ot->name = "Toggle System Console";
+ /* XXX Have to mark these for xgettext, as under linux they do not exists...
+ * And even worth, have to give the context as text, as xgettext doesn’t expand macros. :( */
+ ot->name = CTX_N_("Operator"/* BLF_I18NCONTEXT_OPERATOR_DEFAULT */, "Toggle System Console");
ot->idname = "WM_OT_console_toggle";
- ot->description = "Toggle System Console";
+ ot->description = N_("Toggle System Console");
ot->exec = wm_console_toggle_op;
ot->poll = WM_operator_winactive;
@@ -3707,7 +3711,7 @@ static void gesture_circle_modal_keymap(wmKeyConfig *keyconf)
wmKeyMap *keymap = WM_modalkeymap_get(keyconf, "View3D Gesture Circle");
/* this function is called for each spacetype, only needs to add map once */
- if (keymap) return;
+ if (keymap && keymap->modal_items) return;
keymap = WM_modalkeymap_add(keyconf, "View3D Gesture Circle", modal_items);
@@ -3754,7 +3758,7 @@ static void gesture_straightline_modal_keymap(wmKeyConfig *keyconf)
wmKeyMap *keymap = WM_modalkeymap_get(keyconf, "Gesture Straight Line");
/* this function is called for each spacetype, only needs to add map once */
- if (keymap) return;
+ if (keymap && keymap->modal_items) return;
keymap = WM_modalkeymap_add(keyconf, "Gesture Straight Line", modal_items);
@@ -3783,7 +3787,7 @@ static void gesture_border_modal_keymap(wmKeyConfig *keyconf)
wmKeyMap *keymap = WM_modalkeymap_get(keyconf, "Gesture Border");
/* this function is called for each spacetype, only needs to add map once */
- if (keymap) return;
+ if (keymap && keymap->modal_items) return;
keymap = WM_modalkeymap_add(keyconf, "Gesture Border", modal_items);
@@ -3842,7 +3846,7 @@ static void gesture_zoom_border_modal_keymap(wmKeyConfig *keyconf)
wmKeyMap *keymap = WM_modalkeymap_get(keyconf, "Gesture Zoom Border");
/* this function is called for each spacetype, only needs to add map once */
- if (keymap) return;
+ if (keymap && keymap->modal_items) return;
keymap = WM_modalkeymap_add(keyconf, "Gesture Zoom Border", modal_items);
diff --git a/source/blenderplayer/bad_level_call_stubs/stubs.c b/source/blenderplayer/bad_level_call_stubs/stubs.c
index 92b2e612091..4d81706abdc 100644
--- a/source/blenderplayer/bad_level_call_stubs/stubs.c
+++ b/source/blenderplayer/bad_level_call_stubs/stubs.c
@@ -476,6 +476,7 @@ short insert_keyframe (struct ID *id, struct bAction *act, const char group[], c
short delete_keyframe(struct ID *id, struct bAction *act, const char group[], const char rna_path[], int array_index, float cfra, short flag){return 0;};
char *WM_operator_pystring(struct bContext *C, struct wmOperatorType *ot, struct PointerRNA *opptr, int all_args){return (char *)NULL;}
struct wmKeyMapItem *WM_modalkeymap_add_item(struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, int value){return (struct wmKeyMapItem *)NULL;}
+struct wmKeyMapItem *WM_modalkeymap_add_item_str(struct wmKeyMap *km, int type, int val, int modifier, int keymodifier, const char *value){return (struct wmKeyMapItem *)NULL;}
struct wmKeyMap *WM_modalkeymap_add(struct wmKeyConfig *keyconf, char *idname, EnumPropertyItem *items){return (struct wmKeyMap *) NULL;}
/* RNA COLLADA dependency */
diff --git a/source/creator/creator.c b/source/creator/creator.c
index 3e437f8557c..16cdd50bd37 100644
--- a/source/creator/creator.c
+++ b/source/creator/creator.c
@@ -54,12 +54,11 @@
#include "MEM_guardedalloc.h"
#ifdef WIN32
-#include "BLI_winstuff.h"
+# include "BLI_winstuff.h"
#endif
#include "BLI_args.h"
#include "BLI_threads.h"
-#include "BLI_scanfill.h" /* for BLI_setErrorCallBack, TODO, move elsewhere */
#include "BLI_utildefines.h"
#include "BLI_callbacks.h"
@@ -103,6 +102,8 @@
#include "GPU_draw.h"
#include "GPU_extensions.h"
+#include "BLI_scanfill.h" /* for BLI_setErrorCallBack, TODO, move elsewhere */
+
#include "FRS_freestyle.h"
#ifdef WITH_BUILDINFO_HEADER
@@ -1258,7 +1259,7 @@ int main(int argc, const char **argv)
#endif
/* first test for background */
- ba = BLI_argsInit(argc, argv); /* skip binary path */
+ ba = BLI_argsInit(argc, (const char **)argv); /* skip binary path */
setupArguments(C, ba, &syshandle);
BLI_argsParse(ba, 1, NULL, NULL);
@@ -1283,7 +1284,7 @@ int main(int argc, const char **argv)
BLI_argsParse(ba, 2, NULL, NULL);
BLI_argsParse(ba, 3, NULL, NULL);
- WM_init(C, argc, argv);
+ WM_init(C, argc, (const char **)argv);
/* this is properly initialized with user defs, but this is default */
/* call after loading the startup.blend so we can read U.tempdir */
@@ -1296,7 +1297,7 @@ int main(int argc, const char **argv)
else {
BLI_argsParse(ba, 3, NULL, NULL);
- WM_init(C, argc, argv);
+ WM_init(C, argc, (const char **)argv);
/* don't use user preferences temp dir */
BLI_init_temporary_dir(NULL);
diff --git a/source/gameengine/Converter/BL_BlenderDataConversion.cpp b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
index e112537d0f6..4c7170c4c9e 100644
--- a/source/gameengine/Converter/BL_BlenderDataConversion.cpp
+++ b/source/gameengine/Converter/BL_BlenderDataConversion.cpp
@@ -2757,7 +2757,7 @@ void BL_ConvertBlenderObjects(struct Main* maggie,
bRigidBodyJointConstraint *dat=(bRigidBodyJointConstraint *)curcon->data;
- if (!dat->child) {
+ if (!dat->child && !(curcon->flag & CONSTRAINT_OFF)) {
PHY_IPhysicsController* physctr2 = 0;
diff --git a/source/gameengine/Ketsji/KX_NavMeshObject.cpp b/source/gameengine/Ketsji/KX_NavMeshObject.cpp
index 22f96eb7297..35058e5fe5d 100644
--- a/source/gameengine/Ketsji/KX_NavMeshObject.cpp
+++ b/source/gameengine/Ketsji/KX_NavMeshObject.cpp
@@ -112,7 +112,8 @@ bool KX_NavMeshObject::BuildVertIndArrays(float *&vertices, int& nverts,
{
DerivedMesh* dm = mesh_create_derived_no_virtual(KX_GetActiveScene()->GetBlenderScene(), GetBlenderObject(),
NULL, CD_MASK_MESH);
- int* recastData = (int*) dm->getTessFaceDataArray(dm, CD_RECAST);
+ CustomData *pdata = dm->getPolyDataLayout(dm);
+ int* recastData = (int*) CustomData_get_layer(pdata, CD_RECAST);
if (recastData)
{
int *dtrisToPolysMap=NULL, *dtrisToTrisMap=NULL, *trisToFacesMap=NULL;
diff --git a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
index 73ba187d732..9a85471fb9a 100644
--- a/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
+++ b/source/gameengine/Physics/Bullet/CcdPhysicsController.cpp
@@ -1918,6 +1918,10 @@ bool CcdShapeConstructionInfo::UpdateMesh(class KX_GameObject* gameobj, class RA
}
}
+ // This case happens when none of the polys are colliders
+ if (tot_bt_tris == 0 || tot_bt_verts == 0)
+ return false;
+
m_vertexArray.resize(tot_bt_verts*3);
btScalar *bt= &m_vertexArray[0];