diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2012-04-21 04:33:36 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2012-04-21 04:33:36 +0400 |
commit | cdbfd1db3800cf4f0ea691f09bf05e78a82c80f9 (patch) | |
tree | b1f22c4ea61ff96ee51c4882047f5a8e3f08c0f1 | |
parent | 4a19ccfa5fb5cae359269ecaac389f6aace9f959 (diff) | |
parent | 15eb3452ecd96e4d79d438e8c954918639dc283d (diff) |
Merged changes in the trunk up to revision 45820.
Conflicts resolved:
source/creator/creator.c
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(®walker, 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(®walker, 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(®walker, 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(®walker, 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, ¶ms, edge->v1, edge->v2); + bm_subdivide_multicut(bm, edge, ¶ms, 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, ¶ms); + BM_CHECK_ELEMENT(face); + pat->connectexec(bm, face, verts, ¶ms); } /* 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, ¶ms, 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, ®ion_out); + c = loop_find_region(l, BM_ELEM_SELECT, &visithash, ®ion_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]; |