forked from bartvdbraak/blender
Merged changes in the trunk up to revision 45820.
Conflicts resolved: source/creator/creator.c
This commit is contained in:
commit
cdbfd1db38
@ -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)
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
@ -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")
|
||||
|
||||
|
@ -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', ''),
|
||||
|
@ -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"
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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: {
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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>
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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) )));
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
3
release/scripts/presets/fluid/honey.py
Normal file
3
release/scripts/presets/fluid/honey.py
Normal file
@ -0,0 +1,3 @@
|
||||
import bpy
|
||||
bpy.context.fluid.settings.viscosity_base = 2.0
|
||||
bpy.context.fluid.settings.viscosity_exponent = 3
|
3
release/scripts/presets/fluid/oil.py
Normal file
3
release/scripts/presets/fluid/oil.py
Normal file
@ -0,0 +1,3 @@
|
||||
import bpy
|
||||
bpy.context.fluid.settings.viscosity_base = 5.0
|
||||
bpy.context.fluid.settings.viscosity_exponent = 5
|
3
release/scripts/presets/fluid/water.py
Normal file
3
release/scripts/presets/fluid/water.py
Normal file
@ -0,0 +1,3 @@
|
||||
import bpy
|
||||
bpy.context.fluid.settings.viscosity_base = 1.0
|
||||
bpy.context.fluid.settings.viscosity_exponent = 6
|
@ -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"
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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"
|
||||
|
@ -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",
|
||||
|
@ -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])
|
||||
|
@ -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':
|
||||
|
@ -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")
|
||||
|
@ -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"
|
||||
|
@ -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="")
|
||||
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
|
||||
|
||||
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()
|
||||
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)
|
||||
|
@ -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")
|
||||
|
||||
|
@ -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")
|
||||
|
@ -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')
|
75
release/scripts/templates/operator_file_import.py
Normal file
75
release/scripts/templates/operator_file_import.py
Normal file
@ -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')
|
@ -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"
|
||||
|
@ -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? */
|
||||
|
||||
|
@ -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__ */
|
||||
|
@ -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) {
|
||||
|
@ -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 */
|
||||
|
||||
|
@ -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 \
|
||||
} \
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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'
|
||||
|
@ -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++;
|
||||
|
||||
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(ldata, CD_MLOOPUV,
|
||||
gattribs->layer[b].name);
|
||||
else
|
||||
player = CustomData_get_active_layer_index(pdata, CD_MTEXPOLY);
|
||||
|
||||
if (player != -1) {
|
||||
layer = CustomData_get_active_layer_index(ldata, CD_MLOOPUV);
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
else {
|
||||
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 (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;
|
||||
|
||||
}
|
||||
}
|
||||
#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);
|
||||
|
||||
attribs->mcol[a].array = tfdata->layers[layer].data;
|
||||
attribs->mcol[a].emOffset = tfdata->layers[layer].offset;
|
||||
attribs->mcol[a].glIndex = gattribs->layer[b].glindex;
|
||||
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 {
|
||||
/* 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;
|
||||
|
@ -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++) {
|
||||
|
||||
/* group dupli offset, should apply after everything else */
|
||||
if (!is_zero_v3(part->dup_group->dupli_ofs)) {
|
||||
copy_m4_m4(tmat, oblist[b]->obmat);
|
||||
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);
|
||||
}
|
||||
|
||||
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))
|
||||
sub_v3_v3v3(tmat[3], tmat[3], part->dup_group->dupli_ofs);
|
||||
/* individual particle transform */
|
||||
mult_m4_m4m4(tmat, pamat, tmat);
|
||||
|
||||
if (par_space_mat)
|
||||
mult_m4_m4m4(mat, par_space_mat, tmat);
|
||||
else
|
||||
|
@ -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.*/
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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"
|
||||
|
@ -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 */
|
||||
|
@ -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)]);
|
||||
}
|
||||
|
||||
|
@ -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++;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
MDisps *mdisp = NULL, *cur = NULL;
|
||||
int i, grid = 0;
|
||||
|
||||
if (mmd)
|
||||
multires_set_tot_mdisps(me, mmd->totlvl);
|
||||
CustomData_external_read(&me->ldata, &me->id, CD_MASK_MDISPS, me->totface);
|
||||
mdisp = CustomData_get_layer(&me->ldata, CD_MDISPS);
|
||||
|
||||
CustomData_external_read(&me->fdata, &me->id, CD_MASK_MDISPS, me->totface);
|
||||
mdisp= CustomData_get_layer(&me->fdata, 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 *****************/
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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 */
|
||||
|
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -30,7 +30,9 @@
|
||||
* \ingroup bke
|
||||
*/
|
||||
|
||||
#include "BLI_winstuff.h"
|
||||
#ifdef WIN32
|
||||
# include "BLI_winstuff.h"
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
@ -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;
|
||||
|
@ -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' */
|
||||
|
@ -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 **********************************/
|
||||
|
@ -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);
|
||||
struct ScanFillVert *BLI_addfillvert(ScanFillContext *sf_ctx, const float vec[3]);
|
||||
struct ScanFillEdge *BLI_addfilledge(ScanFillContext *sf_ctx, 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
|
||||
|
||||
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
|
||||
|
@ -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);
|
||||
|
@ -33,28 +33,30 @@
|
||||
* \brief Compatibility-like things for windows.
|
||||
*/
|
||||
|
||||
#ifdef _WIN32
|
||||
|
||||
#ifndef FREE_WINDOWS
|
||||
#pragma warning(once: 4761 4305 4244 4018)
|
||||
#else
|
||||
#ifdef WINVER
|
||||
#undef WINVER
|
||||
#ifndef _WIN32
|
||||
# error "This include is for Windows only!"
|
||||
#endif
|
||||
|
||||
#ifndef FREE_WINDOWS
|
||||
# pragma warning(once: 4761 4305 4244 4018)
|
||||
#else
|
||||
# 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__ */
|
||||
|
||||
|
@ -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"
|
||||
|
@ -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)
|
||||
|
@ -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])
|
||||
|
@ -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) {
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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 --------------------- */
|
||||
|
@ -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 */
|
||||
|
@ -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"
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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];
|
||||
|
@ -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"
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user